diff --git a/.github/workflows/area-labels.yml b/.github/workflows/area-labels.yml index f76171b143..6c1f0906d9 100644 --- a/.github/workflows/area-labels.yml +++ b/.github/workflows/area-labels.yml @@ -26,8 +26,21 @@ jobs: state=$RUNNER_TEMP/area-state.json [ -s "$state" ] || echo '{}' > "$state" config=$(gh api "repos/$GITHUB_REPOSITORY/contents/.github/labeler.yml" --jq .sha) - gh pr list -R "$GITHUB_REPOSITORY" --base "${{ github.event.repository.default_branch }}" -L 1000 --json number,headRefOid \ - --jq "map({key: (.number | tostring), value: (.headRefOid + \"-$config\")}) | from_entries" > "$RUNNER_TEMP/area-open.json" + gh api graphql --paginate --slurp \ + -f owner="${GITHUB_REPOSITORY%/*}" -f name="${GITHUB_REPOSITORY#*/}" \ + -f base="${{ github.event.repository.default_branch }}" -f query=' + query($owner: String!, $name: String!, $base: String!, $endCursor: String) { + repository(owner: $owner, name: $name) { + pullRequests(states: OPEN, baseRefName: $base, first: 100, after: $endCursor, + orderBy: {field: CREATED_AT, direction: DESC}) { + pageInfo { hasNextPage endCursor } + nodes { number headRefOid } + } + } + }' | jq -c --arg config "$config" \ + '[.[].data.repository.pullRequests.nodes[] + | {key: (.number | tostring), value: (.headRefOid + "-" + $config)}] | from_entries' \ + > "$RUNNER_TEMP/area-open.json" jq -r --slurpfile old "$state" 'to_entries[] | select($old[0][.key] != .value) | .key' "$RUNNER_TEMP/area-open.json" | head -n 40 > "$RUNNER_TEMP/area-todo" jq -c --slurpfile open "$RUNNER_TEMP/area-open.json" --rawfile todo "$RUNNER_TEMP/area-todo" \ 'with_entries(select(.key | in($open[0]))) + ($open[0] | with_entries(select(.key | IN($todo | split("\n")[]))))' "$state" > "$RUNNER_TEMP/area-next.json" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 20ba79446b..a10dd29ebc 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -24,15 +24,15 @@ jobs: build: name: Build and test (${{ matrix.platform }}) strategy: - fail-fast: true + fail-fast: false matrix: include: - platform: linux runner: ubuntu-latest - timeout: 30 + timeout: 60 - platform: windows runner: windows-latest - timeout: 45 + timeout: 60 runs-on: ${{ matrix.runner }} timeout-minutes: ${{ matrix.timeout }} defaults: diff --git a/.github/workflows/run-report-schema.yml b/.github/workflows/run-report-schema.yml new file mode 100644 index 0000000000..2c83338bc4 --- /dev/null +++ b/.github/workflows/run-report-schema.yml @@ -0,0 +1,32 @@ +name: Run report schema + +on: + pull_request: + paths: + - .github/workflows/run-report-schema.yml + - docs/run-report.schema.json + - docs/run-report-fixtures/** + - tools/requirements-run-report.txt + - tools/tests/test_run_report_schema.py + +permissions: + contents: read + +concurrency: + group: run-report-schema-${{ github.event.pull_request.number }} + cancel-in-progress: true + +jobs: + schema: + runs-on: ubuntu-latest + timeout-minutes: 5 + steps: + - uses: actions/checkout@v7 + with: + persist-credentials: false + - name: Install the pinned validator + run: | + python3 -m venv "$RUNNER_TEMP/venv" + "$RUNNER_TEMP/venv/bin/python" -m pip install --require-virtualenv -r tools/requirements-run-report.txt + - name: Validate the fixtures against the schema + run: '"$RUNNER_TEMP/venv/bin/python" tools/tests/test_run_report_schema.py' diff --git a/.github/workflows/sanitizers.yml b/.github/workflows/sanitizers.yml index 914ad341bf..94c7c2631c 100644 --- a/.github/workflows/sanitizers.yml +++ b/.github/workflows/sanitizers.yml @@ -94,6 +94,7 @@ jobs: env: ASAN_OPTIONS: detect_leaks=0 UBSAN_OPTIONS: print_stacktrace=1:halt_on_error=1 + APS5_SKIP_TIMING_TESTS: 1 run: ctest --output-on-failure --timeout 300 --parallel 4 --output-log ctest.log --output-junit ctest.xml || true - name: Summarize the sanitizer findings if: ${{ !cancelled() && steps.configure.outcome == 'success' }} diff --git a/.gitignore b/.gitignore index 67d85a24d2..36be987bde 100644 --- a/.gitignore +++ b/.gitignore @@ -101,6 +101,8 @@ downloads/ *.json !demo/web/i18n/*.json +!/docs/run-report.schema.json +!/docs/run-report-fixtures/*.json !/assets/*.jpg !/assets/*.png diff --git a/.gitmodules b/.gitmodules index 219621ad1a..f05248d408 100644 --- a/.gitmodules +++ b/.gitmodules @@ -67,3 +67,6 @@ [submodule "3rdparty/nghttp2"] path = 3rdparty/nghttp2 url = https://github.com/nghttp2/nghttp2.git +[submodule "3rdparty/quickjs"] + path = 3rdparty/quickjs + url = https://github.com/quickjs-ng/quickjs.git diff --git a/3rdparty/quickjs b/3rdparty/quickjs new file mode 160000 index 0000000000..6d46d07d04 --- /dev/null +++ b/3rdparty/quickjs @@ -0,0 +1 @@ +Subproject commit 6d46d07d04041b40f4f49eaa7fdebe44c314c699 diff --git a/CMakeLists.txt b/CMakeLists.txt index 0c85757df6..b65c331ce1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -190,6 +190,9 @@ if(BUILD_TESTING) if(Python3_Interpreter_FOUND) add_test(NAME mingw_host_only_test_targets COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/tests/test_mingw_host_only_test_targets.py) + add_test(NAME patch_lib_atrac9 COMMAND ${Python3_EXECUTABLE} + ${CMAKE_CURRENT_SOURCE_DIR}/tools/tests/test_patch_lib_atrac9.py ${CMAKE_COMMAND}) + set_tests_properties(patch_lib_atrac9 PROPERTIES TIMEOUT 60) add_test(NAME build_changed_guest_tests COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/tests/test_build_changed_guest_tests.py) add_test(NAME shader_cache_native_paths COMMAND ${Python3_EXECUTABLE} @@ -207,6 +210,8 @@ if(BUILD_TESTING) ${CMAKE_CURRENT_SOURCE_DIR}/core/shader/recompiler ${CMAKE_COMMAND} --shard ${shard}/7) set_tests_properties(${shader_cache_sources_test_name} PROPERTIES TIMEOUT 180) endforeach() + add_test(NAME tools_nid_name_audit COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tools/tests/test_audit_nid_names.py) + set_tests_properties(tools_nid_name_audit PROPERTIES TIMEOUT 20) add_test(NAME pr_overlap_encoding COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/tests/test_pr_overlap_encoding.py) add_test(NAME pr_overlap_dependencies COMMAND ${Python3_EXECUTABLE} @@ -222,6 +227,8 @@ if(BUILD_TESTING) set_tests_properties(progress_history_output PROPERTIES TIMEOUT 20) add_test(NAME progress_report COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/tests/test_progress.py) + add_test(NAME tools_compdb_inventory COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tools/tests/test_compile_database_inventory.py) + set_tests_properties(tools_compdb_inventory PROPERTIES TIMEOUT 20) add_test(NAME progress_encoding COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/tests/test_progress_encoding.py) add_test(NAME progress_render_sliver COMMAND ${Python3_EXECUTABLE} @@ -267,6 +274,8 @@ if(BUILD_TESTING) set_tests_properties(preview_pad_timeline PROPERTIES TIMEOUT 20) add_test(NAME conventions_git_errors COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/tests/test_check_conventions_git.py) + add_test(NAME tools_configure_diff COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tools/tests/test_compare_configure_checks.py) + set_tests_properties(tools_configure_diff PROPERTIES TIMEOUT 20) add_test(NAME conventions_doc_links COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/tests/test_check_conventions_doc_links.py) add_test(NAME conventions_unknown_nids COMMAND ${Python3_EXECUTABLE} @@ -282,12 +291,16 @@ if(BUILD_TESTING) add_test(NAME check_skips_ctest COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/tests/test_check_skips_ctest.py) set_tests_properties(check_skips_ctest PROPERTIES TIMEOUT 30) + add_test(NAME tools_pe_inventory COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tools/tests/test_pe_symbol_inventory.py) + set_tests_properties(tools_pe_inventory PROPERTIES TIMEOUT 20) add_test(NAME check_skips COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/tests/test_check_skips.py) add_test(NAME sanitizer_report COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/tests/test_sanitizer_report.py) add_test(NAME select_tests COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/tests/test_select_tests.py) + add_test(NAME tools_self_inspect COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tools/tests/test_inspect_self.py) + set_tests_properties(tools_self_inspect PROPERTIES TIMEOUT 20) add_test(NAME check_main_sync COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/tests/test_check_main_sync.py CheckMainSyncTests) set_tests_properties(check_main_sync PROPERTIES TIMEOUT 30) @@ -331,6 +344,8 @@ if(BUILD_TESTING) ${CMAKE_CURRENT_SOURCE_DIR}/tools/tests/test_stubgen.py) add_test(NAME debt_split COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/tests/test_debt_split.py) + add_test(NAME agc_test_split COMMAND ${Python3_EXECUTABLE} + ${CMAKE_CURRENT_SOURCE_DIR}/tools/tests/test_agc_test_split.py) add_test(NAME stubgen_stdout_newlines COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/tests/test_stubgen_stdout_newlines.py) add_test(NAME hardware_oracle COMMAND ${Python3_EXECUTABLE} @@ -357,6 +372,8 @@ if(BUILD_TESTING) ${CMAKE_CURRENT_SOURCE_DIR}/tools/tests/test_pr_overlap_pages.py) add_test(NAME pr_overlap_export_cache COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/tests/test_pr_overlap_export_cache.py) + add_test(NAME pr_overlap_fail_closed COMMAND ${Python3_EXECUTABLE} + ${CMAKE_CURRENT_SOURCE_DIR}/tools/tests/test_pr_overlap_fail_closed.py) add_test(NAME nid_database_cache COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/tests/test_nid_names.py) add_test(NAME release_package COMMAND ${Python3_EXECUTABLE} @@ -399,7 +416,7 @@ if(BUILD_TESTING) string(REGEX REPLACE "^ def (test_[A-Za-z0-9_]+).*" "\\1" test_case "${test_case}") add_test(NAME check_compile_modes_${test_case} COMMAND ${Python3_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/tools/tests/test_check_compile_modes.py" CheckCompileModeTests.${test_case}) - set_tests_properties(check_compile_modes_${test_case} PROPERTIES TIMEOUT 60) + set_tests_properties(check_compile_modes_${test_case} PROPERTIES TIMEOUT 30) endforeach() add_test(NAME trace_digest COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/tests/test_trace_digest.py) @@ -454,6 +471,8 @@ if(BUILD_TESTING) endif() endif() endforeach() + add_test(NAME tools_headers_manifest COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tools/tests/test_public_headers_manifest.py) + set_tests_properties(tools_headers_manifest PROPERTIES TIMEOUT 20) add_test(NAME conventions_pr_template COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/tests/test_check_conventions_pr_template.py) add_test(NAME check_compile_preprocessor COMMAND ${Python3_EXECUTABLE} @@ -472,6 +491,8 @@ if(BUILD_TESTING) set_tests_properties(check_compile_${test_case} PROPERTIES TIMEOUT 30) endif() endforeach() + add_test(NAME tools_seed_check COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tools/tests/test_check_configure_seed.py) + set_tests_properties(tools_seed_check PROPERTIES TIMEOUT 20) add_test(NAME performance_compare COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/tests/test_performance_compare.py) set_tests_properties(performance_compare PROPERTIES TIMEOUT 20) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 61881a4db0..9b2b8e1a79 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -60,6 +60,7 @@ The [pull request template](.github/pull_request_template.md) is the checklist f - Open pull requests per author are limited by how many of theirs are merged into `main`: 1 with none merged, 20 with at least 1, no limit from 20. A pull request opened or reopened over the limit is closed automatically; reopen it once another one is merged or closed. - Before starting, check that no open pull request already implements the same functions. - Keep the branch up to date with `main` and resolve conflicts yourself; rebasing and force-pushing is fine. +- An AGC test executable and its tests are registered in `core/libs/prx/libSceAgcDriver/tests/cmake/.cmake`; the tests of an execution test in `tests/execution/` go in the fragment of its `agc_driver__tests` executable. `CMakeLists.txt` includes the fragments in sorted order, so a fragment uses nothing another fragment defines. A pull request whose change to `libSceAgcDriver/CMakeLists.txt` conflicts after the split rebases and runs `python3 tools/agc_test_split.py resolve` during the stopped rebase, which moves its registrations to their fragments and leaves conflict markers where `main` changed the same lines. - A pull request that conflicts with `main` and has no activity for 7 days is labeled `stale` with a reminder. It is not closed. - If a pull request needs another one first, say so on the checklist line (`Depends on: #N`; `none` otherwise). - If a pull request fixes a reported issue, write `Fixes #N` on its checklist line (`none` otherwise). GitHub closes the issue on merge, and the `fix error` label is added within the hour. diff --git a/README.md b/README.md index 879ac61ea1..7c0bad8246 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Includes a [relinker](core/relinker) that converts executable to the target syst * System libraries: percentage of the functions known to the project so far (declared in [core/libs/prx](core/libs/prx)), not of every PS5 system function. The total grows as more functions are declared. -Unsupported or unexpected states strictly throw `std::runtime_error`. `what()` is printed to stderr and the process terminates. +Unsupported or unexpected states throw a C++ exception, usually `std::runtime_error`. An exception that nothing catches prints its `what()` to stderr and ends the process. The [shader recompiler](core/shader/recompiler/Recompiler.cpp) successfully produces SPIR-V (validated via [Spirv-Tools](3rdparty/SPIRV-Tools) when built with `ANYPS5_ENABLE_SPIRV_TOOLS`). diff --git a/core/libs/CMakeLists.txt b/core/libs/CMakeLists.txt index 7c75594490..315f27b251 100644 --- a/core/libs/CMakeLists.txt +++ b/core/libs/CMakeLists.txt @@ -452,10 +452,21 @@ if(BUILD_TESTING) target_link_libraries(guest_kernel_sys_tests PRIVATE libkernel_sys libSceAmpr libkernel libc) configure_windows_unwind(guest_kernel_sys_tests) add_test(NAME guest_kernel_sys COMMAND guest_kernel_sys_tests) + set_tests_properties(guest_kernel_sys PROPERTIES TIMEOUT 20) if(WIN32) set_tests_properties(guest_kernel_sys PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") endif() + add_test_executable(guest_kernel_sys_vm_map_timestamp_tests tests/GuestKernelSysVmMapTimestamp.cpp) + target_include_directories(guest_kernel_sys_vm_map_timestamp_tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) + target_link_libraries(guest_kernel_sys_vm_map_timestamp_tests PRIVATE libkernel_sys libkernel libc) + configure_windows_unwind(guest_kernel_sys_vm_map_timestamp_tests) + add_test(NAME guest_kernel_sys_vm_map_timestamp COMMAND guest_kernel_sys_vm_map_timestamp_tests) + set_tests_properties(guest_kernel_sys_vm_map_timestamp PROPERTIES TIMEOUT 20) + if(WIN32) + set_tests_properties(guest_kernel_sys_vm_map_timestamp PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() add_test_executable(guest_kernel_sys_thread_defaults_tests tests/GuestKernelSysThreadDefaults.cpp) target_include_directories(guest_kernel_sys_thread_defaults_tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries(guest_kernel_sys_thread_defaults_tests PRIVATE libkernel_sys libkernel libc) @@ -489,6 +500,16 @@ if(BUILD_TESTING) set_tests_properties(guest_firmware_constant_returns PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$;PATH=path_list_prepend:$;PATH=path_list_prepend:$;PATH=path_list_prepend:$;PATH=path_list_prepend:$;PATH=path_list_prepend:$;PATH=path_list_prepend:$;PATH=path_list_prepend:$;PATH=path_list_prepend:$") endif() + add_test_executable(guest_playready_tests tests/GuestPlayReady.cpp) + target_include_directories(guest_playready_tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) + target_link_libraries(guest_playready_tests PRIVATE libScePlayReady libkernel libc) + configure_windows_unwind(guest_playready_tests) + add_test(NAME guest_playready COMMAND guest_playready_tests) + set_tests_properties(guest_playready PROPERTIES TIMEOUT 20) + if(WIN32) + set_tests_properties(guest_playready PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() if(Python3_Interpreter_FOUND) add_test(NAME nid_verneed COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/nid/tests/test_verneed.py $) @@ -668,6 +689,16 @@ if(BUILD_TESTING) "PATH=path_list_prepend:$") endif() + add_test_executable(guest_gnm_neo_context_state_internal_tests tests/GuestGnmNeoContextStateInternal.cpp) + target_include_directories(guest_gnm_neo_context_state_internal_tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) + target_link_libraries(guest_gnm_neo_context_state_internal_tests PRIVATE libSceGnmDriverForNeoMode libc) + configure_windows_unwind(guest_gnm_neo_context_state_internal_tests) + add_test(NAME guest_gnm_neo_context_state_internal COMMAND guest_gnm_neo_context_state_internal_tests) + if(WIN32) + set_tests_properties(guest_gnm_neo_context_state_internal PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test_executable(guest_vr_tracker_devices_tests tests/GuestVrTrackerDevices.cpp) target_include_directories(guest_vr_tracker_devices_tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries(guest_vr_tracker_devices_tests PRIVATE libSceVrTracker libc) @@ -743,6 +774,17 @@ if(BUILD_TESTING) "PATH=path_list_prepend:$") endif() + add_test_executable(guest_xml_value_types_tests tests/GuestXmlValueTypes.cpp) + target_include_directories(guest_xml_value_types_tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) + target_link_libraries(guest_xml_value_types_tests PRIVATE libSceXml libkernel libc) + configure_windows_unwind(guest_xml_value_types_tests) + add_test(NAME guest_xml_value_types COMMAND guest_xml_value_types_tests) + set_tests_properties(guest_xml_value_types PROPERTIES TIMEOUT 20) + if(WIN32) + set_tests_properties(guest_xml_value_types PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test_executable(guest_offline_imports_tests tests/GuestOfflineImports.cpp) target_include_directories(guest_offline_imports_tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries(guest_offline_imports_tests PRIVATE libSceHttp libSceNpEntitlementAccess libSceRudp libSceVideoRecordingP libc) @@ -1037,6 +1079,16 @@ if(BUILD_TESTING) "PATH=path_list_prepend:$") endif() + add_test_executable(guest_src_utility_tests tests/GuestSrcUtility.cpp) + target_include_directories(guest_src_utility_tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) + target_link_libraries(guest_src_utility_tests PRIVATE libSceSrcUtl libc) + configure_windows_unwind(guest_src_utility_tests) + add_test(NAME guest_src_utility COMMAND guest_src_utility_tests) + if(WIN32) + set_tests_properties(guest_src_utility PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test_executable(guest_crt_tests tests/GuestCrt.cpp) target_include_directories(guest_crt_tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries(guest_crt_tests PRIVATE libSceAmpr libc) diff --git a/core/libs/prx/libCprm/Export.cpp b/core/libs/prx/libCprm/Export.cpp new file mode 100644 index 0000000000..4f14137785 --- /dev/null +++ b/core/libs/prx/libCprm/Export.cpp @@ -0,0 +1,182 @@ +#include "prx/libCprm/include/InventoryExports.hpp" +#include "prx/libc/include/General.hpp" +#include "prx/libc/include/general/ExportMacros.hpp" + +extern "C" { + +int APS5_VABI libCprmUnknown__plus_Eh9ZNYi6zo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+Eh9ZNYi6zo", libCprmUnknown__plus_Eh9ZNYi6zo_nid_no_patch); + +int APS5_VABI libCprmUnknown__plus_X9TC_plus_1sw8c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+X9TC+1sw8c", libCprmUnknown__plus_X9TC_plus_1sw8c_nid_no_patch); + +int APS5_VABI libCprmUnknown_1M23A00Z5YY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1M23A00Z5YY", libCprmUnknown_1M23A00Z5YY_nid_no_patch); + +int APS5_VABI libCprmUnknown_9Blq0Y1cfC4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9Blq0Y1cfC4", libCprmUnknown_9Blq0Y1cfC4_nid_no_patch); + +int APS5_VABI libCprmUnknown_C_plus_UDpkvBfq0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("C+UDpkvBfq0", libCprmUnknown_C_plus_UDpkvBfq0_nid_no_patch); + +int APS5_VABI libCprmUnknown_Dxqbh2fid_minus_0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Dxqbh2fid-0", libCprmUnknown_Dxqbh2fid_minus_0_nid_no_patch); + +int APS5_VABI libCprmUnknown_GYIfXUO2DQM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GYIfXUO2DQM", libCprmUnknown_GYIfXUO2DQM_nid_no_patch); + +int APS5_VABI libCprmUnknown_GzdjmaMs2ec_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GzdjmaMs2ec", libCprmUnknown_GzdjmaMs2ec_nid_no_patch); + +int APS5_VABI libCprmUnknown_Ja2HmL89pQk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ja2HmL89pQk", libCprmUnknown_Ja2HmL89pQk_nid_no_patch); + +int APS5_VABI libCprmUnknown_N1QA8ydpT5s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("N1QA8ydpT5s", libCprmUnknown_N1QA8ydpT5s_nid_no_patch); + +int APS5_VABI libCprmUnknown_Qqt9wsrnORY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Qqt9wsrnORY", libCprmUnknown_Qqt9wsrnORY_nid_no_patch); + +int APS5_VABI libCprmUnknown_SebG2x8vugA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SebG2x8vugA", libCprmUnknown_SebG2x8vugA_nid_no_patch); + +int APS5_VABI libCprmUnknown_Sz5wfo9uoQo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Sz5wfo9uoQo", libCprmUnknown_Sz5wfo9uoQo_nid_no_patch); + +int APS5_VABI libCprmUnknown_UXwPU6S3K3M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UXwPU6S3K3M", libCprmUnknown_UXwPU6S3K3M_nid_no_patch); + +int APS5_VABI libCprmUnknown_Ut6wGp0l_minus_EU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ut6wGp0l-EU", libCprmUnknown_Ut6wGp0l_minus_EU_nid_no_patch); + +int APS5_VABI libCprmUnknown_Uv_minus_1Y7ctRPg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Uv-1Y7ctRPg", libCprmUnknown_Uv_minus_1Y7ctRPg_nid_no_patch); + +int APS5_VABI libCprmUnknown_WWfjXT2d7SM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WWfjXT2d7SM", libCprmUnknown_WWfjXT2d7SM_nid_no_patch); + +int APS5_VABI libCprmUnknown_YhPUdyQoZ2w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YhPUdyQoZ2w", libCprmUnknown_YhPUdyQoZ2w_nid_no_patch); + +int APS5_VABI libCprmUnknown_YvBd1vant8Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YvBd1vant8Y", libCprmUnknown_YvBd1vant8Y_nid_no_patch); + +int APS5_VABI libCprmUnknown_aoE6klVaQmo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aoE6klVaQmo", libCprmUnknown_aoE6klVaQmo_nid_no_patch); + +int APS5_VABI libCprmUnknown_fb1srL_plus__plus_42M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fb1srL++42M", libCprmUnknown_fb1srL_plus__plus_42M_nid_no_patch); + +int APS5_VABI libCprmUnknown_gnClz0AOgtw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gnClz0AOgtw", libCprmUnknown_gnClz0AOgtw_nid_no_patch); + +int APS5_VABI libCprmUnknown_h9jXWgBLon0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("h9jXWgBLon0", libCprmUnknown_h9jXWgBLon0_nid_no_patch); + +int APS5_VABI libCprmUnknown_hs4OD9CTzsU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hs4OD9CTzsU", libCprmUnknown_hs4OD9CTzsU_nid_no_patch); + +int APS5_VABI libCprmUnknown_hvZH8f_plus_HBVg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hvZH8f+HBVg", libCprmUnknown_hvZH8f_plus_HBVg_nid_no_patch); + +int APS5_VABI libCprmUnknown_i2aJI0V3U3A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("i2aJI0V3U3A", libCprmUnknown_i2aJI0V3U3A_nid_no_patch); + +int APS5_VABI libCprmUnknown_iDCilRZjGRM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iDCilRZjGRM", libCprmUnknown_iDCilRZjGRM_nid_no_patch); + +int APS5_VABI libCprmUnknown_lCmvZpz_minus_8Sg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lCmvZpz-8Sg", libCprmUnknown_lCmvZpz_minus_8Sg_nid_no_patch); + +int APS5_VABI libCprmUnknown_llRRCXKDB8g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("llRRCXKDB8g", libCprmUnknown_llRRCXKDB8g_nid_no_patch); + +int APS5_VABI libCprmUnknown_mq_plus_QSu3eTDM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mq+QSu3eTDM", libCprmUnknown_mq_plus_QSu3eTDM_nid_no_patch); + +int APS5_VABI libCprmUnknown_pa1PYEalrtU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pa1PYEalrtU", libCprmUnknown_pa1PYEalrtU_nid_no_patch); + +int APS5_VABI libCprmUnknown_tsJszAZ7k_plus_A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tsJszAZ7k+A", libCprmUnknown_tsJszAZ7k_plus_A_nid_no_patch); + +int APS5_VABI libCprmUnknown_vR2Jy582NrI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vR2Jy582NrI", libCprmUnknown_vR2Jy582NrI_nid_no_patch); + +int APS5_VABI libCprmUnknown_x5bhPjRC_plus_WQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("x5bhPjRC+WQ", libCprmUnknown_x5bhPjRC_plus_WQ_nid_no_patch); + +int APS5_VABI libCprmUnknown_y2mH4WVl028_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("y2mH4WVl028", libCprmUnknown_y2mH4WVl028_nid_no_patch); + +} diff --git a/core/libs/prx/libCprm/include/InventoryExports.hpp b/core/libs/prx/libCprm/include/InventoryExports.hpp new file mode 100644 index 0000000000..3fbbed18a4 --- /dev/null +++ b/core/libs/prx/libCprm/include/InventoryExports.hpp @@ -0,0 +1,43 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libCprmUnknown__plus_Eh9ZNYi6zo_nid_no_patch(); +int APS5_VABI libCprmUnknown__plus_X9TC_plus_1sw8c_nid_no_patch(); +int APS5_VABI libCprmUnknown_1M23A00Z5YY_nid_no_patch(); +int APS5_VABI libCprmUnknown_9Blq0Y1cfC4_nid_no_patch(); +int APS5_VABI libCprmUnknown_C_plus_UDpkvBfq0_nid_no_patch(); +int APS5_VABI libCprmUnknown_Dxqbh2fid_minus_0_nid_no_patch(); +int APS5_VABI libCprmUnknown_GYIfXUO2DQM_nid_no_patch(); +int APS5_VABI libCprmUnknown_GzdjmaMs2ec_nid_no_patch(); +int APS5_VABI libCprmUnknown_Ja2HmL89pQk_nid_no_patch(); +int APS5_VABI libCprmUnknown_N1QA8ydpT5s_nid_no_patch(); +int APS5_VABI libCprmUnknown_Qqt9wsrnORY_nid_no_patch(); +int APS5_VABI libCprmUnknown_SebG2x8vugA_nid_no_patch(); +int APS5_VABI libCprmUnknown_Sz5wfo9uoQo_nid_no_patch(); +int APS5_VABI libCprmUnknown_UXwPU6S3K3M_nid_no_patch(); +int APS5_VABI libCprmUnknown_Ut6wGp0l_minus_EU_nid_no_patch(); +int APS5_VABI libCprmUnknown_Uv_minus_1Y7ctRPg_nid_no_patch(); +int APS5_VABI libCprmUnknown_WWfjXT2d7SM_nid_no_patch(); +int APS5_VABI libCprmUnknown_YhPUdyQoZ2w_nid_no_patch(); +int APS5_VABI libCprmUnknown_YvBd1vant8Y_nid_no_patch(); +int APS5_VABI libCprmUnknown_aoE6klVaQmo_nid_no_patch(); +int APS5_VABI libCprmUnknown_fb1srL_plus__plus_42M_nid_no_patch(); +int APS5_VABI libCprmUnknown_gnClz0AOgtw_nid_no_patch(); +int APS5_VABI libCprmUnknown_h9jXWgBLon0_nid_no_patch(); +int APS5_VABI libCprmUnknown_hs4OD9CTzsU_nid_no_patch(); +int APS5_VABI libCprmUnknown_hvZH8f_plus_HBVg_nid_no_patch(); +int APS5_VABI libCprmUnknown_i2aJI0V3U3A_nid_no_patch(); +int APS5_VABI libCprmUnknown_iDCilRZjGRM_nid_no_patch(); +int APS5_VABI libCprmUnknown_lCmvZpz_minus_8Sg_nid_no_patch(); +int APS5_VABI libCprmUnknown_llRRCXKDB8g_nid_no_patch(); +int APS5_VABI libCprmUnknown_mq_plus_QSu3eTDM_nid_no_patch(); +int APS5_VABI libCprmUnknown_pa1PYEalrtU_nid_no_patch(); +int APS5_VABI libCprmUnknown_tsJszAZ7k_plus_A_nid_no_patch(); +int APS5_VABI libCprmUnknown_vR2Jy582NrI_nid_no_patch(); +int APS5_VABI libCprmUnknown_x5bhPjRC_plus_WQ_nid_no_patch(); +int APS5_VABI libCprmUnknown_y2mH4WVl028_nid_no_patch(); + +} diff --git a/core/libs/prx/libCprm/libCprm.hpp b/core/libs/prx/libCprm/libCprm.hpp new file mode 100644 index 0000000000..c3d732bcd3 --- /dev/null +++ b/core/libs/prx/libCprm/libCprm.hpp @@ -0,0 +1,3 @@ +#pragma once + +#include "prx/libCprm/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceAbstractStorage/Export.cpp b/core/libs/prx/libSceAbstractStorage/Export.cpp index 88ad070841..061e032714 100644 --- a/core/libs/prx/libSceAbstractStorage/Export.cpp +++ b/core/libs/prx/libSceAbstractStorage/Export.cpp @@ -1,3 +1,6 @@ +#include "prx/libSceAbstractStorage/include/LegacyExports.hpp" +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceAbstractStorage/include/InventoryExports.hpp" #include #include #include "SceTypes.hpp" @@ -557,3 +560,116 @@ int APS5_VABI sceAbstractStorageUnknown_1uryzAWFUuA_nid_no_patch() { APS5_EXPORT("1uryzAWFUuA", sceAbstractStorageUnknown_1uryzAWFUuA_nid_no_patch); } + +extern "C" { + +int APS5_VABI libSceAbstractStorageUnknown__plus_bCU7y60g28_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+bCU7y60g28", libSceAbstractStorageUnknown__plus_bCU7y60g28_nid_no_patch); + +int APS5_VABI libSceAbstractStorageUnknown_JwplLmzUrs0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JwplLmzUrs0", libSceAbstractStorageUnknown_JwplLmzUrs0_nid_no_patch); + +int APS5_VABI libSceAbstractStorageUnknown_Nrv7BRYovYk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Nrv7BRYovYk", libSceAbstractStorageUnknown_Nrv7BRYovYk_nid_no_patch); + +int APS5_VABI libSceAbstractStorageUnknown_YBmeXvldPyg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YBmeXvldPyg", libSceAbstractStorageUnknown_YBmeXvldPyg_nid_no_patch); + +int APS5_VABI libSceAbstractStorageUnknown_jsjQnoZHra8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jsjQnoZHra8", libSceAbstractStorageUnknown_jsjQnoZHra8_nid_no_patch); + +int APS5_VABI libSceAbstractStorageUnknown_lMU9P5mJtNM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lMU9P5mJtNM", libSceAbstractStorageUnknown_lMU9P5mJtNM_nid_no_patch); + +int APS5_VABI libSceAbstractStorageUnknown_scAYh9JGyYI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("scAYh9JGyYI", libSceAbstractStorageUnknown_scAYh9JGyYI_nid_no_patch); + +} + +extern "C" { + +int APS5_VABI abstractStorageLegacyUnknown__minus_lJCD9v3ShE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-lJCD9v3ShE", abstractStorageLegacyUnknown__minus_lJCD9v3ShE_nid_no_patch); + +int APS5_VABI abstractStorageLegacyUnknown_58hoiRX9eq0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("58hoiRX9eq0", abstractStorageLegacyUnknown_58hoiRX9eq0_nid_no_patch); + +int APS5_VABI abstractStorageLegacyUnknown_5E95udm3i4A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5E95udm3i4A", abstractStorageLegacyUnknown_5E95udm3i4A_nid_no_patch); + +int APS5_VABI abstractStorageLegacyUnknown_5sF6O0X8XOg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5sF6O0X8XOg", abstractStorageLegacyUnknown_5sF6O0X8XOg_nid_no_patch); + +int APS5_VABI abstractStorageLegacyUnknown_7re96ARYiKU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7re96ARYiKU", abstractStorageLegacyUnknown_7re96ARYiKU_nid_no_patch); + +int APS5_VABI abstractStorageLegacyUnknown_8urQQ98mwcg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8urQQ98mwcg", abstractStorageLegacyUnknown_8urQQ98mwcg_nid_no_patch); + +int APS5_VABI abstractStorageLegacyUnknown_BcT4KRrLn2U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BcT4KRrLn2U", abstractStorageLegacyUnknown_BcT4KRrLn2U_nid_no_patch); + +int APS5_VABI abstractStorageLegacyUnknown_EawgMNYrP2A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EawgMNYrP2A", abstractStorageLegacyUnknown_EawgMNYrP2A_nid_no_patch); + +int APS5_VABI abstractStorageLegacyUnknown_Gz6_plus_aMUIR44_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Gz6+aMUIR44", abstractStorageLegacyUnknown_Gz6_plus_aMUIR44_nid_no_patch); + +int APS5_VABI abstractStorageLegacyUnknown_QieeCoOG9bQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QieeCoOG9bQ", abstractStorageLegacyUnknown_QieeCoOG9bQ_nid_no_patch); + +int APS5_VABI abstractStorageLegacyUnknown_YyubErxn_plus_aM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YyubErxn+aM", abstractStorageLegacyUnknown_YyubErxn_plus_aM_nid_no_patch); + +int APS5_VABI abstractStorageLegacyUnknown_njl_plus_S_plus_GCNOQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("njl+S+GCNOQ", abstractStorageLegacyUnknown_njl_plus_S_plus_GCNOQ_nid_no_patch); + +int APS5_VABI abstractStorageLegacyUnknown_nkDADDAUxc4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nkDADDAUxc4", abstractStorageLegacyUnknown_nkDADDAUxc4_nid_no_patch); + +int APS5_VABI abstractStorageLegacyUnknown_pfToDbCVd_minus_Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pfToDbCVd-Y", abstractStorageLegacyUnknown_pfToDbCVd_minus_Y_nid_no_patch); + +} diff --git a/core/libs/prx/libSceAbstractStorage/include/InventoryExports.hpp b/core/libs/prx/libSceAbstractStorage/include/InventoryExports.hpp new file mode 100644 index 0000000000..c31503d8e5 --- /dev/null +++ b/core/libs/prx/libSceAbstractStorage/include/InventoryExports.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceAbstractStorageUnknown__plus_bCU7y60g28_nid_no_patch(); +int APS5_VABI libSceAbstractStorageUnknown_JwplLmzUrs0_nid_no_patch(); +int APS5_VABI libSceAbstractStorageUnknown_Nrv7BRYovYk_nid_no_patch(); +int APS5_VABI libSceAbstractStorageUnknown_YBmeXvldPyg_nid_no_patch(); +int APS5_VABI libSceAbstractStorageUnknown_jsjQnoZHra8_nid_no_patch(); +int APS5_VABI libSceAbstractStorageUnknown_lMU9P5mJtNM_nid_no_patch(); +int APS5_VABI libSceAbstractStorageUnknown_scAYh9JGyYI_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceAbstractStorage/include/LegacyExports.hpp b/core/libs/prx/libSceAbstractStorage/include/LegacyExports.hpp new file mode 100644 index 0000000000..07e0b0c235 --- /dev/null +++ b/core/libs/prx/libSceAbstractStorage/include/LegacyExports.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI abstractStorageLegacyUnknown__minus_lJCD9v3ShE_nid_no_patch(); +int APS5_VABI abstractStorageLegacyUnknown_58hoiRX9eq0_nid_no_patch(); +int APS5_VABI abstractStorageLegacyUnknown_5E95udm3i4A_nid_no_patch(); +int APS5_VABI abstractStorageLegacyUnknown_5sF6O0X8XOg_nid_no_patch(); +int APS5_VABI abstractStorageLegacyUnknown_7re96ARYiKU_nid_no_patch(); +int APS5_VABI abstractStorageLegacyUnknown_8urQQ98mwcg_nid_no_patch(); +int APS5_VABI abstractStorageLegacyUnknown_BcT4KRrLn2U_nid_no_patch(); +int APS5_VABI abstractStorageLegacyUnknown_EawgMNYrP2A_nid_no_patch(); +int APS5_VABI abstractStorageLegacyUnknown_Gz6_plus_aMUIR44_nid_no_patch(); +int APS5_VABI abstractStorageLegacyUnknown_QieeCoOG9bQ_nid_no_patch(); +int APS5_VABI abstractStorageLegacyUnknown_YyubErxn_plus_aM_nid_no_patch(); +int APS5_VABI abstractStorageLegacyUnknown_njl_plus_S_plus_GCNOQ_nid_no_patch(); +int APS5_VABI abstractStorageLegacyUnknown_nkDADDAUxc4_nid_no_patch(); +int APS5_VABI abstractStorageLegacyUnknown_pfToDbCVd_minus_Y_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceAbstractStorage/libSceAbstractStorage.hpp b/core/libs/prx/libSceAbstractStorage/libSceAbstractStorage.hpp index 6f70f09bee..02bce84cd0 100644 --- a/core/libs/prx/libSceAbstractStorage/libSceAbstractStorage.hpp +++ b/core/libs/prx/libSceAbstractStorage/libSceAbstractStorage.hpp @@ -1 +1,3 @@ #pragma once +#include "prx/libSceAbstractStorage/include/InventoryExports.hpp" +#include "prx/libSceAbstractStorage/include/LegacyExports.hpp" diff --git a/core/libs/prx/libSceAbstractTcs/Export.cpp b/core/libs/prx/libSceAbstractTcs/Export.cpp index d81f4a5e32..89aa5469d4 100644 --- a/core/libs/prx/libSceAbstractTcs/Export.cpp +++ b/core/libs/prx/libSceAbstractTcs/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libSceAbstractTcs/include/LegacyExports.hpp" +#include "prx/libc/include/general/ExportMacros.hpp" #include #include #include "SceTypes.hpp" @@ -8,3 +10,207 @@ extern "C" { APS5_DUMMY_FUN } + +extern "C" { + +int APS5_VABI abstractTcsLegacyUnknown__plus_uyvmTPkPT0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+uyvmTPkPT0", abstractTcsLegacyUnknown__plus_uyvmTPkPT0_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown__plus_yHj1U_minus_k1zU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+yHj1U-k1zU", abstractTcsLegacyUnknown__plus_yHj1U_minus_k1zU_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown_065iwsKaKA4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("065iwsKaKA4", abstractTcsLegacyUnknown_065iwsKaKA4_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown_0MDv01EA_minus_Wo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0MDv01EA-Wo", abstractTcsLegacyUnknown_0MDv01EA_minus_Wo_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown_1vgiZdMEU8k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1vgiZdMEU8k", abstractTcsLegacyUnknown_1vgiZdMEU8k_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown_29VsAacFFxw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("29VsAacFFxw", abstractTcsLegacyUnknown_29VsAacFFxw_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown_4_minus_Soqq0Hrqg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4-Soqq0Hrqg", abstractTcsLegacyUnknown_4_minus_Soqq0Hrqg_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown_5NEeXee1_minus_kQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5NEeXee1-kQ", abstractTcsLegacyUnknown_5NEeXee1_minus_kQ_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown_5b5Tx09Z8uE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5b5Tx09Z8uE", abstractTcsLegacyUnknown_5b5Tx09Z8uE_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown_6zjNlHxuPhY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6zjNlHxuPhY", abstractTcsLegacyUnknown_6zjNlHxuPhY_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown_8uRxMgcUE6c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8uRxMgcUE6c", abstractTcsLegacyUnknown_8uRxMgcUE6c_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown_9KwAuQYhInc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9KwAuQYhInc", abstractTcsLegacyUnknown_9KwAuQYhInc_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown_9RskWGK_plus_Kto_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9RskWGK+Kto", abstractTcsLegacyUnknown_9RskWGK_plus_Kto_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown_BnQJZLesghs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BnQJZLesghs", abstractTcsLegacyUnknown_BnQJZLesghs_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown_CKQqO0otsv0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CKQqO0otsv0", abstractTcsLegacyUnknown_CKQqO0otsv0_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown_IarxytjvEuI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IarxytjvEuI", abstractTcsLegacyUnknown_IarxytjvEuI_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown_J5koYi_plus_uPnk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("J5koYi+uPnk", abstractTcsLegacyUnknown_J5koYi_plus_uPnk_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown_JwWSY1YarEs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JwWSY1YarEs", abstractTcsLegacyUnknown_JwWSY1YarEs_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown_La1inpscek8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("La1inpscek8", abstractTcsLegacyUnknown_La1inpscek8_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown_RZ_plus_sajO2y8o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RZ+sajO2y8o", abstractTcsLegacyUnknown_RZ_plus_sajO2y8o_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown_SoP4nFTiu2I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SoP4nFTiu2I", abstractTcsLegacyUnknown_SoP4nFTiu2I_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown_V4T61w1Cqe8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("V4T61w1Cqe8", abstractTcsLegacyUnknown_V4T61w1Cqe8_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown_ZWtONs1OIvg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZWtONs1OIvg", abstractTcsLegacyUnknown_ZWtONs1OIvg_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown_ahZrMN_minus_Jt6Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ahZrMN-Jt6Y", abstractTcsLegacyUnknown_ahZrMN_minus_Jt6Y_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown_bVvlpS2KicM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bVvlpS2KicM", abstractTcsLegacyUnknown_bVvlpS2KicM_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown_bg0nEmwlF7w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bg0nEmwlF7w", abstractTcsLegacyUnknown_bg0nEmwlF7w_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown_cAWoVxe45V0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cAWoVxe45V0", abstractTcsLegacyUnknown_cAWoVxe45V0_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown_cCGY_plus_evCvVc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cCGY+evCvVc", abstractTcsLegacyUnknown_cCGY_plus_evCvVc_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown_clQhSM8NcKU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("clQhSM8NcKU", abstractTcsLegacyUnknown_clQhSM8NcKU_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown_eY11gxVQj3w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eY11gxVQj3w", abstractTcsLegacyUnknown_eY11gxVQj3w_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown_fe6dqznfu0M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fe6dqznfu0M", abstractTcsLegacyUnknown_fe6dqznfu0M_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown_foVwhntBh5s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("foVwhntBh5s", abstractTcsLegacyUnknown_foVwhntBh5s_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown_l7InnXfshQg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("l7InnXfshQg", abstractTcsLegacyUnknown_l7InnXfshQg_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown_mFGc4QJTRHA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mFGc4QJTRHA", abstractTcsLegacyUnknown_mFGc4QJTRHA_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown_nCiacsEZ4bs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nCiacsEZ4bs", abstractTcsLegacyUnknown_nCiacsEZ4bs_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown_ru8kyGpFGLM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ru8kyGpFGLM", abstractTcsLegacyUnknown_ru8kyGpFGLM_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown_tp06H_minus_EvwAg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tp06H-EvwAg", abstractTcsLegacyUnknown_tp06H_minus_EvwAg_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown_uTt_minus_bJVheZI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uTt-bJVheZI", abstractTcsLegacyUnknown_uTt_minus_bJVheZI_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown_yCjJib_minus_VZrc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yCjJib-VZrc", abstractTcsLegacyUnknown_yCjJib_minus_VZrc_nid_no_patch); + +int APS5_VABI abstractTcsLegacyUnknown_zz6g6ReL0Ec_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zz6g6ReL0Ec", abstractTcsLegacyUnknown_zz6g6ReL0Ec_nid_no_patch); + +} diff --git a/core/libs/prx/libSceAbstractTcs/include/LegacyExports.hpp b/core/libs/prx/libSceAbstractTcs/include/LegacyExports.hpp new file mode 100644 index 0000000000..1cb3756009 --- /dev/null +++ b/core/libs/prx/libSceAbstractTcs/include/LegacyExports.hpp @@ -0,0 +1,48 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI abstractTcsLegacyUnknown__plus_uyvmTPkPT0_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown__plus_yHj1U_minus_k1zU_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown_065iwsKaKA4_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown_0MDv01EA_minus_Wo_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown_1vgiZdMEU8k_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown_29VsAacFFxw_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown_4_minus_Soqq0Hrqg_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown_5NEeXee1_minus_kQ_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown_5b5Tx09Z8uE_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown_6zjNlHxuPhY_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown_8uRxMgcUE6c_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown_9KwAuQYhInc_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown_9RskWGK_plus_Kto_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown_BnQJZLesghs_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown_CKQqO0otsv0_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown_IarxytjvEuI_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown_J5koYi_plus_uPnk_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown_JwWSY1YarEs_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown_La1inpscek8_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown_RZ_plus_sajO2y8o_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown_SoP4nFTiu2I_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown_V4T61w1Cqe8_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown_ZWtONs1OIvg_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown_ahZrMN_minus_Jt6Y_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown_bVvlpS2KicM_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown_bg0nEmwlF7w_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown_cAWoVxe45V0_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown_cCGY_plus_evCvVc_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown_clQhSM8NcKU_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown_eY11gxVQj3w_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown_fe6dqznfu0M_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown_foVwhntBh5s_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown_l7InnXfshQg_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown_mFGc4QJTRHA_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown_nCiacsEZ4bs_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown_ru8kyGpFGLM_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown_tp06H_minus_EvwAg_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown_uTt_minus_bJVheZI_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown_yCjJib_minus_VZrc_nid_no_patch(); +int APS5_VABI abstractTcsLegacyUnknown_zz6g6ReL0Ec_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceAbstractTcs/libSceAbstractTcs.hpp b/core/libs/prx/libSceAbstractTcs/libSceAbstractTcs.hpp index 6f70f09bee..55d111f3d8 100644 --- a/core/libs/prx/libSceAbstractTcs/libSceAbstractTcs.hpp +++ b/core/libs/prx/libSceAbstractTcs/libSceAbstractTcs.hpp @@ -1 +1,2 @@ #pragma once +#include "prx/libSceAbstractTcs/include/LegacyExports.hpp" diff --git a/core/libs/prx/libSceAcm/Export.cpp b/core/libs/prx/libSceAcm/Export.cpp index c50791cc65..d0cf25bf77 100644 --- a/core/libs/prx/libSceAcm/Export.cpp +++ b/core/libs/prx/libSceAcm/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceAcm/include/InventoryExports.hpp" #include "prx/libSceAcm/include/Api.hpp" #include #include @@ -398,7 +400,12 @@ int APS5_VABI sceAcm_Panner(AcmBatchInfo* batch, std::uint32_t sourceCount, cons } int APS5_VABI sceAcmBatchJobPriority(AcmBatchInfo* batch, std::uint32_t priority) { - NotImplemented_nid_no_patch(__func__); + if (!batch || priority >= 4) return SCE_ACM_ERROR_BAD_POINTER; + const auto offset = batch->offset; + if (offset > batch->buffer_size || batch->buffer_size - offset < 8) return static_cast(0x81940009); + const std::uint64_t job = 0x10 | (static_cast(priority) << 8); + std::memcpy(static_cast(batch->buffer) + offset, &job, sizeof(job)); + batch->offset = offset + sizeof(job); return 0; } @@ -417,3 +424,32 @@ int APS5_VABI sceAcmBatchJobNotification() { } } + +extern "C" { + +int APS5_VABI libSceAcmUnknown_9_plus_f3tPdeyP0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9+f3tPdeyP0", libSceAcmUnknown_9_plus_f3tPdeyP0_nid_no_patch); + +int APS5_VABI libSceAcmUnknown_DvsnlQr4yyk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DvsnlQr4yyk", libSceAcmUnknown_DvsnlQr4yyk_nid_no_patch); + +int APS5_VABI libSceAcmUnknown_PLNywpi1zR4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PLNywpi1zR4", libSceAcmUnknown_PLNywpi1zR4_nid_no_patch); + +int APS5_VABI libSceAcmUnknown_YpYvibqaqz0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YpYvibqaqz0", libSceAcmUnknown_YpYvibqaqz0_nid_no_patch); + +int APS5_VABI libSceAcmUnknown_ngDRON91_plus__minus_Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ngDRON91+-Y", libSceAcmUnknown_ngDRON91_plus__minus_Y_nid_no_patch); + +} diff --git a/core/libs/prx/libSceAcm/include/InventoryExports.hpp b/core/libs/prx/libSceAcm/include/InventoryExports.hpp new file mode 100644 index 0000000000..cfcc68f05f --- /dev/null +++ b/core/libs/prx/libSceAcm/include/InventoryExports.hpp @@ -0,0 +1,13 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceAcmUnknown_9_plus_f3tPdeyP0_nid_no_patch(); +int APS5_VABI libSceAcmUnknown_DvsnlQr4yyk_nid_no_patch(); +int APS5_VABI libSceAcmUnknown_PLNywpi1zR4_nid_no_patch(); +int APS5_VABI libSceAcmUnknown_YpYvibqaqz0_nid_no_patch(); +int APS5_VABI libSceAcmUnknown_ngDRON91_plus__minus_Y_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceAcm/libSceAcm.hpp b/core/libs/prx/libSceAcm/libSceAcm.hpp index a8b95eefbf..7ffc676d82 100644 --- a/core/libs/prx/libSceAcm/libSceAcm.hpp +++ b/core/libs/prx/libSceAcm/libSceAcm.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceAcm/include/Api.hpp" +#include "prx/libSceAcm/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceAgc/tests/PacketInfo.cpp b/core/libs/prx/libSceAgc/tests/PacketInfo.cpp index 9054c828ba..86bcaacf43 100644 --- a/core/libs/prx/libSceAgc/tests/PacketInfo.cpp +++ b/core/libs/prx/libSceAgc/tests/PacketInfo.cpp @@ -36,6 +36,25 @@ void testPacketSize() { } } + + +void testSystemSoftwareVersion() { + std::array packet{0xc0020000u, 0xbeefcafeu, 0}; + std::uint32_t version = 0; + check(sceAgcDcbGetSystemSoftwareVersion(&version, packet.data()) == 0, "assigned system software version"); + check(version == 0xbeefcafeu, "system software version uses the second packet word"); + check(packet[0] == 0xc0020000u && packet[1] == 0xbeefcafeu, "query does not modify the packet"); + + std::array tooShort{0xc0000000u, 0xbeefcafeu}; + expectFailure([&] { sceAgcDcbGetSystemSoftwareVersion(&version, tooShort.data()); }); + expectFailure([&] { sceAgcDcbGetSystemSoftwareVersion(nullptr, packet.data()); }); + expectFailure([&] { sceAgcDcbGetSystemSoftwareVersion(&version, nullptr); }); + for (const auto header : {0x80000000u, 0x3fff1000u, 0x40001000u, 0x00027600u}) { + std::array invalidHeader{header, 0xbeefcafeu, 0}; + expectFailure([&] { sceAgcDcbGetSystemSoftwareVersion(&version, invalidHeader.data()); }); + } +} + void testRejections() { for (const auto header : {0x80000000u, 0x3fff1000u, 0x40001000u, 0x00047600u}) { std::uint32_t word = header; @@ -53,6 +72,7 @@ int main() { try { testPacketSize(); testRejections(); + testSystemSoftwareVersion(); LibcRunShutdown_nid_postfix(); std::puts("AGC packet info tests passed"); return 0; diff --git a/core/libs/prx/libSceAgcDriver/CMakeLists.txt b/core/libs/prx/libSceAgcDriver/CMakeLists.txt index 524b12c8d9..d273837962 100644 --- a/core/libs/prx/libSceAgcDriver/CMakeLists.txt +++ b/core/libs/prx/libSceAgcDriver/CMakeLists.txt @@ -439,239 +439,12 @@ if(MINGW OR CMAKE_SYSTEM_NAME STREQUAL "Linux") target_link_options(libSceAgcDriver PRIVATE LINKER:--exclude-libs,$) endif() -if(BUILD_TESTING) - add_test_executable(agc_driver_unsupported_diagnostics_tests tests/UnsupportedDiagnostics.cpp) - target_include_directories(agc_driver_unsupported_diagnostics_tests PRIVATE ${LIBS_INCLUDE_DIR}) - target_link_libraries(agc_driver_unsupported_diagnostics_tests PRIVATE libSceAgcDriver) - configure_windows_unwind(agc_driver_unsupported_diagnostics_tests) - add_test(NAME agc_driver_unsupported_diagnostics COMMAND agc_driver_unsupported_diagnostics_tests) - if(WIN32) - set_tests_properties(agc_driver_unsupported_diagnostics PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - - add_test_executable(agc_driver_pipeline_profile_tests tests/DrawPipelineProfile.cpp) - target_include_directories(agc_driver_pipeline_profile_tests PRIVATE ${LIBS_INCLUDE_DIR}) - target_link_libraries(agc_driver_pipeline_profile_tests PRIVATE libSceAgcDriver) - set_target_properties(agc_driver_pipeline_profile_tests PROPERTIES CXX_EXTENSIONS OFF) - configure_windows_unwind(agc_driver_pipeline_profile_tests) - add_test(NAME agc_driver_pipeline_profile COMMAND agc_driver_pipeline_profile_tests) - set_tests_properties(agc_driver_pipeline_profile PROPERTIES TIMEOUT 20 - ENVIRONMENT "APS5_PIPELINE_STATS=1;APS5_PIPELINED_DRAWS=8") - if(WIN32) - set_tests_properties(agc_driver_pipeline_profile PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - - add_test_executable(agc_driver_draw_program_trace_tests - tests/DrawProgramTrace.cpp - Execution/src/Driver/Draw/DrawProgramTrace.cpp - ) - target_include_directories(agc_driver_draw_program_trace_tests PRIVATE - ${LIBS_INCLUDE_DIR} - ${CMAKE_SOURCE_DIR}/core/shader/recompiler - ) - set_target_properties(agc_driver_draw_program_trace_tests PROPERTIES CXX_EXTENSIONS OFF) - configure_windows_unwind(agc_driver_draw_program_trace_tests) - add_test(NAME agc_driver_draw_program_trace COMMAND agc_driver_draw_program_trace_tests) - set_tests_properties(agc_driver_draw_program_trace PROPERTIES TIMEOUT 20) - if(MINGW) - target_link_libraries(agc_driver_draw_program_trace_tests PRIVATE libc) - set_tests_properties(agc_driver_draw_program_trace PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - set_target_properties(libSceAgcDriver PROPERTIES CXX_EXTENSIONS OFF) configure_windows_unwind(libSceAgcDriver) if(WIN32) target_link_options(libSceAgcDriver PRIVATE LINKER:--exclude-symbols=_Znwy:_Znay:_ZnwyRKSt9nothrow_t:_ZnayRKSt9nothrow_t:_ZdlPv:_ZdaPv:_ZdlPvy:_ZdaPvy:_ZdlPvRKSt9nothrow_t:_ZdaPvRKSt9nothrow_t) endif() -if(BUILD_TESTING) - add_test_executable(agc_driver_nop_data_packet_tests tests/NopDataWritePacket.cpp) - target_include_directories(agc_driver_nop_data_packet_tests PRIVATE ${LIBS_INCLUDE_DIR}) - target_link_libraries(agc_driver_nop_data_packet_tests PRIVATE libSceAgcDriver) - configure_windows_unwind(agc_driver_nop_data_packet_tests) - add_test(NAME agc_driver_nop_data_packet COMMAND agc_driver_nop_data_packet_tests) - if(WIN32) - set_tests_properties(agc_driver_nop_data_packet PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - - add_test_executable(agc_frame_dump_io_tests tests/FrameDumpIo.cpp) - target_include_directories(agc_frame_dump_io_tests PRIVATE ${LIBS_INCLUDE_DIR}) - target_link_libraries(agc_frame_dump_io_tests PRIVATE libc) - configure_windows_unwind(agc_frame_dump_io_tests) - add_test(NAME agc_frame_dump_io COMMAND agc_frame_dump_io_tests) - set_tests_properties(agc_frame_dump_io PROPERTIES TIMEOUT 20) - if(WIN32) - set_tests_properties(agc_frame_dump_io PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - - add_test_executable(agc_frame_capture_tests tests/FrameCapture.cpp Execution/src/FrameCapture.cpp) - target_include_directories(agc_frame_capture_tests PRIVATE ${LIBS_INCLUDE_DIR}) - target_link_libraries(agc_frame_capture_tests PRIVATE libc libzstd_static) - set_target_properties(agc_frame_capture_tests PROPERTIES CXX_EXTENSIONS OFF) - configure_windows_unwind(agc_frame_capture_tests) - add_test(NAME agc_frame_capture COMMAND agc_frame_capture_tests) - set_tests_properties(agc_frame_capture PROPERTIES TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_frame_capture PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - - add_test_executable(agc_write_watch_coverage_tests tests/WriteWatchCoverage.cpp) - target_include_directories(agc_write_watch_coverage_tests PRIVATE ${LIBS_INCLUDE_DIR}) - target_link_libraries(agc_write_watch_coverage_tests PRIVATE libc) - configure_windows_unwind(agc_write_watch_coverage_tests) - add_test(NAME agc_write_watch_coverage COMMAND agc_write_watch_coverage_tests) - if(WIN32) - set_tests_properties(agc_write_watch_coverage PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - - if(WIN32) - add_test_executable(agc_private_collect_tests tests/PrivateCollect.cpp) - target_include_directories(agc_private_collect_tests PRIVATE ${LIBS_INCLUDE_DIR}) - target_link_libraries(agc_private_collect_tests PRIVATE libc) - target_compile_definitions(agc_private_collect_tests PRIVATE APS5_COUNT_MAPPING_QUERIES=1) - set_target_properties(agc_private_collect_tests PROPERTIES CXX_EXTENSIONS OFF) - configure_windows_unwind(agc_private_collect_tests) - add_test(NAME agc_private_collect COMMAND agc_private_collect_tests) - set_tests_properties(agc_private_collect PROPERTIES TIMEOUT 60 ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - - add_test_executable(agc_profile_output_tests tests/ProfileOutput.cpp) - target_include_directories(agc_profile_output_tests PRIVATE ${LIBS_INCLUDE_DIR}) - target_link_libraries(agc_profile_output_tests PRIVATE libc) - configure_windows_unwind(agc_profile_output_tests) - add_test(NAME agc_profile_output COMMAND agc_profile_output_tests) - set_tests_properties(agc_profile_output PROPERTIES TIMEOUT 20) - if(WIN32) - set_tests_properties(agc_profile_output PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - - add_test_executable(agc_runtime_switches_tests tests/RuntimeSwitches.cpp Graphics/src/RuntimeSwitches.cpp) - target_include_directories(agc_runtime_switches_tests PRIVATE ${LIBS_INCLUDE_DIR}) - target_link_libraries(agc_runtime_switches_tests PRIVATE libc) - configure_windows_unwind(agc_runtime_switches_tests) - add_test(NAME agc_runtime_switches COMMAND agc_runtime_switches_tests) - add_test(NAME agc_runtime_switches_refused COMMAND agc_runtime_switches_tests refused) - set_tests_properties(agc_runtime_switches agc_runtime_switches_refused PROPERTIES TIMEOUT 20) - if(WIN32) - set_tests_properties(agc_runtime_switches agc_runtime_switches_refused PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - - add_test_executable(agc_async_log_tests tests/AsyncLog.cpp) - target_include_directories(agc_async_log_tests PRIVATE ${LIBS_INCLUDE_DIR}) - target_link_libraries(agc_async_log_tests PRIVATE libc) - configure_windows_unwind(agc_async_log_tests) - add_test(NAME agc_async_log COMMAND agc_async_log_tests) - add_test(NAME agc_async_log_fatal COMMAND agc_async_log_tests fatal) - set_tests_properties(agc_async_log agc_async_log_fatal PROPERTIES TIMEOUT 20) - if(WIN32) - set_tests_properties(agc_async_log agc_async_log_fatal PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - - if(WIN32) - add_test_executable(agc_worker_sampler_tests tests/WorkerSampler.cpp Execution/src/WorkerSampler.cpp) - target_include_directories(agc_worker_sampler_tests PRIVATE ${LIBS_INCLUDE_DIR}) - target_link_libraries(agc_worker_sampler_tests PRIVATE libc) - configure_windows_unwind(agc_worker_sampler_tests) - foreach(mode default selected unselected process) - add_test(NAME agc_worker_sampler_${mode} COMMAND agc_worker_sampler_tests ${mode}) - set_tests_properties(agc_worker_sampler_${mode} PROPERTIES TIMEOUT 20 ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endforeach() - endif() - - add_test_executable(agc_stack_walk_tests tests/StackWalk.cpp) - target_include_directories(agc_stack_walk_tests PRIVATE ${LIBS_INCLUDE_DIR}) - target_link_libraries(agc_stack_walk_tests PRIVATE libc) - configure_windows_unwind(agc_stack_walk_tests) - add_test(NAME agc_stack_walk COMMAND agc_stack_walk_tests) - set_tests_properties(agc_stack_walk PROPERTIES TIMEOUT 20) - if(WIN32) - set_tests_properties(agc_stack_walk PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - - add_test_executable(agc_performance_trace_tests tests/PerformanceTrace.cpp Execution/src/TraceFile.cpp) - target_include_directories(agc_performance_trace_tests PRIVATE ${LIBS_INCLUDE_DIR} ${agcZlibIncludeDir}) - target_link_libraries(agc_performance_trace_tests PRIVATE libc jpeg_turbo) - configure_windows_unwind(agc_performance_trace_tests) - add_test(NAME agc_performance_trace COMMAND agc_performance_trace_tests) - set_tests_properties(agc_performance_trace PROPERTIES TIMEOUT 20) - if(WIN32) - set_tests_properties(agc_performance_trace PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - - add_test_executable(agc_handoff_spin_tests tests/HandoffSpin.cpp) - target_include_directories(agc_handoff_spin_tests PRIVATE ${LIBS_INCLUDE_DIR}) - target_link_libraries(agc_handoff_spin_tests PRIVATE libc) - configure_windows_unwind(agc_handoff_spin_tests) - add_test(NAME agc_handoff_spin COMMAND agc_handoff_spin_tests) - set_tests_properties(agc_handoff_spin PROPERTIES TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_handoff_spin PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - - add_test_executable(agc_compile_budget_tests tests/CompileBudget.cpp) - target_include_directories(agc_compile_budget_tests PRIVATE ${LIBS_INCLUDE_DIR}) - target_link_libraries(agc_compile_budget_tests PRIVATE libc) - configure_windows_unwind(agc_compile_budget_tests) - add_test(NAME agc_compile_budget COMMAND agc_compile_budget_tests) - set_tests_properties(agc_compile_budget PROPERTIES TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_compile_budget PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - - add_test_executable(agc_capture_trace_tests tests/CaptureTrace.cpp) - target_include_directories(agc_capture_trace_tests PRIVATE ${LIBS_INCLUDE_DIR}) - target_link_libraries(agc_capture_trace_tests PRIVATE libc) - configure_windows_unwind(agc_capture_trace_tests) - set(agcCaptureTraceDirectory ${CMAKE_CURRENT_BINARY_DIR}/capture_trace_tests) - file(MAKE_DIRECTORY "${agcCaptureTraceDirectory}/default") - file(MAKE_DIRECTORY "${agcCaptureTraceDirectory}/explicit") - file(MAKE_DIRECTORY "${agcCaptureTraceDirectory}/failure") - file(MAKE_DIRECTORY "${agcCaptureTraceDirectory}/best-effort") - file(MAKE_DIRECTORY "${agcCaptureTraceDirectory}/disabled") - set(agcCaptureTraceExplicitPath "${agcCaptureTraceDirectory}/explicit/trace.log") - set(agcCaptureTraceFailurePath "${agcCaptureTraceDirectory}/failure/missing-parent/trace.log") - set(agcCaptureTraceBestEffortPath "${agcCaptureTraceDirectory}/best-effort/trace.log") - add_test(NAME agc_capture_trace_path_default COMMAND agc_capture_trace_tests path-default) - add_test(NAME agc_capture_trace_path_empty COMMAND agc_capture_trace_tests path-empty) - set_tests_properties(agc_capture_trace_path_empty PROPERTIES ENVIRONMENT "APS5_CAPTURE_TRACE_PATH=") - add_test(NAME agc_capture_trace_path_explicit COMMAND agc_capture_trace_tests path-explicit) - set_tests_properties(agc_capture_trace_path_explicit PROPERTIES ENVIRONMENT "APS5_CAPTURE_TRACE_PATH=${agcCaptureTraceExplicitPath}") - add_test(NAME agc_capture_trace_explicit_writes COMMAND agc_capture_trace_tests explicit-writes) - set_tests_properties(agc_capture_trace_explicit_writes PROPERTIES ENVIRONMENT "APS5_CAPTURE_TRACE=1;APS5_CAPTURE_TRACE_PATH=${agcCaptureTraceExplicitPath}") - add_test(NAME agc_capture_trace_default_writes COMMAND agc_capture_trace_tests default-writes) - set_tests_properties(agc_capture_trace_default_writes PROPERTIES ENVIRONMENT "APS5_CAPTURE_TRACE=1" WORKING_DIRECTORY "${agcCaptureTraceDirectory}/default") - add_test(NAME agc_capture_trace_open_failure COMMAND agc_capture_trace_tests open-failure) - set_tests_properties(agc_capture_trace_open_failure PROPERTIES ENVIRONMENT "APS5_CAPTURE_TRACE=1;APS5_CAPTURE_TRACE_PATH=${agcCaptureTraceFailurePath}" WORKING_DIRECTORY "${agcCaptureTraceDirectory}/failure") - add_test(NAME agc_capture_trace_best_effort_overflow COMMAND agc_capture_trace_tests best-effort-overflow) - set_tests_properties(agc_capture_trace_best_effort_overflow PROPERTIES ENVIRONMENT "APS5_CAPTURE_TRACE=1;APS5_CAPTURE_TRACE_PATH=${agcCaptureTraceBestEffortPath}" WORKING_DIRECTORY "${agcCaptureTraceDirectory}/best-effort") - add_test(NAME agc_capture_trace_disabled COMMAND agc_capture_trace_tests disabled) - set_tests_properties(agc_capture_trace_disabled PROPERTIES WORKING_DIRECTORY "${agcCaptureTraceDirectory}/disabled") - if(WIN32) - set_tests_properties(agc_capture_trace_path_default agc_capture_trace_path_empty - agc_capture_trace_path_explicit agc_capture_trace_explicit_writes - agc_capture_trace_default_writes agc_capture_trace_open_failure agc_capture_trace_best_effort_overflow - agc_capture_trace_disabled PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - if(WIN32) set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/Execution/src/GuestMemory.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Execution/src/Driver/Lifecycle.cpp PROPERTIES COMPILE_DEFINITIONS _WIN32_WINNT=0x0602) endif() @@ -680,897 +453,6 @@ foreach(runtimeLinkFlag IN ITEMS -static-libgcc -static-libstdc++ -static) string(REPLACE "${runtimeLinkFlag}" "" CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}") endforeach() -add_test_executable(agc_driver_register_key_tests EXCLUDE_FROM_ALL tests/RegisterKey.cpp) -target_include_directories(agc_driver_register_key_tests PRIVATE - ${LIBS_INCLUDE_DIR} - ${CMAKE_SOURCE_DIR}/core/shader/recompiler - ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR} -) -target_link_libraries(agc_driver_register_key_tests PRIVATE - libSceAgcDriver - libc - libkernel -) -set_target_properties(agc_driver_register_key_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_driver_register_key_tests) -if(BUILD_TESTING) - set_target_properties(agc_driver_register_key_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_driver_register_key COMMAND agc_driver_register_key_tests) - set_tests_properties(agc_driver_register_key PROPERTIES TIMEOUT 30 ENVIRONMENT "APS5_VERIFY_REGISTER_KEYS=1") - if(WIN32) - set_tests_properties(agc_driver_register_key PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -if(BUILD_TESTING AND WIN32) - add_test_executable(agc_driver_host_allocator_tests tests/HostAllocator.cpp Execution/src/HostAllocator.cpp) - target_link_libraries(agc_driver_host_allocator_tests PRIVATE libc) - configure_windows_unwind(agc_driver_host_allocator_tests) - add_test(NAME agc_driver_host_allocator COMMAND agc_driver_host_allocator_tests) - set_tests_properties(agc_driver_host_allocator PROPERTIES TIMEOUT 30 ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") -endif() - -add_test_executable(agc_driver_key_miss_tests EXCLUDE_FROM_ALL tests/KeyMiss.cpp) -target_include_directories(agc_driver_key_miss_tests PRIVATE - ${LIBS_INCLUDE_DIR} - ${CMAKE_SOURCE_DIR}/core/shader/recompiler - ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR} -) -target_link_libraries(agc_driver_key_miss_tests PRIVATE - libSceAgcDriver - libc - libkernel -) -set_target_properties(agc_driver_key_miss_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_driver_key_miss_tests) -if(BUILD_TESTING) - set_target_properties(agc_driver_key_miss_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_driver_key_miss COMMAND agc_driver_key_miss_tests) - set_tests_properties(agc_driver_key_miss PROPERTIES TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_driver_key_miss PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_driver_tests EXCLUDE_FROM_ALL - tests/Submit.cpp -) - -target_include_directories(agc_driver_tests PRIVATE - ${LIBS_INCLUDE_DIR} - ${CMAKE_SOURCE_DIR}/core/shader/recompiler - ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR} - ${ANYPS5_SPIRV_HEADERS_INCLUDE_DIR} -) - -target_link_libraries(agc_driver_tests PRIVATE - libSceAgcDriver - libkernel - libc -) - -set_target_properties(agc_driver_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_driver_tests) - -add_test_executable(agc_driver_wait_shutdown_tests EXCLUDE_FROM_ALL tests/WaitShutdown.cpp) -target_include_directories(agc_driver_wait_shutdown_tests PRIVATE ${LIBS_INCLUDE_DIR}) -target_link_libraries(agc_driver_wait_shutdown_tests PRIVATE libSceAgcDriver libkernel libc) -set_target_properties(agc_driver_wait_shutdown_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_driver_wait_shutdown_tests) -if(BUILD_TESTING) - set_target_properties(agc_driver_wait_shutdown_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_driver_wait_shutdown COMMAND agc_driver_wait_shutdown_tests) - set_tests_properties(agc_driver_wait_shutdown PROPERTIES - ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_GPU_WAIT_TIMEOUT_MS=20" - TIMEOUT 10 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - add_test(NAME agc_driver_resolution_shutdown COMMAND agc_driver_wait_shutdown_tests --resolution-shutdown) - set_tests_properties(agc_driver_resolution_shutdown PROPERTIES TIMEOUT 10 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_driver_wait_shutdown agc_driver_resolution_shutdown PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_shader_memory_tests EXCLUDE_FROM_ALL - tests/ShaderMemory.cpp - Execution/src/ShaderMemory.cpp - Execution/src/GuestMemory.cpp - Execution/src/PerformanceTraceThread.cpp -) -target_include_directories(agc_shader_memory_tests PRIVATE ${LIBS_INCLUDE_DIR}) -target_link_libraries(agc_shader_memory_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_shader_memory_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_shader_memory_tests) - -add_test_executable(agc_vertex_input_tests EXCLUDE_FROM_ALL tests/VertexInput.cpp) -target_include_directories(agc_vertex_input_tests PRIVATE - ${LIBS_INCLUDE_DIR} - ${CMAKE_SOURCE_DIR}/3rdparty/Vulkan-Headers/include -) -target_link_libraries(agc_vertex_input_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_vertex_input_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_vertex_input_tests) - -add_test_executable(agc_guarded_memory_loads_tests EXCLUDE_FROM_ALL tests/GuardedMemoryLoads.cpp) -target_link_libraries(agc_guarded_memory_loads_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_guarded_memory_loads_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_guarded_memory_loads_tests) -if(BUILD_TESTING) - set_target_properties(agc_guarded_memory_loads_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_guarded_memory_loads COMMAND agc_guarded_memory_loads_tests) - set_tests_properties(agc_guarded_memory_loads PROPERTIES TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_guarded_memory_loads PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_lds_lock_budget_tests EXCLUDE_FROM_ALL tests/LdsLockBudget.cpp) -target_link_libraries(agc_lds_lock_budget_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_lds_lock_budget_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_lds_lock_budget_tests) -if(BUILD_TESTING) - set_target_properties(agc_lds_lock_budget_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_lds_lock_budget COMMAND agc_lds_lock_budget_tests) - set_tests_properties(agc_lds_lock_budget PROPERTIES TIMEOUT 30 ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_lds_lock_budget PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_shared_write_tests EXCLUDE_FROM_ALL tests/SharedWrites.cpp) -target_include_directories(agc_shared_write_tests PRIVATE ${LIBS_INCLUDE_DIR}) -target_link_libraries(agc_shared_write_tests PRIVATE libSceAgcDriver libkernel libc) -set_target_properties(agc_shared_write_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_shared_write_tests) - -if(BUILD_TESTING AND WIN32) - add_test_executable(agc_page_state_tests tests/PageStates.cpp) - target_include_directories(agc_page_state_tests PRIVATE ${LIBS_INCLUDE_DIR}) - target_link_libraries(agc_page_state_tests PRIVATE libSceAgcDriver libc) - configure_windows_unwind(agc_page_state_tests) - add_test(NAME agc_page_states COMMAND agc_page_state_tests) - add_test(NAME agc_page_state_metadata COMMAND agc_page_state_tests --metadata) - set_tests_properties(agc_page_states agc_page_state_metadata PROPERTIES - TIMEOUT 30 ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") -endif() - -add_test_executable(agc_copy_guest_bytes_tests EXCLUDE_FROM_ALL tests/CopyGuestBytes.cpp) -target_include_directories(agc_copy_guest_bytes_tests PRIVATE - ${LIBS_INCLUDE_DIR} - ${CMAKE_SOURCE_DIR}/core/shader/recompiler - ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR} - ${ANYPS5_SPIRV_HEADERS_INCLUDE_DIR} -) -target_link_libraries(agc_copy_guest_bytes_tests PRIVATE libSceAgcDriver libc) -set_target_properties(agc_copy_guest_bytes_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_copy_guest_bytes_tests) - -add_test_executable(agc_locks_tests EXCLUDE_FROM_ALL tests/Locks.cpp) -target_include_directories(agc_locks_tests PRIVATE - ${LIBS_INCLUDE_DIR} - ${CMAKE_SOURCE_DIR}/core/shader/recompiler - ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR} - ${ANYPS5_SPIRV_HEADERS_INCLUDE_DIR} -) -target_link_libraries(agc_locks_tests PRIVATE libSceAgcDriver libc) -set_target_properties(agc_locks_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_locks_tests) - -add_test_executable(agc_write_tracking_tests EXCLUDE_FROM_ALL - tests/WriteTracking.cpp - Execution/src/GuestMemory.cpp - Execution/src/PerformanceTraceThread.cpp -) -target_include_directories(agc_write_tracking_tests PRIVATE ${LIBS_INCLUDE_DIR}) -target_link_libraries(agc_write_tracking_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_write_tracking_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_write_tracking_tests) -if(BUILD_TESTING) - set_target_properties(agc_write_tracking_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_write_tracking COMMAND agc_write_tracking_tests) - set_tests_properties(agc_write_tracking PROPERTIES SKIP_RETURN_CODE 77) - if(WIN32) - add_test(NAME agc_write_tracking_metadata_commit COMMAND agc_write_tracking_tests --metadata-commit) - set_tests_properties(agc_write_tracking_metadata_commit PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) - add_test(NAME agc_write_tracking_cpu_write_pin COMMAND agc_write_tracking_tests --cpu-write-pin) - set_tests_properties(agc_write_tracking_cpu_write_pin PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 20) - add_test(NAME agc_resident_direct_remap COMMAND agc_write_tracking_tests --resident-direct-remap) - set_tests_properties(agc_resident_direct_remap PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 20) - add_test(NAME agc_rewatched_direct_shared COMMAND agc_write_tracking_tests --rewatched-direct-shared) - set_tests_properties(agc_rewatched_direct_shared PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 20) - add_test(NAME agc_import_alias_shared COMMAND agc_write_tracking_tests --import-alias-shared) - set_tests_properties(agc_import_alias_shared PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 20) - add_test(NAME agc_compared_shared_generations COMMAND agc_write_tracking_tests --compared-shared-generations) - set_tests_properties(agc_compared_shared_generations PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 20) - add_test(NAME agc_write_tracking_rewatch_import_pages COMMAND agc_write_tracking_tests --rewatch-import-pages) - set_tests_properties(agc_write_tracking_rewatch_import_pages PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 20) - set_tests_properties(agc_write_tracking agc_write_tracking_metadata_commit agc_write_tracking_cpu_write_pin agc_resident_direct_remap agc_rewatched_direct_shared agc_import_alias_shared agc_compared_shared_generations agc_write_tracking_rewatch_import_pages PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -if(BUILD_TESTING AND NOT WIN32) - add_test_executable(agc_collect_memo_generation_tests - tests/CollectMemoGeneration.cpp - Execution/src/GuestMemory.cpp - Execution/src/PerformanceTraceThread.cpp - ) - target_include_directories(agc_collect_memo_generation_tests PRIVATE ${LIBS_INCLUDE_DIR}) - target_link_libraries(agc_collect_memo_generation_tests PRIVATE shader_recompiler_agc_driver libc) - set_target_properties(agc_collect_memo_generation_tests PROPERTIES CXX_EXTENSIONS OFF) - add_test(NAME agc_collect_memo_generation COMMAND agc_collect_memo_generation_tests) - set_tests_properties(agc_collect_memo_generation PROPERTIES TIMEOUT 30) -endif() - -add_test_executable(agc_written_buffer_index_tests EXCLUDE_FROM_ALL - tests/WrittenBufferIndex.cpp - Execution/src/Driver/Memory/WrittenBufferIndex.cpp -) -target_include_directories(agc_written_buffer_index_tests PRIVATE ${LIBS_INCLUDE_DIR}) -target_link_libraries(agc_written_buffer_index_tests PRIVATE libc) -set_target_properties(agc_written_buffer_index_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_written_buffer_index_tests) -if(BUILD_TESTING) - set_target_properties(agc_written_buffer_index_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_written_buffer_index COMMAND agc_written_buffer_index_tests) - set_tests_properties(agc_written_buffer_index PROPERTIES TIMEOUT 60) - if(WIN32) - set_tests_properties(agc_written_buffer_index PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_thread_priority_tests EXCLUDE_FROM_ALL - tests/ThreadPriority.cpp - Execution/src/ThreadPriority.cpp -) -target_include_directories(agc_thread_priority_tests PRIVATE ${LIBS_INCLUDE_DIR}) -target_link_libraries(agc_thread_priority_tests PRIVATE libc ${CMAKE_DL_LIBS}) -set_target_properties(agc_thread_priority_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_thread_priority_tests) -if(BUILD_TESTING) - set_target_properties(agc_thread_priority_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_thread_priority COMMAND agc_thread_priority_tests) - if(WIN32) - set_tests_properties(agc_thread_priority PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") - foreach(mode rt high) - add_test(NAME agc_thread_priority_refused_${mode} COMMAND agc_thread_priority_tests refused) - set_tests_properties(agc_thread_priority_refused_${mode} PROPERTIES ENVIRONMENT - "APS5_THREAD_PRIORITY=${mode};DBUS_SYSTEM_BUS_ADDRESS=unix:path=/nonexistent/aps5-no-rtkit") - endforeach() - endif() -endif() - -add_test_executable(agc_structurizer_tests EXCLUDE_FROM_ALL tests/Structurizer.cpp) -target_link_libraries(agc_structurizer_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_structurizer_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_structurizer_tests) - -add_test_executable(agc_fragment_barycentric_tests EXCLUDE_FROM_ALL tests/FragmentBarycentric.cpp) -target_include_directories(agc_fragment_barycentric_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) -set_target_properties(agc_fragment_barycentric_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_fragment_barycentric_tests) -if(BUILD_TESTING) - set_target_properties(agc_fragment_barycentric_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_fragment_barycentric COMMAND agc_fragment_barycentric_tests) -endif() - -add_test_executable(agc_tessellation_pipeline_cache_tests EXCLUDE_FROM_ALL tests/TessellationPipelineCache.cpp) -target_include_directories(agc_tessellation_pipeline_cache_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) -set_target_properties(agc_tessellation_pipeline_cache_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_tessellation_pipeline_cache_tests) -if(BUILD_TESTING) - set_target_properties(agc_tessellation_pipeline_cache_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_tessellation_pipeline_cache COMMAND agc_tessellation_pipeline_cache_tests) -endif() - -add_test_executable(agc_float32_flush_control_tests EXCLUDE_FROM_ALL tests/Float32FlushControl.cpp) -target_include_directories(agc_float32_flush_control_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) -set_target_properties(agc_float32_flush_control_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_float32_flush_control_tests) -if(BUILD_TESTING) - set_target_properties(agc_float32_flush_control_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_float32_flush_control COMMAND agc_float32_flush_control_tests) -endif() - -add_test_executable(agc_pipeline_link_optimization_tests EXCLUDE_FROM_ALL tests/PipelineLinkOptimization.cpp) -target_include_directories(agc_pipeline_link_optimization_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) -set_target_properties(agc_pipeline_link_optimization_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_pipeline_link_optimization_tests) -if(BUILD_TESTING) - set_target_properties(agc_pipeline_link_optimization_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_pipeline_link_optimization COMMAND agc_pipeline_link_optimization_tests) -endif() - -add_test_executable(agc_draw_inputs_in_place_driver_tests EXCLUDE_FROM_ALL tests/DrawInputsInPlace.cpp) -target_include_directories(agc_draw_inputs_in_place_driver_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) -set_target_properties(agc_draw_inputs_in_place_driver_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_draw_inputs_in_place_driver_tests) -if(BUILD_TESTING) - set_target_properties(agc_draw_inputs_in_place_driver_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_draw_inputs_in_place_driver COMMAND agc_draw_inputs_in_place_driver_tests) -endif() - -add_test_executable(agc_subgroup_barrier_tests EXCLUDE_FROM_ALL tests/SubgroupBarrier.cpp) -target_include_directories(agc_subgroup_barrier_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) -target_link_libraries(agc_subgroup_barrier_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_subgroup_barrier_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_subgroup_barrier_tests) -if(BUILD_TESTING) - set_target_properties(agc_subgroup_barrier_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_subgroup_barrier COMMAND agc_subgroup_barrier_tests) - set_tests_properties(agc_subgroup_barrier PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1") - if(WIN32) - set_tests_properties(agc_subgroup_barrier PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_device_fault_tests EXCLUDE_FROM_ALL tests/DeviceFault.cpp) -target_include_directories(agc_device_fault_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) -set_target_properties(agc_device_fault_tests PROPERTIES CXX_EXTENSIONS OFF) -target_link_libraries(agc_device_fault_tests PRIVATE libc libkernel) -configure_windows_unwind(agc_device_fault_tests) -if(BUILD_TESTING) - set_target_properties(agc_device_fault_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_device_fault COMMAND agc_device_fault_tests) - if(WIN32) - set_tests_properties(agc_device_fault PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_subgroup_clock_tests EXCLUDE_FROM_ALL - tests/SubgroupClock.cpp - Execution/src/SubgroupClock.cpp -) -target_include_directories(agc_subgroup_clock_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) -set_target_properties(agc_subgroup_clock_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_subgroup_clock_tests) -if(BUILD_TESTING) - set_target_properties(agc_subgroup_clock_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_subgroup_clock COMMAND agc_subgroup_clock_tests) -endif() - -add_test_executable(agc_host_report_tests EXCLUDE_FROM_ALL - tests/HostReport.cpp - Execution/src/HostReport.cpp -) -target_include_directories(agc_host_report_tests PRIVATE ${LIBS_INCLUDE_DIR}) -set_target_properties(agc_host_report_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_host_report_tests) -if(BUILD_TESTING) - set_target_properties(agc_host_report_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_host_report COMMAND agc_host_report_tests) - set_tests_properties(agc_host_report PROPERTIES TIMEOUT 20) - if(MINGW) - target_link_libraries(agc_host_report_tests PRIVATE libc) - set_tests_properties(agc_host_report PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_host_report_vulkan_tests EXCLUDE_FROM_ALL - tests/HostReportVulkan.cpp - Execution/src/HostReportVulkan.cpp - Execution/src/HostReport.cpp -) -target_include_directories(agc_host_report_vulkan_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) -set_target_properties(agc_host_report_vulkan_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_host_report_vulkan_tests) -if(BUILD_TESTING) - set_target_properties(agc_host_report_vulkan_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_host_report_vulkan COMMAND agc_host_report_vulkan_tests) - set_tests_properties(agc_host_report_vulkan PROPERTIES TIMEOUT 20) - if(MINGW) - target_link_libraries(agc_host_report_vulkan_tests PRIVATE libc) - set_tests_properties(agc_host_report_vulkan PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_tessellation_factor_ring_tests EXCLUDE_FROM_ALL - tests/TessellationFactorRing.cpp - State/src/Configuration.cpp -) -target_include_directories(agc_tessellation_factor_ring_tests PRIVATE ${LIBS_INCLUDE_DIR}) -target_link_libraries(agc_tessellation_factor_ring_tests PRIVATE libc) -set_target_properties(agc_tessellation_factor_ring_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_tessellation_factor_ring_tests) -if(BUILD_TESTING) - set_target_properties(agc_tessellation_factor_ring_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_tessellation_factor_ring COMMAND agc_tessellation_factor_ring_tests) - if(WIN32) - set_tests_properties(agc_tessellation_factor_ring PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_spirv_module_tests EXCLUDE_FROM_ALL tests/SpirvModule.cpp) -target_link_libraries(agc_spirv_module_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_spirv_module_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_spirv_module_tests) - -add_test_executable(agc_spirv_narrow_constant_store_tests EXCLUDE_FROM_ALL tests/SpirvNarrowConstantStore.cpp) -target_link_libraries(agc_spirv_narrow_constant_store_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_spirv_narrow_constant_store_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_spirv_narrow_constant_store_tests) -if(ANYPS5_ENABLE_SPIRV_TOOLS) - target_link_libraries(agc_spirv_narrow_constant_store_tests PRIVATE SPIRV-Tools-static) - add_test_executable(agc_spirv13_image_tests EXCLUDE_FROM_ALL tests/Spirv13Image.cpp) - target_link_libraries(agc_spirv13_image_tests PRIVATE shader_recompiler_agc_driver libc) - set_target_properties(agc_spirv13_image_tests PROPERTIES CXX_EXTENSIONS OFF) - configure_windows_unwind(agc_spirv13_image_tests) - add_test_executable(agc_spirv_optimizer_tests EXCLUDE_FROM_ALL tests/SpirvOptimizer.cpp) - target_link_libraries(agc_spirv_optimizer_tests PRIVATE shader_recompiler_agc_driver libc SPIRV-Tools-static) - set_target_properties(agc_spirv_optimizer_tests PROPERTIES CXX_EXTENSIONS OFF) - configure_windows_unwind(agc_spirv_optimizer_tests) -endif() - -add_test_executable(agc_float16_conversion_tests EXCLUDE_FROM_ALL tests/Float16Conversion.cpp) -target_link_libraries(agc_float16_conversion_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_float16_conversion_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_float16_conversion_tests) -if(BUILD_TESTING) - set_target_properties(agc_float16_conversion_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_float16_conversion COMMAND agc_float16_conversion_tests) - set_tests_properties(agc_float16_conversion PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1") - if(WIN32) - set_tests_properties(agc_float16_conversion PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_f32_denorm_preserve_tests EXCLUDE_FROM_ALL tests/F32DenormPreserve.cpp) -target_link_libraries(agc_f32_denorm_preserve_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_f32_denorm_preserve_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_f32_denorm_preserve_tests) -if(BUILD_TESTING) - set_target_properties(agc_f32_denorm_preserve_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_f32_denorm_preserve COMMAND agc_f32_denorm_preserve_tests) - set_tests_properties(agc_f32_denorm_preserve PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1") - if(WIN32) - set_tests_properties(agc_f32_denorm_preserve PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_spirv_branch_targets_tests EXCLUDE_FROM_ALL tests/SpirvBranchTargets.cpp) -target_link_libraries(agc_spirv_branch_targets_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_spirv_branch_targets_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_spirv_branch_targets_tests) -if(BUILD_TESTING) - set_target_properties(agc_spirv_branch_targets_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_spirv_branch_targets COMMAND agc_spirv_branch_targets_tests) - set_tests_properties(agc_spirv_branch_targets PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1") - if(WIN32) - set_tests_properties(agc_spirv_branch_targets PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_spirv_failure_text_tests EXCLUDE_FROM_ALL tests/SpirvFailureText.cpp) -target_link_libraries(agc_spirv_failure_text_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_spirv_failure_text_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_spirv_failure_text_tests) -if(BUILD_TESTING) - set_target_properties(agc_spirv_failure_text_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_spirv_failure_text COMMAND agc_spirv_failure_text_tests) - set_tests_properties(agc_spirv_failure_text PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1") - if(WIN32) - set_tests_properties(agc_spirv_failure_text PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_spirv_lds_atomic_lock_tests EXCLUDE_FROM_ALL tests/SpirvLdsAtomicLock.cpp) -target_link_libraries(agc_spirv_lds_atomic_lock_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_spirv_lds_atomic_lock_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_spirv_lds_atomic_lock_tests) -if(BUILD_TESTING) - set_target_properties(agc_spirv_lds_atomic_lock_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_spirv_lds_atomic_lock COMMAND agc_spirv_lds_atomic_lock_tests) - set_tests_properties(agc_spirv_lds_atomic_lock PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1") - if(WIN32) - set_tests_properties(agc_spirv_lds_atomic_lock PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_spirv_subvector_loop_begin_tests EXCLUDE_FROM_ALL tests/SpirvSubvectorLoopBegin.cpp) -target_link_libraries(agc_spirv_subvector_loop_begin_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_spirv_subvector_loop_begin_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_spirv_subvector_loop_begin_tests) -if(BUILD_TESTING) - set_target_properties(agc_spirv_subvector_loop_begin_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_spirv_subvector_loop_begin COMMAND agc_spirv_subvector_loop_begin_tests) - set_tests_properties(agc_spirv_subvector_loop_begin PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1") - if(WIN32) - set_tests_properties(agc_spirv_subvector_loop_begin PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_layer_input_tests EXCLUDE_FROM_ALL tests/LayerInput.cpp) -target_link_libraries(agc_layer_input_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_layer_input_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_layer_input_tests) -if(BUILD_TESTING) - set_target_properties(agc_layer_input_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_layer_input COMMAND agc_layer_input_tests) - set_tests_properties(agc_layer_input PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1") - if(WIN32) - set_tests_properties(agc_layer_input PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_dpp_write_tests EXCLUDE_FROM_ALL tests/DppWrite.cpp) -target_link_libraries(agc_dpp_write_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_dpp_write_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_dpp_write_tests) - -add_test_executable(agc_masked_select_tests EXCLUDE_FROM_ALL tests/MaskedSelect.cpp) -target_link_libraries(agc_masked_select_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_masked_select_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_masked_select_tests) - -add_test_executable(agc_ir_reclaim_tests EXCLUDE_FROM_ALL tests/IrReclaim.cpp) -target_link_libraries(agc_ir_reclaim_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_ir_reclaim_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_ir_reclaim_tests) - -add_test_executable(agc_vector_window_tests EXCLUDE_FROM_ALL tests/VectorWindow.cpp) -target_link_libraries(agc_vector_window_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_vector_window_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_vector_window_tests) - -add_test_executable(agc_constant_bit_test_tests EXCLUDE_FROM_ALL tests/ConstantBitTest.cpp) -target_link_libraries(agc_constant_bit_test_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_constant_bit_test_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_constant_bit_test_tests) - -add_test_executable(agc_integer_narrowing_tests EXCLUDE_FROM_ALL tests/IntegerNarrowing.cpp) -target_link_libraries(agc_integer_narrowing_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_integer_narrowing_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_integer_narrowing_tests) - -add_test_executable(agc_scalar_select_mask_tests EXCLUDE_FROM_ALL tests/ScalarSelectMask.cpp) -target_link_libraries(agc_scalar_select_mask_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_scalar_select_mask_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_scalar_select_mask_tests) - -add_test_executable(agc_tessellation_lowering_tests EXCLUDE_FROM_ALL tests/TessellationLowering.cpp) -target_link_libraries(agc_tessellation_lowering_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_tessellation_lowering_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_tessellation_lowering_tests) -if(BUILD_TESTING) - set_target_properties(agc_tessellation_lowering_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_tessellation_lowering COMMAND agc_tessellation_lowering_tests) - if(WIN32) - set_tests_properties(agc_tessellation_lowering PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_wave_control_decode_tests EXCLUDE_FROM_ALL tests/WaveControlDecode.cpp) -target_include_directories(agc_wave_control_decode_tests PRIVATE ${LIBS_INCLUDE_DIR}) -target_link_libraries(agc_wave_control_decode_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_wave_control_decode_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_wave_control_decode_tests) -if(BUILD_TESTING) - set_target_properties(agc_wave_control_decode_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_wave_control_decode COMMAND agc_wave_control_decode_tests) - if(WIN32) - set_tests_properties(agc_wave_control_decode PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_denormal_flush_elimination_tests EXCLUDE_FROM_ALL tests/DenormalFlushElimination.cpp) -target_link_libraries(agc_denormal_flush_elimination_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_denormal_flush_elimination_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_denormal_flush_elimination_tests) -if(BUILD_TESTING) - set_target_properties(agc_denormal_flush_elimination_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_denormal_flush_elimination COMMAND agc_denormal_flush_elimination_tests) - if(WIN32) - set_tests_properties(agc_denormal_flush_elimination PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_redundant_value_elimination_tests EXCLUDE_FROM_ALL tests/RedundantValueElimination.cpp) -target_link_libraries(agc_redundant_value_elimination_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_redundant_value_elimination_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_redundant_value_elimination_tests) -if(BUILD_TESTING) - set_target_properties(agc_redundant_value_elimination_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_redundant_value_elimination COMMAND agc_redundant_value_elimination_tests) - if(WIN32) - set_tests_properties(agc_redundant_value_elimination PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_integer_folding_tests EXCLUDE_FROM_ALL tests/IntegerFolding.cpp) -target_link_libraries(agc_integer_folding_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_integer_folding_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_integer_folding_tests) -if(BUILD_TESTING) - set_target_properties(agc_integer_folding_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_integer_folding COMMAND agc_integer_folding_tests) - if(WIN32) - set_tests_properties(agc_integer_folding PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_vop1_control_decode_tests EXCLUDE_FROM_ALL tests/Vop1ControlDecode.cpp) -target_link_libraries(agc_vop1_control_decode_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_vop1_control_decode_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_vop1_control_decode_tests) -add_test_executable(agc_vertex_input_validation_tests EXCLUDE_FROM_ALL tests/VertexInputValidation.cpp) -target_link_libraries(agc_vertex_input_validation_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_vertex_input_validation_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_vertex_input_validation_tests) -add_test_executable(agc_vop2_encoding_decode_tests EXCLUDE_FROM_ALL tests/Vop2EncodingDecode.cpp) -target_link_libraries(agc_vop2_encoding_decode_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_vop2_encoding_decode_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_vop2_encoding_decode_tests) -if(BUILD_TESTING) - set_target_properties(agc_vop2_encoding_decode_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_vop2_encoding_decode COMMAND agc_vop2_encoding_decode_tests) - if(WIN32) - set_tests_properties(agc_vop2_encoding_decode PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_vop3_interp_decode_tests EXCLUDE_FROM_ALL tests/Vop3InterpDecode.cpp) -target_link_libraries(agc_vop3_interp_decode_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_vop3_interp_decode_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_vop3_interp_decode_tests) -if(BUILD_TESTING) - set_target_properties(agc_vop3_interp_decode_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_vop3_interp_decode COMMAND agc_vop3_interp_decode_tests) - if(WIN32) - set_tests_properties(agc_vop3_interp_decode PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_pipeline_queue_failure_tests EXCLUDE_FROM_ALL tests/PipelineQueueFailure.cpp - Graphics/src/PipelineLibrary.cpp tests/AllocationFailure.cpp) -target_include_directories(agc_pipeline_queue_failure_tests PRIVATE ${LIBS_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/core/shader/recompiler ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) -target_link_libraries(agc_pipeline_queue_failure_tests PRIVATE libSceAgcDriver libc) -set_target_properties(agc_pipeline_queue_failure_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_pipeline_queue_failure_tests) -if(BUILD_TESTING) - set_target_properties(agc_pipeline_queue_failure_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - foreach(mode wait clear stop) - add_test(NAME agc_pipeline_queue_failure_${mode} COMMAND agc_pipeline_queue_failure_tests ${mode}) - set_tests_properties(agc_pipeline_queue_failure_${mode} PROPERTIES TIMEOUT 15) - if(WIN32) - set_tests_properties(agc_pipeline_queue_failure_${mode} PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - endforeach() -endif() - -add_test_executable(agc_pass_hazards_tests EXCLUDE_FROM_ALL tests/PassHazards.cpp Graphics/src/PassHazards.cpp) -target_include_directories(agc_pass_hazards_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) -target_link_libraries(agc_pass_hazards_tests PRIVATE libc) -set_target_properties(agc_pass_hazards_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_pass_hazards_tests) - -add_test_executable(agc_barrier_batch_tests EXCLUDE_FROM_ALL tests/BarrierBatch.cpp Graphics/src/BarrierBatch.cpp) -target_include_directories(agc_barrier_batch_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) -target_link_libraries(agc_barrier_batch_tests PRIVATE libc) -set_target_properties(agc_barrier_batch_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_barrier_batch_tests) - -add_test_executable(agc_dcc_key_sharing_tests EXCLUDE_FROM_ALL tests/DccKeySharing.cpp) -target_include_directories(agc_dcc_key_sharing_tests PRIVATE ${LIBS_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/core/shader/recompiler ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) -target_link_libraries(agc_dcc_key_sharing_tests PRIVATE libc) -set_target_properties(agc_dcc_key_sharing_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_dcc_key_sharing_tests) -if(BUILD_TESTING) - set_target_properties(agc_dcc_key_sharing_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_dcc_key_sharing COMMAND agc_dcc_key_sharing_tests) - if(WIN32) - set_tests_properties(agc_dcc_key_sharing PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_buffer_pool_tests EXCLUDE_FROM_ALL tests/BufferPool.cpp) - -if(BUILD_TESTING) - add_test_executable(agc_snapshot_copy_failure_tests tests/SnapshotCopyFailure.cpp tests/AllocationFailure.cpp) - target_include_directories(agc_snapshot_copy_failure_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) - if(MINGW) - target_compile_options(agc_snapshot_copy_failure_tests PRIVATE -fasynchronous-unwind-tables) - endif() - configure_windows_unwind(agc_snapshot_copy_failure_tests) - add_test(NAME agc_snapshot_copy_failure COMMAND agc_snapshot_copy_failure_tests) - set_tests_properties(agc_snapshot_copy_failure PROPERTIES TIMEOUT 10) -endif() -target_sources(agc_buffer_pool_tests PRIVATE Graphics/src/BufferPool.cpp tests/AllocationFailure.cpp) -target_include_directories(agc_buffer_pool_tests PRIVATE ${LIBS_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/core/shader/recompiler ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) -target_link_libraries(agc_buffer_pool_tests PRIVATE libSceAgcDriver libc) -set_target_properties(agc_buffer_pool_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_buffer_pool_tests) -if(BUILD_TESTING) - set_target_properties(agc_buffer_pool_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_buffer_pool COMMAND agc_buffer_pool_tests) - add_test(NAME agc_buffer_pool_small_device_shared COMMAND agc_buffer_pool_tests --small-device-retention) - set_tests_properties(agc_buffer_pool_small_device_shared PROPERTIES ENVIRONMENT - "APS5_STAGING_POOL_MIB=256;APS5_BUFFER_POOL_SHARED=1") - add_test(NAME agc_buffer_pool_small_device_no_staging COMMAND agc_buffer_pool_tests --small-device-retention) - set_tests_properties(agc_buffer_pool_small_device_no_staging PROPERTIES ENVIRONMENT - "APS5_STAGING_POOL_MIB=0") - if(WIN32) - set_tests_properties(agc_buffer_pool agc_buffer_pool_small_device_shared agc_buffer_pool_small_device_no_staging PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_deferred_destruction_tests EXCLUDE_FROM_ALL tests/DeferredDestruction.cpp) -target_include_directories(agc_deferred_destruction_tests PRIVATE ${LIBS_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/core/shader/recompiler ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) -target_link_libraries(agc_deferred_destruction_tests PRIVATE libSceAgcDriver libc) -set_target_properties(agc_deferred_destruction_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_deferred_destruction_tests) -if(BUILD_TESTING) - set_target_properties(agc_deferred_destruction_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_deferred_destruction COMMAND agc_deferred_destruction_tests) - if(WIN32) - set_tests_properties(agc_deferred_destruction PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_device_memory_fallback_tests EXCLUDE_FROM_ALL tests/DeviceMemoryFallback.cpp) -target_include_directories(agc_device_memory_fallback_tests PRIVATE ${LIBS_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/core/shader/recompiler ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) -target_link_libraries(agc_device_memory_fallback_tests PRIVATE libSceAgcDriver libc) -set_target_properties(agc_device_memory_fallback_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_device_memory_fallback_tests) -if(BUILD_TESTING) - set_target_properties(agc_device_memory_fallback_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_device_memory_fallback COMMAND agc_device_memory_fallback_tests) - if(WIN32) - set_tests_properties(agc_device_memory_fallback PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_display_buffer_dcc_tests EXCLUDE_FROM_ALL tests/DisplayBufferDcc.cpp) -target_include_directories(agc_display_buffer_dcc_tests PRIVATE ${LIBS_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/core/shader/recompiler ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) -target_link_libraries(agc_display_buffer_dcc_tests PRIVATE libSceAgcDriver libc) -set_target_properties(agc_display_buffer_dcc_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_display_buffer_dcc_tests) -if(BUILD_TESTING) - set_target_properties(agc_display_buffer_dcc_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_display_buffer_dcc COMMAND agc_display_buffer_dcc_tests) - if(WIN32) - set_tests_properties(agc_display_buffer_dcc PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_host_hdr_tests EXCLUDE_FROM_ALL tests/HostHdr.cpp) -target_include_directories(agc_host_hdr_tests PRIVATE ${LIBS_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/core/shader/recompiler ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) -target_link_libraries(agc_host_hdr_tests PRIVATE libSceAgcDriver libc) -set_target_properties(agc_host_hdr_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_host_hdr_tests) -if(BUILD_TESTING) - set_target_properties(agc_host_hdr_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_host_hdr COMMAND agc_host_hdr_tests) - if(WIN32) - set_tests_properties(agc_host_hdr PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_validate_program_tests EXCLUDE_FROM_ALL tests/ValidateProgram.cpp) -target_link_libraries(agc_validate_program_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_validate_program_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_validate_program_tests) - -add_test_executable(agc_formatted_buffer_once_tests EXCLUDE_FROM_ALL tests/FormattedBufferOnce.cpp) -target_link_libraries(agc_formatted_buffer_once_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_formatted_buffer_once_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_formatted_buffer_once_tests) - -add_test_executable(agc_fma_mix_once_tests EXCLUDE_FROM_ALL tests/FmaMixOnce.cpp) -target_link_libraries(agc_fma_mix_once_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_fma_mix_once_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_fma_mix_once_tests) - -add_test_executable(agc_f16_single_convert_tests EXCLUDE_FROM_ALL tests/F16SingleConvert.cpp) -target_link_libraries(agc_f16_single_convert_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_f16_single_convert_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_f16_single_convert_tests) - -add_test_executable(agc_rect_list_position_invariant_tests EXCLUDE_FROM_ALL tests/RectListPositionInvariant.cpp) -target_link_libraries(agc_rect_list_position_invariant_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_rect_list_position_invariant_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_rect_list_position_invariant_tests) -if(BUILD_TESTING) - set_target_properties(agc_rect_list_position_invariant_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_rect_list_position_invariant COMMAND agc_rect_list_position_invariant_tests) - if(WIN32) - set_tests_properties(agc_rect_list_position_invariant PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_formatted_buffer_byte_stores_tests EXCLUDE_FROM_ALL tests/FormattedBufferByteStores.cpp) -target_link_libraries(agc_formatted_buffer_byte_stores_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_formatted_buffer_byte_stores_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_formatted_buffer_byte_stores_tests) - -add_test_executable(agc_mesh_output_budget_tests EXCLUDE_FROM_ALL tests/MeshOutputBudget.cpp) -target_include_directories(agc_mesh_output_budget_tests PRIVATE ${LIBS_INCLUDE_DIR}) -target_link_libraries(agc_mesh_output_budget_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_mesh_output_budget_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_mesh_output_budget_tests) - -add_test_executable(agc_shader_disk_cache_tests EXCLUDE_FROM_ALL tests/ShaderDiskCache.cpp) -target_include_directories(agc_shader_disk_cache_tests PRIVATE ${LIBS_INCLUDE_DIR}) -target_link_libraries(agc_shader_disk_cache_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_shader_disk_cache_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_shader_disk_cache_tests) - -add_test_executable(agc_placeholder_images_tests EXCLUDE_FROM_ALL tests/PlaceholderImages.cpp) -target_include_directories(agc_placeholder_images_tests PRIVATE ${LIBS_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/3rdparty/Vulkan-Headers/include) -target_link_libraries(agc_placeholder_images_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_placeholder_images_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_placeholder_images_tests) - -add_test_executable(agc_screenshot_tests EXCLUDE_FROM_ALL tests/Screenshot.cpp Execution/src/Screenshot.cpp) -target_include_directories(agc_screenshot_tests PRIVATE ${LIBS_INCLUDE_DIR}) -target_link_libraries(agc_screenshot_tests PRIVATE decoder_png SDL2-static libc) -set_target_properties(agc_screenshot_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_screenshot_tests) - -add_test_executable(agc_shader_device_profile_tests EXCLUDE_FROM_ALL tests/ShaderDeviceProfile.cpp Execution/src/ShaderDeviceProfile.cpp) -target_include_directories(agc_shader_device_profile_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) -target_link_libraries(agc_shader_device_profile_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_shader_device_profile_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_shader_device_profile_tests) - -add_test_executable(agc_shader_control_flow_tests EXCLUDE_FROM_ALL - tests/ControlFlow.cpp -) -target_include_directories(agc_shader_control_flow_tests PRIVATE ${LIBS_INCLUDE_DIR}) -target_link_libraries(agc_shader_control_flow_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_shader_control_flow_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_shader_control_flow_tests) - -add_test_executable(agc_shader_mode_register_tests EXCLUDE_FROM_ALL tests/ShaderModeRegisters.cpp) -target_include_directories(agc_shader_mode_register_tests PRIVATE ${LIBS_INCLUDE_DIR}) -target_link_libraries(agc_shader_mode_register_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_shader_mode_register_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_shader_mode_register_tests) - -add_test_executable(agc_driver_flip_tests EXCLUDE_FROM_ALL - tests/Flip.cpp -) - -target_include_directories(agc_driver_flip_tests PRIVATE - ${LIBS_INCLUDE_DIR} - ${CMAKE_SOURCE_DIR}/3rdparty/Vulkan-Headers/include -) - -target_link_libraries(agc_driver_flip_tests PRIVATE - libSceAgcDriver - libc -) - -set_target_properties(agc_driver_flip_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_driver_flip_tests) - set(agcSampleLodShaderSource ${CMAKE_CURRENT_SOURCE_DIR}/tests/shaders/SampleLod.comp) set(agcTestShaderGeneratedRoot ${CMAKE_CURRENT_BINARY_DIR}/generated-tests) set(agcSampleLodShaderSpv ${agcTestShaderGeneratedRoot}/SampleLod.spv) @@ -1630,27 +512,6 @@ foreach(agcCoverStage IN ITEMS vert frag) list(APPEND agcCoverShaderHeaders ${agcCoverShaderHeader}) endforeach() -add_test_executable(agc_driver_cmask_fast_clear_tests EXCLUDE_FROM_ALL - tests/CmaskFastClear.cpp - ${agcCoverShaderHeaders} -) - -target_include_directories(agc_driver_cmask_fast_clear_tests PRIVATE - ${LIBS_INCLUDE_DIR} - ${agcTestShaderGeneratedRoot} - ${CMAKE_SOURCE_DIR}/core/shader/recompiler - ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR} -) - -target_link_libraries(agc_driver_cmask_fast_clear_tests PRIVATE - libSceAgcDriver - SDL2-static - libc -) - -set_target_properties(agc_driver_cmask_fast_clear_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_driver_cmask_fast_clear_tests) - set(agcBufferUpdateSource ${CMAKE_CURRENT_SOURCE_DIR}/tests/shaders/BufferUpdate.comp) set(agcBufferUpdateSpv ${agcTestShaderGeneratedRoot}/BufferUpdate.spv) set(agcBufferUpdateHeader ${agcTestShaderGeneratedRoot}/BufferUpdate_spv.h) @@ -1664,693 +525,6 @@ add_custom_command( VERBATIM ) -add_test_executable(agc_pipeline_cache_allocation_tests EXCLUDE_FROM_ALL tests/PipelineCacheFailures.cpp - Graphics/src/PipelineCache.cpp tests/AllocationFailure.cpp) -target_include_directories(agc_pipeline_cache_allocation_tests PRIVATE ${LIBS_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/core/shader/recompiler ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) -target_link_libraries(agc_pipeline_cache_allocation_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_pipeline_cache_allocation_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_pipeline_cache_allocation_tests) -if(BUILD_TESTING) - set_target_properties(agc_pipeline_cache_allocation_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - foreach(mode startup now busy destructor worker) - add_test(NAME agc_pipeline_cache_allocation_${mode} COMMAND agc_pipeline_cache_allocation_tests ${mode}) - set_tests_properties(agc_pipeline_cache_allocation_${mode} PROPERTIES TIMEOUT 25) - if(WIN32) - set_tests_properties(agc_pipeline_cache_allocation_${mode} PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - endforeach() - if(WIN32) - add_test(NAME agc_pipeline_cache_read_retry COMMAND agc_pipeline_cache_allocation_tests read-retry) - set_tests_properties(agc_pipeline_cache_read_retry PROPERTIES TIMEOUT 25 ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_driver_recorder_tests EXCLUDE_FROM_ALL - tests/Recorder.cpp - tests/HostImportLifetime.cpp - tests/ResidentPresent.cpp - ${agcTriangleHeaders} - ${agcSampleLodShaderHeader} - ${agcSampleArrayShaderHeader} - ${agcCoverShaderHeaders} - ${agcBufferUpdateHeader} -) - -target_include_directories(agc_driver_recorder_tests PRIVATE - ${LIBS_INCLUDE_DIR} - ${agcTestShaderGeneratedRoot} - ${CMAKE_SOURCE_DIR}/core/shader/recompiler - ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR} -) - -target_link_libraries(agc_driver_recorder_tests PRIVATE - libSceAgc - libkernel - libSceAgcDriver - SDL2-static - libc -) - -set_target_properties(agc_driver_recorder_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_driver_recorder_tests) -if(BUILD_TESTING) - set_target_properties(agc_driver_recorder_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_recorder_device_selection COMMAND agc_driver_recorder_tests --device-selection-only) - add_test(NAME agc_gpu_timing_key COMMAND agc_driver_recorder_tests --gpu-timing-key-only) - add_test(NAME agc_gpu_timing_complete COMMAND agc_driver_recorder_tests --gpu-timing-complete-only) - add_test(NAME agc_gpu_timing_incomplete COMMAND agc_driver_recorder_tests --gpu-timing-incomplete-only) - set_tests_properties(agc_gpu_timing_complete agc_gpu_timing_incomplete PROPERTIES - ENVIRONMENT "APS5_PROFILE_GPU=1" TIMEOUT 15 SKIP_RETURN_CODE 77) - if(WIN32) - set_tests_properties(agc_recorder_device_selection agc_gpu_timing_key agc_gpu_timing_complete agc_gpu_timing_incomplete PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_command_memory_reuse COMMAND agc_driver_recorder_tests --command-reuse-only) - set_tests_properties(agc_command_memory_reuse PROPERTIES SKIP_RETURN_CODE 77) - if(WIN32) - set_tests_properties(agc_command_memory_reuse PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_pipeline_cache COMMAND agc_driver_recorder_tests --pipeline-cache-only) - add_test(NAME agc_pipeline_cache_file COMMAND agc_driver_recorder_tests --pipeline-cache-file-only) - add_test(NAME agc_pipeline_cache_header COMMAND agc_driver_recorder_tests --pipeline-cache-header-only) - set_tests_properties(agc_pipeline_cache_header PROPERTIES TIMEOUT 30 SKIP_RETURN_CODE 77) - if(WIN32) - set_tests_properties(agc_pipeline_cache_header PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_pipeline_library COMMAND agc_driver_recorder_tests --pipeline-library-only) - add_test(NAME agc_pipeline_library_off COMMAND agc_driver_recorder_tests --pipeline-library-only) - set_tests_properties(agc_pipeline_library agc_pipeline_library_off PROPERTIES SKIP_RETURN_CODE 77) - set_tests_properties(agc_pipeline_library_off PROPERTIES ENVIRONMENT "APS5_NO_GPL=1") - add_test(NAME agc_pipeline_library_fast_only COMMAND agc_driver_recorder_tests --pipeline-library-only) - set_tests_properties(agc_pipeline_library_fast_only PROPERTIES ENVIRONMENT "APS5_NO_PIPELINE_LTO=1" SKIP_RETURN_CODE 77) - add_test(NAME agc_pipeline_library_lto_info COMMAND agc_driver_recorder_tests --pipeline-library-lto-info-only) - add_test(NAME agc_pipeline_library_lto_info_fast_only COMMAND agc_driver_recorder_tests --pipeline-library-lto-info-only) - set_tests_properties(agc_pipeline_library_lto_info agc_pipeline_library_lto_info_fast_only PROPERTIES SKIP_RETURN_CODE 77) - set_tests_properties(agc_pipeline_library_lto_info_fast_only PROPERTIES ENVIRONMENT "APS5_NO_PIPELINE_LTO=1") - if(WIN32) - set_tests_properties(agc_pipeline_library agc_pipeline_library_off agc_pipeline_library_fast_only agc_pipeline_library_lto_info agc_pipeline_library_lto_info_fast_only PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - set_tests_properties(agc_pipeline_cache agc_pipeline_cache_file PROPERTIES SKIP_RETURN_CODE 77) - if(WIN32) - set_tests_properties(agc_pipeline_cache agc_pipeline_cache_file PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_import_watch COMMAND agc_driver_recorder_tests --import-watch-only) - set_tests_properties(agc_import_watch PROPERTIES SKIP_RETURN_CODE 77) - add_test(NAME agc_import_settle_initial_dcc COMMAND agc_driver_recorder_tests --settle-initial-dcc-only) - set_tests_properties(agc_import_settle_initial_dcc PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) - if(WIN32) - add_test(NAME agc_import_watch_other_family COMMAND agc_driver_recorder_tests --import-watch-other-family-only) - set_tests_properties(agc_import_watch_other_family PROPERTIES SKIP_RETURN_CODE 77) - add_test(NAME agc_import_settle_deferred COMMAND agc_driver_recorder_tests --deferred-settle-only) - add_test(NAME agc_import_settle_deferred_other_family COMMAND agc_driver_recorder_tests --deferred-settle-other-family-only) - add_test(NAME agc_import_settle_write_order COMMAND agc_driver_recorder_tests --settle-write-order-only) - add_test(NAME agc_import_settle_write_order_other_family COMMAND agc_driver_recorder_tests --settle-write-order-other-family-only) - add_test(NAME agc_import_settle_wait_failure COMMAND agc_driver_recorder_tests --settle-wait-failure-only) - set_tests_properties(agc_import_settle_write_order agc_import_settle_write_order_other_family agc_import_settle_wait_failure PROPERTIES - SKIP_RETURN_CODE 77 TIMEOUT 30 - FAIL_REGULAR_EXPRESSION "SYNC-HAZARD-|VUID-" - ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - add_test(NAME agc_import_settle_first_use COMMAND agc_driver_recorder_tests --settle-first-use-only) - add_test(NAME agc_import_settle_earlier_import COMMAND agc_driver_recorder_tests --settle-earlier-import-only) - add_test(NAME agc_import_settle_retire COMMAND agc_driver_recorder_tests --settle-retire-only) - add_test(NAME agc_import_settle_storage_image COMMAND agc_driver_recorder_tests --settle-storage-image-only) - set_tests_properties(agc_import_settle_deferred agc_import_settle_deferred_other_family agc_import_settle_first_use agc_import_settle_earlier_import agc_import_settle_retire agc_import_settle_storage_image PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 60) - set_tests_properties(agc_import_watch agc_import_watch_other_family agc_import_settle_deferred agc_import_settle_deferred_other_family agc_import_settle_first_use agc_import_settle_earlier_import agc_import_settle_retire agc_import_settle_storage_image agc_import_settle_initial_dcc PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - if(WIN32) - add_test(NAME agc_reimport_bench COMMAND agc_driver_recorder_tests --reimport-bench) - add_test(NAME agc_host_import_cut_lifetime COMMAND agc_driver_recorder_tests --host-import-cut-only) - set_tests_properties(agc_reimport_bench agc_host_import_cut_lifetime PROPERTIES SKIP_RETURN_CODE 77) - set_tests_properties(agc_reimport_bench agc_host_import_cut_lifetime PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_unchanged_cpu_stamps COMMAND agc_driver_recorder_tests --unchanged-cpu-stamps-only) - set_tests_properties(agc_unchanged_cpu_stamps PROPERTIES SKIP_RETURN_CODE 77) - if(WIN32) - set_tests_properties(agc_unchanged_cpu_stamps PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - foreach(mode IN ITEMS map ring shared uncached) - add_test(NAME agc_collect_mapping_history_${mode} COMMAND agc_driver_recorder_tests --collect-mapping-history-only) - set_tests_properties(agc_collect_mapping_history_${mode} PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_collect_mapping_history_${mode} PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - endforeach() - set_tests_properties(agc_collect_mapping_history_ring PROPERTIES ENVIRONMENT "APS5_NO_EPOCH_COLLECT_MAP=1") - set_tests_properties(agc_collect_mapping_history_shared PROPERTIES ENVIRONMENT "APS5_SHARED_COLLECT_MEMO=1") - set_tests_properties(agc_collect_mapping_history_uncached PROPERTIES ENVIRONMENT "APS5_NO_COLLECT_MEMO=1") - if(WIN32) - foreach(mode IN ITEMS cached uncached) - add_test(NAME agc_hint_mapping_history_${mode} COMMAND agc_driver_recorder_tests --hint-mapping-history-only) - set_tests_properties(agc_hint_mapping_history_${mode} PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30 - ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endforeach() - set_tests_properties(agc_hint_mapping_history_uncached PROPERTIES ENVIRONMENT "APS5_NO_COLLECT_MEMO=1") - foreach(mode IN ITEMS cached uncached) - add_test(NAME agc_hint_partial_block_store_${mode} COMMAND agc_driver_recorder_tests --hint-partial-block-store-only) - set_tests_properties(agc_hint_partial_block_store_${mode} PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30 - ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endforeach() - set_tests_properties(agc_hint_partial_block_store_uncached PROPERTIES ENVIRONMENT "APS5_NO_COLLECT_MEMO=1") - foreach(mode IN ITEMS cached uncached) - add_test(NAME agc_shared_block_rewatch_${mode} COMMAND agc_driver_recorder_tests --shared-block-rewatch-only) - set_tests_properties(agc_shared_block_rewatch_${mode} PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30 - ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endforeach() - set_tests_properties(agc_shared_block_rewatch_uncached PROPERTIES ENVIRONMENT "APS5_NO_COLLECT_MEMO=1") - foreach(kind IN ITEMS complete possible) - add_test(NAME agc_interior_watched_driver_write_${kind} COMMAND agc_driver_recorder_tests --interior-watched-driver-write-only ${kind}) - set_tests_properties(agc_interior_watched_driver_write_${kind} PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30 - ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endforeach() - endif() - if(WIN32) - add_test(NAME agc_partial_watch_restoration COMMAND agc_driver_recorder_tests --partial-watch-restoration-only) - set_tests_properties(agc_partial_watch_restoration PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30 ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_storage_kept_unit_settle COMMAND agc_driver_recorder_tests --kept-unit-settle-only) - add_test(NAME agc_storage_idle_writeback_race COMMAND agc_driver_recorder_tests --idle-writeback-race-only) - set_tests_properties(agc_storage_idle_writeback_race PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 60) - set_tests_properties(agc_storage_kept_unit_settle PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_storage_idle_writeback_race agc_storage_kept_unit_settle PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_storage_baseline_settled COMMAND agc_driver_recorder_tests --settled-baseline-only) - add_test(NAME agc_storage_clear_hand_over COMMAND agc_driver_recorder_tests --clear-hand-over-only) - set_tests_properties(agc_storage_clear_hand_over PROPERTIES SKIP_RETURN_CODE 77) - if(WIN32) - set_tests_properties(agc_storage_clear_hand_over PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_storage_typed_fill_clear COMMAND agc_driver_recorder_tests --typed-fill-clear-only) - set_tests_properties(agc_storage_typed_fill_clear PROPERTIES ENVIRONMENT "APS5_NO_PIPELINE_JOURNAL=1" SKIP_RETURN_CODE 77) - add_test(NAME agc_storage_integer_clear COMMAND agc_driver_recorder_tests --integer-clear-only) - set_tests_properties(agc_storage_integer_clear PROPERTIES SKIP_RETURN_CODE 77) - if(WIN32) - set_tests_properties(agc_storage_typed_fill_clear agc_storage_integer_clear PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_storage_upload_lifetime COMMAND agc_driver_recorder_tests --storage-upload-lifetime-only) - add_test(NAME agc_sampled_storage_base_level_usage COMMAND agc_driver_recorder_tests --sampled-storage-base-level-usage-only) - set_tests_properties(agc_sampled_storage_base_level_usage PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_sampled_storage_base_level_usage PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_storage_upload_failure COMMAND agc_driver_recorder_tests --storage-upload-failure-only) - set_tests_properties(agc_storage_upload_lifetime agc_storage_upload_failure PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_storage_upload_lifetime agc_storage_upload_failure PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - set_tests_properties(agc_storage_baseline_settled PROPERTIES SKIP_RETURN_CODE 77) - if(WIN32) - set_tests_properties(agc_storage_baseline_settled PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_bda_staging COMMAND agc_driver_recorder_tests --bda-staging-only) - set_tests_properties(agc_bda_staging PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_bda_staging PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_read_written_staging COMMAND agc_driver_recorder_tests --read-written-staging-only) - set_tests_properties(agc_read_written_staging PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_read_written_staging PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_storage_written_buffer_order COMMAND agc_driver_recorder_tests --written-buffer-order-only) - set_tests_properties(agc_storage_written_buffer_order PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_storage_written_buffer_order PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_storage_split_writeback COMMAND agc_driver_recorder_tests --split-writeback-only) - set_tests_properties(agc_storage_split_writeback PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30 ENVIRONMENT "APS5_PIN_WAIT_MS=3000") - if(WIN32) - set_tests_properties(agc_storage_split_writeback PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_storage_write_back COMMAND agc_driver_recorder_tests --storage-write-back-only) - set_tests_properties(agc_storage_write_back PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 120 ENVIRONMENT "APS5_PIN_WAIT_MS=3000") - if(WIN32) - set_tests_properties(agc_storage_write_back PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_copied_direct_ordering COMMAND agc_driver_recorder_tests --copied-direct-only) - set_tests_properties(agc_copied_direct_ordering PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_copied_direct_ordering PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_storage_writeback_blocks COMMAND agc_driver_recorder_tests --writeback-blocks-only) - set_tests_properties(agc_storage_writeback_blocks PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30 ENVIRONMENT "APS5_PIN_WAIT_MS=3000") - if(WIN32) - set_tests_properties(agc_storage_writeback_blocks PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_recorder_read_list COMMAND agc_driver_recorder_tests --read-list-only) - set_tests_properties(agc_recorder_read_list PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) - add_test(NAME agc_recorder_deferred_failure_report COMMAND agc_driver_recorder_tests --deferred-failure-report-only) - set_tests_properties(agc_recorder_deferred_failure_report PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_recorder_deferred_failure_report PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_space_pending_writes COMMAND agc_driver_recorder_tests --space-pending-writes-only) - set_tests_properties(agc_space_pending_writes PROPERTIES SKIP_RETURN_CODE 77) - if(WIN32) - set_tests_properties(agc_space_pending_writes PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_host_import_unmap COMMAND agc_driver_recorder_tests --host-import-unmap-only) - set_tests_properties(agc_host_import_unmap PROPERTIES SKIP_RETURN_CODE 77) - add_test(NAME agc_parked_import_unmap COMMAND agc_driver_recorder_tests --parked-import-unmap-only) - set_tests_properties(agc_parked_import_unmap PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30 ENVIRONMENT "APS5_PIN_WAIT_MS=3000") - add_test(NAME agc_host_import_retirement COMMAND agc_driver_recorder_tests --host-import-retirement-only) - set_tests_properties(agc_host_import_retirement PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) - add_test(NAME agc_sparse_run_import COMMAND agc_driver_recorder_tests --sparse-run-import-only) - set_tests_properties(agc_sparse_run_import PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) - add_test(NAME agc_windowed_import_refresh COMMAND agc_driver_recorder_tests --windowed-import-refresh-only) - set_tests_properties(agc_windowed_import_refresh PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_windowed_import_refresh PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_sparse_run_import_copied COMMAND agc_driver_recorder_tests --sparse-run-copied-only) - set_tests_properties(agc_sparse_run_import_copied PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) - add_test(NAME agc_unit_shadow COMMAND agc_driver_recorder_tests --unit-shadow-only) - set_tests_properties(agc_unit_shadow PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30 ENVIRONMENT "APS5_PIN_WAIT_MS=3000") - add_test(NAME agc_idle_publish_wait COMMAND agc_driver_recorder_tests --idle-publish-wait-only) - set_tests_properties(agc_idle_publish_wait PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30 ENVIRONMENT "APS5_PIN_WAIT_MS=3000;APS5_WRITE_WATCH_IMPORTS=watch") - add_test(NAME agc_driver_bda_reads_shadowed_results COMMAND agc_driver_recorder_tests --bda-shadowed-results-only) - add_test(NAME agc_driver_bda_reads_shadowed_results_per_build COMMAND agc_driver_recorder_tests --bda-shadowed-results-only) - set_tests_properties(agc_driver_bda_reads_shadowed_results agc_driver_bda_reads_shadowed_results_per_build PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) - set_tests_properties(agc_driver_bda_reads_shadowed_results_per_build PROPERTIES ENVIRONMENT "APS5_NO_ADDRESS_SPACE_CACHE=1") - if(WIN32) - set_tests_properties(agc_driver_bda_reads_shadowed_results agc_driver_bda_reads_shadowed_results_per_build PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_unit_shadow_completion_store COMMAND agc_driver_recorder_tests --completion-store-shadow-only) - set_tests_properties(agc_unit_shadow_completion_store PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_unit_shadow_completion_store PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_recorder COMMAND agc_driver_recorder_tests) - set_tests_properties(agc_driver_recorder PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) - if(WIN32) - add_test(NAME agc_storage_cpu_snapshot COMMAND agc_driver_recorder_tests --storage-cpu-snapshot-only) - set_tests_properties(agc_storage_cpu_snapshot PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" TIMEOUT 30 SKIP_RETURN_CODE 77 - ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_recorder_command_buffer_release COMMAND agc_driver_recorder_tests --command-buffer-release-only) - set_tests_properties(agc_recorder_command_buffer_release PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) - add_test(NAME agc_descriptor_pool_recycling COMMAND agc_driver_recorder_tests --descriptor-pool-only) - set_tests_properties(agc_descriptor_pool_recycling PROPERTIES SKIP_RETURN_CODE 77) - add_test(NAME agc_draw_snapshot_cap COMMAND agc_driver_recorder_tests --draw-snapshot-cap-only) - set_tests_properties(agc_draw_snapshot_cap PROPERTIES SKIP_RETURN_CODE 77) - add_test(NAME agc_draw_snapshot_epoch COMMAND agc_driver_recorder_tests --draw-snapshot-epoch-only) - set_tests_properties(agc_draw_snapshot_epoch PROPERTIES SKIP_RETURN_CODE 77) - add_test(NAME agc_multisample_guest_access COMMAND agc_driver_recorder_tests --multisample-only) - set_tests_properties(agc_multisample_guest_access PROPERTIES SKIP_RETURN_CODE 77) - add_test(NAME agc_repeat_storage_guard COMMAND agc_driver_recorder_tests --repeat-storage-guard-only) - set_tests_properties(agc_repeat_storage_guard PROPERTIES SKIP_RETURN_CODE 77) - add_test(NAME agc_draw_inputs_in_place COMMAND agc_driver_recorder_tests --draw-inputs-in-place-only) - add_test(NAME agc_pending_write_snapshot COMMAND agc_driver_recorder_tests --pending-write-snapshot-only) - set_tests_properties(agc_pending_write_snapshot PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_pending_write_snapshot PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - set_tests_properties(agc_draw_inputs_in_place PROPERTIES SKIP_RETURN_CODE 77) - add_test(NAME agc_draw_inputs_copied COMMAND agc_driver_recorder_tests --draw-inputs-copied-only) - set_tests_properties(agc_draw_inputs_copied PROPERTIES SKIP_RETURN_CODE 77) - add_test(NAME agc_resident_present COMMAND agc_driver_recorder_tests --resident-present-only) - set_tests_properties(agc_resident_present PROPERTIES SKIP_RETURN_CODE 77) - add_test(NAME agc_queued_write_groups COMMAND agc_driver_recorder_tests --queued-write-groups-only) - add_test(NAME agc_tiled_resolve COMMAND agc_driver_recorder_tests --tiled-resolve-only) - set_tests_properties(agc_tiled_resolve PROPERTIES SKIP_RETURN_CODE 77) - add_test(NAME agc_slice_dirty COMMAND agc_driver_recorder_tests --slice-dirty-only) - set_tests_properties(agc_slice_dirty PROPERTIES SKIP_RETURN_CODE 77) - add_test(NAME agc_metadata_pass COMMAND agc_driver_recorder_tests --metadata-pass-only) - set_tests_properties(agc_metadata_pass PROPERTIES SKIP_RETURN_CODE 77) - if(WIN32) - set_tests_properties(agc_recorder_read_list agc_host_import_unmap agc_parked_import_unmap agc_host_import_retirement agc_sparse_run_import agc_sparse_run_import_copied agc_unit_shadow agc_driver_recorder agc_idle_publish_wait agc_recorder_command_buffer_release agc_descriptor_pool_recycling agc_draw_snapshot_cap agc_draw_snapshot_epoch agc_multisample_guest_access agc_repeat_storage_guard agc_draw_inputs_in_place agc_draw_inputs_copied agc_resident_present agc_slice_dirty agc_queued_write_groups agc_metadata_pass agc_tiled_resolve PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - add_test(NAME agc_host_import_second_mapping COMMAND agc_driver_recorder_tests --host-import-second-mapping-only) - set_tests_properties(agc_host_import_second_mapping PROPERTIES SKIP_RETURN_CODE 77 ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_pending_key_stores COMMAND agc_driver_recorder_tests --pending-key-stores-only) - set_tests_properties(agc_pending_key_stores PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) - add_test(NAME agc_shadowed_key_stores COMMAND agc_driver_recorder_tests --shadowed-key-stores-only) - set_tests_properties(agc_shadowed_key_stores PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) - add_test(NAME agc_sample_dumps COMMAND agc_driver_recorder_tests --sample-dumps-only) - set_tests_properties(agc_sample_dumps PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) - add_test(NAME agc_uncounted_passes COMMAND agc_driver_recorder_tests --uncounted-passes-only) - set_tests_properties(agc_uncounted_passes PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) - add_test(NAME agc_draw_descriptors COMMAND agc_driver_recorder_tests --draw-descriptors-only) - set_tests_properties(agc_draw_descriptors PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 60) - if(WIN32) - set_tests_properties(agc_pending_key_stores agc_shadowed_key_stores agc_sample_dumps agc_uncounted_passes agc_draw_descriptors PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_host_import_lifetime COMMAND agc_driver_recorder_tests --host-import-lifetime-only) - add_test(NAME agc_driver_host_import_mutation_race COMMAND agc_driver_recorder_tests --host-import-mutation-race-only) - set_tests_properties(agc_driver_host_import_lifetime agc_driver_host_import_mutation_race PROPERTIES - ENVIRONMENT "APS5_PIN_WAIT_MS=2000" SKIP_RETURN_CODE 77 TIMEOUT 30) - add_test(NAME agc_driver_unit_shadow COMMAND agc_driver_recorder_tests --unit-shadow-only) - add_test(NAME agc_driver_unit_shadow_budget COMMAND agc_driver_recorder_tests --unit-shadow-only) - set_tests_properties(agc_driver_unit_shadow PROPERTIES - ENVIRONMENT "APS5_PIN_WAIT_MS=2000" SKIP_RETURN_CODE 77 TIMEOUT 30) - set_tests_properties(agc_driver_unit_shadow_budget PROPERTIES - ENVIRONMENT "APS5_PIN_WAIT_MS=2000;APS5_UNIT_SHADOW_MIB=8" SKIP_RETURN_CODE 77 TIMEOUT 30) - add_test(NAME agc_small_tiled_shadow_label COMMAND agc_driver_recorder_tests --small-tiled-shadow-label-only) - set_tests_properties(agc_small_tiled_shadow_label PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) - add_test(NAME agc_recorder_completion_labels COMMAND agc_driver_recorder_tests --completion-labels-only) - set_tests_properties(agc_recorder_completion_labels PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) - add_test(NAME agc_recorder_cmask COMMAND agc_driver_recorder_tests --cmask-only) - set_tests_properties(agc_recorder_cmask PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) - add_test(NAME agc_recorder_cube COMMAND agc_driver_recorder_tests --cube-only) - set_tests_properties(agc_recorder_cube PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) - add_test(NAME agc_recorder_failed_check COMMAND agc_driver_recorder_tests --failed-check-only) - set_tests_properties(agc_recorder_failed_check PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30 - PASS_REGULAR_EXPRESSION "a failed check stopped the test with a texture upload in its open batch" - FAIL_REGULAR_EXPRESSION "recorder teardown") - if(WIN32) - set_tests_properties(agc_driver_host_import_lifetime agc_driver_host_import_mutation_race agc_driver_unit_shadow agc_driver_unit_shadow_budget agc_small_tiled_shadow_label PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - set_tests_properties(agc_recorder_completion_labels agc_recorder_cmask agc_recorder_cube agc_recorder_failed_check PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - set_property(TEST agc_driver_host_import_lifetime APPEND PROPERTY ENVIRONMENT_MODIFICATION - "APS5_RELEASE_UNDER_LOCK=unset:" "APS5_RELEASE_ON_UNLOCK=unset:") - if(WIN32) - add_test(NAME agc_driver_host_import_lifetime_other_family COMMAND agc_driver_recorder_tests --host-import-lifetime-other-family-only) - set_tests_properties(agc_driver_host_import_lifetime_other_family PROPERTIES - ENVIRONMENT "APS5_PIN_WAIT_MS=2000" SKIP_RETURN_CODE 77 TIMEOUT 30 ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - set_property(TEST agc_driver_host_import_lifetime_other_family APPEND PROPERTY ENVIRONMENT_MODIFICATION - "APS5_RELEASE_UNDER_LOCK=unset:" "APS5_RELEASE_ON_UNLOCK=unset:") - endif() -endif() - -add_test_executable(agc_recorder_kept_bytes_tests EXCLUDE_FROM_ALL tests/RecorderKeptBytes.cpp) -target_include_directories(agc_recorder_kept_bytes_tests PRIVATE ${LIBS_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/core/shader/recompiler ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) -target_link_libraries(agc_recorder_kept_bytes_tests PRIVATE libSceAgcDriver libc) -set_target_properties(agc_recorder_kept_bytes_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_recorder_kept_bytes_tests) -if(BUILD_TESTING) - set_target_properties(agc_recorder_kept_bytes_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_recorder_kept_bytes COMMAND agc_recorder_kept_bytes_tests) - if(WIN32) - set_tests_properties(agc_recorder_kept_bytes PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_command_batch_failure_tests EXCLUDE_FROM_ALL - tests/CommandBatch.cpp tests/CommandBatchFailure.cpp Graphics/src/Resources.cpp tests/AllocationFailure.cpp) -target_include_directories(agc_command_batch_failure_tests PRIVATE - ${LIBS_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/core/shader/recompiler ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) -target_link_libraries(agc_command_batch_failure_tests PRIVATE libSceAgcDriver libc) -set_target_properties(agc_command_batch_failure_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_command_batch_failure_tests) -if(BUILD_TESTING) - set_target_properties(agc_command_batch_failure_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_command_batch_failure COMMAND agc_command_batch_failure_tests) - set_tests_properties(agc_command_batch_failure PROPERTIES TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_command_batch_failure PROPERTIES - ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_host_import_retire_tests EXCLUDE_FROM_ALL tests/HostImportRetireHold.cpp) -target_include_directories(agc_host_import_retire_tests PRIVATE ${LIBS_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/core/shader/recompiler ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) -target_link_libraries(agc_host_import_retire_tests PRIVATE libSceAgcDriver libc) -set_target_properties(agc_host_import_retire_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_host_import_retire_tests) -target_sources(agc_host_import_retire_tests PRIVATE tests/HostImportFailure.cpp) -if(BUILD_TESTING) - set_target_properties(agc_host_import_retire_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_host_import_retire COMMAND agc_host_import_retire_tests) - if(WIN32) - set_tests_properties(agc_host_import_retire PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_host_import_sparse_tests EXCLUDE_FROM_ALL tests/HostImportSparseDmaBuf.cpp) -target_include_directories(agc_host_import_sparse_tests PRIVATE ${LIBS_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/core/shader/recompiler ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) -target_link_libraries(agc_host_import_sparse_tests PRIVATE libSceAgcDriver libc) -set_target_properties(agc_host_import_sparse_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_host_import_sparse_tests) -if(BUILD_TESTING) - set_target_properties(agc_host_import_sparse_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_host_import_sparse COMMAND agc_host_import_sparse_tests) - set_tests_properties(agc_host_import_sparse PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_host_import_sparse PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_driver_presentation_pass_tests EXCLUDE_FROM_ALL - tests/PresentationPass.cpp -) - -target_include_directories(agc_driver_presentation_pass_tests PRIVATE - ${LIBS_INCLUDE_DIR} - ${CMAKE_SOURCE_DIR}/core/shader/recompiler - ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR} -) - -target_link_libraries(agc_driver_presentation_pass_tests PRIVATE - libSceAgcDriver - SDL2-static - libc -) - -set_target_properties(agc_driver_presentation_pass_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_driver_presentation_pass_tests) -if(BUILD_TESTING) - set_target_properties(agc_driver_presentation_pass_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_driver_presentation_pass COMMAND agc_driver_presentation_pass_tests) - set_tests_properties(agc_driver_presentation_pass PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_driver_presentation_pass PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_performance_overlay_statistics_tests EXCLUDE_FROM_ALL - tests/PerformanceOverlayStatistics.cpp -) -target_include_directories(agc_performance_overlay_statistics_tests PRIVATE - ${LIBS_INCLUDE_DIR} - ${CMAKE_SOURCE_DIR}/core/shader/recompiler - ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR} -) -target_link_libraries(agc_performance_overlay_statistics_tests PRIVATE - libSceAgcDriver - libc -) -set_target_properties(agc_performance_overlay_statistics_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_performance_overlay_statistics_tests) - -add_test_executable(agc_keyboard_overlay_tests EXCLUDE_FROM_ALL - tests/KeyboardOverlay.cpp - ${CMAKE_SOURCE_DIR}/core/libs/prx/libSceImeDialog/src/PadKeyboard.cpp -) -target_include_directories(agc_keyboard_overlay_tests PRIVATE - ${LIBS_INCLUDE_DIR} - ${CMAKE_SOURCE_DIR}/core/shader/recompiler - ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR} -) -target_link_libraries(agc_keyboard_overlay_tests PRIVATE - libSceAgcDriver - libc -) -set_target_properties(agc_keyboard_overlay_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_keyboard_overlay_tests) - -add_test_executable(agc_pad_status_overlay_tests EXCLUDE_FROM_ALL - tests/PadStatusOverlay.cpp -) -target_include_directories(agc_pad_status_overlay_tests PRIVATE - ${LIBS_INCLUDE_DIR} - ${CMAKE_SOURCE_DIR}/core/shader/recompiler - ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR} -) -target_link_libraries(agc_pad_status_overlay_tests PRIVATE - libSceAgcDriver - libc -) -set_target_properties(agc_pad_status_overlay_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_pad_status_overlay_tests) - -add_test_executable(agc_performance_overlay_tests EXCLUDE_FROM_ALL - tests/PerformanceOverlay.cpp -) -target_include_directories(agc_performance_overlay_tests PRIVATE - ${LIBS_INCLUDE_DIR} - ${CMAKE_SOURCE_DIR}/core/shader/recompiler - ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR} -) -target_link_libraries(agc_performance_overlay_tests PRIVATE - libSceAgcDriver - SDL2-static - libc -) -set_target_properties(agc_performance_overlay_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_performance_overlay_tests) - -if(BUILD_TESTING) - set_target_properties(agc_performance_overlay_statistics_tests agc_keyboard_overlay_tests agc_pad_status_overlay_tests agc_performance_overlay_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_performance_overlay_statistics COMMAND agc_performance_overlay_statistics_tests) - add_test(NAME agc_keyboard_overlay COMMAND agc_keyboard_overlay_tests) - add_test(NAME agc_pad_status_overlay COMMAND agc_pad_status_overlay_tests) - add_test(NAME agc_pad_status_overlay_shared COMMAND agc_pad_status_overlay_tests default) - add_test(NAME agc_pad_status_overlay_events COMMAND agc_pad_status_overlay_tests events) - add_test(NAME agc_pad_status_overlay_invalid COMMAND agc_pad_status_overlay_tests invalid) - set_tests_properties(agc_pad_status_overlay agc_pad_status_overlay_shared agc_pad_status_overlay_events agc_pad_status_overlay_invalid PROPERTIES TIMEOUT 30) - foreach(padStatusCase IN ITEMS shared:unset: events:set:1 invalid:set:2) - string(REGEX REPLACE "^([a-z]+):(.*)$" "\\1" padStatusName "${padStatusCase}") - string(REGEX REPLACE "^([a-z]+):(.*)$" "\\2" padStatusValue "${padStatusCase}") - set(padStatusModification "ANYPS5_PAD_STATUS=${padStatusValue}") - if(WIN32) - list(APPEND padStatusModification "PATH=path_list_prepend:$") - endif() - set_tests_properties(agc_pad_status_overlay_${padStatusName} PROPERTIES ENVIRONMENT_MODIFICATION "${padStatusModification}") - endforeach() - add_test(NAME agc_performance_overlay COMMAND agc_performance_overlay_tests) - add_test(NAME agc_performance_overlay_device_selection COMMAND agc_performance_overlay_tests device-selection) - add_test(NAME agc_performance_overlay_device_selection_cpu COMMAND agc_performance_overlay_tests device-selection-cpu) - set_tests_properties(agc_performance_overlay agc_performance_overlay_device_selection PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) - set_tests_properties(agc_performance_overlay_device_selection_cpu PROPERTIES TIMEOUT 30) - if(ANYPS5_ENABLE_ASAN) - set_tests_properties(agc_performance_overlay PROPERTIES TIMEOUT 120) - endif() - if(WIN32) - set_tests_properties(agc_performance_overlay_statistics agc_keyboard_overlay agc_pad_status_overlay agc_performance_overlay agc_performance_overlay_device_selection agc_performance_overlay_device_selection_cpu PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_driver_pm4_tests EXCLUDE_FROM_ALL - tests/Pm4.cpp -) - -target_include_directories(agc_driver_pm4_tests PRIVATE - ${LIBS_INCLUDE_DIR} -) - -target_link_libraries(agc_driver_pm4_tests PRIVATE - libSceAgcDriver - shader_recompiler_agc_driver - libc - libkernel -) - -set_target_properties(agc_driver_pm4_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_driver_pm4_tests) - -add_test_executable(agc_driver_graphics_tests EXCLUDE_FROM_ALL - tests/Graphics.cpp - tests/ColorTargetLayout.cpp - tests/BdaResources.cpp - tests/GuestAllocations.cpp - tests/LiveStack.cpp - tests/TextureFormat.cpp - tests/TextureTiling.cpp - tests/GuestTextureResource.cpp - tests/GuestSamplerResource.cpp - tests/TextureDetiler.cpp - tests/DepthSurfaceReuse.cpp - tests/LastRecordIndices.cpp -) - -if(BUILD_TESTING) - add_test_executable(agc_descriptor_cache_failure_tests - tests/DescriptorCacheFailure.cpp - Graphics/src/ShaderResources.cpp) - target_include_directories(agc_descriptor_cache_failure_tests PRIVATE - $) - target_link_libraries(agc_descriptor_cache_failure_tests PRIVATE libSceAgcDriver shader_recompiler_agc_driver libc libkernel) - configure_windows_unwind(agc_descriptor_cache_failure_tests) - add_test(NAME agc_descriptor_cache_failure COMMAND agc_descriptor_cache_failure_tests) - set_tests_properties(agc_descriptor_cache_failure PROPERTIES TIMEOUT 20) - if(WIN32) - set_tests_properties(agc_descriptor_cache_failure PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -target_include_directories(agc_driver_graphics_tests PRIVATE - ${LIBS_INCLUDE_DIR} - $ - ${agcTextureDetileGeneratedRoot} - ${CMAKE_SOURCE_DIR}/core/shader/recompiler - ${CMAKE_SOURCE_DIR}/core/shader/recompiler/IntermediateRepresentation/include - ${CMAKE_SOURCE_DIR}/core/shader/recompiler/ControlFlow/include - ${CMAKE_SOURCE_DIR}/core/shader/recompiler/RdnaDecoder/include - ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR} - ${ANYPS5_SPIRV_HEADERS_INCLUDE_DIR} -) - -target_link_libraries(agc_driver_graphics_tests PRIVATE - libSceAgcDriver - libc - libkernel -) - -if(BUILD_TESTING) - add_test(NAME agc_command_batch_fence_failure COMMAND agc_driver_graphics_tests --command-batch-fence-failure) - set_tests_properties(agc_command_batch_fence_failure PROPERTIES TIMEOUT 20) - if(WIN32) - set_tests_properties(agc_command_batch_fence_failure PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -set_target_properties(agc_driver_graphics_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_driver_graphics_tests) - -add_test_executable(agc_driver_msaa_layout_tests EXCLUDE_FROM_ALL - tests/MultisampleTextureLayout.cpp - Graphics/src/MultisampleTextureLayout.cpp -) -target_include_directories(agc_driver_msaa_layout_tests PRIVATE - ${LIBS_INCLUDE_DIR} - ${CMAKE_SOURCE_DIR}/core/shader/recompiler - ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR} -) -target_link_libraries(agc_driver_msaa_layout_tests PRIVATE libc) -set_target_properties(agc_driver_msaa_layout_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_driver_msaa_layout_tests) -if(BUILD_TESTING) - set_target_properties(agc_driver_msaa_layout_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_driver_msaa_layout COMMAND agc_driver_msaa_layout_tests) - set_tests_properties(agc_driver_msaa_layout PROPERTIES TIMEOUT 20) - if(WIN32) - set_tests_properties(agc_driver_msaa_layout PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - foreach(agcVertexRangeShader IN ITEMS VertexRange.vert VertexRangeProducer.frag) string(REPLACE "." "_" agcVertexRangeName "${agcVertexRangeShader}") string(TOUPPER "${agcVertexRangeName}_SPV" agcVertexRangeSymbol) @@ -2368,64 +542,7 @@ foreach(agcVertexRangeShader IN ITEMS VertexRange.vert VertexRangeProducer.frag) list(APPEND agcVertexRangeHeaders ${agcVertexRangeHeader}) endforeach() -target_sources(agc_driver_recorder_tests PRIVATE ${agcVertexRangeHeaders}) - -if(BUILD_TESTING) - add_test(NAME agc_driver_vertex_target_range_copied COMMAND agc_driver_recorder_tests --vertex-target-range-copied) - add_test(NAME agc_driver_vertex_target_range_imported COMMAND agc_driver_recorder_tests --vertex-target-range-imported) - set_tests_properties(agc_driver_vertex_target_range_copied agc_driver_vertex_target_range_imported PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_driver_vertex_target_range_copied agc_driver_vertex_target_range_imported PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_driver_bda_device_tests EXCLUDE_FROM_ALL - tests/BdaDevice.cpp - tests/BdaShader.cpp - tests/BdaExecution.cpp - tests/BdaContracts.cpp - tests/HostImportFailure.cpp -) - -target_include_directories(agc_driver_bda_device_tests PRIVATE - ${LIBS_INCLUDE_DIR} - $ - ${CMAKE_SOURCE_DIR}/core/shader/recompiler - ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR} -) -target_link_libraries(agc_driver_bda_device_tests PRIVATE libSceAgcDriver SDL2-static libc) -set_target_properties(agc_driver_bda_device_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_driver_bda_device_tests) -if(BUILD_TESTING) - add_test(NAME agc_driver_host_import_failure_handles COMMAND agc_driver_bda_device_tests --host-import-failures) - set_tests_properties(agc_driver_host_import_failure_handles PROPERTIES - ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_driver_host_import_failure_handles PROPERTIES - ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_driver_mesh_tests EXCLUDE_FROM_ALL tests/Mesh.cpp) -target_include_directories(agc_driver_mesh_tests PRIVATE - ${LIBS_INCLUDE_DIR} - ${CMAKE_SOURCE_DIR}/core/shader/recompiler - ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR} - ${ANYPS5_SPIRV_HEADERS_INCLUDE_DIR} -) -target_link_libraries(agc_driver_mesh_tests PRIVATE libSceAgcDriver SDL2-static libc) -set_target_properties(agc_driver_mesh_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_driver_mesh_tests) - set(ANYPS5_AGC_EXECUTION_TESTS "" CACHE STRING "tests/execution sources to build, by file name without extension; the others build a stub that reports a skip. Empty builds all") -add_executable(agc_driver_registration_prepare_budget_tests tests/RegistrationPrepareBudget.cpp) -target_include_directories(agc_driver_registration_prepare_budget_tests PRIVATE ${LIBS_INCLUDE_DIR}) -set_target_properties(agc_driver_registration_prepare_budget_tests PROPERTIES CXX_EXTENSIONS OFF) -if(MINGW) - target_compile_options(agc_driver_registration_prepare_budget_tests PRIVATE -fasynchronous-unwind-tables) - target_link_options(agc_driver_registration_prepare_budget_tests PRIVATE -static -static-libgcc -static-libstdc++) -endif() file(GLOB agcExecutionTestSources CONFIGURE_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/tests/execution/*.cpp) set(agcExecutionTests) @@ -2464,569 +581,90 @@ foreach(agcExecutionTestSource IN LISTS agcExecutionTestSources) endif() list(APPEND agcExecutionTests ${agcExecutionTest}) endforeach() + +function(agc_add_default_test agcTest) + string(REGEX REPLACE "_tests$" "" agcTestName "${agcTest}") + set_target_properties(${agcTest} PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME ${agcTestName} COMMAND ${agcTest}) + set_tests_properties(${agcTestName} PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(${agcTestName} PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endfunction() + +function(agc_add_draw_pipeline_test agcTestName) + add_test(NAME ${agcTestName}_draw_pipeline COMMAND ${agcTestName}_tests) + set_tests_properties(${agcTestName}_draw_pipeline PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_DRAW_PIPELINE=1;APS5_PIPELINED_DRAWS=32;APS5_PIPELINE_DISPATCH=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(${agcTestName}_draw_pipeline PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() +endfunction() + +function(agc_add_spirv_mode_tests agcTest) + if(NOT TARGET ${agcTest}) + return() + endif() + set_target_properties(${agcTest} PROPERTIES EXCLUDE_FROM_ALL OFF) + string(REGEX REPLACE "_tests$" "" agcTestBaseName "${agcTest}") + foreach(agcSpirvMode IN ITEMS default full none) + if(agcSpirvMode STREQUAL "default") + set(agcTestName "${agcTestBaseName}") + set(agcSpirvEnvironment "--unset=APS5_SPIRV_OPT") + else() + set(agcTestName "${agcTestBaseName}_${agcSpirvMode}") + set(agcSpirvEnvironment "APS5_SPIRV_OPT=${agcSpirvMode}") + endif() + add_test(NAME ${agcTestName} COMMAND ${CMAKE_COMMAND} -E env + ${agcSpirvEnvironment} "$") + set_tests_properties(${agcTestName} PROPERTIES + ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" TIMEOUT 60 SKIP_RETURN_CODE 77) + if(agcTest STREQUAL "agc_spirv13_image_tests") + set_tests_properties(${agcTestName} PROPERTIES TIMEOUT 30) + endif() + if(agcTest STREQUAL "agc_driver_constant_store_tests") + set_tests_properties(${agcTestName} PROPERTIES RUN_SERIAL TRUE) + endif() + if(WIN32) + set_tests_properties(${agcTestName} PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + endforeach() +endfunction() + if(BUILD_TESTING) - add_test(NAME agc_driver_address_passes_targets_split COMMAND agc_driver_address_passes_tests --targets) - set_tests_properties(agc_driver_address_passes_targets_split PROPERTIES ENVIRONMENT "APS5_NO_ADDRESS_READ_PASSES=1" SKIP_RETURN_CODE 77 TIMEOUT 60) - if(WIN32) - set_tests_properties(agc_driver_address_passes_targets_split PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_address_passes_draw_transitions COMMAND agc_driver_address_passes_tests --targets) - set_tests_properties(agc_driver_address_passes_draw_transitions PROPERTIES ENVIRONMENT "APS5_NO_ADDRESS_READ_PASSES=1;APS5_DRAW_TRANSITIONS=1" SKIP_RETURN_CODE 77 TIMEOUT 60) - if(WIN32) - set_tests_properties(agc_driver_address_passes_draw_transitions PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - set_target_properties(agc_driver_rcp_hardware_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_driver_rcp_hardware_exact COMMAND agc_driver_rcp_hardware_tests) - set_tests_properties(agc_driver_rcp_hardware_exact PROPERTIES ENVIRONMENT "APS5_EXACT_RCP=1;ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 TIMEOUT 60) - if(WIN32) - set_tests_properties(agc_driver_rcp_hardware_exact PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_depth_plane_sampling_evicting COMMAND agc_driver_depth_plane_sampling_tests --evicting) - set_tests_properties(agc_driver_depth_plane_sampling_evicting PROPERTIES ENVIRONMENT "APS5_DEPTH_PLANE_COPY_MIB=1" SKIP_RETURN_CODE 77 TIMEOUT 120) - if(WIN32) - set_tests_properties(agc_driver_depth_plane_sampling_evicting PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() + foreach(agcTest IN LISTS agcExecutionTests) + if(agcTest STREQUAL "agc_driver_constant_store_tests" OR agcTest STREQUAL "agc_driver_flat_apertures_tests" OR agcTest STREQUAL "agc_driver_pipeline_optimized_readback_tests" OR agcTest STREQUAL "agc_driver_rcp_hardware_tests") + continue() + endif() + agc_add_default_test(${agcTest}) + endforeach() endif() + foreach(agcExecutionTestName IN LISTS ANYPS5_AGC_EXECUTION_TESTS) if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/tests/execution/${agcExecutionTestName}.cpp) message(FATAL_ERROR "ANYPS5_AGC_EXECUTION_TESTS names ${agcExecutionTestName}, which has no source in tests/execution") endif() endforeach() -if(BUILD_TESTING) - add_test(NAME agc_driver_registration_prepare_budget COMMAND agc_driver_registration_prepare_budget_tests) - set_tests_properties(agc_driver_registration_prepare_budget PROPERTIES TIMEOUT 10) - add_test(NAME agc_driver_indirect_thread_dimensions_cpu COMMAND agc_driver_indirect_thread_dimensions_tests) - set_tests_properties(agc_driver_indirect_thread_dimensions_cpu PROPERTIES ENVIRONMENT "APS5_NO_GPU_THREAD_DIMENSIONS=1" SKIP_RETURN_CODE 77 TIMEOUT 60) - if(WIN32) - set_tests_properties(agc_driver_indirect_thread_dimensions_cpu PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() option(ANYPS5_REQUIRE_CPU_LEAD_TEST "Register agc_driver_sparse_dma_buf_cpu_lead, which fails instead of skipping when the nonzero-lead dma-buf CPU publish cannot run (bench only)" OFF) -if(BUILD_TESTING AND ANYPS5_REQUIRE_CPU_LEAD_TEST) - add_test(NAME agc_driver_sparse_dma_buf_cpu_lead COMMAND agc_driver_sparse_dma_buf_import_tests --require-cpu-lead) - set_tests_properties(agc_driver_sparse_dma_buf_cpu_lead PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" TIMEOUT 120 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_driver_sparse_dma_buf_cpu_lead PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() -if(ANYPS5_ENABLE_SPIRV_TOOLS) - target_compile_definitions(agc_driver_stencil_null_feedback_tests PRIVATE ANYPS5_ENABLE_SPIRV_TOOLS=1) - target_link_libraries(agc_driver_stencil_null_feedback_tests PRIVATE SPIRV-Tools-static) -endif() -if(NOT ANYPS5_AGC_EXECUTION_TESTS OR "PooledBufferRange" IN_LIST ANYPS5_AGC_EXECUTION_TESTS) - target_sources(agc_driver_pooled_buffer_range_tests PRIVATE - Graphics/src/BufferPool.cpp Graphics/src/Resources.cpp tests/AllocationFailure.cpp tests/CommandBatchFailure.cpp) -endif() - -target_link_libraries(agc_driver_gpu_map_on_fiber_tests PRIVATE libSceFiber) -if(ANYPS5_ENABLE_SPIRV_TOOLS) - target_link_libraries(agc_driver_optimize_on_fiber_tests PRIVATE libSceFiber shader_recompiler_agc_driver) -endif() - -target_link_libraries(agc_driver_rect_list_corner_tests PRIVATE shader_recompiler_agc_driver) -target_link_libraries(agc_driver_queue_zero_late_interrupt_tests PRIVATE libkernel) -target_link_libraries(agc_driver_linear_target_completion_points_tests PRIVATE libkernel) - -target_link_libraries(agc_driver_storage_file_write_tests PRIVATE libkernel) - -target_link_libraries(agc_driver_preparation_scope_settle_tests PRIVATE libSceAgc) - -target_include_directories(agc_driver_alpha_to_coverage_tests PRIVATE $) - -target_include_directories(agc_driver_sample_multisample_target_tests PRIVATE $) - -target_include_directories(agc_driver_image_table_cache_bounds_tests PRIVATE $) - -target_include_directories(agc_driver_draw_cache_relocation_tests PRIVATE $) +file(GLOB agcTestFragments CONFIGURE_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/tests/cmake/*.cmake) +list(SORT agcTestFragments) +foreach(agcTestFragment IN LISTS agcTestFragments) + include(${agcTestFragment}) +endforeach() if(BUILD_TESTING) - add_test(NAME agc_driver_linear_target_completion_points_sync_flip COMMAND agc_driver_linear_target_completion_points_tests --flip) - set_tests_properties(agc_driver_linear_target_completion_points_sync_flip PROPERTIES - ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_SYNC_FLIP=1" SKIP_RETURN_CODE 77 TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - add_test(NAME agc_driver_linear_target_completion_points_unpipelined COMMAND agc_driver_linear_target_completion_points_tests --label --interrupt) - set_tests_properties(agc_driver_linear_target_completion_points_unpipelined PROPERTIES - ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_PIPELINED_DRAWS=0" SKIP_RETURN_CODE 77 TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_driver_linear_target_completion_points_sync_flip agc_driver_linear_target_completion_points_unpipelined PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_submit_progress COMMAND agc_driver_submit_progress_tests) - set_tests_properties(agc_submit_progress PROPERTIES - ENVIRONMENT "APS5_SUBMIT_PROGRESS=1" TIMEOUT 30 SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_submit_progress PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$;PATH=path_list_prepend:$") - endif() - add_test(NAME agc_submit_progress_no_timeline COMMAND agc_driver_submit_progress_tests --fallback-only) - set_tests_properties(agc_submit_progress_no_timeline PROPERTIES - ENVIRONMENT "APS5_SUBMIT_PROGRESS=1;APS5_NO_TIMELINE=1" - TIMEOUT 30 SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_submit_progress_no_timeline PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$;PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_vulkan_test_device_no_driver COMMAND agc_driver_vulkan_test_device_tests --no-driver) - set_tests_properties(agc_driver_vulkan_test_device_no_driver PROPERTIES - ENVIRONMENT "VK_DRIVER_FILES=${CMAKE_CURRENT_BINARY_DIR}/no-vulkan-driver.json;VK_ICD_FILENAMES=${CMAKE_CURRENT_BINARY_DIR}/no-vulkan-driver.json" - TIMEOUT 30 SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_driver_vulkan_test_device_no_driver PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -if(BUILD_TESTING) - add_test(NAME agc_driver_store_pending_identity COMMAND agc_driver_store_over_untracked_tests --pending-identity) - set_tests_properties(agc_driver_store_pending_identity PROPERTIES - ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - add_test(NAME agc_driver_store_idle_results_wake COMMAND agc_driver_store_idle_results_tests --idle-epoch-wake) - set_tests_properties(agc_driver_store_idle_results_wake PROPERTIES - ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_driver_store_pending_identity PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - set_tests_properties(agc_driver_store_idle_results_wake PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -if(BUILD_TESTING) - add_test(NAME agc_driver_native_fmask COMMAND agc_driver_sample_multisample_target_tests --native-fmask) - set_tests_properties(agc_driver_native_fmask PROPERTIES TIMEOUT 30 ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_driver_native_fmask PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_native_msaa_vertex_input COMMAND agc_driver_sample_multisample_target_tests --native-vertex-input) - set_tests_properties(agc_driver_native_msaa_vertex_input PROPERTIES - ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" TIMEOUT 30 SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_driver_native_msaa_vertex_input PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_undithered_alpha_to_coverage_state COMMAND agc_driver_graphics_tests --undithered-alpha-to-coverage-state) - add_test(NAME agc_driver_depth_bounds_state COMMAND agc_driver_graphics_tests --depth-bounds-state) - add_test(NAME agc_driver_msaa_dcc_state COMMAND agc_driver_graphics_tests --multisample-dcc-state) - add_test(NAME agc_driver_unused_viewport_depth COMMAND agc_driver_graphics_tests --unused-viewport-depth) - set_tests_properties(agc_driver_unused_viewport_depth PROPERTIES TIMEOUT 30) - set_tests_properties(agc_driver_undithered_alpha_to_coverage_state agc_driver_depth_bounds_state PROPERTIES - ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - add_test(NAME agc_driver_alpha_to_coverage_state COMMAND agc_driver_graphics_tests --alpha-to-coverage-state) - set_tests_properties(agc_driver_alpha_to_coverage_state PROPERTIES - ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - add_test(NAME agc_driver_dithered_alpha_to_coverage COMMAND agc_driver_alpha_to_coverage_tests --dithered8) - add_test(NAME agc_driver_two_sample_dithered_alpha_to_coverage COMMAND agc_driver_alpha_to_coverage_tests --dithered2) - set(multisampledDccClearTests) - foreach(samples IN ITEMS 2 4 8) - set(testName "agc_driver_msaa_dcc_srgb_clear_${samples}") - add_test(NAME ${testName} COMMAND agc_driver_alpha_to_coverage_tests --dcc-srgb-clear ${samples}) - list(APPEND multisampledDccClearTests ${testName}) - set(testName "agc_driver_msaa_dcc_clear_${samples}") - add_test(NAME ${testName} COMMAND agc_driver_alpha_to_coverage_tests --dcc-fast-clear ${samples}) - list(APPEND multisampledDccClearTests ${testName}) - set(testName "agc_driver_msaa_dcc_compared_import_${samples}") - add_test(NAME ${testName} COMMAND agc_driver_alpha_to_coverage_tests --dcc-compared-import ${samples}) - list(APPEND multisampledDccClearTests ${testName}) - endforeach() set_tests_properties(agc_driver_msaa_dcc_state ${multisampledDccClearTests} PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") set_tests_properties(${multisampledDccClearTests} PROPERTIES SKIP_RETURN_CODE 77) - set_tests_properties(agc_driver_dithered_alpha_to_coverage agc_driver_two_sample_dithered_alpha_to_coverage PROPERTIES - ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") if(WIN32) - set_tests_properties(agc_driver_alpha_to_coverage_state agc_driver_undithered_alpha_to_coverage_state agc_driver_depth_bounds_state agc_driver_msaa_dcc_state agc_driver_unused_viewport_depth PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") set_tests_properties(agc_driver_dithered_alpha_to_coverage agc_driver_two_sample_dithered_alpha_to_coverage ${multisampledDccClearTests} PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") endif() endif() -target_include_directories(agc_driver_native_multisample_depth_tests PRIVATE $) -target_include_directories(agc_driver_partially_resident_snapshot_tests PRIVATE $) - -foreach(agcReadbackTestKind IN ITEMS Vertex Uint Depth) - string(TOUPPER ${agcReadbackTestKind} agcReadbackTestSymbol) - if(agcReadbackTestKind STREQUAL "Vertex") - set(agcReadbackTestStage vert) - else() - set(agcReadbackTestStage frag) - endif() - if(agcReadbackTestKind STREQUAL "Depth") - set(agcReadbackTestDepth 1) - else() - set(agcReadbackTestDepth 0) - endif() - set(agcReadbackTestHeader ${agcTestShaderGeneratedRoot}/MsaaReadback${agcReadbackTestKind}_spv.h) - set(agcReadbackTestSpv ${agcTestShaderGeneratedRoot}/MsaaReadback${agcReadbackTestKind}.spv) - add_custom_command( - OUTPUT "${agcReadbackTestHeader}" - COMMAND ${CMAKE_COMMAND} -E make_directory "${agcTestShaderGeneratedRoot}" - COMMAND "$" -V --target-env vulkan1.1 -DREAD_DEPTH=${agcReadbackTestDepth} -o "${agcReadbackTestSpv}" "${CMAKE_CURRENT_SOURCE_DIR}/tests/shaders/MultisampleReadback.${agcReadbackTestStage}" - COMMAND ${CMAKE_COMMAND} -DINPUT=${agcReadbackTestSpv} -DOUTPUT=${agcReadbackTestHeader} - -DSYMBOL=MSAA_READBACK_${agcReadbackTestSymbol}_SPV -P "${CMAKE_CURRENT_SOURCE_DIR}/embed_spirv.cmake" - DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/tests/shaders/MultisampleReadback.${agcReadbackTestStage}" glslang-standalone - VERBATIM - ) - target_sources(agc_driver_multisample_readback_tests PRIVATE ${agcReadbackTestHeader}) -endforeach() -target_include_directories(agc_driver_multisample_readback_tests PRIVATE ${agcTestShaderGeneratedRoot}) - -target_include_directories(agc_driver_dual_source_blend_tests PRIVATE $) - -target_include_directories(agc_driver_reversed_order_blend_tests PRIVATE $) - -target_include_directories(agc_driver_swap_alt_blend_tests PRIVATE $) - -target_include_directories(agc_driver_packed_float_color_target_tests PRIVATE $) -target_include_directories(agc_driver_uint_color_target_tests PRIVATE $) - -target_link_libraries(agc_driver_job_manager_compute_tests PRIVATE libSceJobManager libSceAgc libkernel) - -target_include_directories(agc_driver_packed_unorm_color_target_tests PRIVATE $) - -target_include_directories(agc_driver_packed_unorm4444_color_target_tests PRIVATE $) - -target_include_directories(agc_driver_packed_unorm4444_partial_write_tests PRIVATE $) - -target_include_directories(agc_driver_packed_unorm4444_multisample_partial_write_tests PRIVATE $) - -target_include_directories(agc_driver_color1555_target_tests PRIVATE $) - -target_include_directories(agc_driver_color_logic_op_tests PRIVATE $) - -target_include_directories(agc_driver_color565_target_tests PRIVATE $) - -target_include_directories(agc_driver_eqaa_color_target_tests PRIVATE $) - -target_include_directories(agc_driver_depth_range_remap_draw_tests PRIVATE $) if(BUILD_TESTING) - add_test(NAME agc_driver_tessellation_depth_range_remap COMMAND agc_driver_tessellation_tests --depth-remap) - set_tests_properties(agc_driver_tessellation_depth_range_remap PROPERTIES - ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_driver_tessellation_depth_range_remap PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -target_include_directories(agc_driver_depth_bounds_emulation_draw_tests PRIVATE $) - -foreach(stage IN ITEMS vert frag) - set(agcProvokingShaderSource ${CMAKE_CURRENT_SOURCE_DIR}/tests/shaders/ProvokingVertex.${stage}) - set(agcProvokingShaderSpv ${agcTestShaderGeneratedRoot}/ProvokingVertex_${stage}.spv) - set(agcProvokingShaderHeader ${agcTestShaderGeneratedRoot}/ProvokingVertex_${stage}_spv.h) - string(TOUPPER "PROVOKING_VERTEX_${stage}_SPV" agcProvokingShaderSymbol) - add_custom_command( - OUTPUT "${agcProvokingShaderHeader}" - COMMAND ${CMAKE_COMMAND} -E make_directory "${agcTestShaderGeneratedRoot}" - COMMAND "$" -V --target-env vulkan1.1 -o "${agcProvokingShaderSpv}" "${agcProvokingShaderSource}" - COMMAND ${CMAKE_COMMAND} -DINPUT=${agcProvokingShaderSpv} -DOUTPUT=${agcProvokingShaderHeader} - -DSYMBOL=${agcProvokingShaderSymbol} -P "${CMAKE_CURRENT_SOURCE_DIR}/embed_spirv.cmake" - DEPENDS "${agcProvokingShaderSource}" glslang-standalone - VERBATIM - ) - target_sources(agc_driver_provoking_vertex_tests PRIVATE ${agcProvokingShaderHeader}) -endforeach() -target_include_directories(agc_driver_provoking_vertex_tests PRIVATE ${agcTestShaderGeneratedRoot}) - -foreach(agcSampleOrderTestVariant IN ITEMS "R8;SampleOrderTexels.comp;-DTEXEL_FORMAT=r8ui" "R16;SampleOrderTexels.comp;-DTEXEL_FORMAT=r16ui" "R32;SampleOrderTexels.comp;-DTEXEL_FORMAT=r32ui" "RG32;SampleOrderTexels.comp;-DTEXEL_FORMAT=rg32ui" "RGBA32;SampleOrderTexels.comp;-DTEXEL_FORMAT=rgba32ui" "FillVertex;SampleOrderFill.vert;-DPLAIN=1" "FillDepth;SampleOrderFill.frag;-DPLAIN=1" "FillStencil;SampleOrderFill.frag;-DSTENCIL=1" "ReadDepth;SampleOrderRead.comp;-DPLAIN=1" "ReadStencil;SampleOrderRead.comp;-DSTENCIL=1" "ReadColor;SampleOrderRead.comp;-DCOLOR=1") - list(GET agcSampleOrderTestVariant 0 agcSampleOrderTestName) - list(GET agcSampleOrderTestVariant 1 agcSampleOrderTestFile) - list(GET agcSampleOrderTestVariant 2 agcSampleOrderTestDefine) - string(TOUPPER "${agcSampleOrderTestName}" agcSampleOrderTestSymbol) - set(agcSampleOrderTestSource ${CMAKE_CURRENT_SOURCE_DIR}/tests/shaders/${agcSampleOrderTestFile}) - set(agcSampleOrderTestSpv ${agcTestShaderGeneratedRoot}/SampleOrderTest${agcSampleOrderTestName}.spv) - set(agcSampleOrderTestHeader ${agcTestShaderGeneratedRoot}/SampleOrderTest${agcSampleOrderTestName}_spv.h) - add_custom_command( - OUTPUT "${agcSampleOrderTestHeader}" - COMMAND ${CMAKE_COMMAND} -E make_directory "${agcTestShaderGeneratedRoot}" - COMMAND "$" -V --target-env vulkan1.1 ${agcSampleOrderTestDefine} -o "${agcSampleOrderTestSpv}" "${agcSampleOrderTestSource}" - COMMAND ${CMAKE_COMMAND} -DINPUT=${agcSampleOrderTestSpv} -DOUTPUT=${agcSampleOrderTestHeader} - -DSYMBOL=SAMPLE_ORDER_TEST_${agcSampleOrderTestSymbol}_SPV -P "${CMAKE_CURRENT_SOURCE_DIR}/embed_spirv.cmake" - DEPENDS "${agcSampleOrderTestSource}" glslang-standalone - VERBATIM - ) - target_sources(agc_driver_sample_order_tests PRIVATE ${agcSampleOrderTestHeader}) -endforeach() -target_include_directories(agc_driver_sample_order_tests PRIVATE ${agcTestShaderGeneratedRoot}) - -target_include_directories(agc_driver_prepared_exports_tests PRIVATE $) - -target_include_directories(agc_driver_pipeline_journal_tests PRIVATE $) -target_link_libraries(agc_driver_pipeline_journal_tests PRIVATE ${CMAKE_DL_LIBS}) - -target_include_directories(agc_driver_buffer_descriptor_runtime_tests PRIVATE $) - -target_include_directories(agc_driver_shutdown_threads_tests PRIVATE $) - -target_include_directories(agc_driver_image_converted_unorm_tests PRIVATE $) -target_include_directories(agc_driver_failed_capture_dump_tests PRIVATE $) -target_include_directories(agc_driver_gcn_buffer_format_lookup_tests PRIVATE $) - -target_include_directories(agc_driver_prepared_publication_tests PRIVATE $) - -target_include_directories(agc_driver_prepared_graphics_tests PRIVATE $) -target_link_libraries(agc_driver_interpolation_modes_tests PRIVATE shader_recompiler_agc_driver) - -target_include_directories(agc_driver_prepared_unregistered_graphics_tests PRIVATE $) - -target_link_libraries(agc_driver_guest_memory_lifetime_tests PRIVATE libkernel) - -target_include_directories(agc_driver_prepared_shaders_tests PRIVATE - $ -) - -if(BUILD_TESTING) - set_target_properties(agc_shader_mode_register_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - foreach(packedStorageFormat IN ITEMS 133 134 136) - set(packedStorageTest agc_driver_image_packed16_storage_${packedStorageFormat}) - add_test(NAME ${packedStorageTest} COMMAND agc_driver_image_converted_unorm_tests --packed16 ${packedStorageFormat}) - set_tests_properties(${packedStorageTest} PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 30) - if(WIN32) - set_tests_properties(${packedStorageTest} PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() - endforeach() - foreach(prebuildPolicyMode IN ITEMS unset 0 1) - set(prebuildPolicyTest agc_driver_prepared_graphics_prebuild_${prebuildPolicyMode}) - add_test(NAME ${prebuildPolicyTest} COMMAND agc_driver_prepared_graphics_tests --prebuild-${prebuildPolicyMode}) - set_tests_properties(${prebuildPolicyTest} PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" RUN_SERIAL TRUE SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 30) - set(prebuildPolicyEnvironment "APS5_NO_GPL=unset:") - if(prebuildPolicyMode STREQUAL "unset") - list(APPEND prebuildPolicyEnvironment "APS5_NO_LIBRARY_PREBUILD=unset:") - else() - list(APPEND prebuildPolicyEnvironment "APS5_NO_LIBRARY_PREBUILD=set:${prebuildPolicyMode}") - endif() - if(WIN32) - list(APPEND prebuildPolicyEnvironment "PATH=path_list_prepend:$") - endif() - set_tests_properties(${prebuildPolicyTest} PROPERTIES ENVIRONMENT_MODIFICATION "${prebuildPolicyEnvironment}") - endforeach() - add_test(NAME agc_driver_readonly_resummarize COMMAND agc_driver_tests --readonly-resummarize) - set_tests_properties(agc_driver_readonly_resummarize PROPERTIES TIMEOUT 10) - add_test(NAME agc_driver_eop_interrupts COMMAND agc_driver_tests --eop-interrupts) - set_tests_properties(agc_driver_eop_interrupts PROPERTIES TIMEOUT 60) - if(WIN32) - set_tests_properties(agc_driver_readonly_resummarize agc_driver_eop_interrupts PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_small_copy_sync COMMAND agc_driver_tests --small-copy-sync) - set_tests_properties(agc_driver_small_copy_sync PROPERTIES TIMEOUT 30 ENVIRONMENT "APS5_COPY_SYNC=1" SKIP_RETURN_CODE 77) - if(WIN32) - set_tests_properties(agc_driver_small_copy_sync PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_shader_mode_register COMMAND agc_shader_mode_register_tests) - set_tests_properties(agc_shader_mode_register PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 20) - if(WIN32) - set_tests_properties(agc_shader_mode_register PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_shader_bindless COMMAND agc_shader_memory_tests --bindless) - set_tests_properties(agc_shader_bindless PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - add_test(NAME agc_shader_selected_records_image_limit COMMAND agc_shader_memory_tests --selected-records-image-limit) - add_test(NAME agc_shader_selected_records_pair_limit COMMAND agc_shader_memory_tests --selected-records-pair-limit) - add_test(NAME agc_shader_selected_records_direct_image_limit COMMAND agc_shader_memory_tests --selected-records-direct-image-limit) - add_test(NAME agc_shader_selected_records_direct_pair_limit COMMAND agc_shader_memory_tests --selected-records-direct-pair-limit) - set_tests_properties(agc_shader_selected_records_image_limit agc_shader_selected_records_pair_limit agc_shader_selected_records_direct_image_limit agc_shader_selected_records_direct_pair_limit PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - add_test(NAME agc_shader_srt_read_patching COMMAND agc_shader_memory_tests --srt-read-patching) - set_tests_properties(agc_shader_srt_read_patching PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - add_test(NAME agc_shader_table_snapshot_reuse COMMAND agc_shader_memory_tests --table-snapshot-reuse) - add_test(NAME agc_shader_region_merge COMMAND agc_shader_memory_tests --region-merge) - set_tests_properties(agc_shader_region_merge PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_shader_region_merge PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() - set_tests_properties(agc_shader_table_snapshot_reuse PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - add_test(NAME agc_shader_table_snapshot_reuse_unmasked COMMAND agc_shader_memory_tests --table-snapshot-reuse) - set_tests_properties(agc_shader_table_snapshot_reuse_unmasked PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_MASKED_RESULT_MEMO=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - add_test(NAME agc_driver_image_table_vouched_lookups COMMAND agc_driver_image_table_cache_bounds_tests --vouched-lookups) - set_tests_properties(agc_driver_image_table_vouched_lookups PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_WRITE_WATCH_IMPORTS=watch" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 60) - add_test(NAME agc_driver_image_table_vouch_queued_draws COMMAND agc_driver_image_table_cache_bounds_tests --queued-draws) - set_tests_properties(agc_driver_image_table_vouch_queued_draws PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 60) - if(WIN32) - set_tests_properties(agc_shader_table_snapshot_reuse agc_shader_table_snapshot_reuse_unmasked agc_driver_image_table_vouched_lookups agc_driver_image_table_vouch_queued_draws PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_shader_type_zero_image_materialization COMMAND agc_shader_memory_tests --type-zero-image-materialization) - set_tests_properties(agc_shader_type_zero_image_materialization PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - add_test(NAME agc_shader_frontend_pair COMMAND agc_shader_memory_tests --frontend-pair) - add_test(NAME agc_shader_quad_mask_no_demote COMMAND agc_shader_memory_tests --quad-mask-no-demote) - set_tests_properties(agc_shader_quad_mask_no_demote PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_shader_quad_mask_no_demote PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_shader_frontend_pair_off COMMAND agc_shader_memory_tests --frontend-pair) - set_tests_properties(agc_shader_frontend_pair PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - set_tests_properties(agc_shader_frontend_pair_off PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_PERF_FRONTEND_PAIR=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - add_test(NAME agc_shader_result_memo_budget COMMAND agc_shader_memory_tests --result-memo-budget) - set_tests_properties(agc_shader_result_memo_budget PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_MASKED_RESULT_MEMO=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - add_test(NAME agc_shader_result_memo_budget_threads COMMAND agc_shader_memory_tests --result-memo-budget-threads) - set_tests_properties(agc_shader_result_memo_budget_threads PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_MASKED_RESULT_MEMO=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - add_test(NAME agc_shader_result_memo_budget_masked COMMAND agc_shader_memory_tests --result-memo-budget-masked) - set_tests_properties(agc_shader_result_memo_budget_masked PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - add_test(NAME agc_shader_layout_pair COMMAND agc_shader_memory_tests --layout-pair) - add_test(NAME agc_shader_layout_pair_off COMMAND agc_shader_memory_tests --layout-pair) - set_tests_properties(agc_shader_layout_pair PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - set_tests_properties(agc_shader_layout_pair_off PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_PERF_LAYOUT_PAIR=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - add_test(NAME agc_shader_entry_lane_proof_budget COMMAND agc_shader_memory_tests --entry-lane-proof-budget) - set_tests_properties(agc_shader_entry_lane_proof_budget PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_shader_bindless agc_shader_selected_records_image_limit agc_shader_selected_records_pair_limit agc_shader_selected_records_direct_image_limit agc_shader_selected_records_direct_pair_limit agc_shader_srt_read_patching agc_shader_type_zero_image_materialization agc_shader_frontend_pair agc_shader_frontend_pair_off agc_shader_layout_pair agc_shader_layout_pair_off agc_shader_result_memo_budget agc_shader_result_memo_budget_threads agc_shader_result_memo_budget_masked agc_shader_entry_lane_proof_budget PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() - foreach(agcTest IN ITEMS agc_vertex_input_tests agc_mesh_output_budget_tests agc_shared_write_tests agc_copy_guest_bytes_tests agc_locks_tests agc_driver_tests agc_shader_memory_tests agc_structurizer_tests agc_spirv_module_tests agc_dpp_write_tests agc_masked_select_tests agc_ir_reclaim_tests agc_vector_window_tests agc_constant_bit_test_tests agc_integer_narrowing_tests agc_scalar_select_mask_tests agc_vertex_input_validation_tests agc_vop1_control_decode_tests agc_validate_program_tests agc_pass_hazards_tests agc_barrier_batch_tests agc_shader_disk_cache_tests agc_screenshot_tests agc_shader_device_profile_tests agc_placeholder_images_tests agc_shader_control_flow_tests agc_driver_flip_tests agc_driver_pm4_tests agc_driver_graphics_tests agc_driver_bda_device_tests agc_driver_mesh_tests agc_driver_cmask_fast_clear_tests agc_formatted_buffer_once_tests agc_formatted_buffer_byte_stores_tests ${agcExecutionTests} agc_fma_mix_once_tests agc_f16_single_convert_tests) - if(agcTest STREQUAL "agc_driver_constant_store_tests" OR agcTest STREQUAL "agc_driver_flat_apertures_tests" OR agcTest STREQUAL "agc_driver_pipeline_optimized_readback_tests" OR agcTest STREQUAL "agc_driver_rcp_hardware_tests") - continue() - endif() - string(REGEX REPLACE "_tests$" "" agcTestName "${agcTest}") - set_target_properties(${agcTest} PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME ${agcTestName} COMMAND ${agcTest}) - set_tests_properties(${agcTestName} PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(agcTestName STREQUAL "agc_driver_image_table") - set_tests_properties(${agcTestName} PROPERTIES TIMEOUT 30 - FAIL_REGULAR_EXPRESSION "SYNC-HAZARD-|VUID-|was not found but was requested by env var VK_INSTANCE_LAYERS") - endif() - if(WIN32) - set_tests_properties(${agcTestName} PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - endforeach() - set_tests_properties(agc_driver_runtime_formatted_store PROPERTIES TIMEOUT 30) - foreach(mode IN ITEMS x1 x2 x3 x1_d16 x2_d16 x3_d16 x4_d16) - string(REGEX REPLACE "_d16$" "" components "${mode}") - set(arguments "--${components}") - if(mode MATCHES "_d16$") - list(APPEND arguments --d16) - endif() - add_test(NAME agc_driver_runtime_formatted_store_${mode} COMMAND agc_driver_runtime_formatted_store_tests ${arguments}) - set_tests_properties(agc_driver_runtime_formatted_store_${mode} PROPERTIES - ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_driver_runtime_formatted_store_${mode} PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - endforeach() - add_test(NAME agc_driver_job_manager_compute_capacity COMMAND agc_driver_job_manager_compute_tests barrier_capacity_overflow) - set_tests_properties(agc_driver_job_manager_compute_capacity PROPERTIES - ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 TIMEOUT 20 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_driver_job_manager_compute_capacity PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_guarded_direct_root COMMAND agc_driver_guarded_null_pointer_tests --direct-root-only) - set_tests_properties(agc_driver_guarded_direct_root PROPERTIES - ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_driver_guarded_direct_root PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_bda_device_selection_cpu COMMAND agc_driver_bda_device_tests --device-selection-cpu) - set_tests_properties(agc_driver_bda_device_selection_cpu PROPERTIES - ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_driver_bda_device_selection_cpu PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_draw_unsupported_buffer_type_skip_refused COMMAND agc_driver_draw_unsupported_buffer_type_tests --skip-refused) - set_tests_properties(agc_driver_draw_unsupported_buffer_type_skip_refused PROPERTIES - ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_SKIP_REFUSED_DRAWS=1" SKIP_RETURN_CODE 77 TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_driver_draw_unsupported_buffer_type_skip_refused PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_period_copy_no_hle COMMAND agc_driver_period_copy_tests) - set_tests_properties(agc_driver_period_copy_no_hle PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_COPY_HLE=1" SKIP_RETURN_CODE 77 TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_driver_period_copy_no_hle PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_sparse_indirect_indices_unreadable COMMAND agc_driver_sparse_indirect_indices_tests --unreadable) - add_test(NAME agc_driver_sparse_indirect_indices_no_size COMMAND agc_driver_sparse_indirect_indices_tests --no-size) - add_test(NAME agc_driver_sparse_indirect_indices_no_size_unreadable COMMAND agc_driver_sparse_indirect_indices_tests --no-size-unreadable) - add_test(NAME agc_driver_sparse_indirect_indices_no_size_unreadable_record COMMAND agc_driver_sparse_indirect_indices_tests --no-size-unreadable-record) - set_tests_properties(agc_driver_sparse_indirect_indices agc_driver_sparse_indirect_indices_unreadable agc_driver_sparse_indirect_indices_no_size agc_driver_sparse_indirect_indices_no_size_unreadable agc_driver_sparse_indirect_indices_no_size_unreadable_record PROPERTIES - ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_driver_sparse_indirect_indices_unreadable agc_driver_sparse_indirect_indices_no_size agc_driver_sparse_indirect_indices_no_size_unreadable agc_driver_sparse_indirect_indices_no_size_unreadable_record PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_draw_cache_relocation_recipe_verify COMMAND agc_driver_draw_cache_relocation_tests) - set_tests_properties(agc_driver_draw_cache_relocation_recipe_verify PROPERTIES - ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_VERIFY_DRAW_RECIPE=1;APS5_PIPELINED_DRAWS=0" SKIP_RETURN_CODE 77 TIMEOUT 60 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - add_test(NAME agc_driver_draw_cache_relocation_evicted COMMAND agc_driver_draw_cache_relocation_tests --evicted) - add_test(NAME agc_driver_draw_cache_relocation_kept COMMAND agc_driver_draw_cache_relocation_tests --kept) - set_tests_properties(agc_driver_draw_cache_relocation_evicted agc_driver_draw_cache_relocation_kept PROPERTIES - ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_DRAW_CACHE_ENTRIES=2" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_driver_draw_cache_relocation_recipe_verify agc_driver_draw_cache_relocation_evicted agc_driver_draw_cache_relocation_kept PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - set_tests_properties(agc_driver_pixel_implicit_derivatives PROPERTIES TIMEOUT 30) - set_tests_properties(agc_driver_storage_file_write PROPERTIES TIMEOUT 30 ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_SUSPEND_DRAIN=1") - set_tests_properties(agc_driver_clamped_global_fill PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_LABEL_READBACK_STORE=1") - set_tests_properties(agc_driver_draw_pipeline_trace PROPERTIES - ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_PIPELINED_DRAWS=8;APS5_TRACE_FRAMES=0:1;APS5_TRACE_EVENTS=64" TIMEOUT 30) - set_property(TEST agc_driver_draw_pipeline_trace APPEND PROPERTY ENVIRONMENT_MODIFICATION - "APS5_TRACE_SECONDS=unset:" "APS5_TRACE_SUMMARY_EVERY=unset:") - add_test(NAME agc_driver_draw_pipeline_trace_disabled COMMAND ${CMAKE_COMMAND} -E env - --unset=APS5_TRACE_FRAMES --unset=APS5_TRACE_SECONDS --unset=APS5_TRACE_SUMMARY_EVERY - $ disabled) - set_tests_properties(agc_driver_draw_pipeline_trace_disabled PROPERTIES ENVIRONMENT "APS5_PIPELINED_DRAWS=8" SKIP_RETURN_CODE 77 TIMEOUT 30) - add_test(NAME agc_driver_draw_finisher_trace COMMAND agc_driver_draw_pipeline_trace_tests finisher) - set_tests_properties(agc_driver_draw_finisher_trace PROPERTIES - ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_DRAW_PIPELINE=1;APS5_PIPELINED_DRAWS=8;APS5_TRACE_FRAMES=0:1;APS5_TRACE_EVENTS=64" SKIP_RETURN_CODE 77 TIMEOUT 30) - set_property(TEST agc_driver_draw_finisher_trace APPEND PROPERTY ENVIRONMENT_MODIFICATION - "APS5_TRACE_SECONDS=unset:" "APS5_TRACE_SUMMARY_EVERY=unset:") - add_test(NAME agc_driver_draw_finisher_trace_disabled COMMAND ${CMAKE_COMMAND} -E env - --unset=APS5_TRACE_FRAMES --unset=APS5_TRACE_SECONDS --unset=APS5_TRACE_SUMMARY_EVERY - $ finisher-disabled) - set_tests_properties(agc_driver_draw_finisher_trace_disabled PROPERTIES ENVIRONMENT "APS5_DRAW_PIPELINE=1;APS5_PIPELINED_DRAWS=8" SKIP_RETURN_CODE 77 TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_driver_draw_pipeline_trace_disabled agc_driver_draw_finisher_trace agc_driver_draw_finisher_trace_disabled PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_copied_writer_label_order_drain COMMAND agc_driver_copied_writer_label_order_tests) - set_tests_properties(agc_driver_copied_writer_label_order_drain PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_DRAIN_COMPLETION_LABELS=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_driver_copied_writer_label_order_drain PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_lazy_resolved_abi_switch_set COMMAND agc_driver_lazy_resolved_abi_tests) - set_tests_properties(agc_driver_lazy_resolved_abi_switch_set PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_LAZY_SHADER_PREPARE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_driver_lazy_resolved_abi_switch_set PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() - set_tests_properties(agc_driver_queued_raw_shader PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_PIPELINED_DRAWS=8" TIMEOUT 30) - set(agcDrawPipelineTests agc_driver_draw_write_ranges agc_driver_draw_unsupported_buffer_type agc_driver_bda_span_reads agc_driver_copied_writer_copy agc_driver_image_table_reuse agc_driver_depth_storage_reuse agc_driver_staged_clear_sampled_read agc_driver_storage_write_back_overhang agc_driver_write_data_written_ahead agc_driver_gated_dispatch_capture agc_driver_buffer_load_store agc_driver_pipelined_dma agc_driver_pipelined_fill agc_driver_pipelined_predication_read agc_driver_pipelined_predicated_label_order agc_driver_pipelined_metadata_pass agc_driver_draw_cache_reuse agc_driver_draw_cache_relocation agc_driver_draw_data_hit_user_words agc_driver_finisher_label_order agc_driver_same_queue_label_wait agc_driver_unimported_label_order) - foreach(agcTestName IN LISTS agcDrawPipelineTests) - add_test(NAME ${agcTestName}_draw_pipeline COMMAND ${agcTestName}_tests) - set_tests_properties(${agcTestName}_draw_pipeline PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_DRAW_PIPELINE=1;APS5_PIPELINED_DRAWS=32;APS5_PIPELINE_DISPATCH=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(${agcTestName}_draw_pipeline PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() - endforeach() - add_test(NAME agc_driver_partially_resident_pending_stores COMMAND agc_driver_partially_resident_snapshot_tests --pending-stores) - set_tests_properties(agc_driver_multisample_readback PROPERTIES TIMEOUT 20) - foreach(agcReadbackCase IN ITEMS uint8 uint16 uint64 uint128 depth upload retile depth_retile) - add_test(NAME agc_driver_multisample_readback_${agcReadbackCase} COMMAND agc_driver_multisample_readback_tests ${agcReadbackCase}) - set_tests_properties(agc_driver_multisample_readback_${agcReadbackCase} PROPERTIES TIMEOUT 20 ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_driver_multisample_readback_${agcReadbackCase} PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - endforeach() - set_tests_properties(agc_driver_partially_resident_pending_stores PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_driver_partially_resident_pending_stores PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_shader_disk_cache_pack_ownership COMMAND agc_shader_disk_cache_tests --prebuilt-pack-ownership) - set_tests_properties(agc_shader_disk_cache_pack_ownership PROPERTIES TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_shader_disk_cache_pack_ownership PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_shader_disk_cache_large_file COMMAND agc_shader_disk_cache_tests --large-file) if(Python3_Interpreter_FOUND) set(housekeepingModes plain) if(WIN32) @@ -3045,16 +683,6 @@ if(BUILD_TESTING) endif() endforeach() endif() - set_tests_properties(agc_shader_disk_cache_large_file PROPERTIES SKIP_RETURN_CODE 77 RUN_SERIAL TRUE WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 240) - if(WIN32) - set_tests_properties(agc_shader_disk_cache_large_file PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - add_test(NAME agc_shader_disk_cache_long_paths COMMAND agc_shader_disk_cache_tests --long-host-paths) - add_test(NAME agc_shader_disk_cache_host_stderr COMMAND agc_shader_disk_cache_tests --host-stderr) - set_tests_properties(agc_shader_disk_cache_host_stderr PROPERTIES TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" - ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - set_tests_properties(agc_shader_disk_cache_long_paths PROPERTIES TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" - ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() if(Python3_Interpreter_FOUND) set(prebuiltDiscoveryModes plain relative plain-long) if(WIN32) @@ -3071,271 +699,7 @@ if(BUILD_TESTING) endif() endforeach() endif() - add_test(NAME agc_driver_large_tracked_snapshot COMMAND agc_driver_partially_resident_snapshot_tests --large-tracked) - set_tests_properties(agc_driver_large_tracked_snapshot PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_driver_large_tracked_snapshot PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() - set_tests_properties(agc_driver_copy_surface_bytes PROPERTIES TIMEOUT 30 ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_SUSPEND_DRAIN=1") - set_property(TEST agc_driver_copy_surface_bytes APPEND PROPERTY ENVIRONMENT_MODIFICATION "APS5_NO_COPY_ALIAS=unset:") - add_test(NAME agc_driver_copy_surface_bytes_no_alias COMMAND agc_driver_copy_surface_bytes_tests) - set_tests_properties(agc_driver_copy_surface_bytes_no_alias PROPERTIES TIMEOUT 30 SKIP_RETURN_CODE 77 - WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_SUSPEND_DRAIN=1;APS5_NO_COPY_ALIAS=1") - if(WIN32) - set_tests_properties(agc_driver_copy_surface_bytes_no_alias PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - if(WIN32) - add_test(NAME agc_driver_untracked_snapshot_hint COMMAND agc_driver_partially_resident_snapshot_tests --untracked-hint) - set_tests_properties(agc_driver_untracked_snapshot_hint PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 30 - ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - add_test(NAME agc_driver_compared_shared_snapshot COMMAND agc_driver_partially_resident_snapshot_tests --compared-shared) - set_tests_properties(agc_driver_compared_shared_snapshot PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 30 - ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() - set_tests_properties(agc_driver_registration_trace PROPERTIES - ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_TRACE_FRAMES=0:1;APS5_TRACE_EVENTS=64" TIMEOUT 30) - set_property(TEST agc_driver_registration_trace APPEND PROPERTY ENVIRONMENT_MODIFICATION - "APS5_TRACE_SECONDS=unset:" "APS5_TRACE_SUMMARY_EVERY=unset:") - add_test(NAME agc_driver_registration_trace_disabled COMMAND ${CMAKE_COMMAND} -E env - --unset=APS5_TRACE_FRAMES --unset=APS5_TRACE_SECONDS --unset=APS5_TRACE_SUMMARY_EVERY - $ disabled) - set_tests_properties(agc_driver_registration_trace_disabled PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_driver_registration_trace_disabled PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_sparse_buffer_holes COMMAND agc_driver_graphics_tests --sparse-buffer-holes) - add_test(NAME agc_copy_input_kept_bytes COMMAND agc_driver_graphics_tests --copy-input-kept-bytes) - add_test(NAME agc_depth_copy_kept_bytes COMMAND agc_driver_graphics_tests --depth-copy-kept-bytes) - set_tests_properties(agc_copy_input_kept_bytes agc_depth_copy_kept_bytes PROPERTIES - TIMEOUT 30 ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" - ENVIRONMENT_MODIFICATION "APS5_CPU_COPIES=unset:;APS5_GPU_COPY_MAX_KIB=unset:;APS5_CAPTURE_GPU_COPIES=unset:;APS5_BUFFER_POOL_SLOTS=unset:;APS5_BUFFER_POOL_SHARED=unset:;APS5_NO_BUFFER_CLASSES=unset:;APS5_STAGING_POOL_MIB=unset:") - if(WIN32) - set_property(TEST agc_copy_input_kept_bytes APPEND PROPERTY ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - set_property(TEST agc_depth_copy_kept_bytes APPEND PROPERTY ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - set_tests_properties(agc_driver_native_multisample_depth PROPERTIES TIMEOUT 30) - set_tests_properties(agc_driver_sample_order PROPERTIES TIMEOUT 30) - add_test(NAME agc_driver_sample_order_grid_reference COMMAND agc_driver_sample_order_tests --grid-reference) - add_test(NAME agc_driver_sample_order_recipe_depth_locations COMMAND agc_driver_sample_order_tests --recipe-depth-locations) - set_tests_properties(agc_driver_sample_order_grid_reference agc_driver_sample_order_recipe_depth_locations PROPERTIES TIMEOUT 30 ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_driver_sample_order_grid_reference agc_driver_sample_order_recipe_depth_locations PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_native_depth_retirement COMMAND agc_driver_native_multisample_depth_tests --retirement) - set_tests_properties(agc_driver_native_depth_retirement PROPERTIES TIMEOUT 30 ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - add_test(NAME agc_driver_native_depth_clears COMMAND agc_driver_native_multisample_depth_tests --clears) - add_test(NAME agc_driver_native_depth_clear_refusals COMMAND agc_driver_native_multisample_depth_tests --clear-refusals) - set_tests_properties(agc_driver_native_depth_clears agc_driver_native_depth_clear_refusals PROPERTIES TIMEOUT 30 ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_driver_native_depth_retirement PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - set_tests_properties(agc_driver_native_depth_clears agc_driver_native_depth_clear_refusals PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() - set_tests_properties(agc_sparse_buffer_holes PROPERTIES TIMEOUT 30) - add_test(NAME agc_pipeline_journal COMMAND agc_driver_graphics_tests --pipeline-journal) - add_test(NAME agc_pipeline_journal_long_paths COMMAND agc_driver_graphics_tests --pipeline-journal-long-paths) - set_tests_properties(agc_pipeline_journal_long_paths PROPERTIES TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - add_test(NAME agc_pipeline_library_clear_waits_for_build COMMAND agc_driver_graphics_tests --pipeline-library-clear-waits-for-build) - add_test(NAME agc_pipeline_store_lazy_buffer_pool COMMAND agc_driver_graphics_tests --pipeline-store-lazy-buffer-pool) - add_test(NAME agc_pipeline_store_touch COMMAND agc_driver_graphics_tests --pipeline-store-touch) - add_test(NAME agc_pipeline_store_growth COMMAND agc_driver_graphics_tests --pipeline-store-growth) - add_test(NAME agc_pipeline_store_fixed_bound COMMAND agc_driver_graphics_tests --pipeline-store-growth) - add_test(NAME agc_pipeline_store_replay_growth COMMAND agc_driver_graphics_tests --pipeline-store-replay-growth) - set_tests_properties(agc_pipeline_store_growth agc_pipeline_store_fixed_bound agc_pipeline_store_replay_growth PROPERTIES TIMEOUT 60 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - set_tests_properties(agc_pipeline_store_fixed_bound PROPERTIES ENVIRONMENT "APS5_PIPELINE_STORE_ENTRIES=1024") - set_tests_properties(agc_pipeline_journal PROPERTIES TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - set_tests_properties(agc_pipeline_library_clear_waits_for_build PROPERTIES TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - set_tests_properties(agc_pipeline_store_lazy_buffer_pool agc_pipeline_store_touch PROPERTIES TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - add_test(NAME agc_pipeline_journal_extended_paths COMMAND agc_driver_graphics_tests --pipeline-journal-extended-paths) - set_tests_properties(agc_pipeline_journal_extended_paths PROPERTIES TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - set_tests_properties(agc_pipeline_journal_long_paths agc_pipeline_journal_extended_paths PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - set_tests_properties(agc_pipeline_journal agc_pipeline_library_clear_waits_for_build agc_pipeline_store_lazy_buffer_pool agc_pipeline_store_touch agc_pipeline_store_growth agc_pipeline_store_fixed_bound agc_pipeline_store_replay_growth PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() - set_tests_properties(agc_driver_sparse_buffer_holes PROPERTIES TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_sparse_buffer_holes PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_heap_mirror_unwatch COMMAND agc_driver_graphics_tests --heap-mirror-unwatch) - add_test(NAME agc_heap_mirror_unwatch_no_space_cache COMMAND agc_driver_graphics_tests --heap-mirror-unwatch) - add_test(NAME agc_sparse_heap_mirror_unwatch COMMAND agc_driver_graphics_tests --sparse-heap-mirror-unwatch) - add_test(NAME agc_sparse_heap_mirror_unwatch_no_space_cache COMMAND agc_driver_graphics_tests --sparse-heap-mirror-unwatch) - add_test(NAME agc_sparse_heap_mirror_budget COMMAND agc_driver_graphics_tests --sparse-heap-mirror-budget) - add_test(NAME agc_heap_mirror_run_unwatch COMMAND agc_driver_graphics_tests --heap-mirror-run-unwatch) - add_test(NAME agc_heap_mirror_run_unwatch_no_space_cache COMMAND agc_driver_graphics_tests --heap-mirror-run-unwatch) - set_tests_properties(agc_heap_mirror_unwatch_no_space_cache agc_sparse_heap_mirror_unwatch_no_space_cache agc_heap_mirror_run_unwatch_no_space_cache PROPERTIES ENVIRONMENT "APS5_NO_ADDRESS_SPACE_CACHE=1") - set_tests_properties(agc_heap_mirror_unwatch agc_heap_mirror_unwatch_no_space_cache agc_sparse_heap_mirror_unwatch agc_sparse_heap_mirror_unwatch_no_space_cache agc_heap_mirror_run_unwatch agc_heap_mirror_run_unwatch_no_space_cache agc_sparse_heap_mirror_budget PROPERTIES TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_heap_mirror_unwatch agc_heap_mirror_unwatch_no_space_cache agc_sparse_heap_mirror_unwatch agc_sparse_heap_mirror_unwatch_no_space_cache agc_heap_mirror_run_unwatch agc_heap_mirror_run_unwatch_no_space_cache agc_sparse_heap_mirror_budget PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - else() - add_test(NAME agc_heap_mirror_unwatched_import COMMAND agc_driver_graphics_tests --heap-mirror-unwatched-import) - set_tests_properties(agc_heap_mirror_unwatched_import PROPERTIES TIMEOUT 30) - endif() - add_test(NAME agc_driver_lds_lock_budget COMMAND agc_driver_lds_mixed_width_atomics_tests --lock-budget) - set_tests_properties(agc_driver_lds_lock_budget PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_driver_lds_lock_budget PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_address_copy_cap COMMAND agc_driver_graphics_tests --address-copy-cap) - add_test(NAME agc_address_copy_cap_remembered COMMAND agc_driver_graphics_tests --address-copy-cap-remembered) - add_test(NAME agc_address_copy_cap_mirror COMMAND agc_driver_graphics_tests --address-copy-cap-mirror) - add_test(NAME agc_address_space_unwatched_mirror_import COMMAND agc_driver_graphics_tests --unwatched-mirror-import) - set_tests_properties(agc_address_copy_cap agc_address_copy_cap_remembered agc_address_copy_cap_mirror agc_address_space_unwatched_mirror_import PROPERTIES TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_address_copy_cap agc_address_copy_cap_remembered agc_address_copy_cap_mirror agc_address_space_unwatched_mirror_import PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_emulated_color_compare_srgb_decode COMMAND agc_driver_emulated_color_compare_tests) - set_tests_properties(agc_driver_emulated_color_compare_srgb_decode PROPERTIES - ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_SRGB_SHADER_DECODE=1" - SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - set_tests_properties(agc_driver_emulated_color_compare agc_driver_emulated_color_compare_srgb_decode PROPERTIES TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_driver_emulated_color_compare_srgb_decode PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_image_srgb_sample_copy_forced COMMAND agc_driver_image_srgb_sample_copy_tests) - set_tests_properties(agc_driver_image_srgb_sample_copy_forced PROPERTIES - ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_SRGB_SHADER_DECODE=copy" - SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_driver_image_srgb_sample_copy_forced PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - if(CMAKE_SYSTEM_NAME STREQUAL "Linux") - add_test(NAME agc_driver_graphics_maps_fallback COMMAND agc_driver_graphics_tests) - set_tests_properties(agc_driver_graphics_maps_fallback PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_PROCMAP_QUERY=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - endif() - add_test(NAME agc_shared_write_partial_collect COMMAND agc_shared_write_tests --partial-collect) - set_tests_properties(agc_shared_write_partial_collect PROPERTIES SKIP_RETURN_CODE 77 ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 30) - if(WIN32) - add_test(NAME agc_shared_write_partial_collect_two_pass COMMAND agc_shared_write_tests --partial-collect) - set_tests_properties(agc_shared_write_partial_collect_two_pass PROPERTIES SKIP_RETURN_CODE 77 ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_SINGLE_PASS_COLLECT=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 30) - set_tests_properties(agc_shared_write_partial_collect agc_shared_write_partial_collect_two_pass PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - set_target_properties(agc_driver_pipeline_optimized_readback_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - foreach(pipelineReadbackCase IN ITEMS d32 d16 color32 color64) - foreach(pipelineReadbackMode IN ITEMS default fast) - set(pipelineReadbackTest agc_driver_pipeline_optimized_readback_${pipelineReadbackCase}) - set(pipelineReadbackEnvironment "ANYPS5_NO_SHADER_CACHE=1") - if(pipelineReadbackMode STREQUAL "fast") - string(APPEND pipelineReadbackTest "_fast") - list(APPEND pipelineReadbackEnvironment "APS5_NO_PIPELINE_LTO=1") - endif() - add_test(NAME ${pipelineReadbackTest} COMMAND agc_driver_pipeline_optimized_readback_tests ${pipelineReadbackCase}) - set_tests_properties(${pipelineReadbackTest} PROPERTIES ENVIRONMENT "${pipelineReadbackEnvironment}" SKIP_RETURN_CODE 77 TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(${pipelineReadbackTest} PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() - endforeach() - endforeach() - add_test(NAME agc_vector_window_stage_inputs COMMAND agc_vector_window_tests --stage-inputs-only) - set_tests_properties(agc_vector_window_stage_inputs PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - set_tests_properties(agc_vector_window_stage_inputs agc_driver_relative_stage_inputs PROPERTIES TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_vector_window_stage_inputs PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_layered_volume_vertex COMMAND agc_driver_layered_volume_draw_tests --vertex-only) - add_test(NAME agc_driver_layered_volume_vertex_no_gpl COMMAND agc_driver_layered_volume_draw_tests --vertex-only) - set_tests_properties(agc_driver_layered_volume_vertex agc_driver_layered_volume_vertex_no_gpl PROPERTIES - ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - set_property(TEST agc_driver_layered_volume_vertex_no_gpl APPEND PROPERTY ENVIRONMENT "APS5_NO_GPL=1") - if(WIN32) - set_tests_properties(agc_driver_layered_volume_vertex agc_driver_layered_volume_vertex_no_gpl PROPERTIES - ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_f64_denorm_preserve_spirv COMMAND agc_driver_f64_fma_subnormals_tests --verify-spv-denorm-mode) - set_tests_properties(agc_driver_f64_denorm_preserve_spirv PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_driver_f64_denorm_preserve_spirv PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_volume_direct_readback COMMAND agc_driver_layered_volume_draw_tests) - set_tests_properties(agc_driver_volume_direct_readback PROPERTIES - ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_TEST_DIRECT_READBACK=1" SKIP_RETURN_CODE 77 TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}") - if(WIN32) - set_tests_properties(agc_driver_volume_direct_readback PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_f16_to_f32_unpack_spirv COMMAND agc_driver_f16_to_f32_unpack_tests --verify-spirv) - set_tests_properties(agc_driver_f16_to_f32_unpack_spirv PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_driver_f16_to_f32_unpack_spirv PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() - set(agcDrawShaderFailureTraceDirectory ${CMAKE_CURRENT_BINARY_DIR}/draw_shader_failure_tests) - file(MAKE_DIRECTORY "${agcDrawShaderFailureTraceDirectory}/failure") - file(MAKE_DIRECTORY "${agcDrawShaderFailureTraceDirectory}/success") - file(MAKE_DIRECTORY "${agcDrawShaderFailureTraceDirectory}/disabled") - file(MAKE_DIRECTORY "${agcDrawShaderFailureTraceDirectory}/failure_correlation_disabled") - set_tests_properties(agc_driver_draw_shader_failure PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_CAPTURE_TRACE=1;APS5_TRACE_SHADER_CORRELATION=1;APS5_CAPTURE_TRACE_PATH=${agcDrawShaderFailureTraceDirectory}/failure/trace.log" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - add_test(NAME agc_driver_draw_shader_failure_successful COMMAND agc_driver_draw_shader_failure_tests successful-draw) - set_tests_properties(agc_driver_draw_shader_failure_successful PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_CAPTURE_TRACE=1;APS5_TRACE_SHADER_CORRELATION=1;APS5_CAPTURE_TRACE_PATH=${agcDrawShaderFailureTraceDirectory}/success/trace.log" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - add_test(NAME agc_driver_draw_shader_failure_correlation_disabled COMMAND agc_driver_draw_shader_failure_tests disabled-correlation) - set_tests_properties(agc_driver_draw_shader_failure_correlation_disabled PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_CAPTURE_TRACE=1;APS5_CAPTURE_TRACE_PATH=${agcDrawShaderFailureTraceDirectory}/disabled/trace.log" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - add_test(NAME agc_driver_draw_shader_failure_request_correlation_disabled COMMAND agc_driver_draw_shader_failure_tests request-failure-correlation-disabled) - set_tests_properties(agc_driver_draw_shader_failure_request_correlation_disabled PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_CAPTURE_TRACE=1;APS5_CAPTURE_TRACE_PATH=${agcDrawShaderFailureTraceDirectory}/failure_correlation_disabled/trace.log" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - file(MAKE_DIRECTORY "${agcDrawShaderFailureTraceDirectory}/materialization") - file(MAKE_DIRECTORY "${agcDrawShaderFailureTraceDirectory}/materialization_correlation_disabled") - add_test(NAME agc_driver_draw_shader_failure_materialization COMMAND agc_driver_draw_shader_failure_tests materialization-failure) - set_tests_properties(agc_driver_draw_shader_failure_materialization PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_CAPTURE_TRACE=1;APS5_TRACE_SHADER_CORRELATION=1;APS5_CAPTURE_TRACE_PATH=${agcDrawShaderFailureTraceDirectory}/materialization/trace.log" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - add_test(NAME agc_driver_draw_shader_failure_materialization_correlation_disabled COMMAND agc_driver_draw_shader_failure_tests materialization-failure-correlation-disabled) - set_tests_properties(agc_driver_draw_shader_failure_materialization_correlation_disabled PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_CAPTURE_TRACE=1;APS5_CAPTURE_TRACE_PATH=${agcDrawShaderFailureTraceDirectory}/materialization_correlation_disabled/trace.log" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_driver_draw_shader_failure agc_driver_draw_shader_failure_successful agc_driver_draw_shader_failure_correlation_disabled agc_driver_draw_shader_failure_request_correlation_disabled agc_driver_draw_shader_failure_materialization agc_driver_draw_shader_failure_materialization_correlation_disabled PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_structurizer_intersection_off COMMAND agc_structurizer_tests) - set_tests_properties(agc_structurizer_intersection_off PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_PERF_DOM_INTERSECTION=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - add_test(NAME agc_structurizer_iteration_selection_off COMMAND agc_structurizer_tests) - set_tests_properties(agc_structurizer_iteration_selection_off PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_PERF_ITERATION_SELECTION=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - add_test(NAME agc_shader_control_flow_iteration_selection_off COMMAND agc_shader_control_flow_tests) - set_tests_properties(agc_shader_control_flow_iteration_selection_off PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_PERF_ITERATION_SELECTION=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - add_test(NAME agc_structurizer_dominator_tree_off COMMAND agc_structurizer_tests) - set_tests_properties(agc_structurizer_dominator_tree_off PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_PERF_DOMINATOR_TREE=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - add_test(NAME agc_shader_control_flow_dominator_tree_off COMMAND agc_shader_control_flow_tests) - set_tests_properties(agc_shader_control_flow_dominator_tree_off PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_PERF_DOMINATOR_TREE=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - add_test(NAME agc_structurizer_forced_fallback COMMAND agc_structurizer_tests) - set_tests_properties(agc_structurizer_forced_fallback PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_FORCE_STRUCTURIZER_FALLBACK=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - add_test(NAME agc_shader_control_flow_forced_fallback COMMAND agc_shader_control_flow_tests) - set_tests_properties(agc_shader_control_flow_forced_fallback PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_FORCE_STRUCTURIZER_FALLBACK=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_structurizer_intersection_off agc_structurizer_iteration_selection_off agc_shader_control_flow_iteration_selection_off agc_structurizer_dominator_tree_off agc_shader_control_flow_dominator_tree_off agc_structurizer_forced_fallback agc_shader_control_flow_forced_fallback PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_gated_dispatch_capture_short_timeout COMMAND agc_driver_gated_dispatch_capture_tests) - set_tests_properties(agc_driver_gated_dispatch_capture_short_timeout PROPERTIES - ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_GPU_WAIT_TIMEOUT_MS=1;APS5_NO_PIPELINE_LTO=1" - SKIP_RETURN_CODE 77 TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_driver_gated_dispatch_capture_short_timeout PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - set_tests_properties(agc_driver_provoking_vertex PROPERTIES TIMEOUT 30) - add_test(NAME agc_driver_dword_pattern_fill_translated COMMAND agc_driver_dword_pattern_fill_tests) - set_tests_properties(agc_driver_dword_pattern_fill_translated PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_FILL_HLE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_driver_dword_pattern_fill_translated PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_uint8x4_color_target_no_resident COMMAND agc_driver_uint8x4_color_target_tests) - set_tests_properties(agc_driver_uint8x4_color_target_no_resident PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_RESIDENT_TARGETS=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_driver_uint8x4_color_target_no_resident PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - set(agcGuestMemoryLifetimeTests agc_driver_guest_memory_lifetime) - foreach(mode IN ITEMS copy direct locked heap heap_uncached) - set(testName agc_driver_guest_memory_lifetime_${mode}) - if(mode STREQUAL "heap_uncached") - add_test(NAME ${testName} COMMAND agc_driver_guest_memory_lifetime_tests heap) - else() - add_test(NAME ${testName} COMMAND agc_driver_guest_memory_lifetime_tests ${mode}) - endif() - list(APPEND agcGuestMemoryLifetimeTests ${testName}) - endforeach() set_tests_properties(${agcGuestMemoryLifetimeTests} PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_PIN_WAIT_MS=1000;APS5_HEAP_CACHE_MIB=4" SKIP_RETURN_CODE 77 TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") @@ -3357,225 +721,8 @@ if(BUILD_TESTING) set_target_properties(agc_guest_memory_lifetime_fixture PROPERTIES OUTPUT_NAME GuestMemoryFixture SUFFIX ".prx" CXX_EXTENSIONS OFF BUILD_WITH_INSTALL_RPATH TRUE INSTALL_RPATH "$ORIGIN") - add_test(NAME agc_driver_guest_memory_lifetime_converted COMMAND ${Python3_EXECUTABLE} - ${CMAKE_CURRENT_SOURCE_DIR}/tests/test_guest_memory_lifetime.py - ${CMAKE_SOURCE_DIR}/core/relinker/relinker/tests - $ - $ - $ - $ - $) - set_tests_properties(agc_driver_guest_memory_lifetime_converted PROPERTIES - ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_PIN_WAIT_MS=1000" SKIP_RETURN_CODE 77 TIMEOUT 30) - add_asan_test_options(agc_driver_guest_memory_lifetime_converted verify_asan_link_order=0) - endif() - set_tests_properties(agc_driver_flat_store PROPERTIES RUN_SERIAL TRUE) - set_target_properties(agc_driver_flat_apertures_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - foreach(flatAperturesPart RANGE 13) - add_test(NAME agc_driver_flat_apertures_${flatAperturesPart} COMMAND agc_driver_flat_apertures_tests --part ${flatAperturesPart}/14) - set_tests_properties(agc_driver_flat_apertures_${flatAperturesPart} PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_driver_flat_apertures_${flatAperturesPart} PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - endforeach() - set_tests_properties(agc_driver_storage_cache_budget PROPERTIES TIMEOUT 30) - add_test(NAME agc_driver_storage_cache_retained_batch COMMAND agc_driver_storage_cache_budget_tests --retained-batch) - set_tests_properties(agc_driver_storage_cache_retained_batch PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_driver_storage_cache_retained_batch PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_sampled_cache_budget_memory COMMAND agc_driver_sampled_cache_budget_tests memory) - set_tests_properties(agc_driver_sampled_cache_budget_memory PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77) - add_test(NAME agc_driver_sampled_cache_budget_without_storage_image_multisample COMMAND agc_driver_sampled_cache_budget_tests without-storage-image-multisample) - set_tests_properties(agc_driver_sampled_cache_budget_without_storage_image_multisample PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 TIMEOUT 30) - add_test(NAME agc_sampled_cache_device_selection COMMAND agc_driver_sampled_cache_budget_tests device-selection-cpu) - set_tests_properties(agc_sampled_cache_device_selection PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) - add_test(NAME agc_driver_sampled_cache_device_selection COMMAND agc_driver_sampled_cache_budget_tests device-selection) - set_tests_properties(agc_driver_sampled_cache_device_selection PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_sampled_cache_device_selection agc_driver_sampled_cache_device_selection PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - foreach(imageRecoveryMode IN ITEMS sampled storage srgb repack) - add_test(NAME agc_driver_recover_${imageRecoveryMode}_allocation COMMAND agc_driver_sampled_cache_budget_tests recover-${imageRecoveryMode}) - set_tests_properties(agc_driver_recover_${imageRecoveryMode}_allocation PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_driver_recover_${imageRecoveryMode}_allocation PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - endforeach() - set_property(TEST agc_driver_recover_srgb_allocation APPEND PROPERTY ENVIRONMENT_MODIFICATION "APS5_SRGB_SHADER_DECODE=set:copy") - add_test(NAME agc_driver_resource_cache_storage_admission COMMAND agc_driver_sampled_cache_budget_tests resource-admission) - add_test(NAME agc_driver_resource_cache_oversized_storage_admission COMMAND agc_driver_sampled_cache_budget_tests resource-oversized) - add_test(NAME agc_driver_resource_cache_storage_clear COMMAND agc_driver_sampled_cache_budget_tests resource-clear) - add_test(NAME agc_driver_resource_cache_replaced_texture COMMAND agc_driver_sampled_cache_budget_tests resource-replaced) - add_test(NAME agc_driver_resource_cache_lookup_changed COMMAND agc_driver_sampled_cache_budget_tests resource-lookup-changed) - add_test(NAME agc_driver_resource_cache_collect_refusals COMMAND agc_driver_sampled_cache_budget_tests collect-refusals) - set_tests_properties(agc_driver_resource_cache_storage_admission agc_driver_resource_cache_oversized_storage_admission agc_driver_resource_cache_storage_clear agc_driver_resource_cache_replaced_texture agc_driver_resource_cache_lookup_changed agc_driver_resource_cache_collect_refusals PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_driver_sampled_cache_budget_memory agc_driver_sampled_cache_budget_without_storage_image_multisample agc_driver_resource_cache_storage_admission agc_driver_resource_cache_oversized_storage_admission agc_driver_resource_cache_storage_clear agc_driver_resource_cache_replaced_texture agc_driver_resource_cache_lookup_changed agc_driver_resource_cache_collect_refusals PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - # The driver draw test again with the draw key off: the draw cache then keys on the decoded vertex - # stage, which must include PA_CL_VS_OUT_CNTL. - add_test(NAME agc_driver_vertex_clip_cull_draw_no_key COMMAND agc_driver_vertex_clip_cull_draw_tests no-key) - set_tests_properties(agc_driver_vertex_clip_cull_draw_no_key PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_DRAW_KEY=1" SKIP_RETURN_CODE 77) - if(WIN32) - set_tests_properties(agc_driver_vertex_clip_cull_draw_no_key PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_pm4_failure COMMAND agc_driver_pm4_tests failure) - set_tests_properties(agc_driver_pm4_failure PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 TIMEOUT 30) - set(pm4RingCases "ring|APS5_PM4_RING=4" "ring-empty|APS5_PM4_RING=16" "ring-disabled|APS5_PM4_RING=0" "ring-invalid|APS5_PM4_RING=4x" "ring-report|APS5_PM4_RING=2" "stall-watchdog|APS5_STALL_WATCHDOG_SECS=1" - "stall-watchdog-invalid|APS5_STALL_WATCHDOG_SECS=1x" "stall-watchdog-rewind|APS5_STALL_WATCHDOG_SECS=1" "stall-watchdog-order|APS5_STALL_WATCHDOG_SECS=1") - if(WIN32) - list(APPEND pm4RingCases "ring-report-heap|APS5_PM4_RING=2") - endif() - foreach(pm4RingCase IN LISTS pm4RingCases) - string(REPLACE "|" ";" pm4RingCase "${pm4RingCase}") - list(GET pm4RingCase 0 pm4RingMode) - list(GET pm4RingCase 1 pm4RingEnvironment) - string(REPLACE "-" "_" pm4RingTest "agc_driver_pm4_${pm4RingMode}") - add_test(NAME ${pm4RingTest} COMMAND agc_driver_pm4_tests ${pm4RingMode}) - set_tests_properties(${pm4RingTest} PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;${pm4RingEnvironment}" SKIP_RETURN_CODE 77 TIMEOUT 30) - if(WIN32) - set_tests_properties(${pm4RingTest} PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - endforeach() - add_test(NAME agc_descriptor_pool_reset_failure COMMAND agc_driver_graphics_tests --descriptor-pool-reset-failure) - add_test(NAME agc_descriptor_cache COMMAND agc_driver_graphics_tests --descriptor-cache) - add_test(NAME agc_driver_address_space_teardown COMMAND agc_driver_graphics_tests --address-space-teardown) - set_tests_properties(agc_driver_address_space_teardown PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - add_test(NAME agc_driver_pm4_rewind_trace COMMAND agc_driver_pm4_tests rewind-trace) - set_tests_properties(agc_driver_pm4_rewind_trace PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_PIPELINED_DRAWS=8;APS5_TRACE_FRAMES=0:1;APS5_TRACE_DIR=${CMAKE_CURRENT_BINARY_DIR}/pm4-rewind-trace" TIMEOUT 30) - set_property(TEST agc_driver_pm4_rewind_trace APPEND PROPERTY ENVIRONMENT_MODIFICATION - "APS5_TRACE_SECONDS=unset:" "APS5_TRACE_SUMMARY_EVERY=unset:") - if(WIN32) - set_property(TEST agc_driver_pm4_rewind_trace APPEND PROPERTY ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_pm4_failure_inline COMMAND agc_driver_pm4_tests failure) - set_tests_properties(agc_driver_pm4_failure_inline PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_PIPELINED_DRAWS=0" SKIP_RETURN_CODE 77) - if(WIN32) - set_tests_properties(agc_driver_pm4_failure agc_driver_pm4_failure_inline agc_descriptor_pool_reset_failure agc_descriptor_cache agc_driver_address_space_teardown PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - if(CMAKE_SYSTEM_NAME STREQUAL "Linux") - add_test(NAME agc_driver_pm4_priority_refused COMMAND agc_driver_pm4_tests priority-refused) - set_tests_properties(agc_driver_pm4_priority_refused PROPERTIES ENVIRONMENT - "ANYPS5_NO_SHADER_CACHE=1;APS5_THREAD_PRIORITY=high;DBUS_SYSTEM_BUS_ADDRESS=unix:path=/nonexistent/aps5-no-rtkit" SKIP_RETURN_CODE 77) - endif() - add_test(NAME agc_driver_present_mode COMMAND agc_driver_flip_tests present-mode) - add_test(NAME agc_driver_worker_failure_log COMMAND agc_driver_flip_tests failure-log) - set_tests_properties(agc_driver_worker_failure_log PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 TIMEOUT 20) - add_test(NAME agc_driver_flip_compute COMMAND agc_driver_flip_tests compute) - set_tests_properties(agc_driver_flip_compute PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77) - if(WIN32) - set_tests_properties(agc_driver_flip_compute agc_driver_present_mode agc_driver_worker_failure_log PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_linear_readback_label_off COMMAND agc_driver_linear_readback_label_tests) - set_tests_properties(agc_driver_linear_readback_label_off PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_LABEL_READBACK_STORE=1" SKIP_RETURN_CODE 77 PASS_REGULAR_EXPRESSION "read after the label" TIMEOUT 60) - if(WIN32) - set_tests_properties(agc_driver_linear_readback_label_off PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_draw_cache_reuse_off COMMAND agc_driver_draw_cache_reuse_tests) - set_tests_properties(agc_driver_draw_cache_reuse_off PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_GPL=1" SKIP_RETURN_CODE 77) - add_test(NAME agc_driver_draw_cache_reuse_verify COMMAND agc_driver_draw_cache_reuse_tests) - set_tests_properties(agc_driver_draw_cache_reuse_verify PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_VERIFY_DRAW_DATA_HITS=1" SKIP_RETURN_CODE 77) - add_test(NAME agc_driver_draw_cache_reuse_entry_verify COMMAND agc_driver_draw_cache_reuse_tests) - set_tests_properties(agc_driver_draw_cache_reuse_entry_verify PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_VERIFY_DRAW_ENTRIES=1" SKIP_RETURN_CODE 77 FAIL_REGULAR_EXPRESSION "FATAL:") - if(WIN32) - set_tests_properties(agc_driver_draw_cache_reuse_entry_verify PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_draw_cache_reuse_inline COMMAND agc_driver_draw_cache_reuse_tests) - set_tests_properties(agc_driver_draw_cache_reuse_inline PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_PIPELINED_DRAWS=0;APS5_VERIFY_DRAW_RECIPE=1;APS5_VERIFY_REGISTER_KEYS=1" SKIP_RETURN_CODE 77) - add_test(NAME agc_driver_draw_cache_reuse_indirect COMMAND agc_driver_draw_cache_reuse_tests) - set_tests_properties(agc_driver_draw_cache_reuse_indirect PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_DRAW_CACHE_INDIRECT=1;APS5_PROFILE_DRAW=1" SKIP_RETURN_CODE 77) - set_tests_properties(agc_driver_draw_cache_reuse agc_driver_draw_cache_reuse_off agc_driver_draw_cache_reuse_verify agc_driver_draw_cache_reuse_inline agc_driver_draw_cache_reuse_indirect PROPERTIES FAIL_REGULAR_EXPRESSION "FATAL:") - set_property(TEST agc_driver_draw_cache_reuse agc_driver_draw_cache_reuse_off APPEND PROPERTY ENVIRONMENT "APS5_VERIFY_DRAW_RECIPE=1" "APS5_VERIFY_REGISTER_KEYS=1") - add_test(NAME agc_driver_draw_data_hit_user_words_verify COMMAND agc_driver_draw_data_hit_user_words_tests) - set_tests_properties(agc_driver_draw_data_hit_user_words_verify PROPERTIES ENVIRONMENT "APS5_VERIFY_DRAW_DATA_HITS=1" SKIP_RETURN_CODE 77) - add_test(NAME agc_driver_draw_data_hit_user_words_refresh COMMAND agc_driver_draw_data_hit_user_words_tests) - set_tests_properties(agc_driver_draw_data_hit_user_words_refresh PROPERTIES ENVIRONMENT "APS5_DRAW_PIPELINE=1" SKIP_RETURN_CODE 77) - if(WIN32) - set_tests_properties(agc_driver_draw_cache_reuse_off agc_driver_draw_cache_reuse_verify agc_driver_draw_cache_reuse_inline agc_driver_draw_cache_reuse_indirect agc_driver_draw_data_hit_user_words_verify agc_driver_draw_data_hit_user_words_refresh PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") endif() - add_test(NAME agc_driver_stencil_replay_no_gpl COMMAND agc_driver_stencil_replay_tests) - set_tests_properties(agc_driver_stencil_replay_no_gpl PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_GPL=1" TIMEOUT 30 SKIP_RETURN_CODE 77) - if(WIN32) - set_tests_properties(agc_driver_stencil_replay_no_gpl PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_pipelined_dispatch_item COMMAND agc_driver_pipelined_dispatch_tests) - set_tests_properties(agc_driver_pipelined_dispatch_item PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_PIPELINE_DISPATCH=1" SKIP_RETURN_CODE 77) - if(WIN32) - set_tests_properties(agc_driver_pipelined_dispatch_item PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - set_tests_properties(agc_driver_queued_index_read_order PROPERTIES TIMEOUT 60) - set_property(TEST agc_driver_compute_prebuild_share APPEND PROPERTY ENVIRONMENT "APS5_PREBUILD_THREADS=4") - - foreach(agcTest IN ITEMS agc_spirv_narrow_constant_store_tests agc_spirv13_image_tests agc_spirv_optimizer_tests agc_driver_constant_store_tests) - if(NOT TARGET ${agcTest}) - continue() - endif() - set_target_properties(${agcTest} PROPERTIES EXCLUDE_FROM_ALL OFF) - string(REGEX REPLACE "_tests$" "" agcTestBaseName "${agcTest}") - foreach(agcSpirvMode IN ITEMS default full none) - if(agcSpirvMode STREQUAL "default") - set(agcTestName "${agcTestBaseName}") - set(agcSpirvEnvironment "--unset=APS5_SPIRV_OPT") - else() - set(agcTestName "${agcTestBaseName}_${agcSpirvMode}") - set(agcSpirvEnvironment "APS5_SPIRV_OPT=${agcSpirvMode}") - endif() - add_test(NAME ${agcTestName} COMMAND ${CMAKE_COMMAND} -E env - ${agcSpirvEnvironment} "$") - set_tests_properties(${agcTestName} PROPERTIES - ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" TIMEOUT 60 SKIP_RETURN_CODE 77) - if(agcTest STREQUAL "agc_spirv13_image_tests") - set_tests_properties(${agcTestName} PROPERTIES TIMEOUT 30) - endif() - if(agcTest STREQUAL "agc_driver_constant_store_tests") - set_tests_properties(${agcTestName} PROPERTIES RUN_SERIAL TRUE) - endif() - if(WIN32) - set_tests_properties(${agcTestName} PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - endforeach() - endforeach() - add_test(NAME agc_driver_depth_plane_cpu_write_after_page_unwatch COMMAND agc_driver_depth_plane_partial_store_tests --cpu-write-after-page-unwatch) - set_tests_properties(agc_driver_depth_plane_cpu_write_after_page_unwatch PROPERTIES - ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" TIMEOUT 30 SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_driver_depth_plane_cpu_write_after_page_unwatch PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_depth_plane_cpu_write_after_partial_unwatch COMMAND agc_driver_depth_plane_partial_store_tests --cpu-write-after-partial-unwatch) - set_tests_properties(agc_driver_depth_plane_cpu_write_after_partial_unwatch PROPERTIES - ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" TIMEOUT 30 SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_driver_depth_plane_cpu_write_after_partial_unwatch PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_depth_plane_cpu_write_after_memo COMMAND agc_driver_depth_plane_partial_store_tests --cpu-write-after-memo) - set_tests_properties(agc_driver_depth_plane_cpu_write_after_memo PROPERTIES - ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" TIMEOUT 30 SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_driver_depth_plane_cpu_write_after_memo PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_depth_plane_partial_store_unimported COMMAND agc_driver_depth_plane_partial_store_tests) - add_test(NAME agc_driver_depth_plane_partial_store_buffer_copy COMMAND agc_driver_depth_plane_partial_store_tests --buffer-copy) foreach(partialStoreTest agc_driver_depth_plane_partial_store_unimported agc_driver_depth_plane_partial_store_buffer_copy) set_tests_properties(${partialStoreTest} PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_HOST_IMPORT=1" TIMEOUT 30 SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") @@ -3584,85 +731,6 @@ if(BUILD_TESTING) "PATH=path_list_prepend:$") endif() endforeach() - add_test(NAME agc_driver_array_layer_target_cpu COMMAND agc_driver_array_layer_target_tests) - set_tests_properties(agc_driver_array_layer_target_cpu PROPERTIES - ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_HOST_IMPORT=1" TIMEOUT 30 SKIP_RETURN_CODE 77) - if(WIN32) - set_tests_properties(agc_driver_array_layer_target_cpu PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - foreach(preparedMode IN ITEMS indirect uncached debug debug_failure deferred deferred_undecodable registered_workgroup registered_workgroup_sync dispatch_ahead_prewarm abi_deferred_compute abi_deferred_pixel abi_deferred_stages abi_deferred_rectangle abi_deferred_undecodable_state abi_deferred_registration_failure abi_deferred_vertex_inputs abi_deferred_rectangle_pairs lazy lazy_sync lazy_budget_zero) - set(preparedTest "agc_driver_prepared_shaders_${preparedMode}") - if(preparedMode MATCHES "^abi_deferred_") - string(REPLACE "_" "-" preparedArgument ${preparedMode}) - add_test(NAME ${preparedTest} COMMAND agc_driver_prepared_shaders_tests --${preparedArgument}) - elseif(preparedMode STREQUAL "indirect") - add_test(NAME ${preparedTest} COMMAND agc_driver_prepared_shaders_tests --indirect) - elseif(preparedMode STREQUAL "deferred") - add_test(NAME ${preparedTest} COMMAND agc_driver_prepared_shaders_tests --deferred) - elseif(preparedMode STREQUAL "deferred_undecodable") - add_test(NAME ${preparedTest} COMMAND agc_driver_prepared_shaders_tests --deferred-undecodable) - elseif(preparedMode STREQUAL "lazy" OR preparedMode STREQUAL "lazy_sync" OR preparedMode STREQUAL "lazy_budget_zero") - add_test(NAME ${preparedTest} COMMAND agc_driver_prepared_shaders_tests --lazy) - elseif(preparedMode STREQUAL "registered_workgroup" OR preparedMode STREQUAL "registered_workgroup_sync") - add_test(NAME ${preparedTest} COMMAND agc_driver_prepared_shaders_tests --registered-workgroup) - elseif(preparedMode STREQUAL "dispatch_ahead_prewarm") - add_test(NAME ${preparedTest} COMMAND agc_driver_prepared_shaders_tests --dispatch-ahead-prewarm) - elseif(preparedMode STREQUAL "debug_failure") - add_test(NAME ${preparedTest} COMMAND agc_driver_prepared_shaders_tests --fail-before-registration) - set_tests_properties(${preparedTest} PROPERTIES WILL_FAIL TRUE TIMEOUT 30) - else() - add_test(NAME ${preparedTest} COMMAND agc_driver_prepared_shaders_tests) - endif() - set_tests_properties(${preparedTest} PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(preparedMode MATCHES "^abi_deferred_") - set_property(TEST ${preparedTest} APPEND PROPERTY ENVIRONMENT "APS5_NO_FAILURE_MEMO=1") - elseif(preparedMode STREQUAL "uncached") - set_property(TEST ${preparedTest} APPEND PROPERTY ENVIRONMENT "APS5_NO_DISPATCH_CACHE=1") - elseif(preparedMode STREQUAL "registered_workgroup_sync") - set_property(TEST ${preparedTest} APPEND PROPERTY ENVIRONMENT "APS5_SYNC_SHADER_PREPARE=1") - elseif(preparedMode STREQUAL "lazy" OR preparedMode STREQUAL "lazy_sync") - set_property(TEST ${preparedTest} APPEND PROPERTY ENVIRONMENT "APS5_LAZY_SHADER_PREPARE=1" "APS5_SUSPEND_DRAIN=1") - if(preparedMode STREQUAL "lazy_sync") - set_property(TEST ${preparedTest} APPEND PROPERTY ENVIRONMENT "APS5_SYNC_SHADER_PREPARE=1") - endif() - elseif(preparedMode STREQUAL "lazy_budget_zero") - set_property(TEST ${preparedTest} APPEND PROPERTY ENVIRONMENT "APS5_REGISTRATION_PREPARE_COMMIT_GB=0" "APS5_SUSPEND_DRAIN=1") - elseif(preparedMode STREQUAL "debug" OR preparedMode STREQUAL "debug_failure") - set_property(TEST ${preparedTest} APPEND PROPERTY ENVIRONMENT "APS5_PROFILE_DRAW=1" "APS5_NO_UNLOCKED_DEVICE=1") - endif() - if(WIN32) - set_tests_properties(${preparedTest} PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() - endforeach() - add_test(NAME agc_driver_shutdown_threads_joined COMMAND agc_driver_shutdown_threads_tests --joined) - add_test(NAME agc_driver_shutdown_threads_queued_prebuilds COMMAND agc_driver_shutdown_threads_tests --queued-prebuilds) - add_test(NAME agc_driver_shutdown_threads_compare_helpers COMMAND agc_driver_shutdown_threads_tests --compare-helpers) - add_test(NAME agc_driver_shutdown_threads_draw_committer COMMAND agc_driver_shutdown_threads_tests --draw-committer) - add_test(NAME agc_driver_shutdown_threads_shader_cache_writer COMMAND agc_driver_shutdown_threads_tests --shader-cache-writer) - add_test(NAME agc_driver_shutdown_threads_late_shader_cache COMMAND agc_driver_shutdown_threads_tests --late-shader-cache) - add_test(NAME agc_driver_shutdown_threads_async_log_held COMMAND agc_driver_shutdown_threads_tests --async-log-held) - add_test(NAME agc_driver_shutdown_threads_exit_after_start COMMAND agc_driver_shutdown_threads_tests --exit-after-start) - set_tests_properties(agc_driver_shutdown_threads_joined agc_driver_shutdown_threads_queued_prebuilds agc_driver_shutdown_threads_compare_helpers agc_driver_shutdown_threads_draw_committer agc_driver_shutdown_threads_shader_cache_writer agc_driver_shutdown_threads_late_shader_cache agc_driver_shutdown_threads_async_log_held agc_driver_shutdown_threads_exit_after_start PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 30) - set_tests_properties(agc_driver_shutdown_threads_queued_prebuilds PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_PREBUILD_THREADS=1") - if(WIN32) - set_tests_properties(agc_driver_shutdown_threads_joined agc_driver_shutdown_threads_queued_prebuilds agc_driver_shutdown_threads_compare_helpers agc_driver_shutdown_threads_draw_committer agc_driver_shutdown_threads_shader_cache_writer agc_driver_shutdown_threads_late_shader_cache agc_driver_shutdown_threads_async_log_held agc_driver_shutdown_threads_exit_after_start PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_prepared_shaders_abi_deferred_concurrent_lazy COMMAND agc_driver_prepared_shaders_tests --abi-deferred-concurrent) - set_tests_properties(agc_driver_prepared_shaders_abi_deferred_concurrent_lazy PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_FAILURE_MEMO=1;APS5_LAZY_SHADER_PREPARE=1;APS5_SUSPEND_DRAIN=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_driver_prepared_shaders_abi_deferred_concurrent_lazy PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_prepared_shaders_abi_deferred_compute_lazy COMMAND agc_driver_prepared_shaders_tests --abi-deferred-compute) - set_tests_properties(agc_driver_prepared_shaders_abi_deferred_compute_lazy PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_FAILURE_MEMO=1;APS5_LAZY_SHADER_PREPARE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_driver_prepared_shaders_abi_deferred_compute_lazy PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_compute_user_data_calls_registered COMMAND agc_driver_compute_user_data_calls_tests --registered) - set_tests_properties(agc_driver_compute_user_data_calls_registered PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") - if(WIN32) - set_tests_properties(agc_driver_compute_user_data_calls_registered PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() set_tests_properties(agc_driver_prepared_shaders agc_driver_prepared_shaders_indirect agc_driver_prepared_shaders_uncached agc_driver_prepared_shaders_debug agc_driver_prepared_shaders_debug_failure @@ -3773,35 +841,6 @@ endif() set_target_properties(agc_shader_replay PROPERTIES CXX_EXTENSIONS OFF) configure_windows_unwind(agc_shader_replay) -if(BUILD_TESTING) - foreach(optimizer IN ITEMS none full) - if(optimizer STREQUAL "full" AND NOT ANYPS5_ENABLE_SPIRV_TOOLS) - continue() - endif() - add_test(NAME agc_shader_specialized_bda_abi_${optimizer} COMMAND agc_shader_memory_tests --specialized-bda-abi) - set_tests_properties(agc_shader_specialized_bda_abi_${optimizer} PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_SPIRV_OPT=${optimizer}" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_shader_specialized_bda_abi_${optimizer} PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() - endforeach() - add_test_executable(agc_shader_replay_requests_tests tests/ShaderReplayRequests.cpp) - target_link_libraries(agc_shader_replay_requests_tests PRIVATE shader_recompiler_agc_driver libc) - set_target_properties(agc_shader_replay_requests_tests PROPERTIES CXX_EXTENSIONS OFF) - configure_windows_unwind(agc_shader_replay_requests_tests) - add_dependencies(agc_shader_replay_requests_tests agc_shader_replay) - set(agcShaderReplayCapture "${CMAKE_CURRENT_BINARY_DIR}/shader-replay-capture") - add_test(NAME agc_shader_replay_requests COMMAND agc_shader_replay_requests_tests "${agcShaderReplayCapture}") - set_tests_properties(agc_shader_replay_requests PROPERTIES FIXTURES_SETUP agc_shader_replay_capture TIMEOUT 30) - add_test(NAME agc_shader_replay_tool COMMAND ${CMAKE_COMMAND} -DTOOL=$ "-DCAPTURE=${agcShaderReplayCapture}" - -P ${CMAKE_CURRENT_SOURCE_DIR}/tests/ShaderReplayTool.cmake) - set_tests_properties(agc_shader_replay_tool PROPERTIES FIXTURES_REQUIRED agc_shader_replay_capture TIMEOUT 30) - set_tests_properties(agc_shader_replay_requests agc_shader_replay_tool PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1") - if(WIN32) - set_tests_properties(agc_shader_replay_requests agc_shader_replay_tool PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - add_executable(agc_frame_replay EXCLUDE_FROM_ALL tools/FrameReplay.cpp Execution/src/FrameCapture.cpp @@ -3840,102 +879,6 @@ if(MINGW) endforeach() endif() -if(BUILD_TESTING) - add_test_executable(agc_driver_pm4_replay_tests tests/Pm4Replay.cpp tools/Pm4Analysis.cpp) - target_include_directories(agc_driver_pm4_replay_tests PRIVATE ${LIBS_INCLUDE_DIR}) - target_link_libraries(agc_driver_pm4_replay_tests PRIVATE libSceAgc libSceAgcDriver libkernel libc) - set_target_properties(agc_driver_pm4_replay_tests PROPERTIES CXX_EXTENSIONS OFF) - configure_windows_unwind(agc_driver_pm4_replay_tests) - add_dependencies(agc_driver_pm4_replay_tests agc_pm4_replay) - set(agcPm4ReplayCapture "${CMAKE_CURRENT_BINARY_DIR}/pm4-replay-capture") - add_test(NAME agc_driver_pm4_replay COMMAND agc_driver_pm4_replay_tests) - set_tests_properties(agc_driver_pm4_replay PROPERTIES - ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_DUMP_SUBMITS=${agcPm4ReplayCapture}" - FIXTURES_SETUP agc_pm4_replay_capture TIMEOUT 30) - add_test(NAME agc_driver_pm4_replay_tool COMMAND ${CMAKE_COMMAND} -DTOOL=$ "-DCAPTURE=${agcPm4ReplayCapture}" - -P ${CMAKE_CURRENT_SOURCE_DIR}/tests/Pm4ReplayTool.cmake) - set_tests_properties(agc_driver_pm4_replay_tool PROPERTIES - FIXTURES_REQUIRED agc_pm4_replay_capture TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_driver_pm4_replay agc_driver_pm4_replay_tool PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - - if(WIN32 OR CMAKE_SYSTEM_NAME STREQUAL "Linux") - add_test_executable(agc_driver_frame_capture_eop_tests tests/FrameCaptureEop.cpp Execution/src/FrameCapture.cpp) - target_include_directories(agc_driver_frame_capture_eop_tests PRIVATE ${LIBS_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/core/shader/recompiler ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR} ${ANYPS5_SPIRV_HEADERS_INCLUDE_DIR}) - target_link_libraries(agc_driver_frame_capture_eop_tests PRIVATE libSceAgcDriver libkernel libc libzstd_static) - set_target_properties(agc_driver_frame_capture_eop_tests PROPERTIES CXX_EXTENSIONS OFF) - configure_windows_unwind(agc_driver_frame_capture_eop_tests) - add_test(NAME agc_driver_frame_capture_eop COMMAND agc_driver_frame_capture_eop_tests) - set_tests_properties(agc_driver_frame_capture_eop PROPERTIES - ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_FRAME_CAPTURE=${CMAKE_CURRENT_BINARY_DIR}/frame-capture-eop;APS5_FRAME_CAPTURE_AT_FLIP=1;APS5_FRAME_CAPTURE_FRAMES=3" - TIMEOUT 120) - if(WIN32) - set_tests_properties(agc_driver_frame_capture_eop PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - endif() - - add_test_executable(agc_driver_frame_replay_state_tests tests/FrameReplayState.cpp Execution/src/FrameCapture.cpp) - target_include_directories(agc_driver_frame_replay_state_tests PRIVATE ${LIBS_INCLUDE_DIR}) - target_link_libraries(agc_driver_frame_replay_state_tests PRIVATE libSceAgcDriver libkernel libc libzstd_static) - set_target_properties(agc_driver_frame_replay_state_tests PROPERTIES CXX_EXTENSIONS OFF) - configure_windows_unwind(agc_driver_frame_replay_state_tests) - set(agcFrameReplayModes order tokens blocking) - if(WIN32 OR CMAKE_SYSTEM_NAME STREQUAL "Linux") - list(APPEND agcFrameReplayModes zero shader shader_host) - endif() - if(WIN32 OR CMAKE_SYSTEM_NAME STREQUAL "Linux") - list(APPEND agcFrameReplayModes unwatched) - endif() - if(CMAKE_SYSTEM_NAME STREQUAL "Linux") - list(APPEND agcFrameReplayModes shared_page host_neighbors) - endif() - foreach(mode IN LISTS agcFrameReplayModes) - set(capture "${CMAKE_CURRENT_BINARY_DIR}/frame-replay-${mode}") - add_test(NAME agc_driver_frame_replay_${mode} COMMAND agc_driver_frame_replay_state_tests ${mode} "${capture}") - set_tests_properties(agc_driver_frame_replay_${mode} PROPERTIES TIMEOUT 30) - if(mode MATCHES "^shader") - set_tests_properties(agc_driver_frame_replay_${mode} PROPERTIES ENVIRONMENT - "APS5_FRAME_CAPTURE=${capture};APS5_FRAME_CAPTURE_AT_FLIP=1;APS5_FRAME_CAPTURE_FRAMES=1") - endif() - if(mode STREQUAL "unwatched") - set_tests_properties(agc_driver_frame_replay_${mode} PROPERTIES ENVIRONMENT - "APS5_NO_WRITE_WATCH=1;APS5_FRAME_CAPTURE=${capture};APS5_FRAME_CAPTURE_AT_FLIP=1;APS5_FRAME_CAPTURE_FRAMES=1") - endif() - if(WIN32) - set_tests_properties(agc_driver_frame_replay_${mode} PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - endforeach() - - if(WIN32 OR CMAKE_SYSTEM_NAME STREQUAL "Linux") - add_test_executable(agc_driver_frame_replay_tests tests/FrameReplay.cpp Execution/src/FrameCapture.cpp) - target_include_directories(agc_driver_frame_replay_tests PRIVATE ${LIBS_INCLUDE_DIR}) - target_link_libraries(agc_driver_frame_replay_tests PRIVATE libSceAgc libSceAgcDriver libkernel libc libzstd_static) - set_target_properties(agc_driver_frame_replay_tests PROPERTIES CXX_EXTENSIONS OFF) - configure_windows_unwind(agc_driver_frame_replay_tests) - add_dependencies(agc_driver_frame_replay_tests agc_frame_replay) - add_test(NAME agc_driver_frame_replay COMMAND agc_driver_frame_replay_tests $) - set_tests_properties(agc_driver_frame_replay PROPERTIES - ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_FRAME_CAPTURE=${CMAKE_CURRENT_BINARY_DIR}/frame-replay-capture;APS5_FRAME_CAPTURE_AT_FLIP=1;APS5_FRAME_CAPTURE_FRAMES=2" - TIMEOUT 120) - if(WIN32) - set_tests_properties(agc_driver_frame_replay PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_driver_frame_replay_concurrent COMMAND agc_driver_frame_replay_tests $ concurrent) - set_tests_properties(agc_driver_frame_replay_concurrent PROPERTIES - ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_FRAME_CAPTURE=${CMAKE_CURRENT_BINARY_DIR}/frame-replay-concurrent-capture;APS5_FRAME_CAPTURE_AT_FLIP=1;APS5_FRAME_CAPTURE_FRAMES=8" - TIMEOUT 120) - if(WIN32) - set_tests_properties(agc_driver_frame_replay_concurrent PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - endif() -endif() - add_executable(agc_compute_pipeline_replay EXCLUDE_FROM_ALL tools/ComputePipelineReplay.cpp) target_include_directories(agc_compute_pipeline_replay PRIVATE ${LIBS_INCLUDE_DIR} @@ -3947,532 +890,18 @@ target_link_libraries(agc_compute_pipeline_replay PRIVATE libSceAgcDriver libc) set_target_properties(agc_compute_pipeline_replay PROPERTIES CXX_EXTENSIONS OFF) configure_windows_unwind(agc_compute_pipeline_replay) -if(BUILD_TESTING) - add_test_executable(agc_compute_pipeline_capture_tests tests/ComputePipelineCapture.cpp Execution/src/ComputePipelineCapture.cpp) - target_include_directories(agc_compute_pipeline_capture_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) - target_link_libraries(agc_compute_pipeline_capture_tests PRIVATE libc) - set_target_properties(agc_compute_pipeline_capture_tests PROPERTIES CXX_EXTENSIONS OFF) - configure_windows_unwind(agc_compute_pipeline_capture_tests) - add_test(NAME agc_compute_descriptor_layout_flags COMMAND agc_driver_graphics_tests --descriptor-layout-flags) - set_tests_properties(agc_compute_descriptor_layout_flags PROPERTIES TIMEOUT 30) - add_test(NAME agc_driver_covered_centroid_state COMMAND agc_driver_graphics_tests --covered-centroid-state) - set_tests_properties(agc_driver_covered_centroid_state PROPERTIES TIMEOUT 30) - add_test(NAME agc_driver_sample_location_grid_fallback COMMAND agc_driver_graphics_tests --sample-location-grid-fallback) - set_tests_properties(agc_driver_sample_location_grid_fallback PROPERTIES TIMEOUT 30) - add_test(NAME agc_driver_unobserved_provoking_vertex COMMAND agc_driver_graphics_tests --unobserved-provoking-vertex) - set_tests_properties(agc_driver_unobserved_provoking_vertex PROPERTIES TIMEOUT 30) - add_test(NAME agc_driver_sample_order_planning COMMAND agc_driver_graphics_tests --sample-order) - set_tests_properties(agc_driver_sample_order_planning PROPERTIES TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_compute_descriptor_layout_flags PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - set_tests_properties(agc_driver_covered_centroid_state PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - set_tests_properties(agc_driver_sample_location_grid_fallback PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - set_tests_properties(agc_driver_unobserved_provoking_vertex PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - set_tests_properties(agc_driver_sample_order_planning PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() - add_test(NAME agc_compute_pipeline_capture COMMAND agc_compute_pipeline_capture_tests) - set_tests_properties(agc_compute_pipeline_capture PROPERTIES TIMEOUT 30) - foreach(mode IN ITEMS entry-cap byte-cap io invalid) - string(REPLACE "-" "_" name "${mode}") - add_test(NAME agc_compute_pipeline_capture_optional_${name} COMMAND agc_compute_pipeline_capture_tests --optional-${mode}) - set_tests_properties(agc_compute_pipeline_capture_optional_${name} PROPERTIES TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_compute_pipeline_capture_optional_${name} PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() - endforeach() - if(WIN32) - set_tests_properties(agc_compute_pipeline_capture PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() -endif() - if(BUILD_TESTING AND ANYPS5_ENABLE_SPIRV_TOOLS) - add_test_executable(agc_compute_pipeline_replay_tests tests/ComputePipelineReplay.cpp) - target_include_directories(agc_compute_pipeline_replay_tests PRIVATE - ${LIBS_INCLUDE_DIR} - ${CMAKE_SOURCE_DIR}/core/shader/recompiler - ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR} - ${ANYPS5_SPIRV_HEADERS_INCLUDE_DIR} - ) - target_link_libraries(agc_compute_pipeline_replay_tests PRIVATE libSceAgcDriver libc) - set_target_properties(agc_compute_pipeline_replay_tests PROPERTIES CXX_EXTENSIONS OFF) - configure_windows_unwind(agc_compute_pipeline_replay_tests) - add_test(NAME agc_compute_pipeline_replay COMMAND agc_compute_pipeline_replay_tests) - set_tests_properties(agc_compute_pipeline_replay PROPERTIES TIMEOUT 30 SKIP_RETURN_CODE 77) - add_dependencies(agc_compute_pipeline_replay_tests agc_compute_pipeline_replay agc_driver_branch_past_endpgm_tests) add_test(NAME agc_compute_pipeline_inspection COMMAND ${CMAKE_COMMAND} -DREPLAY=$ -DVULKAN_PROBE=$ -DOUTPUT_ROOT=${CMAKE_CURRENT_BINARY_DIR}/capture-tests -P ${CMAKE_CURRENT_SOURCE_DIR}/tests/ComputePipelineInspectRun.cmake) set_tests_properties(agc_compute_pipeline_inspection PROPERTIES TIMEOUT 60 SKIP_REGULAR_EXPRESSION "compute pipeline inspection: skipped") - add_test(NAME agc_compute_pipeline_capture_run COMMAND ${CMAKE_COMMAND} - -DFIXTURE=$ - -DREPLAY=$ - -DOUTPUT_ROOT=${CMAKE_CURRENT_BINARY_DIR}/capture-tests - -P ${CMAKE_CURRENT_SOURCE_DIR}/tests/ComputePipelineCaptureRun.cmake) - set_tests_properties(agc_compute_pipeline_capture_run PROPERTIES TIMEOUT 30 SKIP_REGULAR_EXPRESSION "compute pipeline capture run: skipped, no usable Vulkan device") if(WIN32) set_tests_properties(agc_compute_pipeline_replay agc_compute_pipeline_capture_run agc_compute_pipeline_inspection PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") endif() endif() -if(BUILD_TESTING) - add_test_executable(texture_format_lookup_tests ${LIBS_INCLUDE_DIR}/tests/TextureFormatLookup.cpp) - target_include_directories(texture_format_lookup_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) - target_link_libraries(texture_format_lookup_tests PRIVATE libSceAgcDriver libc) - configure_windows_unwind(texture_format_lookup_tests) - add_test(NAME texture_format_lookup COMMAND texture_format_lookup_tests) - if(WIN32) - set_tests_properties(texture_format_lookup PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test_executable(linear_display_buffer_tests ${LIBS_INCLUDE_DIR}/tests/LinearDisplayBuffer.cpp) - target_include_directories(linear_display_buffer_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) - target_link_libraries(linear_display_buffer_tests PRIVATE libSceAgcDriver libc) - configure_windows_unwind(linear_display_buffer_tests) - add_test(NAME linear_display_buffer COMMAND linear_display_buffer_tests) - if(WIN32) - set_tests_properties(linear_display_buffer PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test_executable(guest_agc_driver_resources_tests ${LIBS_INCLUDE_DIR}/tests/GuestAgcDriverResources.cpp) - target_include_directories(guest_agc_driver_resources_tests PRIVATE ${LIBS_INCLUDE_DIR}) - target_link_libraries(guest_agc_driver_resources_tests PRIVATE libSceAgcDriver libc) - configure_windows_unwind(guest_agc_driver_resources_tests) - add_test(NAME guest_agc_driver_resources COMMAND guest_agc_driver_resources_tests) - if(WIN32) - set_tests_properties(guest_agc_driver_resources PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test_executable(guest_agc_driver_debug_unavailable_tests ${LIBS_INCLUDE_DIR}/tests/GuestAgcDriverDebugUnavailable.cpp) - target_include_directories(guest_agc_driver_debug_unavailable_tests PRIVATE ${LIBS_INCLUDE_DIR}) - target_link_libraries(guest_agc_driver_debug_unavailable_tests PRIVATE libSceAgcDriver libc) - configure_windows_unwind(guest_agc_driver_debug_unavailable_tests) - add_test(NAME guest_agc_driver_debug_unavailable COMMAND guest_agc_driver_debug_unavailable_tests) - if(WIN32) - set_tests_properties(guest_agc_driver_debug_unavailable PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test_executable(guest_rendering_wait_tests ${LIBS_INCLUDE_DIR}/tests/GuestRenderingWait.cpp) - target_include_directories(guest_rendering_wait_tests PRIVATE ${LIBS_INCLUDE_DIR}) - target_link_libraries(guest_rendering_wait_tests PRIVATE libSceAgcDriver libc) - configure_windows_unwind(guest_rendering_wait_tests) - add_test(NAME guest_rendering_wait COMMAND guest_rendering_wait_tests) - if(WIN32) - set_tests_properties(guest_rendering_wait PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test_executable(shader_buffer_address_tests ${LIBS_INCLUDE_DIR}/tests/ShaderBufferAddress.cpp) - target_link_libraries(shader_buffer_address_tests PRIVATE shader_recompiler_agc_driver libc) - configure_windows_unwind(shader_buffer_address_tests) - add_test(NAME shader_buffer_address COMMAND shader_buffer_address_tests) - if(WIN32) - set_tests_properties(shader_buffer_address PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test_executable(ray_tracing_miss_tests ${LIBS_INCLUDE_DIR}/tests/RayTracingMiss.cpp) - target_link_libraries(ray_tracing_miss_tests PRIVATE shader_recompiler_agc_driver libc) - configure_windows_unwind(ray_tracing_miss_tests) - add_test(NAME ray_tracing_miss COMMAND ray_tracing_miss_tests) - if(WIN32) - set_tests_properties(ray_tracing_miss PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test_executable(wave32_wide_subgroup_tests ${LIBS_INCLUDE_DIR}/tests/Wave32WideSubgroup.cpp) - target_link_libraries(wave32_wide_subgroup_tests PRIVATE shader_recompiler_agc_driver libc) - configure_windows_unwind(wave32_wide_subgroup_tests) - add_test(NAME wave32_wide_subgroup COMMAND wave32_wide_subgroup_tests) - if(WIN32) - set_tests_properties(wave32_wide_subgroup PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test_executable(vector_compare_i16_u16_tests ${LIBS_INCLUDE_DIR}/tests/VectorCompareI16U16.cpp) - target_link_libraries(vector_compare_i16_u16_tests PRIVATE shader_recompiler_agc_driver libc) - configure_windows_unwind(vector_compare_i16_u16_tests) - add_test(NAME vector_compare_i16_u16 COMMAND vector_compare_i16_u16_tests) - if(WIN32) - set_tests_properties(vector_compare_i16_u16 PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test_executable(vector_compare_const_tests ${LIBS_INCLUDE_DIR}/tests/VectorCompareConst.cpp) - target_link_libraries(vector_compare_const_tests PRIVATE shader_recompiler_agc_driver libc) - configure_windows_unwind(vector_compare_const_tests) - add_test(NAME vector_compare_const COMMAND vector_compare_const_tests) - if(WIN32) - set_tests_properties(vector_compare_const PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test_executable(vector_min_max_med16_tests ${LIBS_INCLUDE_DIR}/tests/VectorMinMaxMed16.cpp) - target_link_libraries(vector_min_max_med16_tests PRIVATE shader_recompiler_agc_driver libc) - configure_windows_unwind(vector_min_max_med16_tests) - add_test(NAME vector_min_max_med16 COMMAND vector_min_max_med16_tests) - if(WIN32) - set_tests_properties(vector_min_max_med16 PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test_executable(vector_mad_legacy_tests ${LIBS_INCLUDE_DIR}/tests/VectorMadLegacy.cpp) - target_link_libraries(vector_mad_legacy_tests PRIVATE shader_recompiler_agc_driver libc) - configure_windows_unwind(vector_mad_legacy_tests) - add_test(NAME vector_mad_legacy COMMAND vector_mad_legacy_tests) - if(WIN32) - set_tests_properties(vector_mad_legacy PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test_executable(vector_fused_multiply_add_tests ${LIBS_INCLUDE_DIR}/tests/VectorFusedMultiplyAdd.cpp) - target_link_libraries(vector_fused_multiply_add_tests PRIVATE shader_recompiler_agc_driver libc) - configure_windows_unwind(vector_fused_multiply_add_tests) - add_test(NAME vector_fused_multiply_add COMMAND vector_fused_multiply_add_tests) - if(WIN32) - set_tests_properties(vector_fused_multiply_add PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test_executable(vector_constant_factor_tininess_tests ${LIBS_INCLUDE_DIR}/tests/VectorConstantFactorTininess.cpp) - target_link_libraries(vector_constant_factor_tininess_tests PRIVATE shader_recompiler_agc_driver libc) - configure_windows_unwind(vector_constant_factor_tininess_tests) - add_test(NAME vector_constant_factor_tininess COMMAND vector_constant_factor_tininess_tests) - if(WIN32) - set_tests_properties(vector_constant_factor_tininess PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test_executable(scalar_saveexec_tests ${LIBS_INCLUDE_DIR}/tests/ScalarSaveexec.cpp) - target_link_libraries(scalar_saveexec_tests PRIVATE shader_recompiler_agc_driver libc) - configure_windows_unwind(scalar_saveexec_tests) - add_test(NAME scalar_saveexec COMMAND scalar_saveexec_tests) - if(WIN32) - set_tests_properties(scalar_saveexec PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test_executable(scalar_swappc_tests ${LIBS_INCLUDE_DIR}/tests/ScalarSwappc.cpp) - target_link_libraries(scalar_swappc_tests PRIVATE shader_recompiler_agc_driver libc) - configure_windows_unwind(scalar_swappc_tests) - add_test(NAME scalar_swappc COMMAND scalar_swappc_tests) - if(WIN32) - set_tests_properties(scalar_swappc PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test_executable(scalar_bitcount64_tests ${LIBS_INCLUDE_DIR}/tests/ScalarBitCount64.cpp) - target_link_libraries(scalar_bitcount64_tests PRIVATE shader_recompiler_agc_driver libc) - configure_windows_unwind(scalar_bitcount64_tests) - add_test(NAME scalar_bitcount64 COMMAND scalar_bitcount64_tests) - if(WIN32) - set_tests_properties(scalar_bitcount64 PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test_executable(bitfield_mask_tests ${LIBS_INCLUDE_DIR}/tests/BitfieldMask.cpp) - target_link_libraries(bitfield_mask_tests PRIVATE shader_recompiler_agc_driver libc) - configure_windows_unwind(bitfield_mask_tests) - add_test(NAME bitfield_mask COMMAND bitfield_mask_tests) - if(WIN32) - set_tests_properties(bitfield_mask PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test_executable(scalar_scratch_load_tests ${LIBS_INCLUDE_DIR}/tests/ScalarScratchLoad.cpp) - target_link_libraries(scalar_scratch_load_tests PRIVATE shader_recompiler_agc_driver libc) - configure_windows_unwind(scalar_scratch_load_tests) - add_test(NAME scalar_scratch_load COMMAND scalar_scratch_load_tests) - if(WIN32) - set_tests_properties(scalar_scratch_load PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test_executable(aperture_sources_tests ${LIBS_INCLUDE_DIR}/tests/ApertureSources.cpp) - target_link_libraries(aperture_sources_tests PRIVATE shader_recompiler_agc_driver libc) - configure_windows_unwind(aperture_sources_tests) - add_test(NAME aperture_sources COMMAND aperture_sources_tests) - if(WIN32) - set_tests_properties(aperture_sources PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test_executable(scalar_call_tests ${LIBS_INCLUDE_DIR}/tests/ScalarCall.cpp) - target_link_libraries(scalar_call_tests PRIVATE shader_recompiler_agc_driver libc) - configure_windows_unwind(scalar_call_tests) - add_test(NAME scalar_call COMMAND scalar_call_tests) - if(WIN32) - set_tests_properties(scalar_call PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test_executable(ir_dump_memory_tests ${LIBS_INCLUDE_DIR}/tests/IrDumpMemory.cpp) - target_link_libraries(ir_dump_memory_tests PRIVATE shader_recompiler_agc_driver libc) - configure_windows_unwind(ir_dump_memory_tests) - add_test(NAME ir_dump_memory COMMAND ir_dump_memory_tests) - if(WIN32) - set_tests_properties(ir_dump_memory PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test_executable(image_sample_gather_tests ${LIBS_INCLUDE_DIR}/tests/ImageSampleGather.cpp) - target_link_libraries(image_sample_gather_tests PRIVATE shader_recompiler_agc_driver libc) - configure_windows_unwind(image_sample_gather_tests) - add_test(NAME image_sample_gather COMMAND image_sample_gather_tests) - if(WIN32) - set_tests_properties(image_sample_gather PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test_executable(pixel_ancillary_tests ${LIBS_INCLUDE_DIR}/tests/PixelAncillary.cpp) - target_link_libraries(pixel_ancillary_tests PRIVATE shader_recompiler_agc_driver libc) - configure_windows_unwind(pixel_ancillary_tests) - add_test(NAME pixel_ancillary COMMAND pixel_ancillary_tests) - if(WIN32) - set_tests_properties(pixel_ancillary PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test_executable(interpolation_reference_range_tests ${LIBS_INCLUDE_DIR}/tests/InterpolationReferenceRange.cpp) - target_link_libraries(interpolation_reference_range_tests PRIVATE shader_recompiler_agc_driver libc) - configure_windows_unwind(interpolation_reference_range_tests) - add_test(NAME interpolation_reference_range COMMAND interpolation_reference_range_tests) - if(WIN32) - set_tests_properties(interpolation_reference_range PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test_executable(guest_indexed_draw_tests ${LIBS_INCLUDE_DIR}/tests/GuestIndexedDraw.cpp) - target_include_directories(guest_indexed_draw_tests PRIVATE ${LIBS_INCLUDE_DIR}) - target_link_libraries(guest_indexed_draw_tests PRIVATE libSceAgc libSceAgcDriver libc) - configure_windows_unwind(guest_indexed_draw_tests) - add_test(NAME guest_indexed_draw COMMAND guest_indexed_draw_tests) - if(WIN32) - set_tests_properties(guest_indexed_draw PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_embedded_vertex_fetch_tests EXCLUDE_FROM_ALL tests/EmbeddedVertexFetch.cpp) -target_link_libraries(agc_embedded_vertex_fetch_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_embedded_vertex_fetch_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_embedded_vertex_fetch_tests) -if(BUILD_TESTING) - set_target_properties(agc_embedded_vertex_fetch_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_embedded_vertex_fetch COMMAND agc_embedded_vertex_fetch_tests) - if(WIN32) - set_tests_properties(agc_embedded_vertex_fetch PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_rdna_truncated_modifier_tests EXCLUDE_FROM_ALL tests/RdnaTruncatedModifier.cpp) -target_link_libraries(agc_rdna_truncated_modifier_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_rdna_truncated_modifier_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_rdna_truncated_modifier_tests) -if(BUILD_TESTING) - set_target_properties(agc_rdna_truncated_modifier_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_rdna_truncated_modifier COMMAND agc_rdna_truncated_modifier_tests) - if(WIN32) - set_tests_properties(agc_rdna_truncated_modifier PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_rdna_unreachable_words_tests EXCLUDE_FROM_ALL tests/RdnaUnreachableWords.cpp) -target_link_libraries(agc_rdna_unreachable_words_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_rdna_unreachable_words_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_rdna_unreachable_words_tests) -if(BUILD_TESTING) - set_target_properties(agc_rdna_unreachable_words_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_rdna_unreachable_words COMMAND agc_rdna_unreachable_words_tests) - if(WIN32) - set_tests_properties(agc_rdna_unreachable_words PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_mubuf_lds_decode_tests EXCLUDE_FROM_ALL tests/MubufLdsDecode.cpp) -target_link_libraries(agc_mubuf_lds_decode_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_mubuf_lds_decode_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_mubuf_lds_decode_tests) -if(BUILD_TESTING) - set_target_properties(agc_mubuf_lds_decode_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_mubuf_lds_decode COMMAND agc_mubuf_lds_decode_tests) - if(WIN32) - set_tests_properties(agc_mubuf_lds_decode PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_buffer_resource_vcc_tests EXCLUDE_FROM_ALL tests/BufferResourceVcc.cpp) -target_link_libraries(agc_buffer_resource_vcc_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_buffer_resource_vcc_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_buffer_resource_vcc_tests) -if(BUILD_TESTING) - set_target_properties(agc_buffer_resource_vcc_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_buffer_resource_vcc COMMAND agc_buffer_resource_vcc_tests) - set_tests_properties(agc_buffer_resource_vcc PROPERTIES TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_buffer_resource_vcc PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_vop1_sdwa_move_decode_tests EXCLUDE_FROM_ALL tests/Vop1SdwaMoveDecode.cpp) -target_link_libraries(agc_vop1_sdwa_move_decode_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_vop1_sdwa_move_decode_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_vop1_sdwa_move_decode_tests) -if(BUILD_TESTING) - set_target_properties(agc_vop1_sdwa_move_decode_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_vop1_sdwa_move_decode COMMAND agc_vop1_sdwa_move_decode_tests) - if(WIN32) - set_tests_properties(agc_vop1_sdwa_move_decode PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_gcn_decode_tests EXCLUDE_FROM_ALL tests/GcnDecode.cpp) -target_link_libraries(agc_gcn_decode_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_gcn_decode_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_gcn_decode_tests) -if(BUILD_TESTING) - set_target_properties(agc_gcn_decode_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_gcn_decode COMMAND agc_gcn_decode_tests) - if(WIN32) - set_tests_properties(agc_gcn_decode PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_pixel_position_export_tests EXCLUDE_FROM_ALL tests/PixelPositionExport.cpp) -target_link_libraries(agc_pixel_position_export_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_pixel_position_export_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_pixel_position_export_tests) -if(BUILD_TESTING) - set_target_properties(agc_pixel_position_export_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_pixel_position_export COMMAND agc_pixel_position_export_tests) - set_tests_properties(agc_pixel_position_export PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1") - if(WIN32) - set_tests_properties(agc_pixel_position_export PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_depth_range_remap_tests EXCLUDE_FROM_ALL tests/DepthRangeRemap.cpp) -target_link_libraries(agc_depth_range_remap_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_depth_range_remap_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_depth_range_remap_tests) -if(BUILD_TESTING) - set_target_properties(agc_depth_range_remap_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_depth_range_remap COMMAND agc_depth_range_remap_tests) - set_tests_properties(agc_depth_range_remap PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1") - if(WIN32) - set_tests_properties(agc_depth_range_remap PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_position_invariance_tests EXCLUDE_FROM_ALL tests/PositionInvariance.cpp) -target_link_libraries(agc_position_invariance_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_position_invariance_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_position_invariance_tests) - -add_test_executable(agc_vertex_layer_export_tests EXCLUDE_FROM_ALL tests/VertexLayerExport.cpp) -target_link_libraries(agc_vertex_layer_export_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_vertex_layer_export_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_vertex_layer_export_tests) -if(BUILD_TESTING) - set_target_properties(agc_vertex_layer_export_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_vertex_layer_export COMMAND agc_vertex_layer_export_tests) - set_tests_properties(agc_vertex_layer_export PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1") - if(WIN32) - set_tests_properties(agc_vertex_layer_export PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -if(BUILD_TESTING) - set_target_properties(agc_position_invariance_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_position_invariance COMMAND agc_position_invariance_tests) - set_tests_properties(agc_position_invariance PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1") - if(WIN32) - set_tests_properties(agc_position_invariance PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_vertex_barrier_tests EXCLUDE_FROM_ALL tests/VertexBarrier.cpp) -target_link_libraries(agc_vertex_barrier_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_vertex_barrier_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_vertex_barrier_tests) -if(BUILD_TESTING) - set_target_properties(agc_vertex_barrier_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_vertex_barrier COMMAND agc_vertex_barrier_tests) - set_tests_properties(agc_vertex_barrier PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1") - if(WIN32) - set_tests_properties(agc_vertex_barrier PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -if(BUILD_TESTING) - add_test_executable(image_by_tests ${LIBS_INCLUDE_DIR}/tests/ImageBy.cpp) - target_link_libraries(image_by_tests PRIVATE shader_recompiler_agc_driver libc) - configure_windows_unwind(image_by_tests) - add_test(NAME image_by COMMAND image_by_tests) - if(WIN32) - set_tests_properties(image_by PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - add_test_executable(image_pck_n_tests ${LIBS_INCLUDE_DIR}/tests/ImagePckN.cpp) - target_link_libraries(image_pck_n_tests PRIVATE shader_recompiler_agc_driver libc) - configure_windows_unwind(image_pck_n_tests) - add_test(NAME image_pck_n COMMAND image_pck_n_tests) - if(WIN32) - set_tests_properties(image_pck_n PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() - - add_test_executable(image_msaa_load_tests ${LIBS_INCLUDE_DIR}/tests/ImageMsaaLoad.cpp) - target_link_libraries(image_msaa_load_tests PRIVATE shader_recompiler_agc_driver libc) - configure_windows_unwind(image_msaa_load_tests) - add_test(NAME image_msaa_load COMMAND image_msaa_load_tests) - if(WIN32) - set_tests_properties(image_msaa_load PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_embedded_vertex_fetch_aliasing_tests EXCLUDE_FROM_ALL tests/EmbeddedVertexFetchAliasing.cpp) -target_link_libraries(agc_embedded_vertex_fetch_aliasing_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_embedded_vertex_fetch_aliasing_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_embedded_vertex_fetch_aliasing_tests) -if(BUILD_TESTING) - set_target_properties(agc_embedded_vertex_fetch_aliasing_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_embedded_vertex_fetch_aliasing COMMAND agc_embedded_vertex_fetch_aliasing_tests) - if(WIN32) - set_tests_properties(agc_embedded_vertex_fetch_aliasing PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -add_test_executable(agc_constant_phi_tests EXCLUDE_FROM_ALL tests/ConstantPhi.cpp) -target_link_libraries(agc_constant_phi_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_constant_phi_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_constant_phi_tests) -if(BUILD_TESTING) - set_target_properties(agc_constant_phi_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_constant_phi COMMAND agc_constant_phi_tests) - if(WIN32) - set_tests_properties(agc_constant_phi PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - -if(BUILD_TESTING) - add_test_executable(agc_flat_scratch_tests tests/FlatScratch.cpp) - target_link_libraries(agc_flat_scratch_tests PRIVATE shader_recompiler_agc_driver libc) - configure_windows_unwind(agc_flat_scratch_tests) - add_test(NAME agc_flat_scratch COMMAND agc_flat_scratch_tests) - set_tests_properties(agc_flat_scratch PROPERTIES TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_flat_scratch PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") - endif() -endif() -add_test_executable(agc_constant_select_tests EXCLUDE_FROM_ALL tests/ConstantSelect.cpp) -target_link_libraries(agc_constant_select_tests PRIVATE shader_recompiler_agc_driver libc) -set_target_properties(agc_constant_select_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_constant_select_tests) -if(BUILD_TESTING) - set_target_properties(agc_constant_select_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - add_test(NAME agc_constant_select COMMAND agc_constant_select_tests) - if(WIN32) - set_tests_properties(agc_constant_select PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") - endif() -endif() - if(BUILD_TESTING) get_directory_property(agcRegisteredTests TESTS) list(FILTER agcRegisteredTests EXCLUDE REGEX "^(agc_pipeline_journal(_long_paths|_extended_paths)?|agc_driver_pipeline_journal|agc_pipeline_store_replay_growth)$") diff --git a/core/libs/prx/libSceAgcDriver/Execution/include/Driver/Dispatch/DispatchCache.hpp b/core/libs/prx/libSceAgcDriver/Execution/include/Driver/Dispatch/DispatchCache.hpp index 5f3df6c538..b65f22d0d1 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/include/Driver/Dispatch/DispatchCache.hpp +++ b/core/libs/prx/libSceAgcDriver/Execution/include/Driver/Dispatch/DispatchCache.hpp @@ -44,6 +44,11 @@ struct DispatchVariant { std::uint32_t pushOffset = 0; std::vector runBases; std::uint64_t relocatableWords = 0; + std::uint64_t valueWords = 0; + std::vector> valueSlots; + std::vector> descriptorPatches; + std::uint64_t calleeWords = 0; + std::vector> calleeReads; std::vector> shaderDataPatches; std::uint64_t userDataMask = ~std::uint64_t{0}; std::shared_ptr vertexInfo; diff --git a/core/libs/prx/libSceAgcDriver/Execution/include/Driver/Draw/DrawCache.hpp b/core/libs/prx/libSceAgcDriver/Execution/include/Driver/Draw/DrawCache.hpp index 7ae26d17b2..e486345e11 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/include/Driver/Draw/DrawCache.hpp +++ b/core/libs/prx/libSceAgcDriver/Execution/include/Driver/Draw/DrawCache.hpp @@ -135,6 +135,8 @@ struct StageCapture { struct RelocatableUserWord { std::uint32_t reg; std::vector> reads; + bool value = false; + std::uint32_t high = 0; }; struct DrawRelocation { diff --git a/core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp b/core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp index dfc0e43630..3e1af24b66 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp +++ b/core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp @@ -13,6 +13,7 @@ #include "prx/libSceAgcDriver/Execution/include/Driver/Dispatch/IndirectDispatch.hpp" #include "prx/libSceAgcDriver/Execution/include/Driver/Memory/WriteEvidence.hpp" #include "prx/libSceAgcDriver/Execution/include/Driver/Packets/PacketTiming.hpp" +#include "prx/libSceAgcDriver/Execution/include/Driver/Synchronization/LabelTakes.hpp" #include "prx/libSceAgcDriver/Execution/include/Driver/Synchronization/WaitMemory.hpp" #include "prx/libSceAgcDriver/Execution/include/Driver.hpp" #include "prx/libSceAgcDriver/Execution/include/Pm4.hpp" @@ -102,6 +103,9 @@ public: static void FoldDrawOffsets(const ShaderRecompiler::RecompileResult& result, const DrawProgram& program, Pm4::DrawParameters& parameters); static std::optional ClassifyIndirectDraw(const ShaderRecompiler::RecompileResult& result, const Graphics::State& graphics, const DrawProgram& frontProgram, const std::shared_ptr& localDevice, Pm4::DrawParameters& drawParameters, bool traceIndirect); static void tagVariantRuns(DispatchVariant& variant, std::span regions, const ShaderRecompiler::SrtUserDataUse& use, bool eligible, std::uint32_t hiddenWords, std::span> supplied = {}); + static void tagUserValueWords(DispatchVariant& variant, const DrawProgram& program); + static std::uint64_t relocatedContentKey(const RelocatableUserWord& word, std::uint32_t value, bool& readable); + static void applyShaderDataPatches(DispatchVariant& variant); static std::string dumpRequest(std::uint64_t address, const ShaderRecompiler::RecompileRequest& request, std::string_view suffix = {}); static void reportSkip(const char* kind, const std::string& what); DrawEntryCounters DrawCacheCounters(); @@ -194,8 +198,6 @@ private: void traceDrawKeyLookup(const std::array& components, bool cacheMiss); static std::uint64_t drawIdentityKey(const QueueState& queue, const ShaderRegistry& registry); static bool drawRelocationEnabled(); - static std::uint64_t relocatedContentKey(const RelocatableUserWord& word, std::uint32_t value, bool& readable); - static void applyShaderDataPatches(DispatchVariant& variant); void learnPendingRelocation(); void relocateDrawEntry(const QueueState& queue, std::uint64_t alias, std::shared_ptr& entry, std::shared_ptr& decode, std::vector& patches); void reportDrawRelocation(); @@ -220,6 +222,7 @@ private: void noteLabelStore(std::uint64_t address, std::span bytes, std::uint64_t stamp, std::uint32_t queue); void noteLabelPass(std::span packet, std::uint32_t queue); void noteLabelIssue(std::span packet, std::uint32_t queue); + void retireLabelTakes(std::uint32_t queue, std::uint64_t received); bool storedSince(std::span packet, std::uint64_t address, std::size_t bytes, std::uint64_t received, std::uint32_t queue, std::uint32_t* writer = nullptr); static void traceLabel(std::span packet, std::uint32_t queue); static std::array& writeHistory(); @@ -461,8 +464,7 @@ private: AgcDriver::Mutex labelStoresMutex; std::unordered_map> labelStores; - std::unordered_map labelPasses; - std::unordered_map labelTaken; + LabelTakes labelTakes; std::vector> replacedDevices; std::stop_token shutdownToken = LibcShutdownToken_nid_postfix(); diff --git a/core/libs/prx/libSceAgcDriver/Execution/include/Driver/Shaders/ShaderRegistry.hpp b/core/libs/prx/libSceAgcDriver/Execution/include/Driver/Shaders/ShaderRegistry.hpp index ee349e6e4b..16dbff7bac 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/include/Driver/Shaders/ShaderRegistry.hpp +++ b/core/libs/prx/libSceAgcDriver/Execution/include/Driver/Shaders/ShaderRegistry.hpp @@ -223,7 +223,9 @@ void PublishRegisteredShader(std::shared_ptr& registry, const st void SubmitRegistrationPreparation(std::function task, const PreparedShaders* prepared = nullptr); void PrioritizeRegistrationPreparation(PreparedShaders& prepared); void AwaitRegistrationPreparation(); -void SubmitLibraryPrebuild(std::function task); +void SubmitLibraryPrebuild(std::function task, std::uint64_t program = 0); +bool LibraryPrebuildsWaiting(); +void PrioritizeLibraryPrebuilds(std::span programs); void SubmitComputePrebuild(std::function task); void AwaitLibraryPrebuilds(); void CloseRegistrationPreparation(); diff --git a/core/libs/prx/libSceAgcDriver/Execution/include/Driver/Synchronization/LabelTakes.hpp b/core/libs/prx/libSceAgcDriver/Execution/include/Driver/Synchronization/LabelTakes.hpp new file mode 100644 index 0000000000..eff8338f78 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/Execution/include/Driver/Synchronization/LabelTakes.hpp @@ -0,0 +1,88 @@ +#ifndef CORE_LIBS_PRX_LIBSCEAGCDRIVER_EXECUTION_INCLUDE_DRIVER_SYNCHRONIZATION_LABELTAKES_HPP +#define CORE_LIBS_PRX_LIBSCEAGCDRIVER_EXECUTION_INCLUDE_DRIVER_SYNCHRONIZATION_LABELTAKES_HPP + +#include +#include +#include +#include +#include +#include +#include + +namespace AgcDriver::DriverDetail { + +class LabelTakes { +public: + void Pass(std::uint32_t queue, std::uint64_t dword, std::uint64_t serial) { + const auto key = queueDword(queue, dword); + auto& entry = entries[key]; + if (entry.passed == 0) passCounts[slot(key)].fetch_add(1, std::memory_order_relaxed); + entry.passed = serial; + passes[queue].emplace_back(serial, key); + } + + bool MayHavePass(std::uint32_t queue, std::uint64_t dword) const { + return passCounts[slot(queueDword(queue, dword))].load(std::memory_order_relaxed) != 0; + } + + void Take(std::uint32_t queue, std::uint64_t dword) { + const auto key = queueDword(queue, dword); + const auto found = entries.find(key); + if (found == entries.end() || found->second.passed == 0) return; + found->second.taken = found->second.passed; + found->second.passed = 0; + passCounts[slot(key)].fetch_sub(1, std::memory_order_relaxed); + } + + std::uint64_t Taken(std::uint32_t queue, std::uint64_t dword) const { + const auto found = entries.find(queueDword(queue, dword)); + return found == entries.end() ? 0 : found->second.taken; + } + + void Retire(std::uint32_t queue, std::uint64_t received) { + const auto queued = passes.find(queue); + if (queued == passes.end()) return; + auto& order = queued->second; + while (!order.empty() && order.front().first <= received) { + const auto [serial, key] = order.front(); + order.pop_front(); + const auto found = entries.find(key); + if (found == entries.end()) continue; + if (found->second.passed == serial) { + found->second.passed = 0; + passCounts[slot(key)].fetch_sub(1, std::memory_order_relaxed); + } + if (found->second.taken == serial) found->second.taken = 0; + if (found->second.passed == 0 && found->second.taken == 0) entries.erase(found); + } + if (order.empty()) passes.erase(queued); + } + + bool Empty() const { + return entries.empty() && passes.empty(); + } + +private: + struct Entry { + std::uint64_t passed = 0; + std::uint64_t taken = 0; + }; + + static constexpr std::size_t PassSlotBits = 12; + + static std::uint64_t queueDword(std::uint32_t queue, std::uint64_t dword) { + return dword | (static_cast(queue) << 56u); + } + + static std::size_t slot(std::uint64_t key) { + return static_cast(((key >> 2u) * 0x9e3779b97f4a7c15ull) >> (64u - PassSlotBits)); + } + + std::unordered_map entries; + std::unordered_map>> passes; + std::array, std::size_t{1} << PassSlotBits> passCounts{}; +}; + +} + +#endif diff --git a/core/libs/prx/libSceAgcDriver/Execution/include/ShaderMemory.hpp b/core/libs/prx/libSceAgcDriver/Execution/include/ShaderMemory.hpp index 269104b0bc..f0edd61fd1 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/include/ShaderMemory.hpp +++ b/core/libs/prx/libSceAgcDriver/Execution/include/ShaderMemory.hpp @@ -87,6 +87,7 @@ public: }; static VouchCounts Vouches(); static bool Vouched(PendingWriteQuery pending, std::uint64_t address, std::uint64_t bytes, const ShaderRecompiler::SrtWriteStamp& stamp); + static std::uint64_t descriptorScope(void* context, std::size_t bytes); private: std::shared_ptr capture(const ShaderRecompiler::RecompileRequest& request, const ShaderRecompiler::SourceHandle* handle, const ShaderRecompiler::PreparedShaderInvocation* invocation); @@ -143,7 +144,6 @@ private: static ShaderRecompiler::SrtWriteStamp stampWrites(void* context, std::uint64_t address, std::uint64_t bytes); static bool unchangedSince(void* context, std::uint64_t address, std::uint64_t bytes, const ShaderRecompiler::SrtWriteStamp& stamp); static bool supplyWords(void* context, const std::shared_ptr& words); - static std::uint64_t descriptorScope(void* context, std::size_t bytes); bool invalidateRawPages(); Page& page(std::uint64_t base); [[nodiscard]] std::size_t pageAtOrAfter(std::uint64_t base) const; diff --git a/core/libs/prx/libSceAgcDriver/Execution/include/VulkanDevice.hpp b/core/libs/prx/libSceAgcDriver/Execution/include/VulkanDevice.hpp index 1b61253b6f..708765ac4e 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/include/VulkanDevice.hpp +++ b/core/libs/prx/libSceAgcDriver/Execution/include/VulkanDevice.hpp @@ -25,6 +25,7 @@ namespace AgcDriver { namespace Graphics { class StorageTexture; +struct HtileMaskClear; } // Stage A of a dispatch's resource build (see VulkanDevice::PrepareDispatch); opaque to callers. @@ -107,7 +108,7 @@ public: // mutex through the flush hook, so a thread submitting on another queue's behalf (a WAIT_REG_MEM // poller, a compute worker's between-packet flush) passes false: it must only submit, never wait. void SubmitRecorded(bool reapFirst = true); - void StoreIdleResults(bool reapFirst = true); + void StoreIdleResults(bool reapFirst = true, const std::function& stop = [] { return false; }); // Unlocked drain: SubmitAndEpoch (under the mutex) returns the serial covering every recorded // batch (0: nothing in flight); WaitRecorded(serial) waits for it WITHOUT the mutex (the caller // holds a shared_ptr to this device); ReapRecorded(serial) (under the mutex) runs the completions @@ -145,6 +146,7 @@ public: // every recorded store over the range. bool FillBuffer(std::uint64_t address, std::size_t bytes, std::span pattern); bool DumpSamplesOnGpu(std::uint64_t address); + void NoteHtileMask(const Graphics::HtileMaskClear& clear) const; // Copies `bytes` of guest memory from `source` to `destination` (disjoint ranges) in place of the // engine's memcpy kernel (Driver.cpp copyBuffer). `path` 0: copied on the CPU at once, when // every test of the rule holds (each a pure query, nothing flushed or recorded before the @@ -296,7 +298,7 @@ public: // records. Null when nothing is prepared: the resource cache may serve the dispatch (its // Revalidate stays under the mutex), or APS5_LOCKED_BUILD=1 keeps the whole build under it as // before. `shader` and `snapshots` must outlive the dispatch. - std::shared_ptr PrepareDispatch(const ShaderRecompiler::RecompileResult& shader, std::span snapshots, std::uint64_t dispatchThreads = 0, std::uint64_t programAddress = 0); + std::shared_ptr PrepareDispatch(const ShaderRecompiler::RecompileResult& shader, std::span snapshots, std::uint64_t dispatchThreads = 0, std::uint64_t programAddress = 0, std::optional> htileClear = std::nullopt); // APS5_PROFILE_DRAW: the parts of a PrepareDispatch in milliseconds, in the order key, find, // precollect, presync, stage A (the driver's 'prepare:' rows). static std::span PreparePhaseMs(const PreparedDispatch& prepared); diff --git a/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Dispatch/Dispatch.cpp b/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Dispatch/Dispatch.cpp index e287efc794..c443f79492 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Dispatch/Dispatch.cpp +++ b/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Dispatch/Dispatch.cpp @@ -136,6 +136,7 @@ void Driver::dispatch(QueueState& queue, std::span packet, const bool pipelineCandidate = !resolving && !fromAhead && DispatchItemsEnabled() && DrawPipeline::Active() && indirectArguments == 0 && deferredLabels().labels.empty() && !matchesCopyKernel(std::span(snapshot.code).subspan(codeOffset), userData, compute) && !MatchesStreamCopyKernel(std::span(snapshot.code).subspan(codeOffset), userData, compute) && !MatchesIndexedCopyKernel(std::span(snapshot.code).subspan(codeOffset), userData, compute); const bool partialLastGroup = partialGroups != std::array{}; std::optional> htileClearCompletion; + Graphics::HtileMaskClear htileMask; if (resolving) { if (indirectArguments == 0 && Graphics::MatchMultisampledSingleClear(std::span(snapshot.code).subspan(codeOffset), userData, compute.numThreads)) return; if (!partialLastGroup && matchesFillKernel(std::span(snapshot.code).subspan(codeOffset), userData, compute)) return; @@ -158,6 +159,10 @@ void Driver::dispatch(QueueState& queue, std::span packet, const auto nativeBytes = Graphics::HtileDepthClearBytes_nid_no_patch(std::span(snapshot.code).subspan(codeOffset), userData, compute, packet, indirectArguments); const auto bytes = static_cast(threads * 16u); if (Graphics::NoteHtileDepthClear(htile, bytes, nativeBytes)) htileClearCompletion = std::pair{htile, bytes}; + if (nativeBytes != 0u) htileMask = {htile, nativeBytes, userData[5], userData[4]}; + } else if (const auto buffered = Graphics::MatchHtileBufferMaskClear(std::span(snapshot.code).subspan(codeOffset), userData, compute, packet, indirectArguments)) { + if (Graphics::NoteHtileDepthClear(buffered->address, buffered->bytes, buffered->bytes)) htileClearCompletion = std::pair{buffered->address, buffered->bytes}; + htileMask = *buffered; } if (!partialLastGroup && indirectArguments == 0 && copyBuffer(queue, submission.queue, packet, std::span(snapshot.code).subspan(codeOffset), userData, compute, localDevice, address)) { pendingDispatchPhases().outcome = DispatchOutcome::CopyHle; @@ -493,7 +498,7 @@ void Driver::dispatch(QueueState& queue, std::span packet, const auto epoch = DrawPipeline::EpochToken().load(std::memory_order_relaxed); const auto queueId = submission.queue; itemCommits.fetch_add(1, std::memory_order_relaxed); - DrawPipeline::Queue0().Enqueue([this, localDevice = std::move(localDevice), result = compiledResult, snapshots = std::move(snapshots), liveWords = std::move(liveWords), groups, address, queueId, recipe, keepVariant, dataHit, epoch, htileClearCompletion] { + DrawPipeline::Queue0().Enqueue([this, localDevice = std::move(localDevice), result = compiledResult, snapshots = std::move(snapshots), liveWords = std::move(liveWords), groups, address, queueId, recipe, keepVariant, dataHit, epoch, htileClearCompletion, htileMask] { DrawPipeline::FollowEpoch(epoch); GuestMemory::SetCurrentPacket(0x15, queueId); const auto& compiledCommit = *result; @@ -504,7 +509,7 @@ void Driver::dispatch(QueueState& queue, std::span packet, bool writersNoted = false; for (;;) { std::shared_ptr prepared; - if (recipeHit == nullptr || VulkanDevice::VerifyRecipes() || htileClearCompletion.has_value()) prepared = localDevice->PrepareDispatch(compiledCommit, snapshots); + if (recipeHit == nullptr || VulkanDevice::VerifyRecipes() || htileClearCompletion.has_value()) prepared = localDevice->PrepareDispatch(compiledCommit, snapshots, 0, address, htileClearCompletion); GuestMemory::TagGpuLockSite(GuestMemory::GpuLockSite::Dispatch); std::lock_guard gpuLock(GuestMemory::GpuMutex()); recordLabelsForPacket(localDevice.get(), queueId); @@ -524,6 +529,7 @@ void Driver::dispatch(QueueState& queue, std::span packet, } else { localDevice->Dispatch(compiledCommit, groups[0], groups[1], groups[2], snapshots, address, std::move(prepared), htileClearCompletion.has_value() ? nullptr : &builtRecipe, htileClearCompletion); } + if (htileMask.bytes != 0u) localDevice->NoteHtileMask(htileMask); break; } if (noteWrites && !writerKeyedEvidence()) noteWrittenBuffers(address, queueId, compiledCommit); @@ -577,7 +583,7 @@ void Driver::dispatch(QueueState& queue, std::span packet, std::shared_ptr prepared; if (recipeHit == nullptr || VulkanDevice::VerifyRecipes()) { try { - prepared = localDevice->PrepareDispatch(compiled, snapshots, dispatchThreads, address); + prepared = localDevice->PrepareDispatch(compiled, snapshots, dispatchThreads, address, htileClearCompletion); } catch (const std::exception& error) { if (rethrow(error)) return; } @@ -635,6 +641,7 @@ void Driver::dispatch(QueueState& queue, std::span packet, const auto note = keysRecorder->LastWriteNote(keysFill->base, keysFill->bytes); if (note != 0 && note != keysNoteBefore) Graphics::NoteKeysFillOnGpu(keysFill->base, keysFill->bytes, *filledKeys); } + if (htileMask.bytes != 0u) localDevice->NoteHtileMask(htileMask); if (builtRecipe != nullptr) { if (dataHit) { diff --git a/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp b/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp index 10ccca5989..04568afd5b 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp +++ b/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp @@ -657,7 +657,7 @@ DrawVerdict Driver::draw(QueueState& queue, std::span packe throw; } for (std::size_t i = 0; i < matched.size(); ++i) { - if (matched[i] == nullptr || matched[i]->shaderDataPatches.empty()) continue; + if (matched[i] == nullptr || (matched[i]->shaderDataPatches.empty() && matched[i]->descriptorPatches.empty())) continue; applyShaderDataPatches(*matched[i]); if (stageData[i].compiled != nullptr) stageData[i].compiled = patchDataWords(*matched[i], stageData[i].words); } diff --git a/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawCapture.cpp b/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawCapture.cpp index b7739ec6f8..c33af99f90 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawCapture.cpp +++ b/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawCapture.cpp @@ -237,7 +237,9 @@ void Driver::cacheDrawStages(bool useDrawEntries, bool drawHit, const Pm4::DrawP std::vector regions(stageCapture.regions.begin(), stageCapture.regions.end()); for (const auto& read : decodeReads[i]) regions.push_back({read.address, read.Bytes()}); std::stable_sort(regions.begin(), regions.end(), [](const ShaderRecompiler::MemoryRegion& a, const ShaderRecompiler::MemoryRegion& b) { return a.guestAddress < b.guestAddress; }); - tagVariantRuns(*variant, regions, stageCapture.userDataUse, decodeReads[i].empty() && (!vertexInfos[i] || vertexInfos[i]->resourcesNum == 0), programs[i].hiddenUserWords, stageCapture.supplied); + const bool relocatable = decodeReads[i].empty() && (!vertexInfos[i] || vertexInfos[i]->resourcesNum == 0); + tagVariantRuns(*variant, regions, stageCapture.userDataUse, relocatable, programs[i].hiddenUserWords, stageCapture.supplied); + if (relocatable) tagUserValueWords(*variant, programs[i]); if (drawStageDataHits() && stageCapture.capture != nullptr && !stageCapture.capture->readTrace.leaves.empty()) recordStageDataPositions(*variant, *stageCapture.capture, decodeReads[i]); if (traceDrawCache() && entry != nullptr && matched[i] == nullptr && i < entry->stages.size()) { const auto& variants = entry->stages[i]; diff --git a/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawRelocate.cpp b/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawRelocate.cpp index c03e05baea..52a8c3c292 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawRelocate.cpp +++ b/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawRelocate.cpp @@ -1,4 +1,6 @@ #include "prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp" +#include "ControlFlow/GraphBuilder.hpp" +#include "RdnaDecoder/RdnaInstructionDecoder.hpp" #include "prx/libSceAgcDriver/Execution/include/Driver/Diagnostics.hpp" #include "prx/libSceAgcDriver/Execution/include/GuestMemory.hpp" #include "prx/libSceAgcDriver/Execution/include/ProfileOutput.hpp" @@ -9,6 +11,8 @@ #include #include #include +#include +#include namespace AgcDriver::DriverDetail { @@ -34,6 +38,7 @@ std::uint64_t Driver::relocatedContentKey(const RelocatableUserWord& word, std:: hash ^= mixed; hash *= 0x100000001b3ull; }; + if (word.value) return hash; mix(value & 3u); if (value == 0) { readable = false; @@ -45,7 +50,7 @@ std::uint64_t Driver::relocatedContentKey(const RelocatableUserWord& word, std:: mix(words); for (std::size_t done = 0; done < words; done += MaxContentWords) { const auto count = std::min(words - done, MaxContentWords); - const auto address = AlignedWord(value) + static_cast(offset) + done * sizeof(std::uint32_t); + const auto address = (static_cast(word.high) << 32u) + AlignedWord(value) + static_cast(offset) + done * sizeof(std::uint32_t); if (GuestMemory::CopyMapped(address, std::as_writable_bytes(std::span(content).first(count))) != GuestMemory::Compare::Equal) { readable = false; return hash; @@ -56,6 +61,80 @@ std::uint64_t Driver::relocatedContentKey(const RelocatableUserWord& word, std:: return hash; } +void Driver::tagUserValueWords(DispatchVariant& variant, const DrawProgram& program) { + if (!drawRelocationEnabled() || variant.compiled == nullptr) return; + const auto& compiled = *variant.compiled; + const auto& forwarded = compiled.shaderDataUserWords; + const auto users = std::min(program.userData.size(), 64); + const auto bound = [&](std::uint32_t value) { + std::size_t count = 0; + for (const auto& binding : compiled.bindings) count += static_cast(std::count(binding.guestDescriptor.begin(), binding.guestDescriptor.end(), value)); + return count; + }; + const auto elsewhere = [&](std::uint32_t index, std::uint32_t value) { + for (std::size_t slot = 0; (slot + 1) * sizeof(std::uint32_t) <= compiled.pushConstants.size(); ++slot) { + std::uint32_t word = 0; + std::memcpy(&word, compiled.pushConstants.data() + slot * sizeof(std::uint32_t), sizeof(word)); + if (word == value && (slot >= forwarded.size() || forwarded[slot] != index)) return true; + } + if (std::any_of(compiled.specialization.begin(), compiled.specialization.end(), [&](const auto& constant) { return constant.value == value; })) return true; + return std::find(variant.words.begin(), variant.words.end(), value) != variant.words.end(); + }; + const auto readThrough = [&](const std::uint32_t* descriptor) { + const auto base = static_cast(descriptor[0]) | static_cast(descriptor[1] & 0xffffu) << 32u; + const auto stride = (descriptor[1] >> 16u) & 0x3fffu; + const auto bytes = std::max(stride != 0 ? static_cast(stride) * descriptor[2] : descriptor[2], 16u); + return std::any_of(variant.runs.begin(), variant.runs.end(), [&](const auto& run) { return run.first < base + bytes && run.second > base; }); + }; + const auto taken = [&](std::uint32_t index) { return ((variant.relocatableWords | variant.valueWords | variant.calleeWords) >> index & 1u) != 0; }; + if (ShaderRecompiler::GcnGuestShaders() && program.binary.stage == ShaderRecompiler::ShaderStage::Vertex) { + for (const auto instruction : program.binary.code) { + if ((instruction & 0xff80ff00u) != 0xbe802100u) continue; + const auto target = instruction & 0xffu; + if (target < program.firstUserSgpr) continue; + const auto index = program.hiddenUserWords + target - program.firstUserSgpr; + if (index + 1 >= users || taken(index) || taken(index + 1)) continue; + const auto low = program.userData[index]; + const auto address = static_cast(low) | static_cast(program.userData[index + 1]) << 32u; + if (address == 0 || address % 4u != 0 || bound(low) != 0 || elsewhere(index, low)) continue; + std::array code; + if (GuestMemory::CopyMapped(address, std::as_writable_bytes(std::span(code))) != GuestMemory::Compare::Equal) continue; + std::optional length; + try { + length = ShaderRecompiler::UserDataCalleeLength(code, (instruction >> 16u) & 0x7fu); + } catch (const std::exception&) { + continue; + } + if (!length || *length == 0) continue; + variant.calleeWords |= std::uint64_t {1} << index; + variant.calleeReads.emplace_back(index, *length); + } + } + for (std::uint32_t index = program.hiddenUserWords; index + 2 < users; ++index) { + const auto base = program.userData[index]; + if (base == 0 || taken(index) || bound(base) != 1 || elsewhere(index, base)) continue; + std::uint32_t binding = 0, word = 0; + for (std::size_t b = 0; b < compiled.bindings.size(); ++b) { + const auto& descriptor = compiled.bindings[b].guestDescriptor; + const auto found = std::find(descriptor.begin(), descriptor.end(), base); + if (found == descriptor.end()) continue; + binding = static_cast(b); + word = static_cast(found - descriptor.begin()); + } + const auto& target = compiled.bindings[binding]; + const auto element = word / 4u; + const bool readOnly = target.role == ShaderRecompiler::DescriptorRole::GuestBuffers && target.guestDescriptor.size() == static_cast(target.count) * 4u && word % 4u == 0 && element < target.bufferWritten.size() && !target.bufferWritten[element] && (element >= target.bufferAtomic.size() || !target.bufferAtomic[element]); + if (!readOnly || target.guestDescriptor[word + 1] != program.userData[index + 1] || target.guestDescriptor[word + 2] != program.userData[index + 2] || readThrough(target.guestDescriptor.data() + word)) continue; + variant.valueWords |= std::uint64_t {1} << index; + variant.valueSlots.push_back({index, binding, word}); + const auto records = program.userData[index + 2]; + if (records != 0 && !taken(index + 2) && bound(records) == 1 && !elsewhere(index + 2, records)) { + variant.valueWords |= std::uint64_t {1} << (index + 2); + variant.valueSlots.push_back({index + 2, binding, word + 2}); + } + } +} + void Driver::tagVariantRuns(DispatchVariant& variant, std::span regions, const ShaderRecompiler::SrtUserDataUse& use, bool eligible, std::uint32_t hiddenWords, std::span> supplied) { std::uint64_t relocatable = eligible && drawRelocationEnabled() ? use.asBase & ~use.asValue : 0; if (hiddenWords != 0) relocatable &= hiddenWords >= 64 ? 0 : ~((std::uint64_t {1} << hiddenWords) - 1); @@ -149,7 +228,9 @@ void Driver::learnPendingRelocation() { for (std::uint32_t index = program.hiddenUserWords; index < program.userData.size() && index < 64; ++index) { const auto reg = program.userDataBase + index - program.hiddenUserWords; const auto held = std::find_if(shape->words.begin(), shape->words.end(), [&](const RelocatableUserWord& word) { return word.reg == reg; }); - if ((variant.relocatableWords >> index & 1u) == 0) { + const bool relocatable = (variant.relocatableWords >> index & 1u) != 0; + const bool value = !relocatable && (variant.valueWords >> index & 1u) != 0; + if (!relocatable && !value && (variant.calleeWords >> index & 1u) == 0) { if (held == shape->words.end()) continue; shape->words.erase(held); shape->banned.push_back(reg); @@ -157,7 +238,12 @@ void Driver::learnPendingRelocation() { continue; } if (held != shape->words.end() || std::find(shape->banned.begin(), shape->banned.end(), reg) != shape->banned.end()) continue; - RelocatableUserWord word{reg, {}}; + RelocatableUserWord word{reg, {}, value}; + for (const auto& [callee, length] : variant.calleeReads) { + if (callee != index) continue; + word.reads.emplace_back(0, length); + word.high = program.userData[index + 1]; + } const auto base = AlignedWord(program.userData[index]); for (std::size_t run = 0; run < variant.runs.size() && run < variant.runBases.size(); ++run) { if (variant.runBases[run] != static_cast(index)) continue; @@ -215,7 +301,7 @@ void Driver::relocateDrawEntry(const QueueState& queue, std::uint64_t alias, std } for (const auto& variant : donor->stages[i]) { if (variant == nullptr || variant->compiled == nullptr) continue; - const bool allowed = std::all_of(moves.begin(), moves.end(), [&](const Move& move) { return move.program != i || (move.index < 64 && (variant->relocatableWords >> move.index & 1u) != 0 && move.from != 0 && move.to != 0 && ((move.from ^ move.to) & 3u) == 0); }); + const bool allowed = std::all_of(moves.begin(), moves.end(), [&](const Move& move) { return move.program != i || (move.index < 64 && move.from != 0 && move.to != 0 && ((((variant->relocatableWords | variant->calleeWords) >> move.index & 1u) != 0 && ((move.from ^ move.to) & 3u) == 0) || (variant->valueWords >> move.index & 1u) != 0)); }); if (!allowed) { ++counters.refused; continue; @@ -224,6 +310,10 @@ void Driver::relocateDrawEntry(const QueueState& queue, std::uint64_t alias, std copy->runs = variant->runs; copy->runBases = variant->runBases; copy->relocatableWords = variant->relocatableWords; + copy->valueWords = variant->valueWords; + copy->valueSlots = variant->valueSlots; + copy->calleeWords = variant->calleeWords; + copy->calleeReads = variant->calleeReads; copy->words = variant->words; copy->forgetSerial = variant->forgetSerial; copy->compiled = variant->compiled; @@ -246,6 +336,9 @@ void Driver::relocateDrawEntry(const QueueState& queue, std::uint64_t alias, std for (std::uint32_t slot = 0; slot < forwarded.size(); ++slot) { if (forwarded[slot] == move.index) copy->shaderDataPatches.emplace_back(slot, move.to); } + for (const auto& [index, binding, word] : variant->valueSlots) { + if (index == move.index) copy->descriptorPatches.push_back({binding, word, move.to}); + } } relocated->stages[i].push_back(std::move(copy)); } @@ -257,7 +350,7 @@ void Driver::relocateDrawEntry(const QueueState& queue, std::uint64_t alias, std } void Driver::applyShaderDataPatches(DispatchVariant& variant) { - if (variant.shaderDataPatches.empty()) return; + if (variant.shaderDataPatches.empty() && variant.descriptorPatches.empty()) return; auto rebased = std::make_shared(*variant.compiled); for (const auto& [slot, value] : variant.shaderDataPatches) { const auto at = static_cast(slot) * sizeof(std::uint32_t); @@ -266,8 +359,12 @@ void Driver::applyShaderDataPatches(DispatchVariant& variant) { if (binding.role == ShaderRecompiler::DescriptorRole::ShaderData && slot < binding.guestDescriptor.size()) binding.guestDescriptor[slot] = value; } } + for (const auto& [binding, word, value] : variant.descriptorPatches) { + if (binding < rebased->bindings.size() && word < rebased->bindings[binding].guestDescriptor.size()) rebased->bindings[binding].guestDescriptor[word] = value; + } variant.compiled = std::move(rebased); variant.shaderDataPatches.clear(); + variant.descriptorPatches.clear(); } void Driver::reportDrawRelocation() { diff --git a/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Queues/QueueWorker.cpp b/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Queues/QueueWorker.cpp index a620cb1849..7ce73fefc9 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Queues/QueueWorker.cpp +++ b/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Queues/QueueWorker.cpp @@ -216,7 +216,7 @@ void Driver::run(std::uint32_t id) noexcept { } lock.unlock(); if (storeIdleResults) { - if (const auto localDevice = device.Load()) localDevice->StoreIdleResults(); + if (const auto localDevice = device.Load()) localDevice->StoreIdleResults(true, [&] { return worker.queued.load(std::memory_order_acquire) != 0 || runningWorkers.load(std::memory_order_acquire) != 0; }); } lock.lock(); if (ready()) break; @@ -278,6 +278,7 @@ void Driver::run(std::uint32_t id) noexcept { running.Start(); if (profile && submission.enqueuedAt != std::chrono::steady_clock::time_point{}) costs.dequeueNs += static_cast(std::chrono::duration_cast(std::chrono::steady_clock::now() - submission.enqueuedAt).count()); } + retireLabelTakes(id, submission.received); execute(submission); if (submission.progress && submission.rewindTail == nullptr && !completionDeferred()) submitOpenWork(submission.progress); if (traceGpu) std::fprintf(stderr, "[gpu] %.1f done serial=%llu queue=0x%x\n", TraceMs(), static_cast(submission.serial), id); diff --git a/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Queues/Submission.cpp b/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Queues/Submission.cpp index 7b452b32f3..76facb3cd7 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Queues/Submission.cpp +++ b/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Queues/Submission.cpp @@ -13,11 +13,14 @@ #include "prx/libSceAgcDriver/Eq/include/Event.hpp" #include "ThreadOwned.hpp" #include "prx/libc/include/HostThreadLocal.hpp" +#include +#include #include #include #include #include #include +#include namespace AgcDriver::DriverDetail { @@ -320,6 +323,53 @@ void Driver::reserveOutputs(Submission& submission) { for (const auto token : eopTokens) eopFlips.erase(token); } +namespace { + +std::vector BoundGraphicsPrograms(const Submission& submission) { + constexpr std::array programRegisters{0x008u, 0x048u, 0x088u, 0x0c8u, 0x108u, 0x148u}; + static std::array, programRegisters.size()> lastHigh{}; + std::array, programRegisters.size()> low{}; + std::array written{}; + std::vector programs; + const auto note = [&](std::uint32_t offset, std::uint32_t value) { + for (std::size_t program = 0; program < programRegisters.size(); ++program) { + if (offset == programRegisters[program] + 1u) lastHigh[program].store(value & 0xffu, std::memory_order_relaxed); + else if (offset == programRegisters[program]) low[program] = value; + else continue; + written[program] = true; + } + }; + const auto flush = [&] { + for (std::size_t program = 0; program < programRegisters.size(); ++program) { + if (!written[program] || !low[program]) continue; + written[program] = false; + programs.push_back((static_cast(*low[program]) << 8u) | (static_cast(lastHigh[program].load(std::memory_order_relaxed)) << 40u)); + } + }; + const auto& commands = submission.commands; + for (std::size_t cursor = 0; cursor < commands.size();) { + const auto header = commands[cursor]; + const auto count = Pm4::PacketWords(header); + if (cursor + count > commands.size()) break; + const auto packet = std::span(commands).subspan(cursor, count); + const auto opcode = (header >> 8u) & 0xffu; + if (!Pm4::FillerPacket(header) && opcode == 0x76 && count > 2 && !Pm4::IsTagMarker(packet)) { + for (std::size_t index = 2; index < count; ++index) note((packet[1] & ~0x70000000u) + static_cast(index - 2), packet[index]); + } else if (!Pm4::FillerPacket(header) && opcode == 0x63) { + if (const auto found = submission.registerLists.find(cursor); found != submission.registerLists.end()) { + for (std::size_t index = 0; index + 1 < found->second.size(); index += 2) note(found->second[index] & ~0x70000000u, found->second[index + 1]); + } + } + flush(); + cursor += count; + } + std::ranges::sort(programs); + programs.erase(std::ranges::unique(programs).begin(), programs.end()); + return programs; +} + +} + void Driver::executeRewindTail(const Submission& stalled) { PerformanceTimer timing("Driver.Rewind"); static const bool ring = ReadSubmissionRingSettings(); @@ -357,11 +407,13 @@ void Driver::executeRewindTail(const Submission& stalled) { if (APS5_ENABLE_TIMING_LOG) tail.copiedAt = std::chrono::steady_clock::now(); validate(tail, stalled.rewindTail); readRegisterLists(tail); + if (LibraryPrebuildsWaiting()) PrioritizeLibraryPrebuilds(BoundGraphicsPrograms(tail)); if (APS5_ENABLE_TIMING_LOG) tail.validatedAt = std::chrono::steady_clock::now(); waitForFlipRoom(tail); if (APS5_ENABLE_TIMING_LOG) tail.roomReadyAt = std::chrono::steady_clock::now(); auto* const capture = SubmissionCapture::Active(); auto captured = capture != nullptr ? SubmissionCapture::Prepare(tail.queue, SubmissionKind::Rewind, tail.commands, tail.conditionalEnds) : CapturedSubmission{}; + std::uint64_t retiredTakes = 0; { std::lock_guard lock(mutex); rethrowFailure(); @@ -370,12 +422,15 @@ void Driver::executeRewindTail(const Submission& stalled) { tail.shaders = shaders; tail.serial = stalled.serial; tail.received = ++eventSerial; + const auto& waiting = workers[tail.queue].pending; + retiredTakes = waiting.empty() ? tail.received : std::min(tail.received, waiting.front().received); if (capture != nullptr) capture->Take(captured, tail.serial, captureTime(), tail.heldAtSubmit); if (ring) RecordSubmission(tail.queue, tail.serial, tail.commands, stalled.rewindTail, true); } if (capture != nullptr) writeCaptured(*this, *capture, captured); if (APS5_ENABLE_TIMING_LOG) tail.enqueuedAt = tail.dequeuedAt = tail.orderedAt = std::chrono::steady_clock::now(); timing.Finish(); + retireLabelTakes(tail.queue, retiredTakes); execute(tail); } @@ -417,6 +472,7 @@ void Driver::Submit(const Packet* packet, std::uint32_t queue, bool cpuFlip) { waitForFlipRoom(submission); holdFlipBehindWorker(submission); AwaitRegistrationPreparation(); + if (LibraryPrebuildsWaiting()) PrioritizeLibraryPrebuilds(BoundGraphicsPrograms(submission)); if (APS5_ENABLE_TIMING_LOG) submission.roomReadyAt = std::chrono::steady_clock::now(); static const bool trace = std::getenv("APS5_TRACE_GPU") != nullptr; if (trace) std::fprintf(stderr, "[gpu] %.1f submit queue=0x%x dwords=%zu at %p\n", TraceMs(), queue, submission.commands.size(), static_cast(descriptor.addr)); diff --git a/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp b/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp index c3772a2f33..8de23ca03e 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp +++ b/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp @@ -1221,6 +1221,7 @@ struct RegisteredPreparation { std::optional request; std::vector abiKey; std::shared_ptr prebuildDevice; + std::uint64_t program = 0; }; bool RegistrationPrepareWithinMemoryBudget(); @@ -1267,6 +1268,7 @@ std::unique_ptr PlanRegistered(const ShaderSnapshot& snap const auto code = std::span(snapshot.code).subspan(codeOffset); auto plan = std::make_unique(); plan->codeOffset = codeOffset; + plan->program = address; ShaderRecompiler::RdnaProgram decoded; plan->registration = registration; try { @@ -1351,7 +1353,7 @@ bool LibraryPrebuildDisabled() { return disabled; } -void PrebuildStageLibrary(const std::shared_ptr& device, const Graphics::ShaderStages& stages, ShaderRecompiler::ShaderStage stage, std::shared_ptr result, std::uint32_t pushOffset) { +void PrebuildStageLibrary(const std::shared_ptr& device, const Graphics::ShaderStages& stages, ShaderRecompiler::ShaderStage stage, std::shared_ptr result, std::uint32_t pushOffset, std::uint64_t program) { if (LibraryPrebuildDisabled() || result == nullptr || (stage != ShaderRecompiler::ShaderStage::Vertex && stage != ShaderRecompiler::ShaderStage::Fragment)) return; SubmitLibraryPrebuild([device, stages, stage, result = std::move(result), pushOffset] { const std::array shaders{{{stage, result.get(), pushOffset}}}; @@ -1360,7 +1362,7 @@ void PrebuildStageLibrary(const std::shared_ptr& device, const Gra } catch (const std::exception& error) { APS5_LOG_OUT("shader library prebuild skipped: %s", error.what()); } - }); + }, program); } std::vector PrepareRegistered(RegisteredPreparation& plan) { @@ -1374,7 +1376,7 @@ std::vector PrepareRegistered(RegisteredPreparation& pla append(); if (plan.prebuildDevice != nullptr && request.target.registrationModules && request.shader.stage == ShaderRecompiler::ShaderStage::Fragment && !LibraryPrebuildDisabled()) { try { - PrebuildStageLibrary(plan.prebuildDevice, {Graphics::ShaderPath::Vertex, 0u, 32u, request.context.waveSize, {}, {}}, request.shader.stage, ShaderRecompiler::RegistrationResult(request, *entries.front().handle), request.layout.pushConstantOffsetBytes); + PrebuildStageLibrary(plan.prebuildDevice, {Graphics::ShaderPath::Vertex, 0u, 32u, request.context.waveSize, {}, {}}, request.shader.stage, ShaderRecompiler::RegistrationResult(request, *entries.front().handle), request.layout.pushConstantOffsetBytes, plan.program); } catch (const std::exception& error) { APS5_LOG_OUT("shader library prebuild skipped: %s", error.what()); } @@ -1566,13 +1568,14 @@ private: public: - void Submit(std::function task, const PreparedShaders* prepared = nullptr, bool budgeted = false) { + void Submit(std::function task, const PreparedShaders* prepared = nullptr, bool budgeted = false, std::uint64_t program = 0) { { std::unique_lock lock(mutex); if (threads != 0 && !closed) { const auto sequence = ++submitted; - if (prepared != nullptr && prepared->demanded.load()) tasks.push_front({std::move(task), prepared, sequence, budgeted}); - else tasks.push_back({std::move(task), prepared, sequence, budgeted}); + if (prepared != nullptr && prepared->demanded.load()) tasks.push_front({std::move(task), prepared, sequence, budgeted, program}); + else tasks.push_back({std::move(task), prepared, sequence, budgeted, program}); + if (program != 0) waitingPrograms.fetch_add(1, std::memory_order_relaxed); unfinished.insert(sequence); lock.unlock(); ready.notify_one(); @@ -1590,6 +1593,16 @@ public: std::rotate(tasks.begin(), found, std::next(found)); } + void Prioritize(std::span programs) { + const auto bound = [&](const Task& task) { return task.program != 0 && std::ranges::binary_search(programs, task.program); }; + std::lock_guard lock(mutex); + if (std::ranges::any_of(tasks, bound)) std::stable_partition(tasks.begin(), tasks.end(), bound); + } + + bool ProgramsWaiting() const { + return waitingPrograms.load(std::memory_order_relaxed) != 0; + } + void AwaitSubmitted() { std::unique_lock lock(mutex); const auto ticket = submitted; @@ -1604,6 +1617,7 @@ public: closed = true; if (dropQueued) { dropped.swap(tasks); + waitingPrograms.store(0, std::memory_order_relaxed); for (const auto& task : dropped) unfinished.erase(task.sequence); idle.notify_all(); } @@ -1688,6 +1702,7 @@ private: } task = std::move(*next); pool.tasks.erase(next); + if (task.program != 0) pool.waitingPrograms.fetch_sub(1, std::memory_order_relaxed); ++pool.running; if (task.budgeted) ++pool.budgetedRunning; } @@ -1717,12 +1732,14 @@ private: const PreparedShaders* prepared = nullptr; std::uint64_t sequence = 0; bool budgeted = false; + std::uint64_t program = 0; }; std::mutex mutex; std::condition_variable ready; std::condition_variable idle; std::deque tasks; + std::atomic waitingPrograms{0}; std::vector workers; unsigned threads = 0; inline static std::atomic liveWorkers{0}; @@ -1807,8 +1824,17 @@ void AwaitRegistrationPreparation() { if (auto* pool = RegistrationPreparePool::Existing()) pool->AwaitSubmitted(); } -void SubmitLibraryPrebuild(std::function task) { - RegistrationPreparePool::Prebuild().Submit(std::move(task)); +void SubmitLibraryPrebuild(std::function task, std::uint64_t program) { + RegistrationPreparePool::Prebuild().Submit(std::move(task), nullptr, false, program); +} + +bool LibraryPrebuildsWaiting() { + auto* pool = RegistrationPreparePool::ExistingPrebuild(); + return pool != nullptr && pool->ProgramsWaiting(); +} + +void PrioritizeLibraryPrebuilds(std::span programs) { + if (auto* pool = RegistrationPreparePool::ExistingPrebuild(); pool != nullptr && !programs.empty()) pool->Prioritize(programs); } void SubmitComputePrebuild(std::function task) { @@ -2013,6 +2039,11 @@ void Driver::ResolveGraphicsStagesAbi(std::span stages, std return; } auto prepared = PrepareGraphicsStages(decoded, localDevice->Target(), true); + if (decoded.state.stages.path == Graphics::ShaderPath::Vertex) { + for (const auto& stage : prepared) { + if (stage.registration != nullptr) PrebuildStageLibrary(localDevice, decoded.state.stages, stage.stage, stage.registration, stage.pushOffset, stage.snapshot->codeAddress + stage.entry.codeOffset * sizeof(std::uint32_t)); + } + } for (auto& stage : prepared) { if (stage.entry.handle == nullptr) continue; const auto& entries = transaction.Read(*stage.snapshot).entries; @@ -2023,11 +2054,6 @@ void Driver::ResolveGraphicsStagesAbi(std::span stages, std if (stage.snapshot->type == 1) continue; ResolvePreparedGraphics(*stage.snapshot, {}, primitiveType == state.userConfig.end() ? 0u : primitiveType->second, localDevice->Target(), true); } - if (decoded.state.stages.path == Graphics::ShaderPath::Vertex) { - for (const auto& stage : prepared) { - if (stage.registration != nullptr) PrebuildStageLibrary(localDevice, decoded.state.stages, stage.stage, stage.registration, stage.pushOffset); - } - } PreparedShaderState::GraphicsAbi abi{key, registry, {}}; for (const auto& stage : prepared) abi.stages.push_back(stage.snapshot); auto& graphicsAbis = transaction.Edit(*owner).graphicsAbis; diff --git a/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Synchronization/LabelHistory.cpp b/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Synchronization/LabelHistory.cpp index db078dae9d..8b4141c7eb 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Synchronization/LabelHistory.cpp +++ b/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Synchronization/LabelHistory.cpp @@ -20,14 +20,6 @@ void Driver::noteLabelStore(std::uint64_t address, std::span by } } -namespace { - -std::uint64_t queueDword(std::uint32_t queue, std::uint64_t dword) { - return dword | (static_cast(queue) << 56u); -} - -} - void Driver::noteLabelPass(std::span packet, std::uint32_t queue) { const auto opcode = (packet[0] >> 8u) & 0xffu; if ((opcode != 0x3c && opcode != 0x93) || packet.size() < 7 || ((packet[1] >> 4u) & 3u) != 1u) return; @@ -35,20 +27,28 @@ void Driver::noteLabelPass(std::span packet, std::uint32_t const std::uint64_t address = (packet[2] & (bytes == 8 ? ~7u : ~3u)) | (static_cast(packet[3]) << 32u); const auto passed = eventSerial.load(std::memory_order_acquire); std::lock_guard lock(labelStoresMutex); - for (std::size_t offset = 0; offset < bytes; offset += 4) labelPasses[queueDword(queue, address + offset)] = passed; + for (std::size_t offset = 0; offset < bytes; offset += 4) labelTakes.Pass(queue, address + offset, passed); +} + +void Driver::retireLabelTakes(std::uint32_t queue, std::uint64_t received) { + std::lock_guard lock(labelStoresMutex); + labelTakes.Retire(queue, received); } void Driver::noteLabelIssue(std::span packet, std::uint32_t queue) { - const auto take = [&](std::uint64_t address, std::uint64_t bytes) { + const auto mayTake = [&](std::uint64_t address, std::uint64_t bytes) { for (std::uint64_t offset = 0; offset < bytes; offset += 4) { - const auto key = queueDword(queue, address + offset); - if (const auto pass = labelPasses.find(key); pass != labelPasses.end()) labelTaken[key] = pass->second; + if (labelTakes.MayHavePass(queue, address + offset)) return true; } + return false; + }; + const auto take = [&](std::uint64_t address, std::uint64_t bytes) { + for (std::uint64_t offset = 0; offset < bytes; offset += 4) labelTakes.Take(queue, address + offset); }; switch ((packet[0] >> 8u) & 0xffu) { case 0x37: case 0x49: { const auto label = Pm4::DecodeLabelWrite(packet); - if (!label.has_value() || !KeepsLabelStore(label->address, label->Bytes().size())) return; + if (!label.has_value() || !KeepsLabelStore(label->address, label->Bytes().size()) || !mayTake(label->address, label->Bytes().size())) return; std::lock_guard lock(labelStoresMutex); take(label->address, label->Bytes().size()); return; @@ -57,7 +57,7 @@ void Driver::noteLabelIssue(std::span packet, std::uint32_t default: return; } auto stores = Pm4::DecodeStores(packet); - std::erase_if(stores, [](const Pm4::PacketStore& store) { return store.conditional || !KeepsLabelStore(store.address, static_cast(store.bytes)); }); + std::erase_if(stores, [&](const Pm4::PacketStore& store) { return store.conditional || !KeepsLabelStore(store.address, static_cast(store.bytes)) || !mayTake(store.address, store.bytes); }); if (stores.empty()) return; std::lock_guard lock(labelStoresMutex); for (const auto& store : stores) take(store.address, store.bytes); @@ -70,9 +70,7 @@ bool Driver::storedSince(std::span packet, std::uint64_t ad const auto high = bytes == 8 ? labelStores.find(address + 4) : labelStores.end(); if (bytes == 8 && high == labelStores.end()) return false; std::uint64_t taken = 0; - for (std::size_t offset = 0; offset < bytes; offset += 4) { - if (const auto found = labelTaken.find(queueDword(queue, address + offset)); found != labelTaken.end()) taken = std::max(taken, found->second); - } + for (std::size_t offset = 0; offset < bytes; offset += 4) taken = std::max(taken, labelTakes.Taken(queue, address + offset)); for (const auto& store : low->second) { if (store.stamp <= received || (store.queue != queue && store.stamp <= taken)) continue; std::uint64_t value = store.value; diff --git a/core/libs/prx/libSceAgcDriver/Execution/src/FrameRecorder.cpp b/core/libs/prx/libSceAgcDriver/Execution/src/FrameRecorder.cpp index ec51eb12b6..fdaf907681 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/src/FrameRecorder.cpp +++ b/core/libs/prx/libSceAgcDriver/Execution/src/FrameRecorder.cpp @@ -494,7 +494,8 @@ void FrameRecorder::readGuest(std::uint64_t address, std::span bytes, bool FrameRecorder::abandonIfDiskLow() { std::error_code error; const auto space = std::filesystem::space(directory, error); - if (error || space.available >= MinimumFreeBytes) return false; + static const auto minimumFree = readNumber(std::getenv("APS5_FRAME_CAPTURE_MIN_FREE_BYTES"), MinimumFreeBytes); + if (error || space.available >= minimumFree) return false; stop("stopped: less than 4 GiB free on the capture volume"); return true; } diff --git a/core/libs/prx/libSceAgcDriver/Execution/src/ShaderMemory.cpp b/core/libs/prx/libSceAgcDriver/Execution/src/ShaderMemory.cpp index e1a7f3a69a..91380e6132 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/src/ShaderMemory.cpp +++ b/core/libs/prx/libSceAgcDriver/Execution/src/ShaderMemory.cpp @@ -506,7 +506,7 @@ bool ShaderMemory::readWords(void* context, std::uint64_t address, std::uint32_t std::uint64_t ShaderMemory::descriptorScope(void* context, std::size_t bytes) { auto& self = *static_cast(context); if (bytes == ShaderRecompiler::SrtDescriptorForceSync) { - ++self.forceSync; + if (self.forceSync++ == 0u && self.invalidateRawPages()) ++self.rawInvalidations; self.descriptorSpanBytes = 0; return self.rawInvalidations; } diff --git a/core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp b/core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp index 52f1d793bc..e0036db99a 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp +++ b/core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp @@ -839,6 +839,7 @@ struct VulkanDevice::State { } const double gapMs = stamped ? (lastNs - firstNs) / 1e6 - busyMs : 0; if (auto* frame = PerformanceContext::Current()) frame->NoteRetired(0, busyMs, gapMs); + if (stamped && missing == 0) Graphics::Recorder::NoteFrameGpuBusy(busyMs); presentCounters.gpuBusyMs += busyMs; presentCounters.gpuGapMs += gapMs; presentCounters.gpuUnread += missing; @@ -1400,10 +1401,7 @@ VulkanDevice::VulkanDevice(const PresentationWindow* window, bool compileOnly) : state->fragmentShaderBarycentric = barycentricFeatures.fragmentShaderBarycentric == VK_TRUE; state->fragmentBarycentricBuiltins = state->fragmentShaderBarycentric; if (state->fragmentShaderBarycentric && hasExtension(VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME)) { - VkPhysicalDeviceDriverProperties driver{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES}; - VkPhysicalDeviceProperties2 driverProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2, &driver}; - state->InstanceFunction("vkGetPhysicalDeviceProperties2")(selected, &driverProperties); - state->fragmentShaderBarycentric = FragmentShaderBarycentricUsable(driver.driverID, state->fragmentShaderBarycentric); + state->fragmentShaderBarycentric = FragmentShaderBarycentricUsable(driverId, state->fragmentShaderBarycentric); } } VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR terminateFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR}; @@ -1427,11 +1425,8 @@ VulkanDevice::VulkanDevice(const PresentationWindow* window, bool compileOnly) : state->shaderClock = clockFeatures.shaderSubgroupClock == VK_TRUE && clockFeatures.shaderDeviceClock == VK_TRUE; } if (state->shaderClock && hasExtension(VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME)) { - VkPhysicalDeviceDriverProperties driver{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES}; - VkPhysicalDeviceProperties2 driverProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2, &driver}; - state->InstanceFunction("vkGetPhysicalDeviceProperties2")(selected, &driverProperties); - state->narrowSubgroupClock = NarrowSubgroupClock(driver.driverID, state->properties.deviceID, state->properties.deviceName); - APS5_LOG_OUT("Shader clock driver=%d narrowSubgroupClock=%d", static_cast(driver.driverID), state->narrowSubgroupClock ? 1 : 0); + state->narrowSubgroupClock = NarrowSubgroupClock(driverId, state->properties.deviceID, state->properties.deviceName); + APS5_LOG_OUT("Shader clock driver=%d narrowSubgroupClock=%d", static_cast(driverId), state->narrowSubgroupClock ? 1 : 0); } VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT demoteFeatures{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT}; if (hasExtension(VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME)) { @@ -1740,10 +1735,7 @@ VulkanDevice::VulkanDevice(const PresentationWindow* window, bool compileOnly) : if (libraryDevice) deviceExtensions.insert(deviceExtensions.end(), libraryExtensions.begin(), libraryExtensions.end()); state->graphicsPipelineLibrary = libraryDevice && std::getenv("APS5_NO_GPL") == nullptr; if (state->graphicsPipelineLibrary && hasExtension(VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME)) { - VkPhysicalDeviceDriverProperties driver{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES}; - VkPhysicalDeviceProperties2 driverProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2, &driver}; - state->InstanceFunction("vkGetPhysicalDeviceProperties2")(selected, &driverProperties); - state->pipelineLinkTimeOptimization = PipelineLinkTimeOptimizationUsable(driver.driverID); + state->pipelineLinkTimeOptimization = PipelineLinkTimeOptimizationUsable(driverId); } } VkPhysicalDeviceMaintenance5FeaturesKHR maintenance5Features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_FEATURES_KHR}; @@ -2389,16 +2381,33 @@ bool VulkanDevice::ReplayComputePipeline(const ShaderRecompiler::RecompileResult if (state->computePipelines.contains(key) || state->computePipelinesBuilding.contains(key)) return false; } const CompileBudget::Hold hold(BackgroundCompileBudget(), shader.spirv.size() * sizeof(std::uint32_t)); + std::promise> building; { std::lock_guard pipelines(state->computePipelinesMutex); if (state->computePipelines.contains(key) || state->computePipelinesBuilding.contains(key)) return false; + state->computePipelinesBuilding.emplace(key, building.get_future().share()); } - const auto context = graphicsContext(); - const std::array shaders{{{ShaderRecompiler::ShaderStage::Compute, &shader, 0}}}; - const auto layouts = Graphics::DescribeSetLayouts(context, shaders); - auto objects = createComputePipeline(context, shader, layouts.layouts.main, layouts.mainKey, pushConstants ? VK_SHADER_STAGE_COMPUTE_BIT : 0u, 0); - std::lock_guard pipelines(state->computePipelinesMutex); - return state->computePipelines.try_emplace(key, std::move(objects)).second; + std::shared_ptr objects; + std::exception_ptr error; + try { + const auto context = graphicsContext(); + const std::array shaders{{{ShaderRecompiler::ShaderStage::Compute, &shader, 0}}}; + const auto layouts = Graphics::DescribeSetLayouts(context, shaders); + objects = createComputePipeline(context, shader, layouts.layouts.main, layouts.mainKey, pushConstants ? VK_SHADER_STAGE_COMPUTE_BIT : 0u, 0); + } catch (...) { + error = std::current_exception(); + } + { + std::lock_guard pipelines(state->computePipelinesMutex); + if (objects != nullptr) state->computePipelines.try_emplace(key, objects); + state->computePipelinesBuilding.erase(key); + } + if (error != nullptr) { + building.set_exception(error); + std::rethrow_exception(error); + } + building.set_value(std::move(objects)); + return true; } bool VulkanDevice::HasComputePipeline(const ShaderRecompiler::RecompileResult& shader) const { @@ -2475,12 +2484,12 @@ bool OpportunisticReap() { } -void VulkanDevice::StoreIdleResults(bool reapFirst) { +void VulkanDevice::StoreIdleResults(bool reapFirst, const std::function& stop) { if (!Graphics::StorageTexture::AnyPending()) return; GuestMemory::TagGpuLockSite(GuestMemory::GpuLockSite::Flush); std::lock_guard gpuLock(GuestMemory::GpuMutex()); const auto lease = GuestAllocations::GuestAllocationsAcquire_nid_postfix(); - Graphics::StorageTexture::FlushAllPending("idle"); + static_cast(Graphics::StorageTexture::FlushAllPendingUntil("idle", stop)); SubmitRecorded(reapFirst); } @@ -2654,6 +2663,10 @@ bool VulkanDevice::AfterRecordedWork(std::function action, bool reapFirs return state->recorder->AfterRecordedWork(std::move(action)); } +void VulkanDevice::NoteHtileMask(const Graphics::HtileMaskClear& clear) const { + Graphics::NoteHtileMaskOnGpu(graphicsContext(), clear); +} + bool VulkanDevice::DumpSamplesOnGpu(std::uint64_t address) { static const bool syncDumps = std::getenv("APS5_SYNC_SAMPLE_DUMPS") != nullptr || std::getenv("APS5_NO_GPU_SAMPLE_DUMPS") != nullptr; if (syncDumps) return false; @@ -5001,7 +5014,7 @@ VulkanDevice::PresyncStatistics VulkanDevice::PresyncCounts() { return {counters.checked.load(std::memory_order_relaxed), counters.presyncs.load(std::memory_order_relaxed), counters.keyChecks.load(std::memory_order_relaxed), counters.keyWaits.load(std::memory_order_relaxed)}; } -std::shared_ptr VulkanDevice::PrepareDispatch(const ShaderRecompiler::RecompileResult& shader, std::span snapshots, std::uint64_t dispatchThreads, std::uint64_t programAddress) { +std::shared_ptr VulkanDevice::PrepareDispatch(const ShaderRecompiler::RecompileResult& shader, std::span snapshots, std::uint64_t dispatchThreads, std::uint64_t programAddress, std::optional> htileClear) { ShaderRecompiler::RuntimeAbi::RequireVersion(shader.runtimeAbiVersion); // APS5_LOCKED_BUILD=1: the whole build under the mutex, as before the split. static const bool lockedBuild = std::getenv("APS5_LOCKED_BUILD") != nullptr; @@ -5023,7 +5036,7 @@ std::shared_ptr VulkanDevice::PrepareDispatch(const ShaderReco prepared->phaseMs[which] += std::chrono::duration(now - phaseStart).count(); phaseStart = now; }; - if (ResourceCacheEnabled() && shader.PipelineVariantId() != 0) { + if (!htileClear.has_value() && ResourceCacheEnabled() && shader.PipelineVariantId() != 0) { prepared->key = DispatchContentKey(compute, context.device); phase(PreparedDispatch::PrepareKey); cached = state->resourceCache.Find(prepared->key); @@ -5040,7 +5053,7 @@ std::shared_ptr VulkanDevice::PrepareDispatch(const ShaderReco phase(PreparedDispatch::PrepareFind); } if (cached == nullptr) { - prepared->resources = std::make_shared(context, compute, snapshots, true, dispatchThreads); + prepared->resources = std::make_shared(context, compute, snapshots, true, dispatchThreads, htileClear); phase(PreparedDispatch::PrepareStageA); } if (cached != nullptr && CachedPrecollect()) { @@ -5594,7 +5607,7 @@ VulkanDevice::IndirectOutcome VulkanDevice::dispatch(const ShaderRecompiler::Rec const auto lookupsBefore = Graphics::DeviceProcLookups(); std::shared_ptr resources; ResourceCache::Key contentKey; - const bool cacheable = ResourceCacheEnabled() && shader.PipelineVariantId() != 0; + const bool cacheable = !htileClear.has_value() && ResourceCacheEnabled() && shader.PipelineVariantId() != 0; // The object came from the resource cache: a compute template whose data buffers take this // dispatch's words at the record (ShaderResources::RefreshData). bool fromCache = false; @@ -5751,7 +5764,7 @@ VulkanDevice::IndirectOutcome VulkanDevice::dispatch(const ShaderRecompiler::Rec } if (resources == nullptr) { const auto buildStart = profile ? std::chrono::steady_clock::now() : std::chrono::steady_clock::time_point{}; - resources = std::make_shared(context, shaders[0], snapshots, false, prepared != nullptr ? prepared->dispatchThreads : 0); + resources = std::make_shared(context, shaders[0], snapshots, false, prepared != nullptr ? prepared->dispatchThreads : 0, htileClear); if (profile) timer.add(PhaseResourcesFullBuild, std::chrono::duration(std::chrono::steady_clock::now() - buildStart).count()); if (cacheable) { ++d.cacheMisses; diff --git a/core/libs/prx/libSceAgcDriver/Export.cpp b/core/libs/prx/libSceAgcDriver/Export.cpp index fd98ebbdb5..199dad9656 100644 --- a/core/libs/prx/libSceAgcDriver/Export.cpp +++ b/core/libs/prx/libSceAgcDriver/Export.cpp @@ -1,3 +1,4 @@ +#include "prx/libc/include/general/ExportMacros.hpp" #include "prx/libSceAgcDriver/include/AgcDriver.hpp" #include #include @@ -6,11 +7,6 @@ extern "C" { -int APS5_VABI sceAgcDriverAcquireRazorACQ(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI sceAgcDriverCreateQueue(void) { NotImplemented_nid_no_patch(__func__); return 0; @@ -36,11 +32,6 @@ int APS5_VABI sceAgcDriverDestroyQueue(void) { return 0; } -int APS5_VABI sceAgcDriverGetPaDebugInterfaceVersion(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI sceAgcDriverGetRegShadowInfo(void) { NotImplemented_nid_no_patch(__func__); return 0; @@ -66,11 +57,6 @@ int APS5_VABI sceAgcDriverIDHSSubmit(void) { return 0; } -int APS5_VABI sceAgcDriverModuleRegistration(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI sceAgcDriverNotifyDefaultStates(void) { NotImplemented_nid_no_patch(__func__); return 0; @@ -91,11 +77,6 @@ int APS5_VABI sceAgcDriverSetFlip(void) { return 0; } -int APS5_VABI sceAgcDriverSetHsOffchipParamDirect(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI sceAgcDriverSetWorkloadComplete(void) { NotImplemented_nid_no_patch(__func__); return 0; @@ -116,31 +97,16 @@ int APS5_VABI sceAgcDriverSetupRegisterShadow(void) { return 0; } -int APS5_VABI sceAgcDriverSubmitMultiCommandBuffersDirect(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI sceAgcDriverSubmitToHDRScopesACQ(void) { NotImplemented_nid_no_patch(__func__); return 0; } -int APS5_VABI sceAgcDriverSubmitToRazorACQ(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI sceAgcDriverSuspendPointSubmit(void) { NotImplemented_nid_no_patch(__func__); return 0; } -int APS5_VABI sceAgcDriverSuspendPointSubmitDirect(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI sceAgcDriverSysEnableSubmitDone45Exception(void) { NotImplemented_nid_no_patch(__func__); return 0; @@ -182,3 +148,87 @@ int APS5_VABI sceAgcDriverUserDataWriteSetMarker(void) { } } + +extern "C" { + +int APS5_VABI libSceAgcDriverUnknown_6WO4CscVnfM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6WO4CscVnfM", libSceAgcDriverUnknown_6WO4CscVnfM_nid_no_patch); + +int APS5_VABI libSceAgcDriverUnknown_6v_minus_D6CQHA4Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6v-D6CQHA4Y", libSceAgcDriverUnknown_6v_minus_D6CQHA4Y_nid_no_patch); + +int APS5_VABI libSceAgcDriverUnknown_8CXPPlNmvIc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8CXPPlNmvIc", libSceAgcDriverUnknown_8CXPPlNmvIc_nid_no_patch); + +int APS5_VABI libSceAgcDriverUnknown_Cia3HgY0WiY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Cia3HgY0WiY", libSceAgcDriverUnknown_Cia3HgY0WiY_nid_no_patch); + +int APS5_VABI libSceAgcDriverUnknown_DGN_plus_IaHNR8o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DGN+IaHNR8o", libSceAgcDriverUnknown_DGN_plus_IaHNR8o_nid_no_patch); + +int APS5_VABI libSceAgcDriverUnknown_EqwPDQyh_plus_Ec_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EqwPDQyh+Ec", libSceAgcDriverUnknown_EqwPDQyh_plus_Ec_nid_no_patch); + +int APS5_VABI libSceAgcDriverUnknown_IGYqP_plus_WKCgc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IGYqP+WKCgc", libSceAgcDriverUnknown_IGYqP_plus_WKCgc_nid_no_patch); + +int APS5_VABI libSceAgcDriverUnknown_LgctzJSGy7s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LgctzJSGy7s", libSceAgcDriverUnknown_LgctzJSGy7s_nid_no_patch); + +int APS5_VABI libSceAgcDriverUnknown_NmE3PfE211o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NmE3PfE211o", libSceAgcDriverUnknown_NmE3PfE211o_nid_no_patch); + +int APS5_VABI libSceAgcDriverUnknown_O144kUYDSBo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("O144kUYDSBo", libSceAgcDriverUnknown_O144kUYDSBo_nid_no_patch); + +int APS5_VABI libSceAgcDriverUnknown_gpF0LZ3_plus_19c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gpF0LZ3+19c", libSceAgcDriverUnknown_gpF0LZ3_plus_19c_nid_no_patch); + +int APS5_VABI libSceAgcDriverUnknown_mxyUaQfPgb8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mxyUaQfPgb8", libSceAgcDriverUnknown_mxyUaQfPgb8_nid_no_patch); + +int APS5_VABI libSceAgcDriverUnknown_oFb2hMcoJa4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oFb2hMcoJa4", libSceAgcDriverUnknown_oFb2hMcoJa4_nid_no_patch); + +int APS5_VABI libSceAgcDriverUnknown_sW7yp7NVlrk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sW7yp7NVlrk", libSceAgcDriverUnknown_sW7yp7NVlrk_nid_no_patch); + +int APS5_VABI libSceAgcDriverUnknown_tD2ECNSuTQQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tD2ECNSuTQQ", libSceAgcDriverUnknown_tD2ECNSuTQQ_nid_no_patch); + +int APS5_VABI libSceAgcDriverUnknown_wxdcyVqXJEY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wxdcyVqXJEY", libSceAgcDriverUnknown_wxdcyVqXJEY_nid_no_patch); + +} diff --git a/core/libs/prx/libSceAgcDriver/Graphics/include/AdaptiveStaging.hpp b/core/libs/prx/libSceAgcDriver/Graphics/include/AdaptiveStaging.hpp new file mode 100644 index 0000000000..c4b1ec4ed2 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/Graphics/include/AdaptiveStaging.hpp @@ -0,0 +1,173 @@ +#ifndef CORE_LIBS_PRX_LIBSCEAGCDRIVER_GRAPHICS_INCLUDE_ADAPTIVESTAGING_HPP +#define CORE_LIBS_PRX_LIBSCEAGCDRIVER_GRAPHICS_INCLUDE_ADAPTIVESTAGING_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace AgcDriver::Graphics { + +class AdaptiveStaging { +public: + static constexpr std::uint64_t SettleFrames = 4; + static constexpr std::uint64_t MeasuredFrames = 8; + static constexpr std::uint64_t EarlyFrames = 3; + static constexpr std::int64_t ReprobeMs = 20000; + static constexpr std::int64_t MaxReprobeMs = 160000; + static constexpr std::int64_t ShareWindowMs = 10000; + static constexpr double SceneShift = 0.25; + + std::function report; + + bool InPlace(std::uint64_t begin, std::uint64_t end, bool use, std::uint64_t frames, double busyMs, std::int64_t nowMs) { + const Key key{begin, end}; + auto& element = elements[key]; + if (use) element.bytes += end - begin; + tick(frames, busyMs, nowMs); + if (probe.active && probe.key == key) return probe.phase == 1 ? !element.inPlace : element.inPlace; + return element.inPlace; + } + +private: + using Key = std::pair; + + struct Element { + std::uint64_t bytes = 0; + bool inPlace = false; + std::int64_t nextProbeMs = 0; + std::int64_t intervalMs = ReprobeMs; + }; + struct Probe { + bool active = false; + Key key{}; + int phase = 0; + std::uint64_t phaseFrames = 0; + std::vector samples[3]; + }; + + void say(const char* format, auto... args) { + if (!report) return; + char text[256]; + std::snprintf(text, sizeof(text), format, args...); + report(text); + } + + void tick(std::uint64_t frames, double busyMs, std::int64_t now) { + if (frames == lastFrames) return; + const auto newFrames = frames - lastFrames; + const double perFrame = (busyMs - lastBusyMs) / static_cast(newFrames); + lastFrames = frames; + lastBusyMs = busyMs; + if (now - windowStartMs >= ShareWindowMs) { + for (auto& [key, element] : elements) element.bytes /= 2; + windowStartMs = now; + } + if (!probe.active) { + watchScene(perFrame, newFrames, now); + start(now); + return; + } + auto& element = elements[probe.key]; + probe.phaseFrames += newFrames; + if (probe.phaseFrames <= SettleFrames) return; + if (perFrame > 0) probe.samples[probe.phase].push_back(perFrame); + if (probe.phase == 1 && clearlySlower()) { + decide(element, now); + return; + } + if (probe.phaseFrames < SettleFrames + MeasuredFrames) return; + if (++probe.phase < 3) { + probe.phaseFrames = 0; + return; + } + decide(element, now); + } + + bool clearlySlower() const { + const auto& current = probe.samples[0]; + const auto& other = probe.samples[1]; + if (current.size() < MeasuredFrames || other.size() < EarlyFrames) return false; + return *std::min_element(other.begin(), other.end()) > *std::max_element(current.begin(), current.end()); + } + + void watchScene(double perFrame, std::uint64_t newFrames, std::int64_t now) { + if (perFrame <= 0 || decidedMs <= 0) return; + if (settling > 0) { + settling -= std::min(settling, newFrames); + return; + } + sceneMs = sceneMs * 0.9 + perFrame * 0.1; + if (std::abs(sceneMs - decidedMs) <= SceneShift * decidedMs) return; + say("[staging] adaptive: frame GPU %.1f -> %.1f ms, probing again", decidedMs, sceneMs); + for (auto& [key, element] : elements) { + element.nextProbeMs = std::min(element.nextProbeMs, now); + element.intervalMs = ReprobeMs; + } + decidedMs = 0; + } + + void start(std::int64_t now) { + std::uint64_t total = 0; + for (const auto& [key, element] : elements) total += element.bytes; + const Element* best = nullptr; + Key bestKey{}; + for (const auto& [key, element] : elements) { + if (element.nextProbeMs > now || element.bytes * 10 < total) continue; + if (best == nullptr || element.bytes > best->bytes) { + best = &element; + bestKey = key; + } + } + if (best == nullptr) return; + probe = Probe{}; + probe.active = true; + probe.key = bestKey; + } + + void decide(Element& element, std::int64_t now) { + std::vector current = probe.samples[0]; + current.insert(current.end(), probe.samples[2].begin(), probe.samples[2].end()); + const auto& other = probe.samples[1]; + const auto stats = [](const std::vector& values) { + double sum = 0, squares = 0; + for (const auto value : values) sum += value; + const double mean = values.empty() ? 0 : sum / static_cast(values.size()); + for (const auto value : values) squares += (value - mean) * (value - mean); + const double variance = values.size() > 1 ? squares / static_cast(values.size() - 1) : 0; + return std::pair{mean, values.empty() ? 0.0 : variance / static_cast(values.size())}; + }; + const auto [currentMean, currentError] = stats(current); + const auto [otherMean, otherError] = stats(other); + const bool measured = current.size() >= MeasuredFrames && other.size() >= EarlyFrames; + const bool flip = measured && otherMean < currentMean - 2.0 * std::sqrt(currentError + otherError); + const double stagedMs = element.inPlace ? otherMean : currentMean; + const double inPlaceMs = element.inPlace ? currentMean : otherMean; + if (flip) element.inPlace = !element.inPlace; + element.intervalMs = flip || !measured ? ReprobeMs : std::min(element.intervalMs * 2, MaxReprobeMs); + element.nextProbeMs = now + element.intervalMs; + decidedMs = flip ? otherMean : currentMean; + sceneMs = decidedMs; + settling = SettleFrames; + say("[staging] adaptive: 0x%llx+0x%llx GPU %.1f ms/frame staged, %.1f in place (%zu/%zu frames) -> %s%s, next probe in %lld s", static_cast(probe.key.first), static_cast(probe.key.second - probe.key.first), stagedMs, inPlaceMs, current.size(), other.size(), element.inPlace ? "in place" : "staged", measured ? "" : " (not measured)", static_cast(element.intervalMs / 1000)); + probe = Probe{}; + } + + std::map elements; + Probe probe; + std::uint64_t lastFrames = 0; + double lastBusyMs = 0; + double decidedMs = 0; + double sceneMs = 0; + std::uint64_t settling = 0; + std::int64_t windowStartMs = 0; +}; + +} + +#endif diff --git a/core/libs/prx/libSceAgcDriver/Graphics/include/DepthSurface.hpp b/core/libs/prx/libSceAgcDriver/Graphics/include/DepthSurface.hpp index e707fe097b..d2d1eedb53 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/include/DepthSurface.hpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/include/DepthSurface.hpp @@ -38,7 +38,7 @@ bool DirectDepthCopy(const Context& context, VkFormat depthFormat, VkImageAspect void SetDirectDepthCopy(bool enabled); std::uint64_t DirectDepthCopyCount(); std::uint64_t MultisampledDepthBytes_nid_no_patch(VkExtent2D extent, std::uint32_t bytesPerTexel, std::uint32_t samples); -void RequireNoResidentDepthRead_nid_no_patch(std::uint64_t address, std::size_t bytes); +void RequireNoResidentDepthRead_nid_no_patch(std::uint64_t address, std::size_t bytes, std::optional> htileClear = std::nullopt); void AppendHostWrittenDepthRanges(std::uint64_t address, std::size_t bytes, std::vector>& ranges); bool HasResidentDepthGuards_nid_no_patch(); void RetireUnmappedDepth_nid_no_patch(std::uintptr_t address, std::size_t bytes); @@ -63,6 +63,15 @@ bool NoteHtileDepthClear(std::uint64_t htileAddress, std::size_t bytes, std::siz void ArmHtileDepthClear(std::uint64_t htileAddress, std::size_t bytes); void QueueHtileDepthClear(std::uint64_t htileAddress, std::size_t bytes); void CompleteHtileDepthClear(std::uint64_t htileAddress, std::size_t bytes); +struct HtileMaskClear { + std::uint64_t address = 0; + std::size_t bytes = 0; + std::uint32_t mask = 0; + std::uint32_t value = 0; +}; +std::optional MatchHtileBufferMaskClear(std::span code, std::span userData, const ShaderRecompiler::ShaderComputeStageInfo& compute, std::span packet, std::uint64_t indirectArguments); +void NoteHtileMaskOnGpu(const Context& context, const HtileMaskClear& clear); +void ForgetHtileMasks_nid_no_patch(std::uint64_t recorderId); struct MemoryValueFill { std::uint64_t address; std::size_t bytes; diff --git a/core/libs/prx/libSceAgcDriver/Graphics/include/Draw.hpp b/core/libs/prx/libSceAgcDriver/Graphics/include/Draw.hpp index 990ec6820c..016ca9a493 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/include/Draw.hpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/include/Draw.hpp @@ -38,6 +38,7 @@ void BindPixelFunctionLds(const Context& context, VkCommandBuffer commands, VkPi void CheckPixelFunctionLds(const Context& context); void ReleasePixelFunctionLds(VkDevice device); bool UsesMeshWindow(std::span shaders); +bool ValidationKey(const Context& context, std::span shaders, const State& state, std::vector& key); VkDescriptorSetLayout MeshWindowSetLayout(const Context& context); void PrepareMeshWindow(const Context& context); void BindMeshWindow(const Context& context, VkCommandBuffer commands, VkPipelineLayout layout); diff --git a/core/libs/prx/libSceAgcDriver/Graphics/include/GuestBufferMemory.hpp b/core/libs/prx/libSceAgcDriver/Graphics/include/GuestBufferMemory.hpp index 72e07d8664..e9e1874a7e 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/include/GuestBufferMemory.hpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/include/GuestBufferMemory.hpp @@ -254,6 +254,7 @@ struct MirrorStats { std::uint64_t sweeps = 0; std::uint64_t heapChecks = 0; std::uint64_t sparseBinds = 0; + std::uint64_t evictions = 0; }; MirrorStats MirrorCounters(); std::uint64_t SnapshotMismatches(); @@ -321,11 +322,16 @@ public: void AllowDeviceStaging() { stagingAllowed = true; } void DisallowAddressStaging() { addressStaging = false; } void AllowAdjustedRegions() { adjustedRegions = true; } + bool HoldsMirror(const std::shared_ptr& mirror) const; + bool EvictMirror(const std::shared_ptr& mirror); + bool WasEvicted(std::uint64_t address) const; + void RecordEvicted(std::uint64_t address); // Records the copy-in of every staged region anew for another use of this upload (a resource // cache hit, from ShaderResources::Revalidate, under GuestMemory::GpuMutex, once the imports // were confirmed unchanged): the previous use's copy-back left the shadow behind, and the next // RecordCopyBacks copies it back again. Nothing to do without staged regions. void RecordStagingCopies(Recorder& recorder); + bool StagingDecisionsCurrent() const; void AddSnapshot(const GuestMemorySnapshot& snapshot); // Upload is the two stages below back to back. UploadPrepare needs no device lock: it merges the // regions, binds the image mirrors and host imports that already serve them (an import pointer is @@ -336,7 +342,7 @@ public: // and the recorder's pending-write note stays closed. void Upload(bool addressable); void UploadPrepare(bool addressable); - void UploadFinish(bool addressable); + void UploadFinish(bool addressable, std::optional> htileClear = std::nullopt); VkDescriptorBufferInfo Descriptor(std::uint64_t address, std::size_t bytes, std::uint32_t& adjustment) const; static std::uint64_t ViewBytes(std::uint64_t bytes, std::uint32_t adjustment); std::vector AddressRanges() const; @@ -457,6 +463,7 @@ private: // path it would take without staging, in both upload stages. bool unstaged = false; bool overlay = false; + bool adaptiveInPlace = false; }; // How [begin, end) lies against the space's base regions. @@ -502,6 +509,8 @@ private: // written element inside, and an atomic element or a size within the written-shadow window. // Independent of the import, so UploadPrepare and UploadFinish decide alike. bool stagingEligible(const Region& region, bool addressable) const; + bool stagingWanted(const Region& region, bool addressable) const; + bool adaptiveInPlace(const Region& region, bool use) const; bool overlayCandidate(const Region& inside, bool readOnly) const; void resolveOverlays(); bool bindableInPlace(std::uint64_t offset, bool addressable) const; @@ -533,6 +542,7 @@ private: std::vector> servedInsideBase; std::vector>> heapReferences; std::vector>> heapReadbacks; + std::vector evictedRanges; // UploadPrepare ran (regions are frozen); `uploaded` once UploadFinish ran. bool prepared = false; bool uploaded = false; diff --git a/core/libs/prx/libSceAgcDriver/Graphics/include/Recorder.hpp b/core/libs/prx/libSceAgcDriver/Graphics/include/Recorder.hpp index e298f6d381..a52799fe75 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/include/Recorder.hpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/include/Recorder.hpp @@ -425,6 +425,7 @@ public: // and for helpers that must not recycle resources the recorded work still uses. static Recorder* Active(); VkDevice Device() const { return context.device; } + std::uint64_t Id() const { return id; } // Whether the calling thread runs inside a batch's completion action (finish()): a store made // there must not have a publish recorded for it (UnitShadow), see SyncThrough. static bool InCompletion(); @@ -529,6 +530,9 @@ public: // Presentations so far (never reset): a frame clock for policies that count per frame, such as // StorageTexture's write-back hysteresis. static std::uint64_t Presents(); + static void NoteFrameGpuBusy(double milliseconds); + static std::pair FrameGpuBusy(); + static void RequestBatchStamps(); // What the presenter learns about finished batches (Driver::Present's [present] line and the // frame record): finish() writes an entry per submitted batch into a ring of the last 128, diff --git a/core/libs/prx/libSceAgcDriver/Graphics/include/ResidentMirror.hpp b/core/libs/prx/libSceAgcDriver/Graphics/include/ResidentMirror.hpp index f6c10579b9..87e0619b8b 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/include/ResidentMirror.hpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/include/ResidentMirror.hpp @@ -20,6 +20,8 @@ using GuestRuns = std::vector>; GuestRuns GuestNonzeroBlocks(const GuestRuns& candidates); bool GuestBytesZero(std::uint64_t begin, std::uint64_t end); void SetResidentAddressSpaceLimit(std::uint64_t bytes); +void SetHeapMirrorBudget(std::uint64_t bytes); +std::shared_ptr HoldHeapMirror(std::uint64_t address); class ResidentBuffer : public std::enable_shared_from_this { public: diff --git a/core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp b/core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp index 40edb3be33..1f9b57f592 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp @@ -155,6 +155,7 @@ struct ImageTableReuseCounts { std::uint64_t writesMade = 0; }; ImageTableReuseCounts ImageTableReuses(); +std::uint64_t SampledTexturesCleared(); std::uint64_t SampledLookupKeyScans(); struct PresyncSurface { @@ -173,7 +174,7 @@ public: // then no other member may be used. `compute` and `snapshots` must outlive Complete(). An // address-based shader (BDA tables) builds entirely in Complete(): its lease acquisition // reconciles imports and refreshes mirrors, which needs the lock. - ShaderResources(const Context& context, const CompiledShader& compute, std::span snapshots, bool deferred, std::uint64_t dispatchThreads = 0); + ShaderResources(const Context& context, const CompiledShader& compute, std::span snapshots, bool deferred, std::uint64_t dispatchThreads = 0, std::optional> htileClear = std::nullopt); void Complete(); bool Completed() const { return completed; } ~ShaderResources(); @@ -622,6 +623,7 @@ private: std::vector> writeOnlyRanges; bool drawBuild = false; std::uint64_t dispatchThreads = 0; + std::optional> htileClear; std::vector> textures; std::vector textureFirstLayer; std::vector textureBaseLevel; diff --git a/core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp b/core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp index 784b9dc9d6..6baa15aab6 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp @@ -59,7 +59,7 @@ struct OwnedImage { class Texture { public: - Texture(const Context& context, TextureDetiler& detiler, const GuestTextureResource& descriptor, VkComponentMapping components, std::span snapshot, bool depthCompare = false); + Texture(const Context& context, TextureDetiler& detiler, const GuestTextureResource& descriptor, VkComponentMapping components, std::span snapshot, bool depthCompare = false, const VkClearColorValue* clear = nullptr); Texture(const Context& context, const std::shared_ptr& source, const GuestTextureResource& descriptor, VkComponentMapping components); // A view of a storage image's own VkImage: the sampled texture follows the image's content, so a // compute pass writing it and the next pass sampling it share one image and copy nothing. @@ -218,6 +218,7 @@ public: // overlapping pending image, as before). static bool FlushPending(std::uint64_t address, std::size_t bytes, const StorageTexture* except = nullptr, const char* reason = "memory access", PublishScope scope = PublishScope::Whole, bool* published = nullptr, bool waited = false); static void FlushAllPending(const char* reason); + static bool FlushAllPendingUntil(const char* reason, const std::function& stop); static bool WaitForFlushing(std::uint64_t address, std::size_t bytes, const StorageTexture* except = nullptr); static void SaveBeforeUnwatch(std::uint64_t address, std::size_t bytes); static constexpr std::uint64_t SmallStoreBytes = 64 * 1024; diff --git a/core/libs/prx/libSceAgcDriver/Graphics/src/DccMetadata.cpp b/core/libs/prx/libSceAgcDriver/Graphics/src/DccMetadata.cpp index 94751531e6..60a6fe7068 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/src/DccMetadata.cpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/src/DccMetadata.cpp @@ -683,9 +683,14 @@ bool FillDccClear(VkFormat format, DccKeys keys, bool alphaOnMsb, std::span> i) & 1u) != 0) element[bit / 8u] |= static_cast(1u << (bit % 8u)); } } - std::size_t offset = 0; - for (; offset + element.size() <= bytes.size(); offset += element.size()) std::memcpy(bytes.data() + offset, element.data(), element.size()); - std::fill(bytes.begin() + offset, bytes.end(), std::byte{0}); + const std::size_t whole = bytes.size() / element.size() * element.size(); + if (whole != 0) std::memcpy(bytes.data(), element.data(), element.size()); + for (std::size_t filled = element.size(); filled < whole;) { + const auto chunk = std::min(filled, whole - filled); + std::memcpy(bytes.data() + filled, bytes.data(), chunk); + filled += chunk; + } + std::fill(bytes.begin() + static_cast(whole), bytes.end(), std::byte{0}); return true; } diff --git a/core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp b/core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp index ee5dc5f72c..73d166e5f6 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp @@ -1861,6 +1861,42 @@ std::optional htileAfterPendingFills(const Recorder& recorder, st return landed; } +struct HtileMaskWrite { + HtileMaskClear clear; + std::uint64_t note; + std::uint64_t recorderId; + VkDevice device; +}; + +std::mutex& htileMasksMutex() { + static std::mutex mutex; + return mutex; +} + +std::vector& htileMasks() { + static auto* masks = new std::vector(); + return *masks; +} + +std::optional> htileAfterMaskClear(const Recorder& recorder, const DepthTarget& target, std::size_t bytes) { + const auto newest = recorder.NewestWriteNote(target.htileAddress, bytes); + if (newest == 0) return std::nullopt; + std::optional clear; + { + std::lock_guard lock(htileMasksMutex()); + for (const auto& write : htileMasks()) { + if (write.recorderId == recorder.Id() && write.note == newest && write.clear.address <= target.htileAddress && write.clear.address + write.clear.bytes >= target.htileAddress + bytes) clear = write.clear; + } + } + if (!clear.has_value() || (clear->mask & 0xfu) != 0 || (clear->value & 0xfu) != 0) return std::nullopt; + if (target.firstSlice != 0 && clear->mask != 0) return std::nullopt; + if (!target.htileStencil) return std::pair{VK_IMAGE_ASPECT_DEPTH_BIT, 0xfffc000fu}; + if ((clear->mask & 0x300u) != 0) return std::nullopt; + if (((clear->value >> 8u) & 0x3u) == 0) return std::pair{VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT, 0xfffff3ffu}; + if ((clear->mask & 0x3f0u) != 0) return std::nullopt; + return std::pair{VK_IMAGE_ASPECT_DEPTH_BIT, (clear->value & 0x3f0u) | 0xfffff00fu}; +} + bool storeHtileOnGpu(const Context& context, Recorder& recorder, std::uint64_t address, std::size_t bytes, std::uint32_t word) { if (address % 4u != 0 || bytes % 4u != 0) return false; const auto* import = HostImportFor(context, address, bytes); @@ -1910,6 +1946,11 @@ VkImageAspectFlags storeBackClearedHtile(const Context& context, const DepthTarg htileReads()[target.htileAddress] = generation; return cleared; } + } else if (const auto known = htileAfterMaskClear(*recorder, target, bytes); known.has_value() && storeHtileOnGpu(context, *recorder, target.htileAddress, bytes, known->second)) { + const auto generation = GuestMemory::CollectWrites(target.htileAddress, bytes); + std::lock_guard lock(htileReadsMutex()); + htileReads()[target.htileAddress] = generation; + return known->first; } } std::vector words(bytes / 4u); @@ -2095,10 +2136,22 @@ std::uint64_t MultisampledDepthBytes_nid_no_patch(VkExtent2D extent, std::uint32 return width * height * bytesPerTexel * samples; } -void RequireNoResidentDepthRead_nid_no_patch(std::uint64_t address, std::size_t bytes) { +void RequireNoResidentDepthRead_nid_no_patch(std::uint64_t address, std::size_t bytes, std::optional> htileClear) { if (bytes == 0u || !anyDepthGuard().load(std::memory_order_acquire)) return; Require(address <= std::numeric_limits::max() - bytes, "native depth read range overflows"); const auto overlaps = [&](const DepthGuard& range) { return address < range.address + range.bytes && range.address < address + bytes; }; + if (htileClear.has_value() && htileClear->second <= std::numeric_limits::max() - htileClear->first && htileClear->first <= address && bytes <= htileClear->second && address - htileClear->first <= htileClear->second - bytes) { + std::lock_guard lock(surfacesMutex()); + std::shared_lock guardLock(depthGuardMutex()); + const bool accepted = std::ranges::all_of(depthGuards(), [&](const auto& range) { + if (!overlaps(range)) return true; + return std::ranges::any_of(surfaces(), [&](const auto& surface) { + const auto& metadata = surface->sampling.initial[1]; + return surface->active == range.active && surface->active->load(std::memory_order_acquire) && surface->samplingActive && surface->sampling.refusal.empty() && surface->clearPending && metadata.address == range.address && metadata.bytes == range.bytes && metadata.address == htileClear->first && metadata.bytes <= htileClear->second; + }); + }); + if (accepted) return; + } { std::shared_lock lock(depthGuardMutex()); if (std::ranges::none_of(depthGuards(), overlaps)) return; @@ -2439,6 +2492,30 @@ std::uint64_t HtileDepthClearAddress(std::span code, std::s return userData[2] | (static_cast(userData[3]) << 32u); } +std::optional MatchHtileBufferMaskClear(std::span code, std::span userData, const ShaderRecompiler::ShaderComputeStageInfo& compute, std::span packet, std::uint64_t indirectArguments) { + static constexpr std::array kernel{0xd7460004u, 0x04010c0cu, 0xe00c2000u, 0x80000004u, 0xbf8c3f70u, 0xd7710000u, 0x00120008u, 0xd7710001u, 0x00160209u, 0xd7710002u, 0x001a040au, 0xd7710003u, 0x001e060bu, 0xe01c2000u, 0x80000004u, 0xbf810000u}; + if (userData.size() != 12u || packet.size() < 5u || indirectArguments != 0u) return std::nullopt; + if (code.size() < kernel.size() || !std::equal(kernel.begin(), kernel.end(), code.begin())) return std::nullopt; + if (compute.numThreads != std::array{64u, 1u, 1u} || !compute.groupIdEnable[0] || compute.threadIdComponentCount == 0u || compute.threadIdComponentCount > 3u) return std::nullopt; + if (packet[1] == 0u || packet[2] != 1u || packet[3] != 1u || (packet[4] & 0x3u) != 0x1u) return std::nullopt; + for (std::size_t word = 1; word < 4; ++word) { + if (userData[4 + word] != userData[4] || userData[8 + word] != userData[8]) return std::nullopt; + } + if ((userData[8] & 0xfu) != 0u || (userData[4] & 0xfu) != 0u) return std::nullopt; + const auto stride = (userData[1] >> 16u) & 0x3fffu; + const bool swizzled = ((userData[1] >> 31u) & 1u) != 0u; + const bool addTid = ((userData[3] >> 23u) & 1u) != 0u; + const auto type = userData[3] >> 30u; + const auto format = (userData[3] >> 12u) & 0x7fu; + const auto selects = userData[3] & 0xfffu; + if (stride != 16u || swizzled || addTid || type != 0u || format != 75u || selects != 0xfacu) return std::nullopt; + const auto address = userData[0] | (static_cast(userData[1] & 0xffffu) << 32u); + const std::uint64_t threads = (packet[4] & 0x20u) != 0u ? packet[1] : static_cast(packet[1]) * 64u; + const auto records = std::min(threads, userData[2]); + if (address == 0u || (address & 15u) != 0u || records == 0u || records > 0x400000u) return std::nullopt; + return HtileMaskClear{address, static_cast(records * 16u), userData[8], userData[4]}; +} + std::optional MatchMemoryValueFill(std::span code, std::span userData, const std::array& numThreads, const std::array& groups) { static constexpr std::array kernel{0xd7460000u, 0x04010c08u, 0xf4201a82u, 0xfa000000u, 0xbf8cc07fu, 0x7e02026au, 0xe0102000u, 0x80000100u, 0xbf810000u}; if (userData.size() < 8 || numThreads != std::array{64u, 1u, 1u} || groups[1] != 1u || groups[2] != 1u) return std::nullopt; @@ -2531,6 +2608,31 @@ std::size_t HtileDepthClearBytes_nid_no_patch(std::span cod return address <= std::numeric_limits::max() - bytes ? static_cast(bytes) : 0u; } +void NoteHtileMaskOnGpu(const Context& context, const HtileMaskClear& clear) { + const auto* recorder = RecorderFor(context); + if (recorder == nullptr || clear.bytes == 0) return; + const auto end = clear.address + clear.bytes; + std::uint64_t note = 0; + bool covers = false; + for (const auto& write : recorder->PendingWritesOver(clear.address, clear.bytes)) { + if (write.note <= note) continue; + note = write.note; + covers = write.begin <= clear.address && write.end >= end; + } + std::lock_guard lock(htileMasksMutex()); + auto& masks = htileMasks(); + std::erase_if(masks, [&](const HtileMaskWrite& write) { return clear.address < write.clear.address + write.clear.bytes && write.clear.address < end; }); + if (!covers) return; + constexpr std::size_t KeptMasks = 64; + if (masks.size() >= KeptMasks) masks.erase(masks.begin()); + masks.push_back({clear, note, recorder->Id(), context.device}); +} + +void ForgetHtileMasks_nid_no_patch(std::uint64_t recorderId) { + std::lock_guard lock(htileMasksMutex()); + std::erase_if(htileMasks(), [&](const HtileMaskWrite& write) { return write.recorderId == recorderId; }); +} + bool NoteHtileDepthClear(std::uint64_t htileAddress, std::size_t bytes, std::size_t nativeBytes) { std::lock_guard lock(surfacesMutex()); forgetHtileReads(htileAddress, bytes); @@ -2593,6 +2695,10 @@ void CompleteHtileDepthClear(std::uint64_t htileAddress, std::size_t bytes) { void ClearDepthSurfaces(VkDevice device) { std::lock_guard gpu(GuestMemory::GpuMutex()); + { + std::lock_guard lock(htileMasksMutex()); + std::erase_if(htileMasks(), [&](const HtileMaskWrite& write) { return write.device == device; }); + } std::lock_guard lock(surfacesMutex()); drawnDepth = nullptr; surfacesSerial.fetch_add(1, std::memory_order_release); diff --git a/core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp b/core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp index e7c24145f7..3b6c9f52a2 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp @@ -950,6 +950,8 @@ void countCache(std::uint64_t DrawProfile::*counter) { ++(stats.*counter); } +} + // ValidateShaders decodes every SPIR-V instruction of every stage on every draw. Its outcome depends // only on the stages' compiled variants (a variant id names identical SPIR-V and binding layout), // their push constant placement and vertex attribute shapes, and the state fields it checks, so the @@ -967,10 +969,12 @@ bool ValidationKey(const Context& context, std::span shade if (keyed) { key.reserve(40 + shaders.size() * 12); add(shaders.size()); + const bool patches = BarycentricPatches(state, shaders); + add(patches ? static_cast(state.provokingVertexMode) + 1u : 0u); for (const auto& shader : shaders) { Require(shader.program != nullptr, "missing compiled shader"); const auto& program = *shader.program; - const bool generated = (state.rectList && (shader.stage == Stage::TessellationControl || shader.stage == Stage::TessellationEvaluation)) || shader.stage == Stage::Geometry; + const bool generated = ((state.rectList || patches) && (shader.stage == Stage::TessellationControl || shader.stage == Stage::TessellationEvaluation)) || shader.stage == Stage::Geometry; if (!generated && program.PipelineVariantId() == 0) { keyed = false; break; @@ -1037,6 +1041,8 @@ bool ValidationKey(const Context& context, std::span shade return keyed; } +namespace { + AgcDriver::Mutex& validationMutex() { static AgcDriver::Mutex mutex; return mutex; diff --git a/core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp b/core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp index 4658630beb..4e30b8b899 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp @@ -1,5 +1,6 @@ #include "prx/libSceAgcDriver/Execution/include/ProfileOutput.hpp" #include "prx/libSceAgcDriver/Graphics/include/GuestBufferMemory.hpp" +#include "prx/libSceAgcDriver/Graphics/include/AdaptiveStaging.hpp" #include "prx/libSceAgcDriver/Graphics/include/DepthSurface.hpp" #include "prx/libSceAgcDriver/Execution/include/Mutex.hpp" #include "ThreadOwned.hpp" @@ -41,6 +42,7 @@ #include #include #include +#include #include #include #include @@ -86,6 +88,7 @@ struct ImageMirror { // apart from host import serials. std::uint64_t serial = 0; std::atomic watchedSerial{0}; + std::uint64_t lastDispatch = 0; }; // The address space. An address-based build maps every readable registered range; building that @@ -135,7 +138,16 @@ struct GuestBufferMemory::AddressSpace { mutable std::list*> tableRecency; }; +std::atomic testHeapMirrorBudget{0}; + +void SetHeapMirrorBudget(std::uint64_t bytes) { + testHeapMirrorBudget.store(bytes, std::memory_order_release); +} + namespace { +struct RefreshBlock; +static thread_local GuestBufferMemory* buildingBufferMemory = nullptr; +static thread_local std::vector* buildingBlocks = nullptr; struct RetiredImport; @@ -2462,6 +2474,8 @@ struct ImageMirrors { std::uint64_t pinnedVersion = 0; std::uint64_t sweeps = 0; std::uint64_t heapChecks = 0; + std::uint64_t evictions = 0; + std::uint64_t dispatchCounter = 0; std::chrono::steady_clock::time_point lastReport = std::chrono::steady_clock::now(); }; @@ -2545,6 +2559,7 @@ bool mirrorsEnabled() { } std::uint64_t heapMirrorBudget() { + if (const auto test = testHeapMirrorBudget.load(std::memory_order_acquire); test != 0) return test; static const std::uint64_t bytes = [] { const char* value = std::getenv("APS5_HEAP_MIRROR_MIB"); return (value ? std::strtoull(value, nullptr, 10) : 24576ull) << 20u; @@ -2562,7 +2577,7 @@ std::string heapMirrorError(std::uint64_t address, std::uint64_t bytes, std::uin return std::string(prefix) + where + std::string(reason) + holding; } -void sweepMirrors(); +void sweepMirrors(std::uint64_t neededBytes = 0, std::uint64_t protectAddress = 0); void unlistMirror(ImageMirrors& state, ImageMirror& mirror) { if (!mirror.listed) return; @@ -2632,7 +2647,7 @@ void reserveHeapBytes(std::uint64_t address, std::uint64_t bytes, std::uint64_t } if (attempt != 0) throw std::runtime_error(heapMirrorError(address, bytes, held, "past the budget")); } - sweepMirrors(); + sweepMirrors(need, address); } } @@ -2654,7 +2669,7 @@ void growResident(ImageMirror& mirror, const GuestRuns& runs) { } if (attempt != 0) throw std::runtime_error(heapMirrorError(mirror.base, mirror.reserved, state.heapBytes, "past the budget")); } - sweepMirrors(); + sweepMirrors(need, mirror.base); } try { mirror.resident->Bind(runs); @@ -3295,14 +3310,20 @@ std::shared_ptr findMirror(const Context& context, std::uint64_t be return mirror; } -// Drops mirrors whose registered range is gone (a later build made a new one for the replacement). -void sweepMirrors() { +void sweepMirrors(std::uint64_t neededBytes, std::uint64_t protectAddress) { const bool released = releaseExpiredJoinedHeaps(); - const auto space = Spaces().current.load(); + auto space = Spaces().current.load(); auto& state = Mirrors(); + std::vector> dropped; std::lock_guard lock(state.mutex); if (released) ++state.version; - if (space != nullptr && state.pinnedSpace == space->serial && state.pinnedVersion == state.version) return; + if (neededBytes == 0 && space != nullptr && state.pinnedSpace == space->serial && state.pinnedVersion == state.version) return; + if (neededBytes != 0 && state.heapBytes + neededBytes > heapMirrorBudget()) { + if (auto cached = Spaces().current.exchange(nullptr); cached != nullptr) { + space.reset(); + cached.reset(); + } + } ++state.sweeps; bool pinned = space != nullptr; std::size_t leased = 0; @@ -3316,9 +3337,47 @@ void sweepMirrors() { continue; } if (it->second->heap) unlistMirror(state, *it->second); + dropped.push_back(std::move(it->second)); it = state.entries.erase(it); ++state.version; } + if (neededBytes != 0 && state.heapBytes + neededBytes > heapMirrorBudget()) { + std::unordered_set queued; + if (buildingBlocks != nullptr) { + for (const auto& block : *buildingBlocks) queued.insert(block.mirror); + } + while (state.heapBytes + neededBytes > heapMirrorBudget()) { + auto victim = state.entries.end(); + for (auto it = state.entries.begin(); it != state.entries.end(); ++it) { + if (!it->second->heap || it->first == protectAddress || queued.count(it->second.get()) != 0) continue; + const bool buildingHolds = buildingBufferMemory != nullptr && buildingBufferMemory->HoldsMirror(it->second); + const auto allowedCount = (buildingHolds && !it->second->writable) ? 2 : 1; + if (it->second.use_count() == allowedCount) { + if (victim == state.entries.end()) { + victim = it; + } else if (it->second->lastDispatch != victim->second->lastDispatch) { + if (it->second->lastDispatch < victim->second->lastDispatch) victim = it; + } else if (it->second->writable != victim->second->writable) { + if (!it->second->writable && victim->second->writable) victim = it; + } else if (it->first < victim->first) { + victim = it; + } + } + } + if (victim == state.entries.end()) break; + if (buildingBufferMemory != nullptr) { + buildingBufferMemory->RecordEvicted(victim->first); + if (buildingBufferMemory->HoldsMirror(victim->second)) { + buildingBufferMemory->EvictMirror(victim->second); + } + } + unlistMirror(state, *victim->second); + dropped.push_back(std::move(victim->second)); + state.entries.erase(victim); + ++state.version; + ++state.evictions; + } + } state.pinnedSpace = pinned ? space->serial : 0; state.pinnedVersion = state.version; } @@ -3385,7 +3444,7 @@ void reportMirrors() { } heapBytes = state.heapBytes; } - AgcDriver::ProfilePrint_nid_no_patch("[buffers] image mirrors: %zu ranges (%.1f MiB, %zu writable, %zu heap %.1f MiB), %llu address-based builds served, %llu descriptor sub-ranges bound, %llu sparse heaps bound, %llu rebuilds, %llu refreshes: %llu blocks compared, %llu copied, %llu refresh syncs; heap refills %llu, unwatched heaps %llu, %llu heap mirrors released for imports (%.1f MiB)\n", count, bytes / 1048576.0, writable, heaps, heapBytes / 1048576.0, static_cast(state.builds), static_cast(state.subranges), static_cast(state.sparseBinds), static_cast(state.rebuilds), static_cast(state.refreshes), static_cast(state.blocksCompared), static_cast(state.blocksCopied), static_cast(state.syncs), static_cast(state.heapRefills), static_cast(state.heapUnwatched), static_cast(state.heapImported), state.heapImportedBytes / 1048576.0); + AgcDriver::ProfilePrint_nid_no_patch("[buffers] image mirrors: %zu ranges (%.1f MiB, %zu writable, %zu heap %.1f MiB), %llu address-based builds served, %llu descriptor sub-ranges bound, %llu sparse heaps bound, %llu rebuilds, %llu refreshes: %llu blocks compared, %llu copied, %llu refresh syncs; heap refills %llu, unwatched heaps %llu, %llu heap mirrors evicted for budget, %llu heap mirrors released for imports (%.1f MiB)\n", count, bytes / 1048576.0, writable, heaps, heapBytes / 1048576.0, static_cast(state.builds), static_cast(state.subranges), static_cast(state.sparseBinds), static_cast(state.rebuilds), static_cast(state.refreshes), static_cast(state.blocksCompared), static_cast(state.blocksCopied), static_cast(state.syncs), static_cast(state.heapRefills), static_cast(state.heapUnwatched), static_cast(state.evictions), static_cast(state.heapImported), state.heapImportedBytes / 1048576.0); #ifdef _WIN32 auto& imports = Imports(); std::lock_guard importsLock(imports.mutex); @@ -3672,7 +3731,7 @@ std::string AddressCopyOverflow(std::vector copies, std::uint64_t l MirrorStats MirrorCounters() { auto& state = Mirrors(); std::lock_guard lock(state.mutex); - MirrorStats stats{0, state.heapBytes, state.rebuilds, state.blocksCopied, state.heapRefills, state.sweeps, state.heapChecks, state.sparseBinds}; + MirrorStats stats{0, state.heapBytes, state.rebuilds, state.blocksCopied, state.heapRefills, state.sweeps, state.heapChecks, state.sparseBinds, state.evictions}; for (const auto& [base, mirror] : state.entries) stats.heapMirrors += mirror->heap ? 1 : 0; return stats; } @@ -3681,6 +3740,14 @@ std::uint64_t SnapshotMismatches() { return Snapshots().mismatched.load(std::memory_order_relaxed); } +std::shared_ptr HoldHeapMirror(std::uint64_t address) { + auto& state = Mirrors(); + std::lock_guard lock(state.mutex); + auto it = state.entries.find(address); + if (it != state.entries.end()) return it->second; + return nullptr; +} + HeapMirrorHold HeapMirrorsWithin(std::uint64_t begin, std::uint64_t end) { auto& state = Mirrors(); std::lock_guard lock(state.mutex); @@ -4358,7 +4425,50 @@ void GuestBufferMemory::CountAddressBuild(double snapshotsUs) { totals.snapshotsUs = 0; } +bool GuestBufferMemory::HoldsMirror(const std::shared_ptr& mirror) const { + for (const auto& region : regions) { + if (region.mirror == mirror) return true; + } + return false; +} + +bool GuestBufferMemory::EvictMirror(const std::shared_ptr& mirror) { + bool found = false; + for (auto& region : regions) { + if (region.mirror == mirror) { + region.mirror.reset(); + region.hostBacked = !region.writable; + auto committed = GuestMemory::DescribeCommitted(region.begin, region.end - region.begin); + if (!committed.whole) { + region.sparse = true; + region.backed = std::move(committed.ranges); + } else { + region.sparse = false; + region.backed.clear(); + } + found = true; + } + } + return found; +} + +bool GuestBufferMemory::WasEvicted(std::uint64_t address) const { + return std::find(evictedRanges.begin(), evictedRanges.end(), address) != evictedRanges.end(); +} + +void GuestBufferMemory::RecordEvicted(std::uint64_t address) { + if (!WasEvicted(address)) evictedRanges.push_back(address); +} + void GuestBufferMemory::AcquireRegistered() { + struct BuildingScope { + explicit BuildingScope(GuestBufferMemory* self) { buildingBufferMemory = self; } + ~BuildingScope() { + buildingBufferMemory = nullptr; + buildingBlocks = nullptr; + } + }; + const BuildingScope buildingScope(this); Require(!uploaded && regions.empty() && lease.empty() && space == nullptr, "guest allocation lease must precede resource registration"); ensurePinWaiter(); static const bool profile = std::getenv("APS5_PROFILE_DRAW") != nullptr; @@ -4374,6 +4484,7 @@ void GuestBufferMemory::AcquireRegistered() { // APS5_NO_SORTED_SNAPSHOT_LOOKUP=1: AddSnapshot scans the regions as before instead of searching. static const bool sortedLookup = std::getenv("APS5_NO_SORTED_SNAPSHOT_LOOKUP") == nullptr; std::vector blocks; + buildingBlocks = &blocks; std::vector heaps; bool mirrored = false; bool served = false; @@ -4528,7 +4639,7 @@ void GuestBufferMemory::AcquireRegistered() { if (part.mirror->sparse) { part.sparse = true; part.backed = part.mirror->committed; - } else heaps.push_back(part.mirror.get()); + } } regions.push_back(std::move(part)); } @@ -4542,7 +4653,7 @@ void GuestBufferMemory::AcquireRegistered() { imported.emplace_back(range->address, range->address + range->bytes); continue; } - if (mirrorsEnabled()) { + if (mirrorsEnabled() && !WasEvicted(range->address)) { region.mirror = acquireMirror(context, range, blocks, range->releasable); lap(timing.mirrorsUs, at); if (region.mirror != nullptr) { @@ -4550,8 +4661,6 @@ void GuestBufferMemory::AcquireRegistered() { if (region.mirror->sparse) { region.sparse = true; region.backed = region.mirror->committed; - } else if (region.mirror->heap) { - heaps.push_back(region.mirror.get()); } regions.push_back(std::move(region)); continue; @@ -4595,6 +4704,9 @@ void GuestBufferMemory::AcquireRegistered() { copies.push_back({copied.begin, copied.end, committed, reason, reason == nullptr, overBudget}); } releaseImportedMirrors(context, imported); + for (const auto& region : regions) { + if (region.mirror != nullptr && region.mirror->heap && !region.mirror->sparse) heaps.push_back(region.mirror.get()); + } regionsSorted = sortedLookup; if (!copies.empty()) { std::uint64_t copied = 0; @@ -4669,7 +4781,7 @@ void GuestBufferMemory::AcquireRegistered() { } space = std::move(built); spaces.droppedByWaiter.store(false, std::memory_order_relaxed); - spaces.current.store(space); + if (evictedRanges.empty()) spaces.current.store(space); } } } @@ -5164,6 +5276,37 @@ void traceStaged(std::uint64_t begin, std::uint64_t end, bool atomic) { std::fprintf(stderr, "[staging] 0x%llx+0x%llx (%.1f KiB)%s\n", static_cast(begin), static_cast(end - begin), (end - begin) / 1024.0, atomic ? " atomic" : ""); } +class AdaptiveStagingGate { +public: + static AdaptiveStagingGate& Get() { + static AdaptiveStagingGate instance; + return instance; + } + + static bool Enabled() { + static const bool disabled = std::getenv("APS5_NO_ADAPTIVE_STAGING") != nullptr; + return !disabled; + } + + bool InPlace(std::uint64_t begin, std::uint64_t end, bool use) { + if (!Enabled()) return false; + std::lock_guard lock(mutex); + if (!stampsRequested) { + Recorder::RequestBatchStamps(); + policy.report = [](const std::string& line) { std::fprintf(stderr, "%s\n", line.c_str()); }; + stampsRequested = true; + } + const auto [frames, busyMs] = Recorder::FrameGpuBusy(); + const auto nowMs = std::chrono::duration_cast(std::chrono::steady_clock::now().time_since_epoch()).count(); + return policy.InPlace(begin, end, use, frames, busyMs, nowMs); + } + +private: + std::mutex mutex; + AdaptiveStaging policy; + bool stampsRequested = false; +}; + void reportStaging() { auto& stats = Copies(); const auto nowMs = std::chrono::duration_cast(std::chrono::steady_clock::now().time_since_epoch()).count(); @@ -5207,6 +5350,24 @@ bool GuestBufferMemory::bindableInPlace(std::uint64_t offset, bool addressable) } bool GuestBufferMemory::stagingEligible(const Region& region, bool addressable) const { + return !region.adaptiveInPlace && stagingWanted(region, addressable); +} + +bool GuestBufferMemory::adaptiveInPlace(const Region& region, bool use) const { + if (!region.swept || region.atomic || region.overlay) return false; + return AdaptiveStagingGate::Get().InPlace(region.begin, region.end, use); +} + +bool GuestBufferMemory::StagingDecisionsCurrent() const { + if (!AdaptiveStagingGate::Enabled()) return true; + for (const auto& region : regions) { + if (!(region.gpuCopy && region.deviceLocal) && !region.adaptiveInPlace) continue; + if (adaptiveInPlace(region, true) != region.adaptiveInPlace) return false; + } + return true; +} + +bool GuestBufferMemory::stagingWanted(const Region& region, bool addressable) const { if (!stagingAllowed || (addressable && !region.overlay) || region.unstaged || !gpuCopiesEnabled() || region.sparse || region.mirror != nullptr) return false; const auto bytes = region.end - region.begin; if (!WritesOverlap(region.begin, static_cast(bytes))) return false; @@ -5378,6 +5539,7 @@ void GuestBufferMemory::UploadPrepare(bool addressable) { // staged region (see stagingEligible) takes the same path, aligned or not, with a // device-local buffer that the CPU fallback replaces (none without a recorder to // record the copies: UploadFinish then binds the region in place). + region.adaptiveInPlace = Recorder::Active() != nullptr && stagingWanted(region, addressable) && adaptiveInPlace(region, true); bool staged = Recorder::Active() != nullptr && stagingEligible(region, addressable); const bool misaligned = !bindableInPlace(HostImportOffset(*entry, region.begin), addressable); if (staged) { @@ -5442,15 +5604,28 @@ void GuestBufferMemory::completeSpaceWrites() const { } } -void GuestBufferMemory::UploadFinish(bool addressable) { +void GuestBufferMemory::UploadFinish(bool addressable, std::optional> htileClear) { Require(prepared && !uploaded, "guest memory upload was not prepared"); static const bool profile = std::getenv("APS5_PROFILE_DRAW") != nullptr; const auto started = std::chrono::steady_clock::now(); for (const auto& region : regions) CompletePendingCpuWrites(context, region.begin, static_cast(region.end - region.begin)); if (space != nullptr) completeSpaceWrites(); uploaded = true; + { + auto& state = Mirrors(); + std::lock_guard lock(state.mutex); + const auto stamp = ++state.dispatchCounter; + for (const auto& region : regions) { + if (region.mirror != nullptr) region.mirror->lastDispatch = stamp; + } + if (space != nullptr) { + for (const auto& region : space->base) { + if (region.mirror != nullptr) region.mirror->lastDispatch = stamp; + } + } + } for (const auto& region : regions) static_cast(FlushDepthPlanes(region.begin, static_cast(region.end - region.begin))); - for (const auto& [begin, end] : writes) RequireNoResidentDepthRead_nid_no_patch(begin, static_cast(end - begin)); + for (const auto& [begin, end] : writes) RequireNoResidentDepthRead_nid_no_patch(begin, static_cast(end - begin), htileClear); for (const auto& [begin, end] : writes) StorageTexture::FlushPending(begin, static_cast(end - begin), nullptr, "written buffer range"); if (context.hostImportAlignment != 0) { auto& state = Imports(); diff --git a/core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp b/core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp index e67b44f58e..c2ccc3aa01 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp @@ -4,6 +4,7 @@ #include "prx/libSceAgcDriver/Execution/include/Mutex.hpp" #include "prx/libc/include/HostThreadLocal.hpp" #include "prx/libSceAgcDriver/Graphics/include/Recorder.hpp" +#include "prx/libSceAgcDriver/Graphics/include/DepthSurface.hpp" #include "prx/libkernel/Time/include/SleepWake.hpp" #include "prx/libSceAgcDriver/Graphics/include/Resources.hpp" #include "prx/libSceAgcDriver/Graphics/include/RuntimeSwitches.hpp" @@ -1190,6 +1191,7 @@ Recorder::~Recorder() { } catch (const std::exception& error) { std::fprintf(stderr, "[gpu] recorder teardown: %s\n", error.what()); } + ForgetHtileMasks_nid_no_patch(id); progressWatcher.reset(); holdKept.clear(); if (activeRecorder == this) { @@ -1854,6 +1856,9 @@ std::atomic traceBarriersLeft{[] { }()}; std::atomic timingPresents{0}; std::atomic presentSerial{0}; +std::atomic settledFrames{0}; +std::atomic settledFrameBusyNs{0}; +std::atomic batchStampsRequested{false}; std::atomic timingDropped{0}; struct TimingTotals { std::uint64_t count = 0; double ms = 0; std::uint64_t bytes = 0; }; AgcDriver::Mutex timingMutex; @@ -1919,7 +1924,7 @@ bool Recorder::GpuTimingEnabled() { } bool Recorder::BatchStampsEnabled() { - return GpuTimingEnabled() || DrawProfiled() || PerformanceTrace::Configured(); + return GpuTimingEnabled() || DrawProfiled() || PerformanceTrace::Configured() || batchStampsRequested.load(std::memory_order_relaxed); } void Recorder::CountBarriers(CommandClass which, std::uint32_t count) { @@ -2004,6 +2009,20 @@ std::uint64_t Recorder::Presents() { return presentSerial.load(std::memory_order_relaxed); } +void Recorder::NoteFrameGpuBusy(double milliseconds) { + settledFrameBusyNs.fetch_add(static_cast(milliseconds * 1e6), std::memory_order_relaxed); + settledFrames.fetch_add(1, std::memory_order_release); +} + +std::pair Recorder::FrameGpuBusy() { + const auto frames = settledFrames.load(std::memory_order_acquire); + return {frames, static_cast(settledFrameBusyNs.load(std::memory_order_relaxed)) / 1e6}; +} + +void Recorder::RequestBatchStamps() { + batchStampsRequested.store(true, std::memory_order_relaxed); +} + void Recorder::AddGpuTiming(CommandClass which, double nanoseconds, std::uint64_t bytes) { std::lock_guard lock(timingMutex); auto& totals = timingByKey[ClassKey(which)]; diff --git a/core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp b/core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp index e67f52d882..186aea757a 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp @@ -398,6 +398,7 @@ std::list::iterator findSampledEntry(TextureCache& cache, VkDevic struct TextureCounters { std::atomic fromStorage{0}; std::atomic snapshots{0}; + std::atomic cleared{0}; std::atomic pendingReads{0}; std::atomic storageFallbacks{0}; std::atomic records{0}; @@ -435,7 +436,7 @@ void reportTextureCounters() { auto last = counters.lastReport.load(); if (nowMs - last < 10000 || !counters.lastReport.compare_exchange_strong(last, nowMs)) return; const auto count = [](const std::atomic& value) { return static_cast(value.load(std::memory_order_relaxed)); }; - AgcDriver::ProfilePrint_nid_no_patch("[textures] sampled created: %llu from storage images, %llu snapshots (%llu snapshot reads over recorded writes inside cachedTexture, %llu storage-path fallbacks); stage-A records %llu: %llu fast hits, %llu full lookups; storage images %llu hits, %llu created, %llu own-object refreshes; image tables %llu reused, %llu resolved; untracked snapshots %llu kept by the write-watch hint, %llu compared\n", count(counters.fromStorage), count(counters.snapshots), count(counters.pendingReads), count(counters.storageFallbacks), count(counters.records), count(counters.fastHits), count(counters.fastMisses), count(counters.storageHits), count(counters.storageCreated), count(counters.ownRefreshes), count(counters.tablesReused), count(counters.tablesResolved), count(counters.untrackedKept), count(counters.untrackedCompared)); + AgcDriver::ProfilePrint_nid_no_patch("[textures] sampled created: %llu from storage images, %llu cleared on the GPU, %llu snapshots (%llu snapshot reads over recorded writes inside cachedTexture, %llu storage-path fallbacks); stage-A records %llu: %llu fast hits, %llu full lookups; storage images %llu hits, %llu created, %llu own-object refreshes; image tables %llu reused, %llu resolved; untracked snapshots %llu kept by the write-watch hint, %llu compared\n", count(counters.fromStorage), count(counters.cleared), count(counters.snapshots), count(counters.pendingReads), count(counters.storageFallbacks), count(counters.records), count(counters.fastHits), count(counters.fastMisses), count(counters.storageHits), count(counters.storageCreated), count(counters.ownRefreshes), count(counters.tablesReused), count(counters.tablesResolved), count(counters.untrackedKept), count(counters.untrackedCompared)); } // What the sampled-texture lookups on this thread proved their returned objects current against, @@ -532,6 +533,18 @@ bool ClearedViewEnabled() { return !disabled; } +std::optional SampledClearColor(const Context& context, const GuestTextureResource& resource, DccKeys keys, bool depthCompare) { + if (depthCompare || !IsDccClear(keys) || keys == DccKeys::ClearRegister) return std::nullopt; + if (IsBlockCompressed(resource.format) || IsRepackedTextureFormat(resource.format) || SrgbExpandsToRgba8(context, resource.format)) return std::nullopt; + const auto format = SampledTextureFormat(context, resource.format); + if (format != DccClearTextureFormat(resource.format)) return std::nullopt; + std::array pattern{}; + if (!FillDccClear(format, keys, resource.dccAlphaOnMsb, std::as_writable_bytes(std::span(pattern)))) return std::nullopt; + VkClearColorValue clear{}; + if (!ClearColorForTexel(format, BytesPerElement(resource.format), pattern, clear)) return std::nullopt; + return clear; +} + std::uint64_t DepthCopyMinBytes() { static const std::uint64_t bytes = [] { const char* text = std::getenv("APS5_DEPTH_COPY_MIN_KIB"); @@ -919,6 +932,7 @@ std::shared_ptr cachedTexture(const Context& context, std::span(context, source, resource, components); + if (const auto clear = SampledClearColor(context, resource, *keys, depthCompare)) return std::make_shared(context, *context.detiler, resource, components, std::span{}, false, &*clear); std::vector snapshot(bytes); ReadTextureSurface(resource, *keys, snapshot); return std::make_shared(context, *context.detiler, resource, components, snapshot, depthCompare); @@ -990,9 +1004,11 @@ std::shared_ptr cachedTexture(const Context& context, std::span{} : (recycled.empty() ? std::vector(bytes) : std::move(recycled)), nullptr, *keys, snapshotGeneration}; + CachedTexture entry{key, address, noSnapshot ? std::vector{} : (recycled.empty() ? std::vector(bytes) : std::move(recycled)), nullptr, *keys, snapshotGeneration}; entry.committed = std::move(committed); entry.surfaceBytes = bytes; const auto createTexture = [&](auto&&... args) { @@ -1019,6 +1035,10 @@ std::shared_ptr cachedTexture(const Context& context, std::spanCached() ? 0u : heldBytes(*source); counters.fromStorage.fetch_add(1, std::memory_order_relaxed); + } else if (clear) { + entry.texture = createTexture(*context.detiler, resource, components, std::span{}, false, &*clear); + entry.accounted = entry.texture->AllocationBytes(); + counters.cleared.fetch_add(1, std::memory_order_relaxed); } else { // Snapshot before the upload so a write racing with it is caught by the next comparison. const bool pending = *keys == DccKeys::Uncompressed && Recorder::SnapshotWriteOverlaps(address, bytes); @@ -1670,7 +1690,7 @@ bool UsesAddressTables(const CompiledShader& compute) { } -ShaderResources::ShaderResources(const Context& context, const CompiledShader& compute, std::span snapshots, bool deferred, std::uint64_t dispatchThreads) : context(context), guestMemory(context), dispatchThreads(dispatchThreads), deferredCompute(compute), deferredSnapshots(snapshots) { +ShaderResources::ShaderResources(const Context& context, const CompiledShader& compute, std::span snapshots, bool deferred, std::uint64_t dispatchThreads, std::optional> htileClear) : context(context), guestMemory(context), dispatchThreads(dispatchThreads), htileClear(htileClear), deferredCompute(compute), deferredSnapshots(snapshots) { Require(compute.stage == ShaderRecompiler::ShaderStage::Compute, "compute resources require a compute shader"); // Every use of a compute build is a recorded dispatch that calls MarkGpuWrites, which staged // buffers need (a synchronous draw's use would not). @@ -2448,7 +2468,7 @@ void ShaderResources::buildComplete() { resolveImageTables(); timing.bindingsMs += phase(BuildPhase::Images); requireGuestBuffers(); - guestMemory.UploadFinish(usesBda); + guestMemory.UploadFinish(usesBda, htileClear); timing.uploadMs += phase(BuildPhase::Upload); if (usesBda) bda = std::make_unique(context, guestMemory); else if (usesFaultBuffer) bda = std::make_unique(context); @@ -2652,7 +2672,7 @@ void ShaderResources::noteReusable() { captureValidation(); reusable = false; directRegions.clear(); - if (guestMemory.HasCopiedWrites() || HoldsLease() || usesBda || !multisampleSources.empty() || (bda != nullptr && LoopGuardEnabled())) return; + if (htileClear.has_value() || guestMemory.HasCopiedWrites() || HoldsLease() || usesBda || !multisampleSources.empty() || (bda != nullptr && LoopGuardEnabled())) return; if (std::any_of(textures.begin(), textures.end(), [](const std::shared_ptr& texture) { return texture != nullptr && texture->RefreshedPerUse(); })) return; if (TemplateDataRefresh() && std::any_of(allocations.begin(), allocations.end(), [](const Allocation& allocation) { return allocation.buffer != nullptr && !allocation.guest && allocation.role != ShaderRecompiler::DescriptorRole::ImageTableMap && allocation.size > MaxRefreshBytes; })) return; const auto regions = guestMemory.DirectRegions(); @@ -3819,6 +3839,7 @@ bool ShaderResources::revalidateFull(std::span shaders, Pr // (3) Buffers staged in device memory (GuestBufferMemory::AllowDeviceStaging) are copied in // from their imports anew for this use, after the flushes above and before the work is // recorded; a failure to record leaves the object unusable for this dispatch, not the batch. + if (!guestMemory.StagingDecisionsCurrent()) return finish(fast, false, ProofFailure::Changed); if (auto* recorder = Recorder::Active(); recorder != nullptr) { try { guestMemory.RecordStagingCopies(*recorder); @@ -5436,6 +5457,10 @@ std::uint64_t SampledLookupKeyScans() { return sampledLookupKeyScans; } +std::uint64_t SampledTexturesCleared() { + return TextureCounts().cleared.load(std::memory_order_relaxed); +} + ImageTableReuseCounts ImageTableReuses() { const auto& counters = TextureCounts(); return {counters.tablesReused.load(std::memory_order_relaxed) + counters.tablesReplayed.load(std::memory_order_relaxed), counters.tablesResolved.load(std::memory_order_relaxed), counters.tablesReplayed.load(std::memory_order_relaxed), counters.tableWritesKept.load(std::memory_order_relaxed), counters.tableWritesMade.load(std::memory_order_relaxed)}; @@ -5910,7 +5935,8 @@ void ShaderResources::requireGuestBuffers(std::span moved) co const auto override = std::find_if(moved.begin(), moved.end(), [&](const MovedBuffer& entry) { return entry.allocation == index; }); const auto address = override != moved.end() ? override->address : item.address; const auto bytes = override != moved.end() ? override->size : item.size; - RequireNoMultisampleTarget(address, bytes, "a shader buffer access"); + RequireNoResidentDepthRead_nid_no_patch(address, bytes, htileClear); + RequireNoMultisampleColorTarget(address, bytes, "a shader buffer access"); } } diff --git a/core/libs/prx/libSceAgcDriver/Graphics/src/ShaderValidation.cpp b/core/libs/prx/libSceAgcDriver/Graphics/src/ShaderValidation.cpp index 6f9dbb4c0c..8b8bd0a0d4 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/src/ShaderValidation.cpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/src/ShaderValidation.cpp @@ -121,7 +121,7 @@ struct Module { return; } // One gl_ClipDistance array holds the guest clip distances and the recompiler's all-zero position distance. - if (!input && ((value == spv::BuiltInClipDistance && (vertex || stage == Stage::TessellationControl || stage == Stage::TessellationEvaluation || stage == Stage::Mesh)) || (value == spv::BuiltInCullDistance && (vertex || stage == Stage::Mesh)))) { + if (!input && ((value == spv::BuiltInClipDistance && (vertex || stage == Stage::TessellationControl || stage == Stage::TessellationEvaluation || stage == Stage::Mesh)) || (value == spv::BuiltInCullDistance && (vertex || stage == Stage::TessellationEvaluation || stage == Stage::Mesh)))) { const auto signature = Signature(type); auto& count = value == spv::BuiltInClipDistance ? clipDistances : cullDistances; Require(count == 0 && signature.size() == 6 && signature.starts_with("f32[") && signature[4] >= '1' && signature[4] <= '8' && signature[5] == ']', "invalid or duplicate clip or cull distance output"); @@ -273,7 +273,7 @@ Module Inspect(const CompiledShader& compiled, const State& state, const VkPhysi if ((vertex || control || evaluation || mesh) && (capability == spv::CapabilityClipDistance || capability == spv::CapabilityCullDistance)) { char word[16]; std::snprintf(word, sizeof(word), "0x%08x", state.paClVsOutCntl); - Require(capability == spv::CapabilityClipDistance ? shaderClipDistance : (vertex || mesh) && shaderCullDistance, std::string("vertex clip or cull distance needs shaderClipDistance or shaderCullDistance, which the device lacks (PA_CL_VS_OUT_CNTL=") + word + ")"); + Require(capability == spv::CapabilityClipDistance ? shaderClipDistance : (vertex || evaluation || mesh) && shaderCullDistance, std::string("vertex clip or cull distance needs shaderClipDistance or shaderCullDistance, which the device lacks (PA_CL_VS_OUT_CNTL=") + word + ")"); } // Enabled unconditionally or by the device setup in VulkanDevice. @@ -289,7 +289,7 @@ Module Inspect(const CompiledShader& compiled, const State& state, const VkPhysi (fragment && sampleRateShading && capability == spv::CapabilityInterpolationFunction) || capability == spv::CapabilityImageMSArray || capability == spv::CapabilityStorageImageMultisample || - ((vertex || mesh) && shaderCullDistance && capability == spv::CapabilityCullDistance) || + ((vertex || evaluation || mesh) && shaderCullDistance && capability == spv::CapabilityCullDistance) || capability == spv::CapabilityStorageImageWriteWithoutFormat || capability == spv::CapabilityStorageImageReadWithoutFormat || capability == spv::CapabilityInt64 || diff --git a/core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp b/core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp index 82b730ae5a..ce2d871ed5 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp @@ -337,7 +337,7 @@ std::uint64_t SampledTextureMemory() { return SampledMemoryCounter().load(std::memory_order_relaxed); } -Texture::Texture(const Context& context, TextureDetiler& detiler, const GuestTextureResource& descriptor, VkComponentMapping components, std::span snapshot, bool depthCompare) : context(context) { +Texture::Texture(const Context& context, TextureDetiler& detiler, const GuestTextureResource& descriptor, VkComponentMapping components, std::span snapshot, bool depthCompare, const VkClearColorValue* clear) : context(context) { static const bool profile = std::getenv("APS5_PROFILE_DRAW") != nullptr; PhaseTimer timer; @@ -363,7 +363,8 @@ Texture::Texture(const Context& context, TextureDetiler& detiler, const GuestTex #endif const auto guestBytes = geometry.guestBytes; - Require(snapshot.size() == guestBytes, "texture snapshot size mismatch"); + Require(clear != nullptr ? snapshot.empty() : snapshot.size() == guestBytes, "texture snapshot size mismatch"); + Require(clear == nullptr || (!depthCompare && !srgbExpand && !IsRepackedTextureFormat(descriptor.format) && !IsBlockCompressed(descriptor.format)), "a cleared texture needs a plain color format"); const auto sliceLinearBytes = geometry.sliceLinearBytes; Require(arrayLayers == 0 || sliceLinearBytes <= UINT64_MAX / arrayLayers, "detiled texture buffer size overflows"); @@ -405,7 +406,39 @@ Texture::Texture(const Context& context, TextureDetiler& detiler, const GuestTex allocationBytes = expanded.bytes; } - { + if (clear != nullptr) { + static const bool syncUploads = std::getenv("APS5_SYNC_TEXTURE_UPLOAD") != nullptr; + auto* recorder = syncUploads ? nullptr : Recorder::Active(); + std::unique_ptr batch; + VkCommandBuffer commands = VK_NULL_HANDLE; + if (recorder != nullptr) { + commands = recorder->Commands(); + recorder->Keep(owned); + } else { + batch = std::make_unique(context); + commands = batch->Handle(); + } + const VkImageSubresourceRange range{aspect, 0, descriptor.mipCount, 0, geometry.imageLayers}; + VkImageMemoryBarrier toTransferDst{VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER}; + toTransferDst.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; + toTransferDst.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; + toTransferDst.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; + toTransferDst.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + toTransferDst.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + toTransferDst.image = image; + toTransferDst.subresourceRange = range; + context.Function("vkCmdPipelineBarrier")(commands, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 0, nullptr, 1, &toTransferDst); + context.Function("vkCmdClearColorImage")(commands, image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, clear, 1, &range); + VkImageMemoryBarrier toShaderRead = toTransferDst; + toShaderRead.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; + toShaderRead.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; + toShaderRead.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; + toShaderRead.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + context.Function("vkCmdPipelineBarrier")(commands, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1, &toShaderRead); + if (batch) batch->SubmitAndWait(); + else ++Profile().recordedUploads; + if (profile) Profile().gpu += timer.lap(); + } else { // Debug aid: APS5_DUMP_TEXTURE= saves the detiled first mip // of those sampled textures on their first 8 uploads as texture_
_.raw (u32 // width, height, VkFormat, then tightly packed rows). @@ -3511,8 +3544,9 @@ std::uint64_t StorageTexture::writeBackWindows(std::span se const auto parts = std::span(added).subspan(first, last - first); const auto sliceBegin = window.tiledBegin - window.window.rangeBegin; const auto intoSlabs = std::all_of(parts.begin(), parts.end(), [&](const AddedPiece& part) { + if (!part.slab || part.seeded) return false; const auto& copy = slabPieces[part.pieces].copies[part.copy]; - return part.slab && !part.seeded && copy.dstOffset % 4 == 0 && copy.size % 4 == 0 && (part.begin - sliceBegin) % blockBytes == 0 && (part.end - sliceBegin) % blockBytes == 0; + return copy.dstOffset % 4 == 0 && copy.size % 4 == 0 && (part.begin - sliceBegin) % blockBytes == 0 && (part.end - sliceBegin) % blockBytes == 0; }); if (intoSlabs) slabRetiled.push_back({i, first, last}); } @@ -4643,6 +4677,25 @@ void StorageTexture::FlushAllPending(const char* reason) { static_cast(FlushPending(0, std::numeric_limits::max(), nullptr, reason)); } +bool StorageTexture::FlushAllPendingUntil(const char* reason, const std::function& stop) { + std::optional onCpu; + if (reason != nullptr && std::strcmp(reason, "idle") == 0) onCpu.emplace(); + std::vector> ranges; + { + auto& pending = Pending(); + std::lock_guard lock(pending.mutex); + for (const auto* texture : pending.textures) ranges.emplace_back(texture->descriptor.baseAddress, static_cast(texture->guestBytes)); + } + constexpr std::size_t piece = std::size_t{4} << 20u; + for (const auto& [address, bytes] : ranges) { + for (std::size_t offset = 0; offset < bytes; offset += piece) { + if (stop()) return false; + static_cast(FlushPending(address + offset, std::min(piece, bytes - offset), nullptr, reason)); + } + } + return true; +} + std::size_t StorageTexture::StoreSmallPending(const char* reason) { std::vector> small; { diff --git a/core/libs/prx/libSceAgcDriver/Unimplemented.cpp b/core/libs/prx/libSceAgcDriver/Unimplemented.cpp index f361aacbe8..df2d3bd4e6 100644 --- a/core/libs/prx/libSceAgcDriver/Unimplemented.cpp +++ b/core/libs/prx/libSceAgcDriver/Unimplemented.cpp @@ -11,6 +11,7 @@ constexpr int DEBUG_UNAVAILABLE = static_cast(0x8A6C1000); constexpr int DRIVER_FEATURE_UNAVAILABLE = static_cast(0x8A6D0001); constexpr int DRIVER_NULL_OUTPUT = static_cast(0x8A6D0003); constexpr int GPU_RESET_UNAVAILABLE = static_cast(0x8A6C0045); +constexpr int MODULE_REGISTRATION_FAILED = static_cast(0x8A6D0003); constexpr std::size_t TOOL_MEMORY_RANGE_SIZE = 12; } @@ -193,6 +194,34 @@ int APS5_VABI sceAgcDriverSetTargetRingForDiag() { return DRIVER_FEATURE_UNAVAILABLE; } +int APS5_VABI sceAgcDriverAcquireRazorACQ() { + return DRIVER_FEATURE_UNAVAILABLE; +} + +int APS5_VABI sceAgcDriverGetPaDebugInterfaceVersion() { + return DRIVER_FEATURE_UNAVAILABLE; +} + +int APS5_VABI sceAgcDriverSetHsOffchipParamDirect() { + return DRIVER_FEATURE_UNAVAILABLE; +} + +int APS5_VABI sceAgcDriverSubmitMultiCommandBuffersDirect() { + return DRIVER_FEATURE_UNAVAILABLE; +} + +int APS5_VABI sceAgcDriverSubmitToRazorACQ() { + return DRIVER_FEATURE_UNAVAILABLE; +} + +int APS5_VABI sceAgcDriverSuspendPointSubmitDirect() { + return DRIVER_FEATURE_UNAVAILABLE; +} + +int APS5_VABI sceAgcDriverModuleRegistration() { + return MODULE_REGISTRATION_FAILED; +} + int APS5_VABI sceAgcDriverSetValueToSharedGds() { NotImplemented_nid_no_patch(__func__); return 0; diff --git a/core/libs/prx/libSceAgcDriver/tests/AdaptiveStaging.cpp b/core/libs/prx/libSceAgcDriver/tests/AdaptiveStaging.cpp new file mode 100644 index 0000000000..c26819a9b7 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/AdaptiveStaging.cpp @@ -0,0 +1,133 @@ +#include "prx/libSceAgcDriver/Graphics/include/AdaptiveStaging.hpp" +#include +#include +#include +#include +#include +#include + +namespace { + +using AgcDriver::Graphics::AdaptiveStaging; + +void Require(bool condition, const std::string& message) { + if (!condition) throw std::runtime_error(message); +} + +constexpr std::uint64_t Begin = 0x200000000; +constexpr std::uint64_t End = Begin + 0xca80000; +constexpr std::int64_t FrameMs = 100; + +struct Title { + AdaptiveStaging policy; + std::vector lines; + std::uint64_t frames = 0; + double busyMs = 0; + std::int64_t nowMs = 1; + + Title() { + policy.report = [this](const std::string& line) { lines.push_back(line); }; + } + + std::uint64_t Run(std::uint64_t count, const std::function& cost) { + std::uint64_t inPlace = 0; + for (std::uint64_t frame = 0; frame < count; ++frame) { + const bool kept = policy.InPlace(Begin, End, true, frames, busyMs, nowMs); + inPlace += kept ? 1 : 0; + busyMs += cost(kept, nowMs); + ++frames; + nowMs += FrameMs; + } + return inPlace; + } + + bool InPlaceNow() { + return policy.InPlace(Begin, End, false, frames, busyMs, nowMs); + } + + std::uint64_t Count(const std::string& text) const { + std::uint64_t count = 0; + for (const auto& line : lines) count += line.find(text) != std::string::npos ? 1 : 0; + return count; + } +}; + +void CheckFasterInPlaceIsKept() { + Title title; + title.Run(200, [](bool inPlace, std::int64_t) { return inPlace ? 73.0 : 91.0; }); + Require(title.InPlaceNow(), "an element 18 ms faster per frame in place is still staged"); + Require(title.Count("-> in place") >= 1, "no decision line chose in place"); +} + +void CheckFasterStagedStaysStaged() { + Title title; + title.Run(200, [](bool inPlace, std::int64_t) { return inPlace ? 114.0 : 84.0; }); + Require(!title.InPlaceNow(), "an element 30 ms faster per frame staged was moved in place"); + Require(title.Count("-> staged") >= 1, "no decision line kept it staged"); +} + +void CheckNoiseKeepsTheMode() { + Title title; + std::uint64_t frame = 0; + const auto inPlace = title.Run(3000, [&](bool, std::int64_t) { return 80.0 + static_cast((frame++ * 7) % 11) - 5.0; }); + Require(title.Count("-> in place") == 0, "frame noise alone moved the element in place"); + Require(inPlace < 3000 / 4, "frame noise kept the element in place for " + std::to_string(inPlace) + " of 3000 frames"); +} + +void CheckBackOffGrowsToTheCap() { + Title title; + title.Run(6000, [](bool inPlace, std::int64_t) { return inPlace ? 114.0 : 84.0; }); + Require(title.Count("next probe in 40 s") >= 1, "the second repeated answer did not wait 40 s"); + Require(title.Count("next probe in 160 s") >= 1, "the back-off never reached 160 s"); + Require(title.Count("next probe in 320 s") == 0, "the back-off grew past 160 s"); +} + +void CheckSceneChangeProbesAgain() { + Title title; + const std::int64_t changeMs = 60000; + const auto cost = [&](bool inPlace, std::int64_t nowMs) { + if (nowMs < changeMs) return inPlace ? 73.0 : 91.0; + return inPlace ? 300.0 : 200.0; + }; + title.Run(600, cost); + Require(title.InPlaceNow(), "the first scene did not keep the element in place"); + title.Run(400, cost); + Require(title.Count("probing again") >= 1, "a scene change from 73 to about 300 ms per frame did not probe again"); + Require(!title.InPlaceNow(), "after the scene change the element is still in place although staged is faster"); +} + +void CheckSmallElementIsNotProbed() { + AdaptiveStaging policy; + std::uint64_t frames = 0; + double busyMs = 0; + std::int64_t nowMs = 1; + constexpr std::uint64_t SmallBegin = 0x100000000; + constexpr std::uint64_t SmallEnd = SmallBegin + 0x10000; + bool smallInPlace = false; + for (int frame = 0; frame < 2000; ++frame) { + const bool bigInPlace = policy.InPlace(Begin, End, true, frames, busyMs, nowMs); + smallInPlace = smallInPlace || policy.InPlace(SmallBegin, SmallEnd, true, frames, busyMs, nowMs); + busyMs += bigInPlace ? 73.0 : 91.0; + ++frames; + nowMs += FrameMs; + } + Require(!smallInPlace, "a 64 KiB element next to a 202 MiB one was probed in place"); +} + +} + +int main() { + try { + CheckFasterInPlaceIsKept(); + CheckFasterStagedStaysStaged(); + CheckNoiseKeepsTheMode(); + CheckBackOffGrowsToTheCap(); + CheckSceneChangeProbesAgain(); + CheckSmallElementIsNotProbed(); + } catch (const std::exception& error) { + std::cerr << error.what() << '\n'; + return 1; + } + std::cout << "adaptive staging tests passed\n"; + return 0; +} diff --git a/core/libs/prx/libSceAgcDriver/tests/AsyncLog.cpp b/core/libs/prx/libSceAgcDriver/tests/AsyncLog.cpp index a370fe2802..9b854cb453 100644 --- a/core/libs/prx/libSceAgcDriver/tests/AsyncLog.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/AsyncLog.cpp @@ -1,4 +1,5 @@ #include "prx/libSceAgcDriver/Execution/include/AsyncLog.hpp" +#include "tests/TemporaryFile.hpp" #include #include #include @@ -122,7 +123,7 @@ std::string LargeLine(std::size_t index, std::size_t bytes) { } void OrderPerThread() { - std::FILE* file = std::tmpfile(); + std::FILE* file = TemporaryFile::Open(); Check(file != nullptr, "temporary file"); auto& log = AgcDriver::AsyncLog::Get(); std::string expected; @@ -139,7 +140,7 @@ void OrderPerThread() { } void LongLine() { - std::FILE* file = std::tmpfile(); + std::FILE* file = TemporaryFile::Open(); Check(file != nullptr, "temporary file"); const std::string longText(3000, 'x'); AgcDriver::AsyncLog::Get().Defer(file, "%s|%d\n", AgcDriver::LogLiteral{longText.c_str()}, 7); @@ -158,7 +159,7 @@ void Coalescing() { } void FlushWaitsForHeldStream() { - std::FILE* file = std::tmpfile(); + std::FILE* file = TemporaryFile::Open(); Check(file != nullptr, "temporary file"); auto& log = AgcDriver::AsyncLog::Get(); { @@ -178,7 +179,7 @@ void FlushWaitsForHeldStream() { } void BoundedFlushGivesUp() { - std::FILE* file = std::tmpfile(); + std::FILE* file = TemporaryFile::Open(); Check(file != nullptr, "temporary file"); auto& log = AgcDriver::AsyncLog::Get(); Check(log.FlushFor(0ms), "FlushFor waited with nothing queued"); @@ -194,7 +195,7 @@ void BoundedFlushGivesUp() { } void FullQueueBlocksCaller() { - std::FILE* file = std::tmpfile(); + std::FILE* file = TemporaryFile::Open(); Check(file != nullptr, "temporary file"); auto& log = AgcDriver::AsyncLog::Get(); constexpr std::size_t lineBytes = 1024 * 1024; diff --git a/core/libs/prx/libSceAgcDriver/tests/ControlFlow.cpp b/core/libs/prx/libSceAgcDriver/tests/ControlFlow.cpp index b59161ab49..c35f27d743 100644 --- a/core/libs/prx/libSceAgcDriver/tests/ControlFlow.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/ControlFlow.cpp @@ -1,3 +1,4 @@ +#include "ControlFlow/ControlFlowHelpers.hpp" #include "ControlFlow/GraphBuilder.hpp" #include "ControlFlow/RequestSerializer.hpp" #include "ControlFlow/Structurizer.hpp" @@ -174,6 +175,17 @@ ControlFlowGraph makeGraph(const std::vector>& succes return graph; } +void verifyPredecessorRebuild() { + auto graph = makeGraph({{2, 1, 2}, {2, 2}, {2}, {}}); + for (auto& block : graph.blocks) block.predecessors = {3u, 3u}; + const std::vector> expected{{}, {0u}, {0u, 1u, 2u}, {}}; + for (unsigned repeat = 0; repeat < 2u; ++repeat) { + rebuildPredecessors(graph); + require(graph.blocks[0].successors == std::vector{1u, 2u} && graph.blocks[1].successors == std::vector{2u}, "predecessor rebuild lost successor normalization"); + for (std::size_t index = 0; index < expected.size(); ++index) require(graph.blocks[index].predecessors == expected[index], "predecessor rebuild changed the incoming edges"); + } +} + void verifyLoopMergeDoesNotEnterNestedSelection() { auto graph = makeGraph({{1, 5}, {2, 3}, {5}, {5, 4}, {1}, {}}); Structurizer{}.Structurize(graph); @@ -1445,6 +1457,7 @@ done: } } try { + verifyPredecessorRebuild(); verifyNullSwappc(); verifyScheduledJumpTable(); VerifyUserDataTail(); diff --git a/core/libs/prx/libSceAgcDriver/tests/FrameDumpIo.cpp b/core/libs/prx/libSceAgcDriver/tests/FrameDumpIo.cpp index f6b12a62e6..a32430080e 100644 --- a/core/libs/prx/libSceAgcDriver/tests/FrameDumpIo.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/FrameDumpIo.cpp @@ -1,4 +1,5 @@ #include "prx/libSceAgcDriver/Execution/include/FrameDumpIo.hpp" +#include "tests/TemporaryFile.hpp" #include #include #include @@ -54,7 +55,7 @@ std::FILE* Pipe(int& reader) { } void SuccessfulBytes() { - auto* file = std::tmpfile(); + auto* file = TemporaryFile::Open(); Check(file != nullptr, "cannot create BMP test file"); const std::array pixels{std::byte{1}, std::byte{2}, std::byte{3}, std::byte{4}}; Check(!AgcDriver::WriteBmpStream_nid_no_patch(file, 2, 2, pixels), "valid BMP write failed"); diff --git a/core/libs/prx/libSceAgcDriver/tests/Graphics.cpp b/core/libs/prx/libSceAgcDriver/tests/Graphics.cpp index c8c9c582f1..612fdac364 100644 --- a/core/libs/prx/libSceAgcDriver/tests/Graphics.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/Graphics.cpp @@ -2785,6 +2785,48 @@ void multisampledSingleClearTests() { Require(!match(std::span(kernel).first(21), userData, group), "a truncated kernel was taken for RADV's comp-to-single clear"); } +void htileBufferMaskClearTests() { + static constexpr std::array kernel{0xd7460004u, 0x04010c0cu, 0xe00c2000u, 0x80000004u, 0xbf8c3f70u, 0xd7710000u, 0x00120008u, 0xd7710001u, 0x00160209u, 0xd7710002u, 0x001a040au, 0xd7710003u, 0x001e060bu, 0xe01c2000u, 0x80000004u, 0xbf810000u}; + ShaderRecompiler::ShaderComputeStageInfo compute{}; + compute.numThreads = {64u, 1u, 1u}; + compute.groupIdEnable = {true, false, false}; + compute.threadIdComponentCount = 1u; + const std::array userData{0x8e350000u, 0x00100050u, 0x00004000u, 0x0004bfacu, 0u, 0u, 0u, 0u, 0x3f0u, 0x3f0u, 0x3f0u, 0x3f0u}; + const std::array packet{0u, 0x4000u, 1u, 1u, 0x61u}; + const auto match = [&](std::span code, std::span words, const ShaderRecompiler::ShaderComputeStageInfo& info, std::span dispatch, std::uint64_t indirect) { + return AgcDriver::Graphics::MatchHtileBufferMaskClear(code, words, info, dispatch, indirect); + }; + const auto found = match(kernel, userData, compute, packet, 0); + Require(found.has_value() && found->address == 0x508e350000ull && found->bytes == 0x40000u && found->mask == 0x3f0u && found->value == 0u, "the buffer variant of the HTILE mask kernel was not recognized with its range, mask and value"); + auto groups = packet; + groups[4] = 0x41u; + groups[1] = 0x100u; + const auto byGroups = match(kernel, userData, compute, groups, 0); + Require(byGroups.has_value() && byGroups->bytes == 0x40000u, "a group-count dispatch of the buffer HTILE kernel did not cover 0x100 groups of 64 records"); + groups[1] = 0x80u; + Require(match(kernel, userData, compute, groups, 0)->bytes == 0x20000u, "fewer threads than records did not limit the buffer HTILE kernel's range"); + auto other = kernel; + other[6] ^= 1u; + Require(!match(other, userData, compute, packet, 0).has_value(), "another kernel was taken for the buffer HTILE mask kernel"); + Require(!match(std::span(kernel).first(15), userData, compute, packet, 0).has_value(), "a truncated kernel was taken for the buffer HTILE mask kernel"); + auto mixed = userData; + mixed[10] = 0x3ffu; + Require(!match(kernel, mixed, compute, packet, 0).has_value(), "a buffer HTILE kernel with per-word masks was recognized"); + auto format = userData; + format[3] = 0x0004dfacu; + Require(!match(kernel, format, compute, packet, 0).has_value(), "a buffer HTILE kernel through a float descriptor was recognized"); + auto stride = userData; + stride[1] = 0x00080050u; + Require(!match(kernel, stride, compute, packet, 0).has_value(), "a buffer HTILE kernel with an 8-byte stride was recognized"); + auto wave32 = compute; + wave32.numThreads = {32u, 1u, 1u}; + Require(!match(kernel, userData, wave32, packet, 0).has_value(), "the buffer HTILE kernel matched with another group size"); + Require(!match(kernel, userData, compute, packet, 0x1000u).has_value(), "an indirect buffer HTILE kernel dispatch was recognized"); + auto partial = packet; + partial[4] = 0x63u; + Require(!match(kernel, userData, compute, partial, 0).has_value(), "a partial-group buffer HTILE kernel dispatch was recognized"); +} + void htileDepthClearTests() { static constexpr std::array kernel{0xd7460000u, 0x04010c06u, 0x34000084u, 0xdc388000u, 0x04020000u, 0xbf8c3f70u, 0xd7710008u, 0x00120805u, 0xd7710009u, 0x00120a05u, 0xd771000au, 0x00120c05u, 0xd771000bu, 0x00120e05u, 0xdc788000u, 0x00020800u, 0xbf810000u}; const std::array wave{64, 1, 1}; @@ -6362,7 +6404,15 @@ void descriptorPoolResetFailureTest() { const auto previous = _ZSt13set_terminatePFvvE_nid_postfix([] { std::_Exit(mock.descriptorResetResult == VK_SUCCESS ? 0 : 1); }); +#ifdef __APPLE__ + const auto previousHost = std::set_terminate([] { + std::_Exit(mock.descriptorResetResult == VK_SUCCESS ? 0 : 1); + }); +#endif cache.Free(allocation); +#ifdef __APPLE__ + std::set_terminate(previousHost); +#endif _ZSt13set_terminatePFvvE_nid_postfix(previous); } @@ -7631,6 +7681,7 @@ struct ModuleShape { std::uint32_t floatControlsWidth = 0; std::uint32_t clipDistanceLength = 0; std::uint32_t cullDistanceLength = 0; + std::optional tessellationModel; bool layerOutput = false; bool terminateInvocation = false; bool omitTerminateExtension = false; @@ -7836,6 +7887,7 @@ std::vector makeModule(const ModuleShape& shape) { if (shape.layer) emit(words, spv::OpCapability, {spv::CapabilityGeometry}); if (shape.clipDistanceLength != 0) emit(words, spv::OpCapability, {spv::CapabilityClipDistance}); if (shape.cullDistanceLength != 0) emit(words, spv::OpCapability, {spv::CapabilityCullDistance}); + if (shape.tessellationModel) emit(words, spv::OpCapability, {spv::CapabilityTessellation}); if (shape.layerOutput) { emit(words, spv::OpCapability, {spv::CapabilityShaderViewportIndexLayerEXT}); const std::string extension = "SPV_EXT_shader_viewport_index_layer"; @@ -7865,10 +7917,14 @@ std::vector makeModule(const ModuleShape& shape) { emit(words, spv::OpMemoryModel, {spv::AddressingModelLogical, spv::MemoryModelGLSL450}); const auto entryPointOffset = words.size(); if (shape.vertexInput) emit(words, spv::OpEntryPoint, {spv::ExecutionModelVertex, main, 0x6e69616du, 0, output, input}); - else emit(words, spv::OpEntryPoint, {shape.fragment ? spv::ExecutionModelFragment : spv::ExecutionModelVertex, main, 0x6e69616du, 0, output}); + else emit(words, spv::OpEntryPoint, {shape.tessellationModel ? *shape.tessellationModel : shape.fragment ? spv::ExecutionModelFragment : spv::ExecutionModelVertex, main, 0x6e69616du, 0, output}); words[entryPointOffset] += static_cast(extraInterface.size()) << 16u; words.insert(words.end(), extraInterface.begin(), extraInterface.end()); if (shape.fragmentMode) emit(words, spv::OpExecutionMode, {main, *shape.fragmentMode}); + if (shape.tessellationModel == spv::ExecutionModelTessellationControl) emit(words, spv::OpExecutionMode, {main, spv::ExecutionModeOutputVertices, 3}); + if (shape.tessellationModel == spv::ExecutionModelTessellationEvaluation) { + for (const auto mode : {spv::ExecutionModeQuads, spv::ExecutionModeSpacingFractionalOdd, spv::ExecutionModeVertexOrderCw}) emit(words, spv::OpExecutionMode, {main, mode}); + } if (shape.fragment) emit(words, spv::OpExecutionMode, {main, spv::ExecutionModeOriginUpperLeft}); if (shape.fragDepth) emit(words, spv::OpExecutionMode, {main, spv::ExecutionModeDepthReplacing}); if (shape.floatControlsWidth != 0) { @@ -8806,6 +8862,23 @@ void barycentricEmulationTests() { const std::array flatPatchShaders{{{ShaderStage::Vertex, &vertex, 0}, {ShaderStage::TessellationControl, &patches.control, 0}, {ShaderStage::TessellationEvaluation, &patches.evaluation, 0}, {ShaderStage::Fragment, &flatVertices, 0}}}; expectFailure([&] { ValidateProvokingVertex(context, lastState, flatPatchShaders); }, "explicit per-vertex flat interpolation"); } + { + const auto context = mockContext(); + auto namedVertex = vertex; + namedVertex.variantId = 11u; + auto namedFragment = fragment; + namedFragment.variantId = 12u; + const std::array namedPatchShaders{{{ShaderStage::Vertex, &namedVertex, 0}, {ShaderStage::TessellationControl, &patches.control, 0}, {ShaderStage::TessellationEvaluation, &patches.evaluation, 0}, {ShaderStage::Fragment, &namedFragment, 0}}}; + auto lastState = state; + lastState.provokingVertexMode = VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT; + std::vector firstKey; + std::vector lastKey; + Require(ValidationKey(context, namedPatchShaders, state, firstKey) && ValidationKey(context, namedPatchShaders, lastState, lastKey), "a draw through generated barycentric tessellation stages skipped the shader validation memo"); + Require(firstKey != lastKey, "the shader validation memo did not tell barycentric patches built for different provoking vertices apart"); + const std::array unnamedPatchShaders{{{ShaderStage::Vertex, &vertex, 0}, {ShaderStage::TessellationControl, &patches.control, 0}, {ShaderStage::TessellationEvaluation, &patches.evaluation, 0}, {ShaderStage::Fragment, &namedFragment, 0}}}; + std::vector unnamedKey; + Require(!ValidationKey(context, unnamedPatchShaders, state, unnamedKey), "a vertex stage without a variant id entered the shader validation memo"); + } RecompileResult clipped; clipped.spirv = makeModule({.parameterOutput = true, .clipDistanceLength = 2}); @@ -11244,6 +11317,16 @@ void validationTests() { vertex.spirv = makeModule({.parameterOutput = true, .cullDistanceLength = 4}); expectFailure([&] { AgcDriver::Graphics::ValidateShaders(shaders, state, subgroup, false, false, false, false, false, false, true, false); }, "PA_CL_VS_OUT_CNTL=0x0040000f"); AgcDriver::Graphics::ValidateShaders(shaders, state, subgroup, false, false, false, false, false, false, false, true); + ShaderRecompiler::RecompileResult tessVertex, tessControl, tessEvaluation; + tessVertex.spirv = makeModule({}); + tessControl.spirv = makeModule({.push = true, .tessellationModel = spv::ExecutionModelTessellationControl}); + tessEvaluation.spirv = makeModule({.cullDistanceLength = 4, .tessellationModel = spv::ExecutionModelTessellationEvaluation}); + const std::array tessShaders{{{ShaderRecompiler::ShaderStage::Local, &tessVertex, 0}, {ShaderRecompiler::ShaderStage::TessellationControl, &tessControl, 0}, {ShaderRecompiler::ShaderStage::TessellationEvaluation, &tessEvaluation, 0}, {ShaderRecompiler::ShaderStage::Fragment, &pixel, 0}}}; + auto tessState = state; + tessState.stages.path = AgcDriver::Graphics::ShaderPath::Tessellation; + tessState.stages.tessellation = ShaderRecompiler::TessellationConfiguration{3, 3, 2, 1, 4, 128, 16, false}; + AgcDriver::Graphics::ValidateShaders(tessShaders, tessState, subgroup, false, false, false, false, false, false, false, true); + expectFailure([&] { AgcDriver::Graphics::ValidateShaders(tessShaders, tessState, subgroup, false, false, false, false, false, false, true, false); }, "PA_CL_VS_OUT_CNTL=0x0040000f"); state.paClVsOutCntl = 0; vertex.spirv = makeModule({.parameterOutput = true, .clipDistanceLength = 9}); expectFailure([&] { AgcDriver::Graphics::ValidateShaders(shaders, state, subgroup, false, false, false, false, false, false, true, true); }, "clip or cull distance"); @@ -12948,6 +13031,7 @@ int main(int argc, char** argv) { OneDimensionalColorTests(); htileDepthClearTests(); multisampledSingleClearTests(); + htileBufferMaskClearTests(); memoryValueFillTests(); ZExportTests(); unorm10_11_11TargetTests(); diff --git a/core/libs/prx/libSceAgcDriver/tests/GuardedMemoryLoads.cpp b/core/libs/prx/libSceAgcDriver/tests/GuardedMemoryLoads.cpp index 9cd66b426c..1aa3987714 100644 --- a/core/libs/prx/libSceAgcDriver/tests/GuardedMemoryLoads.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/GuardedMemoryLoads.cpp @@ -4,6 +4,7 @@ #include "IntermediateRepresentation/IrProgram.hpp" #include "Optimization/ShaderStageInputInfo.hpp" #include "SpirvBackend/SpirvEmitter.hpp" +#include "SpirvBackend/SpirvAnalysis.hpp" #include "PipelineSpecialization.hpp" #include #include @@ -30,12 +31,15 @@ struct LoadCase { IrType type; std::uint32_t bits = 32; std::uint32_t components = 1; + IrShaderStage stage = IrShaderStage::Compute; + bool coherent = true; + bool written = false; }; std::vector emitLoad(const LoadCase& test, bool active, std::uint32_t offset, std::uint32_t records, bool robust, bool exact = false, bool valid = true) { IrProgram program; program.SetWaveSize(32); - program.Resources().stage = IrShaderStage::Compute; + program.Resources().stage = test.stage; program.Resources().srtPlanComplete = true; program.Resources().resourceTrackingComplete = true; program.Metadata().shaderInfoComplete = true; @@ -70,8 +74,9 @@ std::vector emitLoad(const LoadCase& test, bool active, std::uint auto& handle = emit(IrOpcode::GetScratchResource, IrType::AddressResource, {}); emit(test.opcode, test.type, {&handle, &address, &zero, &enabled}); } else if (test.kind == ResourceKind::Buffer) { - program.Resources().memoryInfo.front().coherent = true; + program.Resources().memoryInfo.front().coherent = test.coherent; program.Info().buffers.emplace_back().read = true; + program.Info().buffers.front().written = test.written; program.Metadata().bindings.descriptors.push_back({DescriptorBindingKind::Buffers, {0}}); program.Metadata().bindings.pushDataStartDword = 0; program.Metadata().bindings.memoryOffsetCount = 1; @@ -92,7 +97,9 @@ std::vector emitLoad(const LoadCase& test, bool active, std::uint compute.hostSubgroupSize = 32; compute.waveSize = 32; ShaderStageInputInfo inputs; - inputs.compute = &compute; + ShaderPixelInputInfo pixel; + if (test.stage == IrShaderStage::Pixel) inputs.pixel = &pixel; + else inputs.compute = &compute; CompiledBindingLayout bindings; bindings.layout = program.Metadata().bindings; SpirvTargetOptions target{}; @@ -386,6 +393,71 @@ int main() { const auto plain = emitLoad(test, true, 8, 64, false, true); require(AccessTrace(plain, 0).Run() == std::vector({2}), "exact request without robustBufferAccess2 changed the plain variant"); }); + run("read-only pixel robust buffer result", [] { + const auto selections = [](const std::vector& module) { + unsigned count = 0; + for (std::size_t offset = 5; offset < module.size(); offset += module[offset] >> 16u) count += (module[offset] & 0xffffu) == spv::OpSelect; + return count; + }; + LoadCase test{ResourceKind::Buffer, IrOpcode::LoadBufferU32, IrType::U32, 32, 1, IrShaderStage::Pixel, false}; + for (const bool robust : {false, true}) { + for (const bool exact : {false, true}) { + const auto readOnly = selections(emitLoad(test, true, 8, 64, robust, exact)); + test.written = true; + const auto writing = selections(emitLoad(test, true, 8, 64, robust, exact)); + require(writing == readOnly + (robust && !exact ? 1u : 0u), "only read-only robust pixel loads may omit the result selection"); + test.written = false; + test.coherent = true; + require(selections(emitLoad(test, true, 8, 64, robust, exact)) == readOnly, "coherent loads must retain the upstream volatile result folding"); + test.coherent = false; + } + } + }); + run("storage writers keep guarded results", [] { + IrProgram program; + program.Resources().stage = IrShaderStage::Pixel; + require(AnalyzeProgramRequirements(program).readOnlyStorage, "read-only pixel program lost its storage proof"); + program.Resources().stage = IrShaderStage::Compute; + require(!AnalyzeProgramRequirements(program).readOnlyStorage, "compute entry bookkeeping must keep result guards"); + program.Resources().stage = IrShaderStage::Pixel; + program.Info().usesFaultBuffer = true; + require(!AnalyzeProgramRequirements(program).readOnlyStorage, "fault-buffer writes must keep result guards"); + program.Info().usesFaultBuffer = false; + program.Info().runtimeImageModes.emplace_back().emplace_back().targetMerge = true; + require(!AnalyzeProgramRequirements(program).readOnlyStorage, "runtime target merge writes must keep result guards"); + program.Info().runtimeImageModes.clear(); + auto& block = program.CreateBlock(); + program.BlockOrder().push_back(&block); + program.Resources().memoryInfo.emplace_back().kind = ResourceKind::Lds; + auto& address = program.CreateValue(IrOpcode::Void, IrType::U32); + address.SetImmediateU32(0u); + auto& active = program.CreateValue(IrOpcode::Void, IrType::Bool); + active.SetImmediateBool(true); + auto& load = program.CreateValue(IrOpcode::LoadSharedU32, IrType::U32); + load.AddArgument(&address); + load.AddArgument(&active); + block.AppendInstruction(&load); + require(!AnalyzeProgramRequirements(program).readOnlyStorage, "read-only LDS may allocate storage and must keep result guards"); + }); + run("volatile robust buffer omits repeated zero selection", [] { + const LoadCase test{ResourceKind::Buffer, IrOpcode::LoadBufferU32, IrType::U32}; + const auto selections = [](const std::vector& module) { + unsigned count = 0; + for (std::size_t offset = 5; offset < module.size(); offset += module[offset] >> 16u) { + count += (module[offset] & 0xffffu) == spv::OpSelect; + } + return count; + }; + for (const bool robust : {false, true}) { + for (const bool exact : {false, true}) { + auto plainTest = test; + plainTest.coherent = false; + const auto plain = emitLoad(plainTest, true, 8, 64, robust, exact); + const auto coherent = emitLoad(test, true, 8, 64, robust, exact); + require(selections(plain) == selections(coherent) + (robust && !exact ? 1u : 0u), "only volatile guarded robust loads may omit the repeated zero selection"); + } + } + }); run("private scratch selection", [] { const LoadCase test{ResourceKind::Scratch, IrOpcode::LoadAddressU32, IrType::U32}; for (const bool robust : {false, true}) { diff --git a/core/libs/prx/libSceAgcDriver/tests/Pm4Replay.cpp b/core/libs/prx/libSceAgcDriver/tests/Pm4Replay.cpp index 7359bc4598..79004b096d 100644 --- a/core/libs/prx/libSceAgcDriver/tests/Pm4Replay.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/Pm4Replay.cpp @@ -13,6 +13,7 @@ #include "prx/libSceAgcDriver/Submit/include/Dcb.hpp" #include "prx/libc/include/Shutdown.hpp" #include "SceTypes.hpp" +#include "tests/TemporaryFile.hpp" #include #include #include @@ -130,7 +131,7 @@ std::string verdict(const WaitReport& report) { } std::pair report(const std::filesystem::path& directory, bool full = false) { - std::FILE* output = std::tmpfile(); + std::FILE* output = TemporaryFile::Open(); check(output != nullptr, "cannot create a temporary file for the report"); const auto code = AgcDriver::Pm4Analysis::Report(directory, full, output); std::string text; diff --git a/core/libs/prx/libSceAgcDriver/tests/Recorder.cpp b/core/libs/prx/libSceAgcDriver/tests/Recorder.cpp index 8555dea43b..fd907a1040 100644 --- a/core/libs/prx/libSceAgcDriver/tests/Recorder.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/Recorder.cpp @@ -31,6 +31,7 @@ #include "prx/libc/include/GuestWriteWatch.hpp" #include "prx/libc/include/Shutdown.hpp" #include "prx/libc/include/general/VabiMacros.hpp" +#include "tests/TemporaryFile.hpp" #include "ResidentPresent.hpp" #include "ImageTableAbi.hpp" #include "IntermediateRepresentation/include/IntermediateRepresentation/IrMetadata/BufferFormat.hpp" @@ -1420,7 +1421,7 @@ class StderrCapture { public: StderrCapture() { std::fflush(stderr); - file = std::tmpfile(); + file = TemporaryFile::Open(); Require(file != nullptr, "cannot open a temporary file for stderr"); #ifdef _WIN32 saved = _dup(_fileno(stderr)); @@ -9345,6 +9346,7 @@ void dataRefreshTests(const Device& device, Recorder& recorder) { Require(!resources.DataWordsDiffer(original) && resources.DataWordsDiffer(live), "the per-word compare disagrees with the words"); Require(resources.RefreshData(recorder.Commands(), live, &recorder), "a refresh with different words recorded nothing"); Require(resources.DataWordsHash() == ShaderResources::DataWordsHash(live) && !resources.DataWordsDiffer(live), "the refreshed template's hash is not the patched words'"); + RecordMemoryBarrier(context, recorder.Commands(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_TRANSFER_WRITE_BIT); Require(resources.RefreshData(recorder.Commands(), original, &recorder), "the refresh back recorded nothing"); Require(resources.DataWordsHash() == ShaderResources::DataWordsHash(original), "the refreshed template's hash is not the original words'"); Require(!resources.RefreshData(recorder.Commands(), original, &recorder), "a refresh with equal words recorded"); diff --git a/core/libs/prx/libSceAgcDriver/tests/RedundantValueElimination.cpp b/core/libs/prx/libSceAgcDriver/tests/RedundantValueElimination.cpp index 202aa559ae..9b2ebbd8a9 100644 --- a/core/libs/prx/libSceAgcDriver/tests/RedundantValueElimination.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/RedundantValueElimination.cpp @@ -402,6 +402,28 @@ int main() { return b.eliminate() == 1u && !readOtherwise.HasUses() && readHead.UseCount() == 2u && AllUsed({&readHead, &readThenAfterStore, &readMerge}); }); + passed &= run("a loop without a clobber reuses its dominating ReadConst", [] { + Builder b; + IrBlock& header = b.newBlock(); + IrBlock& body = b.newBlock(); + IrBlock& exit = b.newBlock(); + b.block->AddBranch(&header); + header.AddBranch(&body); + header.AddBranch(&exit); + body.AddBranch(&header); + auto& srt = b.emit(IrOpcode::GetSrtResource, IrType::SrtResource, {}); + auto& beforeLoop = b.emit(IrOpcode::ReadConst, IrType::U32, {&srt, &b.constant(0u)}); + b.keep(beforeLoop); + std::vector reads; + for (auto* block : {&header, &body, &exit}) { + b.block = block; + auto& read = b.emit(IrOpcode::ReadConst, IrType::U32, {&srt, &b.constant(0u)}); + b.keep(read); + reads.push_back(&read); + } + return b.eliminate() == 3u && beforeLoop.UseCount() == 4u && std::ranges::none_of(reads, [](const auto* read) { return read->HasUses(); }); + }); + passed &= run("a store on a loop backedge prevents reusing a pre-loop ReadConst in the loop header", [] { Builder b; IrBlock& header = b.newBlock(); diff --git a/core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp b/core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp index 0e3be3567b..280a642b9a 100644 --- a/core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp @@ -1424,25 +1424,33 @@ void verifyTypeZeroImageMaterialization() { static std::uint64_t lastPendingAddr = 0; static bool gateSecondWaitOnSrtRoot = false; + static bool settledRecord0 = false; + static bool knownRecord0 = false; + static std::array pendingV0{}; + AgcDriver::GuestMemory::SetFlushHook([](std::uint64_t address, std::size_t bytes) { if (phase == 1u && !flushed && address < syncEnd && syncBegin < address + bytes) { flushed = true; ++waits; std::memcpy(reinterpret_cast(record0Addr), pendingT0.data(), sizeof(pendingT0)); if (record1Addr != 0u) std::memcpy(reinterpret_cast(record1Addr), pendingT1.data(), sizeof(pendingT1)); - } else if (phase == 2u || phase == 3u) { + } else if (phase == 2u || phase == 3u || phase == 6u) { if (waits == 0u && address < record1Addr + 32u && record1Addr + 12u < address + bytes) { ++waits; std::memcpy(reinterpret_cast(record1Addr), pendingT1.data(), sizeof(pendingT1)); } else if ((waits == 1u || (phase == 3u && waits >= 1u)) && address < record2Addr + 32u && record2Addr + 12u < address + bytes) { ++waits; - std::memcpy(reinterpret_cast(record0Addr), pendingT0.data(), sizeof(pendingT0)); + if (phase != 6u) std::memcpy(reinterpret_cast(record0Addr), pendingT0.data(), sizeof(pendingT0)); std::memcpy(reinterpret_cast(record2Addr), pendingT2.data(), sizeof(pendingT2)); } else if (phase == 2u && waits == 2u && address < record0Addr + 32u && record0Addr < address + bytes) { ++forcedHookCalls; } } else if (phase == 5u) { ++waits; + } else if (phase == 8u && !flushed && address < record0Addr + 16u && record0Addr < address + bytes) { + flushed = true; + ++waits; + std::memcpy(reinterpret_cast(record0Addr), pendingV0.data(), sizeof(pendingV0)); } }); @@ -1457,7 +1465,19 @@ void verifyTypeZeroImageMaterialization() { ++srtRootReads; } } - if (phase == 0u || phase == 5u) return Pending::Raw; + if (phase == 0u || phase == 5u || phase == 9u) return Pending::Raw; + if (phase == 7u) { + if (settledRecord0) return Pending::None; + if (address == record0Addr + 28u && bytes == sizeof(std::uint32_t) && !known.empty()) { + settledRecord0 = true; + std::memcpy(reinterpret_cast(record0Addr), pendingT0.data(), sizeof(pendingT0)); + } + return Pending::Raw; + } + if (phase == 8u) { + if (flushed) return Pending::None; + return address < record0Addr + 16u && record0Addr < address + bytes ? Pending::Raw : Pending::None; + } if (phase == 4u) { if (address >= record0Addr && address + bytes <= record0Addr + 32u) { if (known.size() == bytes) { @@ -1485,6 +1505,24 @@ void verifyTypeZeroImageMaterialization() { if ((!gateSecondWaitOnSrtRoot || srtRootReads >= 2u) && address >= record2Addr + 12u && address < record2Addr + 32u && bytes == sizeof(std::uint32_t)) return Pending::Sync; return Pending::Raw; } + if (phase == 6u && waits == 2u) { + if (settledRecord0) return Pending::None; + if (address >= record1Addr && address < record1Addr + 32u) { + settledRecord0 = true; + std::memcpy(reinterpret_cast(record0Addr), pendingT0.data(), sizeof(pendingT0)); + return Pending::None; + } + if (address >= record0Addr && address + bytes <= record0Addr + 32u) { + if (knownRecord0) { + if (known.size() == bytes) { + std::memcpy(known.data(), reinterpret_cast(record0Addr) + (address - record0Addr), bytes); + } + return Pending::KnownValue; + } + return Pending::Raw; + } + return Pending::None; + } if (phase == 2u && waits == 2u) { if (gateSecondWaitOnSrtRoot && ((srtRootReads == 3u && address == srtAddress + 512u * sizeof(std::uint32_t) + 56u) || @@ -1703,7 +1741,342 @@ void verifyTypeZeroImageMaterialization() { return std::equal(oldT.begin(), oldT.end(), value.dwords.begin()); }), "forced pass exception scope: a normal pass over Raw words after a throwing forced attempt waited on the hook or bumped rawInvalidations"); } + for (const bool useKnown : {false, true}) { + gateSecondWaitOnSrtRoot = true; + knownRecord0 = useKnown; + settledRecord0 = false; + const std::uint32_t stride = 48u; + const std::size_t stepWords = stride / sizeof(std::uint32_t); + std::fill(srt.begin(), srt.end(), 0u); + std::copy(oldT.begin(), oldT.end(), srt.begin()); + std::copy(oldT.begin(), oldT.end(), srt.begin() + stepWords); + std::copy(oldT.begin(), oldT.end(), srt.begin() + 2u * stepWords); + fillWholeSrt(srt.data() + 512u, srt.data(), stride, 3u); + RecompileRequest settleReq = wideTableReq; + settleReq.context.userData = inPageUserData; + phase = 6u; + waits = 0u; + srtRootReads = 0u; + lastPendingAddr = 0u; + flushed = false; + record0Addr = srtAddress; + record1Addr = srtAddress + stride; + record2Addr = srtAddress + 2u * stride; + pendingT0 = newT; + pendingT1 = thirdT; + pendingT2 = newT; + AgcDriver::ShaderMemory settleMemory({}, multiPending, nullptr, hookWaits); + const auto settleCapture = settleMemory.Capture(settleReq); + const auto& col = settleCapture->snapshot.tables.tables.at(0); + require(settledRecord0 && waits == 2u && col.keys == 3u, "settled force-sync test setup did not reach attempt 2 with settled record0"); + require(col.words.at(col.codes.at(0)).dwords == newT && col.words.at(col.codes.at(1)).dwords == thirdT && col.words.at(col.codes.at(2)).dwords == newT, + useKnown ? "settled force-sync KnownValue: entering SrtDescriptorForceSync did not invalidate cached KnownValue words whose write settled before attempt 2" + : "settled force-sync Raw: entering SrtDescriptorForceSync did not invalidate cached Raw words whose write settled before attempt 2"); + } gateSecondWaitOnSrtRoot = false; + knownRecord0 = false; + + { + srt.fill(0u); + std::copy(oldT.begin(), oldT.end(), srt.begin()); + std::copy(outputV.begin(), outputV.end(), srt.begin() + 16u); + srt[20] = 1u; + phase = 0u; + waits = 0u; + flushed = false; + AgcDriver::ShaderMemory nestedScopeMemory({}, multiPending, nullptr, hookWaits); + static_cast(nestedScopeMemory.Capture(request)); + const auto before = AgcDriver::ShaderMemory::descriptorScope(&nestedScopeMemory, 0u); + const auto firstEnter = AgcDriver::ShaderMemory::descriptorScope(&nestedScopeMemory, SrtDescriptorForceSync); + require(firstEnter == before + 1u, "nested SrtDescriptorForceSync: 0->1 transition with cached Raw words did not increment rawInvalidations once"); + static_cast(nestedScopeMemory.Capture(request)); + const auto afterForcedRead = AgcDriver::ShaderMemory::descriptorScope(&nestedScopeMemory, 0u); + const auto secondEnter = AgcDriver::ShaderMemory::descriptorScope(&nestedScopeMemory, SrtDescriptorForceSync); + const auto firstExit = AgcDriver::ShaderMemory::descriptorScope(&nestedScopeMemory, SrtDescriptorEndForceSync); + const auto secondExit = AgcDriver::ShaderMemory::descriptorScope(&nestedScopeMemory, SrtDescriptorEndForceSync); + require(afterForcedRead == firstEnter && secondEnter == firstEnter && firstExit == firstEnter && secondExit == firstEnter, + "nested SrtDescriptorForceSync: nested 1->2 transition or scope exit altered rawInvalidations"); + } + + { + srt.fill(0u); + std::copy(oldT.begin(), oldT.end(), srt.begin()); + std::copy(outputV.begin(), outputV.end(), srt.begin() + 16u); + srt[20] = 1u; + phase = 1u; + waits = 0u; + flushed = true; + AgcDriver::ShaderMemory settledScopeMemory({}, multiPending, nullptr, hookWaits); + const auto settledCapture = settledScopeMemory.Capture(request); + const auto before = AgcDriver::ShaderMemory::descriptorScope(&settledScopeMemory, 0u); + const auto entered = AgcDriver::ShaderMemory::descriptorScope(&settledScopeMemory, SrtDescriptorForceSync); + const auto exited = AgcDriver::ShaderMemory::descriptorScope(&settledScopeMemory, SrtDescriptorEndForceSync); + require(!settledCapture->snapshot.buffers.empty() && entered == before && exited == before, + "settled SrtDescriptorForceSync: a 0->1 transition over cached words read with no pending write incremented rawInvalidations"); + } + + { + auto tornT = oldT; + tornT[1] &= ~(0x1ffu << 20u); + srt.fill(0u); + std::copy(tornT.begin(), tornT.end(), srt.begin()); + std::copy(outputV.begin(), outputV.end(), srt.begin() + 16u); + srt[20] = 1u; + phase = 7u; + waits = 0u; + flushed = false; + settledRecord0 = false; + record0Addr = srtAddress; + pendingT0 = newT; + AgcDriver::ShaderMemory retryTMemory({}, multiPending, nullptr, hookWaits); + const auto retryTCapture = retryTMemory.Capture(request); + require(settledRecord0 && std::ranges::any_of(retryTCapture->snapshot.images, [&](const DescriptorValue& value) { + return std::equal(newT.begin(), newT.end(), value.dwords.begin()); + }), "speculative invalid T# retry: Materialize did not retry under force-sync and invalidate settled Raw T# words"); + } + + { + auto validV = outputV; + validV[3] = 0x00014facu; + auto tornV = outputV; + tornV[3] = 0x50000facu; + srt.fill(0u); + std::copy(oldT.begin(), oldT.end(), srt.begin()); + std::copy(tornV.begin(), tornV.end(), srt.begin() + 16u); + srt[20] = 1u; + phase = 8u; + waits = 0u; + flushed = false; + record0Addr = srtAddress + 64u; + pendingV0 = validV; + AgcDriver::ShaderMemory retryVMemory({}, multiPending, nullptr, hookWaits); + const auto retryVCapture = retryVMemory.Capture(request); + require(flushed && waits == 1u && !retryVCapture->snapshot.buffers.empty() && + std::equal(validV.begin(), validV.end(), retryVCapture->snapshot.buffers[0].dwords.begin()), + "speculative invalid V# retry: materializeTables validation failure on attempt 0 did not retry under force-sync"); + } + + { + auto tornT = oldT; + tornT[1] &= ~(0x1ffu << 20u); + srt.fill(0u); + std::copy(tornT.begin(), tornT.end(), srt.begin()); + std::copy(outputV.begin(), outputV.end(), srt.begin() + 16u); + srt[20] = 1u; + phase = 9u; + waits = 0u; + flushed = false; + AgcDriver::ShaderMemory badTMemory({}, multiPending, nullptr, hookWaits); + expectFailure([&] { static_cast(badTMemory.Capture(request)); }, "runtime image descriptor is invalid", + "genuinely invalid T# did not throw after force-sync retry"); + + auto tornV = outputV; + tornV[3] = 0x50000facu; + srt.fill(0u); + std::copy(oldT.begin(), oldT.end(), srt.begin()); + std::copy(tornV.begin(), tornV.end(), srt.begin() + 16u); + srt[20] = 1u; + AgcDriver::ShaderMemory badVMemory({}, multiPending, nullptr, hookWaits); + expectFailure([&] { static_cast(badVMemory.Capture(request)); }, "buffer descriptor uses an unsupported type", + "genuinely invalid V# did not throw after force-sync retry"); + } + + { + IrResourcePlan convPlan; + convPlan.srtPlanComplete = true; + convPlan.resourceTrackingComplete = true; + convPlan.userDataCount = 0u; + convPlan.materializationSources = {0u}; + const std::array convWords{ + 0x12345678u, + (static_cast(IrBufferFormat::Format11_11_10UNorm) << 20u) | 0x100u, + 0x0000c000u, + 0x90000facu, + 0u, 0u, 0u, 0u, + }; + std::vector> convValues; + DescriptorSource convSource; + convSource.dwordCount = 8u; + for (std::uint32_t i = 0u; i < 8u; ++i) { + auto val = std::make_unique(IrOpcode::Void, IrType::U32, i); + val->SetImmediateU32(convWords[i]); + convSource.dwords[i] = val.get(); + convValues.push_back(std::move(val)); + } + convPlan.descriptorSources.push_back(convSource); + ImageResource convImg; + convImg.source = 0u; + convImg.resourceClass = ImageResourceClass::Sampled; + convImg.dimension = RdnaImageDimension::Dim2D; + convImg.read = true; + convImg.srgbDecodeCompatible = false; + convImg.depthBitsCompatible = true; + convPlan.info.images.push_back(convImg); + convPlan.info.runtimeImageModes.push_back(ResourceMaterializer::RuntimeImageModes(convImg)); + std::uint32_t forceSyncCalls = 0u; + SrtRuntime convRuntime{}; + convRuntime.userContext = &forceSyncCalls; + convRuntime.descriptorScope = +[](void* ctx, std::size_t bytes) -> std::uint64_t { + if (bytes == SrtDescriptorForceSync) ++*static_cast(ctx); + return 0u; + }; + ResourceSnapshot convSnapshot; + bool caughtConverted = false; + try { + ResourceMaterializer{}.Materialize(convPlan, convRuntime, convSnapshot); + } catch (const ConvertedSampleRequired&) { + caughtConverted = true; + } + require(caughtConverted && forceSyncCalls == 0u, "ConvertedSampleRequired was swallowed or retried under SrtDescriptorForceSync"); + } + + { + std::vector> retryValues; + std::uint32_t retryIds = 0u; + const auto make = [&](IrOpcode opcode, IrType type) -> IrValue& { + retryValues.push_back(std::make_unique(opcode, type, retryIds++)); + return *retryValues.back(); + }; + const auto userWord = [&](std::uint32_t index) -> IrValue& { + auto& reg = make(IrOpcode::Void, IrType::ScalarReg); + reg.SetRegister({RegisterBank::Scalar, index}); + auto& read = make(IrOpcode::GetUserData, IrType::U32); + read.AddArgument(®); + return read; + }; + const auto load = [&](IrValue& address, std::uint32_t offset) -> IrValue& { + auto& immediate = make(IrOpcode::Void, IrType::U32); + immediate.SetImmediateU32(offset); + auto& read = make(IrOpcode::LoadAddressU32, IrType::U32); + read.AddArgument(&address); + read.AddArgument(&immediate); + read.SetFlags(MemoryFlags{0, 0}); + return read; + }; + auto& base = make(IrOpcode::CompositeConstructU64, IrType::U64); + base.AddArgument(&userWord(0u)); + base.AddArgument(&userWord(1u)); + DescriptorSource descriptor; + descriptor.dwordCount = 4u; + for (std::uint32_t dword = 0; dword < 4u; ++dword) descriptor.dwords[dword] = &load(base, dword * 4u); + const auto describe = [&](IrProgram& program) { + auto& resources = program.Resources(); + resources.srtPlanComplete = true; + resources.resourceTrackingComplete = true; + resources.userDataCount = 2u; + MemoryInfo memory; + memory.kind = ResourceKind::ScalarAddress; + resources.memoryInfo.push_back(memory); + resources.descriptorSources.push_back(descriptor); + resources.info.buffers.push_back(BufferResource{}); + }; + constexpr std::uint64_t RetryBase = 0x10000u; + const std::array retryUserData{static_cast(RetryBase), 0u}; + IrProgram retryProgram; + describe(retryProgram); + const auto retryPlan = ResourceMaterializer{}.ExtractPlan(retryProgram); + struct RetryMemory { + std::array words{}; + std::array settled{}; + std::uint64_t epoch = 0u; + std::uint32_t depth = 0u; + std::uint32_t forcedEntries = 0u; + std::uint32_t speculativeReads = 0u; + std::uint32_t forcedReads = 0u; + bool waitOnLastWord = false; + }; + auto tornV = outputV; + tornV[3] = 0x50000facu; + std::uint32_t passReads = 0u; + for (const bool waitOnLastWord : {false, true}) { + RetryMemory state; + state.words = tornV; + state.settled = outputV; + state.waitOnLastWord = waitOnLastWord; + SrtRuntime retryRuntime{retryUserData}; + retryRuntime.userContext = &state; + retryRuntime.readMemory = +[](void* ctx, std::uint64_t address, std::uint32_t* value) { + auto& self = *static_cast(ctx); + if (address < RetryBase || address >= RetryBase + sizeof(self.words)) return false; + const auto index = static_cast((address - RetryBase) / sizeof(std::uint32_t)); + ++(self.depth == 0u ? self.speculativeReads : self.forcedReads); + if (self.waitOnLastWord && self.depth == 0u && index + 1u == self.words.size() && self.words != self.settled) { + self.words = self.settled; + ++self.epoch; + throw std::runtime_error("descriptor read waited on a GPU write and then faulted"); + } + *value = self.words[index]; + return true; + }; + retryRuntime.readSpecializationMemory = retryRuntime.readMemory; + retryRuntime.descriptorScope = +[](void* ctx, std::size_t bytes) -> std::uint64_t { + auto& self = *static_cast(ctx); + if (bytes == SrtDescriptorForceSync) { + if (self.depth++ == 0u) { + ++self.forcedEntries; + self.words = self.settled; + } + } else if (bytes == SrtDescriptorEndForceSync) { + --self.depth; + } + return self.epoch; + }; + ResourceSnapshot retrySnapshot; + ResourceMaterializer{}.Materialize(retryPlan, retryRuntime, retrySnapshot); + require(!retrySnapshot.buffers.empty() && std::equal(outputV.begin(), outputV.end(), retrySnapshot.buffers[0].dwords.begin()), + "descriptor retry policy: Materialize did not settle on the valid V#"); + if (!waitOnLastWord) { + passReads = state.forcedReads; + require(passReads != 0u && state.forcedEntries == 1u && state.speculativeReads == passReads, + "descriptor retry policy: a failed speculative pass that changed no epoch was repeated speculatively instead of going straight to SrtDescriptorForceSync"); + } else { + require(state.forcedEntries == 0u && state.speculativeReads == 2u * passReads, + "descriptor retry policy: a speculative pass that faulted after its read moved the epoch forced SrtDescriptorForceSync instead of retrying speculatively over the refreshed words"); + } + } + + IrProgram fillProgram; + describe(fillProgram); + auto& uniform = fillProgram.Resources().uniformFill; + uniform.fill.kind = UniformFillKind::Buffer; + uniform.fill.words = 1u; + uniform.values[0] = &load(base, 16u); + const auto fillPlan = ResourceMaterializer{}.ExtractPlan(fillProgram); + struct FillMemory { + std::array words{}; + std::uint32_t fill = 0u; + std::uint32_t settledFill = 0u; + std::uint64_t epoch = 0u; + std::uint32_t fillReads = 0u; + }; + FillMemory fillState; + fillState.words = outputV; + fillState.fill = 0x11111111u; + fillState.settledFill = 0x3f800000u; + SrtRuntime fillRuntime{retryUserData}; + fillRuntime.userContext = &fillState; + fillRuntime.readMemory = +[](void* ctx, std::uint64_t address, std::uint32_t* value) { + auto& self = *static_cast(ctx); + if (address == RetryBase + sizeof(self.words)) { + ++self.fillReads; + *value = self.fill; + if (self.fill != self.settledFill) { + self.fill = self.settledFill; + ++self.epoch; + } + return true; + } + if (address < RetryBase || address >= RetryBase + sizeof(self.words)) return false; + *value = self.words[(address - RetryBase) / sizeof(std::uint32_t)]; + return true; + }; + fillRuntime.readSpecializationMemory = fillRuntime.readMemory; + fillRuntime.descriptorScope = +[](void* ctx, std::size_t) -> std::uint64_t { return static_cast(ctx)->epoch; }; + ResourceSnapshot fillSnapshot; + ResourceMaterializer{}.Materialize(fillPlan, fillRuntime, fillSnapshot); + require(fillSnapshot.uniformFill.value == fillState.settledFill && fillState.fillReads == 2u, + "uniform fill epoch: a pass whose uniform fill read moved the epoch was accepted with the value read before the move"); + } } void verifyOutOfRangeConstantReads() { @@ -8215,11 +8588,18 @@ void verifyWaveUniformValues() { auto& fromGlobalLoad = emit(IrOpcode::IAdd32, IrType::U32, {&globalLoad, &uniformSum}); auto& compare = emit(IrOpcode::ULessThan32, IrType::U1, {&laneSum, &userData}); auto& ballot = emit(IrOpcode::Ballot, IrType::U32x4, {&compare}); + auto& uniformPhi = emit(IrOpcode::Phi, IrType::U32, {&userData}); + auto& uniformNext = emit(IrOpcode::IAdd32, IrType::U32, {&uniformPhi, &userData}); + uniformPhi.AddArgument(&uniformNext); + auto& varyingPhi = emit(IrOpcode::Phi, IrType::U32, {&userData}); + auto& varyingNext = emit(IrOpcode::IAdd32, IrType::U32, {&varyingPhi, &lane}); + varyingPhi.AddArgument(&varyingNext); + auto& fromVaryingPhi = emit(IrOpcode::IAdd32, IrType::U32, {&varyingPhi, &userData}); const auto uniform = WaveUniformValues(program); - for (const auto* value : {&userData, &uniformSum, &address, &scalarLoad, &fromScalarLoad, &ballot}) { + for (const auto* value : {&userData, &uniformSum, &address, &scalarLoad, &fromScalarLoad, &ballot, &uniformPhi, &uniformNext}) { require(uniform.contains(value), "wave-uniform values: a value every lane of the wave computes alike was not found uniform"); } - for (const auto* value : {&lane, &laneSum, &laneOffsetLoad, &globalLoad, &fromGlobalLoad, &compare}) { + for (const auto* value : {&lane, &laneSum, &laneOffsetLoad, &globalLoad, &fromGlobalLoad, &compare, &varyingPhi, &varyingNext, &fromVaryingPhi}) { require(!uniform.contains(value), "wave-uniform values: a value that may differ between lanes was found uniform"); } } diff --git a/core/libs/prx/libSceAgcDriver/tests/Submit.cpp b/core/libs/prx/libSceAgcDriver/tests/Submit.cpp index 1d226750d1..482c6aad1b 100644 --- a/core/libs/prx/libSceAgcDriver/tests/Submit.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/Submit.cpp @@ -39,6 +39,18 @@ static_assert(offsetof(Packet, addr) == 0); static_assert(offsetof(Packet, dw_num) == 8); static_assert(offsetof(Packet, flags) == 12); +namespace AgcDriver::DriverDetail { + +struct DriverTestAccess { + static std::uint64_t LabelTaken(std::uint32_t queue, const volatile std::uint32_t* address) { + auto& driver = Driver::Get(); + std::lock_guard lock(driver.labelStoresMutex); + return driver.labelTakes.Taken(queue, reinterpret_cast(address)); + } +}; + +} + namespace { void check(bool condition, const char* message) { @@ -451,6 +463,56 @@ void testLabelTakenAndResetByEarlierSubmission() { AgcDriverWaitIdle_nid_postfix(); } +void testLabelTakesRetire() { + using AgcDriver::DriverDetail::LabelTakes; + auto takes = std::make_unique(); + constexpr std::uint64_t label = 0x1000, other = 0x2000; + takes->Pass(0x20, label, 10); + check(takes->MayHavePass(0x20, label) && takes->Taken(0x20, label) == 0, "a passed wait was not kept for the store that takes it"); + takes->Take(0x20, label); + check(takes->Taken(0x20, label) == 10 && !takes->MayHavePass(0x20, label), "the queue's own store did not turn its pass into a take"); + takes->Retire(0x20, 9); + check(takes->Taken(0x20, label) == 10, "a take was dropped while a submission of the queue entered before it could still wait"); + takes->Retire(0x28, 20); + check(takes->Taken(0x20, label) == 10, "another queue's submission retired a take"); + takes->Retire(0x20, 10); + check(takes->Taken(0x20, label) == 0 && takes->Empty(), "a take was kept after every submission of the queue that could wait entered after it"); + takes->Pass(0x20, label, 30); + takes->Pass(0x20, label, 40); + takes->Retire(0x20, 30); + check(takes->MayHavePass(0x20, label), "an older pass on the dword retired its newer pass"); + takes->Take(0x20, label); + takes->Retire(0x20, 39); + check(takes->Taken(0x20, label) == 40, "a take was retired by a submission entered before it"); + takes->Pass(0x20, other, 50); + takes->Pass(0x28, label, 50); + takes->Retire(0x20, 50); + check(takes->Taken(0x20, label) == 0 && !takes->MayHavePass(0x20, other), "a submission of the queue entered after its passes and take did not retire them"); + check(takes->MayHavePass(0x28, label) && !takes->Empty(), "a submission of one queue retired another queue's pass"); + takes->Retire(0x28, 50); + check(takes->Empty(), "a pass was kept after every submission of its queue entered after it"); +} + +void testLabelTakeRetiredByLaterSubmission() { + using AgcDriver::DriverDetail::DriverTestAccess; + alignas(64) static volatile std::uint32_t gate = 0, label = 0, first = 0, second = 0, third = 0; + submit(0x20, commands(waitEqual(&gate, 1), waitEqual(&label, 1), writeData(&label, 0), writeData(&first, 1))); + submit(0x20, commands(waitEqual(&label, 1), writeData(&second, 1))); + submit(0, commands(writeData(&label, 1))); + waitFor(&label, 1, "producer label never landed"); + gate = 1; + waitFor(&first, 1, "consumer never passed its first label wait"); + std::this_thread::sleep_for(std::chrono::milliseconds(1200)); + check(second == 0, "a label store an earlier submission of the queue had taken and reset satisfied a later submission's wait, or the wait expired"); + check(DriverTestAccess::LabelTaken(0x20, &label) != 0, "a take was dropped while a submission of the queue entered before it was waiting"); + submit(0, commands(writeData(&label, 1))); + waitFor(&second, 1, "the later submission did not resume after a new producer label"); + submit(0x20, commands(writeData(&third, 1))); + waitFor(&third, 1, "a submission entered after the take never ran"); + check(DriverTestAccess::LabelTaken(0x20, &label) == 0, "a take was kept after a submission of the queue entered after it started"); + AgcDriverWaitIdle_nid_postfix(); +} + void testWaitFreeSubmissionAfterEarlierQueue0Work() { alignas(64) static volatile std::uint32_t first = 0, second = 0; constexpr std::uint32_t writes = 20000; @@ -1103,6 +1165,8 @@ int main(int argc, char** argv) { testLabelHeldAtSubmission(); testLabelTakenAndResetInOneSubmission(); testLabelTakenAndResetByEarlierSubmission(); + testLabelTakesRetire(); + testLabelTakeRetiredByLaterSubmission(); testWideLabelStoredSinceSubmission(); testWaitFreeSubmissionAfterEarlierQueue0Work(); testWaitFreeSubmissionQueue0WaitsOn(); diff --git a/core/libs/prx/libSceAgcDriver/tests/TargetAddressWindow.cpp b/core/libs/prx/libSceAgcDriver/tests/TargetAddressWindow.cpp new file mode 100644 index 0000000000..490ba0cb1f --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/TargetAddressWindow.cpp @@ -0,0 +1,20 @@ +#include "execution/TargetAddressWindow.hpp" +#include +#include +#include +#include +#include + +int main() { + constexpr std::size_t BlockBytes = 65536u; + if (AgcDriver::Tests::TargetAddressWindowPair(0x1fffe0000ull, BlockBytes) != std::array{0u, 1u}) return 1; + if (AgcDriver::Tests::TargetAddressWindowPair(0x1ffff0000ull, BlockBytes) != std::array{1u, 2u}) return 1; + if (AgcDriver::Tests::TargetAddressWindowPair(0x300000000ull, BlockBytes) != std::array{0u, 1u}) return 1; + try { + AgcDriver::Tests::TargetAddressWindowPair(0x1ffff0000ull, static_cast(0x100000000ull)); + } catch (const std::runtime_error&) { + std::cout << "target address window test passed\n"; + return 0; + } + return 1; +} diff --git a/core/libs/prx/libSceAgcDriver/tests/TextureFormat.cpp b/core/libs/prx/libSceAgcDriver/tests/TextureFormat.cpp index 0d17219258..3feba5079b 100644 --- a/core/libs/prx/libSceAgcDriver/tests/TextureFormat.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/TextureFormat.cpp @@ -250,6 +250,10 @@ void fillContractTests() { Require(FillDccClear(VK_FORMAT_B10G11R11_UFLOAT_PACK32, DccKeys::Clear1111, false, partial), "packed float fast clear was not encoded"); const std::array white{std::byte{0xc0}, std::byte{0x03}, std::byte{0x1e}, std::byte{0x78}}; for (std::size_t index = 0; index < partial.size(); ++index) Require(partial[index] == (index < 8u ? white[index % 4u] : std::byte{0}), "a clear fill over a partial trailing element did not zero the tail"); + std::vector large(1003, std::byte{0x5a}); + Require(FillDccClear(VK_FORMAT_R16G16B16A16_SFLOAT, DccKeys::Clear1111, false, large), "half float fast clear was not encoded"); + const std::array halfOne{std::byte{0x00}, std::byte{0x3c}, std::byte{0x00}, std::byte{0x3c}, std::byte{0x00}, std::byte{0x3c}, std::byte{0x00}, std::byte{0x3c}}; + for (std::size_t index = 0; index < large.size(); ++index) Require(large[index] == (index < 1000u ? halfOne[index % 8u] : std::byte{0}), "a clear fill over many elements did not repeat the element up to the last whole one"); } void guestFormatLookupTests() { diff --git a/core/libs/prx/libSceAgcDriver/tests/UnsupportedDiagnostics.cpp b/core/libs/prx/libSceAgcDriver/tests/UnsupportedDiagnostics.cpp index 85a226d1bf..f1546a3e4b 100644 --- a/core/libs/prx/libSceAgcDriver/tests/UnsupportedDiagnostics.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/UnsupportedDiagnostics.cpp @@ -6,5 +6,12 @@ int main() { if (sceAgcDriverSetTargetRingForDiag() != static_cast(0x8A6D0001)) return 2; auto* volatile linked = &sceAgcDriverSetFlip; if (linked == nullptr) return 3; + if (sceAgcDriverAcquireRazorACQ() != static_cast(0x8A6D0001)) return 4; + if (sceAgcDriverGetPaDebugInterfaceVersion() != static_cast(0x8A6D0001)) return 5; + if (sceAgcDriverSetHsOffchipParamDirect() != static_cast(0x8A6D0001)) return 6; + if (sceAgcDriverSubmitMultiCommandBuffersDirect() != static_cast(0x8A6D0001)) return 7; + if (sceAgcDriverSubmitToRazorACQ() != static_cast(0x8A6D0001)) return 8; + if (sceAgcDriverSuspendPointSubmitDirect() != static_cast(0x8A6D0001)) return 9; + if (sceAgcDriverModuleRegistration() != static_cast(0x8A6D0003)) return 10; return 0; } diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_adaptive_staging_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_adaptive_staging_tests.cmake new file mode 100644 index 0000000000..19085cc7d7 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_adaptive_staging_tests.cmake @@ -0,0 +1,11 @@ +if(BUILD_TESTING) + add_test_executable(agc_adaptive_staging_tests tests/AdaptiveStaging.cpp) + target_include_directories(agc_adaptive_staging_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(agc_adaptive_staging_tests PRIVATE libc) + add_test(NAME agc_adaptive_staging COMMAND agc_adaptive_staging_tests) + set_tests_properties(agc_adaptive_staging PROPERTIES TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_adaptive_staging PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_async_log_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_async_log_tests.cmake new file mode 100644 index 0000000000..ac53d8070f --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_async_log_tests.cmake @@ -0,0 +1,13 @@ +if(BUILD_TESTING) + add_test_executable(agc_async_log_tests tests/AsyncLog.cpp) + target_include_directories(agc_async_log_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(agc_async_log_tests PRIVATE libc) + configure_windows_unwind(agc_async_log_tests) + add_test(NAME agc_async_log COMMAND agc_async_log_tests) + add_test(NAME agc_async_log_fatal COMMAND agc_async_log_tests fatal) + set_tests_properties(agc_async_log agc_async_log_fatal PROPERTIES TIMEOUT 20) + if(WIN32) + set_tests_properties(agc_async_log agc_async_log_fatal PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_barrier_batch_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_barrier_batch_tests.cmake new file mode 100644 index 0000000000..290b7132af --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_barrier_batch_tests.cmake @@ -0,0 +1,9 @@ +add_test_executable(agc_barrier_batch_tests EXCLUDE_FROM_ALL tests/BarrierBatch.cpp Graphics/src/BarrierBatch.cpp) +target_include_directories(agc_barrier_batch_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) +target_link_libraries(agc_barrier_batch_tests PRIVATE libc) +set_target_properties(agc_barrier_batch_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_barrier_batch_tests) + +if(BUILD_TESTING) + agc_add_default_test(agc_barrier_batch_tests) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_buffer_pool_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_buffer_pool_tests.cmake new file mode 100644 index 0000000000..66a83d3624 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_buffer_pool_tests.cmake @@ -0,0 +1,21 @@ +add_test_executable(agc_buffer_pool_tests EXCLUDE_FROM_ALL tests/BufferPool.cpp) +target_sources(agc_buffer_pool_tests PRIVATE Graphics/src/BufferPool.cpp tests/AllocationFailure.cpp) +target_include_directories(agc_buffer_pool_tests PRIVATE ${LIBS_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/core/shader/recompiler ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) +target_link_libraries(agc_buffer_pool_tests PRIVATE libSceAgcDriver libc) +set_target_properties(agc_buffer_pool_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_buffer_pool_tests) + +if(BUILD_TESTING) + set_target_properties(agc_buffer_pool_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_buffer_pool COMMAND agc_buffer_pool_tests) + add_test(NAME agc_buffer_pool_small_device_shared COMMAND agc_buffer_pool_tests --small-device-retention) + set_tests_properties(agc_buffer_pool_small_device_shared PROPERTIES ENVIRONMENT + "APS5_STAGING_POOL_MIB=256;APS5_BUFFER_POOL_SHARED=1") + add_test(NAME agc_buffer_pool_small_device_no_staging COMMAND agc_buffer_pool_tests --small-device-retention) + set_tests_properties(agc_buffer_pool_small_device_no_staging PROPERTIES ENVIRONMENT + "APS5_STAGING_POOL_MIB=0") + if(WIN32) + set_tests_properties(agc_buffer_pool agc_buffer_pool_small_device_shared agc_buffer_pool_small_device_no_staging PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_buffer_resource_vcc_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_buffer_resource_vcc_tests.cmake new file mode 100644 index 0000000000..46e9784126 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_buffer_resource_vcc_tests.cmake @@ -0,0 +1,14 @@ +add_test_executable(agc_buffer_resource_vcc_tests EXCLUDE_FROM_ALL tests/BufferResourceVcc.cpp) +target_link_libraries(agc_buffer_resource_vcc_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_buffer_resource_vcc_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_buffer_resource_vcc_tests) + +if(BUILD_TESTING) + set_target_properties(agc_buffer_resource_vcc_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_buffer_resource_vcc COMMAND agc_buffer_resource_vcc_tests) + set_tests_properties(agc_buffer_resource_vcc PROPERTIES TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_buffer_resource_vcc PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_capture_trace_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_capture_trace_tests.cmake new file mode 100644 index 0000000000..5edb1c481e --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_capture_trace_tests.cmake @@ -0,0 +1,37 @@ +if(BUILD_TESTING) + add_test_executable(agc_capture_trace_tests tests/CaptureTrace.cpp) + target_include_directories(agc_capture_trace_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(agc_capture_trace_tests PRIVATE libc) + configure_windows_unwind(agc_capture_trace_tests) + set(agcCaptureTraceDirectory ${CMAKE_CURRENT_BINARY_DIR}/capture_trace_tests) + file(MAKE_DIRECTORY "${agcCaptureTraceDirectory}/default") + file(MAKE_DIRECTORY "${agcCaptureTraceDirectory}/explicit") + file(MAKE_DIRECTORY "${agcCaptureTraceDirectory}/failure") + file(MAKE_DIRECTORY "${agcCaptureTraceDirectory}/best-effort") + file(MAKE_DIRECTORY "${agcCaptureTraceDirectory}/disabled") + set(agcCaptureTraceExplicitPath "${agcCaptureTraceDirectory}/explicit/trace.log") + set(agcCaptureTraceFailurePath "${agcCaptureTraceDirectory}/failure/missing-parent/trace.log") + set(agcCaptureTraceBestEffortPath "${agcCaptureTraceDirectory}/best-effort/trace.log") + add_test(NAME agc_capture_trace_path_default COMMAND agc_capture_trace_tests path-default) + add_test(NAME agc_capture_trace_path_empty COMMAND agc_capture_trace_tests path-empty) + set_tests_properties(agc_capture_trace_path_empty PROPERTIES ENVIRONMENT "APS5_CAPTURE_TRACE_PATH=") + add_test(NAME agc_capture_trace_path_explicit COMMAND agc_capture_trace_tests path-explicit) + set_tests_properties(agc_capture_trace_path_explicit PROPERTIES ENVIRONMENT "APS5_CAPTURE_TRACE_PATH=${agcCaptureTraceExplicitPath}") + add_test(NAME agc_capture_trace_explicit_writes COMMAND agc_capture_trace_tests explicit-writes) + set_tests_properties(agc_capture_trace_explicit_writes PROPERTIES ENVIRONMENT "APS5_CAPTURE_TRACE=1;APS5_CAPTURE_TRACE_PATH=${agcCaptureTraceExplicitPath}") + add_test(NAME agc_capture_trace_default_writes COMMAND agc_capture_trace_tests default-writes) + set_tests_properties(agc_capture_trace_default_writes PROPERTIES ENVIRONMENT "APS5_CAPTURE_TRACE=1" WORKING_DIRECTORY "${agcCaptureTraceDirectory}/default") + add_test(NAME agc_capture_trace_open_failure COMMAND agc_capture_trace_tests open-failure) + set_tests_properties(agc_capture_trace_open_failure PROPERTIES ENVIRONMENT "APS5_CAPTURE_TRACE=1;APS5_CAPTURE_TRACE_PATH=${agcCaptureTraceFailurePath}" WORKING_DIRECTORY "${agcCaptureTraceDirectory}/failure") + add_test(NAME agc_capture_trace_best_effort_overflow COMMAND agc_capture_trace_tests best-effort-overflow) + set_tests_properties(agc_capture_trace_best_effort_overflow PROPERTIES ENVIRONMENT "APS5_CAPTURE_TRACE=1;APS5_CAPTURE_TRACE_PATH=${agcCaptureTraceBestEffortPath}" WORKING_DIRECTORY "${agcCaptureTraceDirectory}/best-effort") + add_test(NAME agc_capture_trace_disabled COMMAND agc_capture_trace_tests disabled) + set_tests_properties(agc_capture_trace_disabled PROPERTIES WORKING_DIRECTORY "${agcCaptureTraceDirectory}/disabled") + if(WIN32) + set_tests_properties(agc_capture_trace_path_default agc_capture_trace_path_empty + agc_capture_trace_path_explicit agc_capture_trace_explicit_writes + agc_capture_trace_default_writes agc_capture_trace_open_failure agc_capture_trace_best_effort_overflow + agc_capture_trace_disabled PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_collect_memo_generation_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_collect_memo_generation_tests.cmake new file mode 100644 index 0000000000..7ffaf4fbd8 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_collect_memo_generation_tests.cmake @@ -0,0 +1,12 @@ +if(BUILD_TESTING AND NOT WIN32) + add_test_executable(agc_collect_memo_generation_tests + tests/CollectMemoGeneration.cpp + Execution/src/GuestMemory.cpp + Execution/src/PerformanceTraceThread.cpp + ) + target_include_directories(agc_collect_memo_generation_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(agc_collect_memo_generation_tests PRIVATE shader_recompiler_agc_driver libc) + set_target_properties(agc_collect_memo_generation_tests PROPERTIES CXX_EXTENSIONS OFF) + add_test(NAME agc_collect_memo_generation COMMAND agc_collect_memo_generation_tests) + set_tests_properties(agc_collect_memo_generation PROPERTIES TIMEOUT 30) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_command_batch_failure_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_command_batch_failure_tests.cmake new file mode 100644 index 0000000000..d7c82f620f --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_command_batch_failure_tests.cmake @@ -0,0 +1,17 @@ +add_test_executable(agc_command_batch_failure_tests EXCLUDE_FROM_ALL + tests/CommandBatch.cpp tests/CommandBatchFailure.cpp Graphics/src/Resources.cpp tests/AllocationFailure.cpp) +target_include_directories(agc_command_batch_failure_tests PRIVATE + ${LIBS_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/core/shader/recompiler ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) +target_link_libraries(agc_command_batch_failure_tests PRIVATE libSceAgcDriver libc) +set_target_properties(agc_command_batch_failure_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_command_batch_failure_tests) + +if(BUILD_TESTING) + set_target_properties(agc_command_batch_failure_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_command_batch_failure COMMAND agc_command_batch_failure_tests) + set_tests_properties(agc_command_batch_failure PROPERTIES TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_command_batch_failure PROPERTIES + ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_compile_budget_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_compile_budget_tests.cmake new file mode 100644 index 0000000000..e86bf5faf7 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_compile_budget_tests.cmake @@ -0,0 +1,12 @@ +if(BUILD_TESTING) + add_test_executable(agc_compile_budget_tests tests/CompileBudget.cpp) + target_include_directories(agc_compile_budget_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(agc_compile_budget_tests PRIVATE libc) + configure_windows_unwind(agc_compile_budget_tests) + add_test(NAME agc_compile_budget COMMAND agc_compile_budget_tests) + set_tests_properties(agc_compile_budget PROPERTIES TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_compile_budget PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_compute_pipeline_capture_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_compute_pipeline_capture_tests.cmake new file mode 100644 index 0000000000..2367926617 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_compute_pipeline_capture_tests.cmake @@ -0,0 +1,29 @@ +if(BUILD_TESTING) + add_test_executable(agc_compute_pipeline_capture_tests tests/ComputePipelineCapture.cpp Execution/src/ComputePipelineCapture.cpp) + target_include_directories(agc_compute_pipeline_capture_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) + target_link_libraries(agc_compute_pipeline_capture_tests PRIVATE libc) + set_target_properties(agc_compute_pipeline_capture_tests PROPERTIES CXX_EXTENSIONS OFF) + configure_windows_unwind(agc_compute_pipeline_capture_tests) + add_test(NAME agc_compute_pipeline_capture COMMAND agc_compute_pipeline_capture_tests) + set_tests_properties(agc_compute_pipeline_capture PROPERTIES TIMEOUT 30) + foreach(mode IN ITEMS entry-cap byte-cap io invalid) + string(REPLACE "-" "_" name "${mode}") + add_test(NAME agc_compute_pipeline_capture_optional_${name} COMMAND agc_compute_pipeline_capture_tests --optional-${mode}) + set_tests_properties(agc_compute_pipeline_capture_optional_${name} PROPERTIES TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_compute_pipeline_capture_optional_${name} PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() + endforeach() + if(WIN32) + set_tests_properties(agc_compute_pipeline_capture PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() +endif() + +if(BUILD_TESTING AND ANYPS5_ENABLE_SPIRV_TOOLS) + add_test(NAME agc_compute_pipeline_capture_run COMMAND ${CMAKE_COMMAND} + -DFIXTURE=$ + -DREPLAY=$ + -DOUTPUT_ROOT=${CMAKE_CURRENT_BINARY_DIR}/capture-tests + -P ${CMAKE_CURRENT_SOURCE_DIR}/tests/ComputePipelineCaptureRun.cmake) + set_tests_properties(agc_compute_pipeline_capture_run PROPERTIES TIMEOUT 30 SKIP_REGULAR_EXPRESSION "compute pipeline capture run: skipped, no usable Vulkan device") +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_compute_pipeline_replay_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_compute_pipeline_replay_tests.cmake new file mode 100644 index 0000000000..9e08d76b5c --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_compute_pipeline_replay_tests.cmake @@ -0,0 +1,15 @@ +if(BUILD_TESTING AND ANYPS5_ENABLE_SPIRV_TOOLS) + add_test_executable(agc_compute_pipeline_replay_tests tests/ComputePipelineReplay.cpp) + target_include_directories(agc_compute_pipeline_replay_tests PRIVATE + ${LIBS_INCLUDE_DIR} + ${CMAKE_SOURCE_DIR}/core/shader/recompiler + ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR} + ${ANYPS5_SPIRV_HEADERS_INCLUDE_DIR} + ) + target_link_libraries(agc_compute_pipeline_replay_tests PRIVATE libSceAgcDriver libc) + set_target_properties(agc_compute_pipeline_replay_tests PROPERTIES CXX_EXTENSIONS OFF) + configure_windows_unwind(agc_compute_pipeline_replay_tests) + add_test(NAME agc_compute_pipeline_replay COMMAND agc_compute_pipeline_replay_tests) + set_tests_properties(agc_compute_pipeline_replay PROPERTIES TIMEOUT 30 SKIP_RETURN_CODE 77) + add_dependencies(agc_compute_pipeline_replay_tests agc_compute_pipeline_replay agc_driver_branch_past_endpgm_tests) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_constant_bit_test_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_constant_bit_test_tests.cmake new file mode 100644 index 0000000000..45b91fcbe5 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_constant_bit_test_tests.cmake @@ -0,0 +1,8 @@ +add_test_executable(agc_constant_bit_test_tests EXCLUDE_FROM_ALL tests/ConstantBitTest.cpp) +target_link_libraries(agc_constant_bit_test_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_constant_bit_test_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_constant_bit_test_tests) + +if(BUILD_TESTING) + agc_add_default_test(agc_constant_bit_test_tests) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_constant_phi_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_constant_phi_tests.cmake new file mode 100644 index 0000000000..447e0b8aad --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_constant_phi_tests.cmake @@ -0,0 +1,13 @@ +add_test_executable(agc_constant_phi_tests EXCLUDE_FROM_ALL tests/ConstantPhi.cpp) +target_link_libraries(agc_constant_phi_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_constant_phi_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_constant_phi_tests) + +if(BUILD_TESTING) + set_target_properties(agc_constant_phi_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_constant_phi COMMAND agc_constant_phi_tests) + if(WIN32) + set_tests_properties(agc_constant_phi PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_constant_select_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_constant_select_tests.cmake new file mode 100644 index 0000000000..ba1ec68186 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_constant_select_tests.cmake @@ -0,0 +1,13 @@ +add_test_executable(agc_constant_select_tests EXCLUDE_FROM_ALL tests/ConstantSelect.cpp) +target_link_libraries(agc_constant_select_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_constant_select_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_constant_select_tests) + +if(BUILD_TESTING) + set_target_properties(agc_constant_select_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_constant_select COMMAND agc_constant_select_tests) + if(WIN32) + set_tests_properties(agc_constant_select PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_copy_guest_bytes_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_copy_guest_bytes_tests.cmake new file mode 100644 index 0000000000..1d61029ae2 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_copy_guest_bytes_tests.cmake @@ -0,0 +1,14 @@ +add_test_executable(agc_copy_guest_bytes_tests EXCLUDE_FROM_ALL tests/CopyGuestBytes.cpp) +target_include_directories(agc_copy_guest_bytes_tests PRIVATE + ${LIBS_INCLUDE_DIR} + ${CMAKE_SOURCE_DIR}/core/shader/recompiler + ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR} + ${ANYPS5_SPIRV_HEADERS_INCLUDE_DIR} +) +target_link_libraries(agc_copy_guest_bytes_tests PRIVATE libSceAgcDriver libc) +set_target_properties(agc_copy_guest_bytes_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_copy_guest_bytes_tests) + +if(BUILD_TESTING) + agc_add_default_test(agc_copy_guest_bytes_tests) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_dcc_key_sharing_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_dcc_key_sharing_tests.cmake new file mode 100644 index 0000000000..178a8d915a --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_dcc_key_sharing_tests.cmake @@ -0,0 +1,14 @@ +add_test_executable(agc_dcc_key_sharing_tests EXCLUDE_FROM_ALL tests/DccKeySharing.cpp) +target_include_directories(agc_dcc_key_sharing_tests PRIVATE ${LIBS_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/core/shader/recompiler ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) +target_link_libraries(agc_dcc_key_sharing_tests PRIVATE libc) +set_target_properties(agc_dcc_key_sharing_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_dcc_key_sharing_tests) + +if(BUILD_TESTING) + set_target_properties(agc_dcc_key_sharing_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_dcc_key_sharing COMMAND agc_dcc_key_sharing_tests) + if(WIN32) + set_tests_properties(agc_dcc_key_sharing PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_deferred_destruction_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_deferred_destruction_tests.cmake new file mode 100644 index 0000000000..7e0b115588 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_deferred_destruction_tests.cmake @@ -0,0 +1,14 @@ +add_test_executable(agc_deferred_destruction_tests EXCLUDE_FROM_ALL tests/DeferredDestruction.cpp) +target_include_directories(agc_deferred_destruction_tests PRIVATE ${LIBS_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/core/shader/recompiler ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) +target_link_libraries(agc_deferred_destruction_tests PRIVATE libSceAgcDriver libc) +set_target_properties(agc_deferred_destruction_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_deferred_destruction_tests) + +if(BUILD_TESTING) + set_target_properties(agc_deferred_destruction_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_deferred_destruction COMMAND agc_deferred_destruction_tests) + if(WIN32) + set_tests_properties(agc_deferred_destruction PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_denormal_flush_elimination_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_denormal_flush_elimination_tests.cmake new file mode 100644 index 0000000000..a6a84810cf --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_denormal_flush_elimination_tests.cmake @@ -0,0 +1,13 @@ +add_test_executable(agc_denormal_flush_elimination_tests EXCLUDE_FROM_ALL tests/DenormalFlushElimination.cpp) +target_link_libraries(agc_denormal_flush_elimination_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_denormal_flush_elimination_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_denormal_flush_elimination_tests) + +if(BUILD_TESTING) + set_target_properties(agc_denormal_flush_elimination_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_denormal_flush_elimination COMMAND agc_denormal_flush_elimination_tests) + if(WIN32) + set_tests_properties(agc_denormal_flush_elimination PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_depth_range_remap_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_depth_range_remap_tests.cmake new file mode 100644 index 0000000000..c9e028e78c --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_depth_range_remap_tests.cmake @@ -0,0 +1,14 @@ +add_test_executable(agc_depth_range_remap_tests EXCLUDE_FROM_ALL tests/DepthRangeRemap.cpp) +target_link_libraries(agc_depth_range_remap_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_depth_range_remap_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_depth_range_remap_tests) + +if(BUILD_TESTING) + set_target_properties(agc_depth_range_remap_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_depth_range_remap COMMAND agc_depth_range_remap_tests) + set_tests_properties(agc_depth_range_remap PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1") + if(WIN32) + set_tests_properties(agc_depth_range_remap PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_descriptor_cache_failure_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_descriptor_cache_failure_tests.cmake new file mode 100644 index 0000000000..dee9f6f8f0 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_descriptor_cache_failure_tests.cmake @@ -0,0 +1,15 @@ +if(BUILD_TESTING) + add_test_executable(agc_descriptor_cache_failure_tests + tests/DescriptorCacheFailure.cpp + Graphics/src/ShaderResources.cpp) + target_include_directories(agc_descriptor_cache_failure_tests PRIVATE + $) + target_link_libraries(agc_descriptor_cache_failure_tests PRIVATE libSceAgcDriver shader_recompiler_agc_driver libc libkernel) + configure_windows_unwind(agc_descriptor_cache_failure_tests) + add_test(NAME agc_descriptor_cache_failure COMMAND agc_descriptor_cache_failure_tests) + set_tests_properties(agc_descriptor_cache_failure PROPERTIES TIMEOUT 20) + if(WIN32) + set_tests_properties(agc_descriptor_cache_failure PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_device_fault_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_device_fault_tests.cmake new file mode 100644 index 0000000000..30061b54d3 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_device_fault_tests.cmake @@ -0,0 +1,14 @@ +add_test_executable(agc_device_fault_tests EXCLUDE_FROM_ALL tests/DeviceFault.cpp) +target_include_directories(agc_device_fault_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) +set_target_properties(agc_device_fault_tests PROPERTIES CXX_EXTENSIONS OFF) +target_link_libraries(agc_device_fault_tests PRIVATE libc libkernel) +configure_windows_unwind(agc_device_fault_tests) + +if(BUILD_TESTING) + set_target_properties(agc_device_fault_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_device_fault COMMAND agc_device_fault_tests) + if(WIN32) + set_tests_properties(agc_device_fault PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_device_memory_fallback_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_device_memory_fallback_tests.cmake new file mode 100644 index 0000000000..711518b679 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_device_memory_fallback_tests.cmake @@ -0,0 +1,14 @@ +add_test_executable(agc_device_memory_fallback_tests EXCLUDE_FROM_ALL tests/DeviceMemoryFallback.cpp) +target_include_directories(agc_device_memory_fallback_tests PRIVATE ${LIBS_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/core/shader/recompiler ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) +target_link_libraries(agc_device_memory_fallback_tests PRIVATE libSceAgcDriver libc) +set_target_properties(agc_device_memory_fallback_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_device_memory_fallback_tests) + +if(BUILD_TESTING) + set_target_properties(agc_device_memory_fallback_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_device_memory_fallback COMMAND agc_device_memory_fallback_tests) + if(WIN32) + set_tests_properties(agc_device_memory_fallback PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_display_buffer_dcc_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_display_buffer_dcc_tests.cmake new file mode 100644 index 0000000000..88f140756a --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_display_buffer_dcc_tests.cmake @@ -0,0 +1,14 @@ +add_test_executable(agc_display_buffer_dcc_tests EXCLUDE_FROM_ALL tests/DisplayBufferDcc.cpp) +target_include_directories(agc_display_buffer_dcc_tests PRIVATE ${LIBS_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/core/shader/recompiler ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) +target_link_libraries(agc_display_buffer_dcc_tests PRIVATE libSceAgcDriver libc) +set_target_properties(agc_display_buffer_dcc_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_display_buffer_dcc_tests) + +if(BUILD_TESTING) + set_target_properties(agc_display_buffer_dcc_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_display_buffer_dcc COMMAND agc_display_buffer_dcc_tests) + if(WIN32) + set_tests_properties(agc_display_buffer_dcc PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_dpp_write_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_dpp_write_tests.cmake new file mode 100644 index 0000000000..9d9048b75e --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_dpp_write_tests.cmake @@ -0,0 +1,8 @@ +add_test_executable(agc_dpp_write_tests EXCLUDE_FROM_ALL tests/DppWrite.cpp) +target_link_libraries(agc_dpp_write_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_dpp_write_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_dpp_write_tests) + +if(BUILD_TESTING) + agc_add_default_test(agc_dpp_write_tests) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_draw_inputs_in_place_driver_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_draw_inputs_in_place_driver_tests.cmake new file mode 100644 index 0000000000..63c317d18a --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_draw_inputs_in_place_driver_tests.cmake @@ -0,0 +1,9 @@ +add_test_executable(agc_draw_inputs_in_place_driver_tests EXCLUDE_FROM_ALL tests/DrawInputsInPlace.cpp) +target_include_directories(agc_draw_inputs_in_place_driver_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) +set_target_properties(agc_draw_inputs_in_place_driver_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_draw_inputs_in_place_driver_tests) + +if(BUILD_TESTING) + set_target_properties(agc_draw_inputs_in_place_driver_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_draw_inputs_in_place_driver COMMAND agc_draw_inputs_in_place_driver_tests) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_address_passes_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_address_passes_tests.cmake new file mode 100644 index 0000000000..9208eaf2d2 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_address_passes_tests.cmake @@ -0,0 +1,14 @@ +if(BUILD_TESTING) + add_test(NAME agc_driver_address_passes_targets_split COMMAND agc_driver_address_passes_tests --targets) + set_tests_properties(agc_driver_address_passes_targets_split PROPERTIES ENVIRONMENT "APS5_NO_ADDRESS_READ_PASSES=1" SKIP_RETURN_CODE 77 TIMEOUT 60) + if(WIN32) + set_tests_properties(agc_driver_address_passes_targets_split PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_driver_address_passes_draw_transitions COMMAND agc_driver_address_passes_tests --targets) + set_tests_properties(agc_driver_address_passes_draw_transitions PROPERTIES ENVIRONMENT "APS5_NO_ADDRESS_READ_PASSES=1;APS5_DRAW_TRANSITIONS=1" SKIP_RETURN_CODE 77 TIMEOUT 60) + if(WIN32) + set_tests_properties(agc_driver_address_passes_draw_transitions PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_alpha_to_coverage_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_alpha_to_coverage_tests.cmake new file mode 100644 index 0000000000..ac0bbbe423 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_alpha_to_coverage_tests.cmake @@ -0,0 +1,20 @@ +target_include_directories(agc_driver_alpha_to_coverage_tests PRIVATE $) + +if(BUILD_TESTING) + add_test(NAME agc_driver_dithered_alpha_to_coverage COMMAND agc_driver_alpha_to_coverage_tests --dithered8) + add_test(NAME agc_driver_two_sample_dithered_alpha_to_coverage COMMAND agc_driver_alpha_to_coverage_tests --dithered2) + set(multisampledDccClearTests) + foreach(samples IN ITEMS 2 4 8) + set(testName "agc_driver_msaa_dcc_srgb_clear_${samples}") + add_test(NAME ${testName} COMMAND agc_driver_alpha_to_coverage_tests --dcc-srgb-clear ${samples}) + list(APPEND multisampledDccClearTests ${testName}) + set(testName "agc_driver_msaa_dcc_clear_${samples}") + add_test(NAME ${testName} COMMAND agc_driver_alpha_to_coverage_tests --dcc-fast-clear ${samples}) + list(APPEND multisampledDccClearTests ${testName}) + set(testName "agc_driver_msaa_dcc_compared_import_${samples}") + add_test(NAME ${testName} COMMAND agc_driver_alpha_to_coverage_tests --dcc-compared-import ${samples}) + list(APPEND multisampledDccClearTests ${testName}) + endforeach() + set_tests_properties(agc_driver_dithered_alpha_to_coverage agc_driver_two_sample_dithered_alpha_to_coverage PROPERTIES + ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_array_layer_target_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_array_layer_target_tests.cmake new file mode 100644 index 0000000000..c3b957f8ad --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_array_layer_target_tests.cmake @@ -0,0 +1,9 @@ +if(BUILD_TESTING) + add_test(NAME agc_driver_array_layer_target_cpu COMMAND agc_driver_array_layer_target_tests) + set_tests_properties(agc_driver_array_layer_target_cpu PROPERTIES + ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_HOST_IMPORT=1" TIMEOUT 30 SKIP_RETURN_CODE 77) + if(WIN32) + set_tests_properties(agc_driver_array_layer_target_cpu PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_bda_device_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_bda_device_tests.cmake new file mode 100644 index 0000000000..1d12dea732 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_bda_device_tests.cmake @@ -0,0 +1,38 @@ +add_test_executable(agc_driver_bda_device_tests EXCLUDE_FROM_ALL + tests/BdaDevice.cpp + tests/BdaShader.cpp + tests/BdaExecution.cpp + tests/BdaContracts.cpp + tests/HostImportFailure.cpp +) + +target_include_directories(agc_driver_bda_device_tests PRIVATE + ${LIBS_INCLUDE_DIR} + $ + ${CMAKE_SOURCE_DIR}/core/shader/recompiler + ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR} +) +target_link_libraries(agc_driver_bda_device_tests PRIVATE libSceAgcDriver SDL2-static libc) +set_target_properties(agc_driver_bda_device_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_driver_bda_device_tests) + +if(BUILD_TESTING) + add_test(NAME agc_driver_host_import_failure_handles COMMAND agc_driver_bda_device_tests --host-import-failures) + set_tests_properties(agc_driver_host_import_failure_handles PROPERTIES + ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_driver_host_import_failure_handles PROPERTIES + ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() +endif() + +if(BUILD_TESTING) + agc_add_default_test(agc_driver_bda_device_tests) + add_test(NAME agc_driver_bda_device_selection_cpu COMMAND agc_driver_bda_device_tests --device-selection-cpu) + set_tests_properties(agc_driver_bda_device_selection_cpu PROPERTIES + ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_driver_bda_device_selection_cpu PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_bda_span_reads_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_bda_span_reads_tests.cmake new file mode 100644 index 0000000000..a04e356668 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_bda_span_reads_tests.cmake @@ -0,0 +1,3 @@ +if(BUILD_TESTING) + agc_add_draw_pipeline_test(agc_driver_bda_span_reads) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_buffer_descriptor_runtime_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_buffer_descriptor_runtime_tests.cmake new file mode 100644 index 0000000000..6eedba2d4a --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_buffer_descriptor_runtime_tests.cmake @@ -0,0 +1 @@ +target_include_directories(agc_driver_buffer_descriptor_runtime_tests PRIVATE $) diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_buffer_load_store_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_buffer_load_store_tests.cmake new file mode 100644 index 0000000000..6657a14950 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_buffer_load_store_tests.cmake @@ -0,0 +1,3 @@ +if(BUILD_TESTING) + agc_add_draw_pipeline_test(agc_driver_buffer_load_store) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_clamped_global_fill_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_clamped_global_fill_tests.cmake new file mode 100644 index 0000000000..3c7fa372bb --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_clamped_global_fill_tests.cmake @@ -0,0 +1,3 @@ +if(BUILD_TESTING) + set_tests_properties(agc_driver_clamped_global_fill PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_LABEL_READBACK_STORE=1") +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_cmask_fast_clear_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_cmask_fast_clear_tests.cmake new file mode 100644 index 0000000000..91dd83dfc8 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_cmask_fast_clear_tests.cmake @@ -0,0 +1,24 @@ +add_test_executable(agc_driver_cmask_fast_clear_tests EXCLUDE_FROM_ALL + tests/CmaskFastClear.cpp + ${agcCoverShaderHeaders} +) + +target_include_directories(agc_driver_cmask_fast_clear_tests PRIVATE + ${LIBS_INCLUDE_DIR} + ${agcTestShaderGeneratedRoot} + ${CMAKE_SOURCE_DIR}/core/shader/recompiler + ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR} +) + +target_link_libraries(agc_driver_cmask_fast_clear_tests PRIVATE + libSceAgcDriver + SDL2-static + libc +) + +set_target_properties(agc_driver_cmask_fast_clear_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_driver_cmask_fast_clear_tests) + +if(BUILD_TESTING) + agc_add_default_test(agc_driver_cmask_fast_clear_tests) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_color1555_target_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_color1555_target_tests.cmake new file mode 100644 index 0000000000..b7160628eb --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_color1555_target_tests.cmake @@ -0,0 +1 @@ +target_include_directories(agc_driver_color1555_target_tests PRIVATE $) diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_color565_target_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_color565_target_tests.cmake new file mode 100644 index 0000000000..298dff2a13 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_color565_target_tests.cmake @@ -0,0 +1 @@ +target_include_directories(agc_driver_color565_target_tests PRIVATE $) diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_color_logic_op_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_color_logic_op_tests.cmake new file mode 100644 index 0000000000..2665ea3ed3 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_color_logic_op_tests.cmake @@ -0,0 +1 @@ +target_include_directories(agc_driver_color_logic_op_tests PRIVATE $) diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_compute_prebuild_share_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_compute_prebuild_share_tests.cmake new file mode 100644 index 0000000000..122e6d9d65 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_compute_prebuild_share_tests.cmake @@ -0,0 +1,3 @@ +if(BUILD_TESTING) + set_property(TEST agc_driver_compute_prebuild_share APPEND PROPERTY ENVIRONMENT "APS5_PREBUILD_THREADS=4") +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_compute_user_data_calls_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_compute_user_data_calls_tests.cmake new file mode 100644 index 0000000000..afca8a34ea --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_compute_user_data_calls_tests.cmake @@ -0,0 +1,7 @@ +if(BUILD_TESTING) + add_test(NAME agc_driver_compute_user_data_calls_registered COMMAND agc_driver_compute_user_data_calls_tests --registered) + set_tests_properties(agc_driver_compute_user_data_calls_registered PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_driver_compute_user_data_calls_registered PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_constant_store_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_constant_store_tests.cmake new file mode 100644 index 0000000000..7beac60cfa --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_constant_store_tests.cmake @@ -0,0 +1,3 @@ +if(BUILD_TESTING) + agc_add_spirv_mode_tests(agc_driver_constant_store_tests) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_copied_writer_copy_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_copied_writer_copy_tests.cmake new file mode 100644 index 0000000000..86b69033ad --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_copied_writer_copy_tests.cmake @@ -0,0 +1,3 @@ +if(BUILD_TESTING) + agc_add_draw_pipeline_test(agc_driver_copied_writer_copy) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_copied_writer_label_order_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_copied_writer_label_order_tests.cmake new file mode 100644 index 0000000000..c06c5354ba --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_copied_writer_label_order_tests.cmake @@ -0,0 +1,7 @@ +if(BUILD_TESTING) + add_test(NAME agc_driver_copied_writer_label_order_drain COMMAND agc_driver_copied_writer_label_order_tests) + set_tests_properties(agc_driver_copied_writer_label_order_drain PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_DRAIN_COMPLETION_LABELS=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_driver_copied_writer_label_order_drain PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_copy_surface_bytes_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_copy_surface_bytes_tests.cmake new file mode 100644 index 0000000000..04f29eb3b1 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_copy_surface_bytes_tests.cmake @@ -0,0 +1,11 @@ +if(BUILD_TESTING) + set_tests_properties(agc_driver_copy_surface_bytes PROPERTIES TIMEOUT 30 ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_SUSPEND_DRAIN=1") + set_property(TEST agc_driver_copy_surface_bytes APPEND PROPERTY ENVIRONMENT_MODIFICATION "APS5_NO_COPY_ALIAS=unset:") + add_test(NAME agc_driver_copy_surface_bytes_no_alias COMMAND agc_driver_copy_surface_bytes_tests) + set_tests_properties(agc_driver_copy_surface_bytes_no_alias PROPERTIES TIMEOUT 30 SKIP_RETURN_CODE 77 + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_SUSPEND_DRAIN=1;APS5_NO_COPY_ALIAS=1") + if(WIN32) + set_tests_properties(agc_driver_copy_surface_bytes_no_alias PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_depth_bounds_emulation_draw_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_depth_bounds_emulation_draw_tests.cmake new file mode 100644 index 0000000000..1aeadece59 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_depth_bounds_emulation_draw_tests.cmake @@ -0,0 +1 @@ +target_include_directories(agc_driver_depth_bounds_emulation_draw_tests PRIVATE $) diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_depth_fast_clear_submit_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_depth_fast_clear_submit_tests.cmake new file mode 100644 index 0000000000..aa3486152a --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_depth_fast_clear_submit_tests.cmake @@ -0,0 +1,7 @@ +if(BUILD_TESTING) + add_test(NAME agc_driver_htile_mask_lifetime COMMAND agc_driver_depth_fast_clear_submit_tests --mask-lifetime) + set_tests_properties(agc_driver_htile_mask_lifetime PROPERTIES TIMEOUT 30 ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_driver_htile_mask_lifetime PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_depth_plane_partial_store_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_depth_plane_partial_store_tests.cmake new file mode 100644 index 0000000000..31e1d85526 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_depth_plane_partial_store_tests.cmake @@ -0,0 +1,25 @@ +if(BUILD_TESTING) + add_test(NAME agc_driver_depth_plane_cpu_write_after_page_unwatch COMMAND agc_driver_depth_plane_partial_store_tests --cpu-write-after-page-unwatch) + set_tests_properties(agc_driver_depth_plane_cpu_write_after_page_unwatch PROPERTIES + ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" TIMEOUT 30 SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_driver_depth_plane_cpu_write_after_page_unwatch PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_driver_depth_plane_cpu_write_after_partial_unwatch COMMAND agc_driver_depth_plane_partial_store_tests --cpu-write-after-partial-unwatch) + set_tests_properties(agc_driver_depth_plane_cpu_write_after_partial_unwatch PROPERTIES + ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" TIMEOUT 30 SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_driver_depth_plane_cpu_write_after_partial_unwatch PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_driver_depth_plane_cpu_write_after_memo COMMAND agc_driver_depth_plane_partial_store_tests --cpu-write-after-memo) + set_tests_properties(agc_driver_depth_plane_cpu_write_after_memo PROPERTIES + ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" TIMEOUT 30 SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_driver_depth_plane_cpu_write_after_memo PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_driver_depth_plane_partial_store_unimported COMMAND agc_driver_depth_plane_partial_store_tests) + add_test(NAME agc_driver_depth_plane_partial_store_buffer_copy COMMAND agc_driver_depth_plane_partial_store_tests --buffer-copy) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_depth_plane_sampling_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_depth_plane_sampling_tests.cmake new file mode 100644 index 0000000000..de018fd7d9 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_depth_plane_sampling_tests.cmake @@ -0,0 +1,8 @@ +if(BUILD_TESTING) + add_test(NAME agc_driver_depth_plane_sampling_evicting COMMAND agc_driver_depth_plane_sampling_tests --evicting) + set_tests_properties(agc_driver_depth_plane_sampling_evicting PROPERTIES ENVIRONMENT "APS5_DEPTH_PLANE_COPY_MIB=1" SKIP_RETURN_CODE 77 TIMEOUT 120) + if(WIN32) + set_tests_properties(agc_driver_depth_plane_sampling_evicting PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_depth_range_remap_draw_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_depth_range_remap_draw_tests.cmake new file mode 100644 index 0000000000..cead7e6d69 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_depth_range_remap_draw_tests.cmake @@ -0,0 +1 @@ +target_include_directories(agc_driver_depth_range_remap_draw_tests PRIVATE $) diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_depth_storage_reuse_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_depth_storage_reuse_tests.cmake new file mode 100644 index 0000000000..ae4b99b882 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_depth_storage_reuse_tests.cmake @@ -0,0 +1,3 @@ +if(BUILD_TESTING) + agc_add_draw_pipeline_test(agc_driver_depth_storage_reuse) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_draw_cache_relocation_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_draw_cache_relocation_tests.cmake new file mode 100644 index 0000000000..510aeafff2 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_draw_cache_relocation_tests.cmake @@ -0,0 +1,16 @@ +target_include_directories(agc_driver_draw_cache_relocation_tests PRIVATE $) + +if(BUILD_TESTING) + add_test(NAME agc_driver_draw_cache_relocation_recipe_verify COMMAND agc_driver_draw_cache_relocation_tests) + set_tests_properties(agc_driver_draw_cache_relocation_recipe_verify PROPERTIES + ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_VERIFY_DRAW_RECIPE=1;APS5_PIPELINED_DRAWS=0" SKIP_RETURN_CODE 77 TIMEOUT 60 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + add_test(NAME agc_driver_draw_cache_relocation_evicted COMMAND agc_driver_draw_cache_relocation_tests --evicted) + add_test(NAME agc_driver_draw_cache_relocation_kept COMMAND agc_driver_draw_cache_relocation_tests --kept) + set_tests_properties(agc_driver_draw_cache_relocation_evicted agc_driver_draw_cache_relocation_kept PROPERTIES + ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_DRAW_CACHE_ENTRIES=2" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_driver_draw_cache_relocation_recipe_verify agc_driver_draw_cache_relocation_evicted agc_driver_draw_cache_relocation_kept PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + agc_add_draw_pipeline_test(agc_driver_draw_cache_relocation) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_draw_cache_reuse_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_draw_cache_reuse_tests.cmake new file mode 100644 index 0000000000..835d1aa0cf --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_draw_cache_reuse_tests.cmake @@ -0,0 +1,28 @@ +if(BUILD_TESTING) + agc_add_draw_pipeline_test(agc_driver_draw_cache_reuse) + agc_add_draw_pipeline_test(agc_driver_draw_data_hit_user_words) + add_test(NAME agc_driver_draw_cache_reuse_off COMMAND agc_driver_draw_cache_reuse_tests) + set_tests_properties(agc_driver_draw_cache_reuse_off PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_GPL=1" SKIP_RETURN_CODE 77) + add_test(NAME agc_driver_draw_cache_reuse_verify COMMAND agc_driver_draw_cache_reuse_tests) + set_tests_properties(agc_driver_draw_cache_reuse_verify PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_VERIFY_DRAW_DATA_HITS=1" SKIP_RETURN_CODE 77) + add_test(NAME agc_driver_draw_cache_reuse_entry_verify COMMAND agc_driver_draw_cache_reuse_tests) + set_tests_properties(agc_driver_draw_cache_reuse_entry_verify PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_VERIFY_DRAW_ENTRIES=1" SKIP_RETURN_CODE 77 FAIL_REGULAR_EXPRESSION "FATAL:") + if(WIN32) + set_tests_properties(agc_driver_draw_cache_reuse_entry_verify PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_driver_draw_cache_reuse_inline COMMAND agc_driver_draw_cache_reuse_tests) + set_tests_properties(agc_driver_draw_cache_reuse_inline PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_PIPELINED_DRAWS=0;APS5_VERIFY_DRAW_RECIPE=1;APS5_VERIFY_REGISTER_KEYS=1" SKIP_RETURN_CODE 77) + add_test(NAME agc_driver_draw_cache_reuse_indirect COMMAND agc_driver_draw_cache_reuse_tests) + set_tests_properties(agc_driver_draw_cache_reuse_indirect PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_DRAW_CACHE_INDIRECT=1;APS5_PROFILE_DRAW=1" SKIP_RETURN_CODE 77) + set_tests_properties(agc_driver_draw_cache_reuse agc_driver_draw_cache_reuse_off agc_driver_draw_cache_reuse_verify agc_driver_draw_cache_reuse_inline agc_driver_draw_cache_reuse_indirect PROPERTIES FAIL_REGULAR_EXPRESSION "FATAL:") + set_property(TEST agc_driver_draw_cache_reuse agc_driver_draw_cache_reuse_off APPEND PROPERTY ENVIRONMENT "APS5_VERIFY_DRAW_RECIPE=1" "APS5_VERIFY_REGISTER_KEYS=1") + add_test(NAME agc_driver_draw_data_hit_user_words_verify COMMAND agc_driver_draw_data_hit_user_words_tests) + set_tests_properties(agc_driver_draw_data_hit_user_words_verify PROPERTIES ENVIRONMENT "APS5_VERIFY_DRAW_DATA_HITS=1" SKIP_RETURN_CODE 77) + add_test(NAME agc_driver_draw_data_hit_user_words_refresh COMMAND agc_driver_draw_data_hit_user_words_tests) + set_tests_properties(agc_driver_draw_data_hit_user_words_refresh PROPERTIES ENVIRONMENT "APS5_DRAW_PIPELINE=1" SKIP_RETURN_CODE 77) + if(WIN32) + set_tests_properties(agc_driver_draw_cache_reuse_off agc_driver_draw_cache_reuse_verify agc_driver_draw_cache_reuse_inline agc_driver_draw_cache_reuse_indirect agc_driver_draw_data_hit_user_words_verify agc_driver_draw_data_hit_user_words_refresh PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_draw_program_trace_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_draw_program_trace_tests.cmake new file mode 100644 index 0000000000..ab17f264f2 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_draw_program_trace_tests.cmake @@ -0,0 +1,19 @@ +if(BUILD_TESTING) + add_test_executable(agc_driver_draw_program_trace_tests + tests/DrawProgramTrace.cpp + Execution/src/Driver/Draw/DrawProgramTrace.cpp + ) + target_include_directories(agc_driver_draw_program_trace_tests PRIVATE + ${LIBS_INCLUDE_DIR} + ${CMAKE_SOURCE_DIR}/core/shader/recompiler + ) + set_target_properties(agc_driver_draw_program_trace_tests PROPERTIES CXX_EXTENSIONS OFF) + configure_windows_unwind(agc_driver_draw_program_trace_tests) + add_test(NAME agc_driver_draw_program_trace COMMAND agc_driver_draw_program_trace_tests) + set_tests_properties(agc_driver_draw_program_trace PROPERTIES TIMEOUT 20) + if(MINGW) + target_link_libraries(agc_driver_draw_program_trace_tests PRIVATE libc) + set_tests_properties(agc_driver_draw_program_trace PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_draw_shader_failure_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_draw_shader_failure_tests.cmake new file mode 100644 index 0000000000..49eaf3a0e9 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_draw_shader_failure_tests.cmake @@ -0,0 +1,24 @@ +if(BUILD_TESTING) + set(agcDrawShaderFailureTraceDirectory ${CMAKE_CURRENT_BINARY_DIR}/draw_shader_failure_tests) + file(MAKE_DIRECTORY "${agcDrawShaderFailureTraceDirectory}/failure") + file(MAKE_DIRECTORY "${agcDrawShaderFailureTraceDirectory}/success") + file(MAKE_DIRECTORY "${agcDrawShaderFailureTraceDirectory}/disabled") + file(MAKE_DIRECTORY "${agcDrawShaderFailureTraceDirectory}/failure_correlation_disabled") + set_tests_properties(agc_driver_draw_shader_failure PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_CAPTURE_TRACE=1;APS5_TRACE_SHADER_CORRELATION=1;APS5_CAPTURE_TRACE_PATH=${agcDrawShaderFailureTraceDirectory}/failure/trace.log" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + add_test(NAME agc_driver_draw_shader_failure_successful COMMAND agc_driver_draw_shader_failure_tests successful-draw) + set_tests_properties(agc_driver_draw_shader_failure_successful PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_CAPTURE_TRACE=1;APS5_TRACE_SHADER_CORRELATION=1;APS5_CAPTURE_TRACE_PATH=${agcDrawShaderFailureTraceDirectory}/success/trace.log" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + add_test(NAME agc_driver_draw_shader_failure_correlation_disabled COMMAND agc_driver_draw_shader_failure_tests disabled-correlation) + set_tests_properties(agc_driver_draw_shader_failure_correlation_disabled PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_CAPTURE_TRACE=1;APS5_CAPTURE_TRACE_PATH=${agcDrawShaderFailureTraceDirectory}/disabled/trace.log" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + add_test(NAME agc_driver_draw_shader_failure_request_correlation_disabled COMMAND agc_driver_draw_shader_failure_tests request-failure-correlation-disabled) + set_tests_properties(agc_driver_draw_shader_failure_request_correlation_disabled PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_CAPTURE_TRACE=1;APS5_CAPTURE_TRACE_PATH=${agcDrawShaderFailureTraceDirectory}/failure_correlation_disabled/trace.log" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + file(MAKE_DIRECTORY "${agcDrawShaderFailureTraceDirectory}/materialization") + file(MAKE_DIRECTORY "${agcDrawShaderFailureTraceDirectory}/materialization_correlation_disabled") + add_test(NAME agc_driver_draw_shader_failure_materialization COMMAND agc_driver_draw_shader_failure_tests materialization-failure) + set_tests_properties(agc_driver_draw_shader_failure_materialization PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_CAPTURE_TRACE=1;APS5_TRACE_SHADER_CORRELATION=1;APS5_CAPTURE_TRACE_PATH=${agcDrawShaderFailureTraceDirectory}/materialization/trace.log" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + add_test(NAME agc_driver_draw_shader_failure_materialization_correlation_disabled COMMAND agc_driver_draw_shader_failure_tests materialization-failure-correlation-disabled) + set_tests_properties(agc_driver_draw_shader_failure_materialization_correlation_disabled PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_CAPTURE_TRACE=1;APS5_CAPTURE_TRACE_PATH=${agcDrawShaderFailureTraceDirectory}/materialization_correlation_disabled/trace.log" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_driver_draw_shader_failure agc_driver_draw_shader_failure_successful agc_driver_draw_shader_failure_correlation_disabled agc_driver_draw_shader_failure_request_correlation_disabled agc_driver_draw_shader_failure_materialization agc_driver_draw_shader_failure_materialization_correlation_disabled PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_draw_unsupported_buffer_type_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_draw_unsupported_buffer_type_tests.cmake new file mode 100644 index 0000000000..807d44f0c0 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_draw_unsupported_buffer_type_tests.cmake @@ -0,0 +1,10 @@ +if(BUILD_TESTING) + add_test(NAME agc_driver_draw_unsupported_buffer_type_skip_refused COMMAND agc_driver_draw_unsupported_buffer_type_tests --skip-refused) + set_tests_properties(agc_driver_draw_unsupported_buffer_type_skip_refused PROPERTIES + ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_SKIP_REFUSED_DRAWS=1" SKIP_RETURN_CODE 77 TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_driver_draw_unsupported_buffer_type_skip_refused PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + agc_add_draw_pipeline_test(agc_driver_draw_unsupported_buffer_type) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_draw_write_ranges_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_draw_write_ranges_tests.cmake new file mode 100644 index 0000000000..230d88b166 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_draw_write_ranges_tests.cmake @@ -0,0 +1,3 @@ +if(BUILD_TESTING) + agc_add_draw_pipeline_test(agc_driver_draw_write_ranges) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_dual_source_blend_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_dual_source_blend_tests.cmake new file mode 100644 index 0000000000..0fef20d161 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_dual_source_blend_tests.cmake @@ -0,0 +1 @@ +target_include_directories(agc_driver_dual_source_blend_tests PRIVATE $) diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_dword_pattern_fill_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_dword_pattern_fill_tests.cmake new file mode 100644 index 0000000000..6d2bf390e2 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_dword_pattern_fill_tests.cmake @@ -0,0 +1,8 @@ +if(BUILD_TESTING) + add_test(NAME agc_driver_dword_pattern_fill_translated COMMAND agc_driver_dword_pattern_fill_tests) + set_tests_properties(agc_driver_dword_pattern_fill_translated PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_FILL_HLE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_driver_dword_pattern_fill_translated PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_emulated_color_compare_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_emulated_color_compare_tests.cmake new file mode 100644 index 0000000000..815cab6386 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_emulated_color_compare_tests.cmake @@ -0,0 +1,11 @@ +if(BUILD_TESTING) + add_test(NAME agc_driver_emulated_color_compare_srgb_decode COMMAND agc_driver_emulated_color_compare_tests) + set_tests_properties(agc_driver_emulated_color_compare_srgb_decode PROPERTIES + ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_SRGB_SHADER_DECODE=1" + SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + set_tests_properties(agc_driver_emulated_color_compare agc_driver_emulated_color_compare_srgb_decode PROPERTIES TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_driver_emulated_color_compare_srgb_decode PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_eqaa_color_target_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_eqaa_color_target_tests.cmake new file mode 100644 index 0000000000..aa5fdba93e --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_eqaa_color_target_tests.cmake @@ -0,0 +1 @@ +target_include_directories(agc_driver_eqaa_color_target_tests PRIVATE $) diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_f16_to_f32_unpack_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_f16_to_f32_unpack_tests.cmake new file mode 100644 index 0000000000..4a900f9843 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_f16_to_f32_unpack_tests.cmake @@ -0,0 +1,7 @@ +if(BUILD_TESTING) + add_test(NAME agc_driver_f16_to_f32_unpack_spirv COMMAND agc_driver_f16_to_f32_unpack_tests --verify-spirv) + set_tests_properties(agc_driver_f16_to_f32_unpack_spirv PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_driver_f16_to_f32_unpack_spirv PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_f64_fma_subnormals_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_f64_fma_subnormals_tests.cmake new file mode 100644 index 0000000000..d5faddfad0 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_f64_fma_subnormals_tests.cmake @@ -0,0 +1,7 @@ +if(BUILD_TESTING) + add_test(NAME agc_driver_f64_denorm_preserve_spirv COMMAND agc_driver_f64_fma_subnormals_tests --verify-spv-denorm-mode) + set_tests_properties(agc_driver_f64_denorm_preserve_spirv PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_driver_f64_denorm_preserve_spirv PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_failed_capture_dump_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_failed_capture_dump_tests.cmake new file mode 100644 index 0000000000..bcb2684592 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_failed_capture_dump_tests.cmake @@ -0,0 +1 @@ +target_include_directories(agc_driver_failed_capture_dump_tests PRIVATE $) diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_finisher_label_order_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_finisher_label_order_tests.cmake new file mode 100644 index 0000000000..889a5ae09c --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_finisher_label_order_tests.cmake @@ -0,0 +1,3 @@ +if(BUILD_TESTING) + agc_add_draw_pipeline_test(agc_driver_finisher_label_order) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_flat_apertures_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_flat_apertures_tests.cmake new file mode 100644 index 0000000000..29af95cfa5 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_flat_apertures_tests.cmake @@ -0,0 +1,11 @@ +if(BUILD_TESTING) + set_target_properties(agc_driver_flat_apertures_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + foreach(flatAperturesPart RANGE 13) + add_test(NAME agc_driver_flat_apertures_${flatAperturesPart} COMMAND agc_driver_flat_apertures_tests --part ${flatAperturesPart}/14) + set_tests_properties(agc_driver_flat_apertures_${flatAperturesPart} PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_driver_flat_apertures_${flatAperturesPart} PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + endforeach() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_flat_store_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_flat_store_tests.cmake new file mode 100644 index 0000000000..b4a9dd3450 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_flat_store_tests.cmake @@ -0,0 +1,3 @@ +if(BUILD_TESTING) + set_tests_properties(agc_driver_flat_store PROPERTIES RUN_SERIAL TRUE) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_flip_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_flip_tests.cmake new file mode 100644 index 0000000000..2db7da6d90 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_flip_tests.cmake @@ -0,0 +1,29 @@ +add_test_executable(agc_driver_flip_tests EXCLUDE_FROM_ALL + tests/Flip.cpp +) + +target_include_directories(agc_driver_flip_tests PRIVATE + ${LIBS_INCLUDE_DIR} + ${CMAKE_SOURCE_DIR}/3rdparty/Vulkan-Headers/include +) + +target_link_libraries(agc_driver_flip_tests PRIVATE + libSceAgcDriver + libc +) + +set_target_properties(agc_driver_flip_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_driver_flip_tests) + +if(BUILD_TESTING) + agc_add_default_test(agc_driver_flip_tests) + add_test(NAME agc_driver_present_mode COMMAND agc_driver_flip_tests present-mode) + add_test(NAME agc_driver_worker_failure_log COMMAND agc_driver_flip_tests failure-log) + set_tests_properties(agc_driver_worker_failure_log PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 TIMEOUT 20) + add_test(NAME agc_driver_flip_compute COMMAND agc_driver_flip_tests compute) + set_tests_properties(agc_driver_flip_compute PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77) + if(WIN32) + set_tests_properties(agc_driver_flip_compute agc_driver_present_mode agc_driver_worker_failure_log PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_frame_capture_eop_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_frame_capture_eop_tests.cmake new file mode 100644 index 0000000000..569c559b25 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_frame_capture_eop_tests.cmake @@ -0,0 +1,17 @@ +if(BUILD_TESTING) + if(WIN32 OR CMAKE_SYSTEM_NAME STREQUAL "Linux") + add_test_executable(agc_driver_frame_capture_eop_tests tests/FrameCaptureEop.cpp Execution/src/FrameCapture.cpp) + target_include_directories(agc_driver_frame_capture_eop_tests PRIVATE ${LIBS_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/core/shader/recompiler ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR} ${ANYPS5_SPIRV_HEADERS_INCLUDE_DIR}) + target_link_libraries(agc_driver_frame_capture_eop_tests PRIVATE libSceAgcDriver libkernel libc libzstd_static) + set_target_properties(agc_driver_frame_capture_eop_tests PROPERTIES CXX_EXTENSIONS OFF) + configure_windows_unwind(agc_driver_frame_capture_eop_tests) + add_test(NAME agc_driver_frame_capture_eop COMMAND agc_driver_frame_capture_eop_tests) + set_tests_properties(agc_driver_frame_capture_eop PROPERTIES + ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_FRAME_CAPTURE=${CMAKE_CURRENT_BINARY_DIR}/frame-capture-eop;APS5_FRAME_CAPTURE_AT_FLIP=1;APS5_FRAME_CAPTURE_FRAMES=3;APS5_FRAME_CAPTURE_MIN_FREE_BYTES=0" + TIMEOUT 120) + if(WIN32) + set_tests_properties(agc_driver_frame_capture_eop PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_frame_replay_state_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_frame_replay_state_tests.cmake new file mode 100644 index 0000000000..11e868084c --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_frame_replay_state_tests.cmake @@ -0,0 +1,34 @@ +if(BUILD_TESTING) + add_test_executable(agc_driver_frame_replay_state_tests tests/FrameReplayState.cpp Execution/src/FrameCapture.cpp) + target_include_directories(agc_driver_frame_replay_state_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(agc_driver_frame_replay_state_tests PRIVATE libSceAgcDriver libkernel libc libzstd_static) + set_target_properties(agc_driver_frame_replay_state_tests PROPERTIES CXX_EXTENSIONS OFF) + configure_windows_unwind(agc_driver_frame_replay_state_tests) + set(agcFrameReplayModes order tokens blocking) + if(WIN32 OR CMAKE_SYSTEM_NAME STREQUAL "Linux") + list(APPEND agcFrameReplayModes zero shader shader_host) + endif() + if(WIN32 OR CMAKE_SYSTEM_NAME STREQUAL "Linux") + list(APPEND agcFrameReplayModes unwatched) + endif() + if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + list(APPEND agcFrameReplayModes shared_page host_neighbors) + endif() + foreach(mode IN LISTS agcFrameReplayModes) + set(capture "${CMAKE_CURRENT_BINARY_DIR}/frame-replay-${mode}") + add_test(NAME agc_driver_frame_replay_${mode} COMMAND agc_driver_frame_replay_state_tests ${mode} "${capture}") + set_tests_properties(agc_driver_frame_replay_${mode} PROPERTIES TIMEOUT 30) + if(mode MATCHES "^shader") + set_tests_properties(agc_driver_frame_replay_${mode} PROPERTIES ENVIRONMENT + "APS5_FRAME_CAPTURE=${capture};APS5_FRAME_CAPTURE_AT_FLIP=1;APS5_FRAME_CAPTURE_FRAMES=1;APS5_FRAME_CAPTURE_MIN_FREE_BYTES=0") + endif() + if(mode STREQUAL "unwatched") + set_tests_properties(agc_driver_frame_replay_${mode} PROPERTIES ENVIRONMENT + "APS5_NO_WRITE_WATCH=1;APS5_FRAME_CAPTURE=${capture};APS5_FRAME_CAPTURE_AT_FLIP=1;APS5_FRAME_CAPTURE_FRAMES=1;APS5_FRAME_CAPTURE_MIN_FREE_BYTES=0") + endif() + if(WIN32) + set_tests_properties(agc_driver_frame_replay_${mode} PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + endforeach() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_frame_replay_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_frame_replay_tests.cmake new file mode 100644 index 0000000000..10989ffcdc --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_frame_replay_tests.cmake @@ -0,0 +1,26 @@ +if(BUILD_TESTING) + if(WIN32 OR CMAKE_SYSTEM_NAME STREQUAL "Linux") + add_test_executable(agc_driver_frame_replay_tests tests/FrameReplay.cpp Execution/src/FrameCapture.cpp) + target_include_directories(agc_driver_frame_replay_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(agc_driver_frame_replay_tests PRIVATE libSceAgc libSceAgcDriver libkernel libc libzstd_static) + set_target_properties(agc_driver_frame_replay_tests PROPERTIES CXX_EXTENSIONS OFF) + configure_windows_unwind(agc_driver_frame_replay_tests) + add_dependencies(agc_driver_frame_replay_tests agc_frame_replay) + add_test(NAME agc_driver_frame_replay COMMAND agc_driver_frame_replay_tests $) + set_tests_properties(agc_driver_frame_replay PROPERTIES + ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_FRAME_CAPTURE=${CMAKE_CURRENT_BINARY_DIR}/frame-replay-capture;APS5_FRAME_CAPTURE_AT_FLIP=1;APS5_FRAME_CAPTURE_FRAMES=2;APS5_FRAME_CAPTURE_MIN_FREE_BYTES=0" + TIMEOUT 120) + if(WIN32) + set_tests_properties(agc_driver_frame_replay PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_driver_frame_replay_concurrent COMMAND agc_driver_frame_replay_tests $ concurrent) + set_tests_properties(agc_driver_frame_replay_concurrent PROPERTIES + ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_FRAME_CAPTURE=${CMAKE_CURRENT_BINARY_DIR}/frame-replay-concurrent-capture;APS5_FRAME_CAPTURE_AT_FLIP=1;APS5_FRAME_CAPTURE_FRAMES=8;APS5_FRAME_CAPTURE_MIN_FREE_BYTES=0" + TIMEOUT 120) + if(WIN32) + set_tests_properties(agc_driver_frame_replay_concurrent PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_gated_dispatch_capture_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_gated_dispatch_capture_tests.cmake new file mode 100644 index 0000000000..d933f3070d --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_gated_dispatch_capture_tests.cmake @@ -0,0 +1,11 @@ +if(BUILD_TESTING) + agc_add_draw_pipeline_test(agc_driver_gated_dispatch_capture) + add_test(NAME agc_driver_gated_dispatch_capture_short_timeout COMMAND agc_driver_gated_dispatch_capture_tests) + set_tests_properties(agc_driver_gated_dispatch_capture_short_timeout PROPERTIES + ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_GPU_WAIT_TIMEOUT_MS=1;APS5_NO_PIPELINE_LTO=1" + SKIP_RETURN_CODE 77 TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_driver_gated_dispatch_capture_short_timeout PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_gcn_buffer_format_lookup_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_gcn_buffer_format_lookup_tests.cmake new file mode 100644 index 0000000000..6fa9fc23d1 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_gcn_buffer_format_lookup_tests.cmake @@ -0,0 +1 @@ +target_include_directories(agc_driver_gcn_buffer_format_lookup_tests PRIVATE $) diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_gpu_map_on_fiber_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_gpu_map_on_fiber_tests.cmake new file mode 100644 index 0000000000..eef2320e6e --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_gpu_map_on_fiber_tests.cmake @@ -0,0 +1 @@ +target_link_libraries(agc_driver_gpu_map_on_fiber_tests PRIVATE libSceFiber) diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_graphics_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_graphics_tests.cmake new file mode 100644 index 0000000000..91e40b7923 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_graphics_tests.cmake @@ -0,0 +1,210 @@ +add_test_executable(agc_driver_pm4_tests EXCLUDE_FROM_ALL + tests/Pm4.cpp +) + +target_include_directories(agc_driver_pm4_tests PRIVATE + ${LIBS_INCLUDE_DIR} +) + +target_link_libraries(agc_driver_pm4_tests PRIVATE + libSceAgcDriver + shader_recompiler_agc_driver + libc + libkernel +) + +set_target_properties(agc_driver_pm4_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_driver_pm4_tests) + +add_test_executable(agc_driver_graphics_tests EXCLUDE_FROM_ALL + tests/Graphics.cpp + tests/ColorTargetLayout.cpp + tests/BdaResources.cpp + tests/GuestAllocations.cpp + tests/LiveStack.cpp + tests/TextureFormat.cpp + tests/TextureTiling.cpp + tests/GuestTextureResource.cpp + tests/GuestSamplerResource.cpp + tests/TextureDetiler.cpp + tests/DepthSurfaceReuse.cpp + tests/LastRecordIndices.cpp +) + +target_include_directories(agc_driver_graphics_tests PRIVATE + ${LIBS_INCLUDE_DIR} + $ + ${agcTextureDetileGeneratedRoot} + ${CMAKE_SOURCE_DIR}/core/shader/recompiler + ${CMAKE_SOURCE_DIR}/core/shader/recompiler/IntermediateRepresentation/include + ${CMAKE_SOURCE_DIR}/core/shader/recompiler/ControlFlow/include + ${CMAKE_SOURCE_DIR}/core/shader/recompiler/RdnaDecoder/include + ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR} + ${ANYPS5_SPIRV_HEADERS_INCLUDE_DIR} +) + +target_link_libraries(agc_driver_graphics_tests PRIVATE + libSceAgcDriver + libc + libkernel +) + +if(BUILD_TESTING) + add_test(NAME agc_command_batch_fence_failure COMMAND agc_driver_graphics_tests --command-batch-fence-failure) + set_tests_properties(agc_command_batch_fence_failure PROPERTIES TIMEOUT 20) + if(WIN32) + set_tests_properties(agc_command_batch_fence_failure PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() + +set_target_properties(agc_driver_graphics_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_driver_graphics_tests) + +if(BUILD_TESTING) + add_test(NAME agc_driver_undithered_alpha_to_coverage_state COMMAND agc_driver_graphics_tests --undithered-alpha-to-coverage-state) + add_test(NAME agc_driver_depth_bounds_state COMMAND agc_driver_graphics_tests --depth-bounds-state) + add_test(NAME agc_driver_msaa_dcc_state COMMAND agc_driver_graphics_tests --multisample-dcc-state) + add_test(NAME agc_driver_unused_viewport_depth COMMAND agc_driver_graphics_tests --unused-viewport-depth) + set_tests_properties(agc_driver_unused_viewport_depth PROPERTIES TIMEOUT 30) + set_tests_properties(agc_driver_undithered_alpha_to_coverage_state agc_driver_depth_bounds_state PROPERTIES + ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + add_test(NAME agc_driver_alpha_to_coverage_state COMMAND agc_driver_graphics_tests --alpha-to-coverage-state) + set_tests_properties(agc_driver_alpha_to_coverage_state PROPERTIES + ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_driver_alpha_to_coverage_state agc_driver_undithered_alpha_to_coverage_state agc_driver_depth_bounds_state agc_driver_msaa_dcc_state agc_driver_unused_viewport_depth PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() + +if(BUILD_TESTING) + agc_add_default_test(agc_driver_pm4_tests) + agc_add_default_test(agc_driver_graphics_tests) + add_test(NAME agc_sparse_buffer_holes COMMAND agc_driver_graphics_tests --sparse-buffer-holes) + add_test(NAME agc_copy_input_kept_bytes COMMAND agc_driver_graphics_tests --copy-input-kept-bytes) + add_test(NAME agc_depth_copy_kept_bytes COMMAND agc_driver_graphics_tests --depth-copy-kept-bytes) + set_tests_properties(agc_copy_input_kept_bytes agc_depth_copy_kept_bytes PROPERTIES + TIMEOUT 30 ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" + ENVIRONMENT_MODIFICATION "APS5_CPU_COPIES=unset:;APS5_GPU_COPY_MAX_KIB=unset:;APS5_CAPTURE_GPU_COPIES=unset:;APS5_BUFFER_POOL_SLOTS=unset:;APS5_BUFFER_POOL_SHARED=unset:;APS5_NO_BUFFER_CLASSES=unset:;APS5_STAGING_POOL_MIB=unset:") + if(WIN32) + set_property(TEST agc_copy_input_kept_bytes APPEND PROPERTY ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + set_property(TEST agc_depth_copy_kept_bytes APPEND PROPERTY ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + set_tests_properties(agc_sparse_buffer_holes PROPERTIES TIMEOUT 30) + add_test(NAME agc_pipeline_journal COMMAND agc_driver_graphics_tests --pipeline-journal) + add_test(NAME agc_pipeline_journal_long_paths COMMAND agc_driver_graphics_tests --pipeline-journal-long-paths) + set_tests_properties(agc_pipeline_journal_long_paths PROPERTIES TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + add_test(NAME agc_pipeline_library_clear_waits_for_build COMMAND agc_driver_graphics_tests --pipeline-library-clear-waits-for-build) + add_test(NAME agc_pipeline_store_lazy_buffer_pool COMMAND agc_driver_graphics_tests --pipeline-store-lazy-buffer-pool) + add_test(NAME agc_pipeline_store_touch COMMAND agc_driver_graphics_tests --pipeline-store-touch) + add_test(NAME agc_pipeline_store_growth COMMAND agc_driver_graphics_tests --pipeline-store-growth) + add_test(NAME agc_pipeline_store_fixed_bound COMMAND agc_driver_graphics_tests --pipeline-store-growth) + add_test(NAME agc_pipeline_store_replay_growth COMMAND agc_driver_graphics_tests --pipeline-store-replay-growth) + set_tests_properties(agc_pipeline_store_growth agc_pipeline_store_fixed_bound agc_pipeline_store_replay_growth PROPERTIES TIMEOUT 60 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + set_tests_properties(agc_pipeline_store_fixed_bound PROPERTIES ENVIRONMENT "APS5_PIPELINE_STORE_ENTRIES=1024") + set_tests_properties(agc_pipeline_journal PROPERTIES TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + set_tests_properties(agc_pipeline_library_clear_waits_for_build PROPERTIES TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + set_tests_properties(agc_pipeline_store_lazy_buffer_pool agc_pipeline_store_touch PROPERTIES TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + add_test(NAME agc_pipeline_journal_extended_paths COMMAND agc_driver_graphics_tests --pipeline-journal-extended-paths) + set_tests_properties(agc_pipeline_journal_extended_paths PROPERTIES TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + set_tests_properties(agc_pipeline_journal_long_paths agc_pipeline_journal_extended_paths PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + set_tests_properties(agc_pipeline_journal agc_pipeline_library_clear_waits_for_build agc_pipeline_store_lazy_buffer_pool agc_pipeline_store_touch agc_pipeline_store_growth agc_pipeline_store_fixed_bound agc_pipeline_store_replay_growth PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() + if(WIN32) + set_tests_properties(agc_sparse_buffer_holes PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_heap_mirror_unwatch COMMAND agc_driver_graphics_tests --heap-mirror-unwatch) + add_test(NAME agc_heap_mirror_unwatch_no_space_cache COMMAND agc_driver_graphics_tests --heap-mirror-unwatch) + add_test(NAME agc_sparse_heap_mirror_unwatch COMMAND agc_driver_graphics_tests --sparse-heap-mirror-unwatch) + add_test(NAME agc_sparse_heap_mirror_unwatch_no_space_cache COMMAND agc_driver_graphics_tests --sparse-heap-mirror-unwatch) + add_test(NAME agc_sparse_heap_mirror_budget COMMAND agc_driver_graphics_tests --sparse-heap-mirror-budget) + add_test(NAME agc_heap_mirror_run_unwatch COMMAND agc_driver_graphics_tests --heap-mirror-run-unwatch) + add_test(NAME agc_heap_mirror_run_unwatch_no_space_cache COMMAND agc_driver_graphics_tests --heap-mirror-run-unwatch) + set_tests_properties(agc_heap_mirror_unwatch_no_space_cache agc_sparse_heap_mirror_unwatch_no_space_cache agc_heap_mirror_run_unwatch_no_space_cache PROPERTIES ENVIRONMENT "APS5_NO_ADDRESS_SPACE_CACHE=1") + set_tests_properties(agc_heap_mirror_unwatch agc_heap_mirror_unwatch_no_space_cache agc_sparse_heap_mirror_unwatch agc_sparse_heap_mirror_unwatch_no_space_cache agc_heap_mirror_run_unwatch agc_heap_mirror_run_unwatch_no_space_cache agc_sparse_heap_mirror_budget PROPERTIES TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_heap_mirror_unwatch agc_heap_mirror_unwatch_no_space_cache agc_sparse_heap_mirror_unwatch agc_sparse_heap_mirror_unwatch_no_space_cache agc_heap_mirror_run_unwatch agc_heap_mirror_run_unwatch_no_space_cache agc_sparse_heap_mirror_budget PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + else() + add_test(NAME agc_heap_mirror_unwatched_import COMMAND agc_driver_graphics_tests --heap-mirror-unwatched-import) + set_tests_properties(agc_heap_mirror_unwatched_import PROPERTIES TIMEOUT 30) + endif() + + add_test(NAME agc_address_copy_cap COMMAND agc_driver_graphics_tests --address-copy-cap) + add_test(NAME agc_address_copy_cap_remembered COMMAND agc_driver_graphics_tests --address-copy-cap-remembered) + add_test(NAME agc_address_copy_cap_mirror COMMAND agc_driver_graphics_tests --address-copy-cap-mirror) + add_test(NAME agc_address_space_unwatched_mirror_import COMMAND agc_driver_graphics_tests --unwatched-mirror-import) + set_tests_properties(agc_address_copy_cap agc_address_copy_cap_remembered agc_address_copy_cap_mirror agc_address_space_unwatched_mirror_import PROPERTIES TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_address_copy_cap agc_address_copy_cap_remembered agc_address_copy_cap_mirror agc_address_space_unwatched_mirror_import PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() + if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + add_test(NAME agc_driver_graphics_maps_fallback COMMAND agc_driver_graphics_tests) + set_tests_properties(agc_driver_graphics_maps_fallback PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_PROCMAP_QUERY=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + endif() + add_test(NAME agc_driver_pm4_failure COMMAND agc_driver_pm4_tests failure) + set_tests_properties(agc_driver_pm4_failure PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 TIMEOUT 30) + set(pm4RingCases "ring|APS5_PM4_RING=4" "ring-empty|APS5_PM4_RING=16" "ring-disabled|APS5_PM4_RING=0" "ring-invalid|APS5_PM4_RING=4x" "ring-report|APS5_PM4_RING=2" "stall-watchdog|APS5_STALL_WATCHDOG_SECS=1" + "stall-watchdog-invalid|APS5_STALL_WATCHDOG_SECS=1x" "stall-watchdog-rewind|APS5_STALL_WATCHDOG_SECS=1" "stall-watchdog-order|APS5_STALL_WATCHDOG_SECS=1") + if(WIN32) + list(APPEND pm4RingCases "ring-report-heap|APS5_PM4_RING=2") + endif() + foreach(pm4RingCase IN LISTS pm4RingCases) + string(REPLACE "|" ";" pm4RingCase "${pm4RingCase}") + list(GET pm4RingCase 0 pm4RingMode) + list(GET pm4RingCase 1 pm4RingEnvironment) + string(REPLACE "-" "_" pm4RingTest "agc_driver_pm4_${pm4RingMode}") + add_test(NAME ${pm4RingTest} COMMAND agc_driver_pm4_tests ${pm4RingMode}) + set_tests_properties(${pm4RingTest} PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;${pm4RingEnvironment}" SKIP_RETURN_CODE 77 TIMEOUT 30) + if(WIN32) + set_tests_properties(${pm4RingTest} PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + endforeach() + add_test(NAME agc_descriptor_pool_reset_failure COMMAND agc_driver_graphics_tests --descriptor-pool-reset-failure) + add_test(NAME agc_descriptor_cache COMMAND agc_driver_graphics_tests --descriptor-cache) + add_test(NAME agc_driver_address_space_teardown COMMAND agc_driver_graphics_tests --address-space-teardown) + set_tests_properties(agc_driver_address_space_teardown PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + add_test(NAME agc_driver_pm4_rewind_trace COMMAND agc_driver_pm4_tests rewind-trace) + set_tests_properties(agc_driver_pm4_rewind_trace PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_PIPELINED_DRAWS=8;APS5_TRACE_FRAMES=0:1;APS5_TRACE_DIR=${CMAKE_CURRENT_BINARY_DIR}/pm4-rewind-trace" TIMEOUT 30) + set_property(TEST agc_driver_pm4_rewind_trace APPEND PROPERTY ENVIRONMENT_MODIFICATION + "APS5_TRACE_SECONDS=unset:" "APS5_TRACE_SUMMARY_EVERY=unset:") + if(WIN32) + set_property(TEST agc_driver_pm4_rewind_trace APPEND PROPERTY ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_driver_pm4_failure_inline COMMAND agc_driver_pm4_tests failure) + set_tests_properties(agc_driver_pm4_failure_inline PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_PIPELINED_DRAWS=0" SKIP_RETURN_CODE 77) + if(WIN32) + set_tests_properties(agc_driver_pm4_failure agc_driver_pm4_failure_inline agc_descriptor_pool_reset_failure agc_descriptor_cache agc_driver_address_space_teardown PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + add_test(NAME agc_driver_pm4_priority_refused COMMAND agc_driver_pm4_tests priority-refused) + set_tests_properties(agc_driver_pm4_priority_refused PROPERTIES ENVIRONMENT + "ANYPS5_NO_SHADER_CACHE=1;APS5_THREAD_PRIORITY=high;DBUS_SYSTEM_BUS_ADDRESS=unix:path=/nonexistent/aps5-no-rtkit" SKIP_RETURN_CODE 77) + endif() +endif() + +if(BUILD_TESTING) + add_test(NAME agc_compute_descriptor_layout_flags COMMAND agc_driver_graphics_tests --descriptor-layout-flags) + set_tests_properties(agc_compute_descriptor_layout_flags PROPERTIES TIMEOUT 30) + add_test(NAME agc_driver_covered_centroid_state COMMAND agc_driver_graphics_tests --covered-centroid-state) + set_tests_properties(agc_driver_covered_centroid_state PROPERTIES TIMEOUT 30) + add_test(NAME agc_driver_sample_location_grid_fallback COMMAND agc_driver_graphics_tests --sample-location-grid-fallback) + set_tests_properties(agc_driver_sample_location_grid_fallback PROPERTIES TIMEOUT 30) + add_test(NAME agc_driver_unobserved_provoking_vertex COMMAND agc_driver_graphics_tests --unobserved-provoking-vertex) + set_tests_properties(agc_driver_unobserved_provoking_vertex PROPERTIES TIMEOUT 30) + add_test(NAME agc_driver_sample_order_planning COMMAND agc_driver_graphics_tests --sample-order) + set_tests_properties(agc_driver_sample_order_planning PROPERTIES TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_compute_descriptor_layout_flags PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + set_tests_properties(agc_driver_covered_centroid_state PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + set_tests_properties(agc_driver_sample_location_grid_fallback PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + set_tests_properties(agc_driver_unobserved_provoking_vertex PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + set_tests_properties(agc_driver_sample_order_planning PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_guarded_null_pointer_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_guarded_null_pointer_tests.cmake new file mode 100644 index 0000000000..1735c5d327 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_guarded_null_pointer_tests.cmake @@ -0,0 +1,9 @@ +if(BUILD_TESTING) + add_test(NAME agc_driver_guarded_direct_root COMMAND agc_driver_guarded_null_pointer_tests --direct-root-only) + set_tests_properties(agc_driver_guarded_direct_root PROPERTIES + ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_driver_guarded_direct_root PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_guest_memory_lifetime_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_guest_memory_lifetime_tests.cmake new file mode 100644 index 0000000000..9fbe39343a --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_guest_memory_lifetime_tests.cmake @@ -0,0 +1,27 @@ +target_link_libraries(agc_driver_guest_memory_lifetime_tests PRIVATE libkernel) + +if(BUILD_TESTING) + set(agcGuestMemoryLifetimeTests agc_driver_guest_memory_lifetime) + foreach(mode IN ITEMS copy direct locked heap heap_uncached) + set(testName agc_driver_guest_memory_lifetime_${mode}) + if(mode STREQUAL "heap_uncached") + add_test(NAME ${testName} COMMAND agc_driver_guest_memory_lifetime_tests heap) + else() + add_test(NAME ${testName} COMMAND agc_driver_guest_memory_lifetime_tests ${mode}) + endif() + list(APPEND agcGuestMemoryLifetimeTests ${testName}) + endforeach() + if(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" AND Python3_Interpreter_FOUND AND ANYPS5_RELINKER_CLI) + add_test(NAME agc_driver_guest_memory_lifetime_converted COMMAND ${Python3_EXECUTABLE} + ${CMAKE_CURRENT_SOURCE_DIR}/tests/test_guest_memory_lifetime.py + ${CMAKE_SOURCE_DIR}/core/relinker/relinker/tests + $ + $ + $ + $ + $) + set_tests_properties(agc_driver_guest_memory_lifetime_converted PROPERTIES + ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_PIN_WAIT_MS=1000" SKIP_RETURN_CODE 77 TIMEOUT 30) + add_asan_test_options(agc_driver_guest_memory_lifetime_converted verify_asan_link_order=0) + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_host_allocator_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_host_allocator_tests.cmake new file mode 100644 index 0000000000..68d699ce19 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_host_allocator_tests.cmake @@ -0,0 +1,8 @@ +if(BUILD_TESTING AND WIN32) + add_test_executable(agc_driver_host_allocator_tests tests/HostAllocator.cpp Execution/src/HostAllocator.cpp) + target_link_libraries(agc_driver_host_allocator_tests PRIVATE libc) + configure_windows_unwind(agc_driver_host_allocator_tests) + add_test(NAME agc_driver_host_allocator COMMAND agc_driver_host_allocator_tests) + set_tests_properties(agc_driver_host_allocator PROPERTIES TIMEOUT 30 ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_image_converted_unorm_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_image_converted_unorm_tests.cmake new file mode 100644 index 0000000000..fa9a73bb7c --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_image_converted_unorm_tests.cmake @@ -0,0 +1,12 @@ +target_include_directories(agc_driver_image_converted_unorm_tests PRIVATE $) + +if(BUILD_TESTING) + foreach(packedStorageFormat IN ITEMS 133 134 136) + set(packedStorageTest agc_driver_image_packed16_storage_${packedStorageFormat}) + add_test(NAME ${packedStorageTest} COMMAND agc_driver_image_converted_unorm_tests --packed16 ${packedStorageFormat}) + set_tests_properties(${packedStorageTest} PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 30) + if(WIN32) + set_tests_properties(${packedStorageTest} PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() + endforeach() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_image_srgb_sample_copy_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_image_srgb_sample_copy_tests.cmake new file mode 100644 index 0000000000..78e86d9667 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_image_srgb_sample_copy_tests.cmake @@ -0,0 +1,10 @@ +if(BUILD_TESTING) + add_test(NAME agc_driver_image_srgb_sample_copy_forced COMMAND agc_driver_image_srgb_sample_copy_tests) + set_tests_properties(agc_driver_image_srgb_sample_copy_forced PROPERTIES + ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_SRGB_SHADER_DECODE=copy" + SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_driver_image_srgb_sample_copy_forced PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_image_table_reuse_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_image_table_reuse_tests.cmake new file mode 100644 index 0000000000..725d651511 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_image_table_reuse_tests.cmake @@ -0,0 +1,3 @@ +if(BUILD_TESTING) + agc_add_draw_pipeline_test(agc_driver_image_table_reuse) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_image_table_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_image_table_tests.cmake new file mode 100644 index 0000000000..d2b73419c8 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_image_table_tests.cmake @@ -0,0 +1,4 @@ +if(BUILD_TESTING) + set_tests_properties(agc_driver_image_table PROPERTIES TIMEOUT 30 + FAIL_REGULAR_EXPRESSION "SYNC-HAZARD-|VUID-|was not found but was requested by env var VK_INSTANCE_LAYERS") +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_indirect_thread_dimensions_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_indirect_thread_dimensions_tests.cmake new file mode 100644 index 0000000000..e1e265cfd9 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_indirect_thread_dimensions_tests.cmake @@ -0,0 +1,8 @@ +if(BUILD_TESTING) + add_test(NAME agc_driver_indirect_thread_dimensions_cpu COMMAND agc_driver_indirect_thread_dimensions_tests) + set_tests_properties(agc_driver_indirect_thread_dimensions_cpu PROPERTIES ENVIRONMENT "APS5_NO_GPU_THREAD_DIMENSIONS=1" SKIP_RETURN_CODE 77 TIMEOUT 60) + if(WIN32) + set_tests_properties(agc_driver_indirect_thread_dimensions_cpu PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_interpolation_modes_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_interpolation_modes_tests.cmake new file mode 100644 index 0000000000..426c43e5f8 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_interpolation_modes_tests.cmake @@ -0,0 +1 @@ +target_link_libraries(agc_driver_interpolation_modes_tests PRIVATE shader_recompiler_agc_driver) diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_job_manager_compute_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_job_manager_compute_tests.cmake new file mode 100644 index 0000000000..eaa7ba200c --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_job_manager_compute_tests.cmake @@ -0,0 +1,11 @@ +target_link_libraries(agc_driver_job_manager_compute_tests PRIVATE libSceJobManager libSceAgc libkernel) + +if(BUILD_TESTING) + add_test(NAME agc_driver_job_manager_compute_capacity COMMAND agc_driver_job_manager_compute_tests barrier_capacity_overflow) + set_tests_properties(agc_driver_job_manager_compute_capacity PROPERTIES + ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 TIMEOUT 20 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_driver_job_manager_compute_capacity PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_key_miss_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_key_miss_tests.cmake new file mode 100644 index 0000000000..ed41634053 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_key_miss_tests.cmake @@ -0,0 +1,23 @@ +add_test_executable(agc_driver_key_miss_tests EXCLUDE_FROM_ALL tests/KeyMiss.cpp) +target_include_directories(agc_driver_key_miss_tests PRIVATE + ${LIBS_INCLUDE_DIR} + ${CMAKE_SOURCE_DIR}/core/shader/recompiler + ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR} +) +target_link_libraries(agc_driver_key_miss_tests PRIVATE + libSceAgcDriver + libc + libkernel +) +set_target_properties(agc_driver_key_miss_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_driver_key_miss_tests) + +if(BUILD_TESTING) + set_target_properties(agc_driver_key_miss_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_driver_key_miss COMMAND agc_driver_key_miss_tests) + set_tests_properties(agc_driver_key_miss PROPERTIES TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_driver_key_miss PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_layered_volume_draw_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_layered_volume_draw_tests.cmake new file mode 100644 index 0000000000..c21ce2b8f5 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_layered_volume_draw_tests.cmake @@ -0,0 +1,18 @@ +if(BUILD_TESTING) + add_test(NAME agc_driver_layered_volume_vertex COMMAND agc_driver_layered_volume_draw_tests --vertex-only) + add_test(NAME agc_driver_layered_volume_vertex_no_gpl COMMAND agc_driver_layered_volume_draw_tests --vertex-only) + set_tests_properties(agc_driver_layered_volume_vertex agc_driver_layered_volume_vertex_no_gpl PROPERTIES + ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + set_property(TEST agc_driver_layered_volume_vertex_no_gpl APPEND PROPERTY ENVIRONMENT "APS5_NO_GPL=1") + if(WIN32) + set_tests_properties(agc_driver_layered_volume_vertex agc_driver_layered_volume_vertex_no_gpl PROPERTIES + ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_driver_volume_direct_readback COMMAND agc_driver_layered_volume_draw_tests) + set_tests_properties(agc_driver_volume_direct_readback PROPERTIES + ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_TEST_DIRECT_READBACK=1" SKIP_RETURN_CODE 77 TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}") + if(WIN32) + set_tests_properties(agc_driver_volume_direct_readback PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_lazy_resolved_abi_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_lazy_resolved_abi_tests.cmake new file mode 100644 index 0000000000..b261e2d70b --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_lazy_resolved_abi_tests.cmake @@ -0,0 +1,7 @@ +if(BUILD_TESTING) + add_test(NAME agc_driver_lazy_resolved_abi_switch_set COMMAND agc_driver_lazy_resolved_abi_tests) + set_tests_properties(agc_driver_lazy_resolved_abi_switch_set PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_LAZY_SHADER_PREPARE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_driver_lazy_resolved_abi_switch_set PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_lds_mixed_width_atomics_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_lds_mixed_width_atomics_tests.cmake new file mode 100644 index 0000000000..2389f6aac7 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_lds_mixed_width_atomics_tests.cmake @@ -0,0 +1,8 @@ +if(BUILD_TESTING) + add_test(NAME agc_driver_lds_lock_budget COMMAND agc_driver_lds_mixed_width_atomics_tests --lock-budget) + set_tests_properties(agc_driver_lds_lock_budget PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_driver_lds_lock_budget PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_library_prebuild_priority_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_library_prebuild_priority_tests.cmake new file mode 100644 index 0000000000..f59d1d8c41 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_library_prebuild_priority_tests.cmake @@ -0,0 +1,3 @@ +if(BUILD_TESTING) + set_property(TEST agc_driver_library_prebuild_priority APPEND PROPERTY ENVIRONMENT "APS5_PREBUILD_THREADS=2") +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_linear_readback_label_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_linear_readback_label_tests.cmake new file mode 100644 index 0000000000..ef578806d6 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_linear_readback_label_tests.cmake @@ -0,0 +1,8 @@ +if(BUILD_TESTING) + add_test(NAME agc_driver_linear_readback_label_off COMMAND agc_driver_linear_readback_label_tests) + set_tests_properties(agc_driver_linear_readback_label_off PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_LABEL_READBACK_STORE=1" SKIP_RETURN_CODE 77 PASS_REGULAR_EXPRESSION "read after the label" TIMEOUT 60) + if(WIN32) + set_tests_properties(agc_driver_linear_readback_label_off PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_linear_target_completion_points_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_linear_target_completion_points_tests.cmake new file mode 100644 index 0000000000..52c43305f9 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_linear_target_completion_points_tests.cmake @@ -0,0 +1,14 @@ +target_link_libraries(agc_driver_linear_target_completion_points_tests PRIVATE libkernel) + +if(BUILD_TESTING) + add_test(NAME agc_driver_linear_target_completion_points_sync_flip COMMAND agc_driver_linear_target_completion_points_tests --flip) + set_tests_properties(agc_driver_linear_target_completion_points_sync_flip PROPERTIES + ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_SYNC_FLIP=1" SKIP_RETURN_CODE 77 TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + add_test(NAME agc_driver_linear_target_completion_points_unpipelined COMMAND agc_driver_linear_target_completion_points_tests --label --interrupt) + set_tests_properties(agc_driver_linear_target_completion_points_unpipelined PROPERTIES + ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_PIPELINED_DRAWS=0" SKIP_RETURN_CODE 77 TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_driver_linear_target_completion_points_sync_flip agc_driver_linear_target_completion_points_unpipelined PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_mesh_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_mesh_tests.cmake new file mode 100644 index 0000000000..2f26ed8c15 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_mesh_tests.cmake @@ -0,0 +1,14 @@ +add_test_executable(agc_driver_mesh_tests EXCLUDE_FROM_ALL tests/Mesh.cpp) +target_include_directories(agc_driver_mesh_tests PRIVATE + ${LIBS_INCLUDE_DIR} + ${CMAKE_SOURCE_DIR}/core/shader/recompiler + ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR} + ${ANYPS5_SPIRV_HEADERS_INCLUDE_DIR} +) +target_link_libraries(agc_driver_mesh_tests PRIVATE libSceAgcDriver SDL2-static libc) +set_target_properties(agc_driver_mesh_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_driver_mesh_tests) + +if(BUILD_TESTING) + agc_add_default_test(agc_driver_mesh_tests) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_msaa_layout_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_msaa_layout_tests.cmake new file mode 100644 index 0000000000..d1ca697fa0 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_msaa_layout_tests.cmake @@ -0,0 +1,22 @@ +add_test_executable(agc_driver_msaa_layout_tests EXCLUDE_FROM_ALL + tests/MultisampleTextureLayout.cpp + Graphics/src/MultisampleTextureLayout.cpp +) +target_include_directories(agc_driver_msaa_layout_tests PRIVATE + ${LIBS_INCLUDE_DIR} + ${CMAKE_SOURCE_DIR}/core/shader/recompiler + ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR} +) +target_link_libraries(agc_driver_msaa_layout_tests PRIVATE libc) +set_target_properties(agc_driver_msaa_layout_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_driver_msaa_layout_tests) + +if(BUILD_TESTING) + set_target_properties(agc_driver_msaa_layout_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_driver_msaa_layout COMMAND agc_driver_msaa_layout_tests) + set_tests_properties(agc_driver_msaa_layout PROPERTIES TIMEOUT 20) + if(WIN32) + set_tests_properties(agc_driver_msaa_layout PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_multisample_readback_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_multisample_readback_tests.cmake new file mode 100644 index 0000000000..30b35015fb --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_multisample_readback_tests.cmake @@ -0,0 +1,38 @@ +foreach(agcReadbackTestKind IN ITEMS Vertex Uint Depth) + string(TOUPPER ${agcReadbackTestKind} agcReadbackTestSymbol) + if(agcReadbackTestKind STREQUAL "Vertex") + set(agcReadbackTestStage vert) + else() + set(agcReadbackTestStage frag) + endif() + if(agcReadbackTestKind STREQUAL "Depth") + set(agcReadbackTestDepth 1) + else() + set(agcReadbackTestDepth 0) + endif() + set(agcReadbackTestHeader ${agcTestShaderGeneratedRoot}/MsaaReadback${agcReadbackTestKind}_spv.h) + set(agcReadbackTestSpv ${agcTestShaderGeneratedRoot}/MsaaReadback${agcReadbackTestKind}.spv) + add_custom_command( + OUTPUT "${agcReadbackTestHeader}" + COMMAND ${CMAKE_COMMAND} -E make_directory "${agcTestShaderGeneratedRoot}" + COMMAND "$" -V --target-env vulkan1.1 -DREAD_DEPTH=${agcReadbackTestDepth} -o "${agcReadbackTestSpv}" "${CMAKE_CURRENT_SOURCE_DIR}/tests/shaders/MultisampleReadback.${agcReadbackTestStage}" + COMMAND ${CMAKE_COMMAND} -DINPUT=${agcReadbackTestSpv} -DOUTPUT=${agcReadbackTestHeader} + -DSYMBOL=MSAA_READBACK_${agcReadbackTestSymbol}_SPV -P "${CMAKE_CURRENT_SOURCE_DIR}/embed_spirv.cmake" + DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/tests/shaders/MultisampleReadback.${agcReadbackTestStage}" glslang-standalone + VERBATIM + ) + target_sources(agc_driver_multisample_readback_tests PRIVATE ${agcReadbackTestHeader}) +endforeach() +target_include_directories(agc_driver_multisample_readback_tests PRIVATE ${agcTestShaderGeneratedRoot}) + +if(BUILD_TESTING) + set_tests_properties(agc_driver_multisample_readback PROPERTIES TIMEOUT 20) + foreach(agcReadbackCase IN ITEMS uint8 uint16 uint64 uint128 depth upload retile depth_retile) + add_test(NAME agc_driver_multisample_readback_${agcReadbackCase} COMMAND agc_driver_multisample_readback_tests ${agcReadbackCase}) + set_tests_properties(agc_driver_multisample_readback_${agcReadbackCase} PROPERTIES TIMEOUT 20 ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_driver_multisample_readback_${agcReadbackCase} PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + endforeach() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_native_multisample_depth_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_native_multisample_depth_tests.cmake new file mode 100644 index 0000000000..0992f09dc7 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_native_multisample_depth_tests.cmake @@ -0,0 +1,15 @@ +target_include_directories(agc_driver_native_multisample_depth_tests PRIVATE $) + +if(BUILD_TESTING) + set_tests_properties(agc_driver_native_multisample_depth PROPERTIES TIMEOUT 30) + add_test(NAME agc_driver_native_depth_retirement COMMAND agc_driver_native_multisample_depth_tests --retirement) + set_tests_properties(agc_driver_native_depth_retirement PROPERTIES TIMEOUT 30 ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + add_test(NAME agc_driver_native_depth_clears COMMAND agc_driver_native_multisample_depth_tests --clears) + add_test(NAME agc_driver_native_depth_clear_refusals COMMAND agc_driver_native_multisample_depth_tests --clear-refusals) + add_test(NAME agc_driver_native_depth_buffer_clear COMMAND agc_driver_native_multisample_depth_tests --buffer-clear) + set_tests_properties(agc_driver_native_depth_clears agc_driver_native_depth_clear_refusals agc_driver_native_depth_buffer_clear PROPERTIES TIMEOUT 30 ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_driver_native_depth_retirement PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + set_tests_properties(agc_driver_native_depth_clears agc_driver_native_depth_clear_refusals agc_driver_native_depth_buffer_clear PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_nop_data_packet_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_nop_data_packet_tests.cmake new file mode 100644 index 0000000000..ecc2f03642 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_nop_data_packet_tests.cmake @@ -0,0 +1,11 @@ +if(BUILD_TESTING) + add_test_executable(agc_driver_nop_data_packet_tests tests/NopDataWritePacket.cpp) + target_include_directories(agc_driver_nop_data_packet_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(agc_driver_nop_data_packet_tests PRIVATE libSceAgcDriver) + configure_windows_unwind(agc_driver_nop_data_packet_tests) + add_test(NAME agc_driver_nop_data_packet COMMAND agc_driver_nop_data_packet_tests) + if(WIN32) + set_tests_properties(agc_driver_nop_data_packet PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_optimize_on_fiber_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_optimize_on_fiber_tests.cmake new file mode 100644 index 0000000000..4c6372e743 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_optimize_on_fiber_tests.cmake @@ -0,0 +1,3 @@ +if(ANYPS5_ENABLE_SPIRV_TOOLS) + target_link_libraries(agc_driver_optimize_on_fiber_tests PRIVATE libSceFiber shader_recompiler_agc_driver) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_packed_float_color_target_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_packed_float_color_target_tests.cmake new file mode 100644 index 0000000000..21df8b1824 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_packed_float_color_target_tests.cmake @@ -0,0 +1 @@ +target_include_directories(agc_driver_packed_float_color_target_tests PRIVATE $) diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_packed_unorm4444_color_target_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_packed_unorm4444_color_target_tests.cmake new file mode 100644 index 0000000000..1b14546aef --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_packed_unorm4444_color_target_tests.cmake @@ -0,0 +1 @@ +target_include_directories(agc_driver_packed_unorm4444_color_target_tests PRIVATE $) diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_packed_unorm4444_multisample_partial_write_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_packed_unorm4444_multisample_partial_write_tests.cmake new file mode 100644 index 0000000000..41d13ebf24 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_packed_unorm4444_multisample_partial_write_tests.cmake @@ -0,0 +1 @@ +target_include_directories(agc_driver_packed_unorm4444_multisample_partial_write_tests PRIVATE $) diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_packed_unorm4444_partial_write_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_packed_unorm4444_partial_write_tests.cmake new file mode 100644 index 0000000000..d6904e9ecd --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_packed_unorm4444_partial_write_tests.cmake @@ -0,0 +1 @@ +target_include_directories(agc_driver_packed_unorm4444_partial_write_tests PRIVATE $) diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_packed_unorm_color_target_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_packed_unorm_color_target_tests.cmake new file mode 100644 index 0000000000..0a1af8fefc --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_packed_unorm_color_target_tests.cmake @@ -0,0 +1 @@ +target_include_directories(agc_driver_packed_unorm_color_target_tests PRIVATE $) diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_partially_resident_snapshot_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_partially_resident_snapshot_tests.cmake new file mode 100644 index 0000000000..891e3e7ebd --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_partially_resident_snapshot_tests.cmake @@ -0,0 +1,22 @@ +target_include_directories(agc_driver_partially_resident_snapshot_tests PRIVATE $) + +if(BUILD_TESTING) + add_test(NAME agc_driver_partially_resident_pending_stores COMMAND agc_driver_partially_resident_snapshot_tests --pending-stores) + set_tests_properties(agc_driver_partially_resident_pending_stores PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_driver_partially_resident_pending_stores PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_driver_large_tracked_snapshot COMMAND agc_driver_partially_resident_snapshot_tests --large-tracked) + set_tests_properties(agc_driver_large_tracked_snapshot PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_driver_large_tracked_snapshot PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() + if(WIN32) + add_test(NAME agc_driver_untracked_snapshot_hint COMMAND agc_driver_partially_resident_snapshot_tests --untracked-hint) + set_tests_properties(agc_driver_untracked_snapshot_hint PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 30 + ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + add_test(NAME agc_driver_compared_shared_snapshot COMMAND agc_driver_partially_resident_snapshot_tests --compared-shared) + set_tests_properties(agc_driver_compared_shared_snapshot PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 30 + ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_period_copy_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_period_copy_tests.cmake new file mode 100644 index 0000000000..76bd0b8d7f --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_period_copy_tests.cmake @@ -0,0 +1,8 @@ +if(BUILD_TESTING) + add_test(NAME agc_driver_period_copy_no_hle COMMAND agc_driver_period_copy_tests) + set_tests_properties(agc_driver_period_copy_no_hle PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_COPY_HLE=1" SKIP_RETURN_CODE 77 TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_driver_period_copy_no_hle PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_pipeline_journal_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_pipeline_journal_tests.cmake new file mode 100644 index 0000000000..d44ec5a784 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_pipeline_journal_tests.cmake @@ -0,0 +1,2 @@ +target_include_directories(agc_driver_pipeline_journal_tests PRIVATE $) +target_link_libraries(agc_driver_pipeline_journal_tests PRIVATE ${CMAKE_DL_LIBS}) diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_pipeline_optimized_readback_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_pipeline_optimized_readback_tests.cmake new file mode 100644 index 0000000000..1062511583 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_pipeline_optimized_readback_tests.cmake @@ -0,0 +1,18 @@ +if(BUILD_TESTING) + set_target_properties(agc_driver_pipeline_optimized_readback_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + foreach(pipelineReadbackCase IN ITEMS d32 d16 color32 color64) + foreach(pipelineReadbackMode IN ITEMS default fast) + set(pipelineReadbackTest agc_driver_pipeline_optimized_readback_${pipelineReadbackCase}) + set(pipelineReadbackEnvironment "ANYPS5_NO_SHADER_CACHE=1") + if(pipelineReadbackMode STREQUAL "fast") + string(APPEND pipelineReadbackTest "_fast") + list(APPEND pipelineReadbackEnvironment "APS5_NO_PIPELINE_LTO=1") + endif() + add_test(NAME ${pipelineReadbackTest} COMMAND agc_driver_pipeline_optimized_readback_tests ${pipelineReadbackCase}) + set_tests_properties(${pipelineReadbackTest} PROPERTIES ENVIRONMENT "${pipelineReadbackEnvironment}" SKIP_RETURN_CODE 77 TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(${pipelineReadbackTest} PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() + endforeach() + endforeach() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_pipeline_profile_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_pipeline_profile_tests.cmake new file mode 100644 index 0000000000..7b1c4d4aaa --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_pipeline_profile_tests.cmake @@ -0,0 +1,14 @@ +if(BUILD_TESTING) + add_test_executable(agc_driver_pipeline_profile_tests tests/DrawPipelineProfile.cpp) + target_include_directories(agc_driver_pipeline_profile_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(agc_driver_pipeline_profile_tests PRIVATE libSceAgcDriver) + set_target_properties(agc_driver_pipeline_profile_tests PROPERTIES CXX_EXTENSIONS OFF) + configure_windows_unwind(agc_driver_pipeline_profile_tests) + add_test(NAME agc_driver_pipeline_profile COMMAND agc_driver_pipeline_profile_tests) + set_tests_properties(agc_driver_pipeline_profile PROPERTIES TIMEOUT 20 + ENVIRONMENT "APS5_PIPELINE_STATS=1;APS5_PIPELINED_DRAWS=8") + if(WIN32) + set_tests_properties(agc_driver_pipeline_profile PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_pipelined_dispatch_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_pipelined_dispatch_tests.cmake new file mode 100644 index 0000000000..c19228872e --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_pipelined_dispatch_tests.cmake @@ -0,0 +1,8 @@ +if(BUILD_TESTING) + add_test(NAME agc_driver_pipelined_dispatch_item COMMAND agc_driver_pipelined_dispatch_tests) + set_tests_properties(agc_driver_pipelined_dispatch_item PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_PIPELINE_DISPATCH=1" SKIP_RETURN_CODE 77) + if(WIN32) + set_tests_properties(agc_driver_pipelined_dispatch_item PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_pipelined_dma_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_pipelined_dma_tests.cmake new file mode 100644 index 0000000000..63a078aa11 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_pipelined_dma_tests.cmake @@ -0,0 +1,3 @@ +if(BUILD_TESTING) + agc_add_draw_pipeline_test(agc_driver_pipelined_dma) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_pipelined_fill_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_pipelined_fill_tests.cmake new file mode 100644 index 0000000000..38a2743184 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_pipelined_fill_tests.cmake @@ -0,0 +1,3 @@ +if(BUILD_TESTING) + agc_add_draw_pipeline_test(agc_driver_pipelined_fill) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_pipelined_metadata_pass_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_pipelined_metadata_pass_tests.cmake new file mode 100644 index 0000000000..b4df42c2ce --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_pipelined_metadata_pass_tests.cmake @@ -0,0 +1,3 @@ +if(BUILD_TESTING) + agc_add_draw_pipeline_test(agc_driver_pipelined_metadata_pass) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_pipelined_predicated_label_order_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_pipelined_predicated_label_order_tests.cmake new file mode 100644 index 0000000000..f80d0d69b4 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_pipelined_predicated_label_order_tests.cmake @@ -0,0 +1,3 @@ +if(BUILD_TESTING) + agc_add_draw_pipeline_test(agc_driver_pipelined_predicated_label_order) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_pipelined_predication_read_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_pipelined_predication_read_tests.cmake new file mode 100644 index 0000000000..59f85e5bf0 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_pipelined_predication_read_tests.cmake @@ -0,0 +1,3 @@ +if(BUILD_TESTING) + agc_add_draw_pipeline_test(agc_driver_pipelined_predication_read) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_pixel_implicit_derivatives_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_pixel_implicit_derivatives_tests.cmake new file mode 100644 index 0000000000..e9afb15570 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_pixel_implicit_derivatives_tests.cmake @@ -0,0 +1,3 @@ +if(BUILD_TESTING) + set_tests_properties(agc_driver_pixel_implicit_derivatives PROPERTIES TIMEOUT 30) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_pm4_replay_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_pm4_replay_tests.cmake new file mode 100644 index 0000000000..1852488bc5 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_pm4_replay_tests.cmake @@ -0,0 +1,21 @@ +if(BUILD_TESTING) + add_test_executable(agc_driver_pm4_replay_tests tests/Pm4Replay.cpp tools/Pm4Analysis.cpp) + target_include_directories(agc_driver_pm4_replay_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(agc_driver_pm4_replay_tests PRIVATE libSceAgc libSceAgcDriver libkernel libc) + set_target_properties(agc_driver_pm4_replay_tests PROPERTIES CXX_EXTENSIONS OFF) + configure_windows_unwind(agc_driver_pm4_replay_tests) + add_dependencies(agc_driver_pm4_replay_tests agc_pm4_replay) + set(agcPm4ReplayCapture "${CMAKE_CURRENT_BINARY_DIR}/pm4-replay-capture") + add_test(NAME agc_driver_pm4_replay COMMAND agc_driver_pm4_replay_tests) + set_tests_properties(agc_driver_pm4_replay PROPERTIES + ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_DUMP_SUBMITS=${agcPm4ReplayCapture}" + FIXTURES_SETUP agc_pm4_replay_capture TIMEOUT 30) + add_test(NAME agc_driver_pm4_replay_tool COMMAND ${CMAKE_COMMAND} -DTOOL=$ "-DCAPTURE=${agcPm4ReplayCapture}" + -P ${CMAKE_CURRENT_SOURCE_DIR}/tests/Pm4ReplayTool.cmake) + set_tests_properties(agc_driver_pm4_replay_tool PROPERTIES + FIXTURES_REQUIRED agc_pm4_replay_capture TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_driver_pm4_replay agc_driver_pm4_replay_tool PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_pooled_buffer_range_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_pooled_buffer_range_tests.cmake new file mode 100644 index 0000000000..191898c34f --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_pooled_buffer_range_tests.cmake @@ -0,0 +1,4 @@ +if(NOT ANYPS5_AGC_EXECUTION_TESTS OR "PooledBufferRange" IN_LIST ANYPS5_AGC_EXECUTION_TESTS) + target_sources(agc_driver_pooled_buffer_range_tests PRIVATE + Graphics/src/BufferPool.cpp Graphics/src/Resources.cpp tests/AllocationFailure.cpp tests/CommandBatchFailure.cpp) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_preparation_scope_settle_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_preparation_scope_settle_tests.cmake new file mode 100644 index 0000000000..d80131f460 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_preparation_scope_settle_tests.cmake @@ -0,0 +1 @@ +target_link_libraries(agc_driver_preparation_scope_settle_tests PRIVATE libSceAgc) diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_prepared_exports_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_prepared_exports_tests.cmake new file mode 100644 index 0000000000..f8d2a15901 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_prepared_exports_tests.cmake @@ -0,0 +1 @@ +target_include_directories(agc_driver_prepared_exports_tests PRIVATE $) diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_prepared_graphics_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_prepared_graphics_tests.cmake new file mode 100644 index 0000000000..47e76a6879 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_prepared_graphics_tests.cmake @@ -0,0 +1,19 @@ +target_include_directories(agc_driver_prepared_graphics_tests PRIVATE $) + +if(BUILD_TESTING) + foreach(prebuildPolicyMode IN ITEMS unset 0 1) + set(prebuildPolicyTest agc_driver_prepared_graphics_prebuild_${prebuildPolicyMode}) + add_test(NAME ${prebuildPolicyTest} COMMAND agc_driver_prepared_graphics_tests --prebuild-${prebuildPolicyMode}) + set_tests_properties(${prebuildPolicyTest} PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" RUN_SERIAL TRUE SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 30) + set(prebuildPolicyEnvironment "APS5_NO_GPL=unset:") + if(prebuildPolicyMode STREQUAL "unset") + list(APPEND prebuildPolicyEnvironment "APS5_NO_LIBRARY_PREBUILD=unset:") + else() + list(APPEND prebuildPolicyEnvironment "APS5_NO_LIBRARY_PREBUILD=set:${prebuildPolicyMode}") + endif() + if(WIN32) + list(APPEND prebuildPolicyEnvironment "PATH=path_list_prepend:$") + endif() + set_tests_properties(${prebuildPolicyTest} PROPERTIES ENVIRONMENT_MODIFICATION "${prebuildPolicyEnvironment}") + endforeach() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_prepared_publication_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_prepared_publication_tests.cmake new file mode 100644 index 0000000000..f14e9b8d5b --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_prepared_publication_tests.cmake @@ -0,0 +1 @@ +target_include_directories(agc_driver_prepared_publication_tests PRIVATE $) diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_prepared_shaders_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_prepared_shaders_tests.cmake new file mode 100644 index 0000000000..c8ea685d72 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_prepared_shaders_tests.cmake @@ -0,0 +1,60 @@ +target_include_directories(agc_driver_prepared_shaders_tests PRIVATE + $ +) + +if(BUILD_TESTING) + foreach(preparedMode IN ITEMS indirect uncached debug debug_failure deferred deferred_undecodable registered_workgroup registered_workgroup_sync dispatch_ahead_prewarm abi_deferred_compute abi_deferred_pixel abi_deferred_stages abi_deferred_rectangle abi_deferred_undecodable_state abi_deferred_registration_failure abi_deferred_vertex_inputs abi_deferred_rectangle_pairs lazy lazy_sync lazy_budget_zero) + set(preparedTest "agc_driver_prepared_shaders_${preparedMode}") + if(preparedMode MATCHES "^abi_deferred_") + string(REPLACE "_" "-" preparedArgument ${preparedMode}) + add_test(NAME ${preparedTest} COMMAND agc_driver_prepared_shaders_tests --${preparedArgument}) + elseif(preparedMode STREQUAL "indirect") + add_test(NAME ${preparedTest} COMMAND agc_driver_prepared_shaders_tests --indirect) + elseif(preparedMode STREQUAL "deferred") + add_test(NAME ${preparedTest} COMMAND agc_driver_prepared_shaders_tests --deferred) + elseif(preparedMode STREQUAL "deferred_undecodable") + add_test(NAME ${preparedTest} COMMAND agc_driver_prepared_shaders_tests --deferred-undecodable) + elseif(preparedMode STREQUAL "lazy" OR preparedMode STREQUAL "lazy_sync" OR preparedMode STREQUAL "lazy_budget_zero") + add_test(NAME ${preparedTest} COMMAND agc_driver_prepared_shaders_tests --lazy) + elseif(preparedMode STREQUAL "registered_workgroup" OR preparedMode STREQUAL "registered_workgroup_sync") + add_test(NAME ${preparedTest} COMMAND agc_driver_prepared_shaders_tests --registered-workgroup) + elseif(preparedMode STREQUAL "dispatch_ahead_prewarm") + add_test(NAME ${preparedTest} COMMAND agc_driver_prepared_shaders_tests --dispatch-ahead-prewarm) + elseif(preparedMode STREQUAL "debug_failure") + add_test(NAME ${preparedTest} COMMAND agc_driver_prepared_shaders_tests --fail-before-registration) + set_tests_properties(${preparedTest} PROPERTIES WILL_FAIL TRUE TIMEOUT 30) + else() + add_test(NAME ${preparedTest} COMMAND agc_driver_prepared_shaders_tests) + endif() + set_tests_properties(${preparedTest} PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(preparedMode MATCHES "^abi_deferred_") + set_property(TEST ${preparedTest} APPEND PROPERTY ENVIRONMENT "APS5_NO_FAILURE_MEMO=1") + elseif(preparedMode STREQUAL "uncached") + set_property(TEST ${preparedTest} APPEND PROPERTY ENVIRONMENT "APS5_NO_DISPATCH_CACHE=1") + elseif(preparedMode STREQUAL "registered_workgroup_sync") + set_property(TEST ${preparedTest} APPEND PROPERTY ENVIRONMENT "APS5_SYNC_SHADER_PREPARE=1") + elseif(preparedMode STREQUAL "lazy" OR preparedMode STREQUAL "lazy_sync") + set_property(TEST ${preparedTest} APPEND PROPERTY ENVIRONMENT "APS5_LAZY_SHADER_PREPARE=1" "APS5_SUSPEND_DRAIN=1") + if(preparedMode STREQUAL "lazy_sync") + set_property(TEST ${preparedTest} APPEND PROPERTY ENVIRONMENT "APS5_SYNC_SHADER_PREPARE=1") + endif() + elseif(preparedMode STREQUAL "lazy_budget_zero") + set_property(TEST ${preparedTest} APPEND PROPERTY ENVIRONMENT "APS5_REGISTRATION_PREPARE_COMMIT_GB=0" "APS5_SUSPEND_DRAIN=1") + elseif(preparedMode STREQUAL "debug" OR preparedMode STREQUAL "debug_failure") + set_property(TEST ${preparedTest} APPEND PROPERTY ENVIRONMENT "APS5_PROFILE_DRAW=1" "APS5_NO_UNLOCKED_DEVICE=1") + endif() + if(WIN32) + set_tests_properties(${preparedTest} PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() + endforeach() + add_test(NAME agc_driver_prepared_shaders_abi_deferred_concurrent_lazy COMMAND agc_driver_prepared_shaders_tests --abi-deferred-concurrent) + set_tests_properties(agc_driver_prepared_shaders_abi_deferred_concurrent_lazy PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_FAILURE_MEMO=1;APS5_LAZY_SHADER_PREPARE=1;APS5_SUSPEND_DRAIN=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_driver_prepared_shaders_abi_deferred_concurrent_lazy PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_driver_prepared_shaders_abi_deferred_compute_lazy COMMAND agc_driver_prepared_shaders_tests --abi-deferred-compute) + set_tests_properties(agc_driver_prepared_shaders_abi_deferred_compute_lazy PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_FAILURE_MEMO=1;APS5_LAZY_SHADER_PREPARE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_driver_prepared_shaders_abi_deferred_compute_lazy PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_prepared_unregistered_graphics_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_prepared_unregistered_graphics_tests.cmake new file mode 100644 index 0000000000..9d4b8ccb1d --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_prepared_unregistered_graphics_tests.cmake @@ -0,0 +1 @@ +target_include_directories(agc_driver_prepared_unregistered_graphics_tests PRIVATE $) diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_presentation_pass_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_presentation_pass_tests.cmake new file mode 100644 index 0000000000..3ce36f91fb --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_presentation_pass_tests.cmake @@ -0,0 +1,28 @@ +add_test_executable(agc_driver_presentation_pass_tests EXCLUDE_FROM_ALL + tests/PresentationPass.cpp +) + +target_include_directories(agc_driver_presentation_pass_tests PRIVATE + ${LIBS_INCLUDE_DIR} + ${CMAKE_SOURCE_DIR}/core/shader/recompiler + ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR} +) + +target_link_libraries(agc_driver_presentation_pass_tests PRIVATE + libSceAgcDriver + SDL2-static + libc +) + +set_target_properties(agc_driver_presentation_pass_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_driver_presentation_pass_tests) + +if(BUILD_TESTING) + set_target_properties(agc_driver_presentation_pass_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_driver_presentation_pass COMMAND agc_driver_presentation_pass_tests) + set_tests_properties(agc_driver_presentation_pass PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_driver_presentation_pass PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_provoking_vertex_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_provoking_vertex_tests.cmake new file mode 100644 index 0000000000..023e8c55df --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_provoking_vertex_tests.cmake @@ -0,0 +1,21 @@ +foreach(stage IN ITEMS vert frag) + set(agcProvokingShaderSource ${CMAKE_CURRENT_SOURCE_DIR}/tests/shaders/ProvokingVertex.${stage}) + set(agcProvokingShaderSpv ${agcTestShaderGeneratedRoot}/ProvokingVertex_${stage}.spv) + set(agcProvokingShaderHeader ${agcTestShaderGeneratedRoot}/ProvokingVertex_${stage}_spv.h) + string(TOUPPER "PROVOKING_VERTEX_${stage}_SPV" agcProvokingShaderSymbol) + add_custom_command( + OUTPUT "${agcProvokingShaderHeader}" + COMMAND ${CMAKE_COMMAND} -E make_directory "${agcTestShaderGeneratedRoot}" + COMMAND "$" -V --target-env vulkan1.1 -o "${agcProvokingShaderSpv}" "${agcProvokingShaderSource}" + COMMAND ${CMAKE_COMMAND} -DINPUT=${agcProvokingShaderSpv} -DOUTPUT=${agcProvokingShaderHeader} + -DSYMBOL=${agcProvokingShaderSymbol} -P "${CMAKE_CURRENT_SOURCE_DIR}/embed_spirv.cmake" + DEPENDS "${agcProvokingShaderSource}" glslang-standalone + VERBATIM + ) + target_sources(agc_driver_provoking_vertex_tests PRIVATE ${agcProvokingShaderHeader}) +endforeach() +target_include_directories(agc_driver_provoking_vertex_tests PRIVATE ${agcTestShaderGeneratedRoot}) + +if(BUILD_TESTING) + set_tests_properties(agc_driver_provoking_vertex PROPERTIES TIMEOUT 30) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_queue_zero_late_interrupt_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_queue_zero_late_interrupt_tests.cmake new file mode 100644 index 0000000000..07148a1eab --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_queue_zero_late_interrupt_tests.cmake @@ -0,0 +1 @@ +target_link_libraries(agc_driver_queue_zero_late_interrupt_tests PRIVATE libkernel) diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_queued_index_read_order_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_queued_index_read_order_tests.cmake new file mode 100644 index 0000000000..44926f7087 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_queued_index_read_order_tests.cmake @@ -0,0 +1,3 @@ +if(BUILD_TESTING) + set_tests_properties(agc_driver_queued_index_read_order PROPERTIES TIMEOUT 60) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_queued_raw_shader_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_queued_raw_shader_tests.cmake new file mode 100644 index 0000000000..6dc4f6d568 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_queued_raw_shader_tests.cmake @@ -0,0 +1,3 @@ +if(BUILD_TESTING) + set_tests_properties(agc_driver_queued_raw_shader PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_PIPELINED_DRAWS=8" TIMEOUT 30) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_rcp_hardware_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_rcp_hardware_tests.cmake new file mode 100644 index 0000000000..372b14535d --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_rcp_hardware_tests.cmake @@ -0,0 +1,9 @@ +if(BUILD_TESTING) + set_target_properties(agc_driver_rcp_hardware_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_driver_rcp_hardware_exact COMMAND agc_driver_rcp_hardware_tests) + set_tests_properties(agc_driver_rcp_hardware_exact PROPERTIES ENVIRONMENT "APS5_EXACT_RCP=1;ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 TIMEOUT 60) + if(WIN32) + set_tests_properties(agc_driver_rcp_hardware_exact PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_recorder_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_recorder_tests.cmake new file mode 100644 index 0000000000..a238e74936 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_recorder_tests.cmake @@ -0,0 +1,392 @@ +add_test_executable(agc_driver_recorder_tests EXCLUDE_FROM_ALL + tests/Recorder.cpp + tests/HostImportLifetime.cpp + tests/ResidentPresent.cpp + ${agcTriangleHeaders} + ${agcSampleLodShaderHeader} + ${agcSampleArrayShaderHeader} + ${agcCoverShaderHeaders} + ${agcBufferUpdateHeader} +) + +target_include_directories(agc_driver_recorder_tests PRIVATE + ${LIBS_INCLUDE_DIR} + ${agcTestShaderGeneratedRoot} + ${CMAKE_SOURCE_DIR}/core/shader/recompiler + ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR} +) + +target_link_libraries(agc_driver_recorder_tests PRIVATE + libSceAgc + libkernel + libSceAgcDriver + SDL2-static + libc +) + +set_target_properties(agc_driver_recorder_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_driver_recorder_tests) + +if(BUILD_TESTING) + set_target_properties(agc_driver_recorder_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_recorder_device_selection COMMAND agc_driver_recorder_tests --device-selection-only) + add_test(NAME agc_gpu_timing_key COMMAND agc_driver_recorder_tests --gpu-timing-key-only) + add_test(NAME agc_gpu_timing_complete COMMAND agc_driver_recorder_tests --gpu-timing-complete-only) + add_test(NAME agc_gpu_timing_incomplete COMMAND agc_driver_recorder_tests --gpu-timing-incomplete-only) + set_tests_properties(agc_gpu_timing_complete agc_gpu_timing_incomplete PROPERTIES + ENVIRONMENT "APS5_PROFILE_GPU=1" TIMEOUT 15 SKIP_RETURN_CODE 77) + if(WIN32) + set_tests_properties(agc_recorder_device_selection agc_gpu_timing_key agc_gpu_timing_complete agc_gpu_timing_incomplete PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_command_memory_reuse COMMAND agc_driver_recorder_tests --command-reuse-only) + set_tests_properties(agc_command_memory_reuse PROPERTIES SKIP_RETURN_CODE 77) + if(WIN32) + set_tests_properties(agc_command_memory_reuse PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_pipeline_cache COMMAND agc_driver_recorder_tests --pipeline-cache-only) + add_test(NAME agc_pipeline_cache_file COMMAND agc_driver_recorder_tests --pipeline-cache-file-only) + add_test(NAME agc_pipeline_cache_header COMMAND agc_driver_recorder_tests --pipeline-cache-header-only) + set_tests_properties(agc_pipeline_cache_header PROPERTIES TIMEOUT 30 SKIP_RETURN_CODE 77) + if(WIN32) + set_tests_properties(agc_pipeline_cache_header PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_pipeline_library COMMAND agc_driver_recorder_tests --pipeline-library-only) + add_test(NAME agc_pipeline_library_off COMMAND agc_driver_recorder_tests --pipeline-library-only) + set_tests_properties(agc_pipeline_library agc_pipeline_library_off PROPERTIES SKIP_RETURN_CODE 77) + set_tests_properties(agc_pipeline_library_off PROPERTIES ENVIRONMENT "APS5_NO_GPL=1") + add_test(NAME agc_pipeline_library_fast_only COMMAND agc_driver_recorder_tests --pipeline-library-only) + set_tests_properties(agc_pipeline_library_fast_only PROPERTIES ENVIRONMENT "APS5_NO_PIPELINE_LTO=1" SKIP_RETURN_CODE 77) + add_test(NAME agc_pipeline_library_lto_info COMMAND agc_driver_recorder_tests --pipeline-library-lto-info-only) + add_test(NAME agc_pipeline_library_lto_info_fast_only COMMAND agc_driver_recorder_tests --pipeline-library-lto-info-only) + set_tests_properties(agc_pipeline_library_lto_info agc_pipeline_library_lto_info_fast_only PROPERTIES SKIP_RETURN_CODE 77) + set_tests_properties(agc_pipeline_library_lto_info_fast_only PROPERTIES ENVIRONMENT "APS5_NO_PIPELINE_LTO=1") + if(WIN32) + set_tests_properties(agc_pipeline_library agc_pipeline_library_off agc_pipeline_library_fast_only agc_pipeline_library_lto_info agc_pipeline_library_lto_info_fast_only PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + set_tests_properties(agc_pipeline_cache agc_pipeline_cache_file PROPERTIES SKIP_RETURN_CODE 77) + if(WIN32) + set_tests_properties(agc_pipeline_cache agc_pipeline_cache_file PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_import_watch COMMAND agc_driver_recorder_tests --import-watch-only) + set_tests_properties(agc_import_watch PROPERTIES SKIP_RETURN_CODE 77) + add_test(NAME agc_import_settle_initial_dcc COMMAND agc_driver_recorder_tests --settle-initial-dcc-only) + set_tests_properties(agc_import_settle_initial_dcc PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) + if(WIN32) + add_test(NAME agc_import_watch_other_family COMMAND agc_driver_recorder_tests --import-watch-other-family-only) + set_tests_properties(agc_import_watch_other_family PROPERTIES SKIP_RETURN_CODE 77) + add_test(NAME agc_import_settle_deferred COMMAND agc_driver_recorder_tests --deferred-settle-only) + add_test(NAME agc_import_settle_deferred_other_family COMMAND agc_driver_recorder_tests --deferred-settle-other-family-only) + add_test(NAME agc_import_settle_write_order COMMAND agc_driver_recorder_tests --settle-write-order-only) + add_test(NAME agc_import_settle_write_order_other_family COMMAND agc_driver_recorder_tests --settle-write-order-other-family-only) + add_test(NAME agc_import_settle_wait_failure COMMAND agc_driver_recorder_tests --settle-wait-failure-only) + set_tests_properties(agc_import_settle_write_order agc_import_settle_write_order_other_family agc_import_settle_wait_failure PROPERTIES + SKIP_RETURN_CODE 77 TIMEOUT 30 + FAIL_REGULAR_EXPRESSION "SYNC-HAZARD-|VUID-" + ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + add_test(NAME agc_import_settle_first_use COMMAND agc_driver_recorder_tests --settle-first-use-only) + add_test(NAME agc_import_settle_earlier_import COMMAND agc_driver_recorder_tests --settle-earlier-import-only) + add_test(NAME agc_import_settle_retire COMMAND agc_driver_recorder_tests --settle-retire-only) + add_test(NAME agc_import_settle_storage_image COMMAND agc_driver_recorder_tests --settle-storage-image-only) + set_tests_properties(agc_import_settle_deferred agc_import_settle_deferred_other_family agc_import_settle_first_use agc_import_settle_earlier_import agc_import_settle_retire agc_import_settle_storage_image PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 60) + set_tests_properties(agc_import_watch agc_import_watch_other_family agc_import_settle_deferred agc_import_settle_deferred_other_family agc_import_settle_first_use agc_import_settle_earlier_import agc_import_settle_retire agc_import_settle_storage_image agc_import_settle_initial_dcc PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + if(WIN32) + add_test(NAME agc_reimport_bench COMMAND agc_driver_recorder_tests --reimport-bench) + add_test(NAME agc_host_import_cut_lifetime COMMAND agc_driver_recorder_tests --host-import-cut-only) + set_tests_properties(agc_reimport_bench agc_host_import_cut_lifetime PROPERTIES SKIP_RETURN_CODE 77) + set_tests_properties(agc_reimport_bench agc_host_import_cut_lifetime PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_unchanged_cpu_stamps COMMAND agc_driver_recorder_tests --unchanged-cpu-stamps-only) + set_tests_properties(agc_unchanged_cpu_stamps PROPERTIES SKIP_RETURN_CODE 77) + if(WIN32) + set_tests_properties(agc_unchanged_cpu_stamps PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + foreach(mode IN ITEMS map ring shared uncached) + add_test(NAME agc_collect_mapping_history_${mode} COMMAND agc_driver_recorder_tests --collect-mapping-history-only) + set_tests_properties(agc_collect_mapping_history_${mode} PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_collect_mapping_history_${mode} PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + endforeach() + set_tests_properties(agc_collect_mapping_history_ring PROPERTIES ENVIRONMENT "APS5_NO_EPOCH_COLLECT_MAP=1") + set_tests_properties(agc_collect_mapping_history_shared PROPERTIES ENVIRONMENT "APS5_SHARED_COLLECT_MEMO=1") + set_tests_properties(agc_collect_mapping_history_uncached PROPERTIES ENVIRONMENT "APS5_NO_COLLECT_MEMO=1") + if(WIN32) + foreach(mode IN ITEMS cached uncached) + add_test(NAME agc_hint_mapping_history_${mode} COMMAND agc_driver_recorder_tests --hint-mapping-history-only) + set_tests_properties(agc_hint_mapping_history_${mode} PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30 + ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endforeach() + set_tests_properties(agc_hint_mapping_history_uncached PROPERTIES ENVIRONMENT "APS5_NO_COLLECT_MEMO=1") + foreach(mode IN ITEMS cached uncached) + add_test(NAME agc_hint_partial_block_store_${mode} COMMAND agc_driver_recorder_tests --hint-partial-block-store-only) + set_tests_properties(agc_hint_partial_block_store_${mode} PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30 + ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endforeach() + set_tests_properties(agc_hint_partial_block_store_uncached PROPERTIES ENVIRONMENT "APS5_NO_COLLECT_MEMO=1") + foreach(mode IN ITEMS cached uncached) + add_test(NAME agc_shared_block_rewatch_${mode} COMMAND agc_driver_recorder_tests --shared-block-rewatch-only) + set_tests_properties(agc_shared_block_rewatch_${mode} PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30 + ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endforeach() + set_tests_properties(agc_shared_block_rewatch_uncached PROPERTIES ENVIRONMENT "APS5_NO_COLLECT_MEMO=1") + foreach(kind IN ITEMS complete possible) + add_test(NAME agc_interior_watched_driver_write_${kind} COMMAND agc_driver_recorder_tests --interior-watched-driver-write-only ${kind}) + set_tests_properties(agc_interior_watched_driver_write_${kind} PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30 + ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endforeach() + endif() + if(WIN32) + add_test(NAME agc_partial_watch_restoration COMMAND agc_driver_recorder_tests --partial-watch-restoration-only) + set_tests_properties(agc_partial_watch_restoration PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30 ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_storage_kept_unit_settle COMMAND agc_driver_recorder_tests --kept-unit-settle-only) + add_test(NAME agc_storage_idle_writeback_race COMMAND agc_driver_recorder_tests --idle-writeback-race-only) + set_tests_properties(agc_storage_idle_writeback_race PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 60) + set_tests_properties(agc_storage_kept_unit_settle PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_storage_idle_writeback_race agc_storage_kept_unit_settle PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_storage_baseline_settled COMMAND agc_driver_recorder_tests --settled-baseline-only) + add_test(NAME agc_storage_clear_hand_over COMMAND agc_driver_recorder_tests --clear-hand-over-only) + set_tests_properties(agc_storage_clear_hand_over PROPERTIES SKIP_RETURN_CODE 77) + if(WIN32) + set_tests_properties(agc_storage_clear_hand_over PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_storage_typed_fill_clear COMMAND agc_driver_recorder_tests --typed-fill-clear-only) + set_tests_properties(agc_storage_typed_fill_clear PROPERTIES ENVIRONMENT "APS5_NO_PIPELINE_JOURNAL=1" SKIP_RETURN_CODE 77) + add_test(NAME agc_storage_integer_clear COMMAND agc_driver_recorder_tests --integer-clear-only) + set_tests_properties(agc_storage_integer_clear PROPERTIES SKIP_RETURN_CODE 77) + if(WIN32) + set_tests_properties(agc_storage_typed_fill_clear agc_storage_integer_clear PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_storage_upload_lifetime COMMAND agc_driver_recorder_tests --storage-upload-lifetime-only) + add_test(NAME agc_sampled_storage_base_level_usage COMMAND agc_driver_recorder_tests --sampled-storage-base-level-usage-only) + set_tests_properties(agc_sampled_storage_base_level_usage PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_sampled_storage_base_level_usage PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_storage_upload_failure COMMAND agc_driver_recorder_tests --storage-upload-failure-only) + set_tests_properties(agc_storage_upload_lifetime agc_storage_upload_failure PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_storage_upload_lifetime agc_storage_upload_failure PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + set_tests_properties(agc_storage_baseline_settled PROPERTIES SKIP_RETURN_CODE 77) + if(WIN32) + set_tests_properties(agc_storage_baseline_settled PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_bda_staging COMMAND agc_driver_recorder_tests --bda-staging-only) + set_tests_properties(agc_bda_staging PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_bda_staging PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_read_written_staging COMMAND agc_driver_recorder_tests --read-written-staging-only) + set_tests_properties(agc_read_written_staging PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_read_written_staging PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_storage_written_buffer_order COMMAND agc_driver_recorder_tests --written-buffer-order-only) + set_tests_properties(agc_storage_written_buffer_order PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_storage_written_buffer_order PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_storage_split_writeback COMMAND agc_driver_recorder_tests --split-writeback-only) + set_tests_properties(agc_storage_split_writeback PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30 ENVIRONMENT "APS5_PIN_WAIT_MS=3000") + if(WIN32) + set_tests_properties(agc_storage_split_writeback PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_storage_write_back COMMAND agc_driver_recorder_tests --storage-write-back-only) + set_tests_properties(agc_storage_write_back PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 120 ENVIRONMENT "APS5_PIN_WAIT_MS=3000") + if(WIN32) + set_tests_properties(agc_storage_write_back PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_copied_direct_ordering COMMAND agc_driver_recorder_tests --copied-direct-only) + set_tests_properties(agc_copied_direct_ordering PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_copied_direct_ordering PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_storage_writeback_blocks COMMAND agc_driver_recorder_tests --writeback-blocks-only) + set_tests_properties(agc_storage_writeback_blocks PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30 ENVIRONMENT "APS5_PIN_WAIT_MS=3000") + if(WIN32) + set_tests_properties(agc_storage_writeback_blocks PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_recorder_read_list COMMAND agc_driver_recorder_tests --read-list-only) + set_tests_properties(agc_recorder_read_list PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) + add_test(NAME agc_recorder_deferred_failure_report COMMAND agc_driver_recorder_tests --deferred-failure-report-only) + set_tests_properties(agc_recorder_deferred_failure_report PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_recorder_deferred_failure_report PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_space_pending_writes COMMAND agc_driver_recorder_tests --space-pending-writes-only) + set_tests_properties(agc_space_pending_writes PROPERTIES SKIP_RETURN_CODE 77) + if(WIN32) + set_tests_properties(agc_space_pending_writes PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_host_import_unmap COMMAND agc_driver_recorder_tests --host-import-unmap-only) + set_tests_properties(agc_host_import_unmap PROPERTIES SKIP_RETURN_CODE 77) + add_test(NAME agc_parked_import_unmap COMMAND agc_driver_recorder_tests --parked-import-unmap-only) + set_tests_properties(agc_parked_import_unmap PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30 ENVIRONMENT "APS5_PIN_WAIT_MS=3000") + add_test(NAME agc_host_import_retirement COMMAND agc_driver_recorder_tests --host-import-retirement-only) + set_tests_properties(agc_host_import_retirement PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) + add_test(NAME agc_sparse_run_import COMMAND agc_driver_recorder_tests --sparse-run-import-only) + set_tests_properties(agc_sparse_run_import PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) + add_test(NAME agc_windowed_import_refresh COMMAND agc_driver_recorder_tests --windowed-import-refresh-only) + set_tests_properties(agc_windowed_import_refresh PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_windowed_import_refresh PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_sparse_run_import_copied COMMAND agc_driver_recorder_tests --sparse-run-copied-only) + set_tests_properties(agc_sparse_run_import_copied PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) + add_test(NAME agc_unit_shadow COMMAND agc_driver_recorder_tests --unit-shadow-only) + set_tests_properties(agc_unit_shadow PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30 ENVIRONMENT "APS5_PIN_WAIT_MS=3000") + add_test(NAME agc_idle_publish_wait COMMAND agc_driver_recorder_tests --idle-publish-wait-only) + set_tests_properties(agc_idle_publish_wait PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30 ENVIRONMENT "APS5_PIN_WAIT_MS=3000;APS5_WRITE_WATCH_IMPORTS=watch") + add_test(NAME agc_driver_bda_reads_shadowed_results COMMAND agc_driver_recorder_tests --bda-shadowed-results-only) + add_test(NAME agc_driver_bda_reads_shadowed_results_per_build COMMAND agc_driver_recorder_tests --bda-shadowed-results-only) + set_tests_properties(agc_driver_bda_reads_shadowed_results agc_driver_bda_reads_shadowed_results_per_build PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) + set_tests_properties(agc_driver_bda_reads_shadowed_results_per_build PROPERTIES ENVIRONMENT "APS5_NO_ADDRESS_SPACE_CACHE=1") + if(WIN32) + set_tests_properties(agc_driver_bda_reads_shadowed_results agc_driver_bda_reads_shadowed_results_per_build PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_unit_shadow_completion_store COMMAND agc_driver_recorder_tests --completion-store-shadow-only) + set_tests_properties(agc_unit_shadow_completion_store PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_unit_shadow_completion_store PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_driver_recorder COMMAND agc_driver_recorder_tests) + set_tests_properties(agc_driver_recorder PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) + if(WIN32) + add_test(NAME agc_storage_cpu_snapshot COMMAND agc_driver_recorder_tests --storage-cpu-snapshot-only) + set_tests_properties(agc_storage_cpu_snapshot PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" TIMEOUT 30 SKIP_RETURN_CODE 77 + ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_recorder_command_buffer_release COMMAND agc_driver_recorder_tests --command-buffer-release-only) + set_tests_properties(agc_recorder_command_buffer_release PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) + add_test(NAME agc_descriptor_pool_recycling COMMAND agc_driver_recorder_tests --descriptor-pool-only) + set_tests_properties(agc_descriptor_pool_recycling PROPERTIES SKIP_RETURN_CODE 77) + add_test(NAME agc_draw_snapshot_cap COMMAND agc_driver_recorder_tests --draw-snapshot-cap-only) + set_tests_properties(agc_draw_snapshot_cap PROPERTIES SKIP_RETURN_CODE 77) + add_test(NAME agc_draw_snapshot_epoch COMMAND agc_driver_recorder_tests --draw-snapshot-epoch-only) + set_tests_properties(agc_draw_snapshot_epoch PROPERTIES SKIP_RETURN_CODE 77) + add_test(NAME agc_multisample_guest_access COMMAND agc_driver_recorder_tests --multisample-only) + set_tests_properties(agc_multisample_guest_access PROPERTIES SKIP_RETURN_CODE 77) + add_test(NAME agc_repeat_storage_guard COMMAND agc_driver_recorder_tests --repeat-storage-guard-only) + set_tests_properties(agc_repeat_storage_guard PROPERTIES SKIP_RETURN_CODE 77) + add_test(NAME agc_draw_inputs_in_place COMMAND agc_driver_recorder_tests --draw-inputs-in-place-only) + add_test(NAME agc_pending_write_snapshot COMMAND agc_driver_recorder_tests --pending-write-snapshot-only) + set_tests_properties(agc_pending_write_snapshot PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_pending_write_snapshot PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + set_tests_properties(agc_draw_inputs_in_place PROPERTIES SKIP_RETURN_CODE 77) + add_test(NAME agc_draw_inputs_copied COMMAND agc_driver_recorder_tests --draw-inputs-copied-only) + set_tests_properties(agc_draw_inputs_copied PROPERTIES SKIP_RETURN_CODE 77) + add_test(NAME agc_resident_present COMMAND agc_driver_recorder_tests --resident-present-only) + set_tests_properties(agc_resident_present PROPERTIES SKIP_RETURN_CODE 77) + add_test(NAME agc_queued_write_groups COMMAND agc_driver_recorder_tests --queued-write-groups-only) + add_test(NAME agc_tiled_resolve COMMAND agc_driver_recorder_tests --tiled-resolve-only) + set_tests_properties(agc_tiled_resolve PROPERTIES SKIP_RETURN_CODE 77) + add_test(NAME agc_slice_dirty COMMAND agc_driver_recorder_tests --slice-dirty-only) + set_tests_properties(agc_slice_dirty PROPERTIES SKIP_RETURN_CODE 77) + add_test(NAME agc_metadata_pass COMMAND agc_driver_recorder_tests --metadata-pass-only) + set_tests_properties(agc_metadata_pass PROPERTIES SKIP_RETURN_CODE 77) + if(WIN32) + set_tests_properties(agc_recorder_read_list agc_host_import_unmap agc_parked_import_unmap agc_host_import_retirement agc_sparse_run_import agc_sparse_run_import_copied agc_unit_shadow agc_driver_recorder agc_idle_publish_wait agc_recorder_command_buffer_release agc_descriptor_pool_recycling agc_draw_snapshot_cap agc_draw_snapshot_epoch agc_multisample_guest_access agc_repeat_storage_guard agc_draw_inputs_in_place agc_draw_inputs_copied agc_resident_present agc_slice_dirty agc_queued_write_groups agc_metadata_pass agc_tiled_resolve PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + add_test(NAME agc_host_import_second_mapping COMMAND agc_driver_recorder_tests --host-import-second-mapping-only) + set_tests_properties(agc_host_import_second_mapping PROPERTIES SKIP_RETURN_CODE 77 ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_pending_key_stores COMMAND agc_driver_recorder_tests --pending-key-stores-only) + set_tests_properties(agc_pending_key_stores PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) + add_test(NAME agc_shadowed_key_stores COMMAND agc_driver_recorder_tests --shadowed-key-stores-only) + set_tests_properties(agc_shadowed_key_stores PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) + add_test(NAME agc_sample_dumps COMMAND agc_driver_recorder_tests --sample-dumps-only) + set_tests_properties(agc_sample_dumps PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) + add_test(NAME agc_uncounted_passes COMMAND agc_driver_recorder_tests --uncounted-passes-only) + set_tests_properties(agc_uncounted_passes PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) + add_test(NAME agc_draw_descriptors COMMAND agc_driver_recorder_tests --draw-descriptors-only) + set_tests_properties(agc_draw_descriptors PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 60) + if(WIN32) + set_tests_properties(agc_pending_key_stores agc_shadowed_key_stores agc_sample_dumps agc_uncounted_passes agc_draw_descriptors PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_driver_host_import_lifetime COMMAND agc_driver_recorder_tests --host-import-lifetime-only) + add_test(NAME agc_driver_host_import_mutation_race COMMAND agc_driver_recorder_tests --host-import-mutation-race-only) + set_tests_properties(agc_driver_host_import_lifetime agc_driver_host_import_mutation_race PROPERTIES + ENVIRONMENT "APS5_PIN_WAIT_MS=2000" SKIP_RETURN_CODE 77 TIMEOUT 30) + add_test(NAME agc_driver_unit_shadow COMMAND agc_driver_recorder_tests --unit-shadow-only) + add_test(NAME agc_driver_unit_shadow_budget COMMAND agc_driver_recorder_tests --unit-shadow-only) + set_tests_properties(agc_driver_unit_shadow PROPERTIES + ENVIRONMENT "APS5_PIN_WAIT_MS=2000" SKIP_RETURN_CODE 77 TIMEOUT 30) + set_tests_properties(agc_driver_unit_shadow_budget PROPERTIES + ENVIRONMENT "APS5_PIN_WAIT_MS=2000;APS5_UNIT_SHADOW_MIB=8" SKIP_RETURN_CODE 77 TIMEOUT 30) + add_test(NAME agc_small_tiled_shadow_label COMMAND agc_driver_recorder_tests --small-tiled-shadow-label-only) + set_tests_properties(agc_small_tiled_shadow_label PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) + add_test(NAME agc_recorder_completion_labels COMMAND agc_driver_recorder_tests --completion-labels-only) + set_tests_properties(agc_recorder_completion_labels PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) + add_test(NAME agc_recorder_cmask COMMAND agc_driver_recorder_tests --cmask-only) + set_tests_properties(agc_recorder_cmask PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) + add_test(NAME agc_recorder_cube COMMAND agc_driver_recorder_tests --cube-only) + set_tests_properties(agc_recorder_cube PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) + add_test(NAME agc_recorder_failed_check COMMAND agc_driver_recorder_tests --failed-check-only) + set_tests_properties(agc_recorder_failed_check PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30 + PASS_REGULAR_EXPRESSION "a failed check stopped the test with a texture upload in its open batch" + FAIL_REGULAR_EXPRESSION "recorder teardown") + if(WIN32) + set_tests_properties(agc_driver_host_import_lifetime agc_driver_host_import_mutation_race agc_driver_unit_shadow agc_driver_unit_shadow_budget agc_small_tiled_shadow_label PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + set_tests_properties(agc_recorder_completion_labels agc_recorder_cmask agc_recorder_cube agc_recorder_failed_check PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + set_property(TEST agc_driver_host_import_lifetime APPEND PROPERTY ENVIRONMENT_MODIFICATION + "APS5_RELEASE_UNDER_LOCK=unset:" "APS5_RELEASE_ON_UNLOCK=unset:") + if(WIN32) + add_test(NAME agc_driver_host_import_lifetime_other_family COMMAND agc_driver_recorder_tests --host-import-lifetime-other-family-only) + set_tests_properties(agc_driver_host_import_lifetime_other_family PROPERTIES + ENVIRONMENT "APS5_PIN_WAIT_MS=2000" SKIP_RETURN_CODE 77 TIMEOUT 30 ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + set_property(TEST agc_driver_host_import_lifetime_other_family APPEND PROPERTY ENVIRONMENT_MODIFICATION + "APS5_RELEASE_UNDER_LOCK=unset:" "APS5_RELEASE_ON_UNLOCK=unset:") + endif() +endif() + +target_sources(agc_driver_recorder_tests PRIVATE ${agcVertexRangeHeaders}) + +if(BUILD_TESTING) + add_test(NAME agc_driver_vertex_target_range_copied COMMAND agc_driver_recorder_tests --vertex-target-range-copied) + add_test(NAME agc_driver_vertex_target_range_imported COMMAND agc_driver_recorder_tests --vertex-target-range-imported) + set_tests_properties(agc_driver_vertex_target_range_copied agc_driver_vertex_target_range_imported PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_driver_vertex_target_range_copied agc_driver_vertex_target_range_imported PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_rect_list_corner_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_rect_list_corner_tests.cmake new file mode 100644 index 0000000000..e7cc4adc91 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_rect_list_corner_tests.cmake @@ -0,0 +1 @@ +target_link_libraries(agc_driver_rect_list_corner_tests PRIVATE shader_recompiler_agc_driver) diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_register_key_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_register_key_tests.cmake new file mode 100644 index 0000000000..026970ef58 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_register_key_tests.cmake @@ -0,0 +1,23 @@ +add_test_executable(agc_driver_register_key_tests EXCLUDE_FROM_ALL tests/RegisterKey.cpp) +target_include_directories(agc_driver_register_key_tests PRIVATE + ${LIBS_INCLUDE_DIR} + ${CMAKE_SOURCE_DIR}/core/shader/recompiler + ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR} +) +target_link_libraries(agc_driver_register_key_tests PRIVATE + libSceAgcDriver + libc + libkernel +) +set_target_properties(agc_driver_register_key_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_driver_register_key_tests) + +if(BUILD_TESTING) + set_target_properties(agc_driver_register_key_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_driver_register_key COMMAND agc_driver_register_key_tests) + set_tests_properties(agc_driver_register_key PROPERTIES TIMEOUT 30 ENVIRONMENT "APS5_VERIFY_REGISTER_KEYS=1") + if(WIN32) + set_tests_properties(agc_driver_register_key PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_registration_prepare_budget_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_registration_prepare_budget_tests.cmake new file mode 100644 index 0000000000..4ef7fd83c7 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_registration_prepare_budget_tests.cmake @@ -0,0 +1,13 @@ +add_executable(agc_driver_registration_prepare_budget_tests tests/RegistrationPrepareBudget.cpp) +target_include_directories(agc_driver_registration_prepare_budget_tests PRIVATE ${LIBS_INCLUDE_DIR}) +set_target_properties(agc_driver_registration_prepare_budget_tests PROPERTIES CXX_EXTENSIONS OFF) + +if(MINGW) + target_compile_options(agc_driver_registration_prepare_budget_tests PRIVATE -fasynchronous-unwind-tables) + target_link_options(agc_driver_registration_prepare_budget_tests PRIVATE -static -static-libgcc -static-libstdc++) +endif() + +if(BUILD_TESTING) + add_test(NAME agc_driver_registration_prepare_budget COMMAND agc_driver_registration_prepare_budget_tests) + set_tests_properties(agc_driver_registration_prepare_budget PROPERTIES TIMEOUT 10) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_registration_trace_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_registration_trace_tests.cmake new file mode 100644 index 0000000000..0ef4a91136 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_registration_trace_tests.cmake @@ -0,0 +1,14 @@ +if(BUILD_TESTING) + set_tests_properties(agc_driver_registration_trace PROPERTIES + ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_TRACE_FRAMES=0:1;APS5_TRACE_EVENTS=64" TIMEOUT 30) + set_property(TEST agc_driver_registration_trace APPEND PROPERTY ENVIRONMENT_MODIFICATION + "APS5_TRACE_SECONDS=unset:" "APS5_TRACE_SUMMARY_EVERY=unset:") + add_test(NAME agc_driver_registration_trace_disabled COMMAND ${CMAKE_COMMAND} -E env + --unset=APS5_TRACE_FRAMES --unset=APS5_TRACE_SECONDS --unset=APS5_TRACE_SUMMARY_EVERY + $ disabled) + set_tests_properties(agc_driver_registration_trace_disabled PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_driver_registration_trace_disabled PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_reversed_order_blend_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_reversed_order_blend_tests.cmake new file mode 100644 index 0000000000..5c4381007e --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_reversed_order_blend_tests.cmake @@ -0,0 +1 @@ +target_include_directories(agc_driver_reversed_order_blend_tests PRIVATE $) diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_runtime_formatted_store_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_runtime_formatted_store_tests.cmake new file mode 100644 index 0000000000..b304bfb333 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_runtime_formatted_store_tests.cmake @@ -0,0 +1,17 @@ +if(BUILD_TESTING) + set_tests_properties(agc_driver_runtime_formatted_store PROPERTIES TIMEOUT 30) + foreach(mode IN ITEMS x1 x2 x3 x1_d16 x2_d16 x3_d16 x4_d16) + string(REGEX REPLACE "_d16$" "" components "${mode}") + set(arguments "--${components}") + if(mode MATCHES "_d16$") + list(APPEND arguments --d16) + endif() + add_test(NAME agc_driver_runtime_formatted_store_${mode} COMMAND agc_driver_runtime_formatted_store_tests ${arguments}) + set_tests_properties(agc_driver_runtime_formatted_store_${mode} PROPERTIES + ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_driver_runtime_formatted_store_${mode} PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + endforeach() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_same_queue_label_wait_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_same_queue_label_wait_tests.cmake new file mode 100644 index 0000000000..2740681a95 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_same_queue_label_wait_tests.cmake @@ -0,0 +1,3 @@ +if(BUILD_TESTING) + agc_add_draw_pipeline_test(agc_driver_same_queue_label_wait) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_sample_multisample_target_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_sample_multisample_target_tests.cmake new file mode 100644 index 0000000000..bf0f20fa31 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_sample_multisample_target_tests.cmake @@ -0,0 +1,16 @@ +target_include_directories(agc_driver_sample_multisample_target_tests PRIVATE $) + +if(BUILD_TESTING) + add_test(NAME agc_driver_native_fmask COMMAND agc_driver_sample_multisample_target_tests --native-fmask) + set_tests_properties(agc_driver_native_fmask PROPERTIES TIMEOUT 30 ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_driver_native_fmask PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_driver_native_msaa_vertex_input COMMAND agc_driver_sample_multisample_target_tests --native-vertex-input) + set_tests_properties(agc_driver_native_msaa_vertex_input PROPERTIES + ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" TIMEOUT 30 SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_driver_native_msaa_vertex_input PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_sample_order_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_sample_order_tests.cmake new file mode 100644 index 0000000000..be0352512c --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_sample_order_tests.cmake @@ -0,0 +1,30 @@ +foreach(agcSampleOrderTestVariant IN ITEMS "R8;SampleOrderTexels.comp;-DTEXEL_FORMAT=r8ui" "R16;SampleOrderTexels.comp;-DTEXEL_FORMAT=r16ui" "R32;SampleOrderTexels.comp;-DTEXEL_FORMAT=r32ui" "RG32;SampleOrderTexels.comp;-DTEXEL_FORMAT=rg32ui" "RGBA32;SampleOrderTexels.comp;-DTEXEL_FORMAT=rgba32ui" "FillVertex;SampleOrderFill.vert;-DPLAIN=1" "FillDepth;SampleOrderFill.frag;-DPLAIN=1" "FillStencil;SampleOrderFill.frag;-DSTENCIL=1" "ReadDepth;SampleOrderRead.comp;-DPLAIN=1" "ReadStencil;SampleOrderRead.comp;-DSTENCIL=1" "ReadColor;SampleOrderRead.comp;-DCOLOR=1") + list(GET agcSampleOrderTestVariant 0 agcSampleOrderTestName) + list(GET agcSampleOrderTestVariant 1 agcSampleOrderTestFile) + list(GET agcSampleOrderTestVariant 2 agcSampleOrderTestDefine) + string(TOUPPER "${agcSampleOrderTestName}" agcSampleOrderTestSymbol) + set(agcSampleOrderTestSource ${CMAKE_CURRENT_SOURCE_DIR}/tests/shaders/${agcSampleOrderTestFile}) + set(agcSampleOrderTestSpv ${agcTestShaderGeneratedRoot}/SampleOrderTest${agcSampleOrderTestName}.spv) + set(agcSampleOrderTestHeader ${agcTestShaderGeneratedRoot}/SampleOrderTest${agcSampleOrderTestName}_spv.h) + add_custom_command( + OUTPUT "${agcSampleOrderTestHeader}" + COMMAND ${CMAKE_COMMAND} -E make_directory "${agcTestShaderGeneratedRoot}" + COMMAND "$" -V --target-env vulkan1.1 ${agcSampleOrderTestDefine} -o "${agcSampleOrderTestSpv}" "${agcSampleOrderTestSource}" + COMMAND ${CMAKE_COMMAND} -DINPUT=${agcSampleOrderTestSpv} -DOUTPUT=${agcSampleOrderTestHeader} + -DSYMBOL=SAMPLE_ORDER_TEST_${agcSampleOrderTestSymbol}_SPV -P "${CMAKE_CURRENT_SOURCE_DIR}/embed_spirv.cmake" + DEPENDS "${agcSampleOrderTestSource}" glslang-standalone + VERBATIM + ) + target_sources(agc_driver_sample_order_tests PRIVATE ${agcSampleOrderTestHeader}) +endforeach() +target_include_directories(agc_driver_sample_order_tests PRIVATE ${agcTestShaderGeneratedRoot}) + +if(BUILD_TESTING) + set_tests_properties(agc_driver_sample_order PROPERTIES TIMEOUT 30) + add_test(NAME agc_driver_sample_order_grid_reference COMMAND agc_driver_sample_order_tests --grid-reference) + add_test(NAME agc_driver_sample_order_recipe_depth_locations COMMAND agc_driver_sample_order_tests --recipe-depth-locations) + set_tests_properties(agc_driver_sample_order_grid_reference agc_driver_sample_order_recipe_depth_locations PROPERTIES TIMEOUT 30 ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_driver_sample_order_grid_reference agc_driver_sample_order_recipe_depth_locations PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_sampled_cache_budget_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_sampled_cache_budget_tests.cmake new file mode 100644 index 0000000000..454037a68c --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_sampled_cache_budget_tests.cmake @@ -0,0 +1,34 @@ +if(BUILD_TESTING) + add_test(NAME agc_driver_sampled_cache_budget_memory COMMAND agc_driver_sampled_cache_budget_tests memory) + set_tests_properties(agc_driver_sampled_cache_budget_memory PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77) + add_test(NAME agc_driver_sampled_cache_budget_without_storage_image_multisample COMMAND agc_driver_sampled_cache_budget_tests without-storage-image-multisample) + set_tests_properties(agc_driver_sampled_cache_budget_without_storage_image_multisample PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 TIMEOUT 30) + add_test(NAME agc_sampled_cache_device_selection COMMAND agc_driver_sampled_cache_budget_tests device-selection-cpu) + set_tests_properties(agc_sampled_cache_device_selection PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) + add_test(NAME agc_driver_sampled_cache_device_selection COMMAND agc_driver_sampled_cache_budget_tests device-selection) + set_tests_properties(agc_driver_sampled_cache_device_selection PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_sampled_cache_device_selection agc_driver_sampled_cache_device_selection PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + foreach(imageRecoveryMode IN ITEMS sampled storage srgb repack) + add_test(NAME agc_driver_recover_${imageRecoveryMode}_allocation COMMAND agc_driver_sampled_cache_budget_tests recover-${imageRecoveryMode}) + set_tests_properties(agc_driver_recover_${imageRecoveryMode}_allocation PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_driver_recover_${imageRecoveryMode}_allocation PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + endforeach() + set_property(TEST agc_driver_recover_srgb_allocation APPEND PROPERTY ENVIRONMENT_MODIFICATION "APS5_SRGB_SHADER_DECODE=set:copy") + add_test(NAME agc_driver_resource_cache_storage_admission COMMAND agc_driver_sampled_cache_budget_tests resource-admission) + add_test(NAME agc_driver_resource_cache_oversized_storage_admission COMMAND agc_driver_sampled_cache_budget_tests resource-oversized) + add_test(NAME agc_driver_resource_cache_storage_clear COMMAND agc_driver_sampled_cache_budget_tests resource-clear) + add_test(NAME agc_driver_resource_cache_replaced_texture COMMAND agc_driver_sampled_cache_budget_tests resource-replaced) + add_test(NAME agc_driver_resource_cache_lookup_changed COMMAND agc_driver_sampled_cache_budget_tests resource-lookup-changed) + add_test(NAME agc_driver_resource_cache_collect_refusals COMMAND agc_driver_sampled_cache_budget_tests collect-refusals) + set_tests_properties(agc_driver_resource_cache_storage_admission agc_driver_resource_cache_oversized_storage_admission agc_driver_resource_cache_storage_clear agc_driver_resource_cache_replaced_texture agc_driver_resource_cache_lookup_changed agc_driver_resource_cache_collect_refusals PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_driver_sampled_cache_budget_memory agc_driver_sampled_cache_budget_without_storage_image_multisample agc_driver_resource_cache_storage_admission agc_driver_resource_cache_oversized_storage_admission agc_driver_resource_cache_storage_clear agc_driver_resource_cache_replaced_texture agc_driver_resource_cache_lookup_changed agc_driver_resource_cache_collect_refusals PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_shutdown_threads_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_shutdown_threads_tests.cmake new file mode 100644 index 0000000000..417520f265 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_shutdown_threads_tests.cmake @@ -0,0 +1,17 @@ +target_include_directories(agc_driver_shutdown_threads_tests PRIVATE $) + +if(BUILD_TESTING) + add_test(NAME agc_driver_shutdown_threads_joined COMMAND agc_driver_shutdown_threads_tests --joined) + add_test(NAME agc_driver_shutdown_threads_queued_prebuilds COMMAND agc_driver_shutdown_threads_tests --queued-prebuilds) + add_test(NAME agc_driver_shutdown_threads_compare_helpers COMMAND agc_driver_shutdown_threads_tests --compare-helpers) + add_test(NAME agc_driver_shutdown_threads_draw_committer COMMAND agc_driver_shutdown_threads_tests --draw-committer) + add_test(NAME agc_driver_shutdown_threads_shader_cache_writer COMMAND agc_driver_shutdown_threads_tests --shader-cache-writer) + add_test(NAME agc_driver_shutdown_threads_late_shader_cache COMMAND agc_driver_shutdown_threads_tests --late-shader-cache) + add_test(NAME agc_driver_shutdown_threads_async_log_held COMMAND agc_driver_shutdown_threads_tests --async-log-held) + add_test(NAME agc_driver_shutdown_threads_exit_after_start COMMAND agc_driver_shutdown_threads_tests --exit-after-start) + set_tests_properties(agc_driver_shutdown_threads_joined agc_driver_shutdown_threads_queued_prebuilds agc_driver_shutdown_threads_compare_helpers agc_driver_shutdown_threads_draw_committer agc_driver_shutdown_threads_shader_cache_writer agc_driver_shutdown_threads_late_shader_cache agc_driver_shutdown_threads_async_log_held agc_driver_shutdown_threads_exit_after_start PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 30) + set_tests_properties(agc_driver_shutdown_threads_queued_prebuilds PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_PREBUILD_THREADS=1") + if(WIN32) + set_tests_properties(agc_driver_shutdown_threads_joined agc_driver_shutdown_threads_queued_prebuilds agc_driver_shutdown_threads_compare_helpers agc_driver_shutdown_threads_draw_committer agc_driver_shutdown_threads_shader_cache_writer agc_driver_shutdown_threads_late_shader_cache agc_driver_shutdown_threads_async_log_held agc_driver_shutdown_threads_exit_after_start PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_sparse_buffer_holes_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_sparse_buffer_holes_tests.cmake new file mode 100644 index 0000000000..c04af19917 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_sparse_buffer_holes_tests.cmake @@ -0,0 +1,3 @@ +if(BUILD_TESTING) + set_tests_properties(agc_driver_sparse_buffer_holes PROPERTIES TIMEOUT 30) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_sparse_dma_buf_import_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_sparse_dma_buf_import_tests.cmake new file mode 100644 index 0000000000..c077f7cbe3 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_sparse_dma_buf_import_tests.cmake @@ -0,0 +1,8 @@ +if(BUILD_TESTING AND ANYPS5_REQUIRE_CPU_LEAD_TEST) + add_test(NAME agc_driver_sparse_dma_buf_cpu_lead COMMAND agc_driver_sparse_dma_buf_import_tests --require-cpu-lead) + set_tests_properties(agc_driver_sparse_dma_buf_cpu_lead PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" TIMEOUT 120 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_driver_sparse_dma_buf_cpu_lead PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_sparse_indirect_indices_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_sparse_indirect_indices_tests.cmake new file mode 100644 index 0000000000..6a0be40897 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_sparse_indirect_indices_tests.cmake @@ -0,0 +1,12 @@ +if(BUILD_TESTING) + add_test(NAME agc_driver_sparse_indirect_indices_unreadable COMMAND agc_driver_sparse_indirect_indices_tests --unreadable) + add_test(NAME agc_driver_sparse_indirect_indices_no_size COMMAND agc_driver_sparse_indirect_indices_tests --no-size) + add_test(NAME agc_driver_sparse_indirect_indices_no_size_unreadable COMMAND agc_driver_sparse_indirect_indices_tests --no-size-unreadable) + add_test(NAME agc_driver_sparse_indirect_indices_no_size_unreadable_record COMMAND agc_driver_sparse_indirect_indices_tests --no-size-unreadable-record) + set_tests_properties(agc_driver_sparse_indirect_indices agc_driver_sparse_indirect_indices_unreadable agc_driver_sparse_indirect_indices_no_size agc_driver_sparse_indirect_indices_no_size_unreadable agc_driver_sparse_indirect_indices_no_size_unreadable_record PROPERTIES + ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_driver_sparse_indirect_indices_unreadable agc_driver_sparse_indirect_indices_no_size agc_driver_sparse_indirect_indices_no_size_unreadable agc_driver_sparse_indirect_indices_no_size_unreadable_record PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_staged_clear_sampled_read_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_staged_clear_sampled_read_tests.cmake new file mode 100644 index 0000000000..f982191576 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_staged_clear_sampled_read_tests.cmake @@ -0,0 +1,3 @@ +if(BUILD_TESTING) + agc_add_draw_pipeline_test(agc_driver_staged_clear_sampled_read) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_stencil_null_feedback_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_stencil_null_feedback_tests.cmake new file mode 100644 index 0000000000..53a2513474 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_stencil_null_feedback_tests.cmake @@ -0,0 +1,4 @@ +if(ANYPS5_ENABLE_SPIRV_TOOLS) + target_compile_definitions(agc_driver_stencil_null_feedback_tests PRIVATE ANYPS5_ENABLE_SPIRV_TOOLS=1) + target_link_libraries(agc_driver_stencil_null_feedback_tests PRIVATE SPIRV-Tools-static) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_stencil_replay_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_stencil_replay_tests.cmake new file mode 100644 index 0000000000..d6b26bf7da --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_stencil_replay_tests.cmake @@ -0,0 +1,8 @@ +if(BUILD_TESTING) + add_test(NAME agc_driver_stencil_replay_no_gpl COMMAND agc_driver_stencil_replay_tests) + set_tests_properties(agc_driver_stencil_replay_no_gpl PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_GPL=1" TIMEOUT 30 SKIP_RETURN_CODE 77) + if(WIN32) + set_tests_properties(agc_driver_stencil_replay_no_gpl PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_storage_cache_budget_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_storage_cache_budget_tests.cmake new file mode 100644 index 0000000000..817f77fbf8 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_storage_cache_budget_tests.cmake @@ -0,0 +1,9 @@ +if(BUILD_TESTING) + set_tests_properties(agc_driver_storage_cache_budget PROPERTIES TIMEOUT 30) + add_test(NAME agc_driver_storage_cache_retained_batch COMMAND agc_driver_storage_cache_budget_tests --retained-batch) + set_tests_properties(agc_driver_storage_cache_retained_batch PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_driver_storage_cache_retained_batch PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_storage_file_write_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_storage_file_write_tests.cmake new file mode 100644 index 0000000000..bc58d8d781 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_storage_file_write_tests.cmake @@ -0,0 +1,5 @@ +target_link_libraries(agc_driver_storage_file_write_tests PRIVATE libkernel) + +if(BUILD_TESTING) + set_tests_properties(agc_driver_storage_file_write PROPERTIES TIMEOUT 30 ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_SUSPEND_DRAIN=1") +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_storage_write_back_overhang_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_storage_write_back_overhang_tests.cmake new file mode 100644 index 0000000000..688fd4820e --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_storage_write_back_overhang_tests.cmake @@ -0,0 +1,3 @@ +if(BUILD_TESTING) + agc_add_draw_pipeline_test(agc_driver_storage_write_back_overhang) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_store_idle_results_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_store_idle_results_tests.cmake new file mode 100644 index 0000000000..360ac39859 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_store_idle_results_tests.cmake @@ -0,0 +1,9 @@ +if(BUILD_TESTING) + add_test(NAME agc_driver_store_idle_results_wake COMMAND agc_driver_store_idle_results_tests --idle-epoch-wake) + set_tests_properties(agc_driver_store_idle_results_wake PROPERTIES + ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_driver_store_idle_results_wake PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_store_over_untracked_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_store_over_untracked_tests.cmake new file mode 100644 index 0000000000..0c1ec50631 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_store_over_untracked_tests.cmake @@ -0,0 +1,9 @@ +if(BUILD_TESTING) + add_test(NAME agc_driver_store_pending_identity COMMAND agc_driver_store_over_untracked_tests --pending-identity) + set_tests_properties(agc_driver_store_pending_identity PROPERTIES + ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_driver_store_pending_identity PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_submit_progress_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_submit_progress_tests.cmake new file mode 100644 index 0000000000..eb7c0a6323 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_submit_progress_tests.cmake @@ -0,0 +1,17 @@ +if(BUILD_TESTING) + add_test(NAME agc_submit_progress COMMAND agc_driver_submit_progress_tests) + set_tests_properties(agc_submit_progress PROPERTIES + ENVIRONMENT "APS5_SUBMIT_PROGRESS=1" TIMEOUT 30 SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_submit_progress PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$;PATH=path_list_prepend:$") + endif() + add_test(NAME agc_submit_progress_no_timeline COMMAND agc_driver_submit_progress_tests --fallback-only) + set_tests_properties(agc_submit_progress_no_timeline PROPERTIES + ENVIRONMENT "APS5_SUBMIT_PROGRESS=1;APS5_NO_TIMELINE=1" + TIMEOUT 30 SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_submit_progress_no_timeline PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$;PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_swap_alt_blend_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_swap_alt_blend_tests.cmake new file mode 100644 index 0000000000..1807700ee1 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_swap_alt_blend_tests.cmake @@ -0,0 +1 @@ +target_include_directories(agc_driver_swap_alt_blend_tests PRIVATE $) diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_target_address_window_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_target_address_window_tests.cmake new file mode 100644 index 0000000000..85a7e1ae38 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_target_address_window_tests.cmake @@ -0,0 +1,10 @@ +if(BUILD_TESTING) + add_test_executable(agc_driver_target_address_window_tests tests/TargetAddressWindow.cpp) + target_link_libraries(agc_driver_target_address_window_tests PRIVATE libc) + configure_windows_unwind(agc_driver_target_address_window_tests) + add_test(NAME agc_driver_target_address_window COMMAND agc_driver_target_address_window_tests) + if(WIN32) + set_tests_properties(agc_driver_target_address_window PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_tessellation_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_tessellation_tests.cmake new file mode 100644 index 0000000000..f616a8f244 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_tessellation_tests.cmake @@ -0,0 +1,9 @@ +if(BUILD_TESTING) + add_test(NAME agc_driver_tessellation_depth_range_remap COMMAND agc_driver_tessellation_tests --depth-remap) + set_tests_properties(agc_driver_tessellation_depth_range_remap PROPERTIES + ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_driver_tessellation_depth_range_remap PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_tests.cmake new file mode 100644 index 0000000000..d67511a325 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_tests.cmake @@ -0,0 +1,58 @@ +add_test_executable(agc_driver_tests EXCLUDE_FROM_ALL + tests/Submit.cpp +) + +target_include_directories(agc_driver_tests PRIVATE + ${LIBS_INCLUDE_DIR} + ${CMAKE_SOURCE_DIR}/core/shader/recompiler + ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR} + ${ANYPS5_SPIRV_HEADERS_INCLUDE_DIR} +) + +target_link_libraries(agc_driver_tests PRIVATE + libSceAgcDriver + libkernel + libc +) + +set_target_properties(agc_driver_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_driver_tests) + +if(BUILD_TESTING) + add_test(NAME agc_driver_readonly_resummarize COMMAND agc_driver_tests --readonly-resummarize) + set_tests_properties(agc_driver_readonly_resummarize PROPERTIES TIMEOUT 10) + add_test(NAME agc_driver_eop_interrupts COMMAND agc_driver_tests --eop-interrupts) + set_tests_properties(agc_driver_eop_interrupts PROPERTIES TIMEOUT 60) + if(WIN32) + set_tests_properties(agc_driver_readonly_resummarize agc_driver_eop_interrupts PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_driver_small_copy_sync COMMAND agc_driver_tests --small-copy-sync) + set_tests_properties(agc_driver_small_copy_sync PROPERTIES TIMEOUT 30 ENVIRONMENT "APS5_COPY_SYNC=1" SKIP_RETURN_CODE 77) + if(WIN32) + set_tests_properties(agc_driver_small_copy_sync PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + agc_add_default_test(agc_driver_tests) + set_tests_properties(agc_driver_draw_pipeline_trace PROPERTIES + ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_PIPELINED_DRAWS=8;APS5_TRACE_FRAMES=0:1;APS5_TRACE_EVENTS=64" TIMEOUT 30) + set_property(TEST agc_driver_draw_pipeline_trace APPEND PROPERTY ENVIRONMENT_MODIFICATION + "APS5_TRACE_SECONDS=unset:" "APS5_TRACE_SUMMARY_EVERY=unset:") + add_test(NAME agc_driver_draw_pipeline_trace_disabled COMMAND ${CMAKE_COMMAND} -E env + --unset=APS5_TRACE_FRAMES --unset=APS5_TRACE_SECONDS --unset=APS5_TRACE_SUMMARY_EVERY + $ disabled) + set_tests_properties(agc_driver_draw_pipeline_trace_disabled PROPERTIES ENVIRONMENT "APS5_PIPELINED_DRAWS=8" SKIP_RETURN_CODE 77 TIMEOUT 30) + add_test(NAME agc_driver_draw_finisher_trace COMMAND agc_driver_draw_pipeline_trace_tests finisher) + set_tests_properties(agc_driver_draw_finisher_trace PROPERTIES + ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_DRAW_PIPELINE=1;APS5_PIPELINED_DRAWS=8;APS5_TRACE_FRAMES=0:1;APS5_TRACE_EVENTS=64" SKIP_RETURN_CODE 77 TIMEOUT 30) + set_property(TEST agc_driver_draw_finisher_trace APPEND PROPERTY ENVIRONMENT_MODIFICATION + "APS5_TRACE_SECONDS=unset:" "APS5_TRACE_SUMMARY_EVERY=unset:") + add_test(NAME agc_driver_draw_finisher_trace_disabled COMMAND ${CMAKE_COMMAND} -E env + --unset=APS5_TRACE_FRAMES --unset=APS5_TRACE_SECONDS --unset=APS5_TRACE_SUMMARY_EVERY + $ finisher-disabled) + set_tests_properties(agc_driver_draw_finisher_trace_disabled PROPERTIES ENVIRONMENT "APS5_DRAW_PIPELINE=1;APS5_PIPELINED_DRAWS=8" SKIP_RETURN_CODE 77 TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_driver_draw_pipeline_trace_disabled agc_driver_draw_finisher_trace agc_driver_draw_finisher_trace_disabled PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_uint8x4_color_target_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_uint8x4_color_target_tests.cmake new file mode 100644 index 0000000000..cdb8208427 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_uint8x4_color_target_tests.cmake @@ -0,0 +1,8 @@ +if(BUILD_TESTING) + add_test(NAME agc_driver_uint8x4_color_target_no_resident COMMAND agc_driver_uint8x4_color_target_tests) + set_tests_properties(agc_driver_uint8x4_color_target_no_resident PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_RESIDENT_TARGETS=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_driver_uint8x4_color_target_no_resident PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_uint_color_target_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_uint_color_target_tests.cmake new file mode 100644 index 0000000000..84e09835c1 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_uint_color_target_tests.cmake @@ -0,0 +1 @@ +target_include_directories(agc_driver_uint_color_target_tests PRIVATE $) diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_unimported_label_order_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_unimported_label_order_tests.cmake new file mode 100644 index 0000000000..fe6fd86b09 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_unimported_label_order_tests.cmake @@ -0,0 +1,3 @@ +if(BUILD_TESTING) + agc_add_draw_pipeline_test(agc_driver_unimported_label_order) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_unsupported_diagnostics_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_unsupported_diagnostics_tests.cmake new file mode 100644 index 0000000000..a9c3c84ac0 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_unsupported_diagnostics_tests.cmake @@ -0,0 +1,11 @@ +if(BUILD_TESTING) + add_test_executable(agc_driver_unsupported_diagnostics_tests tests/UnsupportedDiagnostics.cpp) + target_include_directories(agc_driver_unsupported_diagnostics_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(agc_driver_unsupported_diagnostics_tests PRIVATE libSceAgcDriver) + configure_windows_unwind(agc_driver_unsupported_diagnostics_tests) + add_test(NAME agc_driver_unsupported_diagnostics COMMAND agc_driver_unsupported_diagnostics_tests) + if(WIN32) + set_tests_properties(agc_driver_unsupported_diagnostics PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_vertex_clip_cull_draw_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_vertex_clip_cull_draw_tests.cmake new file mode 100644 index 0000000000..e902e756a5 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_vertex_clip_cull_draw_tests.cmake @@ -0,0 +1,8 @@ +if(BUILD_TESTING) + add_test(NAME agc_driver_vertex_clip_cull_draw_no_key COMMAND agc_driver_vertex_clip_cull_draw_tests no-key) + set_tests_properties(agc_driver_vertex_clip_cull_draw_no_key PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_DRAW_KEY=1" SKIP_RETURN_CODE 77) + if(WIN32) + set_tests_properties(agc_driver_vertex_clip_cull_draw_no_key PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_vulkan_test_device_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_vulkan_test_device_tests.cmake new file mode 100644 index 0000000000..45e1d06485 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_vulkan_test_device_tests.cmake @@ -0,0 +1,10 @@ +if(BUILD_TESTING) + add_test(NAME agc_driver_vulkan_test_device_no_driver COMMAND agc_driver_vulkan_test_device_tests --no-driver) + set_tests_properties(agc_driver_vulkan_test_device_no_driver PROPERTIES + ENVIRONMENT "VK_DRIVER_FILES=${CMAKE_CURRENT_BINARY_DIR}/no-vulkan-driver.json;VK_ICD_FILENAMES=${CMAKE_CURRENT_BINARY_DIR}/no-vulkan-driver.json" + TIMEOUT 30 SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_driver_vulkan_test_device_no_driver PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_wait_shutdown_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_wait_shutdown_tests.cmake new file mode 100644 index 0000000000..153d6a9388 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_wait_shutdown_tests.cmake @@ -0,0 +1,19 @@ +add_test_executable(agc_driver_wait_shutdown_tests EXCLUDE_FROM_ALL tests/WaitShutdown.cpp) +target_include_directories(agc_driver_wait_shutdown_tests PRIVATE ${LIBS_INCLUDE_DIR}) +target_link_libraries(agc_driver_wait_shutdown_tests PRIVATE libSceAgcDriver libkernel libc) +set_target_properties(agc_driver_wait_shutdown_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_driver_wait_shutdown_tests) + +if(BUILD_TESTING) + set_target_properties(agc_driver_wait_shutdown_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_driver_wait_shutdown COMMAND agc_driver_wait_shutdown_tests) + set_tests_properties(agc_driver_wait_shutdown PROPERTIES + ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_GPU_WAIT_TIMEOUT_MS=20" + TIMEOUT 10 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + add_test(NAME agc_driver_resolution_shutdown COMMAND agc_driver_wait_shutdown_tests --resolution-shutdown) + set_tests_properties(agc_driver_resolution_shutdown PROPERTIES TIMEOUT 10 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_driver_wait_shutdown agc_driver_resolution_shutdown PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_write_data_written_ahead_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_write_data_written_ahead_tests.cmake new file mode 100644 index 0000000000..46785e7b74 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_write_data_written_ahead_tests.cmake @@ -0,0 +1,3 @@ +if(BUILD_TESTING) + agc_add_draw_pipeline_test(agc_driver_write_data_written_ahead) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_embedded_vertex_fetch_aliasing_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_embedded_vertex_fetch_aliasing_tests.cmake new file mode 100644 index 0000000000..f845ed95e0 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_embedded_vertex_fetch_aliasing_tests.cmake @@ -0,0 +1,13 @@ +add_test_executable(agc_embedded_vertex_fetch_aliasing_tests EXCLUDE_FROM_ALL tests/EmbeddedVertexFetchAliasing.cpp) +target_link_libraries(agc_embedded_vertex_fetch_aliasing_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_embedded_vertex_fetch_aliasing_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_embedded_vertex_fetch_aliasing_tests) + +if(BUILD_TESTING) + set_target_properties(agc_embedded_vertex_fetch_aliasing_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_embedded_vertex_fetch_aliasing COMMAND agc_embedded_vertex_fetch_aliasing_tests) + if(WIN32) + set_tests_properties(agc_embedded_vertex_fetch_aliasing PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_embedded_vertex_fetch_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_embedded_vertex_fetch_tests.cmake new file mode 100644 index 0000000000..486f1eb67b --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_embedded_vertex_fetch_tests.cmake @@ -0,0 +1,13 @@ +add_test_executable(agc_embedded_vertex_fetch_tests EXCLUDE_FROM_ALL tests/EmbeddedVertexFetch.cpp) +target_link_libraries(agc_embedded_vertex_fetch_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_embedded_vertex_fetch_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_embedded_vertex_fetch_tests) + +if(BUILD_TESTING) + set_target_properties(agc_embedded_vertex_fetch_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_embedded_vertex_fetch COMMAND agc_embedded_vertex_fetch_tests) + if(WIN32) + set_tests_properties(agc_embedded_vertex_fetch PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_f16_single_convert_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_f16_single_convert_tests.cmake new file mode 100644 index 0000000000..966bb7cd1d --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_f16_single_convert_tests.cmake @@ -0,0 +1,8 @@ +add_test_executable(agc_f16_single_convert_tests EXCLUDE_FROM_ALL tests/F16SingleConvert.cpp) +target_link_libraries(agc_f16_single_convert_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_f16_single_convert_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_f16_single_convert_tests) + +if(BUILD_TESTING) + agc_add_default_test(agc_f16_single_convert_tests) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_f32_denorm_preserve_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_f32_denorm_preserve_tests.cmake new file mode 100644 index 0000000000..1d9197edea --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_f32_denorm_preserve_tests.cmake @@ -0,0 +1,13 @@ +add_test_executable(agc_f32_denorm_preserve_tests EXCLUDE_FROM_ALL tests/F32DenormPreserve.cpp) +target_link_libraries(agc_f32_denorm_preserve_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_f32_denorm_preserve_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_f32_denorm_preserve_tests) + +if(BUILD_TESTING) + set_target_properties(agc_f32_denorm_preserve_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_f32_denorm_preserve COMMAND agc_f32_denorm_preserve_tests) + set_tests_properties(agc_f32_denorm_preserve PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1") + if(WIN32) + set_tests_properties(agc_f32_denorm_preserve PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_flat_scratch_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_flat_scratch_tests.cmake new file mode 100644 index 0000000000..6e733563e4 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_flat_scratch_tests.cmake @@ -0,0 +1,10 @@ +if(BUILD_TESTING) + add_test_executable(agc_flat_scratch_tests tests/FlatScratch.cpp) + target_link_libraries(agc_flat_scratch_tests PRIVATE shader_recompiler_agc_driver libc) + configure_windows_unwind(agc_flat_scratch_tests) + add_test(NAME agc_flat_scratch COMMAND agc_flat_scratch_tests) + set_tests_properties(agc_flat_scratch PROPERTIES TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_flat_scratch PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_float16_conversion_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_float16_conversion_tests.cmake new file mode 100644 index 0000000000..89971b631e --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_float16_conversion_tests.cmake @@ -0,0 +1,13 @@ +add_test_executable(agc_float16_conversion_tests EXCLUDE_FROM_ALL tests/Float16Conversion.cpp) +target_link_libraries(agc_float16_conversion_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_float16_conversion_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_float16_conversion_tests) + +if(BUILD_TESTING) + set_target_properties(agc_float16_conversion_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_float16_conversion COMMAND agc_float16_conversion_tests) + set_tests_properties(agc_float16_conversion PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1") + if(WIN32) + set_tests_properties(agc_float16_conversion PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_float32_flush_control_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_float32_flush_control_tests.cmake new file mode 100644 index 0000000000..63d232de9d --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_float32_flush_control_tests.cmake @@ -0,0 +1,9 @@ +add_test_executable(agc_float32_flush_control_tests EXCLUDE_FROM_ALL tests/Float32FlushControl.cpp) +target_include_directories(agc_float32_flush_control_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) +set_target_properties(agc_float32_flush_control_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_float32_flush_control_tests) + +if(BUILD_TESTING) + set_target_properties(agc_float32_flush_control_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_float32_flush_control COMMAND agc_float32_flush_control_tests) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_fma_mix_once_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_fma_mix_once_tests.cmake new file mode 100644 index 0000000000..b274076e55 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_fma_mix_once_tests.cmake @@ -0,0 +1,8 @@ +add_test_executable(agc_fma_mix_once_tests EXCLUDE_FROM_ALL tests/FmaMixOnce.cpp) +target_link_libraries(agc_fma_mix_once_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_fma_mix_once_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_fma_mix_once_tests) + +if(BUILD_TESTING) + agc_add_default_test(agc_fma_mix_once_tests) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_formatted_buffer_byte_stores_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_formatted_buffer_byte_stores_tests.cmake new file mode 100644 index 0000000000..5156ccd172 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_formatted_buffer_byte_stores_tests.cmake @@ -0,0 +1,8 @@ +add_test_executable(agc_formatted_buffer_byte_stores_tests EXCLUDE_FROM_ALL tests/FormattedBufferByteStores.cpp) +target_link_libraries(agc_formatted_buffer_byte_stores_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_formatted_buffer_byte_stores_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_formatted_buffer_byte_stores_tests) + +if(BUILD_TESTING) + agc_add_default_test(agc_formatted_buffer_byte_stores_tests) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_formatted_buffer_once_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_formatted_buffer_once_tests.cmake new file mode 100644 index 0000000000..b7988ff07d --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_formatted_buffer_once_tests.cmake @@ -0,0 +1,8 @@ +add_test_executable(agc_formatted_buffer_once_tests EXCLUDE_FROM_ALL tests/FormattedBufferOnce.cpp) +target_link_libraries(agc_formatted_buffer_once_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_formatted_buffer_once_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_formatted_buffer_once_tests) + +if(BUILD_TESTING) + agc_add_default_test(agc_formatted_buffer_once_tests) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_fragment_barycentric_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_fragment_barycentric_tests.cmake new file mode 100644 index 0000000000..82731929c8 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_fragment_barycentric_tests.cmake @@ -0,0 +1,9 @@ +add_test_executable(agc_fragment_barycentric_tests EXCLUDE_FROM_ALL tests/FragmentBarycentric.cpp) +target_include_directories(agc_fragment_barycentric_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) +set_target_properties(agc_fragment_barycentric_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_fragment_barycentric_tests) + +if(BUILD_TESTING) + set_target_properties(agc_fragment_barycentric_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_fragment_barycentric COMMAND agc_fragment_barycentric_tests) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_frame_capture_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_frame_capture_tests.cmake new file mode 100644 index 0000000000..45abdbb32e --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_frame_capture_tests.cmake @@ -0,0 +1,13 @@ +if(BUILD_TESTING) + add_test_executable(agc_frame_capture_tests tests/FrameCapture.cpp Execution/src/FrameCapture.cpp) + target_include_directories(agc_frame_capture_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(agc_frame_capture_tests PRIVATE libc libzstd_static) + set_target_properties(agc_frame_capture_tests PROPERTIES CXX_EXTENSIONS OFF) + configure_windows_unwind(agc_frame_capture_tests) + add_test(NAME agc_frame_capture COMMAND agc_frame_capture_tests) + set_tests_properties(agc_frame_capture PROPERTIES TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_frame_capture PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_frame_dump_io_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_frame_dump_io_tests.cmake new file mode 100644 index 0000000000..65c2c8e8be --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_frame_dump_io_tests.cmake @@ -0,0 +1,12 @@ +if(BUILD_TESTING) + add_test_executable(agc_frame_dump_io_tests tests/FrameDumpIo.cpp) + target_include_directories(agc_frame_dump_io_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(agc_frame_dump_io_tests PRIVATE libc) + configure_windows_unwind(agc_frame_dump_io_tests) + add_test(NAME agc_frame_dump_io COMMAND agc_frame_dump_io_tests) + set_tests_properties(agc_frame_dump_io PROPERTIES TIMEOUT 20) + if(WIN32) + set_tests_properties(agc_frame_dump_io PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_gcn_decode_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_gcn_decode_tests.cmake new file mode 100644 index 0000000000..789a4d72e6 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_gcn_decode_tests.cmake @@ -0,0 +1,13 @@ +add_test_executable(agc_gcn_decode_tests EXCLUDE_FROM_ALL tests/GcnDecode.cpp) +target_link_libraries(agc_gcn_decode_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_gcn_decode_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_gcn_decode_tests) + +if(BUILD_TESTING) + set_target_properties(agc_gcn_decode_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_gcn_decode COMMAND agc_gcn_decode_tests) + if(WIN32) + set_tests_properties(agc_gcn_decode PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_guarded_memory_loads_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_guarded_memory_loads_tests.cmake new file mode 100644 index 0000000000..0d229fdfa0 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_guarded_memory_loads_tests.cmake @@ -0,0 +1,14 @@ +add_test_executable(agc_guarded_memory_loads_tests EXCLUDE_FROM_ALL tests/GuardedMemoryLoads.cpp) +target_link_libraries(agc_guarded_memory_loads_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_guarded_memory_loads_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_guarded_memory_loads_tests) + +if(BUILD_TESTING) + set_target_properties(agc_guarded_memory_loads_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_guarded_memory_loads COMMAND agc_guarded_memory_loads_tests) + set_tests_properties(agc_guarded_memory_loads PROPERTIES TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_guarded_memory_loads PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_handoff_spin_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_handoff_spin_tests.cmake new file mode 100644 index 0000000000..d4bfed2427 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_handoff_spin_tests.cmake @@ -0,0 +1,12 @@ +if(BUILD_TESTING) + add_test_executable(agc_handoff_spin_tests tests/HandoffSpin.cpp) + target_include_directories(agc_handoff_spin_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(agc_handoff_spin_tests PRIVATE libc) + configure_windows_unwind(agc_handoff_spin_tests) + add_test(NAME agc_handoff_spin COMMAND agc_handoff_spin_tests) + set_tests_properties(agc_handoff_spin PROPERTIES TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_handoff_spin PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_host_hdr_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_host_hdr_tests.cmake new file mode 100644 index 0000000000..332c5c52c2 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_host_hdr_tests.cmake @@ -0,0 +1,14 @@ +add_test_executable(agc_host_hdr_tests EXCLUDE_FROM_ALL tests/HostHdr.cpp) +target_include_directories(agc_host_hdr_tests PRIVATE ${LIBS_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/core/shader/recompiler ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) +target_link_libraries(agc_host_hdr_tests PRIVATE libSceAgcDriver libc) +set_target_properties(agc_host_hdr_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_host_hdr_tests) + +if(BUILD_TESTING) + set_target_properties(agc_host_hdr_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_host_hdr COMMAND agc_host_hdr_tests) + if(WIN32) + set_tests_properties(agc_host_hdr PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_host_import_retire_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_host_import_retire_tests.cmake new file mode 100644 index 0000000000..bdf9ca7382 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_host_import_retire_tests.cmake @@ -0,0 +1,15 @@ +add_test_executable(agc_host_import_retire_tests EXCLUDE_FROM_ALL tests/HostImportRetireHold.cpp) +target_include_directories(agc_host_import_retire_tests PRIVATE ${LIBS_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/core/shader/recompiler ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) +target_link_libraries(agc_host_import_retire_tests PRIVATE libSceAgcDriver libc) +set_target_properties(agc_host_import_retire_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_host_import_retire_tests) +target_sources(agc_host_import_retire_tests PRIVATE tests/HostImportFailure.cpp) + +if(BUILD_TESTING) + set_target_properties(agc_host_import_retire_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_host_import_retire COMMAND agc_host_import_retire_tests) + if(WIN32) + set_tests_properties(agc_host_import_retire PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_host_import_sparse_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_host_import_sparse_tests.cmake new file mode 100644 index 0000000000..df60c3477f --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_host_import_sparse_tests.cmake @@ -0,0 +1,15 @@ +add_test_executable(agc_host_import_sparse_tests EXCLUDE_FROM_ALL tests/HostImportSparseDmaBuf.cpp) +target_include_directories(agc_host_import_sparse_tests PRIVATE ${LIBS_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/core/shader/recompiler ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) +target_link_libraries(agc_host_import_sparse_tests PRIVATE libSceAgcDriver libc) +set_target_properties(agc_host_import_sparse_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_host_import_sparse_tests) + +if(BUILD_TESTING) + set_target_properties(agc_host_import_sparse_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_host_import_sparse COMMAND agc_host_import_sparse_tests) + set_tests_properties(agc_host_import_sparse PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_host_import_sparse PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_host_report_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_host_report_tests.cmake new file mode 100644 index 0000000000..524a09fb9c --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_host_report_tests.cmake @@ -0,0 +1,18 @@ +add_test_executable(agc_host_report_tests EXCLUDE_FROM_ALL + tests/HostReport.cpp + Execution/src/HostReport.cpp +) +target_include_directories(agc_host_report_tests PRIVATE ${LIBS_INCLUDE_DIR}) +set_target_properties(agc_host_report_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_host_report_tests) + +if(BUILD_TESTING) + set_target_properties(agc_host_report_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_host_report COMMAND agc_host_report_tests) + set_tests_properties(agc_host_report PROPERTIES TIMEOUT 20) + if(MINGW) + target_link_libraries(agc_host_report_tests PRIVATE libc) + set_tests_properties(agc_host_report PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_host_report_vulkan_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_host_report_vulkan_tests.cmake new file mode 100644 index 0000000000..b55ef7f3eb --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_host_report_vulkan_tests.cmake @@ -0,0 +1,19 @@ +add_test_executable(agc_host_report_vulkan_tests EXCLUDE_FROM_ALL + tests/HostReportVulkan.cpp + Execution/src/HostReportVulkan.cpp + Execution/src/HostReport.cpp +) +target_include_directories(agc_host_report_vulkan_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) +set_target_properties(agc_host_report_vulkan_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_host_report_vulkan_tests) + +if(BUILD_TESTING) + set_target_properties(agc_host_report_vulkan_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_host_report_vulkan COMMAND agc_host_report_vulkan_tests) + set_tests_properties(agc_host_report_vulkan PROPERTIES TIMEOUT 20) + if(MINGW) + target_link_libraries(agc_host_report_vulkan_tests PRIVATE libc) + set_tests_properties(agc_host_report_vulkan PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_integer_folding_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_integer_folding_tests.cmake new file mode 100644 index 0000000000..1690c2425d --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_integer_folding_tests.cmake @@ -0,0 +1,13 @@ +add_test_executable(agc_integer_folding_tests EXCLUDE_FROM_ALL tests/IntegerFolding.cpp) +target_link_libraries(agc_integer_folding_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_integer_folding_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_integer_folding_tests) + +if(BUILD_TESTING) + set_target_properties(agc_integer_folding_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_integer_folding COMMAND agc_integer_folding_tests) + if(WIN32) + set_tests_properties(agc_integer_folding PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_integer_narrowing_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_integer_narrowing_tests.cmake new file mode 100644 index 0000000000..179b8b0194 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_integer_narrowing_tests.cmake @@ -0,0 +1,8 @@ +add_test_executable(agc_integer_narrowing_tests EXCLUDE_FROM_ALL tests/IntegerNarrowing.cpp) +target_link_libraries(agc_integer_narrowing_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_integer_narrowing_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_integer_narrowing_tests) + +if(BUILD_TESTING) + agc_add_default_test(agc_integer_narrowing_tests) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_ir_reclaim_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_ir_reclaim_tests.cmake new file mode 100644 index 0000000000..8e5b7c6ff9 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_ir_reclaim_tests.cmake @@ -0,0 +1,8 @@ +add_test_executable(agc_ir_reclaim_tests EXCLUDE_FROM_ALL tests/IrReclaim.cpp) +target_link_libraries(agc_ir_reclaim_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_ir_reclaim_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_ir_reclaim_tests) + +if(BUILD_TESTING) + agc_add_default_test(agc_ir_reclaim_tests) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_layer_input_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_layer_input_tests.cmake new file mode 100644 index 0000000000..4b36f4ec69 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_layer_input_tests.cmake @@ -0,0 +1,13 @@ +add_test_executable(agc_layer_input_tests EXCLUDE_FROM_ALL tests/LayerInput.cpp) +target_link_libraries(agc_layer_input_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_layer_input_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_layer_input_tests) + +if(BUILD_TESTING) + set_target_properties(agc_layer_input_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_layer_input COMMAND agc_layer_input_tests) + set_tests_properties(agc_layer_input PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1") + if(WIN32) + set_tests_properties(agc_layer_input PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_lds_lock_budget_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_lds_lock_budget_tests.cmake new file mode 100644 index 0000000000..bf557efcde --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_lds_lock_budget_tests.cmake @@ -0,0 +1,14 @@ +add_test_executable(agc_lds_lock_budget_tests EXCLUDE_FROM_ALL tests/LdsLockBudget.cpp) +target_link_libraries(agc_lds_lock_budget_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_lds_lock_budget_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_lds_lock_budget_tests) + +if(BUILD_TESTING) + set_target_properties(agc_lds_lock_budget_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_lds_lock_budget COMMAND agc_lds_lock_budget_tests) + set_tests_properties(agc_lds_lock_budget PROPERTIES TIMEOUT 30 ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_lds_lock_budget PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_locks_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_locks_tests.cmake new file mode 100644 index 0000000000..acfd1f1e58 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_locks_tests.cmake @@ -0,0 +1,14 @@ +add_test_executable(agc_locks_tests EXCLUDE_FROM_ALL tests/Locks.cpp) +target_include_directories(agc_locks_tests PRIVATE + ${LIBS_INCLUDE_DIR} + ${CMAKE_SOURCE_DIR}/core/shader/recompiler + ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR} + ${ANYPS5_SPIRV_HEADERS_INCLUDE_DIR} +) +target_link_libraries(agc_locks_tests PRIVATE libSceAgcDriver libc) +set_target_properties(agc_locks_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_locks_tests) + +if(BUILD_TESTING) + agc_add_default_test(agc_locks_tests) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_masked_select_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_masked_select_tests.cmake new file mode 100644 index 0000000000..0872d3d3af --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_masked_select_tests.cmake @@ -0,0 +1,8 @@ +add_test_executable(agc_masked_select_tests EXCLUDE_FROM_ALL tests/MaskedSelect.cpp) +target_link_libraries(agc_masked_select_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_masked_select_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_masked_select_tests) + +if(BUILD_TESTING) + agc_add_default_test(agc_masked_select_tests) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_mesh_output_budget_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_mesh_output_budget_tests.cmake new file mode 100644 index 0000000000..5b84f54dbc --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_mesh_output_budget_tests.cmake @@ -0,0 +1,9 @@ +add_test_executable(agc_mesh_output_budget_tests EXCLUDE_FROM_ALL tests/MeshOutputBudget.cpp) +target_include_directories(agc_mesh_output_budget_tests PRIVATE ${LIBS_INCLUDE_DIR}) +target_link_libraries(agc_mesh_output_budget_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_mesh_output_budget_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_mesh_output_budget_tests) + +if(BUILD_TESTING) + agc_add_default_test(agc_mesh_output_budget_tests) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_mubuf_lds_decode_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_mubuf_lds_decode_tests.cmake new file mode 100644 index 0000000000..17e79b4d30 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_mubuf_lds_decode_tests.cmake @@ -0,0 +1,13 @@ +add_test_executable(agc_mubuf_lds_decode_tests EXCLUDE_FROM_ALL tests/MubufLdsDecode.cpp) +target_link_libraries(agc_mubuf_lds_decode_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_mubuf_lds_decode_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_mubuf_lds_decode_tests) + +if(BUILD_TESTING) + set_target_properties(agc_mubuf_lds_decode_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_mubuf_lds_decode COMMAND agc_mubuf_lds_decode_tests) + if(WIN32) + set_tests_properties(agc_mubuf_lds_decode PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_pad_status_overlay_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_pad_status_overlay_tests.cmake new file mode 100644 index 0000000000..ef1914bcbb --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_pad_status_overlay_tests.cmake @@ -0,0 +1,93 @@ +add_test_executable(agc_performance_overlay_statistics_tests EXCLUDE_FROM_ALL + tests/PerformanceOverlayStatistics.cpp +) +target_include_directories(agc_performance_overlay_statistics_tests PRIVATE + ${LIBS_INCLUDE_DIR} + ${CMAKE_SOURCE_DIR}/core/shader/recompiler + ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR} +) +target_link_libraries(agc_performance_overlay_statistics_tests PRIVATE + libSceAgcDriver + libc +) +set_target_properties(agc_performance_overlay_statistics_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_performance_overlay_statistics_tests) + +add_test_executable(agc_keyboard_overlay_tests EXCLUDE_FROM_ALL + tests/KeyboardOverlay.cpp + ${CMAKE_SOURCE_DIR}/core/libs/prx/libSceImeDialog/src/PadKeyboard.cpp +) +target_include_directories(agc_keyboard_overlay_tests PRIVATE + ${LIBS_INCLUDE_DIR} + ${CMAKE_SOURCE_DIR}/core/shader/recompiler + ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR} +) +target_link_libraries(agc_keyboard_overlay_tests PRIVATE + libSceAgcDriver + libc +) +set_target_properties(agc_keyboard_overlay_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_keyboard_overlay_tests) + +add_test_executable(agc_pad_status_overlay_tests EXCLUDE_FROM_ALL + tests/PadStatusOverlay.cpp +) +target_include_directories(agc_pad_status_overlay_tests PRIVATE + ${LIBS_INCLUDE_DIR} + ${CMAKE_SOURCE_DIR}/core/shader/recompiler + ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR} +) +target_link_libraries(agc_pad_status_overlay_tests PRIVATE + libSceAgcDriver + libc +) +set_target_properties(agc_pad_status_overlay_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_pad_status_overlay_tests) + +add_test_executable(agc_performance_overlay_tests EXCLUDE_FROM_ALL + tests/PerformanceOverlay.cpp +) +target_include_directories(agc_performance_overlay_tests PRIVATE + ${LIBS_INCLUDE_DIR} + ${CMAKE_SOURCE_DIR}/core/shader/recompiler + ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR} +) +target_link_libraries(agc_performance_overlay_tests PRIVATE + libSceAgcDriver + SDL2-static + libc +) +set_target_properties(agc_performance_overlay_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_performance_overlay_tests) + +if(BUILD_TESTING) + set_target_properties(agc_performance_overlay_statistics_tests agc_keyboard_overlay_tests agc_pad_status_overlay_tests agc_performance_overlay_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_performance_overlay_statistics COMMAND agc_performance_overlay_statistics_tests) + add_test(NAME agc_keyboard_overlay COMMAND agc_keyboard_overlay_tests) + add_test(NAME agc_pad_status_overlay COMMAND agc_pad_status_overlay_tests) + add_test(NAME agc_pad_status_overlay_shared COMMAND agc_pad_status_overlay_tests default) + add_test(NAME agc_pad_status_overlay_events COMMAND agc_pad_status_overlay_tests events) + add_test(NAME agc_pad_status_overlay_invalid COMMAND agc_pad_status_overlay_tests invalid) + set_tests_properties(agc_pad_status_overlay agc_pad_status_overlay_shared agc_pad_status_overlay_events agc_pad_status_overlay_invalid PROPERTIES TIMEOUT 30) + foreach(padStatusCase IN ITEMS shared:unset: events:set:1 invalid:set:2) + string(REGEX REPLACE "^([a-z]+):(.*)$" "\\1" padStatusName "${padStatusCase}") + string(REGEX REPLACE "^([a-z]+):(.*)$" "\\2" padStatusValue "${padStatusCase}") + set(padStatusModification "ANYPS5_PAD_STATUS=${padStatusValue}") + if(WIN32) + list(APPEND padStatusModification "PATH=path_list_prepend:$") + endif() + set_tests_properties(agc_pad_status_overlay_${padStatusName} PROPERTIES ENVIRONMENT_MODIFICATION "${padStatusModification}") + endforeach() + add_test(NAME agc_performance_overlay COMMAND agc_performance_overlay_tests) + add_test(NAME agc_performance_overlay_device_selection COMMAND agc_performance_overlay_tests device-selection) + add_test(NAME agc_performance_overlay_device_selection_cpu COMMAND agc_performance_overlay_tests device-selection-cpu) + set_tests_properties(agc_performance_overlay agc_performance_overlay_device_selection PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) + set_tests_properties(agc_performance_overlay_device_selection_cpu PROPERTIES TIMEOUT 30) + if(ANYPS5_ENABLE_ASAN) + set_tests_properties(agc_performance_overlay PROPERTIES TIMEOUT 120) + endif() + if(WIN32) + set_tests_properties(agc_performance_overlay_statistics agc_keyboard_overlay agc_pad_status_overlay agc_performance_overlay agc_performance_overlay_device_selection agc_performance_overlay_device_selection_cpu PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_page_state_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_page_state_tests.cmake new file mode 100644 index 0000000000..f4beee493e --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_page_state_tests.cmake @@ -0,0 +1,10 @@ +if(BUILD_TESTING AND WIN32) + add_test_executable(agc_page_state_tests tests/PageStates.cpp) + target_include_directories(agc_page_state_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(agc_page_state_tests PRIVATE libSceAgcDriver libc) + configure_windows_unwind(agc_page_state_tests) + add_test(NAME agc_page_states COMMAND agc_page_state_tests) + add_test(NAME agc_page_state_metadata COMMAND agc_page_state_tests --metadata) + set_tests_properties(agc_page_states agc_page_state_metadata PROPERTIES + TIMEOUT 30 ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_pass_hazards_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_pass_hazards_tests.cmake new file mode 100644 index 0000000000..a25080ce38 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_pass_hazards_tests.cmake @@ -0,0 +1,9 @@ +add_test_executable(agc_pass_hazards_tests EXCLUDE_FROM_ALL tests/PassHazards.cpp Graphics/src/PassHazards.cpp) +target_include_directories(agc_pass_hazards_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) +target_link_libraries(agc_pass_hazards_tests PRIVATE libc) +set_target_properties(agc_pass_hazards_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_pass_hazards_tests) + +if(BUILD_TESTING) + agc_add_default_test(agc_pass_hazards_tests) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_performance_trace_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_performance_trace_tests.cmake new file mode 100644 index 0000000000..928246f450 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_performance_trace_tests.cmake @@ -0,0 +1,12 @@ +if(BUILD_TESTING) + add_test_executable(agc_performance_trace_tests tests/PerformanceTrace.cpp Execution/src/TraceFile.cpp) + target_include_directories(agc_performance_trace_tests PRIVATE ${LIBS_INCLUDE_DIR} ${agcZlibIncludeDir}) + target_link_libraries(agc_performance_trace_tests PRIVATE libc jpeg_turbo) + configure_windows_unwind(agc_performance_trace_tests) + add_test(NAME agc_performance_trace COMMAND agc_performance_trace_tests) + set_tests_properties(agc_performance_trace PROPERTIES TIMEOUT 20) + if(WIN32) + set_tests_properties(agc_performance_trace PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_pipeline_cache_allocation_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_pipeline_cache_allocation_tests.cmake new file mode 100644 index 0000000000..ef7a969e69 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_pipeline_cache_allocation_tests.cmake @@ -0,0 +1,23 @@ +add_test_executable(agc_pipeline_cache_allocation_tests EXCLUDE_FROM_ALL tests/PipelineCacheFailures.cpp + Graphics/src/PipelineCache.cpp tests/AllocationFailure.cpp) +target_include_directories(agc_pipeline_cache_allocation_tests PRIVATE ${LIBS_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/core/shader/recompiler ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) +target_link_libraries(agc_pipeline_cache_allocation_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_pipeline_cache_allocation_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_pipeline_cache_allocation_tests) + +if(BUILD_TESTING) + set_target_properties(agc_pipeline_cache_allocation_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + foreach(mode startup now busy destructor worker) + add_test(NAME agc_pipeline_cache_allocation_${mode} COMMAND agc_pipeline_cache_allocation_tests ${mode}) + set_tests_properties(agc_pipeline_cache_allocation_${mode} PROPERTIES TIMEOUT 25) + if(WIN32) + set_tests_properties(agc_pipeline_cache_allocation_${mode} PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + endforeach() + if(WIN32) + add_test(NAME agc_pipeline_cache_read_retry COMMAND agc_pipeline_cache_allocation_tests read-retry) + set_tests_properties(agc_pipeline_cache_read_retry PROPERTIES TIMEOUT 25 ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_pipeline_link_optimization_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_pipeline_link_optimization_tests.cmake new file mode 100644 index 0000000000..d1954bd6bc --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_pipeline_link_optimization_tests.cmake @@ -0,0 +1,9 @@ +add_test_executable(agc_pipeline_link_optimization_tests EXCLUDE_FROM_ALL tests/PipelineLinkOptimization.cpp) +target_include_directories(agc_pipeline_link_optimization_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) +set_target_properties(agc_pipeline_link_optimization_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_pipeline_link_optimization_tests) + +if(BUILD_TESTING) + set_target_properties(agc_pipeline_link_optimization_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_pipeline_link_optimization COMMAND agc_pipeline_link_optimization_tests) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_pipeline_queue_failure_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_pipeline_queue_failure_tests.cmake new file mode 100644 index 0000000000..f5052b5e18 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_pipeline_queue_failure_tests.cmake @@ -0,0 +1,18 @@ +add_test_executable(agc_pipeline_queue_failure_tests EXCLUDE_FROM_ALL tests/PipelineQueueFailure.cpp + Graphics/src/PipelineLibrary.cpp tests/AllocationFailure.cpp) +target_include_directories(agc_pipeline_queue_failure_tests PRIVATE ${LIBS_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/core/shader/recompiler ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) +target_link_libraries(agc_pipeline_queue_failure_tests PRIVATE libSceAgcDriver libc) +set_target_properties(agc_pipeline_queue_failure_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_pipeline_queue_failure_tests) + +if(BUILD_TESTING) + set_target_properties(agc_pipeline_queue_failure_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + foreach(mode wait clear stop) + add_test(NAME agc_pipeline_queue_failure_${mode} COMMAND agc_pipeline_queue_failure_tests ${mode}) + set_tests_properties(agc_pipeline_queue_failure_${mode} PROPERTIES TIMEOUT 15) + if(WIN32) + set_tests_properties(agc_pipeline_queue_failure_${mode} PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + endforeach() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_pixel_position_export_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_pixel_position_export_tests.cmake new file mode 100644 index 0000000000..31e92d1545 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_pixel_position_export_tests.cmake @@ -0,0 +1,14 @@ +add_test_executable(agc_pixel_position_export_tests EXCLUDE_FROM_ALL tests/PixelPositionExport.cpp) +target_link_libraries(agc_pixel_position_export_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_pixel_position_export_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_pixel_position_export_tests) + +if(BUILD_TESTING) + set_target_properties(agc_pixel_position_export_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_pixel_position_export COMMAND agc_pixel_position_export_tests) + set_tests_properties(agc_pixel_position_export PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1") + if(WIN32) + set_tests_properties(agc_pixel_position_export PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_placeholder_images_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_placeholder_images_tests.cmake new file mode 100644 index 0000000000..da83f9ba81 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_placeholder_images_tests.cmake @@ -0,0 +1,9 @@ +add_test_executable(agc_placeholder_images_tests EXCLUDE_FROM_ALL tests/PlaceholderImages.cpp) +target_include_directories(agc_placeholder_images_tests PRIVATE ${LIBS_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/3rdparty/Vulkan-Headers/include) +target_link_libraries(agc_placeholder_images_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_placeholder_images_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_placeholder_images_tests) + +if(BUILD_TESTING) + agc_add_default_test(agc_placeholder_images_tests) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_position_invariance_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_position_invariance_tests.cmake new file mode 100644 index 0000000000..ddf5441641 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_position_invariance_tests.cmake @@ -0,0 +1,14 @@ +add_test_executable(agc_position_invariance_tests EXCLUDE_FROM_ALL tests/PositionInvariance.cpp) +target_link_libraries(agc_position_invariance_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_position_invariance_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_position_invariance_tests) + +if(BUILD_TESTING) + set_target_properties(agc_position_invariance_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_position_invariance COMMAND agc_position_invariance_tests) + set_tests_properties(agc_position_invariance PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1") + if(WIN32) + set_tests_properties(agc_position_invariance PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_private_collect_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_private_collect_tests.cmake new file mode 100644 index 0000000000..da03c174fd --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_private_collect_tests.cmake @@ -0,0 +1,13 @@ +if(BUILD_TESTING) + if(WIN32) + add_test_executable(agc_private_collect_tests tests/PrivateCollect.cpp) + target_include_directories(agc_private_collect_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(agc_private_collect_tests PRIVATE libc) + target_compile_definitions(agc_private_collect_tests PRIVATE APS5_COUNT_MAPPING_QUERIES=1) + set_target_properties(agc_private_collect_tests PROPERTIES CXX_EXTENSIONS OFF) + configure_windows_unwind(agc_private_collect_tests) + add_test(NAME agc_private_collect COMMAND agc_private_collect_tests) + set_tests_properties(agc_private_collect PROPERTIES TIMEOUT 60 ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_profile_output_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_profile_output_tests.cmake new file mode 100644 index 0000000000..95dd8f2b74 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_profile_output_tests.cmake @@ -0,0 +1,12 @@ +if(BUILD_TESTING) + add_test_executable(agc_profile_output_tests tests/ProfileOutput.cpp) + target_include_directories(agc_profile_output_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(agc_profile_output_tests PRIVATE libc) + configure_windows_unwind(agc_profile_output_tests) + add_test(NAME agc_profile_output COMMAND agc_profile_output_tests) + set_tests_properties(agc_profile_output PROPERTIES TIMEOUT 20) + if(WIN32) + set_tests_properties(agc_profile_output PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_rdna_truncated_modifier_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_rdna_truncated_modifier_tests.cmake new file mode 100644 index 0000000000..0f85f01348 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_rdna_truncated_modifier_tests.cmake @@ -0,0 +1,13 @@ +add_test_executable(agc_rdna_truncated_modifier_tests EXCLUDE_FROM_ALL tests/RdnaTruncatedModifier.cpp) +target_link_libraries(agc_rdna_truncated_modifier_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_rdna_truncated_modifier_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_rdna_truncated_modifier_tests) + +if(BUILD_TESTING) + set_target_properties(agc_rdna_truncated_modifier_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_rdna_truncated_modifier COMMAND agc_rdna_truncated_modifier_tests) + if(WIN32) + set_tests_properties(agc_rdna_truncated_modifier PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_rdna_unreachable_words_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_rdna_unreachable_words_tests.cmake new file mode 100644 index 0000000000..c379e4d62c --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_rdna_unreachable_words_tests.cmake @@ -0,0 +1,13 @@ +add_test_executable(agc_rdna_unreachable_words_tests EXCLUDE_FROM_ALL tests/RdnaUnreachableWords.cpp) +target_link_libraries(agc_rdna_unreachable_words_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_rdna_unreachable_words_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_rdna_unreachable_words_tests) + +if(BUILD_TESTING) + set_target_properties(agc_rdna_unreachable_words_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_rdna_unreachable_words COMMAND agc_rdna_unreachable_words_tests) + if(WIN32) + set_tests_properties(agc_rdna_unreachable_words PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_recorder_kept_bytes_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_recorder_kept_bytes_tests.cmake new file mode 100644 index 0000000000..08e733b8ad --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_recorder_kept_bytes_tests.cmake @@ -0,0 +1,14 @@ +add_test_executable(agc_recorder_kept_bytes_tests EXCLUDE_FROM_ALL tests/RecorderKeptBytes.cpp) +target_include_directories(agc_recorder_kept_bytes_tests PRIVATE ${LIBS_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/core/shader/recompiler ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) +target_link_libraries(agc_recorder_kept_bytes_tests PRIVATE libSceAgcDriver libc) +set_target_properties(agc_recorder_kept_bytes_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_recorder_kept_bytes_tests) + +if(BUILD_TESTING) + set_target_properties(agc_recorder_kept_bytes_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_recorder_kept_bytes COMMAND agc_recorder_kept_bytes_tests) + if(WIN32) + set_tests_properties(agc_recorder_kept_bytes PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_rect_list_position_invariant_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_rect_list_position_invariant_tests.cmake new file mode 100644 index 0000000000..3f92a3e15f --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_rect_list_position_invariant_tests.cmake @@ -0,0 +1,13 @@ +add_test_executable(agc_rect_list_position_invariant_tests EXCLUDE_FROM_ALL tests/RectListPositionInvariant.cpp) +target_link_libraries(agc_rect_list_position_invariant_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_rect_list_position_invariant_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_rect_list_position_invariant_tests) + +if(BUILD_TESTING) + set_target_properties(agc_rect_list_position_invariant_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_rect_list_position_invariant COMMAND agc_rect_list_position_invariant_tests) + if(WIN32) + set_tests_properties(agc_rect_list_position_invariant PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_redundant_value_elimination_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_redundant_value_elimination_tests.cmake new file mode 100644 index 0000000000..d88952caca --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_redundant_value_elimination_tests.cmake @@ -0,0 +1,13 @@ +add_test_executable(agc_redundant_value_elimination_tests EXCLUDE_FROM_ALL tests/RedundantValueElimination.cpp) +target_link_libraries(agc_redundant_value_elimination_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_redundant_value_elimination_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_redundant_value_elimination_tests) + +if(BUILD_TESTING) + set_target_properties(agc_redundant_value_elimination_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_redundant_value_elimination COMMAND agc_redundant_value_elimination_tests) + if(WIN32) + set_tests_properties(agc_redundant_value_elimination PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_runtime_switches_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_runtime_switches_tests.cmake new file mode 100644 index 0000000000..7f7d4b109a --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_runtime_switches_tests.cmake @@ -0,0 +1,13 @@ +if(BUILD_TESTING) + add_test_executable(agc_runtime_switches_tests tests/RuntimeSwitches.cpp Graphics/src/RuntimeSwitches.cpp) + target_include_directories(agc_runtime_switches_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(agc_runtime_switches_tests PRIVATE libc) + configure_windows_unwind(agc_runtime_switches_tests) + add_test(NAME agc_runtime_switches COMMAND agc_runtime_switches_tests) + add_test(NAME agc_runtime_switches_refused COMMAND agc_runtime_switches_tests refused) + set_tests_properties(agc_runtime_switches agc_runtime_switches_refused PROPERTIES TIMEOUT 20) + if(WIN32) + set_tests_properties(agc_runtime_switches agc_runtime_switches_refused PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_scalar_select_mask_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_scalar_select_mask_tests.cmake new file mode 100644 index 0000000000..469dc262eb --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_scalar_select_mask_tests.cmake @@ -0,0 +1,8 @@ +add_test_executable(agc_scalar_select_mask_tests EXCLUDE_FROM_ALL tests/ScalarSelectMask.cpp) +target_link_libraries(agc_scalar_select_mask_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_scalar_select_mask_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_scalar_select_mask_tests) + +if(BUILD_TESTING) + agc_add_default_test(agc_scalar_select_mask_tests) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_screenshot_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_screenshot_tests.cmake new file mode 100644 index 0000000000..b0e82e2d05 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_screenshot_tests.cmake @@ -0,0 +1,9 @@ +add_test_executable(agc_screenshot_tests EXCLUDE_FROM_ALL tests/Screenshot.cpp Execution/src/Screenshot.cpp) +target_include_directories(agc_screenshot_tests PRIVATE ${LIBS_INCLUDE_DIR}) +target_link_libraries(agc_screenshot_tests PRIVATE decoder_png SDL2-static libc) +set_target_properties(agc_screenshot_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_screenshot_tests) + +if(BUILD_TESTING) + agc_add_default_test(agc_screenshot_tests) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_shader_control_flow_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_shader_control_flow_tests.cmake new file mode 100644 index 0000000000..011a0c2506 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_shader_control_flow_tests.cmake @@ -0,0 +1,34 @@ +add_test_executable(agc_structurizer_tests EXCLUDE_FROM_ALL tests/Structurizer.cpp) +target_link_libraries(agc_structurizer_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_structurizer_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_structurizer_tests) + +add_test_executable(agc_shader_control_flow_tests EXCLUDE_FROM_ALL + tests/ControlFlow.cpp +) +target_include_directories(agc_shader_control_flow_tests PRIVATE ${LIBS_INCLUDE_DIR}) +target_link_libraries(agc_shader_control_flow_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_shader_control_flow_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_shader_control_flow_tests) + +if(BUILD_TESTING) + agc_add_default_test(agc_structurizer_tests) + agc_add_default_test(agc_shader_control_flow_tests) + add_test(NAME agc_structurizer_intersection_off COMMAND agc_structurizer_tests) + set_tests_properties(agc_structurizer_intersection_off PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_PERF_DOM_INTERSECTION=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + add_test(NAME agc_structurizer_iteration_selection_off COMMAND agc_structurizer_tests) + set_tests_properties(agc_structurizer_iteration_selection_off PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_PERF_ITERATION_SELECTION=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + add_test(NAME agc_shader_control_flow_iteration_selection_off COMMAND agc_shader_control_flow_tests) + set_tests_properties(agc_shader_control_flow_iteration_selection_off PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_PERF_ITERATION_SELECTION=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + add_test(NAME agc_structurizer_dominator_tree_off COMMAND agc_structurizer_tests) + set_tests_properties(agc_structurizer_dominator_tree_off PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_PERF_DOMINATOR_TREE=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + add_test(NAME agc_shader_control_flow_dominator_tree_off COMMAND agc_shader_control_flow_tests) + set_tests_properties(agc_shader_control_flow_dominator_tree_off PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_PERF_DOMINATOR_TREE=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + add_test(NAME agc_structurizer_forced_fallback COMMAND agc_structurizer_tests) + set_tests_properties(agc_structurizer_forced_fallback PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_FORCE_STRUCTURIZER_FALLBACK=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + add_test(NAME agc_shader_control_flow_forced_fallback COMMAND agc_shader_control_flow_tests) + set_tests_properties(agc_shader_control_flow_forced_fallback PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_FORCE_STRUCTURIZER_FALLBACK=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_structurizer_intersection_off agc_structurizer_iteration_selection_off agc_shader_control_flow_iteration_selection_off agc_structurizer_dominator_tree_off agc_shader_control_flow_dominator_tree_off agc_structurizer_forced_fallback agc_shader_control_flow_forced_fallback PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_shader_device_profile_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_shader_device_profile_tests.cmake new file mode 100644 index 0000000000..c639a3870e --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_shader_device_profile_tests.cmake @@ -0,0 +1,9 @@ +add_test_executable(agc_shader_device_profile_tests EXCLUDE_FROM_ALL tests/ShaderDeviceProfile.cpp Execution/src/ShaderDeviceProfile.cpp) +target_include_directories(agc_shader_device_profile_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) +target_link_libraries(agc_shader_device_profile_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_shader_device_profile_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_shader_device_profile_tests) + +if(BUILD_TESTING) + agc_add_default_test(agc_shader_device_profile_tests) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_shader_disk_cache_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_shader_disk_cache_tests.cmake new file mode 100644 index 0000000000..0564e1c07d --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_shader_disk_cache_tests.cmake @@ -0,0 +1,25 @@ +add_test_executable(agc_shader_disk_cache_tests EXCLUDE_FROM_ALL tests/ShaderDiskCache.cpp) +target_include_directories(agc_shader_disk_cache_tests PRIVATE ${LIBS_INCLUDE_DIR}) +target_link_libraries(agc_shader_disk_cache_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_shader_disk_cache_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_shader_disk_cache_tests) + +if(BUILD_TESTING) + agc_add_default_test(agc_shader_disk_cache_tests) + add_test(NAME agc_shader_disk_cache_pack_ownership COMMAND agc_shader_disk_cache_tests --prebuilt-pack-ownership) + set_tests_properties(agc_shader_disk_cache_pack_ownership PROPERTIES TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_shader_disk_cache_pack_ownership PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_shader_disk_cache_large_file COMMAND agc_shader_disk_cache_tests --large-file) + set_tests_properties(agc_shader_disk_cache_large_file PROPERTIES SKIP_RETURN_CODE 77 RUN_SERIAL TRUE WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 240) + if(WIN32) + set_tests_properties(agc_shader_disk_cache_large_file PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + add_test(NAME agc_shader_disk_cache_long_paths COMMAND agc_shader_disk_cache_tests --long-host-paths) + add_test(NAME agc_shader_disk_cache_host_stderr COMMAND agc_shader_disk_cache_tests --host-stderr) + set_tests_properties(agc_shader_disk_cache_host_stderr PROPERTIES TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + set_tests_properties(agc_shader_disk_cache_long_paths PROPERTIES TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_shader_memory_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_shader_memory_tests.cmake new file mode 100644 index 0000000000..902a0d9bbc --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_shader_memory_tests.cmake @@ -0,0 +1,80 @@ +add_test_executable(agc_shader_memory_tests EXCLUDE_FROM_ALL + tests/ShaderMemory.cpp + Execution/src/ShaderMemory.cpp + Execution/src/GuestMemory.cpp + Execution/src/PerformanceTraceThread.cpp +) +target_include_directories(agc_shader_memory_tests PRIVATE ${LIBS_INCLUDE_DIR}) +target_link_libraries(agc_shader_memory_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_shader_memory_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_shader_memory_tests) + +target_include_directories(agc_driver_image_table_cache_bounds_tests PRIVATE $) + +if(BUILD_TESTING) + add_test(NAME agc_shader_bindless COMMAND agc_shader_memory_tests --bindless) + set_tests_properties(agc_shader_bindless PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + add_test(NAME agc_shader_selected_records_image_limit COMMAND agc_shader_memory_tests --selected-records-image-limit) + add_test(NAME agc_shader_selected_records_pair_limit COMMAND agc_shader_memory_tests --selected-records-pair-limit) + add_test(NAME agc_shader_selected_records_direct_image_limit COMMAND agc_shader_memory_tests --selected-records-direct-image-limit) + add_test(NAME agc_shader_selected_records_direct_pair_limit COMMAND agc_shader_memory_tests --selected-records-direct-pair-limit) + set_tests_properties(agc_shader_selected_records_image_limit agc_shader_selected_records_pair_limit agc_shader_selected_records_direct_image_limit agc_shader_selected_records_direct_pair_limit PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + add_test(NAME agc_shader_srt_read_patching COMMAND agc_shader_memory_tests --srt-read-patching) + set_tests_properties(agc_shader_srt_read_patching PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + add_test(NAME agc_shader_table_snapshot_reuse COMMAND agc_shader_memory_tests --table-snapshot-reuse) + add_test(NAME agc_shader_region_merge COMMAND agc_shader_memory_tests --region-merge) + set_tests_properties(agc_shader_region_merge PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_shader_region_merge PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() + set_tests_properties(agc_shader_table_snapshot_reuse PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + add_test(NAME agc_shader_table_snapshot_reuse_unmasked COMMAND agc_shader_memory_tests --table-snapshot-reuse) + set_tests_properties(agc_shader_table_snapshot_reuse_unmasked PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_MASKED_RESULT_MEMO=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + add_test(NAME agc_driver_image_table_vouched_lookups COMMAND agc_driver_image_table_cache_bounds_tests --vouched-lookups) + set_tests_properties(agc_driver_image_table_vouched_lookups PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_WRITE_WATCH_IMPORTS=watch" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 60) + add_test(NAME agc_driver_image_table_vouch_queued_draws COMMAND agc_driver_image_table_cache_bounds_tests --queued-draws) + set_tests_properties(agc_driver_image_table_vouch_queued_draws PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" SKIP_RETURN_CODE 77 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 60) + if(WIN32) + set_tests_properties(agc_shader_table_snapshot_reuse agc_shader_table_snapshot_reuse_unmasked agc_driver_image_table_vouched_lookups agc_driver_image_table_vouch_queued_draws PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_shader_type_zero_image_materialization COMMAND agc_shader_memory_tests --type-zero-image-materialization) + set_tests_properties(agc_shader_type_zero_image_materialization PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + add_test(NAME agc_shader_frontend_pair COMMAND agc_shader_memory_tests --frontend-pair) + add_test(NAME agc_shader_quad_mask_no_demote COMMAND agc_shader_memory_tests --quad-mask-no-demote) + set_tests_properties(agc_shader_quad_mask_no_demote PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_shader_quad_mask_no_demote PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() + add_test(NAME agc_shader_frontend_pair_off COMMAND agc_shader_memory_tests --frontend-pair) + set_tests_properties(agc_shader_frontend_pair PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + set_tests_properties(agc_shader_frontend_pair_off PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_PERF_FRONTEND_PAIR=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + add_test(NAME agc_shader_result_memo_budget COMMAND agc_shader_memory_tests --result-memo-budget) + set_tests_properties(agc_shader_result_memo_budget PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_MASKED_RESULT_MEMO=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + add_test(NAME agc_shader_result_memo_budget_threads COMMAND agc_shader_memory_tests --result-memo-budget-threads) + set_tests_properties(agc_shader_result_memo_budget_threads PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_MASKED_RESULT_MEMO=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + add_test(NAME agc_shader_result_memo_budget_masked COMMAND agc_shader_memory_tests --result-memo-budget-masked) + set_tests_properties(agc_shader_result_memo_budget_masked PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + add_test(NAME agc_shader_layout_pair COMMAND agc_shader_memory_tests --layout-pair) + add_test(NAME agc_shader_layout_pair_off COMMAND agc_shader_memory_tests --layout-pair) + set_tests_properties(agc_shader_layout_pair PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + set_tests_properties(agc_shader_layout_pair_off PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_PERF_LAYOUT_PAIR=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + add_test(NAME agc_shader_entry_lane_proof_budget COMMAND agc_shader_memory_tests --entry-lane-proof-budget) + set_tests_properties(agc_shader_entry_lane_proof_budget PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + if(WIN32) + set_tests_properties(agc_shader_bindless agc_shader_selected_records_image_limit agc_shader_selected_records_pair_limit agc_shader_selected_records_direct_image_limit agc_shader_selected_records_direct_pair_limit agc_shader_srt_read_patching agc_shader_type_zero_image_materialization agc_shader_frontend_pair agc_shader_frontend_pair_off agc_shader_layout_pair agc_shader_layout_pair_off agc_shader_result_memo_budget agc_shader_result_memo_budget_threads agc_shader_result_memo_budget_masked agc_shader_entry_lane_proof_budget PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() + agc_add_default_test(agc_shader_memory_tests) +endif() + +if(BUILD_TESTING) + foreach(optimizer IN ITEMS none full) + if(optimizer STREQUAL "full" AND NOT ANYPS5_ENABLE_SPIRV_TOOLS) + continue() + endif() + add_test(NAME agc_shader_specialized_bda_abi_${optimizer} COMMAND agc_shader_memory_tests --specialized-bda-abi) + set_tests_properties(agc_shader_specialized_bda_abi_${optimizer} PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_SPIRV_OPT=${optimizer}" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_shader_specialized_bda_abi_${optimizer} PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() + endforeach() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_shader_mode_register_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_shader_mode_register_tests.cmake new file mode 100644 index 0000000000..5b1bbd7302 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_shader_mode_register_tests.cmake @@ -0,0 +1,14 @@ +add_test_executable(agc_shader_mode_register_tests EXCLUDE_FROM_ALL tests/ShaderModeRegisters.cpp) +target_include_directories(agc_shader_mode_register_tests PRIVATE ${LIBS_INCLUDE_DIR}) +target_link_libraries(agc_shader_mode_register_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_shader_mode_register_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_shader_mode_register_tests) + +if(BUILD_TESTING) + set_target_properties(agc_shader_mode_register_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_shader_mode_register COMMAND agc_shader_mode_register_tests) + set_tests_properties(agc_shader_mode_register PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 20) + if(WIN32) + set_tests_properties(agc_shader_mode_register PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_shader_replay_requests_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_shader_replay_requests_tests.cmake new file mode 100644 index 0000000000..27aeaf6bb8 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_shader_replay_requests_tests.cmake @@ -0,0 +1,18 @@ +if(BUILD_TESTING) + add_test_executable(agc_shader_replay_requests_tests tests/ShaderReplayRequests.cpp) + target_link_libraries(agc_shader_replay_requests_tests PRIVATE shader_recompiler_agc_driver libc) + set_target_properties(agc_shader_replay_requests_tests PROPERTIES CXX_EXTENSIONS OFF) + configure_windows_unwind(agc_shader_replay_requests_tests) + add_dependencies(agc_shader_replay_requests_tests agc_shader_replay) + set(agcShaderReplayCapture "${CMAKE_CURRENT_BINARY_DIR}/shader-replay-capture") + add_test(NAME agc_shader_replay_requests COMMAND agc_shader_replay_requests_tests "${agcShaderReplayCapture}") + set_tests_properties(agc_shader_replay_requests PROPERTIES FIXTURES_SETUP agc_shader_replay_capture TIMEOUT 30) + add_test(NAME agc_shader_replay_tool COMMAND ${CMAKE_COMMAND} -DTOOL=$ "-DCAPTURE=${agcShaderReplayCapture}" + -P ${CMAKE_CURRENT_SOURCE_DIR}/tests/ShaderReplayTool.cmake) + set_tests_properties(agc_shader_replay_tool PROPERTIES FIXTURES_REQUIRED agc_shader_replay_capture TIMEOUT 30) + set_tests_properties(agc_shader_replay_requests agc_shader_replay_tool PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1") + if(WIN32) + set_tests_properties(agc_shader_replay_requests agc_shader_replay_tool PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_shared_write_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_shared_write_tests.cmake new file mode 100644 index 0000000000..341ac51cce --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_shared_write_tests.cmake @@ -0,0 +1,17 @@ +add_test_executable(agc_shared_write_tests EXCLUDE_FROM_ALL tests/SharedWrites.cpp) +target_include_directories(agc_shared_write_tests PRIVATE ${LIBS_INCLUDE_DIR}) +target_link_libraries(agc_shared_write_tests PRIVATE libSceAgcDriver libkernel libc) +set_target_properties(agc_shared_write_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_shared_write_tests) + +if(BUILD_TESTING) + agc_add_default_test(agc_shared_write_tests) + add_test(NAME agc_shared_write_partial_collect COMMAND agc_shared_write_tests --partial-collect) + set_tests_properties(agc_shared_write_partial_collect PROPERTIES SKIP_RETURN_CODE 77 ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 30) + if(WIN32) + add_test(NAME agc_shared_write_partial_collect_two_pass COMMAND agc_shared_write_tests --partial-collect) + set_tests_properties(agc_shared_write_partial_collect_two_pass PROPERTIES SKIP_RETURN_CODE 77 ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_SINGLE_PASS_COLLECT=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" TIMEOUT 30) + set_tests_properties(agc_shared_write_partial_collect agc_shared_write_partial_collect_two_pass PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_snapshot_copy_failure_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_snapshot_copy_failure_tests.cmake new file mode 100644 index 0000000000..04be803a42 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_snapshot_copy_failure_tests.cmake @@ -0,0 +1,10 @@ +if(BUILD_TESTING) + add_test_executable(agc_snapshot_copy_failure_tests tests/SnapshotCopyFailure.cpp tests/AllocationFailure.cpp) + target_include_directories(agc_snapshot_copy_failure_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) + if(MINGW) + target_compile_options(agc_snapshot_copy_failure_tests PRIVATE -fasynchronous-unwind-tables) + endif() + configure_windows_unwind(agc_snapshot_copy_failure_tests) + add_test(NAME agc_snapshot_copy_failure COMMAND agc_snapshot_copy_failure_tests) + set_tests_properties(agc_snapshot_copy_failure PROPERTIES TIMEOUT 10) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_spirv13_image_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_spirv13_image_tests.cmake new file mode 100644 index 0000000000..7e10142f3d --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_spirv13_image_tests.cmake @@ -0,0 +1,10 @@ +if(ANYPS5_ENABLE_SPIRV_TOOLS) + add_test_executable(agc_spirv13_image_tests EXCLUDE_FROM_ALL tests/Spirv13Image.cpp) + target_link_libraries(agc_spirv13_image_tests PRIVATE shader_recompiler_agc_driver libc) + set_target_properties(agc_spirv13_image_tests PROPERTIES CXX_EXTENSIONS OFF) + configure_windows_unwind(agc_spirv13_image_tests) +endif() + +if(BUILD_TESTING) + agc_add_spirv_mode_tests(agc_spirv13_image_tests) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_spirv_branch_targets_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_spirv_branch_targets_tests.cmake new file mode 100644 index 0000000000..1f282de5b8 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_spirv_branch_targets_tests.cmake @@ -0,0 +1,13 @@ +add_test_executable(agc_spirv_branch_targets_tests EXCLUDE_FROM_ALL tests/SpirvBranchTargets.cpp) +target_link_libraries(agc_spirv_branch_targets_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_spirv_branch_targets_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_spirv_branch_targets_tests) + +if(BUILD_TESTING) + set_target_properties(agc_spirv_branch_targets_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_spirv_branch_targets COMMAND agc_spirv_branch_targets_tests) + set_tests_properties(agc_spirv_branch_targets PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1") + if(WIN32) + set_tests_properties(agc_spirv_branch_targets PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_spirv_failure_text_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_spirv_failure_text_tests.cmake new file mode 100644 index 0000000000..68987a79f2 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_spirv_failure_text_tests.cmake @@ -0,0 +1,13 @@ +add_test_executable(agc_spirv_failure_text_tests EXCLUDE_FROM_ALL tests/SpirvFailureText.cpp) +target_link_libraries(agc_spirv_failure_text_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_spirv_failure_text_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_spirv_failure_text_tests) + +if(BUILD_TESTING) + set_target_properties(agc_spirv_failure_text_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_spirv_failure_text COMMAND agc_spirv_failure_text_tests) + set_tests_properties(agc_spirv_failure_text PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1") + if(WIN32) + set_tests_properties(agc_spirv_failure_text PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_spirv_lds_atomic_lock_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_spirv_lds_atomic_lock_tests.cmake new file mode 100644 index 0000000000..df272bf0a7 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_spirv_lds_atomic_lock_tests.cmake @@ -0,0 +1,13 @@ +add_test_executable(agc_spirv_lds_atomic_lock_tests EXCLUDE_FROM_ALL tests/SpirvLdsAtomicLock.cpp) +target_link_libraries(agc_spirv_lds_atomic_lock_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_spirv_lds_atomic_lock_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_spirv_lds_atomic_lock_tests) + +if(BUILD_TESTING) + set_target_properties(agc_spirv_lds_atomic_lock_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_spirv_lds_atomic_lock COMMAND agc_spirv_lds_atomic_lock_tests) + set_tests_properties(agc_spirv_lds_atomic_lock PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1") + if(WIN32) + set_tests_properties(agc_spirv_lds_atomic_lock PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_spirv_module_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_spirv_module_tests.cmake new file mode 100644 index 0000000000..27cda4d3e5 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_spirv_module_tests.cmake @@ -0,0 +1,8 @@ +add_test_executable(agc_spirv_module_tests EXCLUDE_FROM_ALL tests/SpirvModule.cpp) +target_link_libraries(agc_spirv_module_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_spirv_module_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_spirv_module_tests) + +if(BUILD_TESTING) + agc_add_default_test(agc_spirv_module_tests) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_spirv_narrow_constant_store_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_spirv_narrow_constant_store_tests.cmake new file mode 100644 index 0000000000..47c3993221 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_spirv_narrow_constant_store_tests.cmake @@ -0,0 +1,12 @@ +add_test_executable(agc_spirv_narrow_constant_store_tests EXCLUDE_FROM_ALL tests/SpirvNarrowConstantStore.cpp) +target_link_libraries(agc_spirv_narrow_constant_store_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_spirv_narrow_constant_store_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_spirv_narrow_constant_store_tests) + +if(ANYPS5_ENABLE_SPIRV_TOOLS) + target_link_libraries(agc_spirv_narrow_constant_store_tests PRIVATE SPIRV-Tools-static) +endif() + +if(BUILD_TESTING) + agc_add_spirv_mode_tests(agc_spirv_narrow_constant_store_tests) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_spirv_optimizer_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_spirv_optimizer_tests.cmake new file mode 100644 index 0000000000..259f306ad3 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_spirv_optimizer_tests.cmake @@ -0,0 +1,10 @@ +if(ANYPS5_ENABLE_SPIRV_TOOLS) + add_test_executable(agc_spirv_optimizer_tests EXCLUDE_FROM_ALL tests/SpirvOptimizer.cpp) + target_link_libraries(agc_spirv_optimizer_tests PRIVATE shader_recompiler_agc_driver libc SPIRV-Tools-static) + set_target_properties(agc_spirv_optimizer_tests PROPERTIES CXX_EXTENSIONS OFF) + configure_windows_unwind(agc_spirv_optimizer_tests) +endif() + +if(BUILD_TESTING) + agc_add_spirv_mode_tests(agc_spirv_optimizer_tests) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_spirv_subvector_loop_begin_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_spirv_subvector_loop_begin_tests.cmake new file mode 100644 index 0000000000..63123928ae --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_spirv_subvector_loop_begin_tests.cmake @@ -0,0 +1,13 @@ +add_test_executable(agc_spirv_subvector_loop_begin_tests EXCLUDE_FROM_ALL tests/SpirvSubvectorLoopBegin.cpp) +target_link_libraries(agc_spirv_subvector_loop_begin_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_spirv_subvector_loop_begin_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_spirv_subvector_loop_begin_tests) + +if(BUILD_TESTING) + set_target_properties(agc_spirv_subvector_loop_begin_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_spirv_subvector_loop_begin COMMAND agc_spirv_subvector_loop_begin_tests) + set_tests_properties(agc_spirv_subvector_loop_begin PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1") + if(WIN32) + set_tests_properties(agc_spirv_subvector_loop_begin PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_stack_walk_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_stack_walk_tests.cmake new file mode 100644 index 0000000000..512596c040 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_stack_walk_tests.cmake @@ -0,0 +1,12 @@ +if(BUILD_TESTING) + add_test_executable(agc_stack_walk_tests tests/StackWalk.cpp) + target_include_directories(agc_stack_walk_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(agc_stack_walk_tests PRIVATE libc) + configure_windows_unwind(agc_stack_walk_tests) + add_test(NAME agc_stack_walk COMMAND agc_stack_walk_tests) + set_tests_properties(agc_stack_walk PROPERTIES TIMEOUT 20) + if(WIN32) + set_tests_properties(agc_stack_walk PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_subgroup_barrier_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_subgroup_barrier_tests.cmake new file mode 100644 index 0000000000..f26b5038ae --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_subgroup_barrier_tests.cmake @@ -0,0 +1,15 @@ +add_test_executable(agc_subgroup_barrier_tests EXCLUDE_FROM_ALL tests/SubgroupBarrier.cpp) +target_include_directories(agc_subgroup_barrier_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) +target_link_libraries(agc_subgroup_barrier_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_subgroup_barrier_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_subgroup_barrier_tests) + +if(BUILD_TESTING) + set_target_properties(agc_subgroup_barrier_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_subgroup_barrier COMMAND agc_subgroup_barrier_tests) + set_tests_properties(agc_subgroup_barrier PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1") + if(WIN32) + set_tests_properties(agc_subgroup_barrier PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_subgroup_clock_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_subgroup_clock_tests.cmake new file mode 100644 index 0000000000..0cd558ee50 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_subgroup_clock_tests.cmake @@ -0,0 +1,12 @@ +add_test_executable(agc_subgroup_clock_tests EXCLUDE_FROM_ALL + tests/SubgroupClock.cpp + Execution/src/SubgroupClock.cpp +) +target_include_directories(agc_subgroup_clock_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) +set_target_properties(agc_subgroup_clock_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_subgroup_clock_tests) + +if(BUILD_TESTING) + set_target_properties(agc_subgroup_clock_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_subgroup_clock COMMAND agc_subgroup_clock_tests) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_tessellation_factor_ring_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_tessellation_factor_ring_tests.cmake new file mode 100644 index 0000000000..0ede3dacb4 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_tessellation_factor_ring_tests.cmake @@ -0,0 +1,17 @@ +add_test_executable(agc_tessellation_factor_ring_tests EXCLUDE_FROM_ALL + tests/TessellationFactorRing.cpp + State/src/Configuration.cpp +) +target_include_directories(agc_tessellation_factor_ring_tests PRIVATE ${LIBS_INCLUDE_DIR}) +target_link_libraries(agc_tessellation_factor_ring_tests PRIVATE libc) +set_target_properties(agc_tessellation_factor_ring_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_tessellation_factor_ring_tests) + +if(BUILD_TESTING) + set_target_properties(agc_tessellation_factor_ring_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_tessellation_factor_ring COMMAND agc_tessellation_factor_ring_tests) + if(WIN32) + set_tests_properties(agc_tessellation_factor_ring PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_tessellation_lowering_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_tessellation_lowering_tests.cmake new file mode 100644 index 0000000000..2c1a8276f4 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_tessellation_lowering_tests.cmake @@ -0,0 +1,13 @@ +add_test_executable(agc_tessellation_lowering_tests EXCLUDE_FROM_ALL tests/TessellationLowering.cpp) +target_link_libraries(agc_tessellation_lowering_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_tessellation_lowering_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_tessellation_lowering_tests) + +if(BUILD_TESTING) + set_target_properties(agc_tessellation_lowering_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_tessellation_lowering COMMAND agc_tessellation_lowering_tests) + if(WIN32) + set_tests_properties(agc_tessellation_lowering PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_tessellation_pipeline_cache_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_tessellation_pipeline_cache_tests.cmake new file mode 100644 index 0000000000..f8d57739e1 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_tessellation_pipeline_cache_tests.cmake @@ -0,0 +1,9 @@ +add_test_executable(agc_tessellation_pipeline_cache_tests EXCLUDE_FROM_ALL tests/TessellationPipelineCache.cpp) +target_include_directories(agc_tessellation_pipeline_cache_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) +set_target_properties(agc_tessellation_pipeline_cache_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_tessellation_pipeline_cache_tests) + +if(BUILD_TESTING) + set_target_properties(agc_tessellation_pipeline_cache_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_tessellation_pipeline_cache COMMAND agc_tessellation_pipeline_cache_tests) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_thread_priority_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_thread_priority_tests.cmake new file mode 100644 index 0000000000..1f590c4e47 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_thread_priority_tests.cmake @@ -0,0 +1,23 @@ +add_test_executable(agc_thread_priority_tests EXCLUDE_FROM_ALL + tests/ThreadPriority.cpp + Execution/src/ThreadPriority.cpp +) +target_include_directories(agc_thread_priority_tests PRIVATE ${LIBS_INCLUDE_DIR}) +target_link_libraries(agc_thread_priority_tests PRIVATE libc ${CMAKE_DL_LIBS}) +set_target_properties(agc_thread_priority_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_thread_priority_tests) + +if(BUILD_TESTING) + set_target_properties(agc_thread_priority_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_thread_priority COMMAND agc_thread_priority_tests) + if(WIN32) + set_tests_properties(agc_thread_priority PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") + foreach(mode rt high) + add_test(NAME agc_thread_priority_refused_${mode} COMMAND agc_thread_priority_tests refused) + set_tests_properties(agc_thread_priority_refused_${mode} PROPERTIES ENVIRONMENT + "APS5_THREAD_PRIORITY=${mode};DBUS_SYSTEM_BUS_ADDRESS=unix:path=/nonexistent/aps5-no-rtkit") + endforeach() + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_validate_program_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_validate_program_tests.cmake new file mode 100644 index 0000000000..02d667ce0f --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_validate_program_tests.cmake @@ -0,0 +1,8 @@ +add_test_executable(agc_validate_program_tests EXCLUDE_FROM_ALL tests/ValidateProgram.cpp) +target_link_libraries(agc_validate_program_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_validate_program_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_validate_program_tests) + +if(BUILD_TESTING) + agc_add_default_test(agc_validate_program_tests) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_vector_window_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_vector_window_tests.cmake new file mode 100644 index 0000000000..e0ddbd092c --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_vector_window_tests.cmake @@ -0,0 +1,14 @@ +add_test_executable(agc_vector_window_tests EXCLUDE_FROM_ALL tests/VectorWindow.cpp) +target_link_libraries(agc_vector_window_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_vector_window_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_vector_window_tests) + +if(BUILD_TESTING) + agc_add_default_test(agc_vector_window_tests) + add_test(NAME agc_vector_window_stage_inputs COMMAND agc_vector_window_tests --stage-inputs-only) + set_tests_properties(agc_vector_window_stage_inputs PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") + set_tests_properties(agc_vector_window_stage_inputs agc_driver_relative_stage_inputs PROPERTIES TIMEOUT 30) + if(WIN32) + set_tests_properties(agc_vector_window_stage_inputs PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_vertex_barrier_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_vertex_barrier_tests.cmake new file mode 100644 index 0000000000..a54c7288c9 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_vertex_barrier_tests.cmake @@ -0,0 +1,14 @@ +add_test_executable(agc_vertex_barrier_tests EXCLUDE_FROM_ALL tests/VertexBarrier.cpp) +target_link_libraries(agc_vertex_barrier_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_vertex_barrier_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_vertex_barrier_tests) + +if(BUILD_TESTING) + set_target_properties(agc_vertex_barrier_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_vertex_barrier COMMAND agc_vertex_barrier_tests) + set_tests_properties(agc_vertex_barrier PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1") + if(WIN32) + set_tests_properties(agc_vertex_barrier PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_vertex_input_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_vertex_input_tests.cmake new file mode 100644 index 0000000000..0ecba4e5fc --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_vertex_input_tests.cmake @@ -0,0 +1,12 @@ +add_test_executable(agc_vertex_input_tests EXCLUDE_FROM_ALL tests/VertexInput.cpp) +target_include_directories(agc_vertex_input_tests PRIVATE + ${LIBS_INCLUDE_DIR} + ${CMAKE_SOURCE_DIR}/3rdparty/Vulkan-Headers/include +) +target_link_libraries(agc_vertex_input_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_vertex_input_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_vertex_input_tests) + +if(BUILD_TESTING) + agc_add_default_test(agc_vertex_input_tests) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_vertex_input_validation_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_vertex_input_validation_tests.cmake new file mode 100644 index 0000000000..c6cf60492c --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_vertex_input_validation_tests.cmake @@ -0,0 +1,8 @@ +add_test_executable(agc_vertex_input_validation_tests EXCLUDE_FROM_ALL tests/VertexInputValidation.cpp) +target_link_libraries(agc_vertex_input_validation_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_vertex_input_validation_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_vertex_input_validation_tests) + +if(BUILD_TESTING) + agc_add_default_test(agc_vertex_input_validation_tests) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_vertex_layer_export_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_vertex_layer_export_tests.cmake new file mode 100644 index 0000000000..f6bb64c63a --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_vertex_layer_export_tests.cmake @@ -0,0 +1,14 @@ +add_test_executable(agc_vertex_layer_export_tests EXCLUDE_FROM_ALL tests/VertexLayerExport.cpp) +target_link_libraries(agc_vertex_layer_export_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_vertex_layer_export_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_vertex_layer_export_tests) + +if(BUILD_TESTING) + set_target_properties(agc_vertex_layer_export_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_vertex_layer_export COMMAND agc_vertex_layer_export_tests) + set_tests_properties(agc_vertex_layer_export PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1") + if(WIN32) + set_tests_properties(agc_vertex_layer_export PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_vop1_control_decode_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_vop1_control_decode_tests.cmake new file mode 100644 index 0000000000..baa30d351d --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_vop1_control_decode_tests.cmake @@ -0,0 +1,8 @@ +add_test_executable(agc_vop1_control_decode_tests EXCLUDE_FROM_ALL tests/Vop1ControlDecode.cpp) +target_link_libraries(agc_vop1_control_decode_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_vop1_control_decode_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_vop1_control_decode_tests) + +if(BUILD_TESTING) + agc_add_default_test(agc_vop1_control_decode_tests) +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_vop1_sdwa_move_decode_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_vop1_sdwa_move_decode_tests.cmake new file mode 100644 index 0000000000..3a8d68d851 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_vop1_sdwa_move_decode_tests.cmake @@ -0,0 +1,13 @@ +add_test_executable(agc_vop1_sdwa_move_decode_tests EXCLUDE_FROM_ALL tests/Vop1SdwaMoveDecode.cpp) +target_link_libraries(agc_vop1_sdwa_move_decode_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_vop1_sdwa_move_decode_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_vop1_sdwa_move_decode_tests) + +if(BUILD_TESTING) + set_target_properties(agc_vop1_sdwa_move_decode_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_vop1_sdwa_move_decode COMMAND agc_vop1_sdwa_move_decode_tests) + if(WIN32) + set_tests_properties(agc_vop1_sdwa_move_decode PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_vop2_encoding_decode_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_vop2_encoding_decode_tests.cmake new file mode 100644 index 0000000000..9be4428973 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_vop2_encoding_decode_tests.cmake @@ -0,0 +1,13 @@ +add_test_executable(agc_vop2_encoding_decode_tests EXCLUDE_FROM_ALL tests/Vop2EncodingDecode.cpp) +target_link_libraries(agc_vop2_encoding_decode_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_vop2_encoding_decode_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_vop2_encoding_decode_tests) + +if(BUILD_TESTING) + set_target_properties(agc_vop2_encoding_decode_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_vop2_encoding_decode COMMAND agc_vop2_encoding_decode_tests) + if(WIN32) + set_tests_properties(agc_vop2_encoding_decode PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_vop3_interp_decode_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_vop3_interp_decode_tests.cmake new file mode 100644 index 0000000000..3e0ee29002 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_vop3_interp_decode_tests.cmake @@ -0,0 +1,13 @@ +add_test_executable(agc_vop3_interp_decode_tests EXCLUDE_FROM_ALL tests/Vop3InterpDecode.cpp) +target_link_libraries(agc_vop3_interp_decode_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_vop3_interp_decode_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_vop3_interp_decode_tests) + +if(BUILD_TESTING) + set_target_properties(agc_vop3_interp_decode_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_vop3_interp_decode COMMAND agc_vop3_interp_decode_tests) + if(WIN32) + set_tests_properties(agc_vop3_interp_decode PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_wave_control_decode_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_wave_control_decode_tests.cmake new file mode 100644 index 0000000000..e03eea1f7a --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_wave_control_decode_tests.cmake @@ -0,0 +1,14 @@ +add_test_executable(agc_wave_control_decode_tests EXCLUDE_FROM_ALL tests/WaveControlDecode.cpp) +target_include_directories(agc_wave_control_decode_tests PRIVATE ${LIBS_INCLUDE_DIR}) +target_link_libraries(agc_wave_control_decode_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_wave_control_decode_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_wave_control_decode_tests) + +if(BUILD_TESTING) + set_target_properties(agc_wave_control_decode_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_wave_control_decode COMMAND agc_wave_control_decode_tests) + if(WIN32) + set_tests_properties(agc_wave_control_decode PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_worker_sampler_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_worker_sampler_tests.cmake new file mode 100644 index 0000000000..ea73a4bbea --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_worker_sampler_tests.cmake @@ -0,0 +1,13 @@ +if(BUILD_TESTING) + if(WIN32) + add_test_executable(agc_worker_sampler_tests tests/WorkerSampler.cpp Execution/src/WorkerSampler.cpp) + target_include_directories(agc_worker_sampler_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(agc_worker_sampler_tests PRIVATE libc) + configure_windows_unwind(agc_worker_sampler_tests) + foreach(mode default selected unselected process) + add_test(NAME agc_worker_sampler_${mode} COMMAND agc_worker_sampler_tests ${mode}) + set_tests_properties(agc_worker_sampler_${mode} PROPERTIES TIMEOUT 20 ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endforeach() + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_write_tracking_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_write_tracking_tests.cmake new file mode 100644 index 0000000000..c2a9e93d4e --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_write_tracking_tests.cmake @@ -0,0 +1,33 @@ +add_test_executable(agc_write_tracking_tests EXCLUDE_FROM_ALL + tests/WriteTracking.cpp + Execution/src/GuestMemory.cpp + Execution/src/PerformanceTraceThread.cpp +) +target_include_directories(agc_write_tracking_tests PRIVATE ${LIBS_INCLUDE_DIR}) +target_link_libraries(agc_write_tracking_tests PRIVATE shader_recompiler_agc_driver libc) +set_target_properties(agc_write_tracking_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_write_tracking_tests) + +if(BUILD_TESTING) + set_target_properties(agc_write_tracking_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_write_tracking COMMAND agc_write_tracking_tests) + set_tests_properties(agc_write_tracking PROPERTIES SKIP_RETURN_CODE 77) + if(WIN32) + add_test(NAME agc_write_tracking_metadata_commit COMMAND agc_write_tracking_tests --metadata-commit) + set_tests_properties(agc_write_tracking_metadata_commit PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 30) + add_test(NAME agc_write_tracking_cpu_write_pin COMMAND agc_write_tracking_tests --cpu-write-pin) + set_tests_properties(agc_write_tracking_cpu_write_pin PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 20) + add_test(NAME agc_resident_direct_remap COMMAND agc_write_tracking_tests --resident-direct-remap) + set_tests_properties(agc_resident_direct_remap PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 20) + add_test(NAME agc_rewatched_direct_shared COMMAND agc_write_tracking_tests --rewatched-direct-shared) + set_tests_properties(agc_rewatched_direct_shared PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 20) + add_test(NAME agc_import_alias_shared COMMAND agc_write_tracking_tests --import-alias-shared) + set_tests_properties(agc_import_alias_shared PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 20) + add_test(NAME agc_compared_shared_generations COMMAND agc_write_tracking_tests --compared-shared-generations) + set_tests_properties(agc_compared_shared_generations PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 20) + add_test(NAME agc_write_tracking_rewatch_import_pages COMMAND agc_write_tracking_tests --rewatch-import-pages) + set_tests_properties(agc_write_tracking_rewatch_import_pages PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 20) + set_tests_properties(agc_write_tracking agc_write_tracking_metadata_commit agc_write_tracking_cpu_write_pin agc_resident_direct_remap agc_rewatched_direct_shared agc_import_alias_shared agc_compared_shared_generations agc_write_tracking_rewatch_import_pages PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_write_watch_coverage_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_write_watch_coverage_tests.cmake new file mode 100644 index 0000000000..4440ebdc39 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_write_watch_coverage_tests.cmake @@ -0,0 +1,11 @@ +if(BUILD_TESTING) + add_test_executable(agc_write_watch_coverage_tests tests/WriteWatchCoverage.cpp) + target_include_directories(agc_write_watch_coverage_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(agc_write_watch_coverage_tests PRIVATE libc) + configure_windows_unwind(agc_write_watch_coverage_tests) + add_test(NAME agc_write_watch_coverage COMMAND agc_write_watch_coverage_tests) + if(WIN32) + set_tests_properties(agc_write_watch_coverage PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/agc_written_buffer_index_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_written_buffer_index_tests.cmake new file mode 100644 index 0000000000..b6f71fc860 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/agc_written_buffer_index_tests.cmake @@ -0,0 +1,18 @@ +add_test_executable(agc_written_buffer_index_tests EXCLUDE_FROM_ALL + tests/WrittenBufferIndex.cpp + Execution/src/Driver/Memory/WrittenBufferIndex.cpp +) +target_include_directories(agc_written_buffer_index_tests PRIVATE ${LIBS_INCLUDE_DIR}) +target_link_libraries(agc_written_buffer_index_tests PRIVATE libc) +set_target_properties(agc_written_buffer_index_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(agc_written_buffer_index_tests) + +if(BUILD_TESTING) + set_target_properties(agc_written_buffer_index_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME agc_written_buffer_index COMMAND agc_written_buffer_index_tests) + set_tests_properties(agc_written_buffer_index PROPERTIES TIMEOUT 60) + if(WIN32) + set_tests_properties(agc_written_buffer_index PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/aperture_sources_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/aperture_sources_tests.cmake new file mode 100644 index 0000000000..0f1b42653e --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/aperture_sources_tests.cmake @@ -0,0 +1,10 @@ +if(BUILD_TESTING) + add_test_executable(aperture_sources_tests ${LIBS_INCLUDE_DIR}/tests/ApertureSources.cpp) + target_link_libraries(aperture_sources_tests PRIVATE shader_recompiler_agc_driver libc) + configure_windows_unwind(aperture_sources_tests) + add_test(NAME aperture_sources COMMAND aperture_sources_tests) + if(WIN32) + set_tests_properties(aperture_sources PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/bitfield_mask_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/bitfield_mask_tests.cmake new file mode 100644 index 0000000000..a6c1ff7621 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/bitfield_mask_tests.cmake @@ -0,0 +1,10 @@ +if(BUILD_TESTING) + add_test_executable(bitfield_mask_tests ${LIBS_INCLUDE_DIR}/tests/BitfieldMask.cpp) + target_link_libraries(bitfield_mask_tests PRIVATE shader_recompiler_agc_driver libc) + configure_windows_unwind(bitfield_mask_tests) + add_test(NAME bitfield_mask COMMAND bitfield_mask_tests) + if(WIN32) + set_tests_properties(bitfield_mask PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/guest_agc_driver_debug_unavailable_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/guest_agc_driver_debug_unavailable_tests.cmake new file mode 100644 index 0000000000..b73390837c --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/guest_agc_driver_debug_unavailable_tests.cmake @@ -0,0 +1,11 @@ +if(BUILD_TESTING) + add_test_executable(guest_agc_driver_debug_unavailable_tests ${LIBS_INCLUDE_DIR}/tests/GuestAgcDriverDebugUnavailable.cpp) + target_include_directories(guest_agc_driver_debug_unavailable_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_agc_driver_debug_unavailable_tests PRIVATE libSceAgcDriver libc) + configure_windows_unwind(guest_agc_driver_debug_unavailable_tests) + add_test(NAME guest_agc_driver_debug_unavailable COMMAND guest_agc_driver_debug_unavailable_tests) + if(WIN32) + set_tests_properties(guest_agc_driver_debug_unavailable PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/guest_agc_driver_resources_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/guest_agc_driver_resources_tests.cmake new file mode 100644 index 0000000000..c9c6c89393 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/guest_agc_driver_resources_tests.cmake @@ -0,0 +1,11 @@ +if(BUILD_TESTING) + add_test_executable(guest_agc_driver_resources_tests ${LIBS_INCLUDE_DIR}/tests/GuestAgcDriverResources.cpp) + target_include_directories(guest_agc_driver_resources_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_agc_driver_resources_tests PRIVATE libSceAgcDriver libc) + configure_windows_unwind(guest_agc_driver_resources_tests) + add_test(NAME guest_agc_driver_resources COMMAND guest_agc_driver_resources_tests) + if(WIN32) + set_tests_properties(guest_agc_driver_resources PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/guest_indexed_draw_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/guest_indexed_draw_tests.cmake new file mode 100644 index 0000000000..5bf4d82f52 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/guest_indexed_draw_tests.cmake @@ -0,0 +1,11 @@ +if(BUILD_TESTING) + add_test_executable(guest_indexed_draw_tests ${LIBS_INCLUDE_DIR}/tests/GuestIndexedDraw.cpp) + target_include_directories(guest_indexed_draw_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_indexed_draw_tests PRIVATE libSceAgc libSceAgcDriver libc) + configure_windows_unwind(guest_indexed_draw_tests) + add_test(NAME guest_indexed_draw COMMAND guest_indexed_draw_tests) + if(WIN32) + set_tests_properties(guest_indexed_draw PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/guest_rendering_wait_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/guest_rendering_wait_tests.cmake new file mode 100644 index 0000000000..0581056188 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/guest_rendering_wait_tests.cmake @@ -0,0 +1,11 @@ +if(BUILD_TESTING) + add_test_executable(guest_rendering_wait_tests ${LIBS_INCLUDE_DIR}/tests/GuestRenderingWait.cpp) + target_include_directories(guest_rendering_wait_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_rendering_wait_tests PRIVATE libSceAgcDriver libc) + configure_windows_unwind(guest_rendering_wait_tests) + add_test(NAME guest_rendering_wait COMMAND guest_rendering_wait_tests) + if(WIN32) + set_tests_properties(guest_rendering_wait PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/image_by_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/image_by_tests.cmake new file mode 100644 index 0000000000..499439f6bd --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/image_by_tests.cmake @@ -0,0 +1,10 @@ +if(BUILD_TESTING) + add_test_executable(image_by_tests ${LIBS_INCLUDE_DIR}/tests/ImageBy.cpp) + target_link_libraries(image_by_tests PRIVATE shader_recompiler_agc_driver libc) + configure_windows_unwind(image_by_tests) + add_test(NAME image_by COMMAND image_by_tests) + if(WIN32) + set_tests_properties(image_by PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/image_msaa_load_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/image_msaa_load_tests.cmake new file mode 100644 index 0000000000..8b77169352 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/image_msaa_load_tests.cmake @@ -0,0 +1,10 @@ +if(BUILD_TESTING) + add_test_executable(image_msaa_load_tests ${LIBS_INCLUDE_DIR}/tests/ImageMsaaLoad.cpp) + target_link_libraries(image_msaa_load_tests PRIVATE shader_recompiler_agc_driver libc) + configure_windows_unwind(image_msaa_load_tests) + add_test(NAME image_msaa_load COMMAND image_msaa_load_tests) + if(WIN32) + set_tests_properties(image_msaa_load PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/image_pck_n_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/image_pck_n_tests.cmake new file mode 100644 index 0000000000..4885766088 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/image_pck_n_tests.cmake @@ -0,0 +1,10 @@ +if(BUILD_TESTING) + add_test_executable(image_pck_n_tests ${LIBS_INCLUDE_DIR}/tests/ImagePckN.cpp) + target_link_libraries(image_pck_n_tests PRIVATE shader_recompiler_agc_driver libc) + configure_windows_unwind(image_pck_n_tests) + add_test(NAME image_pck_n COMMAND image_pck_n_tests) + if(WIN32) + set_tests_properties(image_pck_n PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/image_sample_gather_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/image_sample_gather_tests.cmake new file mode 100644 index 0000000000..20ba47faf9 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/image_sample_gather_tests.cmake @@ -0,0 +1,10 @@ +if(BUILD_TESTING) + add_test_executable(image_sample_gather_tests ${LIBS_INCLUDE_DIR}/tests/ImageSampleGather.cpp) + target_link_libraries(image_sample_gather_tests PRIVATE shader_recompiler_agc_driver libc) + configure_windows_unwind(image_sample_gather_tests) + add_test(NAME image_sample_gather COMMAND image_sample_gather_tests) + if(WIN32) + set_tests_properties(image_sample_gather PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/interpolation_reference_range_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/interpolation_reference_range_tests.cmake new file mode 100644 index 0000000000..9811a4ad52 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/interpolation_reference_range_tests.cmake @@ -0,0 +1,10 @@ +if(BUILD_TESTING) + add_test_executable(interpolation_reference_range_tests ${LIBS_INCLUDE_DIR}/tests/InterpolationReferenceRange.cpp) + target_link_libraries(interpolation_reference_range_tests PRIVATE shader_recompiler_agc_driver libc) + configure_windows_unwind(interpolation_reference_range_tests) + add_test(NAME interpolation_reference_range COMMAND interpolation_reference_range_tests) + if(WIN32) + set_tests_properties(interpolation_reference_range PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/ir_dump_memory_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/ir_dump_memory_tests.cmake new file mode 100644 index 0000000000..3b77faeb42 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/ir_dump_memory_tests.cmake @@ -0,0 +1,10 @@ +if(BUILD_TESTING) + add_test_executable(ir_dump_memory_tests ${LIBS_INCLUDE_DIR}/tests/IrDumpMemory.cpp) + target_link_libraries(ir_dump_memory_tests PRIVATE shader_recompiler_agc_driver libc) + configure_windows_unwind(ir_dump_memory_tests) + add_test(NAME ir_dump_memory COMMAND ir_dump_memory_tests) + if(WIN32) + set_tests_properties(ir_dump_memory PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/linear_display_buffer_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/linear_display_buffer_tests.cmake new file mode 100644 index 0000000000..fc81a7fd21 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/linear_display_buffer_tests.cmake @@ -0,0 +1,11 @@ +if(BUILD_TESTING) + add_test_executable(linear_display_buffer_tests ${LIBS_INCLUDE_DIR}/tests/LinearDisplayBuffer.cpp) + target_include_directories(linear_display_buffer_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) + target_link_libraries(linear_display_buffer_tests PRIVATE libSceAgcDriver libc) + configure_windows_unwind(linear_display_buffer_tests) + add_test(NAME linear_display_buffer COMMAND linear_display_buffer_tests) + if(WIN32) + set_tests_properties(linear_display_buffer PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/pixel_ancillary_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/pixel_ancillary_tests.cmake new file mode 100644 index 0000000000..a3102832ae --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/pixel_ancillary_tests.cmake @@ -0,0 +1,10 @@ +if(BUILD_TESTING) + add_test_executable(pixel_ancillary_tests ${LIBS_INCLUDE_DIR}/tests/PixelAncillary.cpp) + target_link_libraries(pixel_ancillary_tests PRIVATE shader_recompiler_agc_driver libc) + configure_windows_unwind(pixel_ancillary_tests) + add_test(NAME pixel_ancillary COMMAND pixel_ancillary_tests) + if(WIN32) + set_tests_properties(pixel_ancillary PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/ray_tracing_miss_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/ray_tracing_miss_tests.cmake new file mode 100644 index 0000000000..ec4d8935da --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/ray_tracing_miss_tests.cmake @@ -0,0 +1,10 @@ +if(BUILD_TESTING) + add_test_executable(ray_tracing_miss_tests ${LIBS_INCLUDE_DIR}/tests/RayTracingMiss.cpp) + target_link_libraries(ray_tracing_miss_tests PRIVATE shader_recompiler_agc_driver libc) + configure_windows_unwind(ray_tracing_miss_tests) + add_test(NAME ray_tracing_miss COMMAND ray_tracing_miss_tests) + if(WIN32) + set_tests_properties(ray_tracing_miss PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/scalar_bitcount64_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/scalar_bitcount64_tests.cmake new file mode 100644 index 0000000000..f0ddc4807b --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/scalar_bitcount64_tests.cmake @@ -0,0 +1,10 @@ +if(BUILD_TESTING) + add_test_executable(scalar_bitcount64_tests ${LIBS_INCLUDE_DIR}/tests/ScalarBitCount64.cpp) + target_link_libraries(scalar_bitcount64_tests PRIVATE shader_recompiler_agc_driver libc) + configure_windows_unwind(scalar_bitcount64_tests) + add_test(NAME scalar_bitcount64 COMMAND scalar_bitcount64_tests) + if(WIN32) + set_tests_properties(scalar_bitcount64 PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/scalar_call_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/scalar_call_tests.cmake new file mode 100644 index 0000000000..a6d2e23ca0 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/scalar_call_tests.cmake @@ -0,0 +1,10 @@ +if(BUILD_TESTING) + add_test_executable(scalar_call_tests ${LIBS_INCLUDE_DIR}/tests/ScalarCall.cpp) + target_link_libraries(scalar_call_tests PRIVATE shader_recompiler_agc_driver libc) + configure_windows_unwind(scalar_call_tests) + add_test(NAME scalar_call COMMAND scalar_call_tests) + if(WIN32) + set_tests_properties(scalar_call PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/scalar_saveexec_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/scalar_saveexec_tests.cmake new file mode 100644 index 0000000000..a4a2c7ca13 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/scalar_saveexec_tests.cmake @@ -0,0 +1,10 @@ +if(BUILD_TESTING) + add_test_executable(scalar_saveexec_tests ${LIBS_INCLUDE_DIR}/tests/ScalarSaveexec.cpp) + target_link_libraries(scalar_saveexec_tests PRIVATE shader_recompiler_agc_driver libc) + configure_windows_unwind(scalar_saveexec_tests) + add_test(NAME scalar_saveexec COMMAND scalar_saveexec_tests) + if(WIN32) + set_tests_properties(scalar_saveexec PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/scalar_scratch_load_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/scalar_scratch_load_tests.cmake new file mode 100644 index 0000000000..48eed279b8 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/scalar_scratch_load_tests.cmake @@ -0,0 +1,10 @@ +if(BUILD_TESTING) + add_test_executable(scalar_scratch_load_tests ${LIBS_INCLUDE_DIR}/tests/ScalarScratchLoad.cpp) + target_link_libraries(scalar_scratch_load_tests PRIVATE shader_recompiler_agc_driver libc) + configure_windows_unwind(scalar_scratch_load_tests) + add_test(NAME scalar_scratch_load COMMAND scalar_scratch_load_tests) + if(WIN32) + set_tests_properties(scalar_scratch_load PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/scalar_swappc_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/scalar_swappc_tests.cmake new file mode 100644 index 0000000000..1be60bd399 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/scalar_swappc_tests.cmake @@ -0,0 +1,10 @@ +if(BUILD_TESTING) + add_test_executable(scalar_swappc_tests ${LIBS_INCLUDE_DIR}/tests/ScalarSwappc.cpp) + target_link_libraries(scalar_swappc_tests PRIVATE shader_recompiler_agc_driver libc) + configure_windows_unwind(scalar_swappc_tests) + add_test(NAME scalar_swappc COMMAND scalar_swappc_tests) + if(WIN32) + set_tests_properties(scalar_swappc PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/shader_buffer_address_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/shader_buffer_address_tests.cmake new file mode 100644 index 0000000000..9eca034cdc --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/shader_buffer_address_tests.cmake @@ -0,0 +1,10 @@ +if(BUILD_TESTING) + add_test_executable(shader_buffer_address_tests ${LIBS_INCLUDE_DIR}/tests/ShaderBufferAddress.cpp) + target_link_libraries(shader_buffer_address_tests PRIVATE shader_recompiler_agc_driver libc) + configure_windows_unwind(shader_buffer_address_tests) + add_test(NAME shader_buffer_address COMMAND shader_buffer_address_tests) + if(WIN32) + set_tests_properties(shader_buffer_address PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/texture_format_lookup_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/texture_format_lookup_tests.cmake new file mode 100644 index 0000000000..e91616eedb --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/texture_format_lookup_tests.cmake @@ -0,0 +1,11 @@ +if(BUILD_TESTING) + add_test_executable(texture_format_lookup_tests ${LIBS_INCLUDE_DIR}/tests/TextureFormatLookup.cpp) + target_include_directories(texture_format_lookup_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR}) + target_link_libraries(texture_format_lookup_tests PRIVATE libSceAgcDriver libc) + configure_windows_unwind(texture_format_lookup_tests) + add_test(NAME texture_format_lookup COMMAND texture_format_lookup_tests) + if(WIN32) + set_tests_properties(texture_format_lookup PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/vector_compare_const_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/vector_compare_const_tests.cmake new file mode 100644 index 0000000000..6ece6bb09d --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/vector_compare_const_tests.cmake @@ -0,0 +1,10 @@ +if(BUILD_TESTING) + add_test_executable(vector_compare_const_tests ${LIBS_INCLUDE_DIR}/tests/VectorCompareConst.cpp) + target_link_libraries(vector_compare_const_tests PRIVATE shader_recompiler_agc_driver libc) + configure_windows_unwind(vector_compare_const_tests) + add_test(NAME vector_compare_const COMMAND vector_compare_const_tests) + if(WIN32) + set_tests_properties(vector_compare_const PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/vector_compare_i16_u16_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/vector_compare_i16_u16_tests.cmake new file mode 100644 index 0000000000..1e4df0377e --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/vector_compare_i16_u16_tests.cmake @@ -0,0 +1,10 @@ +if(BUILD_TESTING) + add_test_executable(vector_compare_i16_u16_tests ${LIBS_INCLUDE_DIR}/tests/VectorCompareI16U16.cpp) + target_link_libraries(vector_compare_i16_u16_tests PRIVATE shader_recompiler_agc_driver libc) + configure_windows_unwind(vector_compare_i16_u16_tests) + add_test(NAME vector_compare_i16_u16 COMMAND vector_compare_i16_u16_tests) + if(WIN32) + set_tests_properties(vector_compare_i16_u16 PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/vector_constant_factor_tininess_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/vector_constant_factor_tininess_tests.cmake new file mode 100644 index 0000000000..aeb958dc28 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/vector_constant_factor_tininess_tests.cmake @@ -0,0 +1,10 @@ +if(BUILD_TESTING) + add_test_executable(vector_constant_factor_tininess_tests ${LIBS_INCLUDE_DIR}/tests/VectorConstantFactorTininess.cpp) + target_link_libraries(vector_constant_factor_tininess_tests PRIVATE shader_recompiler_agc_driver libc) + configure_windows_unwind(vector_constant_factor_tininess_tests) + add_test(NAME vector_constant_factor_tininess COMMAND vector_constant_factor_tininess_tests) + if(WIN32) + set_tests_properties(vector_constant_factor_tininess PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/vector_fused_multiply_add_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/vector_fused_multiply_add_tests.cmake new file mode 100644 index 0000000000..a64684e4db --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/vector_fused_multiply_add_tests.cmake @@ -0,0 +1,10 @@ +if(BUILD_TESTING) + add_test_executable(vector_fused_multiply_add_tests ${LIBS_INCLUDE_DIR}/tests/VectorFusedMultiplyAdd.cpp) + target_link_libraries(vector_fused_multiply_add_tests PRIVATE shader_recompiler_agc_driver libc) + configure_windows_unwind(vector_fused_multiply_add_tests) + add_test(NAME vector_fused_multiply_add COMMAND vector_fused_multiply_add_tests) + if(WIN32) + set_tests_properties(vector_fused_multiply_add PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/vector_mad_legacy_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/vector_mad_legacy_tests.cmake new file mode 100644 index 0000000000..d44268b01c --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/vector_mad_legacy_tests.cmake @@ -0,0 +1,10 @@ +if(BUILD_TESTING) + add_test_executable(vector_mad_legacy_tests ${LIBS_INCLUDE_DIR}/tests/VectorMadLegacy.cpp) + target_link_libraries(vector_mad_legacy_tests PRIVATE shader_recompiler_agc_driver libc) + configure_windows_unwind(vector_mad_legacy_tests) + add_test(NAME vector_mad_legacy COMMAND vector_mad_legacy_tests) + if(WIN32) + set_tests_properties(vector_mad_legacy PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/vector_min_max_med16_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/vector_min_max_med16_tests.cmake new file mode 100644 index 0000000000..ef12da2412 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/vector_min_max_med16_tests.cmake @@ -0,0 +1,10 @@ +if(BUILD_TESTING) + add_test_executable(vector_min_max_med16_tests ${LIBS_INCLUDE_DIR}/tests/VectorMinMaxMed16.cpp) + target_link_libraries(vector_min_max_med16_tests PRIVATE shader_recompiler_agc_driver libc) + configure_windows_unwind(vector_min_max_med16_tests) + add_test(NAME vector_min_max_med16 COMMAND vector_min_max_med16_tests) + if(WIN32) + set_tests_properties(vector_min_max_med16 PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/cmake/wave32_wide_subgroup_tests.cmake b/core/libs/prx/libSceAgcDriver/tests/cmake/wave32_wide_subgroup_tests.cmake new file mode 100644 index 0000000000..fb14aac3cf --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/cmake/wave32_wide_subgroup_tests.cmake @@ -0,0 +1,10 @@ +if(BUILD_TESTING) + add_test_executable(wave32_wide_subgroup_tests ${LIBS_INCLUDE_DIR}/tests/Wave32WideSubgroup.cpp) + target_link_libraries(wave32_wide_subgroup_tests PRIVATE shader_recompiler_agc_driver libc) + configure_windows_unwind(wave32_wide_subgroup_tests) + add_test(NAME wave32_wide_subgroup COMMAND wave32_wide_subgroup_tests) + if(WIN32) + set_tests_properties(wave32_wide_subgroup PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/BufferDescriptorRuntime.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/BufferDescriptorRuntime.cpp index 15aa7c77a2..e847bc1c62 100644 --- a/core/libs/prx/libSceAgcDriver/tests/execution/BufferDescriptorRuntime.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/execution/BufferDescriptorRuntime.cpp @@ -57,13 +57,17 @@ ShaderRecompiler::RecompileRequest Request(std::span userDa }; } -void Run(AgcDriver::VulkanDevice& device, bool registrationModules) { +void Run(AgcDriver::VulkanDevice& device, bool registrationModules, bool coherent = false) { + alignas(256) auto code = Code; + if (coherent) code[1] |= 0x4000u; const std::string mode = registrationModules ? "registration modules" : "specialized modules"; - const std::array memory{{{reinterpret_cast(Code.data()), std::as_bytes(std::span(Code))}}}; + const std::array memory{{{reinterpret_cast(code.data()), std::as_bytes(std::span(code))}}}; std::array userData{}; auto target = device.ComputeTarget(Lanes); target.registrationModules = registrationModules; - const auto request = Request(userData, target, memory); + auto request = Request(userData, target, memory); + request.shader.code = code; + request.shader.codeAddress = reinterpret_cast(code.data()); const auto handle = ShaderRecompiler::PrepareShader(request); const std::array cases{{ {"aligned", 0, 128, true}, @@ -258,6 +262,8 @@ int main() { for (std::uint32_t index = 0; index < InputBytes; ++index) Input[index] = static_cast(index * 41u + 3u + (index >> 3u)); Run(*device, false); Run(*device, true); + Run(*device, false, true); + Run(*device, true, true); ScalarReads(*device); DisabledDescriptors(*device); std::puts("buffer descriptor runtime tests passed"); diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/ComputeTableCalls.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/ComputeTableCalls.cpp index f85c5c7d8a..7934f4cecf 100644 --- a/core/libs/prx/libSceAgcDriver/tests/execution/ComputeTableCalls.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/execution/ComputeTableCalls.cpp @@ -3,6 +3,7 @@ #include "prx/libSceAgcDriver/Graphics/include/Draw.hpp" #include "SceShaders.hpp" #include "VulkanTestDevice.hpp" +#include "tests/TemporaryFile.hpp" #include #include #include @@ -84,7 +85,7 @@ class StderrCapture { public: StderrCapture() { std::fflush(stderr); - file = std::tmpfile(); + file = TemporaryFile::Open(); Require(file != nullptr, "cannot open a temporary file for stderr"); #ifdef _WIN32 saved = _dup(_fileno(stderr)); diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/DepthFastClearSubmit.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/DepthFastClearSubmit.cpp index f535dcfc10..569374c594 100644 --- a/core/libs/prx/libSceAgcDriver/tests/execution/DepthFastClearSubmit.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/execution/DepthFastClearSubmit.cpp @@ -1,6 +1,9 @@ #include "prx/libSceAgcDriver/Execution/include/Driver.hpp" #include "prx/libSceAgcDriver/Execution/include/GuestMemory.hpp" +#include "prx/libSceAgcDriver/Graphics/include/DepthSurface.hpp" +#include "prx/libSceAgcDriver/Graphics/include/GuestBufferMemory.hpp" #include "prx/libSceAgcDriver/Graphics/include/Recorder.hpp" +#include "prx/libSceAgcDriver/Graphics/include/Resources.hpp" #include "prx/libSceAgcDriver/Submit/include/Dcb.hpp" #include "prx/libc/include/GuestAllocations.hpp" #include "prx/libc/include/Shutdown.hpp" @@ -22,6 +25,7 @@ #include #include #include +#include #include #include @@ -269,6 +273,176 @@ void RecordedFillClearsWithoutWait(AgcDriver::VulkanDevice& device, const Shader } } +void RecordedMaskClearClearsWithoutWait(AgcDriver::VulkanDevice& device, const Shaders& shaders) { + const VkStencilOpState writeFive{VK_STENCIL_OP_KEEP, VK_STENCIL_OP_REPLACE, VK_STENCIL_OP_KEEP, VK_COMPARE_OP_ALWAYS, 0xffu, 0xffu, 5u}; + const VkStencilOpState equalZero{VK_STENCIL_OP_KEEP, VK_STENCIL_OP_KEEP, VK_STENCIL_OP_KEEP, VK_COMPARE_OP_EQUAL, 0xffu, 0u, 0u}; + for (const bool stencil : {false, true}) { + auto& htile = NewBlock(); + const Surface surface{NewBlock().Address(), stencil ? NewBlock().Address() : 0, htile.Address(), stencil, stencil ? VK_FORMAT_D32_SFLOAT_S8_UINT : VK_FORMAT_D32_SFLOAT}; + Require(Draw(device, shaders, surface, {.depthWrite = true, .stencilTest = stencil, .stencil = writeFive}) == Covered, "a new depth surface was not cleared to DB_DEPTH_CLEAR (1.0)"); + Require(Draw(device, shaders, surface, {}) == 0u, "a draw at depth 0.5 passed LESS against the 0.5 written before it"); + const auto mask = stencil ? 0x0f0u : 0x3f0u; + { + std::lock_guard lock(AgcDriver::GuestMemory::GpuMutex()); + const std::array words{0x010u & mask, 0x0a0u & mask, 0x150u & mask, 0x3f0u & mask}; + Require(device.FillBuffer(htile.Address(), HtileFillBytes, words), "the words of the HTILE mask clear were not recorded on the GPU"); + device.NoteHtileMask({htile.Address(), HtileFillBytes, mask, 0u}); + } + const auto waits = AgcDriver::Graphics::Recorder::ThreadHookWaits(); + Require(Draw(device, shaders, surface, {.depthWrite = true}) == Covered, stencil ? "a depth and stencil clear by an HTILE mask clear did not clear the depth to DB_DEPTH_CLEAR (1.0)" : "a depth clear by an HTILE mask clear did not clear the depth to DB_DEPTH_CLEAR (1.0)"); + Require(AgcDriver::Graphics::Recorder::ThreadHookWaits() == waits, "the bind of the depth target waited for the GPU to run the HTILE mask clear recorded over its HTILE"); + const auto expanded = stencil ? 0xfffff3ffu : 0xfffc000fu; + Require(AllWords(WordsAt(htile, 0), expanded), stencil ? "the bind after a depth and stencil HTILE mask clear did not store it back as expanded (0xfffff3ff)" : "the bind after a depth HTILE mask clear did not store it back as expanded (0xfffc000f)"); + if (stencil) Require(Draw(device, shaders, surface, {.depthTest = false, .stencilTest = true, .stencil = equalZero}) == Covered, "a depth and stencil HTILE mask clear did not clear the stencil to 0"); + Require(Draw(device, shaders, surface, {}) == 0u, "the depth drawn after the clear by the HTILE mask clear was cleared again"); + } +} + +void RecordedMaskKeepingZMaskReadsBack(AgcDriver::VulkanDevice& device, const Shaders& shaders) { + for (const bool stencil : {false, true}) { + auto& htile = NewBlock(); + const Surface surface{NewBlock().Address(), stencil ? NewBlock().Address() : 0, htile.Address(), stencil, stencil ? VK_FORMAT_D32_SFLOAT_S8_UINT : VK_FORMAT_D32_SFLOAT}; + Require(Draw(device, shaders, surface, {.depthWrite = true}) == Covered, "a new depth surface was not cleared to DB_DEPTH_CLEAR (1.0)"); + Require(Draw(device, shaders, surface, {}) == 0u, "a draw at depth 0.5 passed LESS against the 0.5 written before it"); + const auto mask = stencil ? 0x0ffu : 0x3ffu; + { + std::lock_guard lock(AgcDriver::GuestMemory::GpuMutex()); + const std::array words{0x015u & mask, 0x0a0u & mask, 0x15au & mask, 0x3ffu & mask}; + Require(device.FillBuffer(htile.Address(), HtileFillBytes, words), "the words of the HTILE mask clear were not recorded on the GPU"); + device.NoteHtileMask({htile.Address(), HtileFillBytes, mask, 0u}); + } + const auto waits = AgcDriver::Graphics::Recorder::ThreadHookWaits(); + Require(Draw(device, shaders, surface, {.depthWrite = true}) == 0u, "an HTILE mask clear that keeps non-zero ZMask bits cleared the depth"); + Require(AgcDriver::Graphics::Recorder::ThreadHookWaits() != waits, "the bind after an HTILE mask clear that keeps the ZMask did not read the HTILE back"); + } +} + +void RecordHtileWords(const AgcDriver::Graphics::Context& context, AgcDriver::Graphics::Recorder& recorder, const GuestBlock& htile, std::uint32_t word) { + using namespace AgcDriver::Graphics; + recorder.Activate(); + const auto* import = HostImportFor(context, htile.Address(), HtileBytes); + Require(import != nullptr, "the recorder lifetime fixture requires an imported HTILE"); + const auto commands = recorder.Commands(); + RecordMemoryBarrier(context, commands, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT | VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_ACCESS_MEMORY_WRITE_BIT | VK_ACCESS_HOST_WRITE_BIT, VK_ACCESS_TRANSFER_WRITE_BIT); + context.Function("vkCmdFillBuffer")(commands, import->buffer, htile.Address() - import->base, HtileBytes, word); + RecordMemoryBarrier(context, commands, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT | VK_PIPELINE_STAGE_HOST_BIT, VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT | VK_ACCESS_HOST_READ_BIT); + recorder.NotePendingWrite(htile.Address(), HtileBytes); + AgcDriver::GuestMemory::MarkWritten(htile.Address(), HtileBytes); +} + +void RecreatedRecorderReadsHtile(AgcDriver::VulkanDevice& device, bool clearSurfaces) { + using namespace AgcDriver::Graphics; + device.WaitIdle(); + std::lock_guard lock(AgcDriver::GuestMemory::GpuMutex()); + const auto context = device.graphicsContext(); + auto* previous = Recorder::Active(); + auto& htile = NewBlock(); + const DepthTarget target{NewBlock().Address(), 0, {64, 32}, VK_FORMAT_D32_SFLOAT, 1.0f, 0, htile.Address(), false}; + std::optional recorder; + recorder.emplace(context); + const auto* address = &*recorder; + RecordHtileWords(context, *recorder, htile, 0xf0u); + const auto note = recorder->NewestWriteNote(htile.Address(), HtileBytes); + NoteHtileMaskOnGpu(context, {htile.Address(), HtileBytes, 0x3f0u, 0u}); + recorder.reset(); + if (clearSurfaces) ClearDepthSurfaces(context.device); + recorder.emplace(context); + Require(&*recorder == address, "the replacement recorder did not reuse the original storage"); + RecordHtileWords(context, *recorder, htile, 0xfu); + Require(recorder->NewestWriteNote(htile.Address(), HtileBytes) == note, "the replacement recorder did not reuse the original note"); + const auto waits = Recorder::ThreadHookWaits(); + Require(DepthSurfaceView(context, target) != VK_NULL_HANDLE, "the replacement recorder could not bind the depth surface"); + const auto waited = Recorder::ThreadHookWaits() != waits; + recorder->Sync(); + const auto words = WordsAt(htile, 0); + const auto preserved = AllWords(words, 0xfu); + std::printf("HTILE recorder reuse: cleanup=%d note=%llu waited=%d preserved=%d first=0x%08x\n", clearSurfaces, static_cast(note), waited, preserved, words[0]); + recorder.reset(); + ClearDepthSurfaces(context.device); + if (previous != nullptr) previous->Activate(); + Require(waited && preserved, "a replacement recorder reused a stale mask proof instead of reading back its ordinary HTILE write"); +} + +void CheckRecordedHtile(const AgcDriver::Graphics::Context& context, AgcDriver::Graphics::Recorder& recorder, GuestBlock& htile, bool expectedWait, std::uint32_t expectedWord, const std::string& label) { + using namespace AgcDriver::Graphics; + RecordHtileWords(context, recorder, NewBlock(), 0u); + const DepthTarget target{NewBlock().Address(), 0, {64, 32}, VK_FORMAT_D32_SFLOAT, 1.0f, 0, htile.Address(), false}; + const auto waits = Recorder::ThreadHookWaits(); + Require(DepthSurfaceView(context, target) != VK_NULL_HANDLE, label + ": could not bind the depth surface"); + const bool waited = Recorder::ThreadHookWaits() != waits; + recorder.Sync(); + const auto* words = WordsAt(htile, 0); + const bool correct = AllWords(words, expectedWord); + std::printf("HTILE %s: waited=%d correct=%d first=0x%08x\n", label.c_str(), waited, correct, words[0]); + Require(waited == expectedWait && correct, label + ": wrong HTILE readback or metadata bytes"); +} + +void LiveRecorderMaskIsolation(AgcDriver::VulkanDevice& device) { + using namespace AgcDriver::Graphics; + device.WaitIdle(); + std::lock_guard lock(AgcDriver::GuestMemory::GpuMutex()); + const auto context = device.graphicsContext(); + auto* previous = Recorder::Active(); + { + auto& htile = NewBlock(); + Recorder first(context); + Recorder second(context); + RecordHtileWords(context, first, htile, 0xf0u); + NoteHtileMaskOnGpu(context, {htile.Address(), HtileBytes, 0x3f0u, 0u}); + RecordHtileWords(context, second, htile, 0xfu); + Require(first.NewestWriteNote(htile.Address(), HtileBytes) == second.NewestWriteNote(htile.Address(), HtileBytes), "live recorders did not reuse the same note"); + CheckRecordedHtile(context, second, htile, true, 0xfu, "live owner isolation"); + CheckRecordedHtile(context, first, htile, false, 0xfffc000fu, "same owner mask"); + } + ClearDepthSurfaces(context.device); + if (previous != nullptr) previous->Activate(); +} + +void MaskCleanupIsolation(AgcDriver::VulkanDevice& device, AgcDriver::VulkanDevice& otherDevice) { + using namespace AgcDriver::Graphics; + device.WaitIdle(); + otherDevice.WaitIdle(); + std::lock_guard lock(AgcDriver::GuestMemory::GpuMutex()); + const auto context = device.graphicsContext(); + const auto otherContext = otherDevice.graphicsContext(); + Require(context.device != otherContext.device, "the device cleanup fixture requires distinct Vulkan devices"); + auto* previous = Recorder::Active(); + { + auto& firstHtile = NewBlock(); + auto& secondHtile = NewBlock(); + std::optional first; + first.emplace(context); + Recorder second(context); + RecordHtileWords(context, *first, firstHtile, 0xf0u); + NoteHtileMaskOnGpu(context, {firstHtile.Address(), HtileBytes, 0x3f0u, 0u}); + RecordHtileWords(context, second, secondHtile, 0xf0u); + NoteHtileMaskOnGpu(context, {secondHtile.Address(), HtileBytes, 0x3f0u, 0u}); + first.reset(); + CheckRecordedHtile(context, second, secondHtile, false, 0xfffc000fu, "other owner survives recorder cleanup"); + } + { + auto& firstHtile = NewBlock(); + auto& secondHtile = NewBlock(); + auto& otherHtile = NewBlock(); + Recorder first(context); + Recorder second(context); + Recorder other(otherContext); + RecordHtileWords(context, first, firstHtile, 0xf0u); + NoteHtileMaskOnGpu(context, {firstHtile.Address(), HtileBytes, 0x3f0u, 0u}); + RecordHtileWords(context, second, secondHtile, 0xf0u); + NoteHtileMaskOnGpu(context, {secondHtile.Address(), HtileBytes, 0x3f0u, 0u}); + RecordHtileWords(otherContext, other, otherHtile, 0xf0u); + NoteHtileMaskOnGpu(otherContext, {otherHtile.Address(), HtileBytes, 0x3f0u, 0u}); + ClearDepthSurfaces(context.device); + CheckRecordedHtile(context, first, firstHtile, true, 0xfffc000fu, "device cleanup first owner"); + CheckRecordedHtile(context, second, secondHtile, true, 0xfffc000fu, "device cleanup second owner"); + CheckRecordedHtile(otherContext, other, otherHtile, false, 0xfffc000fu, "other device survives cleanup"); + } + ClearDepthSurfaces(context.device); + ClearDepthSurfaces(otherContext.device); + if (previous != nullptr) previous->Activate(); +} + void DepthOnlyFillKeepsStencil(AgcDriver::VulkanDevice& device, const Shaders& shaders) { const auto& htile = NewBlock(); const Surface surface{NewBlock().Address(), NewBlock().Address(), htile.Address(), true, VK_FORMAT_D32_SFLOAT_S8_UINT}; @@ -285,10 +459,25 @@ void DepthOnlyFillKeepsStencil(AgcDriver::VulkanDevice& device, const Shaders& s } -int main() { +int main(int argc, char** argv) { try { const auto device = OpenVulkanTestDevice(); if (!device) return VulkanTestSkipped; + if (argc == 2 && std::string(argv[1]) == "--mask-lifetime") { + const auto otherDevice = OpenVulkanTestDevice(); + if (!otherDevice) return VulkanTestSkipped; + if (!StoresFills(*device, NewBlock()) || !StoresFills(*otherDevice, NewBlock())) { + std::puts("skipped HTILE mask lifetime: the Vulkan devices cannot fill imported guest memory"); + return VulkanTestSkipped; + } + RecreatedRecorderReadsHtile(*device, false); + RecreatedRecorderReadsHtile(*device, true); + LiveRecorderMaskIsolation(*device); + MaskCleanupIsolation(*device, *otherDevice); + LibcRunShutdown_nid_postfix(); + std::puts("HTILE mask recorder lifetime tests passed"); + return 0; + } const auto shaders = Compile(*device); DmaFillClearsDepth(*device, shaders); DepthOnlyFillKeepsStencil(*device, shaders); @@ -299,6 +488,8 @@ int main() { MixedClearedSliceClears(*device, shaders); if (computeRan) { RecordedFillClearsWithoutWait(*device, shaders); + RecordedMaskClearClearsWithoutWait(*device, shaders); + RecordedMaskKeepingZMaskReadsBack(*device, shaders); DispatchFillClearsDepth(*device, shaders); DispatchBufferPatternFillClearsDepth(*device, shaders); UnknownKernelClearsTwice(*device, shaders); diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/DescriptorWebFaults.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/DescriptorWebFaults.cpp index a522e40647..dc0524d6a8 100644 --- a/core/libs/prx/libSceAgcDriver/tests/execution/DescriptorWebFaults.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/execution/DescriptorWebFaults.cpp @@ -2,6 +2,7 @@ #include "prx/libSceAgcDriver/Execution/include/VulkanDevice.hpp" #include "Recompiler.hpp" #include "VulkanTestDevice.hpp" +#include "tests/TemporaryFile.hpp" #include #include #include @@ -85,7 +86,7 @@ class StderrCapture { public: StderrCapture() { std::fflush(stderr); - file = std::tmpfile(); + file = TemporaryFile::Open(); Require(file != nullptr, "cannot open a temporary file for stderr"); #ifdef _WIN32 saved = _dup(_fileno(stderr)); diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/DrawRelocateUserValues.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/DrawRelocateUserValues.cpp new file mode 100644 index 0000000000..1c2407762f --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/execution/DrawRelocateUserValues.cpp @@ -0,0 +1,311 @@ +#include "prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp" +#include "prx/libSceAgcDriver/Execution/include/GuestMemory.hpp" +#include "prx/libSceAgcDriver/Graphics/include/Draw.hpp" +#include "prx/libSceAgcDriver/Submit/include/Dcb.hpp" +#include "RdnaDecoder/RdnaInstructionDecoder.hpp" +#include "Recompiler.hpp" +#include "VulkanTestDevice.hpp" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { + +using AgcDriver::Graphics::Require; +using AgcDriver::DriverDetail::DispatchVariant; +using AgcDriver::DriverDetail::DrawProgram; +using AgcDriver::DriverDetail::Driver; +using AgcDriver::DriverDetail::RelocatableUserWord; +using ShaderRecompiler::RecompileResult; + +alignas(256) constexpr std::array SwappcCode{0xbe822100u, 0xbf810000u}; +alignas(256) std::array FirstCallee{}; +alignas(256) std::array SecondCallee{}; +alignas(256) std::array OtherCallee{}; +alignas(256) std::array Buffer{}; + +void Fill(std::array& callee, std::uint32_t first) { + callee.fill(0xbf810000u); + callee[0] = first; + callee[1] = 0xbe802002u; +} + +std::uint32_t Low(const void* address) { + return static_cast(reinterpret_cast(address)); +} + +std::uint32_t High(const void* address) { + return static_cast(static_cast(reinterpret_cast(address)) >> 32u); +} + +DrawProgram VertexProgram(const void* callee) { + DrawProgram program{}; + program.binary.stage = ShaderRecompiler::ShaderStage::Vertex; + program.binary.code = SwappcCode; + program.firstUserSgpr = 0; + program.userData = {Low(callee), High(callee), 0u, 0u}; + return program; +} + +std::shared_ptr Variant(std::shared_ptr compiled) { + auto variant = std::make_shared(); + variant->compiled = std::move(compiled); + return variant; +} + +ShaderRecompiler::DescriptorBinding GuestBuffer(std::vector descriptor, bool written) { + ShaderRecompiler::DescriptorBinding binding{ShaderRecompiler::DescriptorKind::StorageBuffer, ShaderRecompiler::DescriptorRole::GuestBuffers, 0, 0, 1, std::move(descriptor)}; + binding.bufferWritten = {written}; + binding.bufferAtomic = {false}; + binding.bufferRead = {true}; + return binding; +} + +void CalleeWordsAreKeyedByTheirCode() { + ShaderRecompiler::SetGcnGuestShaders(true); + Fill(FirstCallee, 0x7e000280u); + Fill(SecondCallee, 0x7e000280u); + Fill(OtherCallee, 0x7e000281u); + const auto program = VertexProgram(FirstCallee.data()); + const auto variant = Variant(std::make_shared()); + Driver::tagUserValueWords(*variant, program); + Require(variant->calleeWords == 1u && variant->calleeReads.size() == 1u && variant->calleeReads[0].first == 0u, "the fetch subroutine pointer in s[0:1] was not tagged as a callee word (mask " + std::to_string(variant->calleeWords) + ")"); + Require(variant->calleeReads[0].second == 2u, "the callee was measured as " + std::to_string(variant->calleeReads[0].second) + " words, expected 2"); + const RelocatableUserWord word{0u, {{0, variant->calleeReads[0].second}}, false, High(FirstCallee.data())}; + bool readable = true; + const auto first = Driver::relocatedContentKey(word, Low(FirstCallee.data()), readable); + const auto second = Driver::relocatedContentKey(word, Low(SecondCallee.data()), readable); + const auto other = Driver::relocatedContentKey(word, Low(OtherCallee.data()), readable); + Require(readable, "a callee in mapped memory was reported unreadable"); + Require(first == second, "two copies of the same callee code at different addresses keyed differently"); + Require(first != other, "callees with different code keyed the same"); + + auto bound = std::make_shared(); + bound->bindings.push_back(GuestBuffer({Low(FirstCallee.data()), 0u, 16u, 0u}, false)); + const auto boundVariant = Variant(bound); + Driver::tagUserValueWords(*boundVariant, program); + Require(boundVariant->calleeWords == 0u, "a call target that also feeds a bound descriptor was tagged as a callee word"); + + ShaderRecompiler::SetGcnGuestShaders(false); + const auto rdna = Variant(std::make_shared()); + Driver::tagUserValueWords(*rdna, program); + Require(rdna->calleeWords == 0u, "a vertex program was tagged for GCN user-data callees outside GCN guest shaders"); +} + +void BufferValueWordsArePatchedInTheirBinding() { + ShaderRecompiler::SetGcnGuestShaders(false); + const std::vector descriptor{Low(Buffer.data()), High(Buffer.data()) | (16u << 16u), 4u, 0x20077facu}; + DrawProgram program{}; + program.binary.stage = ShaderRecompiler::ShaderStage::Fragment; + program.firstUserSgpr = 0; + program.userData = {0u, 0u, 0u, 0u, descriptor[0], descriptor[1], descriptor[2], descriptor[3]}; + const auto result = [&](bool written) { + auto compiled = std::make_shared(); + compiled->bindings.push_back(GuestBuffer(descriptor, written)); + return compiled; + }; + + const auto variant = Variant(result(false)); + Driver::tagUserValueWords(*variant, program); + Require(variant->valueWords == ((1u << 4u) | (1u << 6u)), "the base and record words of a read-only V# in user data were not tagged (mask " + std::to_string(variant->valueWords) + ")"); + Require(variant->valueSlots.size() == 2u && variant->valueSlots[0] == std::array{4u, 0u, 0u} && variant->valueSlots[1] == std::array{6u, 0u, 2u}, "the tagged V# words do not name their binding words"); + variant->descriptorPatches = {{0u, 0u, descriptor[0] + 0x100u}, {0u, 2u, 7u}}; + Driver::applyShaderDataPatches(*variant); + const auto& patched = variant->compiled->bindings[0].guestDescriptor; + Require(patched[0] == descriptor[0] + 0x100u && patched[1] == descriptor[1] && patched[2] == 7u && patched[3] == descriptor[3], "the descriptor patches did not move the bound V# base and record count"); + Require(variant->descriptorPatches.empty(), "the descriptor patches were kept after they were applied"); + + const auto written = Variant(result(true)); + Driver::tagUserValueWords(*written, program); + Require(written->valueWords == 0u, "a V# the shader writes through was tagged as relocatable"); + + auto pushedResult = result(false); + pushedResult->pushConstants.resize(sizeof(std::uint32_t)); + std::memcpy(pushedResult->pushConstants.data(), &descriptor[0], sizeof(std::uint32_t)); + const auto pushed = Variant(pushedResult); + Driver::tagUserValueWords(*pushed, program); + Require((pushed->valueWords >> 4u & 1u) == 0u, "a V# base that is also a push constant word not forwarded from it was tagged"); + auto forwardedResult = std::make_shared(*pushedResult); + forwardedResult->shaderDataUserWords = {4u}; + const auto forwarded = Variant(forwardedResult); + Driver::tagUserValueWords(*forwarded, program); + Require((forwarded->valueWords >> 4u & 1u) != 0u, "a V# base forwarded from its own user word as push data was not tagged"); + + const auto captured = Variant(result(false)); + captured->runs = {{reinterpret_cast(Buffer.data()) + 16u, reinterpret_cast(Buffer.data()) + 32u}}; + Driver::tagUserValueWords(*captured, program); + Require(captured->valueWords == 0u, "a V# whose memory the stage captured was tagged as relocatable"); + + const auto pointer = Variant(result(false)); + pointer->relocatableWords = 1u << 4u; + Driver::tagUserValueWords(*pointer, program); + Require((pointer->valueWords >> 4u & 1u) == 0u, "a user word relocated as a pointer was also tagged as a V# value"); + + const auto shared = [&](std::uint32_t otherRecords) { + auto compiled = result(false); + compiled->bindings.push_back(GuestBuffer({Low(Buffer.data()) + 0x100u, descriptor[1], otherRecords, descriptor[3]}, false)); + compiled->bindings.back().binding = 1; + const auto variant = Variant(compiled); + Driver::tagUserValueWords(*variant, program); + return variant; + }; + const auto sharedCount = shared(descriptor[2]); + Require((sharedCount->valueWords >> 4u & 1u) != 0u && (sharedCount->valueWords >> 6u & 1u) == 0u, "a record count that also builds a second descriptor was tagged (mask " + std::to_string(sharedCount->valueWords) + ")"); + Require(sharedCount->valueSlots.size() == 1u && sharedCount->valueSlots[0] == std::array{4u, 0u, 0u}, "a V# whose record count builds a second descriptor recorded a record-count patch"); + const auto ownCount = shared(descriptor[2] + 1u); + Require((ownCount->valueWords >> 6u & 1u) != 0u, "a record count used by one descriptor only was not tagged next to an independent second descriptor"); +} + +alignas(256) constexpr std::array VertexCode{ + 0x7e000d05u, 0x080200f4u, 0x10020300u, 0x100202f4u, 0x060202f3u, 0x060400f3u, 0x10040500u, 0x060404f3u, + 0x7e060280u, 0x7e0802f2u, 0xf80008cfu, 0x04030201u, 0xbf810000u, +}; +alignas(256) constexpr std::array SharedCountPixelCode{ + 0xbe880304u, 0xbe890305u, 0xbe8a0302u, 0xbe8b0307u, 0xf4200300u, 0xfa000000u, 0xf4200344u, 0xfa000004u, + 0xbf8cc07fu, 0x7e00020cu, 0x7e02020du, 0x7e040280u, 0x7e0602f2u, 0xf800180fu, 0x03020100u, 0xbf810000u, +}; +alignas(256) constexpr std::array OwnCountPixelCode{ + 0xbe880304u, 0xbe890305u, 0xbe8a0306u, 0xbe8b0307u, 0xf4200300u, 0xfa000000u, 0xf4200344u, 0xfa000004u, + 0xbf8cc07fu, 0x7e00020cu, 0x7e02020du, 0x7e040280u, 0x7e0602f2u, 0xf800180fu, 0x03020100u, 0xbf810000u, +}; +alignas(256) std::array ColorMemory{}; + +struct Header { + Shader shader{}; + ShaderUserData userData{}; +}; + +alignas(8) Header VertexHeader{}; +alignas(8) Header SharedCountHeader{}; +alignas(8) Header OwnCountHeader{}; + +void Registered(Header& header, const std::uint32_t* code, std::size_t bytes, std::uint8_t type) { + header.shader.file_header = 0x34333231u; + header.shader.version = 0x18u; + header.shader.header_size = sizeof(Header); + header.shader.shader_size = static_cast(bytes); + header.shader.code = code; + header.shader.type = type; + header.shader.user_data = &header.userData; + AgcDriverRegisterShader_nid_postfix(&header.shader); +} + +void Append(std::vector& commands, std::uint32_t opcode, std::initializer_list payload) { + commands.push_back(0xc0000000u | (static_cast(payload.size() - 1) << 16u) | (opcode << 8u)); + commands.insert(commands.end(), payload); +} + +std::array DrawWithUserData(const std::uint32_t* pixelCode, const std::array& userData) { + constexpr std::byte Kept{0x40}; + ColorMemory.fill(Kept); + const auto color = reinterpret_cast(ColorMemory.data()); + const auto vertex = reinterpret_cast(VertexCode.data()); + const auto pixel = reinterpret_cast(pixelCode); + const std::vector> context{ + {0x2d5, 0x2000}, + {0x1b6, 0}, {0x207, 0}, {0x200, 0}, {0x203, 0x800}, + {0x2dc, 0xaa00}, {0x2f8, 0}, {0x292, 2}, {0x293, 0}, + {0x80, 0}, {0x8d, 0}, {0x83, 0xffff}, {0x8c, 0xa}, + {0x2f9, 0x2d}, {0x313, 0x6000}, {0x30e, 0xffffffff}, {0x30f, 0xffffffff}, + {0x206, 0x43f}, {0x204, 0x80000}, {0x205, 0x240}, + {0x8e, 0xf}, {0x8f, 0xf}, {0x202, 0xcc0010}, + {0x1c4, 0}, {0x1c5, 9}, {0x1c3, 4}, {0x31c, 0x28028}, + {0x31b, 0}, {0x31d, 0}, {0x3b0, (63u << 14u) | 3u}, + {0x3b8, 0x9000000}, {0x1e0, 0}, + {0xc, 0}, {0xd, 0x40040}, + {0x81, 0x80000000}, {0x82, 0x40040}, + {0x90, 0x80000000}, {0x91, 0x40040}, + {0x94, 0x80000000}, {0x95, 0x40040}, + {0x318, static_cast(color >> 8u)}, {0x390, static_cast(color >> 40u)}, + {0x10f, std::bit_cast(32.0f)}, {0x110, std::bit_cast(32.0f)}, + {0x111, std::bit_cast(-2.0f)}, {0x112, std::bit_cast(2.0f)}, + {0x113, std::bit_cast(1.0f)}, {0x114, 0}, + {0xb4, 0}, {0xb5, std::bit_cast(1.0f)}, + }; + std::vector commands; + Append(commands, 0x79, {0x242, 4}); + for (const auto& [offset, value] : context) Append(commands, 0x69, {offset, value}); + for (const auto& [offset, value] : std::initializer_list>{ + {0xc8, static_cast(vertex >> 8u)}, {0xc9, static_cast(vertex >> 40u)}, {0x8b, 1u << 1u}, {0x8c, 0}, + {0x008, static_cast(pixel >> 8u)}, {0x009, static_cast(pixel >> 40u)}, {0x00b, 8u << 1u}}) { + Append(commands, 0x76, {offset, value}); + } + for (std::uint32_t k = 0; k < userData.size(); ++k) Append(commands, 0x76, {0x00c + k, userData[k]}); + Append(commands, 0x2d, {3, 2}); + Packet packet{commands.data(), static_cast(commands.size()), 0, {}}; + Require(sceAgcDriverSubmitDcb(&packet) == 0, "the draw submission failed"); + AgcDriverWaitIdle_nid_postfix(); + AgcDriver::GuestMemory::FlushGpuWrites(color, ColorMemory.size()); + std::array drawn{0x40, 0x40, 0x40, 0x40}; + for (std::size_t at = 0; at < ColorMemory.size(); at += 4) { + const std::array pixel{static_cast(ColorMemory[at]), static_cast(ColorMemory[at + 1]), static_cast(ColorMemory[at + 2]), static_cast(ColorMemory[at + 3])}; + if (pixel != std::array{0x40, 0x40, 0x40, 0x40}) drawn = pixel; + } + return drawn; +} + +void MovedRecordCountsReachEveryDescriptor(bool sharedCount) { + const auto* pixelCode = sharedCount ? SharedCountPixelCode.data() : OwnCountPixelCode.data(); + Registered(VertexHeader, VertexCode.data(), sizeof(VertexCode), 2); + Registered(sharedCount ? SharedCountHeader : OwnCountHeader, pixelCode, sizeof(SharedCountPixelCode), 1); + const std::string mode = sharedCount ? "one count SGPR for both descriptors" : "a count SGPR for each descriptor"; + alignas(16) static std::array, 8> first{}; + alignas(16) static std::array, 8> second{}; + for (auto& entry : first) entry = {1.0f, 0.0f, 0.0f, 0.0f}; + for (auto& entry : second) entry = {0.0f, 1.0f, 0.0f, 0.0f}; + const auto userData = [&](std::size_t i, std::uint32_t records) { + return std::array{Low(first[i].data()), High(first[i].data()), sharedCount ? records : 12u, 0x20077facu, Low(second[i].data()), High(second[i].data()), sharedCount ? 4u : records, 0x20077facu}; + }; + const auto start = Driver::Get().DrawCacheCounters(); + for (std::size_t i = 0; i < 5; ++i) { + const auto pixel = DrawWithUserData(pixelCode, userData(i, 4u)); + Require(pixel == std::array{255, 0, 0, 255}, mode + ": a draw whose second descriptor holds one dword drew " + std::to_string(pixel[0]) + "," + std::to_string(pixel[1]) + "," + std::to_string(pixel[2]) + "," + std::to_string(pixel[3])); + } + const auto taught = Driver::Get().DrawCacheCounters(); + Require(taught.hits > start.hits, mode + ": draws whose descriptors moved to equal contents never reused the cached draw (" + std::to_string(taught.lookups - start.lookups) + " lookups)"); + const auto pixel = DrawWithUserData(pixelCode, userData(5, 8u)); + Require(pixel == std::array{255, 255, 0, 255}, mode + ": after the record count grew to two dwords, the second descriptor's second dword drew " + std::to_string(pixel[1]) + " (a reused draw kept the earlier count)"); + if (!sharedCount) { + const auto after = Driver::Get().DrawCacheCounters(); + Require(after.hits > taught.hits, mode + ": a draw that only moved its own record counts did not reuse the cached draw"); + } +} + +void BufferValueWordsKeyByNothing() { + const RelocatableUserWord word{4u, {}, true, 0u}; + bool readable = true; + const auto first = Driver::relocatedContentKey(word, 0x1000u, readable); + const auto second = Driver::relocatedContentKey(word, 0x2002u, readable); + Require(readable && first == second, "a V# value word changed the relocated content key"); +} + +} + +int main() { + try { + CalleeWordsAreKeyedByTheirCode(); + BufferValueWordsArePatchedInTheirBinding(); + BufferValueWordsKeyByNothing(); + { + const auto device = OpenVulkanTestDevice(); + if (!device) return VulkanTestSkipped; + } + MovedRecordCountsReachEveryDescriptor(true); + MovedRecordCountsReachEveryDescriptor(false); + AgcDriverShutdown_nid_postfix(); + std::cout << "User-data V# values and fetch subroutine pointers relocate\n"; + return 0; + } catch (const std::exception& error) { + std::cerr << error.what() << '\n'; + return 1; + } +} diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/EmulatedColorCompare.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/EmulatedColorCompare.cpp index b656cca503..7194667f92 100644 --- a/core/libs/prx/libSceAgcDriver/tests/execution/EmulatedColorCompare.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/execution/EmulatedColorCompare.cpp @@ -10,7 +10,9 @@ #include #include #include +#include #include +#include #include #include #include @@ -35,7 +37,10 @@ constexpr std::uint32_t Format8_8Srgb = 129; constexpr std::uint32_t Format8888Srgb = 130; constexpr std::uint32_t Format8888UInt = 60; constexpr std::uint32_t Format32Float = 22; +constexpr std::uint32_t Format16161616Float = 71; +constexpr std::uint32_t Format111110UNorm = 30; constexpr std::uint32_t Type2D = 9; +constexpr std::uint32_t Type2DArray = 13; constexpr std::uint32_t TypeCube = 11; constexpr std::uint32_t LessEqual = 3; constexpr std::uint32_t GreaterEqual = 6; @@ -55,11 +60,12 @@ constexpr std::uint32_t ReductionMin = 1; constexpr std::array Red{0, 64, 128, 255}; alignas(256) std::array Input{}; +alignas(256) std::array InputArray{}; alignas(256) std::array CubeInput{}; alignas(256) std::array Output{}; std::uint32_t Swizzle = 0xfacu; alignas(256) std::array Extra{}; -alignas(4096) std::array Texels{}; +alignas(4096) std::array Texels{}; alignas(256) constexpr std::array Code{ 0x1614008c, 0xe03c1000, 0x8000010a, 0xbf8c3f70, 0xf0bc0108, 0x00820401, 0xbf8c3f70, @@ -76,6 +82,16 @@ alignas(256) constexpr std::array CubeCode{ 0x34160082, 0xe0701000, 0x8001040b, 0xbf810000, 0xbf810000, 0xbf810000, }; +alignas(256) constexpr std::array LayerCode{ + 0x16140090, 0xe0381000, 0x8000010a, 0xbf8c3f70, 0xf0bc0128, 0x00820501, 0xbf8c3f70, + 0x34160082, 0xe0701000, 0x8001050b, 0xbf810000, 0xbf810000, 0xbf810000, +}; + +alignas(256) constexpr std::array LayerSampleCode{ + 0x16140090, 0xe0381000, 0x8000010a, 0xbf8c3f70, 0xf09c0128, 0x00820502, 0xbf8c3f70, + 0x34160082, 0xe0701000, 0x8001050b, 0xbf810000, 0xbf810000, 0xbf810000, +}; + alignas(256) constexpr std::array OffsetCode{ 0x1614008c, 0xe03c1000, 0x8000030a, 0xe03c1000, 0x8005060a, 0xbf8c3f70, 0x7e020306, 0x7e040307, 0x7e0c0308, 0xf0f80108, 0x00820901, 0xbf8c3f70, 0x34160082, 0xe0701000, 0x8001090b, 0xbf810000, @@ -97,6 +113,7 @@ struct Sampler { std::uint32_t lodBias = 0; bool disableCubeWrap = false; std::uint32_t function = LessEqual; + bool truncCoord = false; }; std::array BufferDescriptor(const void* data, std::uint32_t bytes) { @@ -104,20 +121,20 @@ std::array BufferDescriptor(const void* data, std::uint32_t by return {static_cast(address), static_cast((address >> 32u) & 0xffffu), bytes, 0x31016facu}; } -std::array TextureDescriptor(std::uint32_t format, bool cube = false) { +std::array TextureDescriptor(std::uint32_t format, bool cube = false, bool layered = false) { const auto address = static_cast(reinterpret_cast(Texels.data())); return { static_cast(address >> 8u), static_cast((address >> 40u) & 0xffu) | (format << 20u) | (((Side - 1u) & 3u) << 30u), ((Side - 1u) >> 2u) | ((Side - 1u) << 14u), - Swizzle | ((cube ? TypeCube : Type2D) << 28u), - cube ? 5u : 0u, 0u, 0u, 0u, + Swizzle | ((cube ? TypeCube : layered ? Type2DArray : Type2D) << 28u), + cube ? 5u : layered ? 3u : 0u, 0u, 0u, 0u, }; } std::array SamplerDescriptor(const Sampler& sampler) { return { - sampler.clamp | (sampler.clamp << 3u) | (ClampEdge << 6u) | (sampler.function << 12u) | (sampler.reduction << 29u) | (sampler.disableCubeWrap ? (1u << 28u) : 0u), + sampler.clamp | (sampler.clamp << 3u) | (ClampEdge << 6u) | (sampler.function << 12u) | (sampler.reduction << 29u) | (sampler.disableCubeWrap ? (1u << 28u) : 0u) | (sampler.truncCoord ? (1u << 27u) : 0u), 0u, sampler.lodBias | (sampler.filter << 20u) | (sampler.filter << 22u), sampler.border << 30u, @@ -179,11 +196,11 @@ void FillInput() { Extra[0] = 0x00001f20u; } -ShaderRecompiler::RecompileResult Compile(AgcDriver::VulkanDevice& device, std::uint32_t format, const Sampler& sampler, std::span code = Code, bool useCache = false, bool nativeSampleOffsets = true, bool cube = false) { +ShaderRecompiler::RecompileResult Compile(AgcDriver::VulkanDevice& device, std::uint32_t format, const Sampler& sampler, std::span code = Code, bool useCache = false, bool nativeSampleOffsets = true, bool cube = false, bool layered = false) { std::vector userData(24, 0u); - const auto input = cube ? BufferDescriptor(CubeInput.data(), static_cast(sizeof(CubeInput))) : BufferDescriptor(Input.data(), static_cast(sizeof(Input))); + const auto input = layered ? BufferDescriptor(InputArray.data(), static_cast(sizeof(InputArray))) : cube ? BufferDescriptor(CubeInput.data(), static_cast(sizeof(CubeInput))) : BufferDescriptor(Input.data(), static_cast(sizeof(Input))); const auto output = BufferDescriptor(Output.data(), static_cast(sizeof(Output))); - const auto texture = TextureDescriptor(format, cube); + const auto texture = TextureDescriptor(format, cube, layered); const auto samplerWords = SamplerDescriptor(sampler); std::copy(input.begin(), input.end(), userData.begin()); std::copy(output.begin(), output.end(), userData.begin() + 4); @@ -225,6 +242,41 @@ constexpr std::uint32_t Select(std::uint32_t x, std::uint32_t y, std::uint32_t z return x | (y << 3u) | (z << 6u) | (w << 9u); } +void RunLayers(AgcDriver::VulkanDevice& device, bool converted) { + constexpr std::array coordinates{-0.4f, 0.0f, 0.49999997f, 0.5f, 0.99f, 1.0f, 1.5f, 2.5f, 2.49f, 3.5f, 3.7f, 7.0f}; + constexpr std::array expectedLayers{0, 0, 0, 0, 1, 1, 2, 2, 2, 3, 3, 3}; + const auto format = converted ? Format111110UNorm : Format1616UNorm; + Swizzle = Select(4, 5, 6, 1); + const auto surface = AgcDriver::Graphics::DescribeSurface(AgcDriver::Graphics::DecodeTextureResource(TextureDescriptor(format, false, true))); + Require(surface.layers == 4u && surface.guestBytes <= Texels.size(), "array descriptor exceeds texture storage"); + Texels.fill(0); + const auto& mip = surface.mips.at(0); + for (std::uint32_t layer = 0; layer < 4u; ++layer) { + const std::uint32_t value = layer * 512u; + for (std::uint32_t y = 0; y < Side; ++y) { + for (std::uint32_t x = 0; x < Side; ++x) { + std::memcpy(Texels.data() + surface.GuestLayerOffset(layer) + mip.tiledOffset + y * mip.pitchBytes + x * 4u, &value, sizeof(value)); + } + } + } + for (std::uint32_t tid = 0; tid < Threads; ++tid) { + InputArray[tid * 4u] = 0.25f; + InputArray[tid * 4u + 1u] = 0.5f; + InputArray[tid * 4u + 2u] = 0.5f; + InputArray[tid * 4u + 3u] = coordinates[tid % coordinates.size()]; + } + const auto& code = converted ? LayerSampleCode : LayerCode; + const auto result = Compile(device, format, {ClampEdge, FilterPoint}, code, false, true, false, true); + Swizzle = 0xfacu; + Output.fill(-1.0f); + device.Dispatch(result, 1, 1, 1, {}, reinterpret_cast(code.data())); + device.WaitIdle(); + for (std::uint32_t tid = 0; tid < Threads; ++tid) { + const auto expected = converted ? static_cast(expectedLayers[tid % expectedLayers.size()] * 512u) / 2047.0f : 0.0f; + Require(std::fabs(Output[tid] - expected) <= 1e-5f, "array layer " + std::to_string(coordinates[tid % coordinates.size()]) + " returned " + std::to_string(Output[tid]) + ", expected " + std::to_string(expected)); + } +} + void RunChannels(AgcDriver::VulkanDevice& device, std::span code, std::array channels, std::uint32_t registers, std::uint32_t firstChannel, const char* name) { const Sampler sampler{ClampEdge, FilterBilinear}; Swizzle = Select(channels[0], channels[1], channels[2], channels[3]); @@ -400,6 +452,9 @@ int main() { Run(*device, {ClampEdge, FilterPoint}, "cached point comparison", false, true); if (lodClamp) Run(*device, {ClampWrap, FilterBilinear}, "cached bilinear comparison with offsets", true, true); } + RunLayers(*device, false); + RunLayers(*device, true); + FillTexels(); Reject(*device, Format32Float, {ClampEdge, FilterPoint}, "native comparison with a nonconstant texel offset requires", OffsetCode, false); RunChannels(*device, QuadCode, {4, 5, 6, 7}, 4, 0, "view R,G,B,A"); RunChannels(*device, QuadCode, {0, 0, 0, 0}, 4, 0, "view 0,0,0,0"); @@ -419,6 +474,29 @@ int main() { Reject(*device, Format8888UNorm, {ClampHalfBorder, FilterPoint}, "wrap, clamp-to-edge or clamp-to-border"); Reject(*device, Format8888UNorm, {ClampBorder, FilterPoint, BorderTable}, "border color table"); Reject(*device, Format8888UNorm, {ClampEdge, FilterBilinear, BorderBlack, ReductionMin}, "min or max reduction"); + const auto half = AgcDriver::Graphics::DescribeSurface(AgcDriver::Graphics::DecodeTextureResource(TextureDescriptor(Format16161616Float))); + Require(half.guestBytes <= Texels.size(), "half-float descriptor exceeds texture storage"); + Texels.fill(0); + constexpr std::array values{0x7e00u, 0x0000u, 0x8000u, 0x3800u}; + for (std::uint32_t y = 0; y < Side; ++y) { + for (std::uint32_t x = 0; x < Side; ++x) { + const auto value = values[y * Side + x]; + std::memcpy(Texels.data() + half.mips[0].tiledOffset + y * half.mips[0].pitchBytes + x * 8u, &value, sizeof(value)); + } + } + constexpr std::array references{std::numeric_limits::quiet_NaN(), 0.0f, -0.0f, 0.5f}; + for (std::uint32_t tid = 0; tid < Threads; ++tid) { + Input[tid * 3u] = references[(tid / 4u) % references.size()]; + Input[tid * 3u + 1u] = (static_cast(tid % Side) + 0.5f) / Side; + Input[tid * 3u + 2u] = (static_cast((tid / Side) % Side) + 0.5f) / Side; + } + for (const auto function : {3u, 4u, 5u}) { + for (const auto filter : {FilterPoint, FilterBilinear}) { + for (const bool truncate : {false, true}) { + RunZero(*device, Format16161616Float, {ClampEdge, filter, BorderBlack, 0u, 0u, false, function, truncate}, "half-float comparison with NaN, signed zero and TRUNC_COORD", false, 0u); + } + } + } std::puts(lodClamp ? "emulated color compare tests passed" : "emulated color compare tests passed, the offset and LOD clamp cases were skipped without shaderResourceMinLod"); return 0; } catch (const std::exception& error) { diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/F32ConvertDenormalModes.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/F32ConvertDenormalModes.cpp index 9dcc8b2bf9..2e96d1b48d 100644 --- a/core/libs/prx/libSceAgcDriver/tests/execution/F32ConvertDenormalModes.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/execution/F32ConvertDenormalModes.cpp @@ -187,10 +187,7 @@ int main() { try { const auto device = OpenVulkanTestDevice(); if (!device) return VulkanTestSkipped; - const bool hasFloat64 = TargetHasCapability(device->Target(), spv::CapabilityFloat64); - if (!hasFloat64) std::puts("v_cvt_f64_f32 skipped, the device has no shaderFloat64"); for (const bool float64 : {false, true}) { - if (float64 && !hasFloat64) continue; for (const bool ieee : {false, true}) { const auto flushed = Run(*device, float64, Mode(0u, ieee)); CheckFlushed(flushed, float64, 0u, ieee); diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/F32MinMaxDenormalModes.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/F32MinMaxDenormalModes.cpp index a9d0238d0b..c9d951d979 100644 --- a/core/libs/prx/libSceAgcDriver/tests/execution/F32MinMaxDenormalModes.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/execution/F32MinMaxDenormalModes.cpp @@ -24,9 +24,9 @@ constexpr std::uint32_t Instructions = 5; alignas(256) std::array Input{}; alignas(256) std::array Output{}; -alignas(256) constexpr std::array Code{ +alignas(256) constexpr std::array Code{ 0x34020084u, 0x34040086u, 0xe0381000u, 0x80000401u, 0xbf8c3f70u, 0x1e140b04u, 0x20160b04u, 0xd551000cu, - 0x041a0b04u, 0xd554000du, 0x041a0b04u, 0xd557000eu, 0x041a0b04u, 0xe0781000u, 0x80010a02u, 0xe0701010u, + 0x041a0b04u, 0xd554000du, 0x041a0b04u, 0xd557000eu, 0x041a0b04u, 0x201e0880u, 0xe0781000u, 0x80010a02u, 0xe0781010u, 0x80010e02u, 0xbf810000u, }; @@ -155,6 +155,10 @@ void Check(std::uint32_t denormals, bool ieee) { Hex(vector.operands[0]) + ", " + Hex(vector.operands[1]) + ", " + Hex(vector.operands[2]) + " is " + Hex(actual) + ", expected " + Hex(expected)); } + const auto value = vector.operands[0]; + const bool tiny = denormals != 1u && (value & 0x7f800000u) == 0u; + const auto zeroMax = value <= 0x7f800000u && !tiny ? value : 0u; + Require(Output[lane * Results + 5u] == zeroMax, "v_max_f32 v15, 0, v4 denormal result for " + Hex(value)); } } diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/F32MinMaxNan.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/F32MinMaxNan.cpp index d427b01f05..29643a5996 100644 --- a/core/libs/prx/libSceAgcDriver/tests/execution/F32MinMaxNan.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/execution/F32MinMaxNan.cpp @@ -23,10 +23,10 @@ constexpr std::uint32_t Results = 16; alignas(256) std::array Input{}; alignas(256) std::array Output{}; -alignas(256) constexpr std::array Code{ +alignas(256) constexpr std::array Code{ 0x34020084, 0x34060086, 0xe0381000, 0x80000401, 0xbf8c3f70, 0x1e140b04, 0x20160b04, 0xd551000c, 0x041a0b04, 0xd554000d, 0x041a0b04, 0xd557000e, 0x041a0b04, 0xd50f000f, 0x02020b04, 0xd5100010, - 0x02020b04, 0xe0781000, 0x80010a03, 0xe0781010, 0x80010e03, 0xbf810000, + 0x02020b04, 0x20220880, 0xe0781000, 0x80010a03, 0xe0781010, 0x80010e03, 0xbf810000, }; constexpr std::uint32_t Rows[128][4] = { @@ -482,6 +482,10 @@ void Check() { for (std::uint32_t i = 0; i < 7; ++i) { Expect(Chunk * Threads + tid, out[i], (Ieee ? ExpectedIeee : Expected)[Chunk * Threads + tid][i], Names[i]); } + const auto magnitude = in[0] & 0x7fffffffu; + const bool signaling = magnitude > 0x7f800000u && (in[0] & 0x00400000u) == 0u; + const auto zeroMax = Ieee && signaling ? in[0] | 0x00400000u : in[0] <= 0x7f800000u ? in[0] : 0u; + Expect(Chunk * Threads + tid, out[7], zeroMax, "v_max_f32 v17, 0, v4"); } } diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/F64AddMulDenormalModes.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/F64AddMulDenormalModes.cpp index afacd844cb..fa57f2f3ec 100644 --- a/core/libs/prx/libSceAgcDriver/tests/execution/F64AddMulDenormalModes.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/execution/F64AddMulDenormalModes.cpp @@ -192,10 +192,6 @@ int main() { try { const auto device = OpenVulkanTestDevice(); if (!device) return VulkanTestSkipped; - if (!TargetHasCapability(device->Target(), spv::CapabilityFloat64)) { - std::puts("skipped, the device has no shaderFloat64"); - return VulkanTestSkipped; - } const Mode modes[] = { {"without a known float mode", std::nullopt, 3u}, {"f64 denormal mode 0, IEEE mode on", ShaderRecompiler::ShaderFloatMode{0x30u, true, true, false}, 0u}, diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/F64IntegerArithmetic.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/F64IntegerArithmetic.cpp new file mode 100644 index 0000000000..8832b27365 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/execution/F64IntegerArithmetic.cpp @@ -0,0 +1,183 @@ +#include "prx/libSceAgcDriver/Execution/include/VulkanDevice.hpp" +#include "prx/libSceAgcDriver/Graphics/include/Draw.hpp" +#include "Recompiler.hpp" +#include "VulkanTestDevice.hpp" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { + +using AgcDriver::Graphics::Require; +using ShaderRecompiler::ShaderStage; + +constexpr std::uint32_t Threads = 256; +constexpr std::uint32_t Inputs = 4; +constexpr std::uint32_t Results = 8; +constexpr std::uint32_t Batches = 64; +alignas(256) std::array Input{}; +alignas(256) std::array Output{}; + +alignas(256) constexpr std::array Code{ + 0x34020084u, 0x34040085u, 0xe0381000u, 0x80000401u, 0xbf8c3f70u, 0xd564000au, 0x00020d04u, 0xd565000cu, + 0x00020d04u, 0x7e1c1f04u, 0x7e202106u, 0xe0781000u, 0x80010a02u, 0xe0781010u, 0x80010e02u, 0xbf810000u, +}; + +constexpr std::uint64_t Edges[] = { + 0x0000000000000000ull, 0x8000000000000000ull, 0x0000000000000001ull, 0x8000000000000001ull, 0x000fffffffffffffull, 0x0008000000000000ull, + 0x0010000000000000ull, 0x0010000000000001ull, 0x001fffffffffffffull, 0x3ff0000000000000ull, 0x3ff0000000000001ull, 0x3fefffffffffffffull, + 0xbff0000000000000ull, 0x3fe0000000000000ull, 0x4000000000000000ull, 0x7fefffffffffffffull, 0xffefffffffffffffull, 0x7fe0000000000000ull, + 0x7ff0000000000000ull, 0xfff0000000000000ull, 0x7ff8000000000000ull, 0xfff8000000000001ull, 0x7ff0000000000001ull, 0xfff4000000000123ull, + 0x3ca0000000000000ull, 0x3cb0000000000000ull, 0x4330000000000000ull, 0x4340000000000000ull, 0x47efffffe0000000ull, 0x47efffff00000000ull, + 0x36a0000000000000ull, 0x3690000000000000ull, 0x3690000000000001ull, 0x380fffffe0000000ull, 0x3810000000000000ull, 0xc7f0000000000000ull, +}; + +struct Random { + std::uint64_t state = 0x9e3779b97f4a7c15ull; + std::uint64_t Next() { + state ^= state << 13u; + state ^= state >> 7u; + state ^= state << 17u; + return state; + } +}; + +std::uint64_t WithExponent(std::uint64_t bits, std::uint64_t exponent) { + return (bits & 0x800fffffffffffffull) | ((exponent & 0x7ffu) << 52u); +} + +std::uint64_t Operand(Random& random) { + const auto bits = random.Next(); + switch (random.Next() % 8u) { + case 0: return Edges[random.Next() % std::size(Edges)]; + case 1: return WithExponent(bits, random.Next() % 4u); + case 2: return WithExponent(bits, 2044u + random.Next() % 3u); + case 3: return WithExponent(bits, 1023u - 160u + random.Next() % 300u); + case 4: return WithExponent(bits, 1023u - 30u + random.Next() % 60u); + default: return bits; + } +} + +std::uint64_t Partner(Random& random, std::uint64_t lhs) { + switch (random.Next() % 6u) { + case 0: return lhs ^ 0x8000000000000000ull; + case 1: return (lhs ^ 0x8000000000000000ull) + (random.Next() % 5u) - 2u; + case 2: return WithExponent(random.Next(), ((lhs >> 52u) & 0x7ffu) - 53u + random.Next() % 107u); + case 3: return WithExponent(random.Next(), 2046u - ((lhs >> 52u) & 0x7ffu) + random.Next() % 5u); + default: return Operand(random); + } +} + +bool IsNan64(std::uint64_t bits) { + return (bits & 0x7fffffffffffffffull) > 0x7ff0000000000000ull; +} + +std::uint64_t ArithmeticResult(std::uint64_t lhs, std::uint64_t rhs, double result) { + if (IsNan64(lhs)) return lhs | 0x0008000000000000ull; + if (IsNan64(rhs)) return rhs | 0x0008000000000000ull; + const auto bits = std::bit_cast(result); + return IsNan64(bits) ? 0xfff8000000000000ull : bits; +} + +std::uint32_t NarrowedResult(std::uint64_t value) { + if (!IsNan64(value)) return std::bit_cast(static_cast(std::bit_cast(value))); + const auto high = static_cast(value >> 32u); + return (high & 0x80000000u) | 0x7fc00000u | ((high & 0x000fffffu) << 3u) | (static_cast(value >> 29u) & 7u); +} + +std::uint64_t WidenedResult(std::uint32_t value) { + if ((value & 0x7fffffffu) > 0x7f800000u) return (static_cast(value & 0x80000000u) << 32u) | 0x7ff8000000000000ull | (static_cast(value & 0x007fffffu) << 29u); + return std::bit_cast(static_cast(std::bit_cast(value))); +} + +std::array BufferDescriptor(const void* data, std::uint32_t bytes) { + const auto address = reinterpret_cast(data); + return {static_cast(address), static_cast((address >> 32u) & 0xffffu), bytes, 0x31016facu}; +} + +std::string Hex(std::uint64_t value) { + char text[24]; + std::snprintf(text, sizeof(text), "0x%016llx", static_cast(value)); + return text; +} + +void Run(AgcDriver::VulkanDevice& device, const ShaderRecompiler::SpirvTarget& target) { + Output.fill(0xdeadbeefu); + std::vector userData(8, 0u); + const auto input = BufferDescriptor(Input.data(), static_cast(Input.size() * 4u)); + const auto output = BufferDescriptor(Output.data(), static_cast(Output.size() * 4u)); + std::copy(input.begin(), input.end(), userData.begin()); + std::copy(output.begin(), output.end(), userData.begin() + 4); + const std::span code(Code); + const std::array memory{{{reinterpret_cast(code.data()), std::as_bytes(code)}}}; + const ShaderRecompiler::ShaderComputeStageInfo compute{{Threads, 1, 1}, 0u, {false, false, false}, false, 1}; + ShaderRecompiler::RecompileRequest request{ + {ShaderStage::Compute, reinterpret_cast(code.data()), code, 0, {}}, + {32, 0, userData, compute, std::nullopt, std::nullopt, memory}, + target, + {0, 0, 0, 128} + }; + request.useCache = false; + request.context.floatMode = ShaderRecompiler::ShaderFloatMode{0xf0u, true, true, false}; + const auto result = ShaderRecompiler::Recompile(request); + device.Dispatch(result, 1, 1, 1, {}, reinterpret_cast(code.data())); + device.WaitIdle(); +} + +} + +int main() { + try { + const auto device = OpenVulkanTestDevice(); + if (!device) return VulkanTestSkipped; + auto target = device->Target(); + std::vector capabilities(target.supportedCapabilities.begin(), target.supportedCapabilities.end()); + std::erase(capabilities, static_cast(spv::CapabilityFloat64)); + target.supportedCapabilities = capabilities; + Random random; + std::uint32_t checked = 0; + for (std::uint32_t batch = 0; batch < Batches; ++batch) { + std::array, Threads> operands{}; + for (std::uint32_t lane = 0; lane < Threads; ++lane) { + const std::size_t pairIndex = static_cast(batch) * Threads + lane; + const bool edges = pairIndex < std::size(Edges) * std::size(Edges); + const auto lhs = edges ? Edges[pairIndex % std::size(Edges)] : Operand(random); + const auto rhs = edges ? Edges[pairIndex / std::size(Edges)] : Partner(random, lhs); + operands[lane] = {lhs, rhs}; + Input[lane * Inputs] = static_cast(lhs); + Input[lane * Inputs + 1u] = static_cast(lhs >> 32u); + Input[lane * Inputs + 2u] = static_cast(rhs); + Input[lane * Inputs + 3u] = static_cast(rhs >> 32u); + } + Run(*device, target); + for (std::uint32_t lane = 0; lane < Threads; ++lane) { + const auto [lhs, rhs] = operands[lane]; + const auto word = [&](std::uint32_t index) { return static_cast(Output[lane * Results + index]); }; + const auto where = " of " + Hex(lhs) + " and " + Hex(rhs); + const auto sum = word(0) | (word(1) << 32u); + const auto expectedSum = ArithmeticResult(lhs, rhs, std::bit_cast(lhs) + std::bit_cast(rhs)); + Require(sum == expectedSum, "v_add_f64" + where + " is " + Hex(sum) + ", expected " + Hex(expectedSum)); + const auto product = word(2) | (word(3) << 32u); + const auto expectedProduct = ArithmeticResult(lhs, rhs, std::bit_cast(lhs) * std::bit_cast(rhs)); + Require(product == expectedProduct, "v_mul_f64" + where + " is " + Hex(product) + ", expected " + Hex(expectedProduct)); + const auto narrowed = static_cast(word(4)); + Require(narrowed == NarrowedResult(lhs), "v_cvt_f32_f64 of " + Hex(lhs) + " is " + Hex(narrowed) + ", expected " + Hex(NarrowedResult(lhs))); + const auto widened = word(6) | (word(7) << 32u); + const auto source = static_cast(rhs); + Require(widened == WidenedResult(source), "v_cvt_f64_f32 of " + Hex(source) + " is " + Hex(widened) + ", expected " + Hex(WidenedResult(source))); + checked += 4u; + } + } + std::printf("f64 integer arithmetic tests passed, %u results checked\n", checked); + return 0; + } catch (const std::exception& error) { + std::cerr << error.what() << '\n'; + return 1; + } +} diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/GuardedNullPointer.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/GuardedNullPointer.cpp index d05f480585..9292d65322 100644 --- a/core/libs/prx/libSceAgcDriver/tests/execution/GuardedNullPointer.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/execution/GuardedNullPointer.cpp @@ -3,6 +3,7 @@ #include "prx/libSceAgcDriver/Execution/include/VulkanDevice.hpp" #include "Recompiler.hpp" #include "VulkanTestDevice.hpp" +#include "tests/TemporaryFile.hpp" #include #include #include @@ -87,7 +88,7 @@ class StderrCapture { public: StderrCapture() { std::fflush(stderr); - file = std::tmpfile(); + file = TemporaryFile::Open(); Require(file != nullptr, "cannot open a temporary file for stderr"); #ifdef _WIN32 saved = _dup(_fileno(stderr)); diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/IdleStoreYields.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/IdleStoreYields.cpp new file mode 100644 index 0000000000..e2d59fd5ca --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/execution/IdleStoreYields.cpp @@ -0,0 +1,213 @@ +#include "prx/libSceAgcDriver/Execution/include/Driver.hpp" +#include "prx/libSceAgcDriver/Execution/include/GuestMemory.hpp" +#include "prx/libSceAgcDriver/Graphics/include/GuestTextureResource.hpp" +#include "prx/libSceAgcDriver/Graphics/include/TextureTiling.hpp" +#include "prx/libc/include/GuestAllocations.hpp" +#include "VulkanTestDevice.hpp" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { + +using AgcDriver::Graphics::Require; +constexpr std::uint32_t Threads = 8; +constexpr std::uint32_t Format32UInt = 20; +constexpr std::uint32_t TileR64KBX = 0x1b; +constexpr std::uint32_t Type2D = 9; +constexpr std::uint32_t Untouched = 0xdeadbeefu; +constexpr std::uint32_t Stored = 0x12345678u; +constexpr std::uint32_t FarRow = 1000; +constexpr std::uint64_t Piece = 4u << 20u; +constexpr std::uint32_t Attempts = 10; + +alignas(256) constexpr std::array StoreRowZeroCode{ + 0x7e040300, 0x7e060280, 0x7e0202ff, Stored, 0xf0200108, 0x00020102, 0xbf810000, 0xbf810000, +}; + +alignas(256) constexpr std::array StoreFarRowCode{ + 0x7e040300, 0x7e0602ff, FarRow, 0x7e0202ff, Stored, 0xf0200108, 0x00020102, 0xbf810000, +}; + +std::uint64_t AddressOf(const void* data) { + return static_cast(reinterpret_cast(data)); +} + +std::array TextureDescriptor(const std::uint32_t* texels, std::uint32_t width, std::uint32_t height) { + const auto address = AddressOf(texels); + return { + static_cast(address >> 8u), + static_cast((address >> 40u) & 0xffu) | (Format32UInt << 20u) | (((width - 1u) & 3u) << 30u), + ((width - 1u) >> 2u) | ((height - 1u) << 14u), + 0xfacu | (TileR64KBX << 20u) | (Type2D << 28u), + 0u, + 0u, + 0u, + 0u, + }; +} + +struct Surface { + std::uint32_t width; + std::uint32_t height; + std::vector storage; + std::uint32_t* texels = nullptr; + std::size_t bytes = 0; + + Surface(std::uint32_t width, std::uint32_t height) : width(width), height(height) { + const std::size_t reserve = static_cast(width) * height * 4u + 0x20000u; + storage.resize(reserve / 4u); + texels = reinterpret_cast((reinterpret_cast(storage.data()) + 0xffffu) & ~std::uintptr_t{0xffffu}); + bytes = static_cast(AgcDriver::Graphics::DescribeSurface(AgcDriver::Graphics::DecodeTextureResource(Descriptor())).guestBytes); + Require(AddressOf(texels) + bytes <= AddressOf(storage.data() + storage.size()), "idle yield fixture: a surface does not fit its storage"); + std::fill(texels, texels + bytes / 4u, Untouched); + } + + std::array Descriptor() const { return TextureDescriptor(texels, width, height); } + std::uint64_t Address() const { return AddressOf(texels); } +}; + +void AppendStore(std::vector& words, const Surface& surface, const std::array& code) { + std::vector userData(16, 0u); + const auto texture = surface.Descriptor(); + std::copy(texture.begin(), texture.end(), userData.begin() + 8); + const auto registers = [&](const std::uint32_t first, const std::span values) { + words.push_back(0xc0007600u | (static_cast(values.size()) << 16u)); + words.push_back(first); + words.insert(words.end(), values.begin(), values.end()); + }; + const std::array shape{Threads, 1, 1}; + registers(0x207, shape); + const auto address = reinterpret_cast(code.data()); + const std::array program{static_cast(address >> 8u), static_cast(address >> 40u)}; + registers(0x20c, program); + const std::array resource{static_cast(userData.size()) << 1u}; + registers(0x213, resource); + registers(0x240, userData); + words.insert(words.end(), {0xc0031500u, 1, 1, 1, 0x41u}); +} + +bool Pending(std::uint64_t begin, std::uint64_t end) { + const std::array, 1> range{{{begin, end}}}; + return AgcDriver::Graphics::StorageTexture::AnyPendingOverlaps(range); +} + +bool Contains(std::uint64_t begin, std::uint64_t end) { + std::vector copy(static_cast(end - begin)); + AgcDriver::GuestMemory::Read(begin, copy); + const volatile std::uint32_t* words = reinterpret_cast(static_cast(begin)); + for (std::size_t index = 0; index < copy.size() / 4u; ++index) { + if (words[index] == Stored) return true; + } + return false; +} + +void SubmitAndWaitForPending(std::vector& words) { + Packet packet{words.data(), static_cast(words.size()), 0, {}}; + AgcDriver::Submit(&packet, 0); + const auto deadline = std::chrono::steady_clock::now() + std::chrono::seconds(10); + while (!AgcDriver::Graphics::StorageTexture::AnyPending() && std::chrono::steady_clock::now() < deadline) std::this_thread::sleep_for(std::chrono::milliseconds(1)); + Require(AgcDriver::Graphics::StorageTexture::AnyPending(), "idle yield fixture did not observe pending storage results"); + std::this_thread::sleep_for(std::chrono::milliseconds(5)); +} + +struct Registered { + std::vector surfaces; + + explicit Registered(std::vector list) : surfaces(std::move(list)) { + GuestAllocations::Mutation mutation; + for (const auto* surface : surfaces) mutation.Add(surface->texels, surface->bytes, true, true, true); + } + ~Registered() { + try { + AgcDriver::Graphics::StorageTexture::FlushAllPending("idle yield fixture"); + GuestAllocations::Mutation mutation; + for (const auto* surface : surfaces) mutation.Remove(surface->texels); + } catch (...) {} + } +}; + +void Repeat(void (*scenario)()) { + for (std::uint32_t attempt = 1;; ++attempt) { + try { + scenario(); + return; + } catch (const std::exception&) { + if (attempt == Attempts) throw; + } + } +} + +void StopsBetweenImages() { + Surface first(256, 256); + Surface second(256, 256); + Registered registered({&first, &second}); + std::vector words; + AppendStore(words, first, StoreRowZeroCode); + AppendStore(words, second, StoreRowZeroCode); + SubmitAndWaitForPending(words); + const auto pending = [](const Surface& surface) { return Pending(surface.Address(), surface.Address() + surface.bytes); }; + { + std::lock_guard gpuLock(AgcDriver::GuestMemory::GpuMutex()); + Require(pending(first) && pending(second), "the queue-idle store ran before the fixture could take the GPU mutex"); + std::size_t checks = 0; + const bool finished = AgcDriver::Graphics::StorageTexture::FlushAllPendingUntil("idle", [&] { return checks++ != 0; }); + Require(!finished, "a store asked to stop after one image reported that every image was stored"); + Require(pending(first) != pending(second), "a store asked to stop after one image did not store exactly one of the two pending images"); + Require(AgcDriver::Graphics::StorageTexture::FlushAllPendingUntil("idle", [] { return false; }), "a store that was never asked to stop reported unstored images"); + Require(!pending(first) && !pending(second), "the store after the stopped one left an image pending"); + } + Require(Contains(first.Address(), first.Address() + first.bytes) && Contains(second.Address(), second.Address() + second.bytes), "the two stores did not bring both results to guest memory"); +} + +void StopsWithinAnImage() { + Surface surface(2048, 1024); + Require(surface.bytes > Piece, "idle yield fixture: the large surface is not larger than one stored piece"); + Registered registered({&surface}); + std::vector words; + AppendStore(words, surface, StoreRowZeroCode); + AppendStore(words, surface, StoreFarRowCode); + SubmitAndWaitForPending(words); + const auto begin = surface.Address(); + const auto split = begin + Piece; + const auto end = begin + surface.bytes; + { + std::lock_guard gpuLock(AgcDriver::GuestMemory::GpuMutex()); + Require(Pending(begin, end), "the large image has no pending results"); + std::size_t checks = 0; + const bool finished = AgcDriver::Graphics::StorageTexture::FlushAllPendingUntil("idle", [&] { return checks++ != 0; }); + Require(!finished, "a store asked to stop after one piece reported that the large image was stored"); + Require(!AgcDriver::Graphics::StorageTexture::FlushPending(begin, static_cast(Piece), nullptr, "idle yield fixture"), "a store asked to stop after one piece left results pending in the first piece"); + Require(AgcDriver::Graphics::StorageTexture::FlushPending(split, static_cast(end - split), nullptr, "idle yield fixture"), "a store asked to stop after one piece stored the rest of the large image as well"); + Require(!Pending(begin, end), "storing the rest of the large image left it pending"); + } + Require(Contains(begin, split) && Contains(split, end), "the two stores did not bring both rows of the large image to guest memory"); +} + +} + +int main() { + try { + { + const auto device = OpenVulkanTestDevice(); + if (!device) return VulkanTestSkipped; + } + struct ShutdownGuard { + ~ShutdownGuard() { try { AgcDriverShutdown_nid_postfix(); } catch (...) {} } + } shutdown; + Repeat(StopsBetweenImages); + Repeat(StopsWithinAnImage); + AgcDriverShutdown_nid_postfix(); + std::puts("idle store yields tests passed"); + return 0; + } catch (const std::exception& error) { + std::cerr << error.what() << '\n'; + return 1; + } +} diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/ImageTable.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/ImageTable.cpp index 19753d3482..49c8267de8 100644 --- a/core/libs/prx/libSceAgcDriver/tests/execution/ImageTable.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/execution/ImageTable.cpp @@ -3,6 +3,7 @@ #include "prx/libSceAgcDriver/Graphics/include/Draw.hpp" #include "prx/libSceAgcDriver/Graphics/include/Texture.hpp" #include "prx/libc/include/GuestAllocations.hpp" +#include "tests/TemporaryFile.hpp" #include "Recompiler.hpp" #include "ImageTableAbi.hpp" #include "VulkanTestDevice.hpp" @@ -355,7 +356,7 @@ class StderrCapture { public: StderrCapture() { std::fflush(stderr); - file = std::tmpfile(); + file = TemporaryFile::Open(); Require(file != nullptr, "cannot open a temporary file for stderr"); #ifdef _WIN32 saved = _dup(_fileno(stderr)); diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/LdsMixedWidthAtomics.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/LdsMixedWidthAtomics.cpp index 250f80264a..1a45fdb00f 100644 --- a/core/libs/prx/libSceAgcDriver/tests/execution/LdsMixedWidthAtomics.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/execution/LdsMixedWidthAtomics.cpp @@ -2,6 +2,7 @@ #include "prx/libSceAgcDriver/Graphics/include/Draw.hpp" #include "Recompiler.hpp" #include "VulkanTestDevice.hpp" +#include "tests/TemporaryFile.hpp" #include #include #include @@ -36,7 +37,7 @@ class StderrCapture { public: StderrCapture() { std::fflush(stderr); - file = std::tmpfile(); + file = TemporaryFile::Open(); Require(file != nullptr, "cannot open a temporary file for stderr"); #ifdef _WIN32 saved = _dup(_fileno(stderr)); diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/LibraryPrebuildPriority.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/LibraryPrebuildPriority.cpp new file mode 100644 index 0000000000..aae30364f5 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/execution/LibraryPrebuildPriority.cpp @@ -0,0 +1,186 @@ +#include "prx/libSceAgcDriver/Execution/include/Driver.hpp" +#include "prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp" +#include "prx/libSceAgcDriver/Execution/include/Driver/Shaders/ShaderRegistry.hpp" +#include "prx/libSceAgcDriver/Submit/include/Dcb.hpp" +#include "VulkanTestDevice.hpp" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { + +void Require(bool condition, const std::string& message) { + if (!condition) throw std::runtime_error("library prebuild priority: " + message); +} + +unsigned PrebuildThreads() { + const char* text = std::getenv("APS5_PREBUILD_THREADS"); + return text != nullptr ? std::max(1u, static_cast(std::strtoul(text, nullptr, 10))) : std::max(2u, std::thread::hardware_concurrency() / 2u); +} + +std::vector Pm4(std::uint32_t opcode, std::initializer_list body) { + std::vector words{0xc0000000u | (static_cast(body.size() - 1) << 16u) | (opcode << 8u)}; + words.insert(words.end(), body); + return words; +} + +struct Gate { + std::mutex mutex; + std::condition_variable changed; + unsigned blocked = 0; + unsigned released = 0; + std::vector order; +}; + +struct ReleaseOnExit { + std::shared_ptr gate; + ~ReleaseOnExit() { + { + std::lock_guard lock(gate->mutex); + gate->released = ~0u; + } + gate->changed.notify_all(); + AgcDriver::DriverDetail::AwaitLibraryPrebuilds(); + } +}; + +constexpr std::uint64_t first = 0x0012345600ull; +constexpr std::uint64_t second = 0x120023456700ull; + +std::vector Bind(std::uint32_t reg, std::uint64_t program) { + return Pm4(0x76, {reg, static_cast(program >> 8u), static_cast(program >> 40u)}); +} + +std::uint64_t FirstPrebuildAfter(std::vector words) { + const unsigned threads = PrebuildThreads(); + const auto gate = std::make_shared(); + const ReleaseOnExit release{gate}; + for (unsigned index = 0; index < threads; ++index) { + AgcDriver::DriverDetail::SubmitLibraryPrebuild([gate] { + std::unique_lock lock(gate->mutex); + ++gate->blocked; + gate->changed.notify_all(); + gate->changed.wait(lock, [&] { return gate->released != 0; }); + if (gate->released != ~0u) --gate->released; + }); + } + std::unique_lock lock(gate->mutex); + Require(gate->changed.wait_for(lock, std::chrono::seconds(10), [&] { return gate->blocked == threads; }), std::to_string(gate->blocked) + " of " + std::to_string(threads) + " prebuild threads were blocked"); + lock.unlock(); + for (const auto program : {first, second}) { + AgcDriver::DriverDetail::SubmitLibraryPrebuild([gate, program] { + std::lock_guard ran(gate->mutex); + gate->order.push_back(program); + gate->changed.notify_all(); + }, program); + } + Packet dcb{words.data(), static_cast(words.size()), 0, {}}; + Require(sceAgcDriverSubmitDcb(&dcb) == 0, "the submission binding a pixel program failed"); + AgcDriverWaitIdle_nid_postfix(); + lock.lock(); + gate->released = 1; + gate->changed.notify_all(); + Require(gate->changed.wait_for(lock, std::chrono::seconds(10), [&] { return !gate->order.empty(); }), "no queued prebuild ran after one prebuild thread was released"); + return gate->order.front(); +} + +void CheckLargeBacklog() { + constexpr std::uint64_t backlog = 9000; + constexpr std::uint64_t binds = 32000; + constexpr std::uint64_t queued = 0x120000000000ull; + constexpr std::uint64_t unqueued = 0x130000000000ull; + constexpr std::uint64_t target = queued + (backlog - 1) * 0x100u; + const unsigned threads = PrebuildThreads(); + const auto gate = std::make_shared(); + const ReleaseOnExit release{gate}; + for (unsigned index = 0; index < threads; ++index) { + AgcDriver::DriverDetail::SubmitLibraryPrebuild([gate] { + std::unique_lock lock(gate->mutex); + ++gate->blocked; + gate->changed.notify_all(); + gate->changed.wait(lock, [&] { return gate->released != 0; }); + if (gate->released != ~0u) --gate->released; + }); + } + std::unique_lock lock(gate->mutex); + Require(gate->changed.wait_for(lock, std::chrono::seconds(10), [&] { return gate->blocked == threads; }), "the prebuild threads did not block"); + lock.unlock(); + for (std::uint64_t index = 0; index < backlog; ++index) { + const auto program = queued + index * 0x100u; + AgcDriver::DriverDetail::SubmitLibraryPrebuild([gate, program] { + std::lock_guard ran(gate->mutex); + gate->order.push_back(program); + gate->changed.notify_all(); + }, program); + } + Require(AgcDriver::DriverDetail::LibraryPrebuildsWaiting(), "queued prebuilds were not reported as waiting"); + std::vector words; + for (std::uint64_t index = 0; index + 1 < binds; ++index) { + const auto bind = Bind(0x008, unqueued + index * 0x100u); + words.insert(words.end(), bind.begin(), bind.end()); + } + const auto bind = Bind(0x008, target); + words.insert(words.end(), bind.begin(), bind.end()); + Packet dcb{words.data(), static_cast(words.size()), 0, {}}; + Require(sceAgcDriverSubmitDcb(&dcb) == 0, "the submission with many distinct binds failed"); + AgcDriverWaitIdle_nid_postfix(); + lock.lock(); + gate->released = 1; + gate->changed.notify_all(); + Require(gate->changed.wait_for(lock, std::chrono::seconds(10), [&] { return !gate->order.empty(); }), "no queued prebuild ran after one prebuild thread was released"); + Require(gate->order.front() == target, "the bound prebuild did not run first from a large backlog"); + Require(gate->changed.wait_for(lock, std::chrono::seconds(60), [&] { return gate->order.size() == backlog; }), "queued prebuilds were lost"); + auto sorted = gate->order; + std::ranges::sort(sorted); + for (std::uint64_t index = 0; index < backlog; ++index) Require(sorted[index] == queued + index * 0x100u, "a queued prebuild ran twice or not at all"); + Require(std::ranges::is_sorted(gate->order.begin() + 1, gate->order.end()), "the nonmatching prebuilds lost their order"); + gate->released = ~0u; + gate->changed.notify_all(); + lock.unlock(); + AgcDriver::DriverDetail::AwaitLibraryPrebuilds(); + Require(!AgcDriver::DriverDetail::LibraryPrebuildsWaiting(), "a drained pool still reported waiting prebuilds"); +} + +} + +int main() { + try { + { + const auto device = OpenVulkanTestDevice(); + if (!device) return VulkanTestSkipped; + } + AgcDriver::DriverDetail::Driver::Get(); + Require(!AgcDriver::DriverDetail::LibraryPrebuildsWaiting(), "an unused pool reported waiting prebuilds"); + { + auto words = Bind(0x008, second); + Packet dcb{words.data(), static_cast(words.size()), 0, {}}; + Require(sceAgcDriverSubmitDcb(&dcb) == 0, "the submission with no prebuild waiting failed"); + AgcDriverWaitIdle_nid_postfix(); + } + Require(FirstPrebuildAfter(Pm4(0x76, {0x008, static_cast(second >> 8u)})) == first, "a submission scanned its program registers with no prebuild waiting"); + Require(FirstPrebuildAfter(Bind(0x008, second)) == second, "the prebuild of the pixel program a submission binds did not run before an earlier queued prebuild"); + Require(FirstPrebuildAfter(Pm4(0x76, {0x008, static_cast(second >> 8u)})) == second, "a pixel program bound with a retained high address register was not prioritized"); + Require(FirstPrebuildAfter(Bind(0x048, second)) == second, "the prebuild of the legacy vertex program a submission binds did not run before an earlier queued prebuild"); + Require(FirstPrebuildAfter(Bind(0x008, 0x120034567800ull)) == first, "a submission binding another program changed the order of queued prebuilds"); + CheckLargeBacklog(); + AgcDriver::DriverDetail::CloseRegistrationPreparation(); + AgcDriverShutdown_nid_postfix(); + std::puts("library prebuild priority tests passed"); + return 0; + } catch (const std::exception& error) { + std::cerr << error.what() << '\n'; + try { AgcDriverShutdown_nid_postfix(); } catch (...) {} + return 1; + } +} diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/MeshVectorWindowWaves.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/MeshVectorWindowWaves.cpp index 4df1d3e86e..4833c5a03b 100644 --- a/core/libs/prx/libSceAgcDriver/tests/execution/MeshVectorWindowWaves.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/execution/MeshVectorWindowWaves.cpp @@ -153,7 +153,11 @@ int main() { try { { const auto device = OpenVulkanTestDevice(); - if (!device || !TargetHasCapability(device->Target(), spv::CapabilityMeshShadingEXT)) return VulkanTestSkipped; + if (!device) return VulkanTestSkipped; + if (!TargetHasCapability(device->Target(), spv::CapabilityMeshShadingEXT)) { + std::puts("skipped, the device has no VK_EXT_mesh_shader"); + return VulkanTestSkipped; + } if (device->DeviceName().starts_with("llvmpipe")) { std::puts("skipped, the device has no mesh shader compiler that handles these programs (llvmpipe)"); return VulkanTestSkipped; diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/NativeMultisampleDepth.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/NativeMultisampleDepth.cpp index 9dc8ed5458..7144710b99 100644 --- a/core/libs/prx/libSceAgcDriver/tests/execution/NativeMultisampleDepth.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/execution/NativeMultisampleDepth.cpp @@ -128,12 +128,31 @@ public: address.pNext = nullptr; address.bufferDeviceAddressCaptureReplay = VK_FALSE; address.bufferDeviceAddressMultiDevice = VK_FALSE; + std::vector enabledExtensions; + if (externalHost) enabledExtensions.insert(enabledExtensions.end(), externalHostNames.begin(), externalHostNames.end()); + bool dmaBufImport = false; +#ifndef _WIN32 + if (externalHost) { + VkDriverId driverId{}; + if (supported(VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME)) { + VkPhysicalDeviceDriverProperties driver{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES}; + VkPhysicalDeviceProperties2 properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2, &driver}; + function("vkGetPhysicalDeviceProperties2")(context.physical, &properties); + driverId = driver.driverID; + } + dmaBufImport = driverId != VK_DRIVER_ID_NVIDIA_PROPRIETARY && supported(VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME) && supported(VK_EXT_EXTERNAL_MEMORY_DMA_BUF_EXTENSION_NAME); + if (dmaBufImport) { + enabledExtensions.push_back(VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME); + enabledExtensions.push_back(VK_EXT_EXTERNAL_MEMORY_DMA_BUF_EXTENSION_NAME); + } + } +#endif VkDeviceCreateInfo device{VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, externalHost ? &address : nullptr}; device.queueCreateInfoCount = 1u; device.pQueueCreateInfos = &queue; device.pEnabledFeatures = &enabled; - device.enabledExtensionCount = externalHost ? static_cast(externalHostNames.size()) : 0u; - device.ppEnabledExtensionNames = externalHost ? externalHostNames.data() : nullptr; + device.enabledExtensionCount = static_cast(enabledExtensions.size()); + device.ppEnabledExtensionNames = enabledExtensions.data(); Check(function("vkCreateDevice")(context.physical, &device, nullptr, &context.device), "vkCreateDevice"); if (externalHost) { VkPhysicalDeviceExternalMemoryHostPropertiesEXT host{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT}; @@ -142,6 +161,7 @@ public: context.hostImportAlignment = host.minImportedHostPointerAlignment; context.bufferDeviceAddress = true; } + context.dmaBufImport = dmaBufImport; context.deviceProc = function("vkGetDeviceProcAddr"); context.formatProperties = function("vkGetPhysicalDeviceFormatProperties"); context.imageFormatProperties = function("vkGetPhysicalDeviceImageFormatProperties"); @@ -270,14 +290,19 @@ alignas(256) constexpr std::array HtileMaskKernel{ 0xbf810000u, }; +alignas(256) constexpr std::array HtileBufferMaskKernel{ + 0xd7460004u, 0x04010c0cu, 0xe00c2000u, 0x80000004u, 0xbf8c3f70u, 0xd7710000u, 0x00120008u, 0xd7710001u, + 0x00160209u, 0xd7710002u, 0x001a040au, 0xd7710003u, 0x001e060bu, 0xe01c2000u, 0x80000004u, 0xbf810000u, +}; + std::vector DriverPm4Packet(std::uint32_t opcode, std::initializer_list body) { std::vector words{0xc0000000u | (static_cast(body.size() - 1u) << 16u) | (opcode << 8u)}; words.insert(words.end(), body); return words; } -Context SubmitDriverHtileClear(std::uint64_t address, std::unique_lock& gpuLock) { - const auto shader = reinterpret_cast(HtileMaskKernel.data()); +Context SubmitDriverHtileClear(std::uint64_t address, std::unique_lock& gpuLock, bool buffer) { + const auto shader = buffer ? reinterpret_cast(HtileBufferMaskKernel.data()) : reinterpret_cast(HtileMaskKernel.data()); std::vector commands; const auto append = [&commands](std::vector packet) { commands.insert(commands.end(), packet.begin(), packet.end()); }; append(DriverPm4Packet(0x76u, {0x20cu, static_cast(shader >> 8u)})); @@ -285,13 +310,19 @@ Context SubmitDriverHtileClear(std::uint64_t address, std::unique_lock(address)})); - append(DriverPm4Packet(0x76u, {0x243u, static_cast(address >> 32u)})); - append(DriverPm4Packet(0x76u, {0x244u, 0xfffc00f0u})); - append(DriverPm4Packet(0x76u, {0x245u, 0u})); + if (buffer) { + append(DriverPm4Packet(0x76u, {0x213u, (12u << 1u) | 0x80u})); + append(DriverPm4Packet(0x76u, {0x240u, static_cast(address), (16u << 16u) | (static_cast(address >> 32u) & 0xffffu), 2048u, 0x0004bfacu})); + append(DriverPm4Packet(0x76u, {0x244u, 0xfffc00f0u, 0xfffc00f0u, 0xfffc00f0u, 0xfffc00f0u, 0u, 0u, 0u, 0u})); + } else { + append(DriverPm4Packet(0x76u, {0x213u, (6u << 1u) | 0x80u})); + append(DriverPm4Packet(0x76u, {0x240u, 0u})); + append(DriverPm4Packet(0x76u, {0x241u, 0u})); + append(DriverPm4Packet(0x76u, {0x242u, static_cast(address)})); + append(DriverPm4Packet(0x76u, {0x243u, static_cast(address >> 32u)})); + append(DriverPm4Packet(0x76u, {0x244u, 0xfffc00f0u})); + append(DriverPm4Packet(0x76u, {0x245u, 0u})); + } append(DriverPm4Packet(0x15u, {32u, 1u, 1u, 0x41u})); Packet packet{commands.data(), static_cast(commands.size()), 0u, {}}; Require(sceAgcDriverSubmitDcb(&packet) == 0, "native depth HTILE clear: PM4 submission failed"); @@ -828,7 +859,7 @@ void CheckStorageAliasRetirement() { std::puts("cached storage span retires only intersecting native depth owners"); } -enum class ClearFault { None, PartialStore, CpuWrite, DepthWrite, BadMetadata, UnprovenDispatch, PendingWrite, Overlap, PossibleStore, CompletedPossibleStore, DriverDispatch, ImportWindowWrite }; +enum class ClearFault { None, PartialStore, CpuWrite, DepthWrite, BadMetadata, UnprovenDispatch, PendingWrite, Overlap, PossibleStore, CompletedPossibleStore, DriverDispatch, ImportWindowWrite, DriverBufferDispatch }; void CheckClearDispatch() { const std::array code{ @@ -880,7 +911,7 @@ void CheckClearDispatch() { void CheckDepthTarget(Context context, VkFormat format, std::uint32_t fragments, bool one, bool clearing, std::optional depthOnlyOverride, ClearFault fault, std::unique_lock& gpuLock, bool iterate256 = true) { const VkExtent2D extent{5u, 3u}; const auto bytes = static_cast(MultisampledDepthBytes_nid_no_patch(extent, format == VK_FORMAT_D16_UNORM ? 2u : 4u, fragments)); - TargetMemory memory(bytes), metadata(65536u, fault == ClearFault::DriverDispatch); + TargetMemory memory(bytes), metadata(65536u, fault == ClearFault::DriverDispatch || fault == ClearFault::DriverBufferDispatch); const auto metadataBytes = HtileMetadataBytes(extent); const bool depthOnly = depthOnlyOverride.value_or(one); const std::uint32_t pattern = one ? (depthOnly ? 0xfffffff0u : 0xfffc00f0u) : 0u; @@ -999,14 +1030,14 @@ void CheckDepthTarget(Context context, VkFormat format, std::uint32_t fragments, target.clearDepth = clearOne ? 1.0f : 0.0f; Require(DepthSurfaceView(context, target) == view, "updating the native clear value replaced its attachment"); const std::uint32_t clearPattern = clearOne ? (depthOnly ? 0xfffffff0u : 0xfffc00f0u) : 0u; - if (fault == ClearFault::DriverDispatch && clearOne) { + if ((fault == ClearFault::DriverDispatch || fault == ClearFault::DriverBufferDispatch) && clearOne) { struct ShutdownDriver { ~ShutdownDriver() { try { AgcDriverShutdown_nid_postfix(); } catch (...) {} } } shutdownDriver; const auto generation = AgcDriver::GuestMemory::TrackerGeneration(); - const auto driverContext = SubmitDriverHtileClear(target.htileAddress, gpuLock); + const auto driverContext = SubmitDriverHtileClear(target.htileAddress, gpuLock, fault == ClearFault::DriverBufferDispatch); recorder.Activate(); Require(Recorder::Active() == &recorder, "driver idle did not restore the native depth fixture recorder"); if (!AgcDriver::GuestMemory::Watched(target.htileAddress, metadataBytes)) { @@ -1035,7 +1066,24 @@ void CheckDepthTarget(Context context, VkFormat format, std::uint32_t fragments, }), "HTILE host import simulation failed"); Require(AgcDriver::GuestMemory::CollectWritesUncached(target.htileAddress, static_cast(metadataBytes)) > beforeImport, "HTILE import window did not stamp its changed page"); } + if (completionCandidate && fault == ClearFault::None) { + TargetRefuses([&] { + auto uploadContext = context; + uploadContext.hostImportAlignment = 0; + GuestBufferMemory buffer(uploadContext); + buffer.AddWritable(target.htileAddress, metadataBytes); + buffer.Upload(false); + }, "sample-preserving guest publication"); + const auto accepted = std::pair{target.htileAddress, static_cast(metadataBytes)}; + RequireNoResidentDepthRead_nid_no_patch(target.htileAddress, metadataBytes, accepted); + TargetRefuses([&] { RequireNoResidentDepthRead_nid_no_patch(target.address, bytes, accepted); }, "sample-preserving guest publication"); + TargetRefuses([&] { RequireNoResidentDepthRead_nid_no_patch(target.htileAddress, metadataBytes + 1u, accepted); }, "sample-preserving guest publication"); + Require(DepthSurfaceAt(target.address), "an accepted HTILE buffer access retired its native depth owner"); + } if (completionCandidate) ArmHtileDepthClear(target.htileAddress, static_cast(metadataBytes)); + if (completionCandidate && fault == ClearFault::None) { + TargetRefuses([&] { RequireNoResidentDepthRead_nid_no_patch(target.htileAddress, metadataBytes, std::pair{target.htileAddress, static_cast(metadataBytes)}); }, "sample-preserving guest publication"); + } if (fault == ClearFault::Overlap) NoteHtileDepthClear(target.htileAddress, static_cast(metadataBytes), nativeBytes); const auto storedBytes = fault == ClearFault::PartialStore ? 4u : static_cast(metadataBytes); if (fault == ClearFault::PossibleStore || fault == ClearFault::CompletedPossibleStore) { @@ -1550,6 +1598,11 @@ int main(int argc, char** argv) { std::printf("Native depth completed clear cases checked=%u unavailable=%u\n", checked, unavailable); return 0; } + if (argc == 2 && std::string_view(argv[1]) == "--buffer-clear") { + CheckDepthTarget(context, VK_FORMAT_D32_SFLOAT, 4u, false, true, false, ClearFault::DriverBufferDispatch, lock); + std::puts("Native depth clear by the buffer HTILE mask kernel through PM4 checked"); + return 0; + } Require(argc == 1 || (argc == 2 && std::string_view(argv[1]) == "--retirement"), "invalid native depth fixture arguments"); if (argc == 2) { std::uint32_t checked = 0u, unavailable = 0u; diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/PipelineJournal.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/PipelineJournal.cpp index 50962142c0..664f6c4940 100644 --- a/core/libs/prx/libSceAgcDriver/tests/execution/PipelineJournal.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/execution/PipelineJournal.cpp @@ -494,6 +494,37 @@ std::vector ReadJournalComputeIdentities(con return identities; } +void ReplayRacesDispatchTests() { + using namespace NarrowConstantStoreFixture; + constexpr std::uint32_t Pipelines = 32; + Block compute(BlockBytes); + const auto words = AddressWords(compute); + std::vector> codes; + for (std::uint32_t salt = 16; salt < 16 + Pipelines; ++salt) codes.push_back(ComputeCode(salt)); + { + const auto device = OpenVulkanTestDevice(); + Require(device != nullptr, "the device recording the raced pipelines could not be opened"); + device->WaitForPipelineJournalReplay(); + for (const auto& code : codes) device->Dispatch(CompileCompute(*device, code, words, 32), 1, 1, 1, {}, reinterpret_cast(code.data())); + device->WaitIdle(); + AgcDriver::Graphics::FlushPipelineJournal(); + } + const auto before = Snapshot(); + { + const auto device = OpenVulkanTestDevice(); + Require(device != nullptr, "the device racing the replay could not be opened"); + std::vector shaders; + for (const auto& code : codes) shaders.push_back(CompileCompute(*device, code, words, 32)); + for (std::size_t index = 0; index < shaders.size(); ++index) device->Dispatch(shaders[index], 1, 1, 1, {}, reinterpret_cast(codes[index].data())); + device->WaitIdle(); + device->WaitForPipelineJournalReplay(); + const auto after = Snapshot(); + Require(after.journal.replayRejected == before.journal.replayRejected && after.journal.replayFailed == before.journal.replayFailed, "the raced replay rejected or failed a compute pipeline"); + const auto visited = (after.journal.replayedCompute - before.journal.replayedCompute) + (after.journal.replayPresent - before.journal.replayPresent); + Require(device->ComputePipelinesCreated() == visited, "a dispatch and the replay both built a compute pipeline: " + std::to_string(device->ComputePipelinesCreated()) + " built for " + std::to_string(visited) + " replayed"); + } +} + void NewestEntriesTests() { using namespace NarrowConstantStoreFixture; Block compute(BlockBytes); @@ -743,6 +774,7 @@ int main(int argc, char** argv) { return 0; } JournalTests(); + ReplayRacesDispatchTests(); NewestEntriesTests(); EvictionTests(); EvictionWatermarkTests(); diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/PipelinedDispatch.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/PipelinedDispatch.cpp index 4996854346..02b9256f7a 100644 --- a/core/libs/prx/libSceAgcDriver/tests/execution/PipelinedDispatch.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/execution/PipelinedDispatch.cpp @@ -4,6 +4,7 @@ #include "prx/libSceAgcDriver/Submit/include/Dcb.hpp" #include "prx/libc/include/GuestAllocations.hpp" #include "prx/libc/include/Shutdown.hpp" +#include "TargetAddressWindow.hpp" #include "VulkanTestDevice.hpp" #ifdef _WIN32 #ifndef NOMINMAX @@ -54,6 +55,22 @@ std::uint32_t* Table = nullptr; std::uint32_t* TargetA = nullptr; std::uint32_t* TargetB = nullptr; +void NewTargetPair() { + constexpr std::size_t regionBytes = 3u * BlockBytes; +#ifdef _WIN32 + auto* region = static_cast(VirtualAlloc(nullptr, regionBytes, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE)); +#else + auto* region = static_cast(std::aligned_alloc(BlockBytes, regionBytes)); +#endif + if (region == nullptr) throw std::runtime_error("pipelined dispatch: cannot allocate contiguous target blocks"); + std::memset(region, 0, regionBytes); + GuestAllocations::Mutation().Add(region, regionBytes, true, true, false); + const auto indices = AgcDriver::Tests::TargetAddressWindowPair(reinterpret_cast(region), BlockBytes); + constexpr auto wordsPerBlock = BlockBytes / sizeof(std::uint32_t); + TargetA = region + indices[0] * wordsPerBlock; + TargetB = region + indices[1] * wordsPerBlock; +} + alignas(256) constexpr std::array Code{0x34020082u, 0xe0301000u, 0x80000201u, 0xbf8c3f70u, 0x4a060481u, 0xe0701000u, 0x80010301u, 0xbf810000u}; alignas(256) constexpr std::array ScalarCode{0xf4000200u, 0xfa000000u, 0xbf8cc07fu, 0x34020082u, 0x7e040208u, 0x4a040481u, 0xe0701000u, 0x80010201u, 0xbf810000u}; @@ -169,8 +186,7 @@ int main() { Output = NewBlock(); Scratch = NewBlock(); Table = NewBlock(); - TargetA = NewBlock(); - TargetB = NewBlock(); + NewTargetPair(); check((reinterpret_cast(TargetA) >> 32u) == (reinterpret_cast(TargetB) >> 32u), "the two targets do not share their high address dword"); const auto initialDescriptor = BufferDescriptor(TargetA, BufferBytes); std::copy(initialDescriptor.begin(), initialDescriptor.end(), Table); diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/PreparedShaders.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/PreparedShaders.cpp index 9b80ce493c..06615fbf2a 100644 --- a/core/libs/prx/libSceAgcDriver/tests/execution/PreparedShaders.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/execution/PreparedShaders.cpp @@ -14,6 +14,7 @@ #include "prx/libc/include/GuestAllocations.hpp" #include "prx/libSceAgcDriver/Submit/include/Acb.hpp" #include "prx/libSceAgcDriver/Submit/include/Dcb.hpp" +#include "tests/TemporaryFile.hpp" #include #include #include @@ -931,7 +932,7 @@ public: StderrCapture() { AgcDriver::FlushAsyncLog_nid_no_patch(); std::fflush(stderr); - file = std::tmpfile(); + file = TemporaryFile::Open(); Require(file != nullptr, "cannot open a temporary file for stderr"); #ifdef _WIN32 saved = _dup(_fileno(stderr)); diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/ResidentHeapMirror.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/ResidentHeapMirror.cpp index 548aa80dd1..536ab5610a 100644 --- a/core/libs/prx/libSceAgcDriver/tests/execution/ResidentHeapMirror.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/execution/ResidentHeapMirror.cpp @@ -137,6 +137,14 @@ public: void Store(std::uint64_t offset, std::uint32_t value) const { std::memcpy(base + offset, &value, sizeof(value)); } + void SetWritable(bool writable) const { + GuestAllocations::Mutation mutation; + for (std::uint64_t range = 0; range < ranges; ++range) { + mutation.Remove(base + range * rangeBytes); + mutation.Add(base + range * rangeBytes, rangeBytes, true, writable, true); + } + } + std::uint32_t Load(std::uint64_t offset) const { std::uint32_t value = 0; std::memcpy(&value, base + offset, sizeof(value)); @@ -380,6 +388,118 @@ void JoinedImportTests(AgcDriver::VulkanDevice& device) { Require(released.mirrors == 0 && released.bytes == 0, "resident heap mirror: a joined host import over two heap-mirrored heaps left " + std::to_string(released.mirrors) + " of their " + std::to_string(mirrored.mirrors) + " heap mirrors and " + std::to_string(released.bytes >> 10u) + " of " + std::to_string(mirrored.bytes >> 10u) + " KiB held"); } +struct HeapMirrorBudget { + explicit HeapMirrorBudget(std::uint64_t bytes) : previous(current) { + current = bytes; + AgcDriver::Graphics::SetHeapMirrorBudget(bytes); + } + ~HeapMirrorBudget() { + current = previous; + AgcDriver::Graphics::SetHeapMirrorBudget(previous); + } + HeapMirrorBudget(const HeapMirrorBudget&) = delete; + HeapMirrorBudget& operator=(const HeapMirrorBudget&) = delete; + +private: + static inline std::uint64_t current = 0; + std::uint64_t previous = 0; +}; + +void BudgetEvictionTests(AgcDriver::VulkanDevice& device, bool sparse) { + const auto mirrorUnit = sparse ? Block : HeapBytes; + { + GuestHeap written(true); + written.Store(16, 0x77u); + const OutputBlock output; + const ImportBudget importBudget(AgcDriver::Graphics::HostImportLiveBytes() + Block); + Dispatch(device, written, written, output); + const auto baseline = AgcDriver::Graphics::MirrorCounters(); + + GuestHeap first(false); + for (std::uint32_t thread = 0; thread * ThreadStride < Block; ++thread) first.Store(thread * ThreadStride, Pattern(thread)); + const auto firstAddress = first.Address(); + const HeapMirrorBudget budget(baseline.heapBytes + mirrorUnit); + Dispatch(device, first, written, output); + CheckReads(output, "budget eviction: first dispatch", false); + CheckStores(written, "budget eviction: first dispatch"); + Require(AgcDriver::Graphics::HeapMirrorsWithin(firstAddress, firstAddress + HeapBytes).mirrors == 1, "budget eviction: first heap mirror missing"); + + auto hold = AgcDriver::Graphics::HoldHeapMirror(firstAddress); + Require(hold != nullptr, "budget eviction: could not acquire mirror handle to test reference retention"); + auto holdWritten = AgcDriver::Graphics::HoldHeapMirror(written.Address()); + Require(holdWritten != nullptr, "budget eviction: could not acquire written mirror handle to test reference retention"); + bool heldThrew = false; + try { + GuestHeap blocked(false); + for (std::uint32_t thread = 0; thread * ThreadStride < Block; ++thread) blocked.Store(thread * ThreadStride, ~Pattern(thread)); + Dispatch(device, blocked, written, output); + } catch (const std::runtime_error& error) { + heldThrew = std::string(error.what()).find("past the budget") != std::string::npos; + } + Require(heldThrew, "budget eviction: referenced mirror was evicted under budget constraint"); + Require(AgcDriver::Graphics::HeapMirrorsWithin(firstAddress, firstAddress + HeapBytes).mirrors == 1, "budget eviction: referenced mirror dropped prematurely"); + holdWritten.reset(); + hold.reset(); + + const auto beforeEviction = AgcDriver::Graphics::MirrorCounters(); + GuestHeap second(false); + for (std::uint32_t thread = 0; thread * ThreadStride < Block; ++thread) second.Store(thread * ThreadStride, ~Pattern(thread)); + Dispatch(device, second, written, output); + for (std::uint32_t thread = 0; thread < Threads; ++thread) { + const auto expected = thread * ThreadStride < Block ? ~Pattern(thread) : 0u; + Require(output.Data()[thread] == expected, "budget eviction: second dispatch thread " + std::to_string(thread) + " mismatch"); + } + Require(AgcDriver::Graphics::HeapMirrorsWithin(firstAddress, firstAddress + HeapBytes).mirrors == 0, "budget eviction: first heap mirror was not evicted"); + Require(AgcDriver::Graphics::HeapMirrorsWithin(second.Address(), second.Address() + HeapBytes).mirrors == 1, "budget eviction: second heap mirror missing"); + Require(AgcDriver::Graphics::MirrorCounters().evictions == beforeEviction.evictions + 1, "budget eviction: eviction counter was not incremented"); + + Dispatch(device, first, written, output); + CheckReads(output, "budget eviction: re-upload first dispatch", false); + CheckStores(written, "budget eviction: re-upload first dispatch"); + Require(AgcDriver::Graphics::HeapMirrorsWithin(firstAddress, firstAddress + HeapBytes).mirrors == 1, "budget eviction: first heap mirror re-upload missing"); + Require(AgcDriver::Graphics::HeapMirrorsWithin(second.Address(), second.Address() + HeapBytes).mirrors == 0, "budget eviction: second heap mirror was not evicted on re-upload"); + Require(AgcDriver::Graphics::MirrorCounters().evictions == beforeEviction.evictions + 2, "budget eviction: re-upload eviction counter mismatch"); + } + + { + const ImportBudget importBudget(AgcDriver::Graphics::HostImportLiveBytes() + Block); + const HeapMirrorBudget buildBudget(mirrorUnit); + GuestHeap heapA(false); + GuestHeap heapB(false); + const bool aIsLower = heapA.Address() < heapB.Address(); + auto& freshRead = aIsLower ? heapA : heapB; + auto& freshWritten = aIsLower ? heapB : heapA; + freshWritten.SetWritable(true); + std::memset(freshRead.Data(), 0, HeapBytes); + for (std::uint32_t thread = 0; thread * ThreadStride < Block; ++thread) freshRead.Store(thread * ThreadStride, Pattern(thread)); + std::memset(freshWritten.Data(), 0, HeapBytes); + freshWritten.Store(StoreBlock + 512, 0x77u); + const OutputBlock output; + const auto beforeBuild = AgcDriver::Graphics::MirrorCounters(); + Dispatch(device, freshRead, freshWritten, output); + CheckReads(output, "budget eviction: build-time eviction", false); + CheckStores(freshWritten, "budget eviction: build-time eviction"); + Require(freshWritten.Load(StoreBlock + 512) == 0x77u, "budget eviction: build-time eviction: guest bytes changed"); + Require(AgcDriver::Graphics::HeapMirrorsWithin(freshRead.Address(), freshRead.Address() + HeapBytes).mirrors == 0, "budget eviction: build-time read-only mirror was not evicted"); + Require(AgcDriver::Graphics::HeapMirrorsWithin(freshWritten.Address(), freshWritten.Address() + HeapBytes).mirrors == 1, "budget eviction: build-time written mirror missing"); + Require(AgcDriver::Graphics::MirrorCounters().evictions >= beforeBuild.evictions + 1, "budget eviction: build-time eviction counter mismatch"); + } + + bool threw = false; + try { + const ImportBudget importBudget(AgcDriver::Graphics::HostImportLiveBytes() + Block); + const HeapMirrorBudget lowBudget(mirrorUnit / 2); + GuestHeap fail(false); + for (std::uint32_t thread = 0; thread * ThreadStride < Block; ++thread) fail.Store(thread * ThreadStride, Pattern(thread)); + GuestHeap failWritten(true); + const OutputBlock output; + Dispatch(device, fail, failWritten, output); + } catch (const std::runtime_error& error) { + threw = std::string(error.what()).find("past the budget") != std::string::npos; + } + Require(threw, "budget eviction negative control: dispatch under insufficient budget did not throw"); +} + } int main() { @@ -405,6 +525,7 @@ int main() { std::puts("the device has no sparseBinding, sparseResidencyBuffer and sparseResidencyAliased, so every heap mirror is a whole copy; the resident heap mirror tests are skipped"); } CopiedTests(*device); + BudgetEvictionTests(*device, sparse); for (const bool copied : {false, true}) { if (!copied && !sparse) continue; for (const bool readFirst : {false, true}) PartialImportTests(*device, copied, readFirst); diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/SampleMultisampleTarget.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/SampleMultisampleTarget.cpp index f9f42ce348..f4218f55cf 100644 --- a/core/libs/prx/libSceAgcDriver/tests/execution/SampleMultisampleTarget.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/execution/SampleMultisampleTarget.cpp @@ -16,6 +16,7 @@ #include "Recompiler.hpp" #include "Optimization/ResourceProgram.hpp" #include "VulkanTestDevice.hpp" +#include "tests/TemporaryFile.hpp" #include #ifdef _WIN32 #ifndef NOMINMAX @@ -175,7 +176,7 @@ class StderrCapture { public: StderrCapture() { std::fflush(stderr); - file = std::tmpfile(); + file = TemporaryFile::Open(); Require(file != nullptr, "cannot open a temporary file for stderr"); #ifdef _WIN32 saved = _dup(_fileno(stderr)); diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/SampledClearKeys.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/SampledClearKeys.cpp new file mode 100644 index 0000000000..729e9e1d1b --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/execution/SampledClearKeys.cpp @@ -0,0 +1,200 @@ +#include "prx/libSceAgcDriver/Execution/include/GuestMemory.hpp" +#include "prx/libSceAgcDriver/Execution/include/VulkanDevice.hpp" +#include "prx/libSceAgcDriver/Graphics/include/DccMetadata.hpp" +#include "prx/libSceAgcDriver/Graphics/include/GuestTextureResource.hpp" +#include "prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp" +#include "prx/libSceAgcDriver/Graphics/include/Texture.hpp" +#include "prx/libc/include/GuestAllocations.hpp" +#include "prx/libc/include/GuestArena.hpp" +#include "prx/libc/include/GuestWriteWatch.hpp" +#include "Recompiler.hpp" +#include "VulkanTestDevice.hpp" +#ifdef _WIN32 +#ifndef NOMINMAX +#define NOMINMAX +#endif +#include +#else +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { + +using AgcDriver::Graphics::DccKeys; +using AgcDriver::Graphics::Require; +using ShaderRecompiler::ShaderStage; + +constexpr std::uint32_t Threads = 32; +constexpr std::uint32_t Side = 128; +constexpr std::uint32_t Format8888Unorm = 56; +constexpr std::uint32_t TileRenderTarget64KB = 0x1b; +constexpr std::uint32_t Type2D = 9; +constexpr std::size_t SurfaceBytes = 65536; +constexpr std::size_t KeyBytes = SurfaceBytes / 256; +constexpr std::size_t KeysOffset = SurfaceBytes; +constexpr std::size_t BlockBytes = 2 * 65536 + 2048; +constexpr std::size_t ArenaBytes = 3 * 65536; + +alignas(256) constexpr std::array SampleSecondTexelCode{ + 0x34060084, 0x7e2802ff, 0x3c400000, 0x7e2a02ff, 0x3b800000, 0xf09c0f08, 0x00610a14, 0xbf8c3f70, + 0xe0781000, 0x80000a03, 0xbf810000, +}; + +constexpr std::array PointSampler{0x00000092u, 0x00fff000u, 0u, 0u}; + +std::uint64_t AddressOf(const void* data) { + return static_cast(reinterpret_cast(data)); +} + +class GuestBlock { +public: + GuestBlock() { +#ifdef _WIN32 + block = static_cast(GuestArena::GuestArenaAllocate_nid_postfix(ArenaBytes, 65536)); + if (block != nullptr) GuestArena::GuestArenaCommit_nid_postfix(block, ArenaBytes, PAGE_READWRITE, ArenaBytes); +#else + constexpr std::uintptr_t alignment = 65536; + void* mapped = mmap(nullptr, ArenaBytes + alignment, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + if (mapped != MAP_FAILED) { + const auto begin = reinterpret_cast(mapped); + const auto aligned = (begin + alignment - 1) & ~(alignment - 1); + if (aligned != begin) munmap(mapped, aligned - begin); + if (aligned + ArenaBytes != begin + ArenaBytes + alignment) munmap(reinterpret_cast(aligned + ArenaBytes), begin + alignment - aligned); + block = reinterpret_cast(aligned); + GuestWriteWatch::GuestWriteWatchRegister_nid_postfix(block, ArenaBytes); + } +#endif + Require(block != nullptr, "sampled clear keys: cannot allocate the guest block"); + Require(AgcDriver::GuestMemory::Watched(AddressOf(block), BlockBytes), "sampled clear keys: the guest block is not write-watched"); + GuestAllocations::Mutation().Add(block, BlockBytes, true, true, true); + } + + ~GuestBlock() { + GuestAllocations::Mutation().Remove(block); +#ifdef _WIN32 + GuestArena::GuestArenaReset_nid_postfix(block, ArenaBytes); + GuestArena::GuestArenaRelease_nid_postfix(block, ArenaBytes); +#else + munmap(block, ArenaBytes); + GuestWriteWatch::GuestWriteWatchUnregister_nid_postfix(block, ArenaBytes); +#endif + } + + GuestBlock(const GuestBlock&) = delete; + GuestBlock& operator=(const GuestBlock&) = delete; + + std::uint8_t* Data() { return block; } + +private: + std::uint8_t* block = nullptr; +}; + +std::array TextureDescriptor(const std::uint8_t* texels, const std::uint8_t* keys) { + const auto address = AddressOf(texels); + const auto meta = AddressOf(keys) >> 8u; + return { + static_cast(address >> 8u), + static_cast((address >> 40u) & 0xffu) | (Format8888Unorm << 20u) | (((Side - 1u) & 3u) << 30u), + ((Side - 1u) >> 2u) | ((Side - 1u) << 14u), + 0xfacu | (TileRenderTarget64KB << 20u) | (Type2D << 28u), + 0u, + 0u, + (1u << 20u) | (1u << 21u) | (static_cast(meta & 0xffu) << 24u), + static_cast(meta >> 8u), + }; +} + +std::array BufferDescriptor(const void* data, std::uint32_t bytes) { + const auto address = AddressOf(data); + return {static_cast(address), static_cast((address >> 32u) & 0xffffu), bytes, 0x31016facu}; +} + +void Dispatch(AgcDriver::VulkanDevice& device, std::span code, const std::vector& userData) { + const std::array memory{{{reinterpret_cast(code.data()), std::as_bytes(code)}}}; + const ShaderRecompiler::ShaderComputeStageInfo compute{{Threads, 1, 1}, 0u, {false, false, false}, false, 1}; + ShaderRecompiler::RecompileRequest request{ + {ShaderStage::Compute, reinterpret_cast(code.data()), code, 0, {}}, + {32, 0, userData, compute, std::nullopt, std::nullopt, memory}, + device.Target(), + {0, 0, 0, 128} + }; + request.useCache = false; + const auto result = ShaderRecompiler::Recompile(request); + device.Dispatch(result, 1, 1, 1, {}, reinterpret_cast(code.data())); + device.WaitIdle(); +} + +void Sample(AgcDriver::VulkanDevice& device, const std::array& texture, std::vector& output, const std::string& what, float expected) { + std::fill(output.begin(), output.end(), 0xdeadbeefu); + std::vector userData(24, 0u); + const auto results = BufferDescriptor(output.data(), Threads * 16u); + std::copy(results.begin(), results.end(), userData.begin()); + std::copy(texture.begin(), texture.end(), userData.begin() + 4); + std::copy(PointSampler.begin(), PointSampler.end(), userData.begin() + 12); + AgcDriver::GuestMemory::BumpCollectEpoch(); + Dispatch(device, SampleSecondTexelCode, userData); + for (std::uint32_t index = 0; index < Threads * 4u; ++index) { + const auto value = std::bit_cast(output[index]); + char message[256]; + std::snprintf(message, sizeof(message), "%s: component %u of thread %u is %g (0x%08x), expected %g", what.c_str(), index % 4u, index / 4u, value, output[index], expected); + Require(std::fabs(value - expected) < 1e-6f, message); + } +} + +} + +int main() { + try { + const auto device = OpenVulkanTestDevice(); + if (!device) return VulkanTestSkipped; + GuestBlock block; + auto* texels = block.Data(); + auto* keys = texels + KeysOffset; + std::memset(texels, 0x5a, SurfaceBytes); + const auto texture = TextureDescriptor(texels, keys); + const auto resource = AgcDriver::Graphics::DecodeTextureResource(texture); + std::vector output(Threads * 4u, 0u); + { + std::lock_guard gpu(AgcDriver::GuestMemory::GpuMutex()); + std::memset(keys, 0xff, KeyBytes); + AgcDriver::GuestMemory::BumpCollectEpoch(); + Require(AgcDriver::Graphics::TextureClearKeys(resource, SurfaceBytes) == DccKeys::Uncompressed, "the 0xff key bytes do not read uncompressed"); + const auto before = AgcDriver::Graphics::SampledTexturesCleared(); + Sample(*device, texture, output, "uncompressed texels", 90.0f / 255.0f); + Require(AgcDriver::Graphics::SampledTexturesCleared() == before, "an uncompressed surface was made by a clear instead of from its texels"); + + std::memset(keys, 0xc0, KeyBytes); + AgcDriver::GuestMemory::BumpCollectEpoch(); + Require(AgcDriver::Graphics::TextureClearKeys(resource, SurfaceBytes) == DccKeys::Clear1111, "the 0xc0 key bytes do not read a 1111 clear"); + Sample(*device, texture, output, "1111 fast clear", 1.0f); + Require(AgcDriver::Graphics::SampledTexturesCleared() == before + 1, "the 1111 fast-cleared surface was not made by a clear on the GPU"); + + std::memset(keys, 0x00, KeyBytes); + AgcDriver::GuestMemory::BumpCollectEpoch(); + Require(AgcDriver::Graphics::TextureClearKeys(resource, SurfaceBytes) == DccKeys::Clear0000, "the 0x00 key bytes do not read a 0000 clear"); + Sample(*device, texture, output, "0000 fast clear", 0.0f); + Require(AgcDriver::Graphics::SampledTexturesCleared() == before + 2, "the 0000 fast-cleared surface was not made by a clear on the GPU"); + } + { + std::lock_guard lock(AgcDriver::GuestMemory::GpuMutex()); + AgcDriver::Graphics::FlushCachedTextures(device->Device()); + } + device->WaitIdle(); + std::puts("sampled clear keys tests passed"); + return 0; + } catch (const std::exception& error) { + std::cerr << error.what() << '\n'; + return 1; + } +} diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/TargetAddressWindow.hpp b/core/libs/prx/libSceAgcDriver/tests/execution/TargetAddressWindow.hpp new file mode 100644 index 0000000000..a8ba0bd671 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/execution/TargetAddressWindow.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include +#include +#include +#include + +namespace AgcDriver::Tests { + +inline std::array TargetAddressWindowPair(std::uintptr_t base, std::size_t blockBytes) { + const auto first = base; + const auto second = first + blockBytes; + const auto third = second + blockBytes; + if ((first >> 32u) == (second >> 32u)) return {0u, 1u}; + if ((second >> 32u) == (third >> 32u)) return {1u, 2u}; + throw std::runtime_error("three contiguous blocks do not contain a same-window target pair"); +} + +} diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/UnclampedNormalizedBlend.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/UnclampedNormalizedBlend.cpp index fe4ba8a092..a8c47fc2c4 100644 --- a/core/libs/prx/libSceAgcDriver/tests/execution/UnclampedNormalizedBlend.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/execution/UnclampedNormalizedBlend.cpp @@ -512,6 +512,10 @@ int main() { std::puts("skipped, the device lacks fragmentShaderPixelInterlock"); return VulkanTestSkipped; } + if (!TargetHasCapability(device->Target(), spv::CapabilityStorageImageReadWithoutFormat)) { + std::puts("skipped, the device lacks shaderStorageImageReadWithoutFormat"); + return VulkanTestSkipped; + } const ColorTargetLayout layout(Width, Height, ColorTileMode::RenderTarget, 4); Block block(layout.Bytes()); const auto unorm = DecodeTarget(block, Unorm8888Info); diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/WindowLaneSpill.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/WindowLaneSpill.cpp index a18422c711..e6b94db984 100644 --- a/core/libs/prx/libSceAgcDriver/tests/execution/WindowLaneSpill.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/execution/WindowLaneSpill.cpp @@ -2,6 +2,7 @@ #include "prx/libSceAgcDriver/Graphics/include/Draw.hpp" #include "Recompiler.hpp" #include "VulkanTestDevice.hpp" +#include "tests/TemporaryFile.hpp" #include #include #include @@ -69,7 +70,7 @@ class StderrCapture { public: StderrCapture() { std::fflush(stderr); - file = std::tmpfile(); + file = TemporaryFile::Open(); Require(file != nullptr, "cannot open a temporary file for stderr"); #ifdef _WIN32 saved = _dup(_fileno(stderr)); diff --git a/core/libs/prx/libSceAjm.native/Export.cpp b/core/libs/prx/libSceAjm.native/Export.cpp index c9f1f976a7..7248aaec4c 100644 --- a/core/libs/prx/libSceAjm.native/Export.cpp +++ b/core/libs/prx/libSceAjm.native/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceAjm.native/include/InventoryExports.hpp" #include "prx/libSceAjm.native/include/Api.hpp" #include #include @@ -143,3 +145,42 @@ int APS5_VABI sceAjmInstanceSwitch(uint32_t context, uint32_t codec, uint64_t fl } } + +extern "C" { + +int APS5_VABI libSceAjm_nativeUnknown_IfQ_minus_AhcmW9k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IfQ-AhcmW9k", libSceAjm_nativeUnknown_IfQ_minus_AhcmW9k_nid_no_patch); + +int APS5_VABI libSceAjm_nativeUnknown_JAPya_minus_QyJlU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JAPya-QyJlU", libSceAjm_nativeUnknown_JAPya_minus_QyJlU_nid_no_patch); + +int APS5_VABI libSceAjm_nativeUnknown_MgTTRx1YSFw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MgTTRx1YSFw", libSceAjm_nativeUnknown_MgTTRx1YSFw_nid_no_patch); + +int APS5_VABI libSceAjm_nativeUnknown_POOw6Y5luA8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("POOw6Y5luA8", libSceAjm_nativeUnknown_POOw6Y5luA8_nid_no_patch); + +int APS5_VABI libSceAjm_nativeUnknown_mKgie3ed4ao_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mKgie3ed4ao", libSceAjm_nativeUnknown_mKgie3ed4ao_nid_no_patch); + +int APS5_VABI libSceAjm_nativeUnknown_mwtwIZb60YM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mwtwIZb60YM", libSceAjm_nativeUnknown_mwtwIZb60YM_nid_no_patch); + +int APS5_VABI libSceAjm_nativeUnknown_qkuXdR4_minus_Ihc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qkuXdR4-Ihc", libSceAjm_nativeUnknown_qkuXdR4_minus_Ihc_nid_no_patch); + +} diff --git a/core/libs/prx/libSceAjm.native/include/InventoryExports.hpp b/core/libs/prx/libSceAjm.native/include/InventoryExports.hpp new file mode 100644 index 0000000000..ffeb4739dd --- /dev/null +++ b/core/libs/prx/libSceAjm.native/include/InventoryExports.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceAjm_nativeUnknown_IfQ_minus_AhcmW9k_nid_no_patch(); +int APS5_VABI libSceAjm_nativeUnknown_JAPya_minus_QyJlU_nid_no_patch(); +int APS5_VABI libSceAjm_nativeUnknown_MgTTRx1YSFw_nid_no_patch(); +int APS5_VABI libSceAjm_nativeUnknown_POOw6Y5luA8_nid_no_patch(); +int APS5_VABI libSceAjm_nativeUnknown_mKgie3ed4ao_nid_no_patch(); +int APS5_VABI libSceAjm_nativeUnknown_mwtwIZb60YM_nid_no_patch(); +int APS5_VABI libSceAjm_nativeUnknown_qkuXdR4_minus_Ihc_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceAjm.native/libSceAjm.native.hpp b/core/libs/prx/libSceAjm.native/libSceAjm.native.hpp index ed8be05e6b..938acd9e23 100644 --- a/core/libs/prx/libSceAjm.native/libSceAjm.native.hpp +++ b/core/libs/prx/libSceAjm.native/libSceAjm.native.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceAjm.native/include/Api.hpp" +#include "prx/libSceAjm.native/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceAmpr/CMakeLists.txt b/core/libs/prx/libSceAmpr/CMakeLists.txt index f9898075a1..7205256f67 100644 --- a/core/libs/prx/libSceAmpr/CMakeLists.txt +++ b/core/libs/prx/libSceAmpr/CMakeLists.txt @@ -8,6 +8,17 @@ if(BUILD_TESTING) target_include_directories(guest_ampr_tests PRIVATE ${LIBS_INCLUDE_DIR}) target_link_libraries(guest_ampr_tests PRIVATE libSceAmpr libkernel libc) configure_windows_unwind(guest_ampr_tests) + add_test_executable(guest_ampr_div_and_buffer_size_tests ${LIBS_INCLUDE_DIR}/tests/GuestAmprDivAndBufferSize.cpp) + target_include_directories(guest_ampr_div_and_buffer_size_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_ampr_div_and_buffer_size_tests PRIVATE libSceAmpr libkernel libc) + configure_windows_unwind(guest_ampr_div_and_buffer_size_tests) + add_test(NAME guest_ampr_div_and_buffer_size COMMAND guest_ampr_div_and_buffer_size_tests) + set_tests_properties(guest_ampr_div_and_buffer_size PROPERTIES TIMEOUT 20) + if(WIN32) + set_tests_properties(guest_ampr_div_and_buffer_size PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test(NAME guest_ampr_markers COMMAND guest_ampr_tests) if(WIN32) set_tests_properties(guest_ampr_markers PROPERTIES ENVIRONMENT_MODIFICATION diff --git a/core/libs/prx/libSceAmpr/Export.cpp b/core/libs/prx/libSceAmpr/Export.cpp index 11554dffa9..08c7fb26cb 100644 --- a/core/libs/prx/libSceAmpr/Export.cpp +++ b/core/libs/prx/libSceAmpr/Export.cpp @@ -518,7 +518,7 @@ uint32_t APS5_VABI sceAmprCommandBufferGetNumCommands(const Apr::CommandBufferOb } uint32_t APS5_VABI sceAmprCommandBufferGetSize(const Apr::CommandBufferObject* buffer) { - return buffer->size; + return buffer != nullptr ? buffer->size : 0; } uint32_t APS5_VABI sceAmprCommandBufferGetType(const Apr::CommandBufferObject* buffer) { diff --git a/core/libs/prx/libSceAppContent/CMakeLists.txt b/core/libs/prx/libSceAppContent/CMakeLists.txt index b1deabb076..669824c193 100644 --- a/core/libs/prx/libSceAppContent/CMakeLists.txt +++ b/core/libs/prx/libSceAppContent/CMakeLists.txt @@ -13,3 +13,15 @@ if(BUILD_TESTING) "PATH=path_list_prepend:$") endif() endif() + +if(BUILD_TESTING) + add_test_executable(guest_appcontent_license_tests ${LIBS_INCLUDE_DIR}/tests/GuestAppContentLicense.cpp) + target_include_directories(guest_appcontent_license_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_appcontent_license_tests PRIVATE libSceAppContent libc ${CMAKE_DL_LIBS}) + configure_windows_unwind(guest_appcontent_license_tests) + add_test(NAME guest_appcontent_license COMMAND guest_appcontent_license_tests) + if(WIN32) + set_tests_properties(guest_appcontent_license PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAppContent/Export.cpp b/core/libs/prx/libSceAppContent/Export.cpp index 478f72de02..9d53053c3b 100644 --- a/core/libs/prx/libSceAppContent/Export.cpp +++ b/core/libs/prx/libSceAppContent/Export.cpp @@ -70,20 +70,31 @@ static void ClearDirectory(const std::filesystem::path& directory) { extern "C" { -int APS5_VABI sceAppContentCheckBundleLicenseOnDisc() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI sceAppContentCheckBundleLicenseOnDisc(uint32_t serviceLabel, const NpUnifiedEntitlementLabel* entitlementLabel) { + if (!initialized.load()) return SCE_APP_CONTENT_ERROR_NOT_INITIALIZED; + (void)serviceLabel; + if (!entitlementLabel) return SCE_APP_CONTENT_ERROR_PARAMETER; + if (!validEntitlementLabel(*entitlementLabel, 0x03500000)) return SCE_APP_CONTENT_ERROR_PARAMETER; + return SCE_APP_CONTENT_ERROR_NOT_FOUND; } int APS5_VABI sceAppContentDownloadDataGetBlockSize() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI sceAppContentGetGameTrialsFlag() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI sceAppContentGetGameTrialsFlag(uint32_t* gameTrialsFlag) { + if (!initialized.load()) return SCE_APP_CONTENT_ERROR_NOT_INITIALIZED; + if (!gameTrialsFlag) return SCE_APP_CONTENT_ERROR_PARAMETER; + *gameTrialsFlag = 0; + return 0; } -int APS5_VABI sceAppContentGetPlayableStatus() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI sceAppContentGetPlayableStatus(uint32_t serviceLabel, const NpUnifiedEntitlementLabel* entitlementLabel, uint32_t* playableStatus) { + if (!initialized.load()) return SCE_APP_CONTENT_ERROR_NOT_INITIALIZED; + (void)serviceLabel; + if (!entitlementLabel || !playableStatus) return SCE_APP_CONTENT_ERROR_PARAMETER; + if (!validEntitlementLabel(*entitlementLabel, 0x03500000)) return SCE_APP_CONTENT_ERROR_PARAMETER; + return SCE_APP_CONTENT_ERROR_NOT_FOUND; } diff --git a/core/libs/prx/libSceAppContent/include/Api.hpp b/core/libs/prx/libSceAppContent/include/Api.hpp index a48561a66e..ae24effec5 100644 --- a/core/libs/prx/libSceAppContent/include/Api.hpp +++ b/core/libs/prx/libSceAppContent/include/Api.hpp @@ -32,6 +32,7 @@ int APS5_VABI sceAppContentAddcontEnqueueDownloadByEntitlemetId(const char* enti int APS5_VABI sceAppContentAddcontEnqueueDownloadSp(uint32_t serviceLabel, const NpUnifiedEntitlementLabel* entitlementLabel); int APS5_VABI sceAppContentAddcontMountByEntitlemetId(const char* entitlementId, AppContentMountPoint* mountPoint); int APS5_VABI sceAppContentAddcontShrink(uint32_t serviceLabel, const NpUnifiedEntitlementLabel* entitlementLabel); +int APS5_VABI sceAppContentCheckBundleLicenseOnDisc(uint32_t serviceLabel, const NpUnifiedEntitlementLabel* entitlementLabel); int APS5_VABI sceAppContentAppParamGetString(void); int APS5_VABI sceAppContentDownload0Expand(void); int APS5_VABI sceAppContentDownload0Shrink(void); @@ -41,7 +42,9 @@ int APS5_VABI sceAppContentGetAddcontInfoByEntitlementId(const char* entitlement int APS5_VABI sceAppContentGetAddcontInfoListByIroTag(uint32_t iroTag, AppContentAddcontInfo* list, uint32_t listNum, uint32_t* hitNum); int APS5_VABI sceAppContentGetDownloadedStoreCountry(void); int APS5_VABI sceAppContentGetEntitlementKey(uint32_t serviceLabel, const NpUnifiedEntitlementLabel* entitlementLabel, AppContentEntitlementKey* key); +int APS5_VABI sceAppContentGetGameTrialsFlag(uint32_t* gameTrialsFlag); int APS5_VABI sceAppContentGetPftFlag(uint32_t* pftFlag); +int APS5_VABI sceAppContentGetPlayableStatus(uint32_t serviceLabel, const NpUnifiedEntitlementLabel* entitlementLabel, uint32_t* playableStatus); int APS5_VABI sceAppContentGetRegion(void); int APS5_VABI sceAppContentRequestPatchInstall(void); int APS5_VABI sceAppContentTemporaryDataMount(AppContentMountPoint* mountPoint); diff --git a/core/libs/prx/libSceAppContent/include/InventoryExports.hpp b/core/libs/prx/libSceAppContent/include/InventoryExports.hpp index 2c7f64dfb8..fba072b0cb 100644 --- a/core/libs/prx/libSceAppContent/include/InventoryExports.hpp +++ b/core/libs/prx/libSceAppContent/include/InventoryExports.hpp @@ -4,9 +4,6 @@ extern "C" { -int APS5_VABI sceAppContentCheckBundleLicenseOnDisc(); int APS5_VABI sceAppContentDownloadDataGetBlockSize(); -int APS5_VABI sceAppContentGetGameTrialsFlag(); -int APS5_VABI sceAppContentGetPlayableStatus(); } diff --git a/core/libs/prx/libSceAppDbShellCoreClient/Export.cpp b/core/libs/prx/libSceAppDbShellCoreClient/Export.cpp index d81f4a5e32..597259ef7a 100644 --- a/core/libs/prx/libSceAppDbShellCoreClient/Export.cpp +++ b/core/libs/prx/libSceAppDbShellCoreClient/Export.cpp @@ -1,3 +1,6 @@ +#include "prx/libSceAppDbShellCoreClient/include/LegacyExports.hpp" +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceAppDbShellCoreClient/include/InventoryExports.hpp" #include #include #include "SceTypes.hpp" @@ -8,3 +11,151 @@ extern "C" { APS5_DUMMY_FUN } + +extern "C" { + +int APS5_VABI libSceAppDbShellCoreClientUnknown__minus_NB6hsKeI2E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-NB6hsKeI2E", libSceAppDbShellCoreClientUnknown__minus_NB6hsKeI2E_nid_no_patch); + +int APS5_VABI libSceAppDbShellCoreClientUnknown_0PevQGrqaXQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0PevQGrqaXQ", libSceAppDbShellCoreClientUnknown_0PevQGrqaXQ_nid_no_patch); + +int APS5_VABI libSceAppDbShellCoreClientUnknown_1rdpvtPYXUg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1rdpvtPYXUg", libSceAppDbShellCoreClientUnknown_1rdpvtPYXUg_nid_no_patch); + +int APS5_VABI libSceAppDbShellCoreClientUnknown_3GBO83N9XYk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3GBO83N9XYk", libSceAppDbShellCoreClientUnknown_3GBO83N9XYk_nid_no_patch); + +int APS5_VABI libSceAppDbShellCoreClientUnknown_8ahcDF2NTFc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8ahcDF2NTFc", libSceAppDbShellCoreClientUnknown_8ahcDF2NTFc_nid_no_patch); + +int APS5_VABI libSceAppDbShellCoreClientUnknown_DdycECIaV2o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DdycECIaV2o", libSceAppDbShellCoreClientUnknown_DdycECIaV2o_nid_no_patch); + +int APS5_VABI libSceAppDbShellCoreClientUnknown_SlsrwedLC34_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SlsrwedLC34", libSceAppDbShellCoreClientUnknown_SlsrwedLC34_nid_no_patch); + +int APS5_VABI libSceAppDbShellCoreClientUnknown_aqObO3I7PVk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aqObO3I7PVk", libSceAppDbShellCoreClientUnknown_aqObO3I7PVk_nid_no_patch); + +int APS5_VABI libSceAppDbShellCoreClientUnknown_gyhDBiNNvlg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gyhDBiNNvlg", libSceAppDbShellCoreClientUnknown_gyhDBiNNvlg_nid_no_patch); + +int APS5_VABI libSceAppDbShellCoreClientUnknown_s3XFdWNwYD8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("s3XFdWNwYD8", libSceAppDbShellCoreClientUnknown_s3XFdWNwYD8_nid_no_patch); + +} + +extern "C" { + +int APS5_VABI appDbShellLegacyUnknown_2w_minus_4Qfgeulk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2w-4Qfgeulk", appDbShellLegacyUnknown_2w_minus_4Qfgeulk_nid_no_patch); + +int APS5_VABI appDbShellLegacyUnknown_4YzoKzbnqTA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4YzoKzbnqTA", appDbShellLegacyUnknown_4YzoKzbnqTA_nid_no_patch); + +int APS5_VABI appDbShellLegacyUnknown_7XU5GcYaVvo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7XU5GcYaVvo", appDbShellLegacyUnknown_7XU5GcYaVvo_nid_no_patch); + +int APS5_VABI appDbShellLegacyUnknown_8WzmR1QoGB4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8WzmR1QoGB4", appDbShellLegacyUnknown_8WzmR1QoGB4_nid_no_patch); + +int APS5_VABI appDbShellLegacyUnknown_B2Abqpi8Flw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("B2Abqpi8Flw", appDbShellLegacyUnknown_B2Abqpi8Flw_nid_no_patch); + +int APS5_VABI appDbShellLegacyUnknown_D9UmlP_minus_vhTE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("D9UmlP-vhTE", appDbShellLegacyUnknown_D9UmlP_minus_vhTE_nid_no_patch); + +int APS5_VABI appDbShellLegacyUnknown_Q1SQgkBH4t4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Q1SQgkBH4t4", appDbShellLegacyUnknown_Q1SQgkBH4t4_nid_no_patch); + +int APS5_VABI appDbShellLegacyUnknown_Q3MBiRV47c8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Q3MBiRV47c8", appDbShellLegacyUnknown_Q3MBiRV47c8_nid_no_patch); + +int APS5_VABI appDbShellLegacyUnknown_RcpGh3ephSU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RcpGh3ephSU", appDbShellLegacyUnknown_RcpGh3ephSU_nid_no_patch); + +int APS5_VABI appDbShellLegacyUnknown_TTQUEfa06v0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TTQUEfa06v0", appDbShellLegacyUnknown_TTQUEfa06v0_nid_no_patch); + +int APS5_VABI appDbShellLegacyUnknown_ho_plus_kN7UvBGE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ho+kN7UvBGE", appDbShellLegacyUnknown_ho_plus_kN7UvBGE_nid_no_patch); + +int APS5_VABI appDbShellLegacyUnknown_hoVM4_plus_KgYkw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hoVM4+KgYkw", appDbShellLegacyUnknown_hoVM4_plus_KgYkw_nid_no_patch); + +int APS5_VABI appDbShellLegacyUnknown_jfXIuAeQMvU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jfXIuAeQMvU", appDbShellLegacyUnknown_jfXIuAeQMvU_nid_no_patch); + +int APS5_VABI appDbShellLegacyUnknown_pifcv58UX_minus_E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pifcv58UX-E", appDbShellLegacyUnknown_pifcv58UX_minus_E_nid_no_patch); + +int APS5_VABI appDbShellLegacyUnknown_rPZ5T_plus_JXT3U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rPZ5T+JXT3U", appDbShellLegacyUnknown_rPZ5T_plus_JXT3U_nid_no_patch); + +int APS5_VABI appDbShellLegacyUnknown_sSK9wz4h9aQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sSK9wz4h9aQ", appDbShellLegacyUnknown_sSK9wz4h9aQ_nid_no_patch); + +int APS5_VABI appDbShellLegacyUnknown_wLp81Yv8Hi0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wLp81Yv8Hi0", appDbShellLegacyUnknown_wLp81Yv8Hi0_nid_no_patch); + +int APS5_VABI appDbShellLegacyUnknown_wPUeYDMn7_minus_A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wPUeYDMn7-A", appDbShellLegacyUnknown_wPUeYDMn7_minus_A_nid_no_patch); + +} diff --git a/core/libs/prx/libSceAppDbShellCoreClient/include/InventoryExports.hpp b/core/libs/prx/libSceAppDbShellCoreClient/include/InventoryExports.hpp new file mode 100644 index 0000000000..ff279a7015 --- /dev/null +++ b/core/libs/prx/libSceAppDbShellCoreClient/include/InventoryExports.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceAppDbShellCoreClientUnknown__minus_NB6hsKeI2E_nid_no_patch(); +int APS5_VABI libSceAppDbShellCoreClientUnknown_0PevQGrqaXQ_nid_no_patch(); +int APS5_VABI libSceAppDbShellCoreClientUnknown_1rdpvtPYXUg_nid_no_patch(); +int APS5_VABI libSceAppDbShellCoreClientUnknown_3GBO83N9XYk_nid_no_patch(); +int APS5_VABI libSceAppDbShellCoreClientUnknown_8ahcDF2NTFc_nid_no_patch(); +int APS5_VABI libSceAppDbShellCoreClientUnknown_DdycECIaV2o_nid_no_patch(); +int APS5_VABI libSceAppDbShellCoreClientUnknown_SlsrwedLC34_nid_no_patch(); +int APS5_VABI libSceAppDbShellCoreClientUnknown_aqObO3I7PVk_nid_no_patch(); +int APS5_VABI libSceAppDbShellCoreClientUnknown_gyhDBiNNvlg_nid_no_patch(); +int APS5_VABI libSceAppDbShellCoreClientUnknown_s3XFdWNwYD8_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceAppDbShellCoreClient/include/LegacyExports.hpp b/core/libs/prx/libSceAppDbShellCoreClient/include/LegacyExports.hpp new file mode 100644 index 0000000000..2dfae93564 --- /dev/null +++ b/core/libs/prx/libSceAppDbShellCoreClient/include/LegacyExports.hpp @@ -0,0 +1,26 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI appDbShellLegacyUnknown_2w_minus_4Qfgeulk_nid_no_patch(); +int APS5_VABI appDbShellLegacyUnknown_4YzoKzbnqTA_nid_no_patch(); +int APS5_VABI appDbShellLegacyUnknown_7XU5GcYaVvo_nid_no_patch(); +int APS5_VABI appDbShellLegacyUnknown_8WzmR1QoGB4_nid_no_patch(); +int APS5_VABI appDbShellLegacyUnknown_B2Abqpi8Flw_nid_no_patch(); +int APS5_VABI appDbShellLegacyUnknown_D9UmlP_minus_vhTE_nid_no_patch(); +int APS5_VABI appDbShellLegacyUnknown_Q1SQgkBH4t4_nid_no_patch(); +int APS5_VABI appDbShellLegacyUnknown_Q3MBiRV47c8_nid_no_patch(); +int APS5_VABI appDbShellLegacyUnknown_RcpGh3ephSU_nid_no_patch(); +int APS5_VABI appDbShellLegacyUnknown_TTQUEfa06v0_nid_no_patch(); +int APS5_VABI appDbShellLegacyUnknown_ho_plus_kN7UvBGE_nid_no_patch(); +int APS5_VABI appDbShellLegacyUnknown_hoVM4_plus_KgYkw_nid_no_patch(); +int APS5_VABI appDbShellLegacyUnknown_jfXIuAeQMvU_nid_no_patch(); +int APS5_VABI appDbShellLegacyUnknown_pifcv58UX_minus_E_nid_no_patch(); +int APS5_VABI appDbShellLegacyUnknown_rPZ5T_plus_JXT3U_nid_no_patch(); +int APS5_VABI appDbShellLegacyUnknown_sSK9wz4h9aQ_nid_no_patch(); +int APS5_VABI appDbShellLegacyUnknown_wLp81Yv8Hi0_nid_no_patch(); +int APS5_VABI appDbShellLegacyUnknown_wPUeYDMn7_minus_A_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceAppDbShellCoreClient/libSceAppDbShellCoreClient.hpp b/core/libs/prx/libSceAppDbShellCoreClient/libSceAppDbShellCoreClient.hpp index 6f70f09bee..b6a8c1375e 100644 --- a/core/libs/prx/libSceAppDbShellCoreClient/libSceAppDbShellCoreClient.hpp +++ b/core/libs/prx/libSceAppDbShellCoreClient/libSceAppDbShellCoreClient.hpp @@ -1 +1,3 @@ #pragma once +#include "prx/libSceAppDbShellCoreClient/include/InventoryExports.hpp" +#include "prx/libSceAppDbShellCoreClient/include/LegacyExports.hpp" diff --git a/core/libs/prx/libSceAppInstUtil/Export.cpp b/core/libs/prx/libSceAppInstUtil/Export.cpp index a029a7d7d9..e2f0a0c8b6 100644 --- a/core/libs/prx/libSceAppInstUtil/Export.cpp +++ b/core/libs/prx/libSceAppInstUtil/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceAppInstUtil/include/InventoryExports.hpp" #include "prx/libSceAppInstUtil/include/Api.hpp" #include #include @@ -641,3 +643,141 @@ int APS5_VABI sceAppInstUtilAppSetSavedataUploadStatus(void) { } } + +extern "C" { + + + + + +int APS5_VABI libSceAppInstUtilUnknown_2WQuFX8yYXg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2WQuFX8yYXg", libSceAppInstUtilUnknown_2WQuFX8yYXg_nid_no_patch); + +int APS5_VABI libSceAppInstUtilUnknown_4vqRxwpIE1M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4vqRxwpIE1M", libSceAppInstUtilUnknown_4vqRxwpIE1M_nid_no_patch); + +int APS5_VABI libSceAppInstUtilUnknown_9QIC1kZpSG4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9QIC1kZpSG4", libSceAppInstUtilUnknown_9QIC1kZpSG4_nid_no_patch); + +int APS5_VABI libSceAppInstUtilUnknown_K73u2VX0JFo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("K73u2VX0JFo", libSceAppInstUtilUnknown_K73u2VX0JFo_nid_no_patch); + +int APS5_VABI libSceAppInstUtilUnknown_LsUZe38RhCs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LsUZe38RhCs", libSceAppInstUtilUnknown_LsUZe38RhCs_nid_no_patch); + +int APS5_VABI libSceAppInstUtilUnknown_N6H7LMfZD5Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("N6H7LMfZD5Q", libSceAppInstUtilUnknown_N6H7LMfZD5Q_nid_no_patch); + +int APS5_VABI libSceAppInstUtilUnknown_NXqdUFpinmo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NXqdUFpinmo", libSceAppInstUtilUnknown_NXqdUFpinmo_nid_no_patch); + +int APS5_VABI libSceAppInstUtilUnknown_QMjuGVPtjUY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QMjuGVPtjUY", libSceAppInstUtilUnknown_QMjuGVPtjUY_nid_no_patch); + +int APS5_VABI libSceAppInstUtilUnknown_R_minus_OUApMZ1d8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("R-OUApMZ1d8", libSceAppInstUtilUnknown_R_minus_OUApMZ1d8_nid_no_patch); + +int APS5_VABI libSceAppInstUtilUnknown_T9h6l8bFKGE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("T9h6l8bFKGE", libSceAppInstUtilUnknown_T9h6l8bFKGE_nid_no_patch); + +int APS5_VABI libSceAppInstUtilUnknown_X5Q7QxodFcg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("X5Q7QxodFcg", libSceAppInstUtilUnknown_X5Q7QxodFcg_nid_no_patch); + +int APS5_VABI libSceAppInstUtilUnknown_XWjOLtdgxa4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XWjOLtdgxa4", libSceAppInstUtilUnknown_XWjOLtdgxa4_nid_no_patch); + +int APS5_VABI libSceAppInstUtilUnknown_Y_plus_ln_minus_TkY_plus_hA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Y+ln-TkY+hA", libSceAppInstUtilUnknown_Y_plus_ln_minus_TkY_plus_hA_nid_no_patch); + +int APS5_VABI libSceAppInstUtilUnknown_Zv_plus_26GDSKcQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Zv+26GDSKcQ", libSceAppInstUtilUnknown_Zv_plus_26GDSKcQ_nid_no_patch); + +int APS5_VABI libSceAppInstUtilUnknown_ecad2GAw55Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ecad2GAw55Y", libSceAppInstUtilUnknown_ecad2GAw55Y_nid_no_patch); + +int APS5_VABI libSceAppInstUtilUnknown_gFlBHjtrMDI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gFlBHjtrMDI", libSceAppInstUtilUnknown_gFlBHjtrMDI_nid_no_patch); + +int APS5_VABI libSceAppInstUtilUnknown_gP27iU_plus_aZFw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gP27iU+aZFw", libSceAppInstUtilUnknown_gP27iU_plus_aZFw_nid_no_patch); + +int APS5_VABI libSceAppInstUtilUnknown_grC16befiso_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("grC16befiso", libSceAppInstUtilUnknown_grC16befiso_nid_no_patch); + +int APS5_VABI libSceAppInstUtilUnknown_j80u95nZ_plus_3A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("j80u95nZ+3A", libSceAppInstUtilUnknown_j80u95nZ_plus_3A_nid_no_patch); + +int APS5_VABI libSceAppInstUtilUnknown_j9qjbjMifhQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("j9qjbjMifhQ", libSceAppInstUtilUnknown_j9qjbjMifhQ_nid_no_patch); + +int APS5_VABI libSceAppInstUtilUnknown_pbYNtR2enrY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pbYNtR2enrY", libSceAppInstUtilUnknown_pbYNtR2enrY_nid_no_patch); + +int APS5_VABI libSceAppInstUtilUnknown_qn0aziKw_minus_kE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qn0aziKw-kE", libSceAppInstUtilUnknown_qn0aziKw_minus_kE_nid_no_patch); + +int APS5_VABI libSceAppInstUtilUnknown_qxjCWxg8ki4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qxjCWxg8ki4", libSceAppInstUtilUnknown_qxjCWxg8ki4_nid_no_patch); + +int APS5_VABI libSceAppInstUtilUnknown_vZ1SWJ0y4mo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vZ1SWJ0y4mo", libSceAppInstUtilUnknown_vZ1SWJ0y4mo_nid_no_patch); + +int APS5_VABI libSceAppInstUtilUnknown_xV7MhF_plus_9AQk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xV7MhF+9AQk", libSceAppInstUtilUnknown_xV7MhF_plus_9AQk_nid_no_patch); + +int APS5_VABI libSceAppInstUtilUnknown_yYVV_minus_f0zoWY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yYVV-f0zoWY", libSceAppInstUtilUnknown_yYVV_minus_f0zoWY_nid_no_patch); + +} diff --git a/core/libs/prx/libSceAppInstUtil/include/InventoryExports.hpp b/core/libs/prx/libSceAppInstUtil/include/InventoryExports.hpp new file mode 100644 index 0000000000..d2614897da --- /dev/null +++ b/core/libs/prx/libSceAppInstUtil/include/InventoryExports.hpp @@ -0,0 +1,34 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceAppInstUtilUnknown_2WQuFX8yYXg_nid_no_patch(); +int APS5_VABI libSceAppInstUtilUnknown_4vqRxwpIE1M_nid_no_patch(); +int APS5_VABI libSceAppInstUtilUnknown_9QIC1kZpSG4_nid_no_patch(); +int APS5_VABI libSceAppInstUtilUnknown_K73u2VX0JFo_nid_no_patch(); +int APS5_VABI libSceAppInstUtilUnknown_LsUZe38RhCs_nid_no_patch(); +int APS5_VABI libSceAppInstUtilUnknown_N6H7LMfZD5Q_nid_no_patch(); +int APS5_VABI libSceAppInstUtilUnknown_NXqdUFpinmo_nid_no_patch(); +int APS5_VABI libSceAppInstUtilUnknown_QMjuGVPtjUY_nid_no_patch(); +int APS5_VABI libSceAppInstUtilUnknown_R_minus_OUApMZ1d8_nid_no_patch(); +int APS5_VABI libSceAppInstUtilUnknown_T9h6l8bFKGE_nid_no_patch(); +int APS5_VABI libSceAppInstUtilUnknown_X5Q7QxodFcg_nid_no_patch(); +int APS5_VABI libSceAppInstUtilUnknown_XWjOLtdgxa4_nid_no_patch(); +int APS5_VABI libSceAppInstUtilUnknown_Y_plus_ln_minus_TkY_plus_hA_nid_no_patch(); +int APS5_VABI libSceAppInstUtilUnknown_Zv_plus_26GDSKcQ_nid_no_patch(); +int APS5_VABI libSceAppInstUtilUnknown_ecad2GAw55Y_nid_no_patch(); +int APS5_VABI libSceAppInstUtilUnknown_gFlBHjtrMDI_nid_no_patch(); +int APS5_VABI libSceAppInstUtilUnknown_gP27iU_plus_aZFw_nid_no_patch(); +int APS5_VABI libSceAppInstUtilUnknown_grC16befiso_nid_no_patch(); +int APS5_VABI libSceAppInstUtilUnknown_j80u95nZ_plus_3A_nid_no_patch(); +int APS5_VABI libSceAppInstUtilUnknown_j9qjbjMifhQ_nid_no_patch(); +int APS5_VABI libSceAppInstUtilUnknown_pbYNtR2enrY_nid_no_patch(); +int APS5_VABI libSceAppInstUtilUnknown_qn0aziKw_minus_kE_nid_no_patch(); +int APS5_VABI libSceAppInstUtilUnknown_qxjCWxg8ki4_nid_no_patch(); +int APS5_VABI libSceAppInstUtilUnknown_vZ1SWJ0y4mo_nid_no_patch(); +int APS5_VABI libSceAppInstUtilUnknown_xV7MhF_plus_9AQk_nid_no_patch(); +int APS5_VABI libSceAppInstUtilUnknown_yYVV_minus_f0zoWY_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceAppInstUtil/libSceAppInstUtil.hpp b/core/libs/prx/libSceAppInstUtil/libSceAppInstUtil.hpp index 8d20c5a6f2..dd626ff2a6 100644 --- a/core/libs/prx/libSceAppInstUtil/libSceAppInstUtil.hpp +++ b/core/libs/prx/libSceAppInstUtil/libSceAppInstUtil.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceAppInstUtil/include/Api.hpp" +#include "prx/libSceAppInstUtil/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceAsyncStorageInternal/Export.cpp b/core/libs/prx/libSceAsyncStorageInternal/Export.cpp index d81f4a5e32..8d7902c401 100644 --- a/core/libs/prx/libSceAsyncStorageInternal/Export.cpp +++ b/core/libs/prx/libSceAsyncStorageInternal/Export.cpp @@ -1,3 +1,6 @@ +#include "prx/libSceAsyncStorageInternal/include/LegacyExports.hpp" +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceAsyncStorageInternal/include/InventoryExports.hpp" #include #include #include "SceTypes.hpp" @@ -8,3 +11,121 @@ extern "C" { APS5_DUMMY_FUN } + +extern "C" { + +int APS5_VABI libSceAsyncStorageInternalUnknown__plus_YiZLBbdEy8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+YiZLBbdEy8", libSceAsyncStorageInternalUnknown__plus_YiZLBbdEy8_nid_no_patch); + +int APS5_VABI libSceAsyncStorageInternalUnknown_65H7_minus_ohmD9c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("65H7-ohmD9c", libSceAsyncStorageInternalUnknown_65H7_minus_ohmD9c_nid_no_patch); + +int APS5_VABI libSceAsyncStorageInternalUnknown_93CwGWrhf_plus_w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("93CwGWrhf+w", libSceAsyncStorageInternalUnknown_93CwGWrhf_plus_w_nid_no_patch); + +int APS5_VABI libSceAsyncStorageInternalUnknown_9zqbh2tZtZg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9zqbh2tZtZg", libSceAsyncStorageInternalUnknown_9zqbh2tZtZg_nid_no_patch); + +int APS5_VABI libSceAsyncStorageInternalUnknown_EKjWxMVMPzY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EKjWxMVMPzY", libSceAsyncStorageInternalUnknown_EKjWxMVMPzY_nid_no_patch); + +int APS5_VABI libSceAsyncStorageInternalUnknown_Knldkc0w9lI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Knldkc0w9lI", libSceAsyncStorageInternalUnknown_Knldkc0w9lI_nid_no_patch); + +int APS5_VABI libSceAsyncStorageInternalUnknown_TN9xRCVggRw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TN9xRCVggRw", libSceAsyncStorageInternalUnknown_TN9xRCVggRw_nid_no_patch); + +int APS5_VABI libSceAsyncStorageInternalUnknown_hP_plus_HenjaOi8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hP+HenjaOi8", libSceAsyncStorageInternalUnknown_hP_plus_HenjaOi8_nid_no_patch); + +int APS5_VABI libSceAsyncStorageInternalUnknown_iYDbqYNVajM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iYDbqYNVajM", libSceAsyncStorageInternalUnknown_iYDbqYNVajM_nid_no_patch); + +int APS5_VABI libSceAsyncStorageInternalUnknown_jR1uFCw8qwc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jR1uFCw8qwc", libSceAsyncStorageInternalUnknown_jR1uFCw8qwc_nid_no_patch); + +int APS5_VABI libSceAsyncStorageInternalUnknown_mvZ_minus_UdW_plus_Z_minus_Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mvZ-UdW+Z-Q", libSceAsyncStorageInternalUnknown_mvZ_minus_UdW_plus_Z_minus_Q_nid_no_patch); + +int APS5_VABI libSceAsyncStorageInternalUnknown_q4KNqhT5ibk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("q4KNqhT5ibk", libSceAsyncStorageInternalUnknown_q4KNqhT5ibk_nid_no_patch); + +int APS5_VABI libSceAsyncStorageInternalUnknown_r299OxwCYsY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("r299OxwCYsY", libSceAsyncStorageInternalUnknown_r299OxwCYsY_nid_no_patch); + +} + +extern "C" { + +int APS5_VABI asyncStorageLegacyUnknown_AdTjrblPbkA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AdTjrblPbkA", asyncStorageLegacyUnknown_AdTjrblPbkA_nid_no_patch); + +int APS5_VABI asyncStorageLegacyUnknown_AtEWh5hZJAI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AtEWh5hZJAI", asyncStorageLegacyUnknown_AtEWh5hZJAI_nid_no_patch); + +int APS5_VABI asyncStorageLegacyUnknown_FlnrIbnUvyI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FlnrIbnUvyI", asyncStorageLegacyUnknown_FlnrIbnUvyI_nid_no_patch); + +int APS5_VABI asyncStorageLegacyUnknown_GETCq_plus_kyXcA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GETCq+kyXcA", asyncStorageLegacyUnknown_GETCq_plus_kyXcA_nid_no_patch); + +int APS5_VABI asyncStorageLegacyUnknown_J_minus_cJO5MPuwo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("J-cJO5MPuwo", asyncStorageLegacyUnknown_J_minus_cJO5MPuwo_nid_no_patch); + +int APS5_VABI asyncStorageLegacyUnknown_QM3_minus_5jVrNHg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QM3-5jVrNHg", asyncStorageLegacyUnknown_QM3_minus_5jVrNHg_nid_no_patch); + +int APS5_VABI asyncStorageLegacyUnknown_qenXW57P9rU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qenXW57P9rU", asyncStorageLegacyUnknown_qenXW57P9rU_nid_no_patch); + +int APS5_VABI asyncStorageLegacyUnknown_smItNfY3yHA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("smItNfY3yHA", asyncStorageLegacyUnknown_smItNfY3yHA_nid_no_patch); + +int APS5_VABI asyncStorageLegacyUnknown_yLYSOLZmYso_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yLYSOLZmYso", asyncStorageLegacyUnknown_yLYSOLZmYso_nid_no_patch); + +} diff --git a/core/libs/prx/libSceAsyncStorageInternal/include/InventoryExports.hpp b/core/libs/prx/libSceAsyncStorageInternal/include/InventoryExports.hpp new file mode 100644 index 0000000000..1e92e11239 --- /dev/null +++ b/core/libs/prx/libSceAsyncStorageInternal/include/InventoryExports.hpp @@ -0,0 +1,21 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceAsyncStorageInternalUnknown__plus_YiZLBbdEy8_nid_no_patch(); +int APS5_VABI libSceAsyncStorageInternalUnknown_65H7_minus_ohmD9c_nid_no_patch(); +int APS5_VABI libSceAsyncStorageInternalUnknown_93CwGWrhf_plus_w_nid_no_patch(); +int APS5_VABI libSceAsyncStorageInternalUnknown_9zqbh2tZtZg_nid_no_patch(); +int APS5_VABI libSceAsyncStorageInternalUnknown_EKjWxMVMPzY_nid_no_patch(); +int APS5_VABI libSceAsyncStorageInternalUnknown_Knldkc0w9lI_nid_no_patch(); +int APS5_VABI libSceAsyncStorageInternalUnknown_TN9xRCVggRw_nid_no_patch(); +int APS5_VABI libSceAsyncStorageInternalUnknown_hP_plus_HenjaOi8_nid_no_patch(); +int APS5_VABI libSceAsyncStorageInternalUnknown_iYDbqYNVajM_nid_no_patch(); +int APS5_VABI libSceAsyncStorageInternalUnknown_jR1uFCw8qwc_nid_no_patch(); +int APS5_VABI libSceAsyncStorageInternalUnknown_mvZ_minus_UdW_plus_Z_minus_Q_nid_no_patch(); +int APS5_VABI libSceAsyncStorageInternalUnknown_q4KNqhT5ibk_nid_no_patch(); +int APS5_VABI libSceAsyncStorageInternalUnknown_r299OxwCYsY_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceAsyncStorageInternal/include/LegacyExports.hpp b/core/libs/prx/libSceAsyncStorageInternal/include/LegacyExports.hpp new file mode 100644 index 0000000000..56e3b682e8 --- /dev/null +++ b/core/libs/prx/libSceAsyncStorageInternal/include/LegacyExports.hpp @@ -0,0 +1,17 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI asyncStorageLegacyUnknown_AdTjrblPbkA_nid_no_patch(); +int APS5_VABI asyncStorageLegacyUnknown_AtEWh5hZJAI_nid_no_patch(); +int APS5_VABI asyncStorageLegacyUnknown_FlnrIbnUvyI_nid_no_patch(); +int APS5_VABI asyncStorageLegacyUnknown_GETCq_plus_kyXcA_nid_no_patch(); +int APS5_VABI asyncStorageLegacyUnknown_J_minus_cJO5MPuwo_nid_no_patch(); +int APS5_VABI asyncStorageLegacyUnknown_QM3_minus_5jVrNHg_nid_no_patch(); +int APS5_VABI asyncStorageLegacyUnknown_qenXW57P9rU_nid_no_patch(); +int APS5_VABI asyncStorageLegacyUnknown_smItNfY3yHA_nid_no_patch(); +int APS5_VABI asyncStorageLegacyUnknown_yLYSOLZmYso_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceAsyncStorageInternal/libSceAsyncStorageInternal.hpp b/core/libs/prx/libSceAsyncStorageInternal/libSceAsyncStorageInternal.hpp index 6f70f09bee..66a5a89a06 100644 --- a/core/libs/prx/libSceAsyncStorageInternal/libSceAsyncStorageInternal.hpp +++ b/core/libs/prx/libSceAsyncStorageInternal/libSceAsyncStorageInternal.hpp @@ -1 +1,3 @@ #pragma once +#include "prx/libSceAsyncStorageInternal/include/InventoryExports.hpp" +#include "prx/libSceAsyncStorageInternal/include/LegacyExports.hpp" diff --git a/core/libs/prx/libSceAudio3d/CMakeLists.txt b/core/libs/prx/libSceAudio3d/CMakeLists.txt index 2d4e024734..04e1fe1c6d 100644 --- a/core/libs/prx/libSceAudio3d/CMakeLists.txt +++ b/core/libs/prx/libSceAudio3d/CMakeLists.txt @@ -1,6 +1,6 @@ add_library(libSceAudio3d SHARED EXCLUDE_FROM_ALL Export.cpp) target_include_directories(libSceAudio3d PRIVATE ${LIBS_INCLUDE_DIR}) -target_link_libraries(libSceAudio3d PRIVATE libSceAudioOut) +target_link_libraries(libSceAudio3d PRIVATE libSceAudioOut libkernel_sys) configure_windows_unwind(libSceAudio3d) if(BUILD_TESTING) diff --git a/core/libs/prx/libSceAudio3d/Export.cpp b/core/libs/prx/libSceAudio3d/Export.cpp index e07e56b57a..37d36a98b5 100644 --- a/core/libs/prx/libSceAudio3d/Export.cpp +++ b/core/libs/prx/libSceAudio3d/Export.cpp @@ -2,6 +2,9 @@ #include "prx/libSceAudioOut/include/AudioOut.hpp" #include "prx/libSceAudio3d/include/Audio3d.hpp" #include +#include +#include +#include #include #include #include @@ -12,10 +15,12 @@ #include #include #include +#include #include #include "Mixer.hpp" #include "SceTypes.hpp" #include "prx/libc/include/General.hpp" +#include "prx/libkernel_sys/include/Api.hpp" namespace { @@ -25,6 +30,9 @@ constexpr int AUDIO3D_ERROR_INVALID_PARAMETER = static_cast(0x80EA0004); constexpr int AUDIO3D_ERROR_NOT_SUPPORTED = static_cast(0x80EA0008); constexpr int AUDIO3D_ERROR_OUT_OF_RESOURCES = static_cast(0x80EA0006); constexpr int AUDIO3D_ERROR_NOT_READY = static_cast(0x80EA0007); +constexpr int AUDIO_OUT_ERROR_INVALID_FORMAT = static_cast(0x80260007); +constexpr int AUDIO_OUT_ERROR_INVALID_PORT_TYPE = static_cast(0x8026000A); +constexpr int AUDIO_OUT_ERROR_ALREADY_INIT = static_cast(0x8026000E); constexpr int AUDIO3D_USER_ID_SYSTEM = 0xFF; constexpr std::uint32_t AUDIO3D_PORT_ID = 0; @@ -37,10 +45,20 @@ constexpr std::uint32_t AUDIO3D_BUFFER_NO_ADVANCE = 0; constexpr std::uint32_t AUDIO3D_BUFFER_ADVANCE_NO_PUSH = 1; constexpr std::uint32_t AUDIO3D_BUFFER_ADVANCE_AND_PUSH = 2; constexpr int AUDIO3D_AUDIO_OUT_PORT_TYPE = 126; +constexpr int AUDIO_OUT_PORT_TYPE_COUNT = 5; +constexpr int AUDIO_OUT_PORT_TYPE_PERSONAL = 3; +constexpr std::uint32_t AUDIO_OUT_PARAM_BIT_17 = 1u << 17; +constexpr std::uint32_t AUDIO_OUT_FORMAT_S16_8CH_STD = 6; +constexpr std::uint32_t AUDIO_OUT_FORMAT_FLOAT_8CH_STD = 7; +constexpr int AUDIO_OUT_PORT_TYPE_AUX = 127; +constexpr std::uint32_t AUDIO_OUT_FORMAT_LAST = 7; constexpr std::uint32_t AUDIO3D_AUDIO_OUT_FORMAT_STEREO = 1; constexpr std::uint32_t AUDIO3D_BLOCKING_ASYNC = 0; constexpr std::uint32_t AUDIO3D_BLOCKING_SYNC = 1; -constexpr std::uint32_t AUDIO3D_ATTRIBUTE_RESET_STATE = 0x20000; +constexpr std::uint32_t AUDIO3D_OBJECT_ATTRIBUTE_PCM = 1; +constexpr std::uint32_t AUDIO3D_OBJECT_ATTRIBUTE_RESET_STATE = 7; +constexpr std::uint32_t AUDIO3D_OBJECT_ATTRIBUTE_OUTPUT_ROUTE = 11; +constexpr std::uint32_t AUDIO3D_OBJECT_ID_MASK = 0x7FFFFFFF; constexpr std::uint32_t AUDIO3D_ATTRIBUTE_LATE_REVERB_LEVEL = 0x10001; constexpr std::uint32_t AUDIO3D_ATTRIBUTE_DOWNMIX_SPREAD_RADIUS = 0x10002; constexpr std::uint32_t AUDIO3D_ATTRIBUTE_DOWNMIX_SPREAD_HEIGHT_AWARE = 0x10003; @@ -49,6 +67,24 @@ constexpr std::uint32_t AUDIO3D_FORMAT_FLOAT = 1; constexpr std::uint32_t AUDIO3D_OUTPUT_ROUTE_BOTH = 0; constexpr std::uint32_t AUDIO3D_OUTPUT_ROUTE_HMU_ONLY = 1; constexpr std::uint32_t AUDIO3D_OUTPUT_ROUTE_TV_ONLY = 2; +constexpr std::uint32_t AUDIO3D_STATUS_DOWNMIX = 1; +constexpr std::uint32_t AUDIO3D_PORT_INVALID = 0xFFFFFFFF; +constexpr std::uint32_t AUDIO3D_REPORT_TYPES = 4; +constexpr std::uint32_t AUDIO3D_REPORT_SLOTS = 8; +constexpr std::uint32_t AUDIO3D_REPORT_TYPE_CALL = 0; +constexpr std::uint64_t AUDIO3D_REPORT_HANDLE_INVALID = 0xFFFFFFFF; +constexpr int AUDIO3D_REPORT_ERROR_INVALID_HANDLE = -1; +constexpr int AUDIO3D_REPORT_ERROR_INVALID_HANDLER = -2; +constexpr int AUDIO3D_REPORT_ERROR_FULL = -3; +constexpr int AUDIO3D_REPORT_ERROR_INVALID_TYPE = -4; + +static_assert(sizeof(Audio3dReport) == 0x40); + +static_assert(offsetof(Audio3dPcm, num_samples) == 0x10); +struct Audio3dReportSlot { + Audio3dReportHandler handler = nullptr; + void* user_data = nullptr; +}; struct Audio3dAudioOut { std::size_t buffer_bytes = 0; @@ -68,6 +104,7 @@ struct Audio3dPort { std::uint32_t granularity = 0; std::uint32_t buffer_mode = 0; std::uint32_t max_objects = 0; + std::uint32_t num_beds = 0; std::uint32_t next_object_id = 0; std::set objects; std::deque beds; @@ -78,7 +115,12 @@ struct Audio3dPort { std::mutex g_mutex; bool g_initialized = false; +std::atomic g_ps4_process{false}; Audio3dPort g_port; +std::set g_closed_port_audio_outs; +std::mutex g_report_mutex; +Audio3dReportSlot g_report_slots[AUDIO3D_REPORT_TYPES][AUDIO3D_REPORT_SLOTS]; +std::atomic g_call_report_handlers{0}; [[noreturn]] void Unsupported(const char* function, const std::string& what) { throw std::runtime_error(std::string(function) + ": " + what); @@ -88,19 +130,45 @@ bool PortIsOpen(std::uint32_t port_id) { return port_id == AUDIO3D_PORT_ID && g_port.open; } -std::uint32_t QueueLevel() { - return static_cast(g_port.mixed.size()); +bool Ps4Process() { + return g_ps4_process.load(); } -std::size_t AudioOutBufferBytes(std::uint32_t len, std::uint32_t param) { - static constexpr std::uint32_t channels[] = {1, 2, 8, 1, 2, 8, 8, 8}; - static constexpr std::uint32_t sample_size[] = {2, 2, 2, 4, 4, 4, 2, 4}; - const std::uint32_t format = param & 0xFF; - if (format >= std::size(channels)) return 0; - return static_cast(len) * channels[format] * sample_size[format]; +bool CallReportsRegistered() { + return g_call_report_handlers.load() != 0; } -int OpenPort(const char* function, int user_id, const Audio3dOpenParameters* parameters, std::uint32_t* id) { +std::uint32_t ReportedPortId(const std::uint32_t* id) { + return id != nullptr ? *id : AUDIO3D_PORT_INVALID; +} + +void StorePort(std::uint32_t queue_depth, std::uint32_t granularity, std::uint32_t buffer_mode, std::uint32_t max_objects, std::uint32_t num_beds, std::uint32_t* id) { + g_port = Audio3dPort{}; + g_port.open = true; + g_port.queue_depth = queue_depth; + g_port.granularity = granularity; + g_port.buffer_mode = buffer_mode; + g_port.max_objects = max_objects; + g_port.num_beds = num_beds; + *id = AUDIO3D_PORT_ID; +} + +int OpenPs5Port(int user_id, const Audio3dOpenParameters* parameters, std::uint32_t* id) { + std::lock_guard lock(g_mutex); + if (!g_initialized) return AUDIO3D_ERROR_NOT_READY; + if (user_id != AUDIO3D_USER_ID_SYSTEM || parameters == nullptr || id == nullptr) return AUDIO3D_ERROR_INVALID_PARAMETER; + if (parameters->size_this != 0x20 && parameters->size_this != 0x28) return AUDIO3D_ERROR_INVALID_PARAMETER; + if (parameters->rate != AUDIO3D_RATE_48000) return AUDIO3D_ERROR_INVALID_PARAMETER; + if (parameters->granularity < 0x100 || (parameters->granularity & 0xFF) != 0) return AUDIO3D_ERROR_INVALID_PARAMETER; + if (parameters->max_objects == 0 || parameters->queue_depth == 0) return AUDIO3D_ERROR_INVALID_PARAMETER; + if (parameters->buffer_mode != AUDIO3D_BUFFER_ADVANCE_AND_PUSH) return AUDIO3D_ERROR_INVALID_PARAMETER; + if (g_port.open) return AUDIO3D_ERROR_OUT_OF_RESOURCES; + const std::uint32_t num_beds = parameters->size_this == 0x28 ? parameters->num_beds : 2; + StorePort(parameters->queue_depth, parameters->granularity, parameters->buffer_mode, parameters->max_objects, num_beds, id); + return 0; +} + +int OpenPs4Port(const char* function, int user_id, const Audio3dOpenParameters* parameters, std::uint32_t* id) { std::lock_guard lock(g_mutex); if (!g_initialized) return AUDIO3D_ERROR_NOT_READY; if (user_id != AUDIO3D_USER_ID_SYSTEM || parameters == nullptr || id == nullptr) return AUDIO3D_ERROR_INVALID_PARAMETER; @@ -132,19 +200,33 @@ int OpenPort(const char* function, int user_id, const Audio3dOpenParameters* par if (max_objects == 0 || queue_depth == 0) return AUDIO3D_ERROR_INVALID_PARAMETER; if (buffer_mode > AUDIO3D_BUFFER_ADVANCE_AND_PUSH) return AUDIO3D_ERROR_INVALID_PARAMETER; if (num_beds != 2 && num_beds != 3) return AUDIO3D_ERROR_INVALID_PARAMETER; + if (g_port.open) return AUDIO3D_ERROR_OUT_OF_RESOURCES; if (buffer_mode != AUDIO3D_BUFFER_ADVANCE_AND_PUSH) Unsupported(function, "buffer mode " + std::to_string(buffer_mode)); if (num_beds != 2) Unsupported(function, "3 beds"); - if (g_port.open) return AUDIO3D_ERROR_OUT_OF_RESOURCES; - g_port = Audio3dPort{}; - g_port.open = true; - g_port.queue_depth = queue_depth; - g_port.granularity = parameters->granularity; - g_port.buffer_mode = buffer_mode; - g_port.max_objects = max_objects; - *id = AUDIO3D_PORT_ID; + StorePort(queue_depth, parameters->granularity, buffer_mode, max_objects, num_beds, id); return 0; } +std::uint32_t QueueLevel() { + return static_cast(g_port.mixed.size()); +} + +int CheckFloatAttribute(const void* attribute, std::size_t attribute_size, float minimum, float maximum) { + if (attribute == nullptr || attribute_size != sizeof(float)) return AUDIO3D_ERROR_INVALID_PARAMETER; + float value = 0.0f; + std::memcpy(&value, attribute, sizeof(value)); + if (!std::isfinite(value) || value < minimum || value > maximum) return AUDIO3D_ERROR_INVALID_PARAMETER; + return 0; +} + +std::size_t AudioOutBufferBytes(std::uint32_t len, std::uint32_t param) { + static constexpr std::uint32_t channels[] = {1, 2, 8, 1, 2, 8, 8, 8}; + static constexpr std::uint32_t sample_size[] = {2, 2, 2, 4, 4, 4, 2, 4}; + const std::uint32_t format = param & 0xFF; + if (format >= std::size(channels)) return 0; + return static_cast(len) * channels[format] * sample_size[format]; +} + int DrainAssociatedAudioOuts() { while (true) { int handle = 0; @@ -168,6 +250,47 @@ int DrainAssociatedAudioOuts() { } } +void APS5_VABI DispatchReport_nid_no_patch(std::uint32_t type, std::uint32_t port_id, std::uint32_t object_id, int result, const char* function, const char* argument_types, ...) { +#ifdef _WIN32 + __builtin_sysv_va_list arguments; + __builtin_sysv_va_start(arguments, argument_types); +#else + std::va_list arguments; + va_start(arguments, argument_types); +#endif + static_assert(sizeof(arguments) == sizeof(Audio3dReportArguments)); + Audio3dReport report{sizeof(Audio3dReport), port_id, object_id, type, result, function, argument_types, {}}; + std::memcpy(&report.arguments, arguments, sizeof(report.arguments)); + Audio3dReportSlot slots[AUDIO3D_REPORT_SLOTS]; + { + std::lock_guard lock(g_report_mutex); + std::copy(std::begin(g_report_slots[type]), std::end(g_report_slots[type]), slots); + } + for (const Audio3dReportSlot& slot : slots) { + if (slot.handler != nullptr) slot.handler(&report, slot.user_data); + } +#ifdef _WIN32 + __builtin_sysv_va_end(arguments); +#else + va_end(arguments); +#endif +} + +template +std::uint64_t ReportArgument(T value) { + if constexpr (std::is_pointer_v) { + return reinterpret_cast(value); + } else { + return static_cast>(value); + } +} + +template +void Report(std::uint32_t port_id, std::uint32_t object_id, int result, const char* function, const char* argument_types, Arguments... arguments) { + if (g_call_report_handlers.load() == 0) return; + DispatchReport_nid_no_patch(AUDIO3D_REPORT_TYPE_CALL, port_id, object_id, result, function, argument_types, ReportArgument(arguments)...); +} + } extern "C" { @@ -181,58 +304,74 @@ void APS5_VABI sceAudio3dGetDefaultOpenParameters(Audio3dOpenParameters* p) { } int APS5_VABI sceAudio3dInitialize(int64_t reserved) { - if (reserved != 0) return AUDIO3D_ERROR_INVALID_PARAMETER; - std::lock_guard lock(g_mutex); - if (g_initialized) Unsupported(__func__, "repeated initialization"); - g_initialized = true; - return 0; + const int result = [&] { + g_ps4_process = sceKernelIsPs4Process() != 0; + std::lock_guard lock(g_mutex); + if (g_ps4_process && g_initialized) return AUDIO3D_ERROR_NOT_READY; + if (reserved != 0) return AUDIO3D_ERROR_INVALID_PARAMETER; + if (g_initialized) Unsupported("sceAudio3dInitialize", "repeated initialization"); + g_initialized = true; + return 0; + }(); + Report(AUDIO3D_PORT_INVALID, AUDIO3D_OBJECT_INVALID, result, __func__, ""); + return result; } int APS5_VABI sceAudio3dTerminate() { - std::lock_guard lock(g_mutex); - if (!g_initialized || g_port.open) return AUDIO3D_ERROR_NOT_READY; - g_initialized = false; - return 0; + const int result = [&] { + std::lock_guard lock(g_mutex); + if (!g_initialized || g_port.open) return AUDIO3D_ERROR_NOT_READY; + g_initialized = false; + return 0; + }(); + Report(AUDIO3D_PORT_INVALID, AUDIO3D_OBJECT_INVALID, result, __func__, ""); + return result; } int APS5_VABI sceAudio3dPortAdvance(uint32_t port_id) { - std::lock_guard lock(g_mutex); - if (!PortIsOpen(port_id)) return AUDIO3D_ERROR_INVALID_PORT; - if (g_port.buffer_mode != AUDIO3D_BUFFER_ADVANCE_AND_PUSH) return AUDIO3D_ERROR_NOT_SUPPORTED; - if (QueueLevel() >= g_port.queue_depth) return AUDIO3D_ERROR_NOT_READY; - std::vector frame; - if (g_port.beds.empty()) { - Audio3dInternal::MixFrame(nullptr, 0, g_port.granularity, frame); - } else { - const Audio3dBed& bed = g_port.beds.front(); - const Audio3dInternal::Source source{ - bed.pcm.data(), - bed.samples, - bed.channels, - bed.format == AUDIO3D_FORMAT_FLOAT, - 1.0f, - 0.0f, - }; - Audio3dInternal::MixFrame(&source, 1, g_port.granularity, frame); - g_port.beds.pop_front(); - } - g_port.mixed.push_back(std::move(frame)); - return 0; + const int result = [&] { + std::lock_guard lock(g_mutex); + if (!PortIsOpen(port_id)) return AUDIO3D_ERROR_INVALID_PORT; + if (g_port.buffer_mode != AUDIO3D_BUFFER_ADVANCE_AND_PUSH) return AUDIO3D_ERROR_NOT_SUPPORTED; + if (QueueLevel() >= g_port.queue_depth) return AUDIO3D_ERROR_NOT_READY; + std::vector frame; + if (g_port.beds.empty()) { + Audio3dInternal::MixFrame(nullptr, 0, g_port.granularity, frame); + } else { + const Audio3dBed& bed = g_port.beds.front(); + const Audio3dInternal::Source source{ + bed.pcm.data(), + bed.samples, + bed.channels, + bed.format == AUDIO3D_FORMAT_FLOAT, + 1.0f, + 0.0f, + }; + Audio3dInternal::MixFrame(&source, 1, g_port.granularity, frame); + g_port.beds.pop_front(); + } + g_port.mixed.push_back(std::move(frame)); + return 0; + }(); + Report(port_id, AUDIO3D_OBJECT_INVALID, result, __func__, "H", port_id); + return result; } int APS5_VABI sceAudio3dPortClose(uint32_t port_id) { - int handle = 0; - std::vector associated; - { - std::lock_guard lock(g_mutex); - if (!PortIsOpen(port_id)) return AUDIO3D_ERROR_INVALID_PORT; - handle = g_port.audio_out_handle; - for (const auto& entry : g_port.audio_out_ports) associated.push_back(entry.first); - g_port = Audio3dPort{}; - } - for (const int port : associated) sceAudioOutClose(port); - if (handle != 0) sceAudioOutClose(handle); - return 0; + const int result = [&] { + int handle = 0; + { + std::lock_guard lock(g_mutex); + if (!PortIsOpen(port_id)) return AUDIO3D_ERROR_INVALID_PORT; + handle = g_port.audio_out_handle; + for (const auto& entry : g_port.audio_out_ports) g_closed_port_audio_outs.insert(entry.first); + g_port = Audio3dPort{}; + } + if (handle != 0) sceAudioOutClose(handle); + return 0; + }(); + Report(port_id, AUDIO3D_OBJECT_INVALID, result, __func__, "H", port_id); + return result; } int APS5_VABI sceAudio3dPortGetQueueLevel(uint32_t port_id, uint32_t* queue_level, uint32_t* queue_available) { @@ -260,194 +399,262 @@ int APS5_VABI sceAudio3dPortGetAttributesSupported(uint32_t portId, uint32_t* at } int APS5_VABI sceAudio3dPortOpen(int user_id, const Audio3dOpenParameters* parameters, uint32_t* id) { - return OpenPort(__func__, user_id, parameters, id); + const int result = Ps4Process() ? OpenPs4Port(__func__, user_id, parameters, id) : OpenPs5Port(user_id, parameters, id); + if (CallReportsRegistered()) Report(ReportedPortId(id), AUDIO3D_OBJECT_INVALID, result, __func__, "I&HD", user_id, id, parameters); + return result; } int APS5_VABI sceAudio3dPortPush(uint32_t port_id, uint32_t blocking) { - int handle = 0; - std::uint32_t granularity = 0; - { - std::lock_guard lock(g_mutex); - if (!PortIsOpen(port_id)) return AUDIO3D_ERROR_INVALID_PORT; - if (blocking != AUDIO3D_BLOCKING_ASYNC && blocking != AUDIO3D_BLOCKING_SYNC) { - Unsupported(__func__, "blocking mode " + std::to_string(blocking)); + const int result = [&] { + int handle = 0; + std::uint32_t granularity = 0; + { + std::lock_guard lock(g_mutex); + if (!PortIsOpen(port_id)) return AUDIO3D_ERROR_INVALID_PORT; + if (blocking != AUDIO3D_BLOCKING_ASYNC && blocking != AUDIO3D_BLOCKING_SYNC) { + Unsupported("sceAudio3dPortPush", "blocking mode " + std::to_string(blocking)); + } + handle = g_port.audio_out_handle; + granularity = g_port.granularity; } - handle = g_port.audio_out_handle; - granularity = g_port.granularity; - } - if (handle == 0) { - const int opened = sceAudioOutOpen(AUDIO3D_USER_ID_SYSTEM, AUDIO3D_AUDIO_OUT_PORT_TYPE, 0, - granularity, AUDIO3D_SAMPLE_RATE, AUDIO3D_AUDIO_OUT_FORMAT_STEREO); - if (opened < 0) return AUDIO3D_ERROR_OUT_OF_RESOURCES; - std::lock_guard lock(g_mutex); - if (!PortIsOpen(port_id)) { - sceAudioOutClose(opened); - return AUDIO3D_ERROR_INVALID_PORT; + if (handle == 0) { + const int opened = sceAudioOutOpen(AUDIO3D_USER_ID_SYSTEM, AUDIO3D_AUDIO_OUT_PORT_TYPE, 0, + granularity, AUDIO3D_SAMPLE_RATE, AUDIO3D_AUDIO_OUT_FORMAT_STEREO); + if (opened < 0) return AUDIO3D_ERROR_OUT_OF_RESOURCES; + std::lock_guard lock(g_mutex); + if (!PortIsOpen(port_id)) { + sceAudioOutClose(opened); + return AUDIO3D_ERROR_INVALID_PORT; + } + if (g_port.audio_out_handle == 0) g_port.audio_out_handle = opened; + else sceAudioOutClose(opened); } - if (g_port.audio_out_handle == 0) g_port.audio_out_handle = opened; - else sceAudioOutClose(opened); - } - std::deque> frames; - { - std::lock_guard lock(g_mutex); - if (!PortIsOpen(port_id)) return AUDIO3D_ERROR_INVALID_PORT; - handle = g_port.audio_out_handle; - const std::size_t target = blocking == AUDIO3D_BLOCKING_SYNC ? 0 : g_port.queue_depth - 1; - while (g_port.mixed.size() > target) { - frames.push_back(std::move(g_port.mixed.front())); - g_port.mixed.pop_front(); + std::deque> frames; + { + std::lock_guard lock(g_mutex); + if (!PortIsOpen(port_id)) return AUDIO3D_ERROR_INVALID_PORT; + handle = g_port.audio_out_handle; + const std::size_t target = blocking == AUDIO3D_BLOCKING_SYNC ? 0 : g_port.queue_depth - 1; + while (g_port.mixed.size() > target) { + frames.push_back(std::move(g_port.mixed.front())); + g_port.mixed.pop_front(); + } } - } - for (const std::vector& frame : frames) { - const int result = sceAudioOutOutput(handle, frame.data()); - if (result < 0) return result; - } - return DrainAssociatedAudioOuts(); + for (const std::vector& frame : frames) { + const int result = sceAudioOutOutput(handle, frame.data()); + if (result < 0) return result; + } + return DrainAssociatedAudioOuts(); + }(); + Report(port_id, AUDIO3D_OBJECT_INVALID, result, __func__, "HI", port_id, blocking); + return result; } int APS5_VABI sceAudio3dPortSetAttribute(uint32_t port_id, uint32_t attribute_id, const void* attribute, size_t attribute_size) { - std::lock_guard lock(g_mutex); - if (!PortIsOpen(port_id)) return AUDIO3D_ERROR_INVALID_PORT; - if (attribute == nullptr) return AUDIO3D_ERROR_INVALID_PARAMETER; - if (attribute_size != 4) Unsupported(__func__, "attribute size " + std::to_string(attribute_size)); - switch (attribute_id) { - case AUDIO3D_ATTRIBUTE_LATE_REVERB_LEVEL: - case AUDIO3D_ATTRIBUTE_DOWNMIX_SPREAD_RADIUS: - case AUDIO3D_ATTRIBUTE_DOWNMIX_SPREAD_HEIGHT_AWARE: - return 0; - default: - Unsupported(__func__, "attribute " + std::to_string(attribute_id)); - } + const int result = [&] { + std::lock_guard lock(g_mutex); + if (!PortIsOpen(port_id)) return AUDIO3D_ERROR_INVALID_PORT; + switch (attribute_id) { + case AUDIO3D_ATTRIBUTE_LATE_REVERB_LEVEL: + return CheckFloatAttribute(attribute, attribute_size, 0.0f, 1.0f); + case AUDIO3D_ATTRIBUTE_DOWNMIX_SPREAD_RADIUS: + return CheckFloatAttribute(attribute, attribute_size, 0.1f, 2.0f); + case AUDIO3D_ATTRIBUTE_DOWNMIX_SPREAD_HEIGHT_AWARE: + return attribute == nullptr ? AUDIO3D_ERROR_INVALID_PARAMETER : 0; + default: + return AUDIO3D_ERROR_INVALID_PARAMETER; + } + }(); + Report(port_id, AUDIO3D_OBJECT_INVALID, result, __func__, "HUM", port_id, attribute_id, attribute, attribute_size); + return result; } int APS5_VABI sceAudio3dObjectReserve(uint32_t port_id, uint32_t* object_id) { - if (object_id == nullptr) return AUDIO3D_ERROR_INVALID_PARAMETER; - *object_id = AUDIO3D_OBJECT_INVALID; - std::lock_guard lock(g_mutex); - if (!PortIsOpen(port_id)) return AUDIO3D_ERROR_INVALID_PORT; - if (g_port.objects.size() >= g_port.max_objects) return AUDIO3D_ERROR_OUT_OF_RESOURCES; - do { - ++g_port.next_object_id; - } while (g_port.next_object_id == 0 || g_port.next_object_id == AUDIO3D_OBJECT_INVALID || g_port.objects.contains(g_port.next_object_id)); - g_port.objects.insert(g_port.next_object_id); - *object_id = g_port.next_object_id; - return 0; + const int result = [&] { + std::lock_guard lock(g_mutex); + if (!PortIsOpen(port_id)) return AUDIO3D_ERROR_INVALID_PORT; + if (object_id == nullptr) return AUDIO3D_ERROR_INVALID_PARAMETER; + *object_id = AUDIO3D_OBJECT_INVALID; + if (g_port.objects.size() >= g_port.max_objects) return AUDIO3D_ERROR_OUT_OF_RESOURCES; + do { + ++g_port.next_object_id; + } while (g_port.next_object_id == 0 || g_port.next_object_id == AUDIO3D_OBJECT_INVALID || g_port.objects.contains(g_port.next_object_id)); + g_port.objects.insert(g_port.next_object_id); + *object_id = g_port.next_object_id; + return 0; + }(); + Report(port_id, result == 0 ? *object_id : AUDIO3D_OBJECT_INVALID, result, __func__, "H&O", port_id, object_id); + return result; } int APS5_VABI sceAudio3dObjectUnreserve(uint32_t port_id, uint32_t object_id) { - std::lock_guard lock(g_mutex); - if (!PortIsOpen(port_id)) return AUDIO3D_ERROR_INVALID_PORT; - if (g_port.objects.erase(object_id) == 0) return AUDIO3D_ERROR_INVALID_OBJECT; - return 0; + const int result = [&] { + std::lock_guard lock(g_mutex); + if (!PortIsOpen(port_id)) return AUDIO3D_ERROR_INVALID_PORT; + if (g_port.objects.erase(object_id) == 0) return AUDIO3D_ERROR_INVALID_OBJECT; + return 0; + }(); + Report(port_id, object_id, result, __func__, "HO", port_id, object_id); + return result; } int APS5_VABI sceAudio3dObjectSetAttributes(uint32_t port_id, uint32_t object_id, uint64_t num_attributes, const Audio3dAttribute* attribute_array) { - std::lock_guard lock(g_mutex); - if (!PortIsOpen(port_id)) return AUDIO3D_ERROR_INVALID_PORT; - if (num_attributes == 0 || attribute_array == nullptr) return AUDIO3D_ERROR_INVALID_PARAMETER; - if (!g_port.objects.contains(object_id)) return AUDIO3D_ERROR_INVALID_OBJECT; - for (std::uint64_t i = 0; i < num_attributes; ++i) { - if (attribute_array[i].attribute_id == AUDIO3D_ATTRIBUTE_RESET_STATE) continue; - if (attribute_array[i].value == nullptr) return AUDIO3D_ERROR_INVALID_PARAMETER; - } - return 0; + const int result = [&] { + if (num_attributes == 0 || attribute_array == nullptr) return AUDIO3D_ERROR_INVALID_PARAMETER; + std::lock_guard lock(g_mutex); + if (!PortIsOpen(port_id)) return AUDIO3D_ERROR_INVALID_PORT; + for (std::uint64_t i = 0; i < num_attributes; ++i) { + const Audio3dAttribute& attribute = attribute_array[i]; + if (attribute.attribute_id < AUDIO3D_OBJECT_ATTRIBUTE_PCM || attribute.attribute_id > AUDIO3D_OBJECT_ATTRIBUTE_OUTPUT_ROUTE) return AUDIO3D_ERROR_INVALID_PARAMETER; + if (attribute.attribute_id != AUDIO3D_OBJECT_ATTRIBUTE_PCM) continue; + const auto* pcm = static_cast(attribute.value); + if (pcm == nullptr || pcm->num_samples == 0 || pcm->format > AUDIO3D_FORMAT_FLOAT) return AUDIO3D_ERROR_INVALID_PARAMETER; + } + if (!g_port.objects.contains(object_id & AUDIO3D_OBJECT_ID_MASK)) return AUDIO3D_ERROR_INVALID_OBJECT; + for (std::uint64_t i = 0; i < num_attributes; ++i) { + if (attribute_array[i].attribute_id == AUDIO3D_OBJECT_ATTRIBUTE_RESET_STATE) continue; + if (attribute_array[i].value == nullptr) return AUDIO3D_ERROR_INVALID_PARAMETER; + } + return 0; + }(); + Report(port_id, object_id, result, __func__, "HOA", port_id, object_id, num_attributes, attribute_array); + return result; } int APS5_VABI sceAudio3dPortFlush(uint32_t port_id) { - int handle = 0; - std::vector associated; - { - std::lock_guard lock(g_mutex); - if (!PortIsOpen(port_id)) return AUDIO3D_ERROR_INVALID_PORT; - g_port.mixed.clear(); - handle = g_port.audio_out_handle; - for (auto& entry : g_port.audio_out_ports) { - entry.second.pending.clear(); - associated.push_back(entry.first); + const int result = [&] { + int handle = 0; + std::vector associated; + { + std::lock_guard lock(g_mutex); + if (!PortIsOpen(port_id)) return AUDIO3D_ERROR_INVALID_PORT; + g_port.mixed.clear(); + handle = g_port.audio_out_handle; + for (auto& entry : g_port.audio_out_ports) { + entry.second.pending.clear(); + associated.push_back(entry.first); + } } - } - for (const int port : associated) sceAudioOutOutput(port, nullptr); - if (handle != 0) sceAudioOutOutput(handle, nullptr); - return 0; + for (const int port : associated) sceAudioOutOutput(port, nullptr); + if (handle != 0) sceAudioOutOutput(handle, nullptr); + return 0; + }(); + Report(port_id, AUDIO3D_OBJECT_INVALID, result, __func__, "H", port_id); + return result; } int APS5_VABI sceAudio3dBedWrite2(uint32_t port_id, uint32_t num_channels, uint32_t format, const void* buffer, uint32_t num_samples, uint32_t output_route, bool) { - std::lock_guard lock(g_mutex); - if (!PortIsOpen(port_id)) return AUDIO3D_ERROR_INVALID_PORT; - if (num_channels != 2 && num_channels != 6 && num_channels != 8) return AUDIO3D_ERROR_INVALID_PARAMETER; - if (format > AUDIO3D_FORMAT_FLOAT) return AUDIO3D_ERROR_INVALID_PARAMETER; - if (output_route != AUDIO3D_OUTPUT_ROUTE_BOTH && output_route != AUDIO3D_OUTPUT_ROUTE_HMU_ONLY && output_route != AUDIO3D_OUTPUT_ROUTE_TV_ONLY) return AUDIO3D_ERROR_INVALID_PARAMETER; - if (buffer == nullptr || num_samples == 0) return AUDIO3D_ERROR_INVALID_PARAMETER; - const std::size_t sample_size = format == AUDIO3D_FORMAT_S16 ? 2u : 4u; - if (reinterpret_cast(buffer) % sample_size != 0) return AUDIO3D_ERROR_INVALID_PARAMETER; - const std::uint32_t samples = std::min(num_samples, g_port.granularity); - const std::size_t bytes = static_cast(samples) * num_channels * sample_size; - if (g_port.beds.size() >= g_port.queue_depth) return AUDIO3D_ERROR_NOT_READY; - const auto* first = static_cast(buffer); - Audio3dBed bed; - bed.pcm.assign(first, first + bytes); - bed.channels = num_channels; - bed.format = format; - bed.samples = samples; - g_port.beds.push_back(std::move(bed)); - return 0; + std::uint32_t reported_format = format; + const int result = [&] { + std::lock_guard lock(g_mutex); + if (!PortIsOpen(port_id)) return AUDIO3D_ERROR_INVALID_PORT; + if (num_channels != 2 && num_channels != 6 && num_channels != 8) return AUDIO3D_ERROR_INVALID_PARAMETER; + if (format > AUDIO3D_FORMAT_FLOAT) return AUDIO3D_ERROR_INVALID_PARAMETER; + const bool route_supported = Ps4Process() + ? output_route <= AUDIO3D_OUTPUT_ROUTE_TV_ONLY && !(output_route == AUDIO3D_OUTPUT_ROUTE_HMU_ONLY && g_port.num_beds == 2) + : output_route == AUDIO3D_OUTPUT_ROUTE_BOTH; + if (!route_supported) return AUDIO3D_ERROR_INVALID_PARAMETER; + if (buffer == nullptr || num_samples == 0) return AUDIO3D_ERROR_INVALID_PARAMETER; + const std::size_t sample_size = format == AUDIO3D_FORMAT_S16 ? 2u : 4u; + if (reinterpret_cast(buffer) % sample_size != 0) return AUDIO3D_ERROR_INVALID_PARAMETER; + reported_format = format ^ 1; + const std::uint32_t samples = std::min(num_samples, g_port.granularity); + const std::size_t bytes = static_cast(samples) * num_channels * sample_size; + if (g_port.beds.size() >= g_port.queue_depth) return AUDIO3D_ERROR_NOT_READY; + const auto* first = static_cast(buffer); + Audio3dBed bed; + bed.pcm.assign(first, first + bytes); + bed.channels = num_channels; + bed.format = format; + bed.samples = samples; + g_port.beds.push_back(std::move(bed)); + return 0; + }(); + Report(port_id, AUDIO3D_OBJECT_INVALID, result, __func__, "HUUPU", port_id, num_channels, reported_format, buffer, num_samples); + return result; } int APS5_VABI sceAudio3dBedWrite(uint32_t port_id, uint32_t num_channels, uint32_t format, const void* buffer, uint32_t num_samples) { - return sceAudio3dBedWrite2(port_id, num_channels, format, buffer, num_samples, AUDIO3D_OUTPUT_ROUTE_BOTH, false); + const int result = sceAudio3dBedWrite2(port_id, num_channels, format, buffer, num_samples, AUDIO3D_OUTPUT_ROUTE_BOTH, false); + Report(port_id, AUDIO3D_OBJECT_INVALID, result, __func__, "HUUPU", port_id, num_channels, format, buffer, num_samples); + return result; } int APS5_VABI sceAudio3dAudioOutOpen(uint32_t port_id, int user_id, std::int32_t type, std::int32_t index, uint32_t len, uint32_t freq, uint32_t param) { - { - std::lock_guard lock(g_mutex); - if (!PortIsOpen(port_id)) return AUDIO3D_ERROR_INVALID_PORT; - if (len != g_port.granularity) return AUDIO3D_ERROR_INVALID_PARAMETER; - if (index != 0 || (param & 0xFF) > 7) return AUDIO3D_ERROR_INVALID_PARAMETER; - } - const int handle = sceAudioOutOpen(user_id, type, index, len, freq, param); - if (handle < 0) return AUDIO3D_ERROR_OUT_OF_RESOURCES; - bool registered = false; - { - std::lock_guard lock(g_mutex); - if (PortIsOpen(port_id)) { - g_port.audio_out_ports.emplace(handle, Audio3dAudioOut{AudioOutBufferBytes(len, param)}); - registered = true; + const int result = [&] { + { + std::lock_guard lock(g_mutex); + if (!PortIsOpen(port_id)) return AUDIO3D_ERROR_INVALID_PORT; + if (type < 0 || len != g_port.granularity) return AUDIO3D_ERROR_INVALID_PARAMETER; } - } - if (!registered) { - sceAudioOutClose(handle); - return AUDIO3D_ERROR_INVALID_PORT; - } - return handle; + const int initialized = sceAudioOutInit(); + if (initialized != 0 && initialized != AUDIO_OUT_ERROR_ALREADY_INIT) return initialized; + if (type >= AUDIO_OUT_PORT_TYPE_COUNT && type != AUDIO_OUT_PORT_TYPE_AUX) return AUDIO_OUT_ERROR_INVALID_PORT_TYPE; + const bool ps4 = Ps4Process(); + if (ps4 && type == AUDIO_OUT_PORT_TYPE_PERSONAL && (param & AUDIO_OUT_PARAM_BIT_17) != 0) return AUDIO_OUT_ERROR_INVALID_FORMAT; + const std::uint32_t format = param & 0xFF; + if (format > AUDIO_OUT_FORMAT_LAST) return AUDIO_OUT_ERROR_INVALID_FORMAT; + if (ps4 && (format == AUDIO_OUT_FORMAT_S16_8CH_STD || format == AUDIO_OUT_FORMAT_FLOAT_8CH_STD)) { + Unsupported("sceAudio3dAudioOutOpen", "PS4 format " + std::to_string(format) + " depends on the PS4 SDK version"); + } + const int handle = sceAudioOutOpen(user_id, type, index, len, freq, param); + if (handle < 0) return handle; + bool registered = false; + { + std::lock_guard lock(g_mutex); + if (PortIsOpen(port_id)) { + g_port.audio_out_ports.emplace(handle, Audio3dAudioOut{AudioOutBufferBytes(len, param)}); + registered = true; + } + } + if (!registered) { + sceAudioOutClose(handle); + return AUDIO3D_ERROR_INVALID_PORT; + } + return handle; + }(); + Report(port_id, AUDIO3D_OBJECT_INVALID, result < 0 ? result : 0, __func__, "HUIIUUU", port_id, user_id, type, index, len, freq, param); + return result; } int APS5_VABI sceAudio3dAudioOutClose(std::int32_t handle) { { std::lock_guard lock(g_mutex); - if (g_port.audio_out_ports.erase(handle) == 0) return AUDIO3D_ERROR_INVALID_PORT; + const bool opened = g_port.audio_out_ports.erase(handle) != 0; + if (g_closed_port_audio_outs.erase(handle) == 0 && !opened) return AUDIO3D_ERROR_INVALID_PORT; } - sceAudioOutClose(handle); - return 0; + const int result = sceAudioOutClose(handle); + Report(AUDIO3D_PORT_INVALID, AUDIO3D_OBJECT_INVALID, result, __func__, "I", handle); + return result; } int APS5_VABI sceAudio3dAudioOutOutput(std::int32_t handle, const void* ptr) { - std::lock_guard lock(g_mutex); - const auto port = g_port.audio_out_ports.find(handle); - if (port == g_port.audio_out_ports.end()) return AUDIO3D_ERROR_INVALID_PORT; - if (ptr == nullptr) return AUDIO3D_ERROR_INVALID_PARAMETER; - if (port->second.pending.size() >= g_port.queue_depth) return AUDIO3D_ERROR_NOT_READY; - const auto* first = static_cast(ptr); - port->second.pending.emplace_back(first, first + port->second.buffer_bytes); - return static_cast(g_port.granularity); + const int result = [&] { + if (ptr == nullptr) return AUDIO3D_ERROR_INVALID_PARAMETER; + std::lock_guard lock(g_mutex); + const auto port = g_port.audio_out_ports.find(handle); + if (port == g_port.audio_out_ports.end()) return AUDIO3D_ERROR_INVALID_PORT; + if (port->second.pending.size() >= g_port.queue_depth) return AUDIO3D_ERROR_NOT_READY; + const auto* first = static_cast(ptr); + port->second.pending.emplace_back(first, first + port->second.buffer_bytes); + return 0; + }(); + Report(AUDIO3D_PORT_INVALID, AUDIO3D_OBJECT_INVALID, result, __func__, "IP", handle, ptr); + return result; } int APS5_VABI sceAudio3dAudioOutOutputs(AudioOutOutputParam* param, uint32_t num) { - if (param == nullptr || num == 0) return AUDIO3D_ERROR_INVALID_PARAMETER; - for (std::uint32_t i = 0; i < num; ++i) { - const int result = sceAudio3dAudioOutOutput(param[i].handle, param[i].ptr); - if (result < 0) return result; - } - return 0; + std::uint32_t i = 0; + const int result = [&] { + if (param == nullptr || num == 0) return AUDIO3D_ERROR_INVALID_PARAMETER; + for (; i < num; ++i) { + const int output = sceAudio3dAudioOutOutput(param[i].handle, param[i].ptr); + if (output < 0) return output; + } + return 0; + }(); + Report(AUDIO3D_PORT_INVALID, AUDIO3D_OBJECT_INVALID, result, __func__, "PU", param != nullptr ? param + i : nullptr, num); + return result; } const char* APS5_VABI sceAudio3dStrError(std::int32_t error) { @@ -459,38 +666,87 @@ const char* APS5_VABI sceAudio3dStrError(std::int32_t error) { return index < std::size(descriptions) ? descriptions[index] : "(unknown)"; } -int APS5_VABI sceAudio3dPortOpenEx(void) { - NotImplemented_nid_no_patch(__func__); - return 0; +int APS5_VABI sceAudio3dPortOpenEx(int user_id, const Audio3dOpenParameters* parameters, uint32_t* id) { + return sceAudio3dPortOpen(user_id, parameters, id); } int APS5_VABI sceAudio3dPortCreate(uint32_t granularity, uint32_t rate, int64_t reserved, uint32_t* id) { - if (id == nullptr || reserved != 0) return AUDIO3D_ERROR_INVALID_PARAMETER; - Audio3dOpenParameters parameters{}; - parameters.size_this = 0x10; - parameters.granularity = granularity; - parameters.rate = rate; - return OpenPort(__func__, AUDIO3D_USER_ID_SYSTEM, ¶meters, id); + const int result = [&] { + if (reserved != 0) return AUDIO3D_ERROR_INVALID_PARAMETER; + Audio3dOpenParameters parameters{}; + parameters.size_this = 0x10; + parameters.granularity = granularity; + parameters.rate = rate; + return sceAudio3dPortOpen(AUDIO3D_USER_ID_SYSTEM, ¶meters, id); + }(); + if (CallReportsRegistered()) { + const std::uint32_t port_id = ReportedPortId(id); + Report(port_id, AUDIO3D_OBJECT_INVALID, result, __func__, "H", port_id); + } + return result; } int APS5_VABI sceAudio3dPortDestroy(uint32_t port_id) { - NotImplemented_nid_no_patch(__func__); - return 0; + const int result = [&] { + { + std::lock_guard lock(g_mutex); + if (!PortIsOpen(port_id)) return AUDIO3D_ERROR_INVALID_PORT; + } + return sceAudio3dPortClose(port_id); + }(); + Report(port_id, AUDIO3D_OBJECT_INVALID, result, __func__, "H", port_id); + return result; } -int APS5_VABI sceAudio3dPortGetStatus(uint32_t port_id, void* status) { - NotImplemented_nid_no_patch(__func__); - return 0; +int APS5_VABI sceAudio3dPortGetStatus(uint32_t port_id, uint32_t* status, char* description, size_t description_size) { + const int result = [&] { + std::lock_guard lock(g_mutex); + if (!PortIsOpen(port_id)) return AUDIO3D_ERROR_INVALID_PORT; + if (status != nullptr) *status = AUDIO3D_STATUS_DOWNMIX; + if (description != nullptr && description_size != 0) { + constexpr char text[] = "Downmix ()"; + const std::size_t length = std::min(description_size - 1, sizeof(text) - 1); + std::memcpy(description, text, length); + description[length] = '\0'; + } + return 0; + }(); + Report(port_id, AUDIO3D_OBJECT_INVALID, result, __func__, "H", port_id); + return result; } -int APS5_VABI sceAudio3dReportRegisterHandler(void) { - NotImplemented_nid_no_patch(__func__); - return 0; +int APS5_VABI sceAudio3dReportRegisterHandler(uint32_t type, Audio3dReportHandler handler, void* user_data, uint64_t* handle) { + if (type >= AUDIO3D_REPORT_TYPES) return AUDIO3D_REPORT_ERROR_INVALID_TYPE; + if (handler == nullptr) return AUDIO3D_REPORT_ERROR_INVALID_HANDLER; + int result = AUDIO3D_REPORT_ERROR_FULL; + std::uint64_t registered = AUDIO3D_REPORT_HANDLE_INVALID; + { + std::lock_guard lock(g_report_mutex); + Audio3dReportSlot* const slot = std::find_if(std::begin(g_report_slots[type]), std::end(g_report_slots[type]), + [](const Audio3dReportSlot& candidate) { return candidate.handler == nullptr; }); + if (slot != std::end(g_report_slots[type])) { + *slot = Audio3dReportSlot{handler, user_data}; + if (type == AUDIO3D_REPORT_TYPE_CALL) ++g_call_report_handlers; + registered = reinterpret_cast(slot); + result = 0; + } + } + if (handle != nullptr) *handle = registered; + return result; } -int APS5_VABI sceAudio3dReportUnregisterHandler(void) { - NotImplemented_nid_no_patch(__func__); - return 0; +int APS5_VABI sceAudio3dReportUnregisterHandler(uint64_t handle) { + if (handle == AUDIO3D_REPORT_HANDLE_INVALID) return AUDIO3D_REPORT_ERROR_INVALID_HANDLE; + std::lock_guard lock(g_report_mutex); + for (std::uint32_t type = 0; type < AUDIO3D_REPORT_TYPES; ++type) { + for (Audio3dReportSlot& slot : g_report_slots[type]) { + if (reinterpret_cast(&slot) != handle || slot.handler == nullptr) continue; + slot = Audio3dReportSlot{}; + if (type == AUDIO3D_REPORT_TYPE_CALL) --g_call_report_handlers; + return 0; + } + } + return AUDIO3D_REPORT_ERROR_INVALID_HANDLE; } static_assert(sizeof(Audio3dSpeakerArrayParameters) == 0x20); diff --git a/core/libs/prx/libSceAudio3d/include/Audio3d.hpp b/core/libs/prx/libSceAudio3d/include/Audio3d.hpp index 5740301c7e..61b011914a 100644 --- a/core/libs/prx/libSceAudio3d/include/Audio3d.hpp +++ b/core/libs/prx/libSceAudio3d/include/Audio3d.hpp @@ -2,6 +2,32 @@ #include "SceTypes.hpp" +struct Audio3dPcm { + std::uint32_t format; + const void* sample_buffer; + std::uint32_t num_samples; +}; + +struct Audio3dReportArguments { + std::uint32_t gp_offset; + std::uint32_t fp_offset; + void* overflow_arg_area; + void* reg_save_area; +}; + +struct Audio3dReport { + std::uint64_t size; + std::uint32_t port_id; + std::uint32_t object_id; + std::uint32_t type; + std::int32_t result; + const char* function; + const char* argument_types; + Audio3dReportArguments arguments; +}; + +using Audio3dReportHandler = void (APS5_VABI*)(const Audio3dReport* report, void* user_data); + struct Audio3dSpeakerArrayParameters { const AudioOut2Position* positions; std::uint32_t numSpeakers; @@ -33,12 +59,12 @@ int APS5_VABI sceAudio3dAudioOutClose(std::int32_t handle); int APS5_VABI sceAudio3dAudioOutOutput(std::int32_t handle, const void* ptr); int APS5_VABI sceAudio3dAudioOutOutputs(AudioOutOutputParam* param, uint32_t num); const char* APS5_VABI sceAudio3dStrError(std::int32_t error); -int APS5_VABI sceAudio3dPortOpenEx(void); +int APS5_VABI sceAudio3dPortOpenEx(int user_id, const Audio3dOpenParameters* parameters, uint32_t* id); int APS5_VABI sceAudio3dPortCreate(uint32_t granularity, uint32_t rate, int64_t reserved, uint32_t* id); -int APS5_VABI sceAudio3dPortDestroy(uint32_t portId); -int APS5_VABI sceAudio3dPortGetStatus(uint32_t portId, void* status); -int APS5_VABI sceAudio3dReportRegisterHandler(void); -int APS5_VABI sceAudio3dReportUnregisterHandler(void); +int APS5_VABI sceAudio3dPortDestroy(uint32_t port_id); +int APS5_VABI sceAudio3dPortGetStatus(uint32_t port_id, uint32_t* status, char* description, size_t description_size); +int APS5_VABI sceAudio3dReportRegisterHandler(uint32_t type, Audio3dReportHandler handler, void* user_data, uint64_t* handle); +int APS5_VABI sceAudio3dReportUnregisterHandler(uint64_t handle); size_t APS5_VABI sceAudio3dGetSpeakerArrayMemorySize(uint32_t numSpeakers, uint8_t is3d); int APS5_VABI sceAudio3dCreateSpeakerArray(AudioOut2SpeakerArrayHandle* handle, const Audio3dSpeakerArrayParameters* parameters); int APS5_VABI sceAudio3dDeleteSpeakerArray(AudioOut2SpeakerArrayHandle handle); diff --git a/core/libs/prx/libSceAudioOut/CMakeLists.txt b/core/libs/prx/libSceAudioOut/CMakeLists.txt index 70979b6139..a8e939bab4 100644 --- a/core/libs/prx/libSceAudioOut/CMakeLists.txt +++ b/core/libs/prx/libSceAudioOut/CMakeLists.txt @@ -33,12 +33,45 @@ if(BUILD_TESTING) "PATH=path_list_prepend:$") endif() - add_test_executable(audio_out_vibration_device_tests tests/AudioOutVibrationDevice.cpp src/AudioOut.cpp src/AudioOut2PadMix.cpp src/AudioOutShutdown.cpp) + add_test_executable(audio_out_host_volume_tests tests/HostVolume.cpp) + target_include_directories(audio_out_host_volume_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(audio_out_host_volume_tests PRIVATE libc) + configure_windows_unwind(audio_out_host_volume_tests) + add_test(NAME audio_out_host_volume COMMAND audio_out_host_volume_tests) + set_tests_properties(audio_out_host_volume PROPERTIES TIMEOUT 5) + if(WIN32) + set_tests_properties(audio_out_host_volume PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + + add_test_executable(audio_out_host_gain_tests tests/HostGain.cpp) + target_include_directories(audio_out_host_gain_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(audio_out_host_gain_tests PRIVATE libc) + configure_windows_unwind(audio_out_host_gain_tests) + add_test(NAME audio_out_host_gain COMMAND audio_out_host_gain_tests) + set_tests_properties(audio_out_host_gain PROPERTIES TIMEOUT 5) + if(WIN32) + set_tests_properties(audio_out_host_gain PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + + add_test_executable(audio_out_host_volume_state_tests tests/HostVolumeState.cpp ../libScePad/src/HostVolumeState.cpp) + target_include_directories(audio_out_host_volume_state_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(audio_out_host_volume_state_tests PRIVATE libc) + configure_windows_unwind(audio_out_host_volume_state_tests) + add_test(NAME audio_out_host_volume_state COMMAND audio_out_host_volume_state_tests) + set_tests_properties(audio_out_host_volume_state PROPERTIES TIMEOUT 10) + if(WIN32) + set_tests_properties(audio_out_host_volume_state PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + + add_test_executable(audio_out_vibration_device_tests tests/AudioOutVibrationDevice.cpp src/AudioOut.cpp src/AudioOut2PadMix.cpp src/AudioOutShutdown.cpp ../libScePad/src/HostVolumeState.cpp) target_compile_definitions(audio_out_vibration_device_tests PRIVATE SDL_MAIN_HANDLED) target_include_directories(audio_out_vibration_device_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_SDL2_INCLUDE_DIR}) target_link_libraries(audio_out_vibration_device_tests PRIVATE libc libkernel libScePad) configure_windows_unwind(audio_out_vibration_device_tests) - foreach(vibrationDeviceMode IN ITEMS quad pulse open_failure timing cadence discovery_failure) + foreach(vibrationDeviceMode IN ITEMS quad pulse open_failure timing cadence discovery_failure disconnect) set(vibrationDeviceTest "audio_out_vibration_device_${vibrationDeviceMode}") add_test(NAME ${vibrationDeviceTest} COMMAND audio_out_vibration_device_tests ${vibrationDeviceMode}) set_tests_properties(${vibrationDeviceTest} PROPERTIES TIMEOUT 5) @@ -48,12 +81,12 @@ if(BUILD_TESTING) endif() endforeach() - add_test_executable(audio_out_default_open_tests tests/AudioOutDefaultOpen.cpp src/AudioOut.cpp src/AudioOut2PadMix.cpp src/AudioOutShutdown.cpp) + add_test_executable(audio_out_default_open_tests tests/AudioOutDefaultOpen.cpp src/AudioOut.cpp src/AudioOut2PadMix.cpp src/AudioOutShutdown.cpp ../libScePad/src/HostVolumeState.cpp) target_compile_definitions(audio_out_default_open_tests PRIVATE SDL_MAIN_HANDLED) target_include_directories(audio_out_default_open_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_SDL2_INCLUDE_DIR}) target_link_libraries(audio_out_default_open_tests PRIVATE libc libkernel libScePad) configure_windows_unwind(audio_out_default_open_tests) - foreach(defaultOpenMode IN ITEMS zero_default wasapi_zero_default no_endpoint positive unknown) + foreach(defaultOpenMode IN ITEMS zero_default wasapi_zero_default no_endpoint positive unknown disconnect) set(defaultOpenTest "audio_out_default_open_${defaultOpenMode}") add_test(NAME ${defaultOpenTest} COMMAND audio_out_default_open_tests ${defaultOpenMode}) set_tests_properties(${defaultOpenTest} PROPERTIES TIMEOUT 5) @@ -63,7 +96,7 @@ if(BUILD_TESTING) endif() endforeach() - add_test_executable(audio_out_buffer_size_tests tests/AudioOutBufferSize.cpp src/AudioOut.cpp src/AudioOut2PadMix.cpp src/AudioOutShutdown.cpp) + add_test_executable(audio_out_buffer_size_tests tests/AudioOutBufferSize.cpp src/AudioOut.cpp src/AudioOut2PadMix.cpp src/AudioOutShutdown.cpp ../libScePad/src/HostVolumeState.cpp) target_compile_definitions(audio_out_buffer_size_tests PRIVATE SDL_MAIN_HANDLED) target_include_directories(audio_out_buffer_size_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_SDL2_INCLUDE_DIR}) target_link_libraries(audio_out_buffer_size_tests PRIVATE libc libkernel libScePad) diff --git a/core/libs/prx/libSceAudioOut/include/HostGain.hpp b/core/libs/prx/libSceAudioOut/include/HostGain.hpp new file mode 100644 index 0000000000..edea7e9f9d --- /dev/null +++ b/core/libs/prx/libSceAudioOut/include/HostGain.hpp @@ -0,0 +1,76 @@ +#ifndef CORE_LIBS_PRX_LIBSCEAUDIOOUT_INCLUDE_HOSTGAIN_HPP +#define CORE_LIBS_PRX_LIBSCEAUDIOOUT_INCLUDE_HOSTGAIN_HPP + +#include +#include +#include +#include +#include +#include + +class HostGainRamp { +public: + static constexpr std::uint32_t Unity = 65536; + static constexpr std::uint32_t DefaultRampFrames = 480; + + HostGainRamp() : HostGainRamp(DefaultRampFrames) {} + + explicit HostGainRamp(std::uint32_t rampFrames) { + Configure(rampFrames); + } + + void Configure(std::uint32_t rampFrames) { + step = rampFrames == 0 ? Unity : std::max(1, Unity / rampFrames); + } + + std::uint32_t Current() const { return current; } + std::uint32_t Step() const { return step; } + + bool Bypass(std::uint32_t target) const { + return current == Unity && target == Unity; + } + + void Apply(std::int16_t* samples, std::size_t frames, unsigned channels, std::uint32_t target) { + if (Bypass(target)) return; + for (std::size_t frame = 0; frame < frames; ++frame) { + const std::int64_t gain = advance(target); + for (unsigned channel = 0; channel < channels; ++channel) { + std::int16_t& sample = samples[frame * channels + channel]; + const std::int64_t scaled = (static_cast(sample) * gain + Unity / 2) >> 16; + sample = static_cast(std::clamp(scaled, std::numeric_limits::min(), std::numeric_limits::max())); + } + } + } + + void Apply(float* samples, std::size_t frames, unsigned channels, std::uint32_t target) { + if (Bypass(target)) return; + for (std::size_t frame = 0; frame < frames; ++frame) { + const float gain = static_cast(advance(target)) / static_cast(Unity); + for (unsigned channel = 0; channel < channels; ++channel) samples[frame * channels + channel] *= gain; + } + } + +private: + std::uint32_t advance(std::uint32_t target) { + if (current < target) current = target - current <= step ? target : current + step; + else if (current > target) current = current - target <= step ? target : current - step; + return current; + } + + std::uint32_t current = Unity; + std::uint32_t step = Unity; +}; + +inline const void* HostGainFilter(HostGainRamp& ramp, std::uint32_t target, const void* data, bool isFloat, std::size_t frames, unsigned channels, std::vector& scratch) { + if (ramp.Bypass(target)) return data; + const std::size_t bytes = frames * channels * (isFloat ? sizeof(float) : sizeof(std::int16_t)); + if (data != scratch.data()) { + scratch.resize(bytes); + std::memcpy(scratch.data(), data, bytes); + } + if (isFloat) ramp.Apply(reinterpret_cast(scratch.data()), frames, channels, target); + else ramp.Apply(reinterpret_cast(scratch.data()), frames, channels, target); + return scratch.data(); +} + +#endif diff --git a/core/libs/prx/libSceAudioOut/include/InventoryExports.hpp b/core/libs/prx/libSceAudioOut/include/InventoryExports.hpp index 13bd1029e9..810fe104ec 100644 --- a/core/libs/prx/libSceAudioOut/include/InventoryExports.hpp +++ b/core/libs/prx/libSceAudioOut/include/InventoryExports.hpp @@ -17,3 +17,39 @@ int APS5_VABI sceAudioOut2SetSpeakerInfo(); int APS5_VABI sceAudioOut2SetTvCorrectionInfo(); } + +extern "C" { +int APS5_VABI libSceAudioOutUnknown__minus_3HTIXaIx7U_nid_no_patch(); +int APS5_VABI libSceAudioOutUnknown_0Oz9yG27ovw_nid_no_patch(); +int APS5_VABI libSceAudioOutUnknown_1pWftEwJg6w_nid_no_patch(); +int APS5_VABI libSceAudioOutUnknown_4Ac_plus_2ezx1lY_nid_no_patch(); +int APS5_VABI libSceAudioOutUnknown_6hw5LpQh6_minus_M_nid_no_patch(); +int APS5_VABI libSceAudioOutUnknown_87IcZgIbuxQ_nid_no_patch(); +int APS5_VABI libSceAudioOutUnknown_8qn2ceJ4HVg_nid_no_patch(); +int APS5_VABI libSceAudioOutUnknown_96EqlBA6q4I_nid_no_patch(); +int APS5_VABI libSceAudioOutUnknown_B88xqT6vI88_nid_no_patch(); +int APS5_VABI libSceAudioOutUnknown_DEpjrJh_minus_flc_nid_no_patch(); +int APS5_VABI libSceAudioOutUnknown_GIcJie_plus_rjvM_nid_no_patch(); +int APS5_VABI libSceAudioOutUnknown_KeHpCnAvtGw_nid_no_patch(); +int APS5_VABI libSceAudioOutUnknown_Oqn65W_minus_w8bo_nid_no_patch(); +int APS5_VABI libSceAudioOutUnknown_PNeVjMfwq1M_nid_no_patch(); +int APS5_VABI libSceAudioOutUnknown_PSg2qlLNCqM_nid_no_patch(); +int APS5_VABI libSceAudioOutUnknown_UAk5DtTuUMo_nid_no_patch(); +int APS5_VABI libSceAudioOutUnknown_WKpJvbBdcbU_nid_no_patch(); +int APS5_VABI libSceAudioOutUnknown_WOfIge9NmBA_nid_no_patch(); +int APS5_VABI libSceAudioOutUnknown_YSm2BXd3gfE_nid_no_patch(); +int APS5_VABI libSceAudioOutUnknown_Zk1Cn7Z2tVs_nid_no_patch(); +int APS5_VABI libSceAudioOutUnknown_bd5H255vnsk_nid_no_patch(); +int APS5_VABI libSceAudioOutUnknown_f3xQNbru2m8_nid_no_patch(); +int APS5_VABI libSceAudioOutUnknown_g33sQzMRRmQ_nid_no_patch(); +int APS5_VABI libSceAudioOutUnknown_gaUU6uC15vs_nid_no_patch(); +int APS5_VABI libSceAudioOutUnknown_jEcHKuQ4k8I_nid_no_patch(); +int APS5_VABI libSceAudioOutUnknown_lyHeaetMYXg_nid_no_patch(); +int APS5_VABI libSceAudioOutUnknown_r5LqvBxfG_plus_0_nid_no_patch(); +int APS5_VABI libSceAudioOutUnknown_rSyeebu6wWI_nid_no_patch(); +int APS5_VABI libSceAudioOutUnknown_rzjbvXzvDtE_nid_no_patch(); +int APS5_VABI libSceAudioOutUnknown_spvw78DsDzU_nid_no_patch(); +int APS5_VABI libSceAudioOutUnknown_tqTyWw6NgyU_nid_no_patch(); +int APS5_VABI libSceAudioOutUnknown_tvPlXmc4MHs_nid_no_patch(); +int APS5_VABI libSceAudioOutUnknown_yt9g5kdJy1o_nid_no_patch(); +} diff --git a/core/libs/prx/libSceAudioOut/src/AudioOut.cpp b/core/libs/prx/libSceAudioOut/src/AudioOut.cpp index c287eed7ff..9ca3e30b1a 100644 --- a/core/libs/prx/libSceAudioOut/src/AudioOut.cpp +++ b/core/libs/prx/libSceAudioOut/src/AudioOut.cpp @@ -17,6 +17,8 @@ #include "prx/libc/include/Shutdown.hpp" #include "prx/libkernel/Time/include/Time.hpp" #include "prx/libSceAudioOut/include/AudioOutSdl.hpp" +#include "prx/libSceAudioOut/include/HostGain.hpp" +#include "prx/libScePad/include/HostVolumeControl.hpp" #include "AudioOutShutdown.hpp" #include "AudioOut2PadMix.hpp" #include "prx/libScePad/include/PadState.hpp" @@ -124,6 +126,7 @@ struct Port { AudioOut2PadLayout padLayout; SDL_AudioDeviceID device = 0; SDL_AudioSpec spec = {}; + HostGainRamp hostGain; }; static std::mutex g_mutex; @@ -195,6 +198,21 @@ static void closeDevice(Port& port) { port.spec = {}; } +static void reopenStoppedDevice(Port& port) { + if (port.device == 0 || SDL_GetAudioDeviceStatus(port.device) != SDL_AUDIO_STOPPED) return; + closeDevice(port); + if (port.type == PORT_TYPE_VIBRATION) { + try { + openVibrationDevice(port); + } catch (const std::runtime_error&) { + port.device = 0; + port.spec = {}; + } + } else { + openDevice(port); + } +} + static constexpr std::uint32_t STD_8CH_MAP[8] = {0, 1, 2, 3, 6, 7, 4, 5}; static const void* prepareBuffer(const Port& port, const void* data, std::vector& buf) { @@ -296,6 +314,7 @@ static void queueAudio(Port& port, const void* data, std::unique_lock(port.channels), prepareBuf); queueSize = checkedBufferSize(port.samplesNum, static_cast(port.channels), bytesPerSample(port.format)); } @@ -383,6 +402,7 @@ static int allocatePort(int type, std::uint32_t len, std::uint32_t freq, Format port.format = format; port.channels = channelsForFormat(format); port.lastDataOutputTime = 0; + port.hostGain = HostGainRamp(freq / 100); port.virtualQueueEnd = sceKernelGetProcessTime(); port.mixLevel = type == PORT_TYPE_PADSPK ? DEFAULT_PADSPK_MIX_LEVEL : DEFAULT_VOLUME; if (type == PORT_TYPE_VIBRATION) { @@ -491,6 +511,7 @@ int APS5_VABI sceAudioOutOutput(int handle, const void* ptr) try { return -2144993277; } + reopenStoppedDevice(*port); if (port->device == 0) { outputVirtualPort(*port, ptr, lock); } else { @@ -528,6 +549,7 @@ int APS5_VABI sceAudioOutOutputs(AudioOutOutputParam* param, std::uint32_t num) Port& first = *getPort(param[0].handle); for (std::uint32_t i = 0; i < num; i++) { Port& port = *getPort(param[i].handle); + reopenStoppedDevice(port); if (port.device == 0) { outputVirtualPort(port, param[i].ptr, lock); } else { diff --git a/core/libs/prx/libSceAudioOut/src/AudioOut2Context.cpp b/core/libs/prx/libSceAudioOut/src/AudioOut2Context.cpp index 45cb44d74b..c4628c8553 100644 --- a/core/libs/prx/libSceAudioOut/src/AudioOut2Context.cpp +++ b/core/libs/prx/libSceAudioOut/src/AudioOut2Context.cpp @@ -17,6 +17,7 @@ #include "prx/libc/include/PreciseWait.hpp" #include "prx/libc/include/Shutdown.hpp" #include "AudioOut2Internal.hpp" +#include "prx/libScePad/include/HostVolumeControl.hpp" #include "AudioOutShutdown.hpp" #include "prx/libSceAudioOut/include/AudioOutSdl.hpp" #include "prx/libScePad/include/PadState.hpp" @@ -58,6 +59,10 @@ double AudioOut2TraceSeconds() { return std::chrono::duration(Clock::now() - start).count(); } +static Clock::time_point Now(const AudioOut2Context& context) { + return context.clockForTest ? *context.clockForTest : Clock::now(); +} + static std::mutex g_contextsLock; static std::unordered_set g_contexts; @@ -259,6 +264,7 @@ static void DeviceCallback(void* userdata, Uint8* stream, int length) { std::copy_n(context.output.begin(), count, out); context.output.erase(context.output.begin(), context.output.begin() + static_cast(count)); std::fill(out + count, out + samples, 0.0f); + context.hostGain.Apply(out, samples / AUDIO_OUT2_OUTPUT_CHANNELS, AUDIO_OUT2_OUTPUT_CHANNELS, HostVolumeGain_nid_no_patch()); if (count < samples && !context.priming) { context.priming = true; context.primes++; @@ -285,6 +291,18 @@ static void TraceSummary(AudioOut2Context& context, Clock::time_point now) { context.summaryPeak = 0.0f; } +static Clock::time_point WaitForRoom(AudioOut2Context& context, std::unique_lock& lock) { + auto now = Now(context); + const auto waitStart = now; + while (QueueLevel(context, now) >= context.queueDepth && now - waitStart <= FULL_WAIT_TIMEOUT) { + lock.unlock(); + PreciseSleepUs(std::chrono::microseconds(FULL_WAIT_STEP).count()); + lock.lock(); + now = Now(context); + } + return now; +} + extern "C" { int APS5_VABI sceAudioOut2ContextAdvance(AudioOut2ContextHandle ctx) try { @@ -368,7 +386,7 @@ int APS5_VABI sceAudioOut2ContextGetQueueLevel(AudioOut2ContextHandle ctx, uint3 return 0; } std::lock_guard lock(context->lock); - const auto level = std::min(context->queueDepth, QueueLevel(*context, Clock::now()) + static_cast(context->advancedGrains.size())); + const auto level = std::min(context->queueDepth, QueueLevel(*context, Now(*context)) + static_cast(context->advancedGrains.size())); if (queue_level) *queue_level = level; if (available_queue) *available_queue = context->queueDepth - level; context->queueLevelPolls++; @@ -383,24 +401,17 @@ int APS5_VABI sceAudioOut2ContextPush(AudioOut2ContextHandle ctx, uint32_t block if (!context) return SCE_AUDIO_OUT2_ERROR_INVALID_HANDLE; std::unique_lock lock(context->lock); const QueueLevelPublisher publication{*context, lock}; - auto now = Clock::now(); - const auto waitStart = now; - while (QueueLevel(*context, now) >= context->queueDepth) { - if (!blocking) { - context->fullRejects++; - if (context->fullRejects <= CALL_TRACE_FULL) AUDIOOUT2_TRACE("t=%.3f Push ctx %p non-blocking on a full queue (%u): rejected\n", AudioOut2TraceSeconds(), static_cast(context), context->queueDepth); - return SCE_AUDIO_OUT2_ERROR_QUEUE_FULL; - } - if (now - waitStart > FULL_WAIT_TIMEOUT) break; - lock.unlock(); - PreciseSleepUs(std::chrono::microseconds(FULL_WAIT_STEP).count()); - lock.lock(); - now = Clock::now(); + auto now = Now(*context); + if (!blocking && QueueLevel(*context, now) >= context->queueDepth) { + context->fullRejects++; + if (context->fullRejects <= CALL_TRACE_FULL) AUDIOOUT2_TRACE("t=%.3f Push ctx %p non-blocking on a full queue (%u): rejected\n", AudioOut2TraceSeconds(), static_cast(context), context->queueDepth); + return SCE_AUDIO_OUT2_ERROR_QUEUE_FULL; } + if (blocking) now = WaitForRoom(*context, lock); if (context->advancedMode && context->advancedGrains.empty()) { if (!blocking) throw std::runtime_error("AudioOut2: a non-blocking push without a rendered grain is not implemented"); if (!context->grainReady.wait(lock, LibcShutdownToken_nid_postfix(), [&] { return !context->advancedGrains.empty(); })) throw ProcessShutdown{}; - now = Clock::now(); + now = Now(*context); Drain(*context, now); } context->queued++; @@ -437,6 +448,7 @@ int APS5_VABI sceAudioOut2ContextPush(AudioOut2ContextHandle ctx, uint32_t block context->output.insert(context->output.end(), context->mix.begin(), context->mix.end()); } } + if (blocking) now = WaitForRoom(*context, lock); context->pushes++; context->summaryPushes++; if (blocking) context->blockingPushes++; diff --git a/core/libs/prx/libSceAudioOut/src/AudioOut2Internal.hpp b/core/libs/prx/libSceAudioOut/src/AudioOut2Internal.hpp index 2e315598b3..fa3c2de314 100644 --- a/core/libs/prx/libSceAudioOut/src/AudioOut2Internal.hpp +++ b/core/libs/prx/libSceAudioOut/src/AudioOut2Internal.hpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -17,6 +18,7 @@ #include "SDL.h" #include "SceTypes.hpp" #include "AudioOut2PadMix.hpp" +#include "prx/libSceAudioOut/include/HostGain.hpp" // Shared by the AudioOut2 context and port files. // @@ -97,6 +99,7 @@ struct AudioOut2Context { std::uint32_t queued = 0; std::chrono::steady_clock::time_point playHead; SDL_AudioDeviceID device = 0; + HostGainRamp hostGain{AUDIO_OUT2_SAMPLE_RATE / 100}; // Stereo float mix of the ports for one grain. std::vector mix; // Mixed stereo frames the device has not played yet; it plays silence until the cushion is mixed. @@ -129,6 +132,7 @@ struct AudioOut2Context { std::chrono::steady_clock::time_point summaryStart; bool deviceBacked = false; std::atomic publishedQueueLevel{0}; + std::optional clockForTest; }; AudioOut2Context* AudioOut2FindContext(AudioOut2ContextHandle ctx); diff --git a/core/libs/prx/libSceAudioOut/src/AudioOut2Port.cpp b/core/libs/prx/libSceAudioOut/src/AudioOut2Port.cpp index 99afa02fe6..607141d571 100644 --- a/core/libs/prx/libSceAudioOut/src/AudioOut2Port.cpp +++ b/core/libs/prx/libSceAudioOut/src/AudioOut2Port.cpp @@ -116,7 +116,7 @@ AudioOut2Grain AudioOut2CaptureGrain(const AudioOut2Context& context, bool snaps queued = std::move(port.queuedData.front()); port.queuedData.pop_front(); data = queued.data; - setPcm = queued.reused ? &queued.pcm : nullptr; + setPcm = queued.reused || snapshot ? &queued.pcm : nullptr; } if (data != nullptr) { AudioOut2CapturedPort captured{index, port.generation, data}; @@ -296,12 +296,12 @@ int APS5_VABI sceAudioOut2PortSetAttributes(AudioOut2PortHandle port, const Audi std::memcpy(&entry->data, attribute.value, sizeof(entry->data)); MarkBufferReused(*entry); AudioOut2QueuedData queued{entry->data, CopyGrain(*entry)}; - entry->repeatedData = entry->data != nullptr && (entry->lastBuffer == nullptr || entry->lastBuffer == entry->data) ? entry->data : nullptr; + entry->repeatedData = entry->data != nullptr && entry->lastBuffer == nullptr ? entry->data : nullptr; entry->repeatedPcm = queued.pcm; entry->repeatedReused = false; entry->queuedData.push_back(std::move(queued)); if (entry->queuedData.size() > QUEUED_DATA_MAX) entry->queuedData.pop_front(); - if (entry->data != nullptr) entry->lastBuffer = entry->data; + entry->lastBuffer = entry->data; entry->dataSets++; verdict = "pcm data pointer"; } else if (attribute.attribute_id == ATTRIBUTE_VOLUME && entry->channels != 0 && attribute.value_size == entry->channels * sizeof(float)) { diff --git a/core/libs/prx/libSceAudioOut/src/InventoryExports.cpp b/core/libs/prx/libSceAudioOut/src/InventoryExports.cpp index f6c3567919..80a45d240b 100644 --- a/core/libs/prx/libSceAudioOut/src/InventoryExports.cpp +++ b/core/libs/prx/libSceAudioOut/src/InventoryExports.cpp @@ -1,3 +1,4 @@ +#include "prx/libc/include/general/ExportMacros.hpp" #include "prx/libSceAudioOut/include/InventoryExports.hpp" #include "prx/libc/include/General.hpp" @@ -48,3 +49,172 @@ int APS5_VABI sceAudioOut2SetTvCorrectionInfo() { } } + +extern "C" { + +int APS5_VABI libSceAudioOutUnknown__minus_3HTIXaIx7U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-3HTIXaIx7U", libSceAudioOutUnknown__minus_3HTIXaIx7U_nid_no_patch); + +int APS5_VABI libSceAudioOutUnknown_0Oz9yG27ovw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0Oz9yG27ovw", libSceAudioOutUnknown_0Oz9yG27ovw_nid_no_patch); + +int APS5_VABI libSceAudioOutUnknown_1pWftEwJg6w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1pWftEwJg6w", libSceAudioOutUnknown_1pWftEwJg6w_nid_no_patch); + +int APS5_VABI libSceAudioOutUnknown_4Ac_plus_2ezx1lY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4Ac+2ezx1lY", libSceAudioOutUnknown_4Ac_plus_2ezx1lY_nid_no_patch); + +int APS5_VABI libSceAudioOutUnknown_6hw5LpQh6_minus_M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6hw5LpQh6-M", libSceAudioOutUnknown_6hw5LpQh6_minus_M_nid_no_patch); + +int APS5_VABI libSceAudioOutUnknown_87IcZgIbuxQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("87IcZgIbuxQ", libSceAudioOutUnknown_87IcZgIbuxQ_nid_no_patch); + +int APS5_VABI libSceAudioOutUnknown_8qn2ceJ4HVg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8qn2ceJ4HVg", libSceAudioOutUnknown_8qn2ceJ4HVg_nid_no_patch); + +int APS5_VABI libSceAudioOutUnknown_96EqlBA6q4I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("96EqlBA6q4I", libSceAudioOutUnknown_96EqlBA6q4I_nid_no_patch); + +int APS5_VABI libSceAudioOutUnknown_B88xqT6vI88_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("B88xqT6vI88", libSceAudioOutUnknown_B88xqT6vI88_nid_no_patch); + +int APS5_VABI libSceAudioOutUnknown_DEpjrJh_minus_flc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DEpjrJh-flc", libSceAudioOutUnknown_DEpjrJh_minus_flc_nid_no_patch); + +int APS5_VABI libSceAudioOutUnknown_GIcJie_plus_rjvM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GIcJie+rjvM", libSceAudioOutUnknown_GIcJie_plus_rjvM_nid_no_patch); + +int APS5_VABI libSceAudioOutUnknown_KeHpCnAvtGw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KeHpCnAvtGw", libSceAudioOutUnknown_KeHpCnAvtGw_nid_no_patch); + +int APS5_VABI libSceAudioOutUnknown_Oqn65W_minus_w8bo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Oqn65W-w8bo", libSceAudioOutUnknown_Oqn65W_minus_w8bo_nid_no_patch); + +int APS5_VABI libSceAudioOutUnknown_PNeVjMfwq1M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PNeVjMfwq1M", libSceAudioOutUnknown_PNeVjMfwq1M_nid_no_patch); + +int APS5_VABI libSceAudioOutUnknown_PSg2qlLNCqM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PSg2qlLNCqM", libSceAudioOutUnknown_PSg2qlLNCqM_nid_no_patch); + +int APS5_VABI libSceAudioOutUnknown_UAk5DtTuUMo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UAk5DtTuUMo", libSceAudioOutUnknown_UAk5DtTuUMo_nid_no_patch); + +int APS5_VABI libSceAudioOutUnknown_WKpJvbBdcbU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WKpJvbBdcbU", libSceAudioOutUnknown_WKpJvbBdcbU_nid_no_patch); + +int APS5_VABI libSceAudioOutUnknown_WOfIge9NmBA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WOfIge9NmBA", libSceAudioOutUnknown_WOfIge9NmBA_nid_no_patch); + +int APS5_VABI libSceAudioOutUnknown_YSm2BXd3gfE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YSm2BXd3gfE", libSceAudioOutUnknown_YSm2BXd3gfE_nid_no_patch); + +int APS5_VABI libSceAudioOutUnknown_Zk1Cn7Z2tVs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Zk1Cn7Z2tVs", libSceAudioOutUnknown_Zk1Cn7Z2tVs_nid_no_patch); + +int APS5_VABI libSceAudioOutUnknown_bd5H255vnsk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bd5H255vnsk", libSceAudioOutUnknown_bd5H255vnsk_nid_no_patch); + +int APS5_VABI libSceAudioOutUnknown_f3xQNbru2m8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("f3xQNbru2m8", libSceAudioOutUnknown_f3xQNbru2m8_nid_no_patch); + +int APS5_VABI libSceAudioOutUnknown_g33sQzMRRmQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("g33sQzMRRmQ", libSceAudioOutUnknown_g33sQzMRRmQ_nid_no_patch); + +int APS5_VABI libSceAudioOutUnknown_gaUU6uC15vs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gaUU6uC15vs", libSceAudioOutUnknown_gaUU6uC15vs_nid_no_patch); + +int APS5_VABI libSceAudioOutUnknown_jEcHKuQ4k8I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jEcHKuQ4k8I", libSceAudioOutUnknown_jEcHKuQ4k8I_nid_no_patch); + +int APS5_VABI libSceAudioOutUnknown_lyHeaetMYXg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lyHeaetMYXg", libSceAudioOutUnknown_lyHeaetMYXg_nid_no_patch); + +int APS5_VABI libSceAudioOutUnknown_r5LqvBxfG_plus_0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("r5LqvBxfG+0", libSceAudioOutUnknown_r5LqvBxfG_plus_0_nid_no_patch); + +int APS5_VABI libSceAudioOutUnknown_rSyeebu6wWI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rSyeebu6wWI", libSceAudioOutUnknown_rSyeebu6wWI_nid_no_patch); + +int APS5_VABI libSceAudioOutUnknown_rzjbvXzvDtE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rzjbvXzvDtE", libSceAudioOutUnknown_rzjbvXzvDtE_nid_no_patch); + +int APS5_VABI libSceAudioOutUnknown_spvw78DsDzU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("spvw78DsDzU", libSceAudioOutUnknown_spvw78DsDzU_nid_no_patch); + +int APS5_VABI libSceAudioOutUnknown_tqTyWw6NgyU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tqTyWw6NgyU", libSceAudioOutUnknown_tqTyWw6NgyU_nid_no_patch); + +int APS5_VABI libSceAudioOutUnknown_tvPlXmc4MHs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tvPlXmc4MHs", libSceAudioOutUnknown_tvPlXmc4MHs_nid_no_patch); + +int APS5_VABI libSceAudioOutUnknown_yt9g5kdJy1o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yt9g5kdJy1o", libSceAudioOutUnknown_yt9g5kdJy1o_nid_no_patch); + +} diff --git a/core/libs/prx/libSceAudioOut/tests/AudioOut2PortBuffers.cpp b/core/libs/prx/libSceAudioOut/tests/AudioOut2PortBuffers.cpp index f14b1d290e..daffee1e55 100644 --- a/core/libs/prx/libSceAudioOut/tests/AudioOut2PortBuffers.cpp +++ b/core/libs/prx/libSceAudioOut/tests/AudioOut2PortBuffers.cpp @@ -189,6 +189,43 @@ void TestAdvanceRetainsRewrittenBuffer() { RequirePlayed(played, {&first, &second}); } +void TestAdvanceKeepsTheGrainSetBeforeTheBufferIsCleared() { + auto buffer = Grain(0.01f); + const auto first = buffer; + const auto second = Grain(0.02f); + const auto played = Play([&](AudioOut2ContextHandle context, AudioOut2PortHandle port) { + SetData(port, buffer.data()); + std::fill(buffer.begin(), buffer.end(), 0.0f); + Require(sceAudioOut2ContextAdvance(context) == 0); + Require(sceAudioOut2ContextPush(context, 1) == 0); + std::copy(second.begin(), second.end(), buffer.begin()); + SetData(port, buffer.data()); + std::fill(buffer.begin(), buffer.end(), 0.0f); + Require(sceAudioOut2ContextAdvance(context) == 0); + Require(sceAudioOut2ContextPush(context, 1) == 0); + }, true); + RequirePlayed(played, {&first, &second}); +} + +void TestAdvancedRegivenBufferPlaysSilenceWithoutANewSet() { + auto buffer = Grain(0.01f); + const auto first = buffer; + const auto second = Grain(0.02f); + const auto played = Play([&](AudioOut2ContextHandle context, AudioOut2PortHandle port) { + SetData(port, buffer.data()); + Require(sceAudioOut2ContextAdvance(context) == 0); + Require(sceAudioOut2ContextPush(context, 1) == 0); + buffer = second; + SetData(port, buffer.data()); + Require(sceAudioOut2ContextAdvance(context) == 0); + Require(sceAudioOut2ContextPush(context, 1) == 0); + std::fill(buffer.begin(), buffer.end(), 0.5f); + Require(sceAudioOut2ContextAdvance(context) == 0); + Require(sceAudioOut2ContextPush(context, 1) == 0); + }, true); + RequirePlayed(played, {&first, &second}); +} + void TestAdvanceRetainsVolume() { const auto buffer = Grain(0.02f); auto reduced = buffer; @@ -313,12 +350,14 @@ int main() { SetEnvironment("SDL_AUDIODRIVER", "disk"); TestAdvanceRetainsRewrittenBuffer(); TestAdvanceRetainsVolume(); + TestAdvanceKeepsTheGrainSetBeforeTheBufferIsCleared(); TestAdvanceBurstRetainsEveryGrain(); TestPushingThreadWaitsForAdvance(); TestBuffersSetBeforeOnePushPlayInOrder(); TestBurstThenGapKeepsEveryBuffer(); TestAdvancingPortWithoutNewBufferPlaysSilence(); TestRewrittenBufferRepeats(); + TestAdvancedRegivenBufferPlaysSilenceWithoutANewSet(); TestRenderingSizedByLevelStaysWithinQueueDepth(); TestBufferReusedAcrossPortsKeepsEachPortsGrain(false); TestBufferReusedAcrossPortsKeepsEachPortsGrain(true); diff --git a/core/libs/prx/libSceAudioOut/tests/AudioOut2Timing.cpp b/core/libs/prx/libSceAudioOut/tests/AudioOut2Timing.cpp index 804325eba3..691045c6b8 100644 --- a/core/libs/prx/libSceAudioOut/tests/AudioOut2Timing.cpp +++ b/core/libs/prx/libSceAudioOut/tests/AudioOut2Timing.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -213,6 +214,104 @@ void TestLevelWithoutADeviceUsesThePlaybackClock() { session.Close(); } +void TestBlockingPushWaitsForRoomWithoutADevice() { + SetEnvironment("SDL_DISKAUDIOFILE", std::filesystem::temp_directory_path().string()); + constexpr std::uint32_t paced = 1024; + AudioOut2ContextParam params{}; + Require(sceAudioOut2ContextResetParam(¶ms) == 0); + params.num_grains = paced; + params.queue_depth = queueDepth; + AudioOut2ContextHandle handle = 0; + Require(sceAudioOut2ContextCreate(¶ms, nullptr, 0, &handle) == 0); + Require(reinterpret_cast(handle)->device == 0); + std::uint32_t level = 99; + std::uint32_t available = 99; + for (std::uint32_t round = 0; round < 4; round++) { + Require(sceAudioOut2ContextPush(handle, 1) == 0); + Require(sceAudioOut2ContextGetQueueLevel(handle, &level, &available) == 0); + Require(level < queueDepth && available > 0); + } + Require(sceAudioOut2ContextDestroy(handle) == 0); +} + +AudioOut2ContextHandle CreateContextOnATestClock() { + SetEnvironment("SDL_DISKAUDIOFILE", std::filesystem::temp_directory_path().string()); + AudioOut2ContextParam params{}; + Require(sceAudioOut2ContextResetParam(¶ms) == 0); + params.num_grains = grain; + params.queue_depth = queueDepth; + AudioOut2ContextHandle handle = 0; + Require(sceAudioOut2ContextCreate(¶ms, nullptr, 0, &handle) == 0); + auto& context = *reinterpret_cast(handle); + std::lock_guard lock(context.lock); + Require(context.device == 0); + const auto start = std::chrono::steady_clock::now(); + context.clockForTest = start; + context.playHead = start; + return handle; +} + +void PlayOneGrainOnTheTestClock(AudioOut2ContextHandle handle) { + auto& context = *reinterpret_cast(handle); + std::lock_guard lock(context.lock); + *context.clockForTest += std::chrono::duration_cast(std::chrono::duration(static_cast(grain) / frequency)) + std::chrono::microseconds(1); +} + +template +bool ContextReaches(AudioOut2ContextHandle handle, std::chrono::milliseconds limit, Predicate predicate) { + auto& context = *reinterpret_cast(handle); + const auto deadline = std::chrono::steady_clock::now() + limit; + for (;;) { + { + std::lock_guard lock(context.lock); + if (predicate(context)) return true; + } + if (std::chrono::steady_clock::now() >= deadline) return false; + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + } +} + +std::uint32_t QueueLevelNow(AudioOut2ContextHandle handle) { + std::uint32_t level = 99; + std::uint32_t available = 99; + Require(sceAudioOut2ContextGetQueueLevel(handle, &level, &available) == 0); + Require(level + available == queueDepth); + return level; +} + +void TestBlockingPushStaysBlockedUntilPlaybackFreesASlot() { + const auto handle = CreateContextOnATestClock(); + for (std::uint32_t push = 0; push + 1 < queueDepth; push++) Require(sceAudioOut2ContextPush(handle, 1) == 0); + Require(QueueLevelNow(handle) == queueDepth - 1); + auto push = std::async(std::launch::async, [handle] { return sceAudioOut2ContextPush(handle, 1); }); + std::uint64_t pushesOnceQueued = 0; + Require(ContextReaches(handle, std::chrono::seconds(10), [&](const AudioOut2Context& context) { + pushesOnceQueued = context.pushes; + return context.queued == queueDepth; + })); + Require(pushesOnceQueued == queueDepth - 1); + Require(push.wait_for(std::chrono::seconds(0)) == std::future_status::timeout); + Require(QueueLevelNow(handle) == queueDepth); + PlayOneGrainOnTheTestClock(handle); + Require(push.get() == 0); + Require(QueueLevelNow(handle) == queueDepth - 1); + Require(sceAudioOut2ContextDestroy(handle) == 0); +} + +void TestBlockingPushOnAFullQueueQueuesOnlyOnceASlotIsFree() { + const auto handle = CreateContextOnATestClock(); + for (std::uint32_t push = 0; push < queueDepth; push++) Require(sceAudioOut2ContextPush(handle, 0) == 0); + Require(sceAudioOut2ContextPush(handle, 0) == queueFull); + auto push = std::async(std::launch::async, [handle] { return sceAudioOut2ContextPush(handle, 1); }); + Require(!ContextReaches(handle, std::chrono::seconds(1), [](const AudioOut2Context& context) { return context.queued > queueDepth; })); + Require(push.wait_for(std::chrono::seconds(0)) == std::future_status::timeout); + PlayOneGrainOnTheTestClock(handle); + PlayOneGrainOnTheTestClock(handle); + Require(push.get() == 0); + Require(QueueLevelNow(handle) == queueDepth - 1); + Require(sceAudioOut2ContextDestroy(handle) == 0); +} + void TestPrimingAfterRunningDry() { Session session("anyps5_audio_out2_priming.raw"); session.Fill(0.5f); @@ -372,6 +471,9 @@ int main() { TestDeviceLevelDoesNotWaitForTheContext(false); TestDeviceLevelDoesNotWaitForTheContext(true); TestLevelWithoutADeviceUsesThePlaybackClock(); + TestBlockingPushStaysBlockedUntilPlaybackFreesASlot(); + TestBlockingPushOnAFullQueueQueuesOnlyOnceASlotIsFree(); + TestBlockingPushWaitsForRoomWithoutADevice(); TestPrimingAfterRunningDry(); TestLowLatencyCallsRejectBadArguments(); TestLowLatencyReadsAtNextPush(); diff --git a/core/libs/prx/libSceAudioOut/tests/AudioOutBufferSize.cpp b/core/libs/prx/libSceAudioOut/tests/AudioOutBufferSize.cpp index 96f2806786..f0bc493e73 100644 --- a/core/libs/prx/libSceAudioOut/tests/AudioOutBufferSize.cpp +++ b/core/libs/prx/libSceAudioOut/tests/AudioOutBufferSize.cpp @@ -113,6 +113,7 @@ extern "C" int SDLCALL SDL_QueueAudio(SDL_AudioDeviceID id, const void* data, Ui } extern "C" void SDLCALL SDL_ClearQueuedAudio(SDL_AudioDeviceID id) { Require(id == device, "wrong queue cleared"); } extern "C" void SDLCALL SDL_CloseAudioDevice(SDL_AudioDeviceID id) { Require(id == device, "wrong device closed"); ++closed; } +extern "C" SDL_AudioStatus SDLCALL SDL_GetAudioDeviceStatus(SDL_AudioDeviceID) { return SDL_AUDIO_PLAYING; } int main(int argc, char** argv) { try { diff --git a/core/libs/prx/libSceAudioOut/tests/AudioOutDefaultOpen.cpp b/core/libs/prx/libSceAudioOut/tests/AudioOutDefaultOpen.cpp index 0b54f5b399..778173a664 100644 --- a/core/libs/prx/libSceAudioOut/tests/AudioOutDefaultOpen.cpp +++ b/core/libs/prx/libSceAudioOut/tests/AudioOutDefaultOpen.cpp @@ -2,22 +2,29 @@ #include "SDL.h" #include "prx/libSceAudioOut/include/AudioOutSdl.hpp" #include "prx/libc/include/general/VabiMacros.hpp" +#include +#include #include #include #include namespace { -constexpr SDL_AudioDeviceID device = 7; +SDL_AudioDeviceID device = 7; const char* driver = "wasapi"; int outputDevices = 0; bool endpointAbsent = false; +bool unplugged = false; int probes = 0; int opened = 0; int closed = 0; +int queuedLive = 0; +int queuedDead = 0; void Require(bool value, const char* message) { if (!value) throw std::runtime_error(message); } + +bool live(SDL_AudioDeviceID id) { return id == device && !unplugged; } } int InitializeSdlAudio_nid_no_patch() { return 0; } @@ -33,15 +40,23 @@ extern "C" const char* SDLCALL SDL_GetCurrentAudioDriver() { return driver; } extern "C" const char* SDLCALL SDL_GetError() { return "test error"; } extern "C" SDL_AudioDeviceID SDLCALL SDL_OpenAudioDevice(const char* name, int capture, const SDL_AudioSpec* desired, SDL_AudioSpec* obtained, int) { Require(name == nullptr && capture == 0, "the main port did not open the default output"); + device = static_cast(7 + opened); ++opened; + unplugged = false; *obtained = *desired; return device; } extern "C" void SDLCALL SDL_PauseAudioDevice(SDL_AudioDeviceID id, int) { Require(id == device, "wrong device paused"); } extern "C" Uint32 SDLCALL SDL_GetQueuedAudioSize(SDL_AudioDeviceID id) { Require(id == device, "wrong queue queried"); return 0; } -extern "C" int SDLCALL SDL_QueueAudio(SDL_AudioDeviceID id, const void*, Uint32) { Require(id == device, "wrong queue written"); return 0; } +extern "C" int SDLCALL SDL_QueueAudio(SDL_AudioDeviceID id, const void*, Uint32) { + if (!unplugged) Require(id == device, "wrong queue written"); + if (live(id)) ++queuedLive; + else ++queuedDead; + return 0; +} extern "C" void SDLCALL SDL_ClearQueuedAudio(SDL_AudioDeviceID id) { Require(id == device, "wrong queue cleared"); } extern "C" void SDLCALL SDL_CloseAudioDevice(SDL_AudioDeviceID id) { Require(id == device, "wrong device closed"); ++closed; } +extern "C" SDL_AudioStatus SDLCALL SDL_GetAudioDeviceStatus(SDL_AudioDeviceID id) { return live(id) ? SDL_AUDIO_PLAYING : SDL_AUDIO_STOPPED; } int main(int argc, char** argv) { try { @@ -65,9 +80,24 @@ int main(int argc, char** argv) { } else if (mode == "unknown") { driver = "wasapi"; outputDevices = -1; + } else if (mode == "disconnect") { + driver = "wasapi"; + outputDevices = 2; } else { Require(false, "invalid default open mode"); } + if (mode == "disconnect") { + const int port = sceAudioOutOpen(0x10000000, 0, 0, 256, 48000, 1); + Require(port >= 1 && opened == 1, "the main port did not open the default output"); + unplugged = true; + std::array samples{}; + Require(sceAudioOutOutput(port, samples.data()) == 256, "output after the host removed the default output failed"); + Require(opened == 2 && closed == 1, "the removed default output was not replaced"); + Require(queuedLive == 1 && queuedDead == 0, "output was queued to the removed default output"); + Require(sceAudioOutClose(port) == 0 && closed == 2, "the replacement output was not closed with its port"); + std::puts("default output open tests passed"); + return 0; + } const int handle = sceAudioOutOpen(0x10000000, 0, 0, 256, 48000, 1); Require(handle >= 1, "the main port did not open"); Require(opened == (expectOpen ? 1 : 0), expectOpen ? "the default output was not opened" : "the default output was opened with no WASAPI endpoint"); diff --git a/core/libs/prx/libSceAudioOut/tests/AudioOutPortLocks.cpp b/core/libs/prx/libSceAudioOut/tests/AudioOutPortLocks.cpp index 15703d8ba8..170e403919 100644 --- a/core/libs/prx/libSceAudioOut/tests/AudioOutPortLocks.cpp +++ b/core/libs/prx/libSceAudioOut/tests/AudioOutPortLocks.cpp @@ -47,6 +47,7 @@ extern "C" std::uint64_t APS5_VABI sceKernelGetProcessTime(void) { extern "C" int SDLCALL SDL_InitSubSystem(Uint32) { return 0; } extern "C" Uint32 SDLCALL SDL_WasInit(Uint32) { return SDL_INIT_AUDIO; } extern "C" void SDLCALL SDL_PauseAudioDevice(SDL_AudioDeviceID, int) {} +extern "C" SDL_AudioStatus SDLCALL SDL_GetAudioDeviceStatus(SDL_AudioDeviceID) { return SDL_AUDIO_PLAYING; } extern "C" SDL_AudioDeviceID SDLCALL SDL_OpenAudioDevice(const char*, int, const SDL_AudioSpec* desired, SDL_AudioSpec* obtained, int) { *obtained = *desired; diff --git a/core/libs/prx/libSceAudioOut/tests/AudioOutResampling.cpp b/core/libs/prx/libSceAudioOut/tests/AudioOutResampling.cpp index 6b9577e91d..5af102d6cc 100644 --- a/core/libs/prx/libSceAudioOut/tests/AudioOutResampling.cpp +++ b/core/libs/prx/libSceAudioOut/tests/AudioOutResampling.cpp @@ -59,6 +59,7 @@ void TestBoundary(std::uint32_t sourceRate) { extern "C" int SDLCALL SDL_InitSubSystem(Uint32) { return 0; } extern "C" Uint32 SDLCALL SDL_WasInit(Uint32) { return SDL_INIT_AUDIO; } extern "C" void SDLCALL SDL_PauseAudioDevice(SDL_AudioDeviceID, int) {} +extern "C" SDL_AudioStatus SDLCALL SDL_GetAudioDeviceStatus(SDL_AudioDeviceID) { return SDL_AUDIO_PLAYING; } extern "C" Uint32 SDLCALL SDL_GetQueuedAudioSize(SDL_AudioDeviceID) { return 0; } extern "C" void SDLCALL SDL_ClearQueuedAudio(SDL_AudioDeviceID) {} diff --git a/core/libs/prx/libSceAudioOut/tests/AudioOutVibrationDevice.cpp b/core/libs/prx/libSceAudioOut/tests/AudioOutVibrationDevice.cpp index 505cbf878c..987a9e1433 100644 --- a/core/libs/prx/libSceAudioOut/tests/AudioOutVibrationDevice.cpp +++ b/core/libs/prx/libSceAudioOut/tests/AudioOutVibrationDevice.cpp @@ -19,6 +19,8 @@ constexpr std::uint32_t frames = 256; bool available = true; bool failOpen = false; bool failInitialize = false; +bool stopped = false; +int queuedWhileStopped = 0; bool failEnumeration = false; bool pulse = false; std::uint32_t frequency = 48000; @@ -206,6 +208,7 @@ extern "C" SDL_AudioDeviceID SDLCALL SDL_OpenAudioDevice(const char* name, int c Require(capture == 0 && flags == 0 && desired->callback == nullptr && desired->freq == static_cast(frequency) && desired->format == AUDIO_F32SYS && desired->channels == (pulse ? 6 : 4) && desired->samples == frames, "native controller request changed"); if (failOpen) return 0; ++opened; + stopped = false; *obtained = *desired; return 42; } @@ -216,17 +219,19 @@ extern "C" int SDLCALL SDL_QueueAudio(SDL_AudioDeviceID device, const void* data const auto* samples = static_cast(data); const std::size_t sampleCount = bytes / sizeof(float); played.assign(samples, samples + sampleCount); + if (stopped) ++queuedWhileStopped; ++queued; return 0; } extern "C" void SDLCALL SDL_ClearQueuedAudio(SDL_AudioDeviceID device) { Require(device == 42, "wrong native queue cleared"); } extern "C" void SDLCALL SDL_CloseAudioDevice(SDL_AudioDeviceID device) { Require(device == 42, "wrong native device closed"); ++closed; } +extern "C" SDL_AudioStatus SDLCALL SDL_GetAudioDeviceStatus(SDL_AudioDeviceID device) { return device == 42 && !stopped ? SDL_AUDIO_PLAYING : SDL_AUDIO_STOPPED; } int main(int argc, char** argv) { try { Require(argc == 2, "invalid test arguments"); const std::string_view mode = argv[1]; - Require(mode == "quad" || mode == "pulse" || mode == "open_failure" || mode == "timing" || mode == "cadence" || mode == "discovery_failure", "invalid device mode"); + Require(mode == "quad" || mode == "pulse" || mode == "open_failure" || mode == "timing" || mode == "cadence" || mode == "discovery_failure" || mode == "disconnect", "invalid device mode"); pulse = mode == "pulse"; Pad::Initialize(); Pad::SetVibrationMode(1); @@ -242,6 +247,22 @@ int main(int argc, char** argv) { std::puts("legacy vibration device tests passed"); return 0; } + if (mode == "disconnect") { + const int port = sceAudioOutOpen(0x10000000, 10, 0, frames, frequency, 1); + Require(port > 0 && opened == 1, "the controller port did not open its sound card"); + stopped = true; + std::array samples{}; + for (std::uint32_t frame = 0; frame < frames; ++frame) { + samples[frame * 2] = 8192; + samples[frame * 2 + 1] = -16384; + } + Require(sceAudioOutOutput(port, samples.data()) == static_cast(frames), "vibration output after the controller stopped failed"); + Require(opened == 2 && closed == 1, "the stopped controller sound card was not reopened"); + Require(queued == 1 && queuedWhileStopped == 0, "vibration PCM was queued to the stopped controller sound card"); + Require(sceAudioOutClose(port) == 0 && closed == 2, "the reopened controller sound card was not closed with its port"); + std::puts("legacy vibration device tests passed"); + return 0; + } if (mode == "open_failure") { failOpen = true; bool threw = false; diff --git a/core/libs/prx/libSceAudioOut/tests/HostGain.cpp b/core/libs/prx/libSceAudioOut/tests/HostGain.cpp new file mode 100644 index 0000000000..ca97e36137 --- /dev/null +++ b/core/libs/prx/libSceAudioOut/tests/HostGain.cpp @@ -0,0 +1,284 @@ +#include "prx/libSceAudioOut/include/HostGain.hpp" + +#include +#include +#include +#include +#include +#include +#include + +namespace { + +void require(bool condition, const char* message) { + if (!condition) throw std::runtime_error(message); +} + +std::vector constantS16(std::size_t frames, unsigned channels, std::int16_t value) { + return std::vector(frames * channels, value); +} + +void s16BypassAtUnity() { + for (const unsigned channels : {1u, 2u, 8u}) { + std::vector samples(256 * channels); + for (std::size_t index = 0; index < samples.size(); ++index) samples[index] = static_cast(static_cast(index * 7919u % 65536u) - 32768); + const auto before = samples; + HostGainRamp ramp; + require(ramp.Bypass(HostGainRamp::Unity), "a ramp at unity with a unity target bypasses"); + ramp.Apply(samples.data(), 256, channels, HostGainRamp::Unity); + require(std::memcmp(before.data(), samples.data(), samples.size() * sizeof(std::int16_t)) == 0, "unity leaves 16-bit samples bit-identical"); + require(ramp.Current() == HostGainRamp::Unity, "bypass keeps the gain at unity"); + } +} + +void s16FirstSampleOfRamp() { + HostGainRamp ramp; + require(ramp.Step() == 136, "a 480 frame ramp steps 136 per frame"); + auto samples = constantS16(1, 1, 10000); + ramp.Apply(samples.data(), 1, 1, 32768); + require(ramp.Current() == 65536 - 136, "the first frame moves one step"); + require(samples[0] == 9979, "the first frame is scaled by the first step"); +} + +void s16RampReachesTargetExactly() { + HostGainRamp ramp; + auto samples = constantS16(2000, 1, 10000); + ramp.Apply(samples.data(), 2000, 1, 32768); + require(ramp.Current() == 32768, "the ramp lands exactly on the target"); + std::size_t firstAtTarget = 0; + while (firstAtTarget < samples.size() && samples[firstAtTarget] != 5000) ++firstAtTarget; + require(firstAtTarget == 240, "the ramp takes the 241 frames its step needs"); + for (std::size_t index = firstAtTarget; index < samples.size(); ++index) require(samples[index] == 5000, "samples stay at the target after the ramp"); +} + +void s16RampHasNoDiscontinuity() { + HostGainRamp ramp; + auto samples = constantS16(2000, 1, 32000); + ramp.Apply(samples.data(), 2000, 1, 0); + int largest = 0; + int previous = 32000; + for (const auto sample : samples) { + require(sample <= previous, "a ramp down never rises"); + largest = std::max(largest, previous - sample); + previous = sample; + } + require(largest <= 67, "no step of a full-scale ramp exceeds its per-frame slope"); + require(samples.back() == 0, "the ramp ends in silence"); +} + +void s16RampContinuesAcrossBuffers() { + auto whole = constantS16(3000, 2, 20000); + HostGainRamp wholeRamp; + wholeRamp.Apply(whole.data(), 3000, 2, 16384); + auto split = constantS16(3000, 2, 20000); + HostGainRamp splitRamp; + std::size_t done = 0; + for (const std::size_t chunk : {1u, 7u, 100u, 333u, 1u, 900u, 1658u}) { + splitRamp.Apply(split.data() + done * 2, chunk, 2, 16384); + done += chunk; + } + require(done == 3000, "the chunks cover the buffer"); + require(std::memcmp(whole.data(), split.data(), whole.size() * sizeof(std::int16_t)) == 0, "a ramp split across buffers equals the same ramp in one buffer"); + require(wholeRamp.Current() == splitRamp.Current(), "both ramps end at the same gain"); +} + +void s16SaturatesAboveUnity() { + HostGainRamp ramp(1); + auto samples = constantS16(4, 1, 30000); + samples[1] = -30000; + samples[2] = 8000; + ramp.Apply(samples.data(), 4, 1, 4 * HostGainRamp::Unity); + require(samples[0] == 32767, "a positive overshoot saturates at 32767"); + require(samples[1] == -32768, "a negative overshoot saturates at -32768"); + require(samples[2] == 32000, "a sample inside the range is scaled"); +} + +void s16ChannelsShareTheFrameGain() { + for (const unsigned channels : {1u, 2u, 8u}) { + HostGainRamp ramp; + auto samples = constantS16(600, channels, 12345); + ramp.Apply(samples.data(), 600, channels, 0); + for (std::size_t frame = 0; frame < 600; ++frame) { + for (unsigned channel = 1; channel < channels; ++channel) require(samples[frame * channels + channel] == samples[frame * channels], "every channel of a frame gets the same gain"); + } + require(samples[599 * channels] == 0, "the last frame is silent"); + } +} + +void s16SilentTargetSilencesAfterRamp() { + HostGainRamp ramp(1); + auto samples = constantS16(8, 2, -32768); + ramp.Apply(samples.data(), 8, 2, 0); + for (const auto sample : samples) require(sample == 0, "a zero gain writes zeros"); + require(!ramp.Bypass(0), "a silent target is never bypassed"); + auto again = constantS16(8, 2, 1000); + ramp.Apply(again.data(), 8, 2, 0); + for (const auto sample : again) require(sample == 0, "a settled silent gain stays silent"); +} + +void s16ReturnToUnityBypassesAgain() { + HostGainRamp ramp; + auto samples = constantS16(2000, 2, 9000); + ramp.Apply(samples.data(), 2000, 2, 0); + auto back = constantS16(2000, 2, 9000); + ramp.Apply(back.data(), 2000, 2, HostGainRamp::Unity); + require(ramp.Current() == HostGainRamp::Unity, "the ramp returns to exactly unity"); + require(ramp.Bypass(HostGainRamp::Unity), "once back at unity the stream bypasses again"); + auto steady = constantS16(64, 2, 9000); + const auto before = steady; + ramp.Apply(steady.data(), 64, 2, HostGainRamp::Unity); + require(steady == before, "samples after the return are bit-identical"); +} + +void s16RoundsHalfUp() { + HostGainRamp ramp(1); + auto samples = constantS16(4, 1, 1); + samples[1] = 3; + samples[2] = -1; + samples[3] = -3; + ramp.Apply(samples.data(), 4, 1, 32768); + require(samples[0] == 1 && samples[1] == 2, "a half rounds up for positive samples"); + require(samples[2] == 0 && samples[3] == -1, "a half rounds toward positive for negative samples"); +} + +void s16RampUpLandsExactly() { + HostGainRamp ramp; + auto silence = constantS16(1000, 1, 0); + ramp.Apply(silence.data(), 1000, 1, 0); + require(ramp.Current() == 0, "the ramp reached silence"); + auto samples = constantS16(2000, 1, 10000); + ramp.Apply(samples.data(), 2000, 1, HostGainRamp::Unity); + require(ramp.Current() == HostGainRamp::Unity, "a ramp up lands exactly on unity"); + int previous = 0; + int largest = 0; + for (const auto sample : samples) { + require(sample >= previous, "a ramp up never falls"); + largest = std::max(largest, sample - previous); + previous = sample; + } + require(largest <= 22, "no step of a ramp up exceeds its per-frame slope"); + require(samples.back() == 10000, "samples return to the title's own values"); +} + +std::vector constantF32(std::size_t frames, unsigned channels, float value) { + return std::vector(frames * channels, value); +} + +void f32BypassAtUnity() { + for (const unsigned channels : {1u, 2u, 8u}) { + std::vector samples(256 * channels); + for (std::size_t index = 0; index < samples.size(); ++index) samples[index] = static_cast(static_cast(index % 2001) - 1000) / 777.0f; + const auto before = samples; + HostGainRamp ramp; + ramp.Apply(samples.data(), 256, channels, HostGainRamp::Unity); + require(std::memcmp(before.data(), samples.data(), samples.size() * sizeof(float)) == 0, "unity leaves float samples bit-identical"); + } +} + +void f32FirstSampleAndLanding() { + HostGainRamp ramp; + auto samples = constantF32(2000, 1, 1.0f); + ramp.Apply(samples.data(), 2000, 1, 32768); + require(samples[0] == static_cast(65536 - 136) / 65536.0f, "the first float frame is scaled by the first step"); + require(samples[240] == 0.5f && samples[239] != 0.5f, "the float ramp lands on the target at the same frame as the 16-bit one"); + require(samples.back() == 0.5f, "float samples stay at the target after the ramp"); +} + +void f32RampHasNoDiscontinuity() { + HostGainRamp ramp; + auto samples = constantF32(1000, 2, 1.0f); + ramp.Apply(samples.data(), 1000, 2, 0); + float previous = 1.0f; + for (std::size_t frame = 0; frame < 1000; ++frame) { + require(samples[frame * 2] == samples[frame * 2 + 1], "both channels get the same gain"); + require(previous - samples[frame * 2] <= 136.0f / 65536.0f + 1e-6f, "no float step exceeds the ramp slope"); + require(samples[frame * 2] <= previous, "a float ramp down never rises"); + previous = samples[frame * 2]; + } + require(previous == 0.0f, "the float ramp ends in silence"); +} + +void f32RampContinuesAcrossBuffers() { + auto whole = constantF32(3000, 8, 0.75f); + HostGainRamp wholeRamp; + wholeRamp.Apply(whole.data(), 3000, 8, 16384); + auto split = constantF32(3000, 8, 0.75f); + HostGainRamp splitRamp; + std::size_t done = 0; + for (const std::size_t chunk : {5u, 1u, 480u, 481u, 2033u}) { + splitRamp.Apply(split.data() + done * 8, chunk, 8, 16384); + done += chunk; + } + require(done == 3000, "the float chunks cover the buffer"); + require(std::memcmp(whole.data(), split.data(), whole.size() * sizeof(float)) == 0, "a float ramp split across buffers equals the same ramp in one buffer"); +} + +void f32DoesNotClamp() { + HostGainRamp ramp(1); + auto samples = constantF32(2, 1, 0.75f); + ramp.Apply(samples.data(), 2, 1, 4 * HostGainRamp::Unity); + require(samples[0] == 1.5f && samples[1] == 2.25f, "float samples above one are left for the device to clip"); +} + +void filterPassesTheTitleBufferAtUnity() { + std::vector title = constantS16(64, 2, 4321); + std::vector scratch; + HostGainRamp ramp; + const void* out = HostGainFilter(ramp, HostGainRamp::Unity, title.data(), false, 64, 2, scratch); + require(out == title.data(), "at unity the filter returns the title's own pointer"); + require(scratch.empty(), "at unity the filter copies nothing"); + std::vector titleFloat = constantF32(64, 8, 0.25f); + out = HostGainFilter(ramp, HostGainRamp::Unity, titleFloat.data(), true, 64, 8, scratch); + require(out == titleFloat.data() && scratch.empty(), "the same holds for float"); +} + +void filterLeavesTheTitleBufferUntouched() { + std::vector title = constantS16(64, 2, 4321); + const auto before = title; + std::vector scratch; + HostGainRamp ramp(1); + const void* out = HostGainFilter(ramp, 0, title.data(), false, 64, 2, scratch); + require(out == scratch.data(), "a changed gain returns the scratch copy"); + require(title == before, "the title's buffer is never written"); + const auto* result = static_cast(out); + for (std::size_t index = 0; index < title.size(); ++index) require(result[index] == 0, "the copy is silent"); +} + +void filterWorksInPlaceOnTheScratchBuffer() { + std::vector scratch(64 * 2 * sizeof(float)); + auto* floats = reinterpret_cast(scratch.data()); + for (std::size_t index = 0; index < 128; ++index) floats[index] = 1.0f; + HostGainRamp ramp(1); + const void* out = HostGainFilter(ramp, 0, scratch.data(), true, 64, 2, scratch); + require(out == scratch.data(), "in place keeps the scratch pointer"); + for (std::size_t index = 0; index < 128; ++index) require(floats[index] == 0.0f, "in place applies the gain"); +} + +} + +int main() try { + s16BypassAtUnity(); + s16FirstSampleOfRamp(); + s16RampReachesTargetExactly(); + s16RampHasNoDiscontinuity(); + s16RampContinuesAcrossBuffers(); + s16SaturatesAboveUnity(); + s16ChannelsShareTheFrameGain(); + s16SilentTargetSilencesAfterRamp(); + s16ReturnToUnityBypassesAgain(); + s16RoundsHalfUp(); + s16RampUpLandsExactly(); + f32BypassAtUnity(); + f32FirstSampleAndLanding(); + f32RampHasNoDiscontinuity(); + f32RampContinuesAcrossBuffers(); + f32DoesNotClamp(); + filterPassesTheTitleBufferAtUnity(); + filterLeavesTheTitleBufferUntouched(); + filterWorksInPlaceOnTheScratchBuffer(); + std::puts("host gain tests passed"); + return 0; +} catch (const std::exception& error) { + std::fprintf(stderr, "%s\n", error.what()); + return 1; +} diff --git a/core/libs/prx/libSceAudioOut/tests/HostVolume.cpp b/core/libs/prx/libSceAudioOut/tests/HostVolume.cpp new file mode 100644 index 0000000000..8dc8c133f8 --- /dev/null +++ b/core/libs/prx/libSceAudioOut/tests/HostVolume.cpp @@ -0,0 +1,281 @@ +#include "prx/libScePad/include/HostVolume.hpp" +#include "prx/libScePad/include/HostVolumeSettings.hpp" + +#include +#include +#include +#include + +namespace { + +void require(bool condition, const char* message) { + if (!condition) throw std::runtime_error(message); +} + +void defaultState() { + HostVolume state; + require(state.Volume() == 100, "the volume starts at 100"); + require(!state.Muted(), "the host volume starts unmuted"); +} + +void stepsDown() { + HostVolume state; + for (int expected = 95; expected >= 0; expected -= 5) { + require(state.VolumeDown(), "a step down from above 0 changes the volume"); + require(state.Volume() == expected, "each step down removes 5"); + } + require(state.Volume() == 0, "twenty steps reach 0"); +} + +void stepsStopAtZero() { + HostVolume state; + for (int step = 0; step < 20; ++step) state.VolumeDown(); + require(!state.VolumeDown(), "a step down at 0 reports no change"); + require(state.Volume() == 0, "the volume never goes below 0"); +} + +void stepsUp() { + HostVolume state; + for (int step = 0; step < 20; ++step) state.VolumeDown(); + for (int expected = 5; expected <= 100; expected += 5) { + require(state.VolumeUp(), "a step up from below 100 changes the volume"); + require(state.Volume() == expected, "each step up adds 5"); + } +} + +void stepsStopAtMaximum() { + HostVolume state; + require(!state.VolumeUp(), "a step up at 100 reports no change"); + require(state.Volume() == 100, "the volume never goes above 100"); +} + +void muteKeepsVolume() { + HostVolume state; + state.VolumeDown(); + state.VolumeDown(); + require(state.Volume() == 90, "two steps down give 90"); + require(state.ToggleMute(), "muting changes the state"); + require(state.Muted() && state.Volume() == 90, "muting leaves the volume alone"); + require(state.ToggleMute(), "unmuting changes the state"); + require(!state.Muted() && state.Volume() == 90, "unmuting restores the volume that was set"); +} + +void muteAtZeroAndMaximum() { + HostVolume state; + state.ToggleMute(); + require(state.Volume() == 100, "muting at 100 keeps 100"); + state.ToggleMute(); + for (int step = 0; step < 20; ++step) state.VolumeDown(); + state.ToggleMute(); + require(state.Muted() && state.Volume() == 0, "muting at 0 keeps 0"); + state.ToggleMute(); + require(!state.Muted() && state.Volume() == 0, "unmuting at 0 leaves 0"); +} + +void stepsEndMute() { + HostVolume state; + state.VolumeDown(); + state.ToggleMute(); + require(state.VolumeUp(), "a step up while muted changes the state"); + require(!state.Muted() && state.Volume() == 100, "a step up while muted unmutes and moves the volume"); + state.ToggleMute(); + require(state.VolumeDown(), "a step down while muted changes the state"); + require(!state.Muted() && state.Volume() == 95, "a step down while muted unmutes and moves the volume"); +} + +void stepsAtLimitsStillEndMute() { + HostVolume top; + top.ToggleMute(); + require(top.VolumeUp(), "a step up at 100 while muted reports the unmute"); + require(!top.Muted() && top.Volume() == 100, "a step up at 100 while muted only unmutes"); + require(!top.VolumeUp(), "a second step up at 100 reports no change"); + HostVolume bottom; + for (int step = 0; step < 20; ++step) bottom.VolumeDown(); + bottom.ToggleMute(); + require(bottom.VolumeDown(), "a step down at 0 while muted reports the unmute"); + require(!bottom.Muted() && bottom.Volume() == 0, "a step down at 0 while muted only unmutes"); +} + +void setVolumeDirectly() { + HostVolume state; + require(state.SetVolume(35), "a new volume reports a change"); + require(state.Volume() == 35, "the volume takes the value set"); + require(!state.SetVolume(35), "the same volume reports no change"); + require(state.SetVolume(0) && state.Volume() == 0, "0 is accepted"); + require(state.SetVolume(100) && state.Volume() == 100, "100 is accepted"); + state.ToggleMute(); + state.SetVolume(40); + require(state.Muted(), "setting the volume leaves the mute alone"); +} + +void setVolumeRefusesOutOfRange() { + HostVolume state; + state.SetVolume(60); + for (const int value : {-1, 101, 1000, -100}) { + bool refused = false; + try { + state.SetVolume(value); + } catch (const std::invalid_argument&) { + refused = true; + } + require(refused, "a volume outside 0 to 100 is refused"); + require(state.Volume() == 60, "a refused volume leaves the state as it was"); + } +} + +void focusIgnoredByDefault() { + HostVolume state; + require(!state.MuteOnFocusLoss(), "muting on focus loss is off by default"); + require(!state.FocusChanged(false), "losing focus changes nothing with the option off"); + require(!state.FocusMuted(), "no focus mute with the option off"); + require(!state.FocusChanged(true), "gaining focus changes nothing with the option off"); +} + +void focusLossMutesAndGainRestores() { + HostVolume state; + state.SetMuteOnFocusLoss(true); + require(!state.FocusMuted(), "a focused window is not focus muted"); + require(state.FocusChanged(false), "losing focus reports a change"); + require(state.FocusMuted(), "a window without focus is focus muted"); + require(!state.FocusChanged(false), "losing focus twice reports no second change"); + require(state.FocusChanged(true), "gaining focus reports a change"); + require(!state.FocusMuted(), "gaining focus ends the focus mute"); +} + +void focusMuteKeepsUserState() { + HostVolume state; + state.SetMuteOnFocusLoss(true); + state.VolumeDown(); + state.ToggleMute(); + state.FocusChanged(false); + state.FocusChanged(true); + require(state.Muted() && state.Volume() == 95, "a focus round trip leaves the user's mute and volume"); + state.ToggleMute(); + state.FocusChanged(false); + require(!state.Muted() && state.Volume() == 95, "the focus mute does not touch the muted flag"); +} + +void focusOptionTogglesWhileUnfocused() { + HostVolume state; + state.FocusChanged(false); + require(!state.FocusMuted(), "an unfocused window is not muted with the option off"); + require(state.SetMuteOnFocusLoss(true), "turning the option on while unfocused mutes"); + require(state.FocusMuted(), "the unfocused window is muted once the option is on"); + require(state.SetMuteOnFocusLoss(false), "turning the option off ends the focus mute"); + require(!state.FocusMuted(), "the focus mute is gone with the option off"); +} + +void gainAtDefaultIsUnity() { + HostVolume state; + require(state.Gain() == HostVolume::UnityGain, "the default gain is exactly unity"); + require(HostVolume::UnityGain == 65536, "unity is 1.0 in 16.16 fixed point"); +} + +void gainFollowsVolume() { + HostVolume state; + state.SetVolume(50); + require(state.Gain() == 16384, "50 percent is a quarter of the amplitude"); + state.SetVolume(0); + require(state.Gain() == 0, "0 is silence"); + std::uint32_t previous = 0; + for (int volume = 1; volume <= 100; ++volume) { + state.SetVolume(volume); + require(state.Gain() > previous, "the gain grows with every volume"); + require(state.Gain() <= HostVolume::UnityGain, "the gain never exceeds unity"); + previous = state.Gain(); + } +} + +void gainIsZeroWhenSilent() { + HostVolume state; + state.ToggleMute(); + require(state.Gain() == 0 && state.Silent(), "a muted state has no gain"); + state.ToggleMute(); + require(state.Gain() == HostVolume::UnityGain && !state.Silent(), "unmuting restores the gain"); + state.SetMuteOnFocusLoss(true); + state.FocusChanged(false); + require(state.Gain() == 0 && state.Silent(), "a focus muted state has no gain"); + state.FocusChanged(true); + require(state.Gain() == HostVolume::UnityGain, "gaining focus restores the gain"); +} + +bool refusedWith(void (*parse)(), const char* name) { + try { + parse(); + } catch (const std::runtime_error& error) { + return std::string(error.what()).find(name) != std::string::npos; + } + return false; +} + +void flagParsing() { + require(!ParseHostVolumeFlag("ANYPS5_MUTE_ON_FOCUS_LOSS", "0"), "0 turns the flag off"); + require(ParseHostVolumeFlag("ANYPS5_MUTE_ON_FOCUS_LOSS", "1"), "1 turns the flag on"); + require(refusedWith([] { ParseHostVolumeFlag("ANYPS5_MUTE_ON_FOCUS_LOSS", ""); }, "ANYPS5_MUTE_ON_FOCUS_LOSS"), "an empty flag is refused and named"); + require(refusedWith([] { ParseHostVolumeFlag("ANYPS5_MUTE_ON_FOCUS_LOSS", "yes"); }, "ANYPS5_MUTE_ON_FOCUS_LOSS"), "yes is refused and named"); + require(refusedWith([] { ParseHostVolumeFlag("ANYPS5_MUTE_ON_FOCUS_LOSS", "true"); }, "ANYPS5_MUTE_ON_FOCUS_LOSS"), "true is refused and named"); + require(refusedWith([] { ParseHostVolumeFlag("ANYPS5_MUTE_ON_FOCUS_LOSS", "2"); }, "ANYPS5_MUTE_ON_FOCUS_LOSS"), "2 is refused and named"); + require(refusedWith([] { ParseHostVolumeFlag("ANYPS5_MUTE_ON_FOCUS_LOSS", " 1"); }, "ANYPS5_MUTE_ON_FOCUS_LOSS"), "a padded 1 is refused and named"); + require(refusedWith([] { ParseHostVolumeFlag("ANYPS5_MUTE_ON_FOCUS_LOSS", "01"); }, "ANYPS5_MUTE_ON_FOCUS_LOSS"), "01 is refused and named"); +} + +void levelParsing() { + require(ParseHostVolumeLevel("ANYPS5_VOLUME", "0") == 0, "0 is a level"); + require(ParseHostVolumeLevel("ANYPS5_VOLUME", "100") == 100, "100 is a level"); + require(ParseHostVolumeLevel("ANYPS5_VOLUME", "37") == 37, "any whole number in range is a level"); + for (const char* bad : {"", "-1", "101", "50.5", "5 0", "abc", "+50", " 50", "50 ", "1e1", "99999999999999999999"}) { + bool refused = false; + try { + ParseHostVolumeLevel("ANYPS5_VOLUME", bad); + } catch (const std::runtime_error& error) { + refused = std::string(error.what()).find("ANYPS5_VOLUME") != std::string::npos; + } + require(refused, "a level outside 0 to 100 or not a whole number is refused and named"); + } +} + +void messages() { + HostVolume state; + require(HostVolumeMessage(state) == "Host volume: 100%", "the default message gives the level"); + state.VolumeDown(); + require(HostVolumeMessage(state) == "Host volume: 95%", "a step shows the new level"); + state.ToggleMute(); + require(HostVolumeMessage(state) == "Host volume: muted (volume 95%)", "a mute shows the level it will return to"); + state.ToggleMute(); + state.SetMuteOnFocusLoss(true); + state.FocusChanged(false); + require(HostVolumeMessage(state) == "Host volume: muted while the window has no focus (volume 95%)", "a focus mute says why"); + state.ToggleMute(); + require(HostVolumeMessage(state) == "Host volume: muted (volume 95%)", "the user's mute takes precedence in the message"); +} + +} + +int main() try { + defaultState(); + stepsDown(); + stepsStopAtZero(); + stepsUp(); + stepsStopAtMaximum(); + muteKeepsVolume(); + muteAtZeroAndMaximum(); + stepsEndMute(); + stepsAtLimitsStillEndMute(); + setVolumeDirectly(); + setVolumeRefusesOutOfRange(); + focusIgnoredByDefault(); + focusLossMutesAndGainRestores(); + focusMuteKeepsUserState(); + focusOptionTogglesWhileUnfocused(); + gainAtDefaultIsUnity(); + gainFollowsVolume(); + gainIsZeroWhenSilent(); + flagParsing(); + levelParsing(); + messages(); + std::puts("host volume tests passed"); + return 0; +} catch (const std::exception& error) { + std::fprintf(stderr, "%s\n", error.what()); + return 1; +} diff --git a/core/libs/prx/libSceAudioOut/tests/HostVolumeState.cpp b/core/libs/prx/libSceAudioOut/tests/HostVolumeState.cpp new file mode 100644 index 0000000000..6e17db4979 --- /dev/null +++ b/core/libs/prx/libSceAudioOut/tests/HostVolumeState.cpp @@ -0,0 +1,154 @@ +#include "prx/libScePad/include/HostVolumeControl.hpp" + +#include +#include +#include +#include +#include +#include +#include + +namespace { + +void require(bool condition, const char* message) { + if (!condition) throw std::runtime_error(message); +} + +void setEnvironment(const char* name, const char* value) { +#ifdef _WIN32 + require(_putenv_s(name, value != nullptr ? value : "") == 0, "set the environment variable"); +#else + if (value != nullptr) require(::setenv(name, value, 1) == 0, "set the environment variable"); + else require(::unsetenv(name) == 0, "unset the environment variable"); +#endif +} + +bool refusesNaming(const char* volume, const char* flag, const char* name) { + try { + HostVolumeConfigure_nid_no_patch(volume, flag); + } catch (const std::runtime_error& error) { + return std::string(error.what()).find(name) != std::string::npos; + } + return false; +} + +void defaultIsUnity() { + HostVolumeConfigure_nid_no_patch(nullptr, nullptr); + require(HostVolumeGain_nid_no_patch() == HostVolume::UnityGain, "the shared gain starts at exactly unity"); +} + +void commandsPublishTheGain() { + HostVolumeConfigure_nid_no_patch(nullptr, nullptr); + HostVolume after; + require(!HostVolumeApply_nid_no_patch(HostVolumeCommand::VolumeUp, &after), "a step up at 100 changes nothing"); + require(HostVolumeGain_nid_no_patch() == HostVolume::UnityGain, "a step that changes nothing keeps unity"); + require(HostVolumeApply_nid_no_patch(HostVolumeCommand::VolumeDown, &after), "a step down changes the volume"); + require(after.Volume() == 95 && HostVolumeGain_nid_no_patch() == after.Gain(), "the gain follows the volume"); + require(HostVolumeApply_nid_no_patch(HostVolumeCommand::ToggleMute, &after), "mute changes the state"); + require(after.Muted() && HostVolumeGain_nid_no_patch() == 0, "mute publishes a zero gain"); + require(HostVolumeApply_nid_no_patch(HostVolumeCommand::ToggleMute, nullptr), "unmute works without an out parameter"); + HostVolumeApply_nid_no_patch(HostVolumeCommand::VolumeUp, &after); + require(HostVolumeGain_nid_no_patch() == HostVolume::UnityGain, "stepping back to 100 returns to exactly unity"); +} + +void focusOnlyActsWhenEnabled() { + HostVolumeConfigure_nid_no_patch(nullptr, nullptr); + HostVolume after; + require(!HostVolumeFocus_nid_no_patch(false, &after), "losing focus changes nothing by default"); + require(HostVolumeGain_nid_no_patch() == HostVolume::UnityGain, "the gain stays at unity without the option"); + HostVolumeFocus_nid_no_patch(true, nullptr); + HostVolumeConfigure_nid_no_patch(nullptr, "1"); + require(HostVolumeGain_nid_no_patch() == HostVolume::UnityGain, "the option alone does not mute a focused window"); + require(HostVolumeFocus_nid_no_patch(false, &after), "losing focus with the option on changes the state"); + require(after.FocusMuted() && HostVolumeGain_nid_no_patch() == 0, "a window without focus is silent"); + require(HostVolumeFocus_nid_no_patch(true, &after), "gaining focus changes the state"); + require(!after.FocusMuted() && HostVolumeGain_nid_no_patch() == HostVolume::UnityGain, "gaining focus restores the gain"); +} + +void configureTakesInitialValues() { + HostVolumeConfigure_nid_no_patch("40", "0"); + HostVolume after; + HostVolumeApply_nid_no_patch(HostVolumeCommand::VolumeUp, &after); + require(after.Volume() == 45, "the initial volume is the one configured"); + require(!after.MuteOnFocusLoss(), "the flag 0 leaves the option off"); + HostVolumeConfigure_nid_no_patch("0", nullptr); + require(HostVolumeGain_nid_no_patch() == 0, "an initial volume of 0 is silent"); + HostVolumeConfigure_nid_no_patch(nullptr, nullptr); + require(HostVolumeGain_nid_no_patch() == HostVolume::UnityGain, "configuring without values returns to the default"); +} + +void invalidValuesLeaveTheStateAlone() { + HostVolumeConfigure_nid_no_patch("30", nullptr); + const auto gain = HostVolumeGain_nid_no_patch(); + require(refusesNaming("101", nullptr, "ANYPS5_VOLUME"), "an out-of-range volume is refused and named"); + require(refusesNaming("loud", nullptr, "ANYPS5_VOLUME"), "a non-numeric volume is refused and named"); + require(refusesNaming(nullptr, "yes", "ANYPS5_MUTE_ON_FOCUS_LOSS"), "an invalid flag is refused and named"); + require(refusesNaming("50", "2", "ANYPS5_MUTE_ON_FOCUS_LOSS"), "an invalid flag next to a valid volume is refused and named"); + require(HostVolumeGain_nid_no_patch() == gain, "a refused configuration leaves the gain as it was"); + HostVolume after; + HostVolumeApply_nid_no_patch(HostVolumeCommand::VolumeUp, &after); + require(after.Volume() == 35, "a refused configuration leaves the volume as it was"); + HostVolumeConfigure_nid_no_patch(nullptr, nullptr); +} + +void environmentIsRead() { + setEnvironment("ANYPS5_VOLUME", nullptr); + setEnvironment("ANYPS5_MUTE_ON_FOCUS_LOSS", nullptr); + HostVolumeConfigureFromEnvironment_nid_no_patch(); + require(HostVolumeGain_nid_no_patch() == HostVolume::UnityGain, "unset variables keep the default"); + HostVolume after; + HostVolumeFocus_nid_no_patch(false, &after); + require(!after.FocusMuted(), "an unset ANYPS5_MUTE_ON_FOCUS_LOSS leaves the option off"); + HostVolumeFocus_nid_no_patch(true, nullptr); + setEnvironment("ANYPS5_VOLUME", "60"); + setEnvironment("ANYPS5_MUTE_ON_FOCUS_LOSS", "1"); + HostVolumeConfigureFromEnvironment_nid_no_patch(); + HostVolumeFocus_nid_no_patch(false, &after); + require(after.FocusMuted() && after.Volume() == 60, "both variables are applied"); + setEnvironment("ANYPS5_MUTE_ON_FOCUS_LOSS", "maybe"); + bool refused = false; + try { + HostVolumeConfigureFromEnvironment_nid_no_patch(); + } catch (const std::runtime_error& error) { + refused = std::string(error.what()).find("ANYPS5_MUTE_ON_FOCUS_LOSS") != std::string::npos; + } + require(refused, "an invalid variable from the environment is refused and named"); + setEnvironment("ANYPS5_VOLUME", nullptr); + setEnvironment("ANYPS5_MUTE_ON_FOCUS_LOSS", nullptr); + HostVolumeConfigureFromEnvironment_nid_no_patch(); +} + +void readersSeeOnlyValidGains() { + HostVolumeConfigure_nid_no_patch(nullptr, nullptr); + std::atomic stop{false}; + std::atomic bad{false}; + std::thread reader([&] { + while (!stop.load()) { + const auto gain = HostVolumeGain_nid_no_patch(); + if (gain > HostVolume::UnityGain) bad.store(true); + } + }); + for (int round = 0; round < 20000; ++round) { + HostVolumeApply_nid_no_patch(round % 3 == 0 ? HostVolumeCommand::ToggleMute : round % 3 == 1 ? HostVolumeCommand::VolumeDown : HostVolumeCommand::VolumeUp, nullptr); + } + stop.store(true); + reader.join(); + require(!bad.load(), "a reader never sees a gain above unity while commands run"); +} + +} + +int main() try { + defaultIsUnity(); + commandsPublishTheGain(); + focusOnlyActsWhenEnabled(); + configureTakesInitialValues(); + invalidValuesLeaveTheStateAlone(); + environmentIsRead(); + readersSeeOnlyValidGains(); + std::puts("host volume state tests passed"); + return 0; +} catch (const std::exception& error) { + std::fprintf(stderr, "%s\n", error.what()); + return 1; +} diff --git a/core/libs/prx/libSceAudioPropagation/AudioPropagation.hpp b/core/libs/prx/libSceAudioPropagation/AudioPropagation.hpp index f00b2ea48a..cbd21fcf78 100644 --- a/core/libs/prx/libSceAudioPropagation/AudioPropagation.hpp +++ b/core/libs/prx/libSceAudioPropagation/AudioPropagation.hpp @@ -224,6 +224,7 @@ std::int32_t APS5_VABI sceAudioPropagationSourceCalculateAudioPaths(AudioPropaga std::int32_t APS5_VABI sceAudioPropagationSourceSetAudioPaths(AudioPropagationHandle source, const void* entries, std::uint32_t count); std::int32_t APS5_VABI sceAudioPropagationSourceSetAudioPath(AudioPropagationHandle path, const AudioPropagation::AudioPath* data, float gain); std::int32_t APS5_VABI sceAudioPropagationSourceRender(AudioPropagationHandle system, AudioPropagation::RenderInfo* infos, std::uint32_t count); +int APS5_VABI sceAudioPropagationSourceQueryAudioPaths(); } diff --git a/core/libs/prx/libSceAudioPropagation/CMakeLists.txt b/core/libs/prx/libSceAudioPropagation/CMakeLists.txt index 0575687fe3..a65abb2cd5 100644 --- a/core/libs/prx/libSceAudioPropagation/CMakeLists.txt +++ b/core/libs/prx/libSceAudioPropagation/CMakeLists.txt @@ -1,4 +1,4 @@ -add_library(libSceAudioPropagation SHARED EXCLUDE_FROM_ALL Export.cpp) +add_library(libSceAudioPropagation SHARED EXCLUDE_FROM_ALL Export.cpp InventoryExports.cpp) target_include_directories(libSceAudioPropagation PRIVATE ${LIBS_INCLUDE_DIR}) configure_windows_unwind(libSceAudioPropagation) diff --git a/core/libs/prx/libSceAudioPropagation/InventoryExports.cpp b/core/libs/prx/libSceAudioPropagation/InventoryExports.cpp new file mode 100644 index 0000000000..8847fa7bc5 --- /dev/null +++ b/core/libs/prx/libSceAudioPropagation/InventoryExports.cpp @@ -0,0 +1,47 @@ +#include "prx/libSceAudioPropagation/AudioPropagation.hpp" +#include "SceTypes.hpp" +#include "prx/libc/include/General.hpp" +#include "prx/libc/include/general/ExportMacros.hpp" + +extern "C" { + +int APS5_VABI sceAudioPropagationSourceQueryAudioPaths() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI libSceAudioPropagationUnknown_TrQMW7ARZXY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TrQMW7ARZXY", libSceAudioPropagationUnknown_TrQMW7ARZXY_nid_no_patch); + +int APS5_VABI libSceAudioPropagationUnknown_ZSdiF_plus_pXrF8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZSdiF+pXrF8", libSceAudioPropagationUnknown_ZSdiF_plus_pXrF8_nid_no_patch); + +int APS5_VABI libSceAudioPropagationUnknown_fOTrQvqzABM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fOTrQvqzABM", libSceAudioPropagationUnknown_fOTrQvqzABM_nid_no_patch); + +int APS5_VABI libSceAudioPropagationUnknown_fhMkXxnE8aw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fhMkXxnE8aw", libSceAudioPropagationUnknown_fhMkXxnE8aw_nid_no_patch); + +int APS5_VABI libSceAudioPropagationUnknown_laU0fM_minus_tTsc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("laU0fM-tTsc", libSceAudioPropagationUnknown_laU0fM_minus_tTsc_nid_no_patch); + +int APS5_VABI libSceAudioPropagationUnknown_mdH4mANi9GI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mdH4mANi9GI", libSceAudioPropagationUnknown_mdH4mANi9GI_nid_no_patch); + +int APS5_VABI libSceAudioPropagationUnknown_o0gGIp1vd6A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("o0gGIp1vd6A", libSceAudioPropagationUnknown_o0gGIp1vd6A_nid_no_patch); + +} diff --git a/core/libs/prx/libSceAudiodec.native/CMakeLists.txt b/core/libs/prx/libSceAudiodec.native/CMakeLists.txt index 9820917503..90195a7712 100644 --- a/core/libs/prx/libSceAudiodec.native/CMakeLists.txt +++ b/core/libs/prx/libSceAudiodec.native/CMakeLists.txt @@ -1,3 +1,15 @@ include(${CMAKE_CURRENT_SOURCE_DIR}/../libSceAudiodec/AudiodecLibrary.cmake) add_sce_audiodec_library(libSceAudiodec.native) target_sources(libSceAudiodec.native PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/Export.cpp) + +if(BUILD_TESTING) + add_test_executable(guest_audiodec_ajm_context_tests ${LIBS_INCLUDE_DIR}/tests/GuestAudiodecAjmContext.cpp) + target_include_directories(guest_audiodec_ajm_context_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_audiodec_ajm_context_tests PRIVATE libSceAudiodec.native libc ${CMAKE_DL_LIBS}) + configure_windows_unwind(guest_audiodec_ajm_context_tests) + add_test(NAME guest_audiodec_ajm_context COMMAND guest_audiodec_ajm_context_tests) + if(WIN32) + set_tests_properties(guest_audiodec_ajm_context PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAudiodec.native/Export.cpp b/core/libs/prx/libSceAudiodec.native/Export.cpp index 96acf5c292..7b8fbb75a3 100644 --- a/core/libs/prx/libSceAudiodec.native/Export.cpp +++ b/core/libs/prx/libSceAudiodec.native/Export.cpp @@ -1,9 +1,16 @@ #include "prx/libSceAudiodec.native/include/Api.hpp" #include #include +#include #include "SceTypes.hpp" #include "prx/libc/include/General.hpp" +namespace { + +constexpr int AudiodecErrorArgument = static_cast(0x807F0002u); + +} + extern "C" { int APS5_VABI sceAudiodecClearContextEx(void) { @@ -56,6 +63,15 @@ int APS5_VABI sceAudiodecDeleteDecoderEx(void) { return 0; } +int APS5_VABI sceAudiodecGetAjmContext(const void* context, std::uint32_t* ajmiContext, std::uint32_t* ajmContext) { + if (context == nullptr) return AudiodecErrorArgument; + std::uint32_t ids[2]; + std::memcpy(ids, context, sizeof(ids)); + if (ajmiContext != nullptr) *ajmiContext = ids[0]; + if (ajmContext != nullptr) *ajmContext = ids[1]; + return 0; +} + int APS5_VABI sceAudiodecGetContext(void) { NotImplemented_nid_no_patch(__func__); return 0; @@ -76,4 +92,9 @@ int APS5_VABI sceAudiodecTerminate(void) { return 0; } +int APS5_VABI sceAudiodecUnregisterCodec(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + } diff --git a/core/libs/prx/libSceAudiodec.native/include/Api.hpp b/core/libs/prx/libSceAudiodec.native/include/Api.hpp index f5050e0019..d23f33d32a 100644 --- a/core/libs/prx/libSceAudiodec.native/include/Api.hpp +++ b/core/libs/prx/libSceAudiodec.native/include/Api.hpp @@ -14,9 +14,11 @@ int APS5_VABI sceAudiodecDecodeEx(void); int APS5_VABI sceAudiodecDecodeWithPriority(void); int APS5_VABI sceAudiodecDecodeWithPriorityEx(void); int APS5_VABI sceAudiodecDeleteDecoderEx(void); +int APS5_VABI sceAudiodecGetAjmContext(const void* context, std::uint32_t* ajmiContext, std::uint32_t* ajmContext); int APS5_VABI sceAudiodecGetContext(void); int APS5_VABI sceAudiodecInitialize(void); int APS5_VABI sceAudiodecRegisterCodec(void); int APS5_VABI sceAudiodecTerminate(void); +int APS5_VABI sceAudiodecUnregisterCodec(void); } diff --git a/core/libs/prx/libSceAudiodec/CMakeLists.txt b/core/libs/prx/libSceAudiodec/CMakeLists.txt index 2e7fa84a5e..5ac315a08f 100644 --- a/core/libs/prx/libSceAudiodec/CMakeLists.txt +++ b/core/libs/prx/libSceAudiodec/CMakeLists.txt @@ -12,3 +12,15 @@ if(BUILD_TESTING) "PATH=path_list_prepend:$") endif() endif() + +if(BUILD_TESTING) + add_test_executable(guest_audiodec_standard_exports_tests ${LIBS_INCLUDE_DIR}/tests/GuestAudiodecStandardExports.cpp) + target_include_directories(guest_audiodec_standard_exports_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_audiodec_standard_exports_tests PRIVATE libSceAudiodec libc ${CMAKE_DL_LIBS}) + configure_windows_unwind(guest_audiodec_standard_exports_tests) + add_test(NAME guest_audiodec_standard_exports COMMAND guest_audiodec_standard_exports_tests) + if(WIN32) + set_tests_properties(guest_audiodec_standard_exports PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceAudiodec/Export.cpp b/core/libs/prx/libSceAudiodec/Export.cpp index 9fd67aefa5..2f84e5ccd0 100644 --- a/core/libs/prx/libSceAudiodec/Export.cpp +++ b/core/libs/prx/libSceAudiodec/Export.cpp @@ -173,14 +173,6 @@ Instance* find(std::int32_t handle) { extern "C" { -int APS5_VABI sceAudiodecUnregisterCodec() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI sceAudiodecGetAjmContext() { - NotImplemented_nid_no_patch(__func__); -} - int32_t APS5_VABI sceAudiodecInitLibrary(uint32_t codec_type) { if (!validType(codec_type)) return ERROR_INVALID_TYPE; std::lock_guard lock(g_mutex); diff --git a/core/libs/prx/libSceAudiodec/include/Api.hpp b/core/libs/prx/libSceAudiodec/include/Api.hpp index 38f3cf4d48..e02050acef 100644 --- a/core/libs/prx/libSceAudiodec/include/Api.hpp +++ b/core/libs/prx/libSceAudiodec/include/Api.hpp @@ -4,9 +4,6 @@ extern "C" { -int APS5_VABI sceAudiodecUnregisterCodec(); -int APS5_VABI sceAudiodecGetAjmContext(); - int32_t APS5_VABI sceAudiodecInitLibrary(uint32_t codecType); int32_t APS5_VABI sceAudiodecTermLibrary(uint32_t codecType); int32_t APS5_VABI sceAudiodecCreateDecoder(AudiodecCtrl* ctrl, uint32_t codecType); diff --git a/core/libs/prx/libSceAvPlayer/Export.cpp b/core/libs/prx/libSceAvPlayer/Export.cpp index be3c03f01e..24862e52d7 100644 --- a/core/libs/prx/libSceAvPlayer/Export.cpp +++ b/core/libs/prx/libSceAvPlayer/Export.cpp @@ -113,7 +113,7 @@ int APS5_VABI sceAvPlayerInitEx(const AvPlayerInitDataEx* init_ex, AvPlayerInter init.auto_start = init_ex->auto_start; } init.default_language = init_ex->default_language; - *handle = new Player(init, VideoBufferCount(init.num_output_video_framebuffers), init_ex->this_size >= Ps5InitDataExSize); + *handle = new Player(init, VideoBufferCount(init.num_output_video_framebuffers)); return SCE_OK; } diff --git a/core/libs/prx/libSceAvPlayer/include/AvPlayer.hpp b/core/libs/prx/libSceAvPlayer/include/AvPlayer.hpp index d81882a932..b7134a19c3 100644 --- a/core/libs/prx/libSceAvPlayer/include/AvPlayer.hpp +++ b/core/libs/prx/libSceAvPlayer/include/AvPlayer.hpp @@ -107,7 +107,7 @@ bool NextQueuedAvPlayerAudioTimestampForTest_nid_no_patch(AvPlayerInternal* h, s class Player final : public AvPlayerInternal, private ISourceEvents { public: - Player(const AvPlayerInitData& init, std::uint32_t bufferCount, bool ps5Layout = false); + Player(const AvPlayerInitData& init, std::uint32_t bufferCount); ~Player() override; Player(const Player&) = delete; Player& operator=(const Player&) = delete; @@ -166,7 +166,6 @@ private: AvPlayerMemAllocator memory{}; AvPlayerEventReplacement callback{}; bool autoStartEnabled = false; - bool ps5Layout = false; char language[4]{}; std::uint32_t videoBuffers = 2; diff --git a/core/libs/prx/libSceAvPlayer/src/Player.cpp b/core/libs/prx/libSceAvPlayer/src/Player.cpp index 3f928b7ea8..bb58163adc 100644 --- a/core/libs/prx/libSceAvPlayer/src/Player.cpp +++ b/core/libs/prx/libSceAvPlayer/src/Player.cpp @@ -61,8 +61,8 @@ std::uint32_t DetectSourceType(std::string_view path) { return SourceTypeUnknown; } -Player::Player(const AvPlayerInitData& init, std::uint32_t bufferCount, bool ps5Layout) - : memory(WithGuestHeapFallback(init.memory_replacement)), callback(init.event_replacement), ps5Layout(ps5Layout), videoBuffers(bufferCount) { +Player::Player(const AvPlayerInitData& init, std::uint32_t bufferCount) + : memory(WithGuestHeapFallback(init.memory_replacement)), callback(init.event_replacement), videoBuffers(bufferCount) { if (init.file_replacement.open && init.file_replacement.close && init.file_replacement.read_offset && init.file_replacement.size) { file = init.file_replacement; } @@ -169,7 +169,7 @@ void Player::autoStart() { return; } if (info.type == StreamTypeVideo && (video == -1 || SameLanguage(language, info.details.video.language_code))) video = index; - if (info.type == (ps5Layout ? Ps5StreamTypeAudio : StreamTypeAudio) && (audio == -1 || SameLanguage(language, info.details.audio.language_code))) audio = index; + if (info.type == Ps5StreamTypeAudio && (audio == -1 || SameLanguage(language, info.details.audio.language_code))) audio = index; } if (video != -1) EnableStream(static_cast(video)); if (audio != -1) EnableStream(static_cast(audio)); @@ -233,7 +233,7 @@ int Player::StreamCount() { int Player::GetStreamInfo(std::uint32_t index, AvPlayerStreamInfo& info) { std::lock_guard lock(mutex); if (!source || !source->GetStreamInfo(index, info)) return SCE_AVPLAYER_ERROR_OPERATION_FAILED; - if (ps5Layout && info.type == StreamTypeAudio) info.type = Ps5StreamTypeAudio; + if (info.type == StreamTypeAudio) info.type = Ps5StreamTypeAudio; return SCE_OK; } @@ -241,7 +241,7 @@ int Player::GetStreamInfoEx(std::uint32_t index, AvPlayerStreamInfoEx& info) { std::lock_guard lock(mutex); AvPlayerStreamInfoEx described{}; if (!source || !source->GetStreamInfoEx(index, described)) return SCE_AVPLAYER_ERROR_OPERATION_FAILED; - if (ps5Layout && described.type == StreamTypeAudio) described.type = Ps5StreamTypeAudio; + if (described.type == StreamTypeAudio) described.type = Ps5StreamTypeAudio; described.this_size = info.this_size; info = described; return SCE_OK; diff --git a/core/libs/prx/libSceAvSetting/Export.cpp b/core/libs/prx/libSceAvSetting/Export.cpp index 865e50451d..e5ad3ef7f6 100644 --- a/core/libs/prx/libSceAvSetting/Export.cpp +++ b/core/libs/prx/libSceAvSetting/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceAvSetting/include/InventoryExports.hpp" #include "prx/libSceAvSetting/include/Api.hpp" #include #include @@ -649,3 +651,147 @@ int APS5_VABI sceAvSettingWaitCallback() { } } + +extern "C" { + +int APS5_VABI libSceAvSettingUnknown__plus_QkxEV_plus_rZws_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+QkxEV+rZws", libSceAvSettingUnknown__plus_QkxEV_plus_rZws_nid_no_patch); + +int APS5_VABI libSceAvSettingUnknown_0BKuKlQG8zE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0BKuKlQG8zE", libSceAvSettingUnknown_0BKuKlQG8zE_nid_no_patch); + +int APS5_VABI libSceAvSettingUnknown_0mMgouCMXQ4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0mMgouCMXQ4", libSceAvSettingUnknown_0mMgouCMXQ4_nid_no_patch); + +int APS5_VABI libSceAvSettingUnknown_0vwiTglFTz4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0vwiTglFTz4", libSceAvSettingUnknown_0vwiTglFTz4_nid_no_patch); + +int APS5_VABI libSceAvSettingUnknown_7kywfNahIbw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7kywfNahIbw", libSceAvSettingUnknown_7kywfNahIbw_nid_no_patch); + +int APS5_VABI libSceAvSettingUnknown_A143jTEYkNw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("A143jTEYkNw", libSceAvSettingUnknown_A143jTEYkNw_nid_no_patch); + +int APS5_VABI libSceAvSettingUnknown_DtJ45BO7LtY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DtJ45BO7LtY", libSceAvSettingUnknown_DtJ45BO7LtY_nid_no_patch); + +int APS5_VABI libSceAvSettingUnknown_Dxe4ybR_minus_NaM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Dxe4ybR-NaM", libSceAvSettingUnknown_Dxe4ybR_minus_NaM_nid_no_patch); + +int APS5_VABI libSceAvSettingUnknown_GYAho0we28c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GYAho0we28c", libSceAvSettingUnknown_GYAho0we28c_nid_no_patch); + +int APS5_VABI libSceAvSettingUnknown_Iv3zoMND6xU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Iv3zoMND6xU", libSceAvSettingUnknown_Iv3zoMND6xU_nid_no_patch); + +int APS5_VABI libSceAvSettingUnknown_JUxonNYB9xk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JUxonNYB9xk", libSceAvSettingUnknown_JUxonNYB9xk_nid_no_patch); + +int APS5_VABI libSceAvSettingUnknown_JlZQqZOsTMQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JlZQqZOsTMQ", libSceAvSettingUnknown_JlZQqZOsTMQ_nid_no_patch); + +int APS5_VABI libSceAvSettingUnknown_MNZaRdvvdU4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MNZaRdvvdU4", libSceAvSettingUnknown_MNZaRdvvdU4_nid_no_patch); + +int APS5_VABI libSceAvSettingUnknown_V_minus_IcK9eokeE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("V-IcK9eokeE", libSceAvSettingUnknown_V_minus_IcK9eokeE_nid_no_patch); + +int APS5_VABI libSceAvSettingUnknown_bM9VthphLmg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bM9VthphLmg", libSceAvSettingUnknown_bM9VthphLmg_nid_no_patch); + +int APS5_VABI libSceAvSettingUnknown_bXmd6MGBaNI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bXmd6MGBaNI", libSceAvSettingUnknown_bXmd6MGBaNI_nid_no_patch); + +int APS5_VABI libSceAvSettingUnknown_cANt7oF1VsA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cANt7oF1VsA", libSceAvSettingUnknown_cANt7oF1VsA_nid_no_patch); + +int APS5_VABI libSceAvSettingUnknown_cK_plus_dKi9GYYA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cK+dKi9GYYA", libSceAvSettingUnknown_cK_plus_dKi9GYYA_nid_no_patch); + +int APS5_VABI libSceAvSettingUnknown_ftQASJeHi6M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ftQASJeHi6M", libSceAvSettingUnknown_ftQASJeHi6M_nid_no_patch); + +int APS5_VABI libSceAvSettingUnknown_kvYuLJa0CyU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kvYuLJa0CyU", libSceAvSettingUnknown_kvYuLJa0CyU_nid_no_patch); + +int APS5_VABI libSceAvSettingUnknown_m1Wi0Yp38v0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("m1Wi0Yp38v0", libSceAvSettingUnknown_m1Wi0Yp38v0_nid_no_patch); + +int APS5_VABI libSceAvSettingUnknown_mp2s52Yr4pc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mp2s52Yr4pc", libSceAvSettingUnknown_mp2s52Yr4pc_nid_no_patch); + +int APS5_VABI libSceAvSettingUnknown_nWFSNYt07Cw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nWFSNYt07Cw", libSceAvSettingUnknown_nWFSNYt07Cw_nid_no_patch); + +int APS5_VABI libSceAvSettingUnknown_nhvN5B5bvyc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nhvN5B5bvyc", libSceAvSettingUnknown_nhvN5B5bvyc_nid_no_patch); + +int APS5_VABI libSceAvSettingUnknown_osJaW_plus_pc9kw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("osJaW+pc9kw", libSceAvSettingUnknown_osJaW_plus_pc9kw_nid_no_patch); + +int APS5_VABI libSceAvSettingUnknown_s_minus_Egk_plus_i6sAY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("s-Egk+i6sAY", libSceAvSettingUnknown_s_minus_Egk_plus_i6sAY_nid_no_patch); + +int APS5_VABI libSceAvSettingUnknown_tIR02KtiDXw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tIR02KtiDXw", libSceAvSettingUnknown_tIR02KtiDXw_nid_no_patch); + +int APS5_VABI libSceAvSettingUnknown_xVRs9kzSP7I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xVRs9kzSP7I", libSceAvSettingUnknown_xVRs9kzSP7I_nid_no_patch); + +} diff --git a/core/libs/prx/libSceAvSetting/include/InventoryExports.hpp b/core/libs/prx/libSceAvSetting/include/InventoryExports.hpp new file mode 100644 index 0000000000..7dc06a4f6c --- /dev/null +++ b/core/libs/prx/libSceAvSetting/include/InventoryExports.hpp @@ -0,0 +1,36 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceAvSettingUnknown__plus_QkxEV_plus_rZws_nid_no_patch(); +int APS5_VABI libSceAvSettingUnknown_0BKuKlQG8zE_nid_no_patch(); +int APS5_VABI libSceAvSettingUnknown_0mMgouCMXQ4_nid_no_patch(); +int APS5_VABI libSceAvSettingUnknown_0vwiTglFTz4_nid_no_patch(); +int APS5_VABI libSceAvSettingUnknown_7kywfNahIbw_nid_no_patch(); +int APS5_VABI libSceAvSettingUnknown_A143jTEYkNw_nid_no_patch(); +int APS5_VABI libSceAvSettingUnknown_DtJ45BO7LtY_nid_no_patch(); +int APS5_VABI libSceAvSettingUnknown_Dxe4ybR_minus_NaM_nid_no_patch(); +int APS5_VABI libSceAvSettingUnknown_GYAho0we28c_nid_no_patch(); +int APS5_VABI libSceAvSettingUnknown_Iv3zoMND6xU_nid_no_patch(); +int APS5_VABI libSceAvSettingUnknown_JUxonNYB9xk_nid_no_patch(); +int APS5_VABI libSceAvSettingUnknown_JlZQqZOsTMQ_nid_no_patch(); +int APS5_VABI libSceAvSettingUnknown_MNZaRdvvdU4_nid_no_patch(); +int APS5_VABI libSceAvSettingUnknown_V_minus_IcK9eokeE_nid_no_patch(); +int APS5_VABI libSceAvSettingUnknown_bM9VthphLmg_nid_no_patch(); +int APS5_VABI libSceAvSettingUnknown_bXmd6MGBaNI_nid_no_patch(); +int APS5_VABI libSceAvSettingUnknown_cANt7oF1VsA_nid_no_patch(); +int APS5_VABI libSceAvSettingUnknown_cK_plus_dKi9GYYA_nid_no_patch(); +int APS5_VABI libSceAvSettingUnknown_ftQASJeHi6M_nid_no_patch(); +int APS5_VABI libSceAvSettingUnknown_kvYuLJa0CyU_nid_no_patch(); +int APS5_VABI libSceAvSettingUnknown_m1Wi0Yp38v0_nid_no_patch(); +int APS5_VABI libSceAvSettingUnknown_mp2s52Yr4pc_nid_no_patch(); +int APS5_VABI libSceAvSettingUnknown_nWFSNYt07Cw_nid_no_patch(); +int APS5_VABI libSceAvSettingUnknown_nhvN5B5bvyc_nid_no_patch(); +int APS5_VABI libSceAvSettingUnknown_osJaW_plus_pc9kw_nid_no_patch(); +int APS5_VABI libSceAvSettingUnknown_s_minus_Egk_plus_i6sAY_nid_no_patch(); +int APS5_VABI libSceAvSettingUnknown_tIR02KtiDXw_nid_no_patch(); +int APS5_VABI libSceAvSettingUnknown_xVRs9kzSP7I_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceAvSetting/libSceAvSetting.hpp b/core/libs/prx/libSceAvSetting/libSceAvSetting.hpp index 76b2b29473..2f369de999 100644 --- a/core/libs/prx/libSceAvSetting/libSceAvSetting.hpp +++ b/core/libs/prx/libSceAvSetting/libSceAvSetting.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceAvSetting/include/Api.hpp" +#include "prx/libSceAvSetting/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceAvcap2mvr/Export.cpp b/core/libs/prx/libSceAvcap2mvr/Export.cpp index d81f4a5e32..098d77b5bb 100644 --- a/core/libs/prx/libSceAvcap2mvr/Export.cpp +++ b/core/libs/prx/libSceAvcap2mvr/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceAvcap2mvr/include/InventoryExports.hpp" #include #include #include "SceTypes.hpp" @@ -8,3 +10,72 @@ extern "C" { APS5_DUMMY_FUN } + +extern "C" { + +int APS5_VABI libSceAvcap2mvrUnknown_AVuH0FujF30_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AVuH0FujF30", libSceAvcap2mvrUnknown_AVuH0FujF30_nid_no_patch); + +int APS5_VABI libSceAvcap2mvrUnknown_JgAC1LkbWns_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JgAC1LkbWns", libSceAvcap2mvrUnknown_JgAC1LkbWns_nid_no_patch); + +int APS5_VABI libSceAvcap2mvrUnknown_Kt2IOGEfaFc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Kt2IOGEfaFc", libSceAvcap2mvrUnknown_Kt2IOGEfaFc_nid_no_patch); + +int APS5_VABI libSceAvcap2mvrUnknown_Mq1MuGlr48g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Mq1MuGlr48g", libSceAvcap2mvrUnknown_Mq1MuGlr48g_nid_no_patch); + +int APS5_VABI libSceAvcap2mvrUnknown_QSLdUawhEhg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QSLdUawhEhg", libSceAvcap2mvrUnknown_QSLdUawhEhg_nid_no_patch); + +int APS5_VABI libSceAvcap2mvrUnknown_R5tFB0tMbgY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("R5tFB0tMbgY", libSceAvcap2mvrUnknown_R5tFB0tMbgY_nid_no_patch); + +int APS5_VABI libSceAvcap2mvrUnknown_Tjmx_plus_DOF65c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Tjmx+DOF65c", libSceAvcap2mvrUnknown_Tjmx_plus_DOF65c_nid_no_patch); + +int APS5_VABI libSceAvcap2mvrUnknown_ZMR_plus_Q0NYcmU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZMR+Q0NYcmU", libSceAvcap2mvrUnknown_ZMR_plus_Q0NYcmU_nid_no_patch); + +int APS5_VABI libSceAvcap2mvrUnknown_nPlusHmt9NY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nPlusHmt9NY", libSceAvcap2mvrUnknown_nPlusHmt9NY_nid_no_patch); + +int APS5_VABI libSceAvcap2mvrUnknown_s7aQGkLitBU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("s7aQGkLitBU", libSceAvcap2mvrUnknown_s7aQGkLitBU_nid_no_patch); + +int APS5_VABI libSceAvcap2mvrUnknown_sM27f1nWpCc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sM27f1nWpCc", libSceAvcap2mvrUnknown_sM27f1nWpCc_nid_no_patch); + +int APS5_VABI libSceAvcap2mvrUnknown_tq_minus_PG8QaNDM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tq-PG8QaNDM", libSceAvcap2mvrUnknown_tq_minus_PG8QaNDM_nid_no_patch); + +int APS5_VABI libSceAvcap2mvrUnknown_u4wtg4AegL8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("u4wtg4AegL8", libSceAvcap2mvrUnknown_u4wtg4AegL8_nid_no_patch); + +} diff --git a/core/libs/prx/libSceAvcap2mvr/include/InventoryExports.hpp b/core/libs/prx/libSceAvcap2mvr/include/InventoryExports.hpp new file mode 100644 index 0000000000..146cd85ecd --- /dev/null +++ b/core/libs/prx/libSceAvcap2mvr/include/InventoryExports.hpp @@ -0,0 +1,21 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceAvcap2mvrUnknown_AVuH0FujF30_nid_no_patch(); +int APS5_VABI libSceAvcap2mvrUnknown_JgAC1LkbWns_nid_no_patch(); +int APS5_VABI libSceAvcap2mvrUnknown_Kt2IOGEfaFc_nid_no_patch(); +int APS5_VABI libSceAvcap2mvrUnknown_Mq1MuGlr48g_nid_no_patch(); +int APS5_VABI libSceAvcap2mvrUnknown_QSLdUawhEhg_nid_no_patch(); +int APS5_VABI libSceAvcap2mvrUnknown_R5tFB0tMbgY_nid_no_patch(); +int APS5_VABI libSceAvcap2mvrUnknown_Tjmx_plus_DOF65c_nid_no_patch(); +int APS5_VABI libSceAvcap2mvrUnknown_ZMR_plus_Q0NYcmU_nid_no_patch(); +int APS5_VABI libSceAvcap2mvrUnknown_nPlusHmt9NY_nid_no_patch(); +int APS5_VABI libSceAvcap2mvrUnknown_s7aQGkLitBU_nid_no_patch(); +int APS5_VABI libSceAvcap2mvrUnknown_sM27f1nWpCc_nid_no_patch(); +int APS5_VABI libSceAvcap2mvrUnknown_tq_minus_PG8QaNDM_nid_no_patch(); +int APS5_VABI libSceAvcap2mvrUnknown_u4wtg4AegL8_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceAvcap2mvr/libSceAvcap2mvr.hpp b/core/libs/prx/libSceAvcap2mvr/libSceAvcap2mvr.hpp index 6f70f09bee..dbb05bf78d 100644 --- a/core/libs/prx/libSceAvcap2mvr/libSceAvcap2mvr.hpp +++ b/core/libs/prx/libSceAvcap2mvr/libSceAvcap2mvr.hpp @@ -1 +1,2 @@ #pragma once +#include "prx/libSceAvcap2mvr/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceBemp2sys/Export.cpp b/core/libs/prx/libSceBemp2sys/Export.cpp index 94f4dd4563..072a28cede 100644 --- a/core/libs/prx/libSceBemp2sys/Export.cpp +++ b/core/libs/prx/libSceBemp2sys/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceBemp2sys/include/InventoryExports.hpp" #include "prx/libSceBemp2sys/include/Api.hpp" #include #include @@ -163,3 +165,17 @@ int APS5_VABI bemp2sys_tsfilter_sendmessage_nid_postfix(void) { } } + +extern "C" { + +int APS5_VABI libSceBemp2sysUnknown_1L1WwRMiys8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1L1WwRMiys8", libSceBemp2sysUnknown_1L1WwRMiys8_nid_no_patch); + +int APS5_VABI libSceBemp2sysUnknown_B1nK_plus_wb5rME_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("B1nK+wb5rME", libSceBemp2sysUnknown_B1nK_plus_wb5rME_nid_no_patch); + +} diff --git a/core/libs/prx/libSceBemp2sys/include/InventoryExports.hpp b/core/libs/prx/libSceBemp2sys/include/InventoryExports.hpp new file mode 100644 index 0000000000..a4979a1d9b --- /dev/null +++ b/core/libs/prx/libSceBemp2sys/include/InventoryExports.hpp @@ -0,0 +1,10 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceBemp2sysUnknown_1L1WwRMiys8_nid_no_patch(); +int APS5_VABI libSceBemp2sysUnknown_B1nK_plus_wb5rME_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceBemp2sys/libSceBemp2sys.hpp b/core/libs/prx/libSceBemp2sys/libSceBemp2sys.hpp index 23c390341f..e5dd2b177e 100644 --- a/core/libs/prx/libSceBemp2sys/libSceBemp2sys.hpp +++ b/core/libs/prx/libSceBemp2sys/libSceBemp2sys.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceBemp2sys/include/Api.hpp" +#include "prx/libSceBemp2sys/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceBgft/Export.cpp b/core/libs/prx/libSceBgft/Export.cpp index 422771488d..1b656aa87c 100644 --- a/core/libs/prx/libSceBgft/Export.cpp +++ b/core/libs/prx/libSceBgft/Export.cpp @@ -1,3 +1,4 @@ +#include "prx/libSceBgft/include/LegacyExports.hpp" #include "prx/libc/include/general/ExportMacros.hpp" #include "prx/libSceBgft/include/InventoryExports.hpp" #include "prx/libSceBgft/include/Api.hpp" @@ -478,3 +479,17 @@ int APS5_VABI libSceBgftUnknown_tBOVSvi9EjY_nid_no_patch() { APS5_EXPORT("tBOVSvi9EjY", libSceBgftUnknown_tBOVSvi9EjY_nid_no_patch); } + +extern "C" { + +int APS5_VABI bgftLegacyUnknown_fuesi13BbWE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fuesi13BbWE", bgftLegacyUnknown_fuesi13BbWE_nid_no_patch); + +int APS5_VABI bgftLegacyUnknown_tmiwomV8oXU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tmiwomV8oXU", bgftLegacyUnknown_tmiwomV8oXU_nid_no_patch); + +} diff --git a/core/libs/prx/libSceBgft/include/LegacyExports.hpp b/core/libs/prx/libSceBgft/include/LegacyExports.hpp new file mode 100644 index 0000000000..610153426a --- /dev/null +++ b/core/libs/prx/libSceBgft/include/LegacyExports.hpp @@ -0,0 +1,10 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI bgftLegacyUnknown_fuesi13BbWE_nid_no_patch(); +int APS5_VABI bgftLegacyUnknown_tmiwomV8oXU_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceBgft/libSceBgft.hpp b/core/libs/prx/libSceBgft/libSceBgft.hpp index 637dd6d2f7..ca58d9687e 100644 --- a/core/libs/prx/libSceBgft/libSceBgft.hpp +++ b/core/libs/prx/libSceBgft/libSceBgft.hpp @@ -2,3 +2,4 @@ #include "prx/libSceBgft/include/Api.hpp" #include "prx/libSceBgft/include/InventoryExports.hpp" +#include "prx/libSceBgft/include/LegacyExports.hpp" diff --git a/core/libs/prx/libSceBgsStorage/Export.cpp b/core/libs/prx/libSceBgsStorage/Export.cpp index d81f4a5e32..8621dcfbcb 100644 --- a/core/libs/prx/libSceBgsStorage/Export.cpp +++ b/core/libs/prx/libSceBgsStorage/Export.cpp @@ -1,3 +1,6 @@ +#include "prx/libSceBgsStorage/include/LegacyExports.hpp" +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceBgsStorage/include/InventoryExports.hpp" #include #include #include "SceTypes.hpp" @@ -8,3 +11,96 @@ extern "C" { APS5_DUMMY_FUN } + +extern "C" { + +int APS5_VABI libSceBgsStorageUnknown_BauWWA9gkBc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BauWWA9gkBc", libSceBgsStorageUnknown_BauWWA9gkBc_nid_no_patch); + +int APS5_VABI libSceBgsStorageUnknown_JK67MBtUF5A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JK67MBtUF5A", libSceBgsStorageUnknown_JK67MBtUF5A_nid_no_patch); + +int APS5_VABI libSceBgsStorageUnknown_PQqTvPT8G2E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PQqTvPT8G2E", libSceBgsStorageUnknown_PQqTvPT8G2E_nid_no_patch); + +int APS5_VABI libSceBgsStorageUnknown_kS74ICPn0MQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kS74ICPn0MQ", libSceBgsStorageUnknown_kS74ICPn0MQ_nid_no_patch); + +int APS5_VABI libSceBgsStorageUnknown_mTm6O2Zjiak_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mTm6O2Zjiak", libSceBgsStorageUnknown_mTm6O2Zjiak_nid_no_patch); + +} + +extern "C" { + +int APS5_VABI bgsStorageLegacyUnknown_2jhIwp44HLs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2jhIwp44HLs", bgsStorageLegacyUnknown_2jhIwp44HLs_nid_no_patch); + +int APS5_VABI bgsStorageLegacyUnknown_40CYAu5xSh4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("40CYAu5xSh4", bgsStorageLegacyUnknown_40CYAu5xSh4_nid_no_patch); + +int APS5_VABI bgsStorageLegacyUnknown_5GiiauJT87Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5GiiauJT87Q", bgsStorageLegacyUnknown_5GiiauJT87Q_nid_no_patch); + +int APS5_VABI bgsStorageLegacyUnknown_BD5wCFYcXKs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BD5wCFYcXKs", bgsStorageLegacyUnknown_BD5wCFYcXKs_nid_no_patch); + +int APS5_VABI bgsStorageLegacyUnknown_C3LOXcpeDRk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("C3LOXcpeDRk", bgsStorageLegacyUnknown_C3LOXcpeDRk_nid_no_patch); + +int APS5_VABI bgsStorageLegacyUnknown_FMDgC1Y8kGc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FMDgC1Y8kGc", bgsStorageLegacyUnknown_FMDgC1Y8kGc_nid_no_patch); + +int APS5_VABI bgsStorageLegacyUnknown_FMzg32vgtD8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FMzg32vgtD8", bgsStorageLegacyUnknown_FMzg32vgtD8_nid_no_patch); + +int APS5_VABI bgsStorageLegacyUnknown_L1lmQDSeYU8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("L1lmQDSeYU8", bgsStorageLegacyUnknown_L1lmQDSeYU8_nid_no_patch); + +int APS5_VABI bgsStorageLegacyUnknown_PAXTtEXpfeo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PAXTtEXpfeo", bgsStorageLegacyUnknown_PAXTtEXpfeo_nid_no_patch); + +int APS5_VABI bgsStorageLegacyUnknown_hV1GHcoRNL0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hV1GHcoRNL0", bgsStorageLegacyUnknown_hV1GHcoRNL0_nid_no_patch); + +int APS5_VABI bgsStorageLegacyUnknown_j4C7FEFohO4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("j4C7FEFohO4", bgsStorageLegacyUnknown_j4C7FEFohO4_nid_no_patch); + +int APS5_VABI bgsStorageLegacyUnknown_ttm4oYz6IXs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ttm4oYz6IXs", bgsStorageLegacyUnknown_ttm4oYz6IXs_nid_no_patch); + +} diff --git a/core/libs/prx/libSceBgsStorage/include/InventoryExports.hpp b/core/libs/prx/libSceBgsStorage/include/InventoryExports.hpp new file mode 100644 index 0000000000..12c1ad3196 --- /dev/null +++ b/core/libs/prx/libSceBgsStorage/include/InventoryExports.hpp @@ -0,0 +1,13 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceBgsStorageUnknown_BauWWA9gkBc_nid_no_patch(); +int APS5_VABI libSceBgsStorageUnknown_JK67MBtUF5A_nid_no_patch(); +int APS5_VABI libSceBgsStorageUnknown_PQqTvPT8G2E_nid_no_patch(); +int APS5_VABI libSceBgsStorageUnknown_kS74ICPn0MQ_nid_no_patch(); +int APS5_VABI libSceBgsStorageUnknown_mTm6O2Zjiak_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceBgsStorage/include/LegacyExports.hpp b/core/libs/prx/libSceBgsStorage/include/LegacyExports.hpp new file mode 100644 index 0000000000..f19404611c --- /dev/null +++ b/core/libs/prx/libSceBgsStorage/include/LegacyExports.hpp @@ -0,0 +1,20 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI bgsStorageLegacyUnknown_2jhIwp44HLs_nid_no_patch(); +int APS5_VABI bgsStorageLegacyUnknown_40CYAu5xSh4_nid_no_patch(); +int APS5_VABI bgsStorageLegacyUnknown_5GiiauJT87Q_nid_no_patch(); +int APS5_VABI bgsStorageLegacyUnknown_BD5wCFYcXKs_nid_no_patch(); +int APS5_VABI bgsStorageLegacyUnknown_C3LOXcpeDRk_nid_no_patch(); +int APS5_VABI bgsStorageLegacyUnknown_FMDgC1Y8kGc_nid_no_patch(); +int APS5_VABI bgsStorageLegacyUnknown_FMzg32vgtD8_nid_no_patch(); +int APS5_VABI bgsStorageLegacyUnknown_L1lmQDSeYU8_nid_no_patch(); +int APS5_VABI bgsStorageLegacyUnknown_PAXTtEXpfeo_nid_no_patch(); +int APS5_VABI bgsStorageLegacyUnknown_hV1GHcoRNL0_nid_no_patch(); +int APS5_VABI bgsStorageLegacyUnknown_j4C7FEFohO4_nid_no_patch(); +int APS5_VABI bgsStorageLegacyUnknown_ttm4oYz6IXs_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceBgsStorage/libSceBgsStorage.hpp b/core/libs/prx/libSceBgsStorage/libSceBgsStorage.hpp index 6f70f09bee..a5cc589431 100644 --- a/core/libs/prx/libSceBgsStorage/libSceBgsStorage.hpp +++ b/core/libs/prx/libSceBgsStorage/libSceBgsStorage.hpp @@ -1 +1,3 @@ #pragma once +#include "prx/libSceBgsStorage/include/InventoryExports.hpp" +#include "prx/libSceBgsStorage/include/LegacyExports.hpp" diff --git a/core/libs/prx/libSceCamera/InventoryExports.cpp b/core/libs/prx/libSceCamera/InventoryExports.cpp index b1c2398d5f..ac3dc38eee 100644 --- a/core/libs/prx/libSceCamera/InventoryExports.cpp +++ b/core/libs/prx/libSceCamera/InventoryExports.cpp @@ -1,3 +1,4 @@ +#include "prx/libc/include/general/ExportMacros.hpp" #include "prx/libSceCamera/include/InventoryExports.hpp" #include "prx/libc/include/General.hpp" @@ -24,3 +25,22 @@ int APS5_VABI sceCameraIsVrCaptureEnable() { } } + +extern "C" { + +int APS5_VABI libSceCameraUnknown_AnqFx_minus_nAxZM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AnqFx-nAxZM", libSceCameraUnknown_AnqFx_minus_nAxZM_nid_no_patch); + +int APS5_VABI libSceCameraUnknown_azeU8qML4VM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("azeU8qML4VM", libSceCameraUnknown_azeU8qML4VM_nid_no_patch); + +int APS5_VABI libSceCameraUnknown_kgRnfleNYNo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kgRnfleNYNo", libSceCameraUnknown_kgRnfleNYNo_nid_no_patch); + +} diff --git a/core/libs/prx/libSceCamera/include/InventoryExports.hpp b/core/libs/prx/libSceCamera/include/InventoryExports.hpp index bd834e7a13..28e0b990ae 100644 --- a/core/libs/prx/libSceCamera/include/InventoryExports.hpp +++ b/core/libs/prx/libSceCamera/include/InventoryExports.hpp @@ -11,3 +11,9 @@ int APS5_VABI sceCameraSetForceDriverMode(); int APS5_VABI sceCameraIsVrCaptureEnable(); } + +extern "C" { +int APS5_VABI libSceCameraUnknown_AnqFx_minus_nAxZM_nid_no_patch(); +int APS5_VABI libSceCameraUnknown_azeU8qML4VM_nid_no_patch(); +int APS5_VABI libSceCameraUnknown_kgRnfleNYNo_nid_no_patch(); +} diff --git a/core/libs/prx/libSceCdlgAdIdClient/Export.cpp b/core/libs/prx/libSceCdlgAdIdClient/Export.cpp new file mode 100644 index 0000000000..aa49a128b9 --- /dev/null +++ b/core/libs/prx/libSceCdlgAdIdClient/Export.cpp @@ -0,0 +1,51 @@ +#include "prx/libSceCdlgAdIdClient/include/Api.hpp" +#include +#include +#include "SceTypes.hpp" +#include "prx/libc/include/General.hpp" + +extern "C" { + +APS5_EXPORT("Lx1FeCVnfo8", sceCdlgAdIdClientUnknown00); +int APS5_VABI sceCdlgAdIdClientUnknown00(void) { + NotImplemented_nid_no_patch("Lx1FeCVnfo8"); + return 0; +} + +APS5_EXPORT("IdatGKppXCA", sceCdlgAdIdClientUnknown01); +int APS5_VABI sceCdlgAdIdClientUnknown01(void) { + NotImplemented_nid_no_patch("IdatGKppXCA"); + return 0; +} + +APS5_EXPORT("YlO3Zs7q+20", sceCdlgAdIdClientUnknown02); +int APS5_VABI sceCdlgAdIdClientUnknown02(void) { + NotImplemented_nid_no_patch("YlO3Zs7q+20"); + return 0; +} + +APS5_EXPORT("cOw39NTIbU0", sceCdlgAdIdClientUnknown03); +int APS5_VABI sceCdlgAdIdClientUnknown03(void) { + NotImplemented_nid_no_patch("cOw39NTIbU0"); + return 0; +} + +APS5_EXPORT("Z-mCvugj6Ro", sceCdlgAdIdClientUnknown04); +int APS5_VABI sceCdlgAdIdClientUnknown04(void) { + NotImplemented_nid_no_patch("Z-mCvugj6Ro"); + return 0; +} + +APS5_EXPORT("wZXR0qW+WLc", sceCdlgAdIdClientUnknown05); +int APS5_VABI sceCdlgAdIdClientUnknown05(void) { + NotImplemented_nid_no_patch("wZXR0qW+WLc"); + return 0; +} + +APS5_EXPORT("k6OlIkZWsec", sceCdlgAdIdClientUnknown06); +int APS5_VABI sceCdlgAdIdClientUnknown06(void) { + NotImplemented_nid_no_patch("k6OlIkZWsec"); + return 0; +} + +} diff --git a/core/libs/prx/libSceCdlgAdIdClient/include/Api.hpp b/core/libs/prx/libSceCdlgAdIdClient/include/Api.hpp new file mode 100644 index 0000000000..6e2048b0e9 --- /dev/null +++ b/core/libs/prx/libSceCdlgAdIdClient/include/Api.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI sceCdlgAdIdClientUnknown00(void); +int APS5_VABI sceCdlgAdIdClientUnknown01(void); +int APS5_VABI sceCdlgAdIdClientUnknown02(void); +int APS5_VABI sceCdlgAdIdClientUnknown03(void); +int APS5_VABI sceCdlgAdIdClientUnknown04(void); +int APS5_VABI sceCdlgAdIdClientUnknown05(void); +int APS5_VABI sceCdlgAdIdClientUnknown06(void); + +} diff --git a/core/libs/prx/libSceCdlgAdIdClient/libSceCdlgAdIdClient.hpp b/core/libs/prx/libSceCdlgAdIdClient/libSceCdlgAdIdClient.hpp new file mode 100644 index 0000000000..abf61d0ea0 --- /dev/null +++ b/core/libs/prx/libSceCdlgAdIdClient/libSceCdlgAdIdClient.hpp @@ -0,0 +1,3 @@ +#pragma once + +#include "prx/libSceCdlgAdIdClient/include/Api.hpp" diff --git a/core/libs/prx/libSceCdlgUtilServer/Export.cpp b/core/libs/prx/libSceCdlgUtilServer/Export.cpp index 25cb1446d7..75b7d8a7dc 100644 --- a/core/libs/prx/libSceCdlgUtilServer/Export.cpp +++ b/core/libs/prx/libSceCdlgUtilServer/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceCdlgUtilServer/include/InventoryExports.hpp" #include "prx/libSceCdlgUtilServer/include/Api.hpp" #include #include @@ -62,3 +64,167 @@ int APS5_VABI _ZNK3sce16CommonDialogUtil6Server14getServerStateEv() { } } + +extern "C" { + +int APS5_VABI libSceCdlgUtilServerUnknown_1IzIqsh2lVE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1IzIqsh2lVE", libSceCdlgUtilServerUnknown_1IzIqsh2lVE_nid_no_patch); + +int APS5_VABI libSceCdlgUtilServerUnknown_2pswOa0ZQoQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2pswOa0ZQoQ", libSceCdlgUtilServerUnknown_2pswOa0ZQoQ_nid_no_patch); + +int APS5_VABI libSceCdlgUtilServerUnknown_33zrWSbHxcI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("33zrWSbHxcI", libSceCdlgUtilServerUnknown_33zrWSbHxcI_nid_no_patch); + +int APS5_VABI libSceCdlgUtilServerUnknown_56KPLy5Uc_minus_w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("56KPLy5Uc-w", libSceCdlgUtilServerUnknown_56KPLy5Uc_minus_w_nid_no_patch); + +int APS5_VABI libSceCdlgUtilServerUnknown_CK_minus_7W3zhCjk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CK-7W3zhCjk", libSceCdlgUtilServerUnknown_CK_minus_7W3zhCjk_nid_no_patch); + +int APS5_VABI libSceCdlgUtilServerUnknown_Dv1KWHTwGeM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Dv1KWHTwGeM", libSceCdlgUtilServerUnknown_Dv1KWHTwGeM_nid_no_patch); + +int APS5_VABI libSceCdlgUtilServerUnknown_KaTogANOP6U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KaTogANOP6U", libSceCdlgUtilServerUnknown_KaTogANOP6U_nid_no_patch); + +int APS5_VABI libSceCdlgUtilServerUnknown_MQDTRLwdnrU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MQDTRLwdnrU", libSceCdlgUtilServerUnknown_MQDTRLwdnrU_nid_no_patch); + +int APS5_VABI libSceCdlgUtilServerUnknown_NKhtpQTUjpY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NKhtpQTUjpY", libSceCdlgUtilServerUnknown_NKhtpQTUjpY_nid_no_patch); + +int APS5_VABI libSceCdlgUtilServerUnknown_Pl1B1_plus_pzwLM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Pl1B1+pzwLM", libSceCdlgUtilServerUnknown_Pl1B1_plus_pzwLM_nid_no_patch); + +int APS5_VABI libSceCdlgUtilServerUnknown_RiJYtG8H1Yk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RiJYtG8H1Yk", libSceCdlgUtilServerUnknown_RiJYtG8H1Yk_nid_no_patch); + +int APS5_VABI libSceCdlgUtilServerUnknown_VMUTkgazl40_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VMUTkgazl40", libSceCdlgUtilServerUnknown_VMUTkgazl40_nid_no_patch); + +int APS5_VABI libSceCdlgUtilServerUnknown_VrN0lR_plus_BJyc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VrN0lR+BJyc", libSceCdlgUtilServerUnknown_VrN0lR_plus_BJyc_nid_no_patch); + +int APS5_VABI libSceCdlgUtilServerUnknown_W4zcizD4i3I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("W4zcizD4i3I", libSceCdlgUtilServerUnknown_W4zcizD4i3I_nid_no_patch); + +int APS5_VABI libSceCdlgUtilServerUnknown_WlSxsADNweU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WlSxsADNweU", libSceCdlgUtilServerUnknown_WlSxsADNweU_nid_no_patch); + +int APS5_VABI libSceCdlgUtilServerUnknown_YNi5ipH59bE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YNi5ipH59bE", libSceCdlgUtilServerUnknown_YNi5ipH59bE_nid_no_patch); + +int APS5_VABI libSceCdlgUtilServerUnknown_ZRy0WQp2COs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZRy0WQp2COs", libSceCdlgUtilServerUnknown_ZRy0WQp2COs_nid_no_patch); + +int APS5_VABI libSceCdlgUtilServerUnknown_aFrwE9W9faU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aFrwE9W9faU", libSceCdlgUtilServerUnknown_aFrwE9W9faU_nid_no_patch); + +int APS5_VABI libSceCdlgUtilServerUnknown_aX1ZGnOo9vg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aX1ZGnOo9vg", libSceCdlgUtilServerUnknown_aX1ZGnOo9vg_nid_no_patch); + +int APS5_VABI libSceCdlgUtilServerUnknown_aztojjv0xT0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aztojjv0xT0", libSceCdlgUtilServerUnknown_aztojjv0xT0_nid_no_patch); + +int APS5_VABI libSceCdlgUtilServerUnknown_dQte4n_minus_nQlg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dQte4n-nQlg", libSceCdlgUtilServerUnknown_dQte4n_minus_nQlg_nid_no_patch); + +int APS5_VABI libSceCdlgUtilServerUnknown_e3l9WkmIjyw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("e3l9WkmIjyw", libSceCdlgUtilServerUnknown_e3l9WkmIjyw_nid_no_patch); + +int APS5_VABI libSceCdlgUtilServerUnknown_ht7qLD4xIAU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ht7qLD4xIAU", libSceCdlgUtilServerUnknown_ht7qLD4xIAU_nid_no_patch); + +int APS5_VABI libSceCdlgUtilServerUnknown_j6vGxXgVnCQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("j6vGxXgVnCQ", libSceCdlgUtilServerUnknown_j6vGxXgVnCQ_nid_no_patch); + +int APS5_VABI libSceCdlgUtilServerUnknown_k9wR_plus_1LoaoU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("k9wR+1LoaoU", libSceCdlgUtilServerUnknown_k9wR_plus_1LoaoU_nid_no_patch); + +int APS5_VABI libSceCdlgUtilServerUnknown_lhSjnuF2bzg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lhSjnuF2bzg", libSceCdlgUtilServerUnknown_lhSjnuF2bzg_nid_no_patch); + +int APS5_VABI libSceCdlgUtilServerUnknown_mCWvwveN2gM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mCWvwveN2gM", libSceCdlgUtilServerUnknown_mCWvwveN2gM_nid_no_patch); + +int APS5_VABI libSceCdlgUtilServerUnknown_qFygU3yA0HE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qFygU3yA0HE", libSceCdlgUtilServerUnknown_qFygU3yA0HE_nid_no_patch); + +int APS5_VABI libSceCdlgUtilServerUnknown_ucY3L5rXqjs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ucY3L5rXqjs", libSceCdlgUtilServerUnknown_ucY3L5rXqjs_nid_no_patch); + +int APS5_VABI libSceCdlgUtilServerUnknown_vfUweaM01gw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vfUweaM01gw", libSceCdlgUtilServerUnknown_vfUweaM01gw_nid_no_patch); + +int APS5_VABI libSceCdlgUtilServerUnknown_yPspG9QpJK4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yPspG9QpJK4", libSceCdlgUtilServerUnknown_yPspG9QpJK4_nid_no_patch); + +int APS5_VABI libSceCdlgUtilServerUnknown_zjj3moy7KpM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zjj3moy7KpM", libSceCdlgUtilServerUnknown_zjj3moy7KpM_nid_no_patch); + +} diff --git a/core/libs/prx/libSceCdlgUtilServer/include/InventoryExports.hpp b/core/libs/prx/libSceCdlgUtilServer/include/InventoryExports.hpp new file mode 100644 index 0000000000..950a09c447 --- /dev/null +++ b/core/libs/prx/libSceCdlgUtilServer/include/InventoryExports.hpp @@ -0,0 +1,40 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceCdlgUtilServerUnknown_1IzIqsh2lVE_nid_no_patch(); +int APS5_VABI libSceCdlgUtilServerUnknown_2pswOa0ZQoQ_nid_no_patch(); +int APS5_VABI libSceCdlgUtilServerUnknown_33zrWSbHxcI_nid_no_patch(); +int APS5_VABI libSceCdlgUtilServerUnknown_56KPLy5Uc_minus_w_nid_no_patch(); +int APS5_VABI libSceCdlgUtilServerUnknown_CK_minus_7W3zhCjk_nid_no_patch(); +int APS5_VABI libSceCdlgUtilServerUnknown_Dv1KWHTwGeM_nid_no_patch(); +int APS5_VABI libSceCdlgUtilServerUnknown_KaTogANOP6U_nid_no_patch(); +int APS5_VABI libSceCdlgUtilServerUnknown_MQDTRLwdnrU_nid_no_patch(); +int APS5_VABI libSceCdlgUtilServerUnknown_NKhtpQTUjpY_nid_no_patch(); +int APS5_VABI libSceCdlgUtilServerUnknown_Pl1B1_plus_pzwLM_nid_no_patch(); +int APS5_VABI libSceCdlgUtilServerUnknown_RiJYtG8H1Yk_nid_no_patch(); +int APS5_VABI libSceCdlgUtilServerUnknown_VMUTkgazl40_nid_no_patch(); +int APS5_VABI libSceCdlgUtilServerUnknown_VrN0lR_plus_BJyc_nid_no_patch(); +int APS5_VABI libSceCdlgUtilServerUnknown_W4zcizD4i3I_nid_no_patch(); +int APS5_VABI libSceCdlgUtilServerUnknown_WlSxsADNweU_nid_no_patch(); +int APS5_VABI libSceCdlgUtilServerUnknown_YNi5ipH59bE_nid_no_patch(); +int APS5_VABI libSceCdlgUtilServerUnknown_ZRy0WQp2COs_nid_no_patch(); +int APS5_VABI libSceCdlgUtilServerUnknown_aFrwE9W9faU_nid_no_patch(); +int APS5_VABI libSceCdlgUtilServerUnknown_aX1ZGnOo9vg_nid_no_patch(); +int APS5_VABI libSceCdlgUtilServerUnknown_aztojjv0xT0_nid_no_patch(); +int APS5_VABI libSceCdlgUtilServerUnknown_dQte4n_minus_nQlg_nid_no_patch(); +int APS5_VABI libSceCdlgUtilServerUnknown_e3l9WkmIjyw_nid_no_patch(); +int APS5_VABI libSceCdlgUtilServerUnknown_ht7qLD4xIAU_nid_no_patch(); +int APS5_VABI libSceCdlgUtilServerUnknown_j6vGxXgVnCQ_nid_no_patch(); +int APS5_VABI libSceCdlgUtilServerUnknown_k9wR_plus_1LoaoU_nid_no_patch(); +int APS5_VABI libSceCdlgUtilServerUnknown_lhSjnuF2bzg_nid_no_patch(); +int APS5_VABI libSceCdlgUtilServerUnknown_mCWvwveN2gM_nid_no_patch(); +int APS5_VABI libSceCdlgUtilServerUnknown_qFygU3yA0HE_nid_no_patch(); +int APS5_VABI libSceCdlgUtilServerUnknown_ucY3L5rXqjs_nid_no_patch(); +int APS5_VABI libSceCdlgUtilServerUnknown_vfUweaM01gw_nid_no_patch(); +int APS5_VABI libSceCdlgUtilServerUnknown_yPspG9QpJK4_nid_no_patch(); +int APS5_VABI libSceCdlgUtilServerUnknown_zjj3moy7KpM_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceCdlgUtilServer/libSceCdlgUtilServer.hpp b/core/libs/prx/libSceCdlgUtilServer/libSceCdlgUtilServer.hpp index 29b94d8e37..93ed41ac0d 100644 --- a/core/libs/prx/libSceCdlgUtilServer/libSceCdlgUtilServer.hpp +++ b/core/libs/prx/libSceCdlgUtilServer/libSceCdlgUtilServer.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceCdlgUtilServer/include/Api.hpp" +#include "prx/libSceCdlgUtilServer/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceCffMgr/Export.cpp b/core/libs/prx/libSceCffMgr/Export.cpp new file mode 100644 index 0000000000..2efb2e198e --- /dev/null +++ b/core/libs/prx/libSceCffMgr/Export.cpp @@ -0,0 +1,86 @@ +#include "prx/libSceCffMgr/include/Api.hpp" +#include +#include +#include "SceTypes.hpp" +#include "prx/libc/include/General.hpp" + +extern "C" { + +int APS5_VABI sceConsoleFeatureFlagManagerIsOn(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceConsoleFeatureFlagManagerSetOn(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("0ihbCSHhEcA", sceCffMgrUnknown00); +int APS5_VABI sceCffMgrUnknown00(void) { + NotImplemented_nid_no_patch("0ihbCSHhEcA"); + return 0; +} + +int APS5_VABI sceConsoleFeatureFlagManagerIsWaitingReboot(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceConsoleFeatureFlagManagerGetVersion(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("zIlUE+nGqAc", sceCffMgrUnknown01); +int APS5_VABI sceCffMgrUnknown01(void) { + NotImplemented_nid_no_patch("zIlUE+nGqAc"); + return 0; +} + +int APS5_VABI sceConsoleFeatureFlagManagerEventOpen(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceConsoleFeatureFlagManagerEventClose(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("jIZSSBRMMlI", sceCffMgrUnknown02); +int APS5_VABI sceCffMgrUnknown02(void) { + NotImplemented_nid_no_patch("jIZSSBRMMlI"); + return 0; +} + +APS5_EXPORT("4iNzTMzx1iU", sceCffMgrUnknown03); +int APS5_VABI sceCffMgrUnknown03(void) { + NotImplemented_nid_no_patch("4iNzTMzx1iU"); + return 0; +} + +APS5_EXPORT("T8mAs5dG-4Q", sceCffMgrUnknown04); +int APS5_VABI sceCffMgrUnknown04(void) { + NotImplemented_nid_no_patch("T8mAs5dG-4Q"); + return 0; +} + +APS5_EXPORT("fbOF9VQ0NFs", sceCffMgrUnknown05); +int APS5_VABI sceCffMgrUnknown05(void) { + NotImplemented_nid_no_patch("fbOF9VQ0NFs"); + return 0; +} + +APS5_EXPORT("nJwIWgJx8vw", sceCffMgrUnknown06); +int APS5_VABI sceCffMgrUnknown06(void) { + NotImplemented_nid_no_patch("nJwIWgJx8vw"); + return 0; +} + +int APS5_VABI sceConsoleFeatureFlagManagerDebugInit(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +} diff --git a/core/libs/prx/libSceCffMgr/include/Api.hpp b/core/libs/prx/libSceCffMgr/include/Api.hpp new file mode 100644 index 0000000000..bd74407b0d --- /dev/null +++ b/core/libs/prx/libSceCffMgr/include/Api.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI sceConsoleFeatureFlagManagerIsOn(void); +int APS5_VABI sceConsoleFeatureFlagManagerSetOn(void); +int APS5_VABI sceCffMgrUnknown00(void); +int APS5_VABI sceConsoleFeatureFlagManagerIsWaitingReboot(void); +int APS5_VABI sceConsoleFeatureFlagManagerGetVersion(void); +int APS5_VABI sceCffMgrUnknown01(void); +int APS5_VABI sceConsoleFeatureFlagManagerEventOpen(void); +int APS5_VABI sceConsoleFeatureFlagManagerEventClose(void); +int APS5_VABI sceCffMgrUnknown02(void); +int APS5_VABI sceCffMgrUnknown03(void); +int APS5_VABI sceCffMgrUnknown04(void); +int APS5_VABI sceCffMgrUnknown05(void); +int APS5_VABI sceCffMgrUnknown06(void); +int APS5_VABI sceConsoleFeatureFlagManagerDebugInit(void); + +} diff --git a/core/libs/prx/libSceCffMgr/libSceCffMgr.hpp b/core/libs/prx/libSceCffMgr/libSceCffMgr.hpp new file mode 100644 index 0000000000..af6b8036b4 --- /dev/null +++ b/core/libs/prx/libSceCffMgr/libSceCffMgr.hpp @@ -0,0 +1,3 @@ +#pragma once + +#include "prx/libSceCffMgr/include/Api.hpp" diff --git a/core/libs/prx/libSceCommonDialog/AdditionalExports.cpp b/core/libs/prx/libSceCommonDialog/AdditionalExports.cpp new file mode 100644 index 0000000000..ece48c5ffc --- /dev/null +++ b/core/libs/prx/libSceCommonDialog/AdditionalExports.cpp @@ -0,0 +1,67 @@ +#include "SceTypes.hpp" +#include "prx/libc/include/General.hpp" +#include "prx/libc/include/general/ExportMacros.hpp" + +extern "C" { + +int APS5_VABI libSceCommonDialogUnknown_8q7icGBWIrA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8q7icGBWIrA", libSceCommonDialogUnknown_8q7icGBWIrA_nid_no_patch); + +int APS5_VABI libSceCommonDialogUnknown_D_minus_V35OhFeIM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("D-V35OhFeIM", libSceCommonDialogUnknown_D_minus_V35OhFeIM_nid_no_patch); + +int APS5_VABI libSceCommonDialogUnknown_QXFsLON5QWw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QXFsLON5QWw", libSceCommonDialogUnknown_QXFsLON5QWw_nid_no_patch); + +int APS5_VABI libSceCommonDialogUnknown_SDpCfY9uB0g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SDpCfY9uB0g", libSceCommonDialogUnknown_SDpCfY9uB0g_nid_no_patch); + +int APS5_VABI libSceCommonDialogUnknown_Zaa6fhiKQDE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Zaa6fhiKQDE", libSceCommonDialogUnknown_Zaa6fhiKQDE_nid_no_patch); + +int APS5_VABI libSceCommonDialogUnknown_aUS4PgJye98_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aUS4PgJye98", libSceCommonDialogUnknown_aUS4PgJye98_nid_no_patch); + +int APS5_VABI libSceCommonDialogUnknown_afLdI6i0lQw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("afLdI6i0lQw", libSceCommonDialogUnknown_afLdI6i0lQw_nid_no_patch); + +int APS5_VABI libSceCommonDialogUnknown_mVRnPerBcK0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mVRnPerBcK0", libSceCommonDialogUnknown_mVRnPerBcK0_nid_no_patch); + +int APS5_VABI libSceCommonDialogUnknown_p9TTq4bLdFU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("p9TTq4bLdFU", libSceCommonDialogUnknown_p9TTq4bLdFU_nid_no_patch); + +int APS5_VABI libSceCommonDialogUnknown_q3_minus_8WWCG2N0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("q3-8WWCG2N0", libSceCommonDialogUnknown_q3_minus_8WWCG2N0_nid_no_patch); + +int APS5_VABI libSceCommonDialogUnknown_txNJzxX6yrA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("txNJzxX6yrA", libSceCommonDialogUnknown_txNJzxX6yrA_nid_no_patch); + +int APS5_VABI libSceCommonDialogUnknown_yxjgDvqUbGQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yxjgDvqUbGQ", libSceCommonDialogUnknown_yxjgDvqUbGQ_nid_no_patch); + +} diff --git a/core/libs/prx/libSceCommonDialog/CMakeLists.txt b/core/libs/prx/libSceCommonDialog/CMakeLists.txt index d3e8c4b64e..b3b6f9bf1b 100644 --- a/core/libs/prx/libSceCommonDialog/CMakeLists.txt +++ b/core/libs/prx/libSceCommonDialog/CMakeLists.txt @@ -1,4 +1,4 @@ -add_library(libSceCommonDialog SHARED EXCLUDE_FROM_ALL Export.cpp InventoryExports.cpp) +add_library(libSceCommonDialog SHARED EXCLUDE_FROM_ALL Export.cpp InventoryExports.cpp AdditionalExports.cpp) target_include_directories(libSceCommonDialog PRIVATE ${LIBS_INCLUDE_DIR}) configure_windows_unwind(libSceCommonDialog) diff --git a/core/libs/prx/libSceContentSearch/Export.cpp b/core/libs/prx/libSceContentSearch/Export.cpp index 3b3229ac06..13c17b161a 100644 --- a/core/libs/prx/libSceContentSearch/Export.cpp +++ b/core/libs/prx/libSceContentSearch/Export.cpp @@ -1,3 +1,4 @@ +#include "prx/libc/include/general/ExportMacros.hpp" #include "prx/libSceContentSearch/include/InventoryExports.hpp" #include "prx/libSceContentSearch/include/Api.hpp" #include @@ -207,3 +208,17 @@ int APS5_VABI sceContentSearchSearchApplication() { } } + +extern "C" { + +int APS5_VABI libSceContentSearchUnknown_Np8cEpyDFRE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Np8cEpyDFRE", libSceContentSearchUnknown_Np8cEpyDFRE_nid_no_patch); + +int APS5_VABI libSceContentSearchUnknown_X9e_plus_hZfue0U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("X9e+hZfue0U", libSceContentSearchUnknown_X9e_plus_hZfue0U_nid_no_patch); + +} diff --git a/core/libs/prx/libSceContentSearch/include/InventoryExports.hpp b/core/libs/prx/libSceContentSearch/include/InventoryExports.hpp index b5a22ec35d..74132697f3 100644 --- a/core/libs/prx/libSceContentSearch/include/InventoryExports.hpp +++ b/core/libs/prx/libSceContentSearch/include/InventoryExports.hpp @@ -9,4 +9,7 @@ int APS5_VABI sceContentSearchDisableAvContentCreatedEvent(); int APS5_VABI sceContentSearchEnableAvContentCreatedEvent(); int APS5_VABI sceContentSearchGetContentIdByAvContentCreatedEvent(); +int APS5_VABI libSceContentSearchUnknown_Np8cEpyDFRE_nid_no_patch(); +int APS5_VABI libSceContentSearchUnknown_X9e_plus_hZfue0U_nid_no_patch(); + } diff --git a/core/libs/prx/libSceCustomMusicCore/Export.cpp b/core/libs/prx/libSceCustomMusicCore/Export.cpp index 65b3aaccac..caab1b9301 100644 --- a/core/libs/prx/libSceCustomMusicCore/Export.cpp +++ b/core/libs/prx/libSceCustomMusicCore/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libSceCustomMusicCore/include/LegacyExports.hpp" +#include "prx/libc/include/general/ExportMacros.hpp" #include "prx/libSceCustomMusicCore/include/Api.hpp" #include #include @@ -97,3 +99,62 @@ int APS5_VABI sceCustomMusicCoreStopOperation() { } } + +extern "C" { + +int APS5_VABI customMusicCoreLegacyUnknown_0ru5GIIA48A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0ru5GIIA48A", customMusicCoreLegacyUnknown_0ru5GIIA48A_nid_no_patch); + +int APS5_VABI customMusicCoreLegacyUnknown_4VoG2aG23vk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4VoG2aG23vk", customMusicCoreLegacyUnknown_4VoG2aG23vk_nid_no_patch); + +int APS5_VABI customMusicCoreLegacyUnknown_CpR56JP5TyY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CpR56JP5TyY", customMusicCoreLegacyUnknown_CpR56JP5TyY_nid_no_patch); + +int APS5_VABI customMusicCoreLegacyUnknown_E5YR9UllJEQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("E5YR9UllJEQ", customMusicCoreLegacyUnknown_E5YR9UllJEQ_nid_no_patch); + +int APS5_VABI customMusicCoreLegacyUnknown_MsrJYWfdHuM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MsrJYWfdHuM", customMusicCoreLegacyUnknown_MsrJYWfdHuM_nid_no_patch); + +int APS5_VABI customMusicCoreLegacyUnknown_O7taiqj_plus_cwY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("O7taiqj+cwY", customMusicCoreLegacyUnknown_O7taiqj_plus_cwY_nid_no_patch); + +int APS5_VABI customMusicCoreLegacyUnknown_Ot1gEtXjGiY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ot1gEtXjGiY", customMusicCoreLegacyUnknown_Ot1gEtXjGiY_nid_no_patch); + +int APS5_VABI customMusicCoreLegacyUnknown_RK5Xmx3UweI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RK5Xmx3UweI", customMusicCoreLegacyUnknown_RK5Xmx3UweI_nid_no_patch); + +int APS5_VABI customMusicCoreLegacyUnknown_XCsw6nkliFI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XCsw6nkliFI", customMusicCoreLegacyUnknown_XCsw6nkliFI_nid_no_patch); + +int APS5_VABI customMusicCoreLegacyUnknown_t34OhNxxE1w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("t34OhNxxE1w", customMusicCoreLegacyUnknown_t34OhNxxE1w_nid_no_patch); + +int APS5_VABI customMusicCoreLegacyUnknown_xrCE3Gpn5E0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xrCE3Gpn5E0", customMusicCoreLegacyUnknown_xrCE3Gpn5E0_nid_no_patch); + +} diff --git a/core/libs/prx/libSceCustomMusicCore/include/LegacyExports.hpp b/core/libs/prx/libSceCustomMusicCore/include/LegacyExports.hpp new file mode 100644 index 0000000000..50d5550704 --- /dev/null +++ b/core/libs/prx/libSceCustomMusicCore/include/LegacyExports.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI customMusicCoreLegacyUnknown_0ru5GIIA48A_nid_no_patch(); +int APS5_VABI customMusicCoreLegacyUnknown_4VoG2aG23vk_nid_no_patch(); +int APS5_VABI customMusicCoreLegacyUnknown_CpR56JP5TyY_nid_no_patch(); +int APS5_VABI customMusicCoreLegacyUnknown_E5YR9UllJEQ_nid_no_patch(); +int APS5_VABI customMusicCoreLegacyUnknown_MsrJYWfdHuM_nid_no_patch(); +int APS5_VABI customMusicCoreLegacyUnknown_O7taiqj_plus_cwY_nid_no_patch(); +int APS5_VABI customMusicCoreLegacyUnknown_Ot1gEtXjGiY_nid_no_patch(); +int APS5_VABI customMusicCoreLegacyUnknown_RK5Xmx3UweI_nid_no_patch(); +int APS5_VABI customMusicCoreLegacyUnknown_XCsw6nkliFI_nid_no_patch(); +int APS5_VABI customMusicCoreLegacyUnknown_t34OhNxxE1w_nid_no_patch(); +int APS5_VABI customMusicCoreLegacyUnknown_xrCE3Gpn5E0_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceCustomMusicCore/libSceCustomMusicCore.hpp b/core/libs/prx/libSceCustomMusicCore/libSceCustomMusicCore.hpp index e7d4cf7206..72de12a3a8 100644 --- a/core/libs/prx/libSceCustomMusicCore/libSceCustomMusicCore.hpp +++ b/core/libs/prx/libSceCustomMusicCore/libSceCustomMusicCore.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceCustomMusicCore/include/Api.hpp" +#include "prx/libSceCustomMusicCore/include/LegacyExports.hpp" diff --git a/core/libs/prx/libSceCustomMusicPlayReady4/CMakeLists.txt b/core/libs/prx/libSceCustomMusicPlayReady4/CMakeLists.txt new file mode 100644 index 0000000000..702fa32c7f --- /dev/null +++ b/core/libs/prx/libSceCustomMusicPlayReady4/CMakeLists.txt @@ -0,0 +1,3 @@ +add_library(libSceCustomMusicPlayReady4 SHARED EXCLUDE_FROM_ALL Export.cpp) +target_include_directories(libSceCustomMusicPlayReady4 PRIVATE ${LIBS_INCLUDE_DIR}) +configure_windows_unwind(libSceCustomMusicPlayReady4) diff --git a/core/libs/prx/libSceCustomMusicPlayReady4/Export.cpp b/core/libs/prx/libSceCustomMusicPlayReady4/Export.cpp new file mode 100644 index 0000000000..c5a9c40f82 --- /dev/null +++ b/core/libs/prx/libSceCustomMusicPlayReady4/Export.cpp @@ -0,0 +1,417 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceCustomMusicPlayReady4/include/Exports.hpp" +#include "prx/libc/include/General.hpp" + +extern "C" { + +int APS5_VABI customMusicPlayReady4LegacyUnknown__plus_NuqyYAx2X0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+NuqyYAx2X0", customMusicPlayReady4LegacyUnknown__plus_NuqyYAx2X0_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown__plus_pkcn9sroRs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+pkcn9sroRs", customMusicPlayReady4LegacyUnknown__plus_pkcn9sroRs_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown__minus_L_plus_RF25Tp_plus_Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-L+RF25Tp+Q", customMusicPlayReady4LegacyUnknown__minus_L_plus_RF25Tp_plus_Q_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_0p2nr6DTns4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0p2nr6DTns4", customMusicPlayReady4LegacyUnknown_0p2nr6DTns4_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_19gH7n14WFE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("19gH7n14WFE", customMusicPlayReady4LegacyUnknown_19gH7n14WFE_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_22PDPuDQG_minus_M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("22PDPuDQG-M", customMusicPlayReady4LegacyUnknown_22PDPuDQG_minus_M_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_2G9_minus_Dn_minus_tsSA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2G9-Dn-tsSA", customMusicPlayReady4LegacyUnknown_2G9_minus_Dn_minus_tsSA_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_3NXC30GzkpE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3NXC30GzkpE", customMusicPlayReady4LegacyUnknown_3NXC30GzkpE_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_3ZSo0WzWH0Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3ZSo0WzWH0Q", customMusicPlayReady4LegacyUnknown_3ZSo0WzWH0Q_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_3f1p8hnCT_minus_E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3f1p8hnCT-E", customMusicPlayReady4LegacyUnknown_3f1p8hnCT_minus_E_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_4ti9Z3f6i5k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4ti9Z3f6i5k", customMusicPlayReady4LegacyUnknown_4ti9Z3f6i5k_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_6rmPEBymtCw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6rmPEBymtCw", customMusicPlayReady4LegacyUnknown_6rmPEBymtCw_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_8Bm7S9Vdc1c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8Bm7S9Vdc1c", customMusicPlayReady4LegacyUnknown_8Bm7S9Vdc1c_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_8PkaYafg_plus_JY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8PkaYafg+JY", customMusicPlayReady4LegacyUnknown_8PkaYafg_plus_JY_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_8bpWr65Gw3M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8bpWr65Gw3M", customMusicPlayReady4LegacyUnknown_8bpWr65Gw3M_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_8wb_plus_q_plus_GlgbM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8wb+q+GlgbM", customMusicPlayReady4LegacyUnknown_8wb_plus_q_plus_GlgbM_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_9Dg_plus_YcRTVy4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9Dg+YcRTVy4", customMusicPlayReady4LegacyUnknown_9Dg_plus_YcRTVy4_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_9T5tJy16kV8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9T5tJy16kV8", customMusicPlayReady4LegacyUnknown_9T5tJy16kV8_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_B67MDDZLP3w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("B67MDDZLP3w", customMusicPlayReady4LegacyUnknown_B67MDDZLP3w_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_EGrgP9DR2FI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EGrgP9DR2FI", customMusicPlayReady4LegacyUnknown_EGrgP9DR2FI_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_GBi7nfZxcxw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GBi7nfZxcxw", customMusicPlayReady4LegacyUnknown_GBi7nfZxcxw_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_H1Cm6TaA_minus_c4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("H1Cm6TaA-c4", customMusicPlayReady4LegacyUnknown_H1Cm6TaA_minus_c4_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_HCgz5p5pO1M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HCgz5p5pO1M", customMusicPlayReady4LegacyUnknown_HCgz5p5pO1M_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_He1EUNsSDT0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("He1EUNsSDT0", customMusicPlayReady4LegacyUnknown_He1EUNsSDT0_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_IoKOXedG_plus_Ok_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IoKOXedG+Ok", customMusicPlayReady4LegacyUnknown_IoKOXedG_plus_Ok_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_LRQY2jsxnJI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LRQY2jsxnJI", customMusicPlayReady4LegacyUnknown_LRQY2jsxnJI_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_MBROhxkvkjs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MBROhxkvkjs", customMusicPlayReady4LegacyUnknown_MBROhxkvkjs_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_Ot1T0TKkYZg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ot1T0TKkYZg", customMusicPlayReady4LegacyUnknown_Ot1T0TKkYZg_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_OtOGIehVSt4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OtOGIehVSt4", customMusicPlayReady4LegacyUnknown_OtOGIehVSt4_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_P7k_plus_0QIqke0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("P7k+0QIqke0", customMusicPlayReady4LegacyUnknown_P7k_plus_0QIqke0_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_Puass3BLcIk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Puass3BLcIk", customMusicPlayReady4LegacyUnknown_Puass3BLcIk_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_QD_plus_E9EybrSc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QD+E9EybrSc", customMusicPlayReady4LegacyUnknown_QD_plus_E9EybrSc_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_QsbHVhJ3xEA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QsbHVhJ3xEA", customMusicPlayReady4LegacyUnknown_QsbHVhJ3xEA_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_R_plus_lU8Vokisk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("R+lU8Vokisk", customMusicPlayReady4LegacyUnknown_R_plus_lU8Vokisk_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_R3woi4ILIsQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("R3woi4ILIsQ", customMusicPlayReady4LegacyUnknown_R3woi4ILIsQ_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_RfHY_minus_Ba2ap4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RfHY-Ba2ap4", customMusicPlayReady4LegacyUnknown_RfHY_minus_Ba2ap4_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_Te5nrRJAxOw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Te5nrRJAxOw", customMusicPlayReady4LegacyUnknown_Te5nrRJAxOw_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_Ubo6V3NmKYc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ubo6V3NmKYc", customMusicPlayReady4LegacyUnknown_Ubo6V3NmKYc_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_UquDHokokVk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UquDHokokVk", customMusicPlayReady4LegacyUnknown_UquDHokokVk_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_VY_minus_v3HGTTMA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VY-v3HGTTMA", customMusicPlayReady4LegacyUnknown_VY_minus_v3HGTTMA_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_VxM1jP5AsbA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VxM1jP5AsbA", customMusicPlayReady4LegacyUnknown_VxM1jP5AsbA_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_W4CCMYydloQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("W4CCMYydloQ", customMusicPlayReady4LegacyUnknown_W4CCMYydloQ_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_WnjQGtO2Zb8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WnjQGtO2Zb8", customMusicPlayReady4LegacyUnknown_WnjQGtO2Zb8_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_WuGl5uZDeRs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WuGl5uZDeRs", customMusicPlayReady4LegacyUnknown_WuGl5uZDeRs_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_XeOVOR20YoQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XeOVOR20YoQ", customMusicPlayReady4LegacyUnknown_XeOVOR20YoQ_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_ZCJ9MHGdy6Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZCJ9MHGdy6Y", customMusicPlayReady4LegacyUnknown_ZCJ9MHGdy6Y_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_ZF9yYeEaQgo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZF9yYeEaQgo", customMusicPlayReady4LegacyUnknown_ZF9yYeEaQgo_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_ZcWzMk9_plus_xCE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZcWzMk9+xCE", customMusicPlayReady4LegacyUnknown_ZcWzMk9_plus_xCE_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_a_minus_t8J_minus__minus_PwCU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("a-t8J--PwCU", customMusicPlayReady4LegacyUnknown_a_minus_t8J_minus__minus_PwCU_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_ai5JotXAbQI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ai5JotXAbQI", customMusicPlayReady4LegacyUnknown_ai5JotXAbQI_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_b8EPlts2i3Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("b8EPlts2i3Q", customMusicPlayReady4LegacyUnknown_b8EPlts2i3Q_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_c7PBSVey838_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("c7PBSVey838", customMusicPlayReady4LegacyUnknown_c7PBSVey838_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_dIGY_minus_SEf1J0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dIGY-SEf1J0", customMusicPlayReady4LegacyUnknown_dIGY_minus_SEf1J0_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_dOj2LWDnVGI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dOj2LWDnVGI", customMusicPlayReady4LegacyUnknown_dOj2LWDnVGI_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_dSrDh1gljnU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dSrDh1gljnU", customMusicPlayReady4LegacyUnknown_dSrDh1gljnU_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_eZI6nOaH3T8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eZI6nOaH3T8", customMusicPlayReady4LegacyUnknown_eZI6nOaH3T8_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_eb6nz6Q91VY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eb6nz6Q91VY", customMusicPlayReady4LegacyUnknown_eb6nz6Q91VY_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_fIb77Jl_minus_8BM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fIb77Jl-8BM", customMusicPlayReady4LegacyUnknown_fIb77Jl_minus_8BM_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_fWaJ_plus_0_minus_ptrg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fWaJ+0-ptrg", customMusicPlayReady4LegacyUnknown_fWaJ_plus_0_minus_ptrg_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_ff7P9skOZr8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ff7P9skOZr8", customMusicPlayReady4LegacyUnknown_ff7P9skOZr8_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_g3r22JvImAM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("g3r22JvImAM", customMusicPlayReady4LegacyUnknown_g3r22JvImAM_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_g9EIY6p97OQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("g9EIY6p97OQ", customMusicPlayReady4LegacyUnknown_g9EIY6p97OQ_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_jVTkCgb0nDk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jVTkCgb0nDk", customMusicPlayReady4LegacyUnknown_jVTkCgb0nDk_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_o3cColUYySI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("o3cColUYySI", customMusicPlayReady4LegacyUnknown_o3cColUYySI_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_odzl7DZarOI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("odzl7DZarOI", customMusicPlayReady4LegacyUnknown_odzl7DZarOI_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_oidw_plus_viysuk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oidw+viysuk", customMusicPlayReady4LegacyUnknown_oidw_plus_viysuk_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_pirbKf6n6mo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pirbKf6n6mo", customMusicPlayReady4LegacyUnknown_pirbKf6n6mo_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_pwX56Tpmq8Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pwX56Tpmq8Q", customMusicPlayReady4LegacyUnknown_pwX56Tpmq8Q_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_q6SSNVt6LAo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("q6SSNVt6LAo", customMusicPlayReady4LegacyUnknown_q6SSNVt6LAo_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_qXdAcP7SjLw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qXdAcP7SjLw", customMusicPlayReady4LegacyUnknown_qXdAcP7SjLw_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_rRIQK67BCB8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rRIQK67BCB8", customMusicPlayReady4LegacyUnknown_rRIQK67BCB8_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_rzZ9pwS94rs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rzZ9pwS94rs", customMusicPlayReady4LegacyUnknown_rzZ9pwS94rs_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_sH7aon3o7j8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sH7aon3o7j8", customMusicPlayReady4LegacyUnknown_sH7aon3o7j8_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_tFvu6lioQ0I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tFvu6lioQ0I", customMusicPlayReady4LegacyUnknown_tFvu6lioQ0I_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_udAxCLwq69I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("udAxCLwq69I", customMusicPlayReady4LegacyUnknown_udAxCLwq69I_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_v1vu4XXyGpw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("v1vu4XXyGpw", customMusicPlayReady4LegacyUnknown_v1vu4XXyGpw_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_vPbUAaGpA2Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vPbUAaGpA2Y", customMusicPlayReady4LegacyUnknown_vPbUAaGpA2Y_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_vVIy1_minus_jnX1c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vVIy1-jnX1c", customMusicPlayReady4LegacyUnknown_vVIy1_minus_jnX1c_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_xVO6g9FpdPA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xVO6g9FpdPA", customMusicPlayReady4LegacyUnknown_xVO6g9FpdPA_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_ywUBF4R77AI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ywUBF4R77AI", customMusicPlayReady4LegacyUnknown_ywUBF4R77AI_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_zxXS_minus_Ka1NyU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zxXS-Ka1NyU", customMusicPlayReady4LegacyUnknown_zxXS_minus_Ka1NyU_nid_no_patch); + +int APS5_VABI customMusicPlayReady4LegacyUnknown_zylPWStirB8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zylPWStirB8", customMusicPlayReady4LegacyUnknown_zylPWStirB8_nid_no_patch); + +} diff --git a/core/libs/prx/libSceCustomMusicPlayReady4/include/Exports.hpp b/core/libs/prx/libSceCustomMusicPlayReady4/include/Exports.hpp new file mode 100644 index 0000000000..d3bd79200f --- /dev/null +++ b/core/libs/prx/libSceCustomMusicPlayReady4/include/Exports.hpp @@ -0,0 +1,90 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI customMusicPlayReady4LegacyUnknown__plus_NuqyYAx2X0_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown__plus_pkcn9sroRs_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown__minus_L_plus_RF25Tp_plus_Q_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_0p2nr6DTns4_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_19gH7n14WFE_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_22PDPuDQG_minus_M_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_2G9_minus_Dn_minus_tsSA_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_3NXC30GzkpE_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_3ZSo0WzWH0Q_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_3f1p8hnCT_minus_E_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_4ti9Z3f6i5k_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_6rmPEBymtCw_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_8Bm7S9Vdc1c_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_8PkaYafg_plus_JY_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_8bpWr65Gw3M_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_8wb_plus_q_plus_GlgbM_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_9Dg_plus_YcRTVy4_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_9T5tJy16kV8_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_B67MDDZLP3w_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_EGrgP9DR2FI_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_GBi7nfZxcxw_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_H1Cm6TaA_minus_c4_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_HCgz5p5pO1M_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_He1EUNsSDT0_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_IoKOXedG_plus_Ok_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_LRQY2jsxnJI_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_MBROhxkvkjs_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_Ot1T0TKkYZg_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_OtOGIehVSt4_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_P7k_plus_0QIqke0_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_Puass3BLcIk_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_QD_plus_E9EybrSc_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_QsbHVhJ3xEA_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_R_plus_lU8Vokisk_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_R3woi4ILIsQ_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_RfHY_minus_Ba2ap4_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_Te5nrRJAxOw_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_Ubo6V3NmKYc_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_UquDHokokVk_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_VY_minus_v3HGTTMA_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_VxM1jP5AsbA_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_W4CCMYydloQ_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_WnjQGtO2Zb8_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_WuGl5uZDeRs_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_XeOVOR20YoQ_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_ZCJ9MHGdy6Y_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_ZF9yYeEaQgo_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_ZcWzMk9_plus_xCE_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_a_minus_t8J_minus__minus_PwCU_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_ai5JotXAbQI_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_b8EPlts2i3Q_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_c7PBSVey838_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_dIGY_minus_SEf1J0_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_dOj2LWDnVGI_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_dSrDh1gljnU_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_eZI6nOaH3T8_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_eb6nz6Q91VY_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_fIb77Jl_minus_8BM_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_fWaJ_plus_0_minus_ptrg_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_ff7P9skOZr8_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_g3r22JvImAM_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_g9EIY6p97OQ_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_jVTkCgb0nDk_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_o3cColUYySI_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_odzl7DZarOI_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_oidw_plus_viysuk_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_pirbKf6n6mo_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_pwX56Tpmq8Q_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_q6SSNVt6LAo_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_qXdAcP7SjLw_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_rRIQK67BCB8_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_rzZ9pwS94rs_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_sH7aon3o7j8_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_tFvu6lioQ0I_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_udAxCLwq69I_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_v1vu4XXyGpw_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_vPbUAaGpA2Y_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_vVIy1_minus_jnX1c_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_xVO6g9FpdPA_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_ywUBF4R77AI_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_zxXS_minus_Ka1NyU_nid_no_patch(); +int APS5_VABI customMusicPlayReady4LegacyUnknown_zylPWStirB8_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceCustomMusicPlayReady4/libSceCustomMusicPlayReady4.hpp b/core/libs/prx/libSceCustomMusicPlayReady4/libSceCustomMusicPlayReady4.hpp new file mode 100644 index 0000000000..e88e4a62fc --- /dev/null +++ b/core/libs/prx/libSceCustomMusicPlayReady4/libSceCustomMusicPlayReady4.hpp @@ -0,0 +1,3 @@ +#pragma once + +#include "prx/libSceCustomMusicPlayReady4/include/Exports.hpp" diff --git a/core/libs/prx/libSceDataTransfer/Export.cpp b/core/libs/prx/libSceDataTransfer/Export.cpp index de391cedc7..a67cc5bff3 100644 --- a/core/libs/prx/libSceDataTransfer/Export.cpp +++ b/core/libs/prx/libSceDataTransfer/Export.cpp @@ -419,3 +419,17 @@ int APS5_VABI sceDataTransferRequestTransferTimePS5() { } } + +extern "C" { + +int APS5_VABI sceDataTransferEventIsAuthReady() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceDataTransferEventIsPwrReqReady() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +} diff --git a/core/libs/prx/libSceDataTransfer/include/Api.hpp b/core/libs/prx/libSceDataTransfer/include/Api.hpp index c9a7cb7a78..a954ad8f9e 100644 --- a/core/libs/prx/libSceDataTransfer/include/Api.hpp +++ b/core/libs/prx/libSceDataTransfer/include/Api.hpp @@ -71,6 +71,8 @@ int APS5_VABI sceDataTransferAbortLaunchPS5(); int APS5_VABI sceDataTransferAbortPS5Request(); int APS5_VABI sceDataTransferAbortRequestBeforeFgTransferPS5(); int APS5_VABI sceDataTransferAbortSearchPS5(); +int APS5_VABI sceDataTransferEventIsAuthReady(); +int APS5_VABI sceDataTransferEventIsPwrReqReady(); int APS5_VABI sceDataTransferEventIsAuthReadyPS4(); int APS5_VABI sceDataTransferEventIsPwrReqReadyPS4(); int APS5_VABI sceDataTransferEventIsPwrReqReadyPS5(); diff --git a/core/libs/prx/libSceDepth/Export.cpp b/core/libs/prx/libSceDepth/Export.cpp index 58c40c04fd..e6fa071a1e 100644 --- a/core/libs/prx/libSceDepth/Export.cpp +++ b/core/libs/prx/libSceDepth/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceDepth/include/InventoryExports.hpp" #include "prx/libSceDepth/include/Api.hpp" #include #include @@ -201,3 +203,12 @@ int APS5_VABI _sceDepthSetHeteroMode() { } } + +extern "C" { + +int APS5_VABI libSceDepthUnknown_unL9sWu4IIw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("unL9sWu4IIw", libSceDepthUnknown_unL9sWu4IIw_nid_no_patch); + +} diff --git a/core/libs/prx/libSceDepth/include/InventoryExports.hpp b/core/libs/prx/libSceDepth/include/InventoryExports.hpp new file mode 100644 index 0000000000..5e8d7bf6f2 --- /dev/null +++ b/core/libs/prx/libSceDepth/include/InventoryExports.hpp @@ -0,0 +1,9 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceDepthUnknown_unL9sWu4IIw_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceDepth/libSceDepth.hpp b/core/libs/prx/libSceDepth/libSceDepth.hpp index 8899705618..1ef31b6f28 100644 --- a/core/libs/prx/libSceDepth/libSceDepth.hpp +++ b/core/libs/prx/libSceDepth/libSceDepth.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceDepth/include/Api.hpp" +#include "prx/libSceDepth/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceDepth2/Export.cpp b/core/libs/prx/libSceDepth2/Export.cpp index 18a122f40c..9af500df42 100644 --- a/core/libs/prx/libSceDepth2/Export.cpp +++ b/core/libs/prx/libSceDepth2/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceDepth2/include/InventoryExports.hpp" #include "prx/libSceDepth2/include/Api.hpp" #include #include @@ -57,3 +59,12 @@ int APS5_VABI sceDepth2WaitAndExecutePostProcess(void) { } } + +extern "C" { + +int APS5_VABI libSceDepth2Unknown_tLM3AwtzaHs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tLM3AwtzaHs", libSceDepth2Unknown_tLM3AwtzaHs_nid_no_patch); + +} diff --git a/core/libs/prx/libSceDepth2/include/InventoryExports.hpp b/core/libs/prx/libSceDepth2/include/InventoryExports.hpp new file mode 100644 index 0000000000..6f59711412 --- /dev/null +++ b/core/libs/prx/libSceDepth2/include/InventoryExports.hpp @@ -0,0 +1,9 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceDepth2Unknown_tLM3AwtzaHs_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceDepth2/libSceDepth2.hpp b/core/libs/prx/libSceDepth2/libSceDepth2.hpp index 30a843bc1b..a918ff3b49 100644 --- a/core/libs/prx/libSceDepth2/libSceDepth2.hpp +++ b/core/libs/prx/libSceDepth2/libSceDepth2.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceDepth2/include/Api.hpp" +#include "prx/libSceDepth2/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceDiscMap/Export.cpp b/core/libs/prx/libSceDiscMap/Export.cpp index 7eea1e3999..60e7b92ba6 100644 --- a/core/libs/prx/libSceDiscMap/Export.cpp +++ b/core/libs/prx/libSceDiscMap/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceDiscMap/include/InventoryExports.hpp" #include "prx/libSceDiscMap/include/Api.hpp" #include #include "SceTypes.hpp" @@ -36,3 +38,17 @@ int APS5_VABI sceDiscMapGetPackageSize(std::int64_t fflags, int* ret1, int* ret2 } } + +extern "C" { + +int APS5_VABI libSceDiscMapUnknown_5_plus_vOlukvkfg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5+vOlukvkfg", libSceDiscMapUnknown_5_plus_vOlukvkfg_nid_no_patch); + +int APS5_VABI libSceDiscMapUnknown_fJgP_plus_wqifno_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fJgP+wqifno", libSceDiscMapUnknown_fJgP_plus_wqifno_nid_no_patch); + +} diff --git a/core/libs/prx/libSceDiscMap/include/InventoryExports.hpp b/core/libs/prx/libSceDiscMap/include/InventoryExports.hpp new file mode 100644 index 0000000000..d7a97b8de8 --- /dev/null +++ b/core/libs/prx/libSceDiscMap/include/InventoryExports.hpp @@ -0,0 +1,10 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceDiscMapUnknown_5_plus_vOlukvkfg_nid_no_patch(); +int APS5_VABI libSceDiscMapUnknown_fJgP_plus_wqifno_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceDiscMap/libSceDiscMap.hpp b/core/libs/prx/libSceDiscMap/libSceDiscMap.hpp index e380270d79..c46405c8fa 100644 --- a/core/libs/prx/libSceDiscMap/libSceDiscMap.hpp +++ b/core/libs/prx/libSceDiscMap/libSceDiscMap.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceDiscMap/include/Api.hpp" +#include "prx/libSceDiscMap/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceFlexContent/Export.cpp b/core/libs/prx/libSceFlexContent/Export.cpp new file mode 100644 index 0000000000..801f42104d --- /dev/null +++ b/core/libs/prx/libSceFlexContent/Export.cpp @@ -0,0 +1,74 @@ +#include "prx/libSceFlexContent/include/Api.hpp" +#include +#include +#include "SceTypes.hpp" +#include "prx/libc/include/General.hpp" + +extern "C" { + +int APS5_VABI sceFlexContentInitialize(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceFlexContentTerminate(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("7n4PI+iTKws", sceFlexContentUnknown00); +int APS5_VABI sceFlexContentUnknown00(void) { + NotImplemented_nid_no_patch("7n4PI+iTKws"); + return 0; +} + +APS5_EXPORT("bgXJD9PYROo", sceFlexContentUnknown01); +int APS5_VABI sceFlexContentUnknown01(void) { + NotImplemented_nid_no_patch("bgXJD9PYROo"); + return 0; +} + +int APS5_VABI sceFlexContentMount(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("EP5ByjgbB2Y", sceFlexContentUnknown02); +int APS5_VABI sceFlexContentUnknown02(void) { + NotImplemented_nid_no_patch("EP5ByjgbB2Y"); + return 0; +} + +int APS5_VABI sceFlexContentGetDownloadProgress(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceFlexContentDelete(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceFlexContentGetLatestVersion(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceFlexContentGetInstalledVersion(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("TNwR02XaltA", sceFlexContentUnknown03); +int APS5_VABI sceFlexContentUnknown03(void) { + NotImplemented_nid_no_patch("TNwR02XaltA"); + return 0; +} + +APS5_EXPORT("EQWWghng4OI", sceFlexContentUnknown04); +int APS5_VABI sceFlexContentUnknown04(void) { + NotImplemented_nid_no_patch("EQWWghng4OI"); + return 0; +} + +} diff --git a/core/libs/prx/libSceFlexContent/include/Api.hpp b/core/libs/prx/libSceFlexContent/include/Api.hpp new file mode 100644 index 0000000000..c921f4d50d --- /dev/null +++ b/core/libs/prx/libSceFlexContent/include/Api.hpp @@ -0,0 +1,20 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI sceFlexContentInitialize(void); +int APS5_VABI sceFlexContentTerminate(void); +int APS5_VABI sceFlexContentUnknown00(void); +int APS5_VABI sceFlexContentUnknown01(void); +int APS5_VABI sceFlexContentMount(void); +int APS5_VABI sceFlexContentUnknown02(void); +int APS5_VABI sceFlexContentGetDownloadProgress(void); +int APS5_VABI sceFlexContentDelete(void); +int APS5_VABI sceFlexContentGetLatestVersion(void); +int APS5_VABI sceFlexContentGetInstalledVersion(void); +int APS5_VABI sceFlexContentUnknown03(void); +int APS5_VABI sceFlexContentUnknown04(void); + +} diff --git a/core/libs/prx/libSceFlexContent/libSceFlexContent.hpp b/core/libs/prx/libSceFlexContent/libSceFlexContent.hpp new file mode 100644 index 0000000000..b02aa37666 --- /dev/null +++ b/core/libs/prx/libSceFlexContent/libSceFlexContent.hpp @@ -0,0 +1,3 @@ +#pragma once + +#include "prx/libSceFlexContent/include/Api.hpp" diff --git a/core/libs/prx/libSceFontGs.native/Export.cpp b/core/libs/prx/libSceFontGs.native/Export.cpp new file mode 100644 index 0000000000..258ca4598f --- /dev/null +++ b/core/libs/prx/libSceFontGs.native/Export.cpp @@ -0,0 +1,39 @@ +#include "prx/libSceFontGs.native/include/Api.hpp" +#include +#include +#include "SceTypes.hpp" +#include "prx/libc/include/General.hpp" + +extern "C" { + +int APS5_VABI sceFontSelectGraphicsAgc(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceFontGraphicsAgcSurfaceInit(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceFontGraphicsAgcDrawupFillTextureImage(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceFontGraphicsAgcDrawupFillTexturePattern(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceFontGraphicsSequenceGetAgcCommandsForJump(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceFontGraphicsSequenceGetAgcCommandsForSubmit(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +} diff --git a/core/libs/prx/libSceFontGs.native/include/Api.hpp b/core/libs/prx/libSceFontGs.native/include/Api.hpp new file mode 100644 index 0000000000..d2de1415bc --- /dev/null +++ b/core/libs/prx/libSceFontGs.native/include/Api.hpp @@ -0,0 +1,14 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI sceFontSelectGraphicsAgc(void); +int APS5_VABI sceFontGraphicsAgcSurfaceInit(void); +int APS5_VABI sceFontGraphicsAgcDrawupFillTextureImage(void); +int APS5_VABI sceFontGraphicsAgcDrawupFillTexturePattern(void); +int APS5_VABI sceFontGraphicsSequenceGetAgcCommandsForJump(void); +int APS5_VABI sceFontGraphicsSequenceGetAgcCommandsForSubmit(void); + +} diff --git a/core/libs/prx/libSceFontGs.native/libSceFontGs.native.hpp b/core/libs/prx/libSceFontGs.native/libSceFontGs.native.hpp new file mode 100644 index 0000000000..3d9d20a693 --- /dev/null +++ b/core/libs/prx/libSceFontGs.native/libSceFontGs.native.hpp @@ -0,0 +1,3 @@ +#pragma once + +#include "prx/libSceFontGs.native/include/Api.hpp" diff --git a/core/libs/prx/libSceFontGs/Export.cpp b/core/libs/prx/libSceFontGs/Export.cpp index d81f4a5e32..c625cc94a1 100644 --- a/core/libs/prx/libSceFontGs/Export.cpp +++ b/core/libs/prx/libSceFontGs/Export.cpp @@ -1,3 +1,4 @@ +#include "prx/libSceFontGs/include/InventoryExports.hpp" #include #include #include "SceTypes.hpp" @@ -7,4 +8,32 @@ extern "C" { APS5_DUMMY_FUN +int APS5_VABI sceFontGraphicsGnmSurfaceInit(void) { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontSelectGraphicsGnm(void) { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGsUnknown_DI4LrTUrD04_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DI4LrTUrD04", sceFontGsUnknown_DI4LrTUrD04_nid_no_patch); + +int APS5_VABI sceFontGsUnknown_NtbMKwRg6qg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NtbMKwRg6qg", sceFontGsUnknown_NtbMKwRg6qg_nid_no_patch); + +int APS5_VABI sceFontGsUnknown_UsBLoyXsQZs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UsBLoyXsQZs", sceFontGsUnknown_UsBLoyXsQZs_nid_no_patch); + +int APS5_VABI sceFontGsUnknown_uksHKVEsxu4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uksHKVEsxu4", sceFontGsUnknown_uksHKVEsxu4_nid_no_patch); + } diff --git a/core/libs/prx/libSceFontGs/include/InventoryExports.hpp b/core/libs/prx/libSceFontGs/include/InventoryExports.hpp new file mode 100644 index 0000000000..c3ae4d3351 --- /dev/null +++ b/core/libs/prx/libSceFontGs/include/InventoryExports.hpp @@ -0,0 +1,10 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI sceFontGraphicsGnmSurfaceInit(void); +int APS5_VABI sceFontSelectGraphicsGnm(void); + +} diff --git a/core/libs/prx/libSceFontGs/libSceFontGs.hpp b/core/libs/prx/libSceFontGs/libSceFontGs.hpp index 6f70f09bee..3ec3b9d1c6 100644 --- a/core/libs/prx/libSceFontGs/libSceFontGs.hpp +++ b/core/libs/prx/libSceFontGs/libSceFontGs.hpp @@ -1 +1,3 @@ #pragma once + +#include "prx/libSceFontGs/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceFreeTypeOt/Export.cpp b/core/libs/prx/libSceFreeTypeOt/Export.cpp index da2d170fba..91243f68ee 100644 --- a/core/libs/prx/libSceFreeTypeOt/Export.cpp +++ b/core/libs/prx/libSceFreeTypeOt/Export.cpp @@ -40,6 +40,20 @@ std::int64_t ScaledSum(std::int64_t a, std::int64_t b, std::int64_t c, std::int6 return CheckedMulDiv(a, b, divisor, true, function) + CheckedMulDiv(c, d, divisor, true, function); } +std::int32_t IntegerSqrt(std::uint64_t value) { + std::uint64_t low = 0; + std::uint64_t high = 0xFFFFFFFF; + while (low < high) { + const std::uint64_t mid = (low + high + 1) >> 1; + if (mid * mid <= value) { + low = mid; + } else { + high = mid - 1; + } + } + return static_cast(low); +} + } extern "C" { @@ -375,16 +389,6 @@ int APS5_VABI sceFreeTypeOtSin_nid_no_patch() { } APS5_EXPORT("L1uHkWTazkI", sceFreeTypeOtSin_nid_no_patch); -int APS5_VABI sceFreeTypeOtUnknown_C7N2GuwqTA0_nid_no_patch() { - NotImplemented_nid_no_patch(__func__); -} -APS5_EXPORT("C7N2GuwqTA0", sceFreeTypeOtUnknown_C7N2GuwqTA0_nid_no_patch); - -int APS5_VABI sceFreeTypeOtUnknown_JgtSc0g3G6E_nid_no_patch() { - NotImplemented_nid_no_patch(__func__); -} -APS5_EXPORT("JgtSc0g3G6E", sceFreeTypeOtUnknown_JgtSc0g3G6E_nid_no_patch); - int APS5_VABI sceFreeTypeOtUnknown_uDXTnGbAz44_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } @@ -571,6 +575,14 @@ void APS5_VABI FT_Vector_Transform_Scaled_nid_postfix(FreeType::GuestVector* vec *vector = transformed; } +std::int32_t APS5_VABI FT_SqrtFixed_nid_postfix(std::int32_t x) { + return x > 0 ? IntegerSqrt(static_cast(x) << 16) : 0; +} + +std::int32_t APS5_VABI FT_Sqrt32_nid_postfix(std::int32_t x) { + return IntegerSqrt(static_cast(x)); +} + std::uint32_t APS5_VABI ft_highpow2_nid_postfix(std::uint32_t value) { return std::bit_floor(value); } diff --git a/core/libs/prx/libSceFreeTypeOt/include/Calc.hpp b/core/libs/prx/libSceFreeTypeOt/include/Calc.hpp index c536e3fffc..71e4a71e39 100644 --- a/core/libs/prx/libSceFreeTypeOt/include/Calc.hpp +++ b/core/libs/prx/libSceFreeTypeOt/include/Calc.hpp @@ -10,6 +10,8 @@ extern "C" { std::int64_t APS5_VABI FT_MulDiv_No_Round_nid_postfix(std::int64_t a, std::int64_t b, std::int64_t c); void APS5_VABI FT_Matrix_Multiply_Scaled_nid_postfix(const FreeType::GuestMatrix* a, FreeType::GuestMatrix* b, std::int64_t scaling); void APS5_VABI FT_Vector_Transform_Scaled_nid_postfix(FreeType::GuestVector* vector, const FreeType::GuestMatrix* matrix, std::int64_t scaling); +std::int32_t APS5_VABI FT_SqrtFixed_nid_postfix(std::int32_t x); +std::int32_t APS5_VABI FT_Sqrt32_nid_postfix(std::int32_t x); std::uint32_t APS5_VABI ft_highpow2_nid_postfix(std::uint32_t value); } diff --git a/core/libs/prx/libSceGLSlimVSH/Export.cpp b/core/libs/prx/libSceGLSlimVSH/Export.cpp index 300fdb7023..2989577c60 100644 --- a/core/libs/prx/libSceGLSlimVSH/Export.cpp +++ b/core/libs/prx/libSceGLSlimVSH/Export.cpp @@ -1,3 +1,4 @@ +#include "prx/libSceGLSlimVSH/include/InventoryExports.hpp" #include #include #include "SceTypes.hpp" @@ -1021,3 +1022,74 @@ int APS5_VABI sceGLSlimVSHUnknown_iyTnezpw1jE_nid_no_patch() { APS5_EXPORT("iyTnezpw1jE", sceGLSlimVSHUnknown_iyTnezpw1jE_nid_no_patch); } + +extern "C" { + +int APS5_VABI sceSlimglCompositorSetInvisibleCanvasCommand() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceSlimglCompositorSetMemoryCommand() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceSlimglCompositorSetPostEventCommand() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceSlimglCompositorWaitEndOfRendering() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceSlimglCompositorWaitPostEvent() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceSlimglIPCEnd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceSlimglIPCSetup() { + NotImplemented_nid_no_patch(__func__); +} + +} + +extern "C" { + +int APS5_VABI libSceGLSlimVSHInventory_9iW854bwvmc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9iW854bwvmc", libSceGLSlimVSHInventory_9iW854bwvmc_nid_no_patch); + +int APS5_VABI libSceGLSlimVSHInventory_DVNKmWX1jOU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DVNKmWX1jOU", libSceGLSlimVSHInventory_DVNKmWX1jOU_nid_no_patch); + +int APS5_VABI libSceGLSlimVSHInventory_JjyNMbSAgLk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JjyNMbSAgLk", libSceGLSlimVSHInventory_JjyNMbSAgLk_nid_no_patch); + +int APS5_VABI libSceGLSlimVSHInventory_LLDLZ_minus_mQK_plus_Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LLDLZ-mQK+Q", libSceGLSlimVSHInventory_LLDLZ_minus_mQK_plus_Q_nid_no_patch); + +int APS5_VABI libSceGLSlimVSHInventory_Yf0LATiXPsg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Yf0LATiXPsg", libSceGLSlimVSHInventory_Yf0LATiXPsg_nid_no_patch); + +int APS5_VABI libSceGLSlimVSHInventory_ZLvm5korFRA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZLvm5korFRA", libSceGLSlimVSHInventory_ZLvm5korFRA_nid_no_patch); + +int APS5_VABI libSceGLSlimVSHInventory_qSuVNKHENqs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qSuVNKHENqs", libSceGLSlimVSHInventory_qSuVNKHENqs_nid_no_patch); + +} diff --git a/core/libs/prx/libSceGLSlimVSH/include/InventoryExports.hpp b/core/libs/prx/libSceGLSlimVSH/include/InventoryExports.hpp new file mode 100644 index 0000000000..596047ecd8 --- /dev/null +++ b/core/libs/prx/libSceGLSlimVSH/include/InventoryExports.hpp @@ -0,0 +1,24 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI sceSlimglCompositorSetInvisibleCanvasCommand(); +int APS5_VABI sceSlimglCompositorSetMemoryCommand(); +int APS5_VABI sceSlimglCompositorSetPostEventCommand(); +int APS5_VABI sceSlimglCompositorWaitEndOfRendering(); +int APS5_VABI sceSlimglCompositorWaitPostEvent(); +int APS5_VABI sceSlimglIPCEnd(); +int APS5_VABI sceSlimglIPCSetup(); + + +int APS5_VABI libSceGLSlimVSHInventory_9iW854bwvmc_nid_no_patch(); +int APS5_VABI libSceGLSlimVSHInventory_DVNKmWX1jOU_nid_no_patch(); +int APS5_VABI libSceGLSlimVSHInventory_JjyNMbSAgLk_nid_no_patch(); +int APS5_VABI libSceGLSlimVSHInventory_LLDLZ_minus_mQK_plus_Q_nid_no_patch(); +int APS5_VABI libSceGLSlimVSHInventory_Yf0LATiXPsg_nid_no_patch(); +int APS5_VABI libSceGLSlimVSHInventory_ZLvm5korFRA_nid_no_patch(); +int APS5_VABI libSceGLSlimVSHInventory_qSuVNKHENqs_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceGLSlimVSH/libSceGLSlimVSH.hpp b/core/libs/prx/libSceGLSlimVSH/libSceGLSlimVSH.hpp index 7cb4864b51..2dac489e1f 100644 --- a/core/libs/prx/libSceGLSlimVSH/libSceGLSlimVSH.hpp +++ b/core/libs/prx/libSceGLSlimVSH/libSceGLSlimVSH.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceGLSlimVSH/include/Api.hpp" +#include "prx/libSceGLSlimVSH/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceGifParser/Export.cpp b/core/libs/prx/libSceGifParser/Export.cpp index d81f4a5e32..309220de2a 100644 --- a/core/libs/prx/libSceGifParser/Export.cpp +++ b/core/libs/prx/libSceGifParser/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceGifParser/include/InventoryExports.hpp" #include #include #include "SceTypes.hpp" @@ -8,3 +10,42 @@ extern "C" { APS5_DUMMY_FUN } + +extern "C" { + +int APS5_VABI libSceGifParserUnknown_gtaHM_minus_0DRuA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gtaHM-0DRuA", libSceGifParserUnknown_gtaHM_minus_0DRuA_nid_no_patch); + +int APS5_VABI libSceGifParserUnknown_g2ESAZBTI9I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("g2ESAZBTI9I", libSceGifParserUnknown_g2ESAZBTI9I_nid_no_patch); + +int APS5_VABI libSceGifParserUnknown_75RtNTcq2p4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("75RtNTcq2p4", libSceGifParserUnknown_75RtNTcq2p4_nid_no_patch); + +int APS5_VABI libSceGifParserUnknown_4phPV_plus_C95_minus_0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4phPV+C95-0", libSceGifParserUnknown_4phPV_plus_C95_minus_0_nid_no_patch); + +int APS5_VABI libSceGifParserUnknown_YtzTVdv9KoE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YtzTVdv9KoE", libSceGifParserUnknown_YtzTVdv9KoE_nid_no_patch); + +int APS5_VABI libSceGifParserUnknown_OTz_minus_uftEt84_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OTz-uftEt84", libSceGifParserUnknown_OTz_minus_uftEt84_nid_no_patch); + +int APS5_VABI libSceGifParserUnknown_moN21TSFs4s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("moN21TSFs4s", libSceGifParserUnknown_moN21TSFs4s_nid_no_patch); + +} diff --git a/core/libs/prx/libSceGifParser/include/InventoryExports.hpp b/core/libs/prx/libSceGifParser/include/InventoryExports.hpp new file mode 100644 index 0000000000..215be09ff6 --- /dev/null +++ b/core/libs/prx/libSceGifParser/include/InventoryExports.hpp @@ -0,0 +1,16 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceGifParserUnknown_gtaHM_minus_0DRuA_nid_no_patch(); + +int APS5_VABI libSceGifParserUnknown_g2ESAZBTI9I_nid_no_patch(); +int APS5_VABI libSceGifParserUnknown_75RtNTcq2p4_nid_no_patch(); +int APS5_VABI libSceGifParserUnknown_4phPV_plus_C95_minus_0_nid_no_patch(); +int APS5_VABI libSceGifParserUnknown_YtzTVdv9KoE_nid_no_patch(); +int APS5_VABI libSceGifParserUnknown_OTz_minus_uftEt84_nid_no_patch(); +int APS5_VABI libSceGifParserUnknown_moN21TSFs4s_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceGifParser/libSceGifParser.hpp b/core/libs/prx/libSceGifParser/libSceGifParser.hpp index 6f70f09bee..95a60745d0 100644 --- a/core/libs/prx/libSceGifParser/libSceGifParser.hpp +++ b/core/libs/prx/libSceGifParser/libSceGifParser.hpp @@ -1 +1,2 @@ #pragma once +#include "prx/libSceGifParser/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceGnmDriverForNeoMode/Export.cpp b/core/libs/prx/libSceGnmDriverForNeoMode/Export.cpp index d3f9dffc0e..bc1b64b7b7 100644 --- a/core/libs/prx/libSceGnmDriverForNeoMode/Export.cpp +++ b/core/libs/prx/libSceGnmDriverForNeoMode/Export.cpp @@ -1,10 +1,14 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceGnmDriverForNeoMode/include/InventoryExports.hpp" #include "prx/libSceGnmDriverForNeoMode/include/Api.hpp" #include #include #include +#include #include #include "SceTypes.hpp" #include "prx/libc/include/General.hpp" +#include "prx/libc/include/ApplicationHeap.hpp" #include "prx/libSceGnmDriverForNeoMode/include/InitSequences.hpp" #include "prx/libSceGnmDriverForNeoMode/include/EmbeddedShaders.hpp" @@ -30,6 +34,15 @@ int WriteContextState(std::uint32_t* cmdbuf, std::uint32_t size, std::uint32_t p return static_cast(packetWords); } +constexpr std::uint32_t ContextState400SdkVersion = 0x04000000; + +std::uint32_t CompiledSdkVersion() { + const auto* process = static_cast(ApplicationProcessParameters_nid_no_patch()); + std::uint32_t version; + std::memcpy(&version, process + 0x10, sizeof(version)); + return version; +} + constexpr std::uint32_t OpSetContextReg = 0x69; constexpr std::uint32_t OpSetShReg = 0x76; @@ -330,8 +343,8 @@ int APS5_VABI sceGnmDrawInitToDefaultContextState400(std::uint32_t* cmdbuf, std: } int APS5_VABI sceGnmDrawInitToDefaultContextStateInternalCommand(std::uint32_t* cmdbuf, std::uint32_t size) { - NotImplemented_nid_no_patch(__func__); - return 0; + if (CompiledSdkVersion() < ContextState400SdkVersion) return sceGnmDrawInitToDefaultContextState(cmdbuf, size); + return sceGnmDrawInitToDefaultContextState400(cmdbuf, size); } int APS5_VABI sceGnmDrawInitToDefaultContextStateInternalSize(void) { @@ -835,3 +848,107 @@ int APS5_VABI sceGnmValidationRegisterMemoryCheckCallback(void) { } } + +extern "C" { + +int APS5_VABI libSceGnmDriverForNeoModeUnknown__plus_RaJBCVJZVM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+RaJBCVJZVM", libSceGnmDriverForNeoModeUnknown__plus_RaJBCVJZVM_nid_no_patch); + +int APS5_VABI libSceGnmDriverForNeoModeUnknown__minus_bNK8kTFf6s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-bNK8kTFf6s", libSceGnmDriverForNeoModeUnknown__minus_bNK8kTFf6s_nid_no_patch); + +int APS5_VABI libSceGnmDriverForNeoModeUnknown_1TRGZJsC5Y4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1TRGZJsC5Y4", libSceGnmDriverForNeoModeUnknown_1TRGZJsC5Y4_nid_no_patch); + +int APS5_VABI libSceGnmDriverForNeoModeUnknown_2T1zOhnddFQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2T1zOhnddFQ", libSceGnmDriverForNeoModeUnknown_2T1zOhnddFQ_nid_no_patch); + +int APS5_VABI libSceGnmDriverForNeoModeUnknown_5R1E24FRI4w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5R1E24FRI4w", libSceGnmDriverForNeoModeUnknown_5R1E24FRI4w_nid_no_patch); + +int APS5_VABI libSceGnmDriverForNeoModeUnknown_6a3_plus_Twrkogk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6a3+Twrkogk", libSceGnmDriverForNeoModeUnknown_6a3_plus_Twrkogk_nid_no_patch); + +int APS5_VABI libSceGnmDriverForNeoModeUnknown_7LTGukH_plus_M1A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7LTGukH+M1A", libSceGnmDriverForNeoModeUnknown_7LTGukH_plus_M1A_nid_no_patch); + +int APS5_VABI libSceGnmDriverForNeoModeUnknown_8_plus_itHHi1ea0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8+itHHi1ea0", libSceGnmDriverForNeoModeUnknown_8_plus_itHHi1ea0_nid_no_patch); + +int APS5_VABI libSceGnmDriverForNeoModeUnknown_HEOIaxbuVTA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HEOIaxbuVTA", libSceGnmDriverForNeoModeUnknown_HEOIaxbuVTA_nid_no_patch); + +int APS5_VABI libSceGnmDriverForNeoModeUnknown_KKsYtugjKLw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KKsYtugjKLw", libSceGnmDriverForNeoModeUnknown_KKsYtugjKLw_nid_no_patch); + +int APS5_VABI libSceGnmDriverForNeoModeUnknown_MLr_plus_Fyrxf_plus_8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MLr+Fyrxf+8", libSceGnmDriverForNeoModeUnknown_MLr_plus_Fyrxf_plus_8_nid_no_patch); + +int APS5_VABI libSceGnmDriverForNeoModeUnknown_QP7vDGU0xDQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QP7vDGU0xDQ", libSceGnmDriverForNeoModeUnknown_QP7vDGU0xDQ_nid_no_patch); + +int APS5_VABI libSceGnmDriverForNeoModeUnknown_QWuQed5Mus4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QWuQed5Mus4", libSceGnmDriverForNeoModeUnknown_QWuQed5Mus4_nid_no_patch); + +int APS5_VABI libSceGnmDriverForNeoModeUnknown_R3TYO7Tdv5o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("R3TYO7Tdv5o", libSceGnmDriverForNeoModeUnknown_R3TYO7Tdv5o_nid_no_patch); + +int APS5_VABI libSceGnmDriverForNeoModeUnknown_UGePHM7rmgA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UGePHM7rmgA", libSceGnmDriverForNeoModeUnknown_UGePHM7rmgA_nid_no_patch); + +int APS5_VABI libSceGnmDriverForNeoModeUnknown_epUMKkeaze8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("epUMKkeaze8", libSceGnmDriverForNeoModeUnknown_epUMKkeaze8_nid_no_patch); + +int APS5_VABI libSceGnmDriverForNeoModeUnknown_gQNwGezNDgE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gQNwGezNDgE", libSceGnmDriverForNeoModeUnknown_gQNwGezNDgE_nid_no_patch); + +int APS5_VABI libSceGnmDriverForNeoModeUnknown_sKhoi2ectC0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sKhoi2ectC0", libSceGnmDriverForNeoModeUnknown_sKhoi2ectC0_nid_no_patch); + +int APS5_VABI libSceGnmDriverForNeoModeUnknown_ut57TBmRQN0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ut57TBmRQN0", libSceGnmDriverForNeoModeUnknown_ut57TBmRQN0_nid_no_patch); + +int APS5_VABI libSceGnmDriverForNeoModeUnknown_v7QcBXR48L8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("v7QcBXR48L8", libSceGnmDriverForNeoModeUnknown_v7QcBXR48L8_nid_no_patch); + +} diff --git a/core/libs/prx/libSceGnmDriverForNeoMode/include/InventoryExports.hpp b/core/libs/prx/libSceGnmDriverForNeoMode/include/InventoryExports.hpp new file mode 100644 index 0000000000..f23c961554 --- /dev/null +++ b/core/libs/prx/libSceGnmDriverForNeoMode/include/InventoryExports.hpp @@ -0,0 +1,28 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceGnmDriverForNeoModeUnknown__plus_RaJBCVJZVM_nid_no_patch(); +int APS5_VABI libSceGnmDriverForNeoModeUnknown__minus_bNK8kTFf6s_nid_no_patch(); +int APS5_VABI libSceGnmDriverForNeoModeUnknown_1TRGZJsC5Y4_nid_no_patch(); +int APS5_VABI libSceGnmDriverForNeoModeUnknown_2T1zOhnddFQ_nid_no_patch(); +int APS5_VABI libSceGnmDriverForNeoModeUnknown_5R1E24FRI4w_nid_no_patch(); +int APS5_VABI libSceGnmDriverForNeoModeUnknown_6a3_plus_Twrkogk_nid_no_patch(); +int APS5_VABI libSceGnmDriverForNeoModeUnknown_7LTGukH_plus_M1A_nid_no_patch(); +int APS5_VABI libSceGnmDriverForNeoModeUnknown_8_plus_itHHi1ea0_nid_no_patch(); +int APS5_VABI libSceGnmDriverForNeoModeUnknown_HEOIaxbuVTA_nid_no_patch(); +int APS5_VABI libSceGnmDriverForNeoModeUnknown_KKsYtugjKLw_nid_no_patch(); +int APS5_VABI libSceGnmDriverForNeoModeUnknown_MLr_plus_Fyrxf_plus_8_nid_no_patch(); +int APS5_VABI libSceGnmDriverForNeoModeUnknown_QP7vDGU0xDQ_nid_no_patch(); +int APS5_VABI libSceGnmDriverForNeoModeUnknown_QWuQed5Mus4_nid_no_patch(); +int APS5_VABI libSceGnmDriverForNeoModeUnknown_R3TYO7Tdv5o_nid_no_patch(); +int APS5_VABI libSceGnmDriverForNeoModeUnknown_UGePHM7rmgA_nid_no_patch(); +int APS5_VABI libSceGnmDriverForNeoModeUnknown_epUMKkeaze8_nid_no_patch(); +int APS5_VABI libSceGnmDriverForNeoModeUnknown_gQNwGezNDgE_nid_no_patch(); +int APS5_VABI libSceGnmDriverForNeoModeUnknown_sKhoi2ectC0_nid_no_patch(); +int APS5_VABI libSceGnmDriverForNeoModeUnknown_ut57TBmRQN0_nid_no_patch(); +int APS5_VABI libSceGnmDriverForNeoModeUnknown_v7QcBXR48L8_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceGnmDriverForNeoMode/libSceGnmDriverForNeoMode.hpp b/core/libs/prx/libSceGnmDriverForNeoMode/libSceGnmDriverForNeoMode.hpp index ebeb3b8bad..0cb944e989 100644 --- a/core/libs/prx/libSceGnmDriverForNeoMode/libSceGnmDriverForNeoMode.hpp +++ b/core/libs/prx/libSceGnmDriverForNeoMode/libSceGnmDriverForNeoMode.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceGnmDriverForNeoMode/include/Api.hpp" +#include "prx/libSceGnmDriverForNeoMode/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceGvMp4Parser/Export.cpp b/core/libs/prx/libSceGvMp4Parser/Export.cpp index 4d1c7ba5b3..d9386d44dd 100644 --- a/core/libs/prx/libSceGvMp4Parser/Export.cpp +++ b/core/libs/prx/libSceGvMp4Parser/Export.cpp @@ -1,3 +1,6 @@ +#include "prx/libSceGvMp4Parser/include/LegacyExports.hpp" +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceGvMp4Parser/include/InventoryExports.hpp" #include "prx/libSceGvMp4Parser/include/Api.hpp" #include #include @@ -32,3 +35,106 @@ int APS5_VABI _ZN23sceMetadataReaderWriter11gvMp4Parser27gvMp4ParserExtractThumb } } + +extern "C" { + +int APS5_VABI libSceGvMp4ParserUnknown_1twpIQ9LVdk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1twpIQ9LVdk", libSceGvMp4ParserUnknown_1twpIQ9LVdk_nid_no_patch); + +int APS5_VABI libSceGvMp4ParserUnknown_2_minus_w0eKjKQ_plus_8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2-w0eKjKQ+8", libSceGvMp4ParserUnknown_2_minus_w0eKjKQ_plus_8_nid_no_patch); + +int APS5_VABI libSceGvMp4ParserUnknown_4BR2PtzlXac_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4BR2PtzlXac", libSceGvMp4ParserUnknown_4BR2PtzlXac_nid_no_patch); + +int APS5_VABI libSceGvMp4ParserUnknown_6sO25N6BpIE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6sO25N6BpIE", libSceGvMp4ParserUnknown_6sO25N6BpIE_nid_no_patch); + +int APS5_VABI libSceGvMp4ParserUnknown_Ar_plus_SWXuO_plus_B4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ar+SWXuO+B4", libSceGvMp4ParserUnknown_Ar_plus_SWXuO_plus_B4_nid_no_patch); + +int APS5_VABI libSceGvMp4ParserUnknown_BL648cXsaOw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BL648cXsaOw", libSceGvMp4ParserUnknown_BL648cXsaOw_nid_no_patch); + +int APS5_VABI libSceGvMp4ParserUnknown_DxrIX_plus_BEzdA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DxrIX+BEzdA", libSceGvMp4ParserUnknown_DxrIX_plus_BEzdA_nid_no_patch); + +int APS5_VABI libSceGvMp4ParserUnknown_H1ACo_plus_TgX_plus_A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("H1ACo+TgX+A", libSceGvMp4ParserUnknown_H1ACo_plus_TgX_plus_A_nid_no_patch); + +int APS5_VABI libSceGvMp4ParserUnknown_Hi_plus_tZPfxucU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Hi+tZPfxucU", libSceGvMp4ParserUnknown_Hi_plus_tZPfxucU_nid_no_patch); + +int APS5_VABI libSceGvMp4ParserUnknown_Zqy0P4obozI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Zqy0P4obozI", libSceGvMp4ParserUnknown_Zqy0P4obozI_nid_no_patch); + +int APS5_VABI libSceGvMp4ParserUnknown_aVw8lQCnuYI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aVw8lQCnuYI", libSceGvMp4ParserUnknown_aVw8lQCnuYI_nid_no_patch); + +int APS5_VABI libSceGvMp4ParserUnknown_gYsaS58fv3Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gYsaS58fv3Y", libSceGvMp4ParserUnknown_gYsaS58fv3Y_nid_no_patch); + +int APS5_VABI libSceGvMp4ParserUnknown_hKxhdSPJr84_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hKxhdSPJr84", libSceGvMp4ParserUnknown_hKxhdSPJr84_nid_no_patch); + +int APS5_VABI libSceGvMp4ParserUnknown_mgcqnroon8s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mgcqnroon8s", libSceGvMp4ParserUnknown_mgcqnroon8s_nid_no_patch); + +int APS5_VABI libSceGvMp4ParserUnknown_uUeEONFSa30_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uUeEONFSa30", libSceGvMp4ParserUnknown_uUeEONFSa30_nid_no_patch); + +int APS5_VABI libSceGvMp4ParserUnknown_ybFfESYz8VA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ybFfESYz8VA", libSceGvMp4ParserUnknown_ybFfESYz8VA_nid_no_patch); + +} + +extern "C" { + +int APS5_VABI gvMp4LegacyUnknown__plus_iXAnntDUq8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+iXAnntDUq8", gvMp4LegacyUnknown__plus_iXAnntDUq8_nid_no_patch); + +int APS5_VABI gvMp4LegacyUnknown_C23hWLV47ko_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("C23hWLV47ko", gvMp4LegacyUnknown_C23hWLV47ko_nid_no_patch); + +int APS5_VABI gvMp4LegacyUnknown_qli8xXuToKQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qli8xXuToKQ", gvMp4LegacyUnknown_qli8xXuToKQ_nid_no_patch); + +} diff --git a/core/libs/prx/libSceGvMp4Parser/include/InventoryExports.hpp b/core/libs/prx/libSceGvMp4Parser/include/InventoryExports.hpp new file mode 100644 index 0000000000..429132d631 --- /dev/null +++ b/core/libs/prx/libSceGvMp4Parser/include/InventoryExports.hpp @@ -0,0 +1,24 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceGvMp4ParserUnknown_1twpIQ9LVdk_nid_no_patch(); +int APS5_VABI libSceGvMp4ParserUnknown_2_minus_w0eKjKQ_plus_8_nid_no_patch(); +int APS5_VABI libSceGvMp4ParserUnknown_4BR2PtzlXac_nid_no_patch(); +int APS5_VABI libSceGvMp4ParserUnknown_6sO25N6BpIE_nid_no_patch(); +int APS5_VABI libSceGvMp4ParserUnknown_Ar_plus_SWXuO_plus_B4_nid_no_patch(); +int APS5_VABI libSceGvMp4ParserUnknown_BL648cXsaOw_nid_no_patch(); +int APS5_VABI libSceGvMp4ParserUnknown_DxrIX_plus_BEzdA_nid_no_patch(); +int APS5_VABI libSceGvMp4ParserUnknown_H1ACo_plus_TgX_plus_A_nid_no_patch(); +int APS5_VABI libSceGvMp4ParserUnknown_Hi_plus_tZPfxucU_nid_no_patch(); +int APS5_VABI libSceGvMp4ParserUnknown_Zqy0P4obozI_nid_no_patch(); +int APS5_VABI libSceGvMp4ParserUnknown_aVw8lQCnuYI_nid_no_patch(); +int APS5_VABI libSceGvMp4ParserUnknown_gYsaS58fv3Y_nid_no_patch(); +int APS5_VABI libSceGvMp4ParserUnknown_hKxhdSPJr84_nid_no_patch(); +int APS5_VABI libSceGvMp4ParserUnknown_mgcqnroon8s_nid_no_patch(); +int APS5_VABI libSceGvMp4ParserUnknown_uUeEONFSa30_nid_no_patch(); +int APS5_VABI libSceGvMp4ParserUnknown_ybFfESYz8VA_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceGvMp4Parser/include/LegacyExports.hpp b/core/libs/prx/libSceGvMp4Parser/include/LegacyExports.hpp new file mode 100644 index 0000000000..27a49b0aae --- /dev/null +++ b/core/libs/prx/libSceGvMp4Parser/include/LegacyExports.hpp @@ -0,0 +1,11 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI gvMp4LegacyUnknown__plus_iXAnntDUq8_nid_no_patch(); +int APS5_VABI gvMp4LegacyUnknown_C23hWLV47ko_nid_no_patch(); +int APS5_VABI gvMp4LegacyUnknown_qli8xXuToKQ_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceGvMp4Parser/libSceGvMp4Parser.hpp b/core/libs/prx/libSceGvMp4Parser/libSceGvMp4Parser.hpp index c639941f8d..4241b94e85 100644 --- a/core/libs/prx/libSceGvMp4Parser/libSceGvMp4Parser.hpp +++ b/core/libs/prx/libSceGvMp4Parser/libSceGvMp4Parser.hpp @@ -1,3 +1,5 @@ #pragma once #include "prx/libSceGvMp4Parser/include/Api.hpp" +#include "prx/libSceGvMp4Parser/include/InventoryExports.hpp" +#include "prx/libSceGvMp4Parser/include/LegacyExports.hpp" diff --git a/core/libs/prx/libSceHmd2/CMakeLists.txt b/core/libs/prx/libSceHmd2/CMakeLists.txt index 6d7565ac4a..ee0e0ffd8c 100644 --- a/core/libs/prx/libSceHmd2/CMakeLists.txt +++ b/core/libs/prx/libSceHmd2/CMakeLists.txt @@ -1,4 +1,4 @@ -add_library(libSceHmd2 SHARED EXCLUDE_FROM_ALL Export.cpp) +add_library(libSceHmd2 SHARED EXCLUDE_FROM_ALL Export.cpp InventoryExports.cpp) target_include_directories(libSceHmd2 PRIVATE ${LIBS_INCLUDE_DIR}) target_link_libraries(libSceHmd2 PRIVATE libc) configure_windows_unwind(libSceHmd2) diff --git a/core/libs/prx/libSceHmd2/Export.cpp b/core/libs/prx/libSceHmd2/Export.cpp index fff32538f4..ffaa366f13 100644 --- a/core/libs/prx/libSceHmd2/Export.cpp +++ b/core/libs/prx/libSceHmd2/Export.cpp @@ -1,3 +1,4 @@ +#include "prx/libSceHmd2/include/LegacyExports.hpp" #include "prx/libSceHmd2/include/Api.hpp" #include "prx/libSceHmd2/Hmd2.hpp" #include "Hmd2.hpp" @@ -976,4 +977,48 @@ std::int32_t APS5_VABI Hmd2IndexZeroCheckSecondThenZero(std::uint64_t a0, const } APS5_EXPORT("wiv8+7ogrq0", Hmd2IndexZeroCheckSecondThenZero); +int APS5_VABI sceHmd2Unknown_CBkVZi9WhVo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CBkVZi9WhVo", sceHmd2Unknown_CBkVZi9WhVo_nid_no_patch); + +} + +extern "C" { + +int APS5_VABI hmd2LegacyUnknown_Prx62Z9TC9M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Prx62Z9TC9M", hmd2LegacyUnknown_Prx62Z9TC9M_nid_no_patch); + +int APS5_VABI hmd2LegacyUnknown_ZIkYdfc5p1o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZIkYdfc5p1o", hmd2LegacyUnknown_ZIkYdfc5p1o_nid_no_patch); + +int APS5_VABI hmd2LegacyUnknown_hvGZSIlA7lk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hvGZSIlA7lk", hmd2LegacyUnknown_hvGZSIlA7lk_nid_no_patch); + +int APS5_VABI hmd2LegacyUnknown_mt1yhLrXOMk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mt1yhLrXOMk", hmd2LegacyUnknown_mt1yhLrXOMk_nid_no_patch); + +int APS5_VABI hmd2LegacyUnknown_qug_minus_eu8URpA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qug-eu8URpA", hmd2LegacyUnknown_qug_minus_eu8URpA_nid_no_patch); + +int APS5_VABI hmd2LegacyUnknown_rmaZr_minus_K8c_plus_s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rmaZr-K8c+s", hmd2LegacyUnknown_rmaZr_minus_K8c_plus_s_nid_no_patch); + +int APS5_VABI hmd2LegacyUnknown_y0VEHlxFQFs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("y0VEHlxFQFs", hmd2LegacyUnknown_y0VEHlxFQFs_nid_no_patch); + } diff --git a/core/libs/prx/libSceHmd2/InventoryExports.cpp b/core/libs/prx/libSceHmd2/InventoryExports.cpp new file mode 100644 index 0000000000..175663fe98 --- /dev/null +++ b/core/libs/prx/libSceHmd2/InventoryExports.cpp @@ -0,0 +1,62 @@ +#include "SceTypes.hpp" +#include "prx/libc/include/General.hpp" +#include "prx/libc/include/general/ExportMacros.hpp" + +extern "C" { + +int APS5_VABI libSceHmd2Unknown_7Qwh_plus_itD9r4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7Qwh+itD9r4", libSceHmd2Unknown_7Qwh_plus_itD9r4_nid_no_patch); + +int APS5_VABI libSceHmd2Unknown_Ec6R1zHrEmA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ec6R1zHrEmA", libSceHmd2Unknown_Ec6R1zHrEmA_nid_no_patch); + +int APS5_VABI libSceHmd2Unknown_FBUEhH9tQ1A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FBUEhH9tQ1A", libSceHmd2Unknown_FBUEhH9tQ1A_nid_no_patch); + +int APS5_VABI libSceHmd2Unknown_GLtAhJ6E2io_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GLtAhJ6E2io", libSceHmd2Unknown_GLtAhJ6E2io_nid_no_patch); + +int APS5_VABI libSceHmd2Unknown_Ijl_plus_flgyR7Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ijl+flgyR7Q", libSceHmd2Unknown_Ijl_plus_flgyR7Q_nid_no_patch); + +int APS5_VABI libSceHmd2Unknown_PcdNgERzCos_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PcdNgERzCos", libSceHmd2Unknown_PcdNgERzCos_nid_no_patch); + +int APS5_VABI libSceHmd2Unknown_UbHtTtGRplE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UbHtTtGRplE", libSceHmd2Unknown_UbHtTtGRplE_nid_no_patch); + +int APS5_VABI libSceHmd2Unknown_dvGkONYMdJg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dvGkONYMdJg", libSceHmd2Unknown_dvGkONYMdJg_nid_no_patch); + +int APS5_VABI libSceHmd2Unknown_fY41qRGCvTM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fY41qRGCvTM", libSceHmd2Unknown_fY41qRGCvTM_nid_no_patch); + +int APS5_VABI libSceHmd2Unknown_n9wYmNVt6S4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("n9wYmNVt6S4", libSceHmd2Unknown_n9wYmNVt6S4_nid_no_patch); + +int APS5_VABI libSceHmd2Unknown_wDDAIxOeaqg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wDDAIxOeaqg", libSceHmd2Unknown_wDDAIxOeaqg_nid_no_patch); + +} diff --git a/core/libs/prx/libSceHmd2/include/LegacyExports.hpp b/core/libs/prx/libSceHmd2/include/LegacyExports.hpp new file mode 100644 index 0000000000..f6998fa1ea --- /dev/null +++ b/core/libs/prx/libSceHmd2/include/LegacyExports.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI hmd2LegacyUnknown_Prx62Z9TC9M_nid_no_patch(); +int APS5_VABI hmd2LegacyUnknown_ZIkYdfc5p1o_nid_no_patch(); +int APS5_VABI hmd2LegacyUnknown_hvGZSIlA7lk_nid_no_patch(); +int APS5_VABI hmd2LegacyUnknown_mt1yhLrXOMk_nid_no_patch(); +int APS5_VABI hmd2LegacyUnknown_qug_minus_eu8URpA_nid_no_patch(); +int APS5_VABI hmd2LegacyUnknown_rmaZr_minus_K8c_plus_s_nid_no_patch(); +int APS5_VABI hmd2LegacyUnknown_y0VEHlxFQFs_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceHmd2/libSceHmd2.hpp b/core/libs/prx/libSceHmd2/libSceHmd2.hpp index 0c3f869cc7..fec259ad7a 100644 --- a/core/libs/prx/libSceHmd2/libSceHmd2.hpp +++ b/core/libs/prx/libSceHmd2/libSceHmd2.hpp @@ -2,3 +2,4 @@ #include "prx/libSceHmd2/Hmd2.hpp" #include "prx/libSceHmd2/include/Api.hpp" +#include "prx/libSceHmd2/include/LegacyExports.hpp" diff --git a/core/libs/prx/libSceHttp2/CMakeLists.txt b/core/libs/prx/libSceHttp2/CMakeLists.txt index 15d6efc930..45e3b07081 100644 --- a/core/libs/prx/libSceHttp2/CMakeLists.txt +++ b/core/libs/prx/libSceHttp2/CMakeLists.txt @@ -22,10 +22,13 @@ if(MINGW OR CMAKE_SYSTEM_NAME STREQUAL "Linux") endif() install(FILES ${CMAKE_SOURCE_DIR}/3rdparty/nghttp2/COPYING DESTINATION licenses/nghttp2) -add_library(anyps5_http2_transport STATIC EXCLUDE_FROM_ALL Transport.cpp) -target_include_directories(anyps5_http2_transport PRIVATE ${LIBS_INCLUDE_DIR}) +set(http2ZlibDir ${CMAKE_SOURCE_DIR}/3rdparty/libjpeg-turbo/src/spng/zlib) +add_library(anyps5_http2_transport STATIC EXCLUDE_FROM_ALL Transport.cpp + ${http2ZlibDir}/adler32.c ${http2ZlibDir}/crc32.c ${http2ZlibDir}/inffast.c + ${http2ZlibDir}/inflate.c ${http2ZlibDir}/inftrees.c ${http2ZlibDir}/zutil.c) +target_include_directories(anyps5_http2_transport PRIVATE ${LIBS_INCLUDE_DIR} ${http2ZlibDir}) target_link_libraries(anyps5_http2_transport PRIVATE libSceNet libSceSsl libkernel libc nghttp2_static) -set_target_properties(anyps5_http2_transport PROPERTIES POSITION_INDEPENDENT_CODE ON CXX_VISIBILITY_PRESET hidden) +set_target_properties(anyps5_http2_transport PROPERTIES POSITION_INDEPENDENT_CODE ON CXX_VISIBILITY_PRESET hidden C_VISIBILITY_PRESET hidden) if(MINGW OR CMAKE_SYSTEM_NAME STREQUAL "Linux") target_link_options(anyps5_http2_transport INTERFACE LINKER:--exclude-libs,libanyps5_http2_transport.a) endif() diff --git a/core/libs/prx/libSceHttp2/Export.cpp b/core/libs/prx/libSceHttp2/Export.cpp index a87518e163..443ffdaed4 100644 --- a/core/libs/prx/libSceHttp2/Export.cpp +++ b/core/libs/prx/libSceHttp2/Export.cpp @@ -76,11 +76,11 @@ static bool HasSettings(const Http2Handle& handle) { } template -static int Update(int id, const char* function, TUpdate update, bool otherKindsAreInvalid = false) { +static int Update(int id, const char* function, TUpdate update, bool otherKindsAreInvalid = false, bool contextHasSettings = false) { std::lock_guard lock(g_handlesMutex); auto* handle = FindAnyHandle(id); if (!handle) return ERROR_INVALID_ID; - if (!HasSettings(*handle)) { + if (!HasSettings(*handle) && !(contextHasSettings && handle->kind == Http2Kind::Context)) { if (otherKindsAreInvalid) return ERROR_INVALID_ID; NotImplemented_nid_no_patch(function); } @@ -254,7 +254,7 @@ int APS5_VABI sceHttp2SetConnectTimeOut(int id, uint32_t usec) { } int APS5_VABI sceHttp2SetInflateGZIPEnabled(int id, int enable) { - return Update(id, __func__, [&](auto&) { if (enable != 0) NotImplemented_nid_no_patch("sceHttp2SetInflateGZIPEnabled"); }); + return Update(id, __func__, [&](auto& settings) { settings.inflateGzip = enable != 0; }); } int APS5_VABI sceHttp2SetRecvTimeOut(int id, uint32_t usec) { @@ -301,14 +301,14 @@ int APS5_VABI sceHttp2SslDisableOption(int id, uint32_t ssl_flags) { return Update(id, __func__, [&](auto& settings) { if (ssl_flags & ~0x3du) NotImplemented_nid_no_patch("sceHttp2SslDisableOption"); settings.verifyFlags &= ~ssl_flags; - }); + }, false, true); } int APS5_VABI sceHttp2SslEnableOption(int id, uint32_t ssl_flags) { return Update(id, __func__, [&](auto& settings) { if (ssl_flags & ~0x3du) NotImplemented_nid_no_patch("sceHttp2SslEnableOption"); settings.verifyFlags |= ssl_flags; - }); + }, false, true); } int APS5_VABI sceHttp2SetMinSslVersion(int id, uint32_t ssl_version) { diff --git a/core/libs/prx/libSceHttp2/Transport.cpp b/core/libs/prx/libSceHttp2/Transport.cpp index 52aab59d91..60ba971b06 100644 --- a/core/libs/prx/libSceHttp2/Transport.cpp +++ b/core/libs/prx/libSceHttp2/Transport.cpp @@ -8,6 +8,8 @@ #endif #include "Transport.hpp" + +#include "zlib.h" #include "prx/libSceNet/include/Net.hpp" #include "prx/libSceSsl/include/Ssl.hpp" #include "prx/libc/include/General.hpp" @@ -36,6 +38,7 @@ using Clock = std::chrono::steady_clock; constexpr int WantRead = static_cast(0x8095f013); constexpr int WantWrite = static_cast(0x8095f014); constexpr int InvalidValue = static_cast(0x817B11FE); +constexpr std::size_t MaxGzipBytes = 64 * 1024 * 1024; [[noreturn]] void Unknown(const char* message) { NotImplemented_nid_no_patch(message); @@ -254,6 +257,8 @@ struct Request::State { bool ready = false; bool ended = false; int status = 0; + std::string contentEncoding; + bool inflatedGzip = false; int blockStatus = 0; int networkResult = 0; int socket = -1; @@ -318,6 +323,60 @@ struct Request::State { } } + bool Inflating() const { return settings.inflateGzip && contentEncoding == "gzip"; } + + void InflateGzip() { + if (inflatedGzip || !Inflating() || body.empty()) return; + inflatedGzip = true; + const std::uint8_t* data = body.data(); + const std::size_t size = body.size(); + Require(size >= 18 && data[0] == 0x1f && data[1] == 0x8b && data[2] == 8, "sceHttp2: malformed gzip header"); + const std::uint8_t flags = data[3]; + Require((flags & 0xe0) == 0, "sceHttp2: unknown gzip header flags"); + std::size_t offset = 10; + const auto skip = [&](std::size_t count) { Require(offset + count <= size - 8, "sceHttp2: truncated gzip header"); offset += count; }; + if (flags & 4) { + Require(offset + 2 <= size - 8, "sceHttp2: truncated gzip extra field"); + const std::size_t extra = static_cast(data[offset]) | (static_cast(data[offset + 1]) << 8); + skip(2 + extra); + } + if (flags & 8) while (skip(1), data[offset - 1] != 0) {} + if (flags & 16) while (skip(1), data[offset - 1] != 0) {} + if (flags & 2) skip(2); + z_stream inflater{}; + Require(inflateInit2(&inflater, -15) == Z_OK, "sceHttp2: gzip inflate initialization failed"); + struct End { + z_stream* stream; + ~End() { inflateEnd(stream); } + } end{&inflater}; + inflater.next_in = const_cast(data + offset); + inflater.avail_in = static_cast(size - offset - 8); + std::vector output; + std::uint8_t chunk[16384]; + int result = Z_OK; + while (result != Z_STREAM_END) { + inflater.next_out = chunk; + inflater.avail_out = sizeof(chunk); + result = inflate(&inflater, Z_NO_FLUSH); + Require(result == Z_OK || result == Z_STREAM_END, "sceHttp2: gzip inflate failed"); + output.insert(output.end(), chunk, chunk + (sizeof(chunk) - inflater.avail_out)); + Require(result == Z_STREAM_END || inflater.avail_in != 0 || inflater.avail_out == 0, "sceHttp2: truncated gzip stream"); + Require(output.size() <= MaxGzipBytes, "sceHttp2: inflated response exceeds the host limit"); + } + Require(inflater.avail_in == 0, "sceHttp2: concatenated gzip members are not implemented"); + const auto readLe32 = [&](std::size_t position) { + return static_cast(data[position]) | (static_cast(data[position + 1]) << 8) | + (static_cast(data[position + 2]) << 16) | (static_cast(data[position + 3]) << 24); + }; + Require(crc32(0, output.data(), static_cast(output.size())) == readLe32(size - 8), "sceHttp2: gzip checksum mismatch"); + Require(static_cast(output.size()) == readLe32(size - 4), "sceHttp2: gzip size mismatch"); + body = std::move(output); + bodyOffset = 0; + contentLength = body.size(); + hasLength = true; + contentEncoding.clear(); + } + int Connect() { #ifdef _WIN32 const int startup = sceNetSocket("http2-resolver", 2, 1, 0); @@ -412,6 +471,7 @@ struct Request::State { state.contentLength = Number(text); state.hasLength = true; } + if (key == "content-encoding") state.contentEncoding = Lower(std::string(text)); }); } @@ -433,15 +493,21 @@ struct Request::State { (frame->hd.flags & NGHTTP2_FLAG_END_STREAM)) { Require(state.ready, "sceHttp2: response ended without final headers"); state.ended = true; + state.InflateGzip(); } }); } - static int Data(nghttp2_session*, std::uint8_t, std::int32_t streamId, const std::uint8_t* bytes, std::size_t size, void* data) { + static int Data(nghttp2_session* session, std::uint8_t, std::int32_t streamId, const std::uint8_t* bytes, std::size_t size, void* data) { auto& state = *static_cast(data); return Callback(state, [&] { if (streamId != state.stream) return; - Require(state.body.size() + size <= 65535, "sceHttp2: receive flow-control limit exceeded"); + if (state.Inflating()) { + Require(state.body.size() + size <= MaxGzipBytes, "sceHttp2: encoded gzip response exceeds the host limit"); + CheckNg(nghttp2_session_consume(session, streamId, size)); + } else { + Require(state.body.size() + size <= 65535, "sceHttp2: receive flow-control limit exceeded"); + } state.body.insert(state.body.end(), bytes, bytes + size); }); } @@ -598,7 +664,7 @@ int Request::Read(void* data, std::size_t size) { try { const auto deadline = state->Deadline(state->settings.recvTimeout); state->Check(deadline); - while (state->bodyOffset == state->body.size() && !state->ended) state->Pump(deadline); + while (!state->ended && (state->bodyOffset == state->body.size() || state->Inflating())) state->Pump(deadline); const auto count = std::min({size, state->body.size() - state->bodyOffset, static_cast(std::numeric_limits::max())}); state->Check(deadline); if (count) std::memcpy(data, state->body.data() + state->bodyOffset, count); @@ -622,6 +688,12 @@ int Request::ContentLength(int* kind, std::uint64_t* length) { auto lock = state->Lock(); if (state->networkResult) return state->networkResult; Require(kind && length && state->ready, "sceHttp2GetResponseContentLength: null output or response unavailable"); + if (state->Inflating()) { + try { + const auto deadline = state->Deadline(state->settings.recvTimeout); + while (!state->ended) state->Pump(deadline); + } catch (...) { state->Fail(); throw; } + } *kind = state->hasLength ? 0 : 1; *length = state->hasLength ? state->contentLength : 0; return 0; diff --git a/core/libs/prx/libSceHttp2/Transport.hpp b/core/libs/prx/libSceHttp2/Transport.hpp index 5131206d6c..1595ab1048 100644 --- a/core/libs/prx/libSceHttp2/Transport.hpp +++ b/core/libs/prx/libSceHttp2/Transport.hpp @@ -22,6 +22,7 @@ struct Settings { std::vector> headers; std::uint64_t contentLength = 0; bool noContentLength = false; + bool inflateGzip = false; bool auth = true; int redirect = 1; std::uint32_t verifyFlags = 0x3d; diff --git a/core/libs/prx/libSceIcu/CMakeLists.txt b/core/libs/prx/libSceIcu/CMakeLists.txt index 4458d7708f..0bbdfb93f1 100644 --- a/core/libs/prx/libSceIcu/CMakeLists.txt +++ b/core/libs/prx/libSceIcu/CMakeLists.txt @@ -2,9 +2,12 @@ add_library(libSceIcu SHARED EXCLUDE_FROM_ALL Export.cpp Invariant.cpp Version.c target_include_directories(libSceIcu PRIVATE ${LIBS_INCLUDE_DIR}) configure_windows_unwind(libSceIcu) target_sources(libSceIcu PRIVATE ConverterCallbacks.cpp) +target_sources(libSceIcu PRIVATE LegacyExports.cpp) target_sources(libSceIcu PRIVATE CString.cpp) +target_sources(libSceIcu PRIVATE CompareIter.cpp) target_sources(libSceIcu PRIVATE Space.cpp) target_sources(libSceIcu PRIVATE Utf8.cpp) +target_sources(libSceIcu PRIVATE Resource.cpp) if(BUILD_TESTING) add_test_executable(guest_icu_utf8_tests ${LIBS_INCLUDE_DIR}/tests/GuestIcuUtf8.cpp) @@ -83,3 +86,29 @@ if(BUILD_TESTING) "PATH=path_list_prepend:$") endif() endif() + +if(BUILD_TESTING) + add_test_executable(guest_icu_compare_iter_tests ${CMAKE_CURRENT_SOURCE_DIR}/tests/CompareIter.cpp) + target_include_directories(guest_icu_compare_iter_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_icu_compare_iter_tests PRIVATE libSceIcu) + configure_windows_unwind(guest_icu_compare_iter_tests) + add_test(NAME guest_icu_compare_iter COMMAND guest_icu_compare_iter_tests) + set_tests_properties(guest_icu_compare_iter PROPERTIES TIMEOUT 30) + if(WIN32) + set_tests_properties(guest_icu_compare_iter PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() + +if(BUILD_TESTING) + add_test_executable(guest_icu_resource_tests ${CMAKE_CURRENT_SOURCE_DIR}/tests/Resource.cpp) + target_include_directories(guest_icu_resource_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_icu_resource_tests PRIVATE libSceIcu) + configure_windows_unwind(guest_icu_resource_tests) + add_test(NAME guest_icu_resource COMMAND guest_icu_resource_tests) + set_tests_properties(guest_icu_resource PROPERTIES TIMEOUT 10) + if(WIN32) + set_tests_properties(guest_icu_resource PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceIcu/CompareIter.cpp b/core/libs/prx/libSceIcu/CompareIter.cpp new file mode 100644 index 0000000000..f214fd55e8 --- /dev/null +++ b/core/libs/prx/libSceIcu/CompareIter.cpp @@ -0,0 +1,62 @@ +#include "prx/libSceIcu/libSceIcu.hpp" +#include +#include + +namespace { + +constexpr std::int32_t Sentinel = -1; + +bool IsLead(std::int32_t unit) { + return (static_cast(unit) & 0xfffffc00u) == 0xd800u; +} + +bool IsTrail(std::int32_t unit) { + return (static_cast(unit) & 0xfffffc00u) == 0xdc00u; +} + +template +TCallback Require(TCallback callback) { + if (!callback) throw std::invalid_argument("u_strCompareIter: null iterator callback"); + return callback; +} + +std::int32_t Next(UCharIterator* iterator) { + return Require(iterator->next)(iterator); +} + +bool InPair(UCharIterator* iterator, std::int32_t unit) { + if (unit <= 0xdbff) return IsTrail(Require(iterator->current)(iterator)); + if (!IsTrail(unit)) return false; + const auto previous = Require(iterator->previous); + previous(iterator); + return IsLead(Require(iterator->previous)(iterator)); +} + +std::int32_t Order(UCharIterator* iterator, std::int32_t unit) { + return InPair(iterator, unit) ? unit : unit - 0x2800; +} + +} + +extern "C" { + +std::int32_t APS5_VABI u_strCompareIter_nid_postfix(UCharIterator* first, UCharIterator* second, std::uint8_t codePointOrder) { + if (!first || !second || first == second) return 0; + Require(first->move)(first, 0, UITER_START); + Require(second->move)(second, 0, UITER_START); + std::int32_t left; + std::int32_t right; + for (;;) { + left = Next(first); + right = Next(second); + if (left != right) break; + if (left == Sentinel) return 0; + } + if (left >= 0xd800 && right >= 0xd800 && codePointOrder) { + left = Order(first, left); + right = Order(second, right); + } + return static_cast(static_cast(left) - static_cast(right)); +} + +} diff --git a/core/libs/prx/libSceIcu/Export.cpp b/core/libs/prx/libSceIcu/Export.cpp index 4e8e30c45e..bf098b424a 100644 --- a/core/libs/prx/libSceIcu/Export.cpp +++ b/core/libs/prx/libSceIcu/Export.cpp @@ -2,384 +2,330 @@ #include #include "SceTypes.hpp" #include "prx/libc/include/General.hpp" +#include "prx/libSceIcu/Identified.hpp" +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceIcu/include/InventoryDispatch.hpp" extern "C" { -int APS5_VABI sceIcuUnknown_VZFw_xSe6Mo_nid_no_patch() { +int APS5_VABI UCNV_FROM_U_CALLBACK_ESCAPE_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("VZFw+xSe6Mo", sceIcuUnknown_VZFw_xSe6Mo_nid_no_patch); -int APS5_VABI sceIcuUnknown_4Gv3tXZ2WKI_nid_no_patch() { +int APS5_VABI UCNV_FROM_U_CALLBACK_SUBSTITUTE_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("4Gv3tXZ2WKI", sceIcuUnknown_4Gv3tXZ2WKI_nid_no_patch); -int APS5_VABI sceIcuUnknown_RFnKlYsiIb0_nid_no_patch() { +int APS5_VABI UCNV_TO_U_CALLBACK_ESCAPE_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("RFnKlYsiIb0", sceIcuUnknown_RFnKlYsiIb0_nid_no_patch); -int APS5_VABI sceIcuUnknown_H33ge_SDjlI_nid_no_patch() { +int APS5_VABI sceIcuDispatchUnknown_BufsAiaX0_plus_s_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("H33ge+SDjlI", sceIcuUnknown_H33ge_SDjlI_nid_no_patch); +APS5_EXPORT("BufsAiaX0+s", sceIcuDispatchUnknown_BufsAiaX0_plus_s_nid_no_patch); -int APS5_VABI sceIcuUnknown_wlK146pHnQ4_nid_no_patch() { +int APS5_VABI sceIcuDispatchUnknown_xdF5zg0V5Oc_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("wlK146pHnQ4", sceIcuUnknown_wlK146pHnQ4_nid_no_patch); +APS5_EXPORT("xdF5zg0V5Oc", sceIcuDispatchUnknown_xdF5zg0V5Oc_nid_no_patch); -int APS5_VABI sceIcuUnknown_QO5iuHMTu2o_nid_no_patch() { +int APS5_VABI sceIcuDispatchUnknown_Con4H1SB3nw_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("QO5iuHMTu2o", sceIcuUnknown_QO5iuHMTu2o_nid_no_patch); +APS5_EXPORT("Con4H1SB3nw", sceIcuDispatchUnknown_Con4H1SB3nw_nid_no_patch); -int APS5_VABI sceIcuUnknown_9TndABWg5Ds_nid_no_patch() { +int APS5_VABI sceIcuDispatchUnknown_lME28PLmu54_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("9TndABWg5Ds", sceIcuUnknown_9TndABWg5Ds_nid_no_patch); +APS5_EXPORT("lME28PLmu54", sceIcuDispatchUnknown_lME28PLmu54_nid_no_patch); -int APS5_VABI sceIcuUnknown_tcf9HUwNaX0_nid_no_patch() { +int APS5_VABI UCNV_TO_U_CALLBACK_SUBSTITUTE_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("tcf9HUwNaX0", sceIcuUnknown_tcf9HUwNaX0_nid_no_patch); -int APS5_VABI sceIcuUnknown_rbyBjvpNuME_nid_no_patch() { +int APS5_VABI locale_getKeywordsStart_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("rbyBjvpNuME", sceIcuUnknown_rbyBjvpNuME_nid_no_patch); -int APS5_VABI sceIcuUnknown_4JJDz6r_ghE_nid_no_patch() { +int APS5_VABI res_countArrayItems_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("4JJDz6r-ghE", sceIcuUnknown_4JJDz6r_ghE_nid_no_patch); -int APS5_VABI sceIcuUnknown_WPrktCwd_iw_nid_no_patch() { +int APS5_VABI res_getAlias_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("WPrktCwd+iw", sceIcuUnknown_WPrktCwd_iw_nid_no_patch); -int APS5_VABI sceIcuUnknown_sP5rfVNdvWM_nid_no_patch() { +int APS5_VABI res_getArrayItem_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("sP5rfVNdvWM", sceIcuUnknown_sP5rfVNdvWM_nid_no_patch); -int APS5_VABI sceIcuUnknown_c6eD2eDESGk_nid_no_patch() { +int APS5_VABI res_getBinaryNoTrace_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("c6eD2eDESGk", sceIcuUnknown_c6eD2eDESGk_nid_no_patch); -int APS5_VABI sceIcuUnknown_8y7DjDBJ6Nw_nid_no_patch() { +int APS5_VABI res_getIntVectorNoTrace_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("8y7DjDBJ6Nw", sceIcuUnknown_8y7DjDBJ6Nw_nid_no_patch); -int APS5_VABI sceIcuUnknown_b7p2qTtZPno_nid_no_patch() { +int APS5_VABI res_getResource_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("b7p2qTtZPno", sceIcuUnknown_b7p2qTtZPno_nid_no_patch); -int APS5_VABI sceIcuUnknown_RlZwfEuRDx8_nid_no_patch() { +int APS5_VABI res_getStringNoTrace_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("RlZwfEuRDx8", sceIcuUnknown_RlZwfEuRDx8_nid_no_patch); -int APS5_VABI sceIcuUnknown_vXu991uXNUo_nid_no_patch() { +int APS5_VABI res_getTableItemByIndex_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("vXu991uXNUo", sceIcuUnknown_vXu991uXNUo_nid_no_patch); -int APS5_VABI sceIcuUnknown_aF_oEFPzEsY_nid_no_patch() { +int APS5_VABI res_getTableItemByKey_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("aF+oEFPzEsY", sceIcuUnknown_aF_oEFPzEsY_nid_no_patch); -int APS5_VABI sceIcuUnknown_lNPpoUVElSA_nid_no_patch() { +int APS5_VABI res_read_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("lNPpoUVElSA", sceIcuUnknown_lNPpoUVElSA_nid_no_patch); -int APS5_VABI sceIcuUnknown_BTFjoSWI5_Y_nid_no_patch() { +int APS5_VABI u_caseInsensitivePrefixMatch_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("BTFjoSWI5-Y", sceIcuUnknown_BTFjoSWI5_Y_nid_no_patch); -int APS5_VABI sceIcuUnknown_Q8P3U9F8p_Y_nid_no_patch() { +int APS5_VABI u_charAge_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("Q8P3U9F8p-Y", sceIcuUnknown_Q8P3U9F8p_Y_nid_no_patch); -int APS5_VABI sceIcuUnknown_4Kf0Hy8xJrI_nid_no_patch() { +int APS5_VABI u_charDigitValue_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("4Kf0Hy8xJrI", sceIcuUnknown_4Kf0Hy8xJrI_nid_no_patch); -int APS5_VABI sceIcuUnknown_JGkExZI3fFI_nid_no_patch() { +int APS5_VABI u_charDirection_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("JGkExZI3fFI", sceIcuUnknown_JGkExZI3fFI_nid_no_patch); -int APS5_VABI sceIcuUnknown_0cYEtBUJ5zQ_nid_no_patch() { +int APS5_VABI u_charFromName_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI u_charMirror_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI u_charName_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI u_charType_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("0cYEtBUJ5zQ", sceIcuUnknown_0cYEtBUJ5zQ_nid_no_patch); int APS5_VABI sceIcuUnknown_1SsridDRBYQ_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } APS5_EXPORT("1SsridDRBYQ", sceIcuUnknown_1SsridDRBYQ_nid_no_patch); -int APS5_VABI sceIcuUnknown_a25spvWYEOA_nid_no_patch() { +int APS5_VABI u_digit_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("a25spvWYEOA", sceIcuUnknown_a25spvWYEOA_nid_no_patch); -int APS5_VABI sceIcuUnknown_EuFvqF73SwU_nid_no_patch() { +int APS5_VABI u_enumCharNames_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("EuFvqF73SwU", sceIcuUnknown_EuFvqF73SwU_nid_no_patch); -int APS5_VABI sceIcuUnknown_wybPkXuWnoE_nid_no_patch() { +int APS5_VABI u_enumCharTypes_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("wybPkXuWnoE", sceIcuUnknown_wybPkXuWnoE_nid_no_patch); -int APS5_VABI sceIcuUnknown_2qAOcgRJZ3M_nid_no_patch() { +int APS5_VABI u_flushDefaultConverter_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("2qAOcgRJZ3M", sceIcuUnknown_2qAOcgRJZ3M_nid_no_patch); -int APS5_VABI sceIcuUnknown_n4yiKNo1yCs_nid_no_patch() { +int APS5_VABI u_foldCase_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("n4yiKNo1yCs", sceIcuUnknown_n4yiKNo1yCs_nid_no_patch); int APS5_VABI sceIcuUnknown_hI8JVrcGWhc_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } APS5_EXPORT("hI8JVrcGWhc", sceIcuUnknown_hI8JVrcGWhc_nid_no_patch); -int APS5_VABI sceIcuUnknown_h16q7HjVyTE_nid_no_patch() { +int APS5_VABI u_getBidiPairedBracket_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("h16q7HjVyTE", sceIcuUnknown_h16q7HjVyTE_nid_no_patch); -int APS5_VABI sceIcuUnknown_Q8Y0ntVp_GY_nid_no_patch() { +int APS5_VABI u_getBinaryPropertySet_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("Q8Y0ntVp-GY", sceIcuUnknown_Q8Y0ntVp_GY_nid_no_patch); -int APS5_VABI sceIcuUnknown_TXEHKpCJ_aE_nid_no_patch() { +int APS5_VABI u_getCombiningClass_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("TXEHKpCJ-aE", sceIcuUnknown_TXEHKpCJ_aE_nid_no_patch); int APS5_VABI sceIcuUnknown_UmNS0P0_ovs_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } APS5_EXPORT("UmNS0P0-ovs", sceIcuUnknown_UmNS0P0_ovs_nid_no_patch); -int APS5_VABI sceIcuUnknown_ndOe3Wc7xjA_nid_no_patch() { +int APS5_VABI u_getDefaultConverter_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("ndOe3Wc7xjA", sceIcuUnknown_ndOe3Wc7xjA_nid_no_patch); -int APS5_VABI sceIcuUnknown_r6Wuu1Tc438_nid_no_patch() { +int APS5_VABI u_getFC_NFKC_Closure_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("r6Wuu1Tc438", sceIcuUnknown_r6Wuu1Tc438_nid_no_patch); int APS5_VABI sceIcuUnknown__kd2qcTMvHE_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } APS5_EXPORT("+kd2qcTMvHE", sceIcuUnknown__kd2qcTMvHE_nid_no_patch); -int APS5_VABI sceIcuUnknown__aK6d418l4c_nid_no_patch() { +int APS5_VABI u_getIntPropertyMap_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("-aK6d418l4c", sceIcuUnknown__aK6d418l4c_nid_no_patch); -int APS5_VABI sceIcuUnknown_5V2WIPOZcaA_nid_no_patch() { +int APS5_VABI u_getIntPropertyMaxValue_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("5V2WIPOZcaA", sceIcuUnknown_5V2WIPOZcaA_nid_no_patch); -int APS5_VABI sceIcuUnknown_FHSNfxQFEdA_nid_no_patch() { +int APS5_VABI u_getIntPropertyMinValue_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("FHSNfxQFEdA", sceIcuUnknown_FHSNfxQFEdA_nid_no_patch); -int APS5_VABI sceIcuUnknown_eD76mHY99fM_nid_no_patch() { +int APS5_VABI u_getIntPropertyValue_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("eD76mHY99fM", sceIcuUnknown_eD76mHY99fM_nid_no_patch); -int APS5_VABI sceIcuUnknown_F_2mXPmh_7s_nid_no_patch() { +int APS5_VABI u_getNumericValue_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("F+2mXPmh-7s", sceIcuUnknown_F_2mXPmh_7s_nid_no_patch); -int APS5_VABI sceIcuUnknown_BQtUj7CVrC0_nid_no_patch() { +int APS5_VABI u_getPropertyEnum_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("BQtUj7CVrC0", sceIcuUnknown_BQtUj7CVrC0_nid_no_patch); -int APS5_VABI sceIcuUnknown_pCh4kIKMRhY_nid_no_patch() { +int APS5_VABI u_getPropertyName_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("pCh4kIKMRhY", sceIcuUnknown_pCh4kIKMRhY_nid_no_patch); -int APS5_VABI sceIcuUnknown_3Z22ZB8mHq8_nid_no_patch() { +int APS5_VABI u_getPropertyValueEnum_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("3Z22ZB8mHq8", sceIcuUnknown_3Z22ZB8mHq8_nid_no_patch); -int APS5_VABI sceIcuUnknown_Hka9gz6FuDs_nid_no_patch() { +int APS5_VABI u_getPropertyValueName_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("Hka9gz6FuDs", sceIcuUnknown_Hka9gz6FuDs_nid_no_patch); int APS5_VABI sceIcuUnknown_5__ZFSRQ0_k_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } APS5_EXPORT("5+-ZFSRQ0+k", sceIcuUnknown_5__ZFSRQ0_k_nid_no_patch); -int APS5_VABI sceIcuUnknown_zGuhKwXM9I0_nid_no_patch() { +int APS5_VABI u_hasBinaryProperty_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("zGuhKwXM9I0", sceIcuUnknown_zGuhKwXM9I0_nid_no_patch); -int APS5_VABI sceIcuUnknown_6y_NITWLmmE_nid_no_patch() { +int APS5_VABI u_isIDIgnorable_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("6y+NITWLmmE", sceIcuUnknown_6y_NITWLmmE_nid_no_patch); -int APS5_VABI sceIcuUnknown_qXSNbAnlsKg_nid_no_patch() { +int APS5_VABI u_isIDPart_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("qXSNbAnlsKg", sceIcuUnknown_qXSNbAnlsKg_nid_no_patch); -int APS5_VABI sceIcuUnknown_u8WyPl4r3Oc_nid_no_patch() { +int APS5_VABI u_isIDStart_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("u8WyPl4r3Oc", sceIcuUnknown_u8WyPl4r3Oc_nid_no_patch); - -int APS5_VABI sceIcuUnknown_7E_h3yiZjKw_nid_no_patch() { - NotImplemented_nid_no_patch(__func__); -} -APS5_EXPORT("7E+h3yiZjKw", sceIcuUnknown_7E_h3yiZjKw_nid_no_patch); int APS5_VABI sceIcuUnknown_dzbKmf3Ycog_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } APS5_EXPORT("dzbKmf3Ycog", sceIcuUnknown_dzbKmf3Ycog_nid_no_patch); -int APS5_VABI sceIcuUnknown_AvrA9K2lvC4_nid_no_patch() { +int APS5_VABI u_isJavaIDPart_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("AvrA9K2lvC4", sceIcuUnknown_AvrA9K2lvC4_nid_no_patch); -int APS5_VABI sceIcuUnknown_58CIUaViW_k_nid_no_patch() { +int APS5_VABI u_isJavaIDStart_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("58CIUaViW+k", sceIcuUnknown_58CIUaViW_k_nid_no_patch); -int APS5_VABI sceIcuUnknown_1GkIKiuqgBg_nid_no_patch() { +int APS5_VABI u_isMirrored_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("1GkIKiuqgBg", sceIcuUnknown_1GkIKiuqgBg_nid_no_patch); -int APS5_VABI sceIcuUnknown_qGIX2VTcNJo_nid_no_patch() { +int APS5_VABI u_isUAlphabetic_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("qGIX2VTcNJo", sceIcuUnknown_qGIX2VTcNJo_nid_no_patch); -int APS5_VABI sceIcuUnknown_OJ_13SCOxgI_nid_no_patch() { +int APS5_VABI u_isULowercase_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("OJ+13SCOxgI", sceIcuUnknown_OJ_13SCOxgI_nid_no_patch); -int APS5_VABI sceIcuUnknown_wxirhbbuv84_nid_no_patch() { +int APS5_VABI u_isUUppercase_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("wxirhbbuv84", sceIcuUnknown_wxirhbbuv84_nid_no_patch); -int APS5_VABI sceIcuUnknown__L1K53Ku3mE_nid_no_patch() { +int APS5_VABI u_isalnum_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("+L1K53Ku3mE", sceIcuUnknown__L1K53Ku3mE_nid_no_patch); -int APS5_VABI sceIcuUnknown_LtBBDJEZXhY_nid_no_patch() { +int APS5_VABI u_isalpha_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("LtBBDJEZXhY", sceIcuUnknown_LtBBDJEZXhY_nid_no_patch); -int APS5_VABI sceIcuUnknown_Sv7TbVAEqeQ_nid_no_patch() { +int APS5_VABI u_isbase_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("Sv7TbVAEqeQ", sceIcuUnknown_Sv7TbVAEqeQ_nid_no_patch); -int APS5_VABI sceIcuUnknown_n4o8mgXtF5s_nid_no_patch() { +int APS5_VABI u_iscntrl_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("n4o8mgXtF5s", sceIcuUnknown_n4o8mgXtF5s_nid_no_patch); -int APS5_VABI sceIcuUnknown__P5TDFU2_fc_nid_no_patch() { +int APS5_VABI u_isdefined_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("+P5TDFU2-fc", sceIcuUnknown__P5TDFU2_fc_nid_no_patch); -int APS5_VABI sceIcuUnknown_XVQ3cf0BdQ0_nid_no_patch() { +int APS5_VABI u_isdigit_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("XVQ3cf0BdQ0", sceIcuUnknown_XVQ3cf0BdQ0_nid_no_patch); -int APS5_VABI sceIcuUnknown_HneyXNQpPhQ_nid_no_patch() { +int APS5_VABI u_isgraph_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("HneyXNQpPhQ", sceIcuUnknown_HneyXNQpPhQ_nid_no_patch); -int APS5_VABI sceIcuUnknown_bgnHFMqxYag_nid_no_patch() { +int APS5_VABI u_islower_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("bgnHFMqxYag", sceIcuUnknown_bgnHFMqxYag_nid_no_patch); -int APS5_VABI sceIcuUnknown_LXxEsOsIa5g_nid_no_patch() { +int APS5_VABI u_isprint_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("LXxEsOsIa5g", sceIcuUnknown_LXxEsOsIa5g_nid_no_patch); -int APS5_VABI sceIcuUnknown_Z5_W18jAIH4_nid_no_patch() { +int APS5_VABI u_ispunct_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("Z5+W18jAIH4", sceIcuUnknown_Z5_W18jAIH4_nid_no_patch); -int APS5_VABI sceIcuUnknown_BhCcIlyHMrk_nid_no_patch() { +int APS5_VABI u_istitle_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("BhCcIlyHMrk", sceIcuUnknown_BhCcIlyHMrk_nid_no_patch); -int APS5_VABI sceIcuUnknown_S0WDjcZLdqI_nid_no_patch() { +int APS5_VABI u_isupper_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("S0WDjcZLdqI", sceIcuUnknown_S0WDjcZLdqI_nid_no_patch); -int APS5_VABI sceIcuUnknown_udAPjod3tpU_nid_no_patch() { +int APS5_VABI u_isxdigit_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("udAPjod3tpU", sceIcuUnknown_udAPjod3tpU_nid_no_patch); -int APS5_VABI sceIcuUnknown_CfP4Q2Yjm1U_nid_no_patch() { +int APS5_VABI u_memcasecmp_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("CfP4Q2Yjm1U", sceIcuUnknown_CfP4Q2Yjm1U_nid_no_patch); -int APS5_VABI sceIcuUnknown_sQ0avkeBLo4_nid_no_patch() { +int APS5_VABI u_releaseDefaultConverter_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("sQ0avkeBLo4", sceIcuUnknown_sQ0avkeBLo4_nid_no_patch); int APS5_VABI sceIcuUnknown_yVobQd4t_iA_nid_no_patch() { NotImplemented_nid_no_patch(__func__); @@ -406,25 +352,18 @@ int APS5_VABI sceIcuUnknown_xAo5lvA_W3o_nid_no_patch() { } APS5_EXPORT("xAo5lvA+W3o", sceIcuUnknown_xAo5lvA_W3o_nid_no_patch); -int APS5_VABI sceIcuUnknown_KzcrFzKpYE8_nid_no_patch() { +int APS5_VABI u_strCaseCompare_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("KzcrFzKpYE8", sceIcuUnknown_KzcrFzKpYE8_nid_no_patch); int APS5_VABI sceIcuUnknown_pgvyZZ_d1ck_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } APS5_EXPORT("pgvyZZ+d1ck", sceIcuUnknown_pgvyZZ_d1ck_nid_no_patch); -int APS5_VABI sceIcuUnknown_TNZrG2iXikw_nid_no_patch() { +int APS5_VABI u_strFoldCase_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("TNZrG2iXikw", sceIcuUnknown_TNZrG2iXikw_nid_no_patch); - -int APS5_VABI sceIcuUnknown_Z5ljxAg3thw_nid_no_patch() { - NotImplemented_nid_no_patch(__func__); -} -APS5_EXPORT("Z5ljxAg3thw", sceIcuUnknown_Z5ljxAg3thw_nid_no_patch); int APS5_VABI sceIcuUnknown_OAFz3KoG_gA_nid_no_patch() { NotImplemented_nid_no_patch(__func__); @@ -446,10 +385,9 @@ int APS5_VABI sceIcuUnknown_RIcNJWDYKhM_nid_no_patch() { } APS5_EXPORT("RIcNJWDYKhM", sceIcuUnknown_RIcNJWDYKhM_nid_no_patch); -int APS5_VABI sceIcuUnknown_4FrZfvvYHCI_nid_no_patch() { +int APS5_VABI u_strToLower_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("4FrZfvvYHCI", sceIcuUnknown_4FrZfvvYHCI_nid_no_patch); int APS5_VABI sceIcuUnknown_ZxnyBy8reV4_nid_no_patch() { NotImplemented_nid_no_patch(__func__); @@ -461,20 +399,17 @@ int APS5_VABI sceIcuUnknown_X7gbPHVoNEw_nid_no_patch() { } APS5_EXPORT("X7gbPHVoNEw", sceIcuUnknown_X7gbPHVoNEw_nid_no_patch); -int APS5_VABI sceIcuUnknown_aXUj3BT58vY_nid_no_patch() { +int APS5_VABI u_strToUpper_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("aXUj3BT58vY", sceIcuUnknown_aXUj3BT58vY_nid_no_patch); -int APS5_VABI sceIcuUnknown_FCx2DacLDWs_nid_no_patch() { +int APS5_VABI u_strcasecmp_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("FCx2DacLDWs", sceIcuUnknown_FCx2DacLDWs_nid_no_patch); -int APS5_VABI sceIcuUnknown_ekxUEjhuk3Q_nid_no_patch() { +int APS5_VABI u_strncasecmp_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("ekxUEjhuk3Q", sceIcuUnknown_ekxUEjhuk3Q_nid_no_patch); int APS5_VABI sceIcuUnknown_BsjbIVU27jQ_nid_no_patch() { NotImplemented_nid_no_patch(__func__); diff --git a/core/libs/prx/libSceIcu/Identified.hpp b/core/libs/prx/libSceIcu/Identified.hpp new file mode 100644 index 0000000000..0be2f37e55 --- /dev/null +++ b/core/libs/prx/libSceIcu/Identified.hpp @@ -0,0 +1,80 @@ +#pragma once +#include +#include "prx/libc/include/general/VabiMacros.hpp" + +extern "C" { +int APS5_VABI UCNV_FROM_U_CALLBACK_ESCAPE_nid_postfix(); +int APS5_VABI UCNV_FROM_U_CALLBACK_SUBSTITUTE_nid_postfix(); +int APS5_VABI UCNV_TO_U_CALLBACK_ESCAPE_nid_postfix(); +int APS5_VABI UCNV_TO_U_CALLBACK_SUBSTITUTE_nid_postfix(); +int APS5_VABI locale_getKeywordsStart_nid_postfix(); +int APS5_VABI res_countArrayItems_nid_postfix(); +int APS5_VABI res_getAlias_nid_postfix(); +int APS5_VABI res_getArrayItem_nid_postfix(); +int APS5_VABI res_getBinaryNoTrace_nid_postfix(); +int APS5_VABI res_getIntVectorNoTrace_nid_postfix(); +std::int32_t APS5_VABI res_getPublicType_nid_postfix(std::uint32_t resource); +int APS5_VABI res_getResource_nid_postfix(); +int APS5_VABI res_getStringNoTrace_nid_postfix(); +int APS5_VABI res_getTableItemByIndex_nid_postfix(); +int APS5_VABI res_getTableItemByKey_nid_postfix(); +int APS5_VABI res_read_nid_postfix(); +int APS5_VABI u_caseInsensitivePrefixMatch_nid_postfix(); +int APS5_VABI u_charAge_nid_postfix(); +int APS5_VABI u_charDigitValue_nid_postfix(); +int APS5_VABI u_charDirection_nid_postfix(); +int APS5_VABI u_charFromName_nid_postfix(); +int APS5_VABI u_charMirror_nid_postfix(); +int APS5_VABI u_charName_nid_postfix(); +int APS5_VABI u_charType_nid_postfix(); +int APS5_VABI u_digit_nid_postfix(); +int APS5_VABI u_enumCharNames_nid_postfix(); +int APS5_VABI u_enumCharTypes_nid_postfix(); +int APS5_VABI u_flushDefaultConverter_nid_postfix(); +int APS5_VABI u_foldCase_nid_postfix(); +int APS5_VABI u_getBidiPairedBracket_nid_postfix(); +int APS5_VABI u_getBinaryPropertySet_nid_postfix(); +int APS5_VABI u_getCombiningClass_nid_postfix(); +int APS5_VABI u_getDefaultConverter_nid_postfix(); +int APS5_VABI u_getFC_NFKC_Closure_nid_postfix(); +int APS5_VABI u_getIntPropertyMap_nid_postfix(); +int APS5_VABI u_getIntPropertyMaxValue_nid_postfix(); +int APS5_VABI u_getIntPropertyMinValue_nid_postfix(); +int APS5_VABI u_getIntPropertyValue_nid_postfix(); +int APS5_VABI u_getNumericValue_nid_postfix(); +int APS5_VABI u_getPropertyEnum_nid_postfix(); +int APS5_VABI u_getPropertyName_nid_postfix(); +int APS5_VABI u_getPropertyValueEnum_nid_postfix(); +int APS5_VABI u_getPropertyValueName_nid_postfix(); +int APS5_VABI u_hasBinaryProperty_nid_postfix(); +int APS5_VABI u_isIDIgnorable_nid_postfix(); +int APS5_VABI u_isIDPart_nid_postfix(); +int APS5_VABI u_isIDStart_nid_postfix(); +int APS5_VABI u_isJavaIDPart_nid_postfix(); +int APS5_VABI u_isJavaIDStart_nid_postfix(); +int APS5_VABI u_isMirrored_nid_postfix(); +int APS5_VABI u_isUAlphabetic_nid_postfix(); +int APS5_VABI u_isULowercase_nid_postfix(); +int APS5_VABI u_isUUppercase_nid_postfix(); +int APS5_VABI u_isalnum_nid_postfix(); +int APS5_VABI u_isalpha_nid_postfix(); +int APS5_VABI u_isbase_nid_postfix(); +int APS5_VABI u_iscntrl_nid_postfix(); +int APS5_VABI u_isdefined_nid_postfix(); +int APS5_VABI u_isdigit_nid_postfix(); +int APS5_VABI u_isgraph_nid_postfix(); +int APS5_VABI u_islower_nid_postfix(); +int APS5_VABI u_isprint_nid_postfix(); +int APS5_VABI u_ispunct_nid_postfix(); +int APS5_VABI u_istitle_nid_postfix(); +int APS5_VABI u_isupper_nid_postfix(); +int APS5_VABI u_isxdigit_nid_postfix(); +int APS5_VABI u_memcasecmp_nid_postfix(); +int APS5_VABI u_releaseDefaultConverter_nid_postfix(); +int APS5_VABI u_strCaseCompare_nid_postfix(); +int APS5_VABI u_strFoldCase_nid_postfix(); +int APS5_VABI u_strToLower_nid_postfix(); +int APS5_VABI u_strToUpper_nid_postfix(); +int APS5_VABI u_strcasecmp_nid_postfix(); +int APS5_VABI u_strncasecmp_nid_postfix(); +} diff --git a/core/libs/prx/libSceIcu/Iterator.hpp b/core/libs/prx/libSceIcu/Iterator.hpp new file mode 100644 index 0000000000..ba2136bb31 --- /dev/null +++ b/core/libs/prx/libSceIcu/Iterator.hpp @@ -0,0 +1,51 @@ +#pragma once +#include "prx/libc/include/general/VabiMacros.hpp" +#include +#include + +enum UCharIteratorOrigin : std::int32_t { + UITER_START, + UITER_CURRENT, + UITER_LIMIT, + UITER_ZERO, + UITER_LENGTH +}; + +struct UCharIterator { + using GetIndexFn = std::int32_t (APS5_VABI *)(UCharIterator* iterator, UCharIteratorOrigin origin); + using MoveFn = std::int32_t (APS5_VABI *)(UCharIterator* iterator, std::int32_t delta, UCharIteratorOrigin origin); + using HasNextFn = std::int8_t (APS5_VABI *)(UCharIterator* iterator); + using HasPreviousFn = std::int8_t (APS5_VABI *)(UCharIterator* iterator); + using CurrentFn = std::int32_t (APS5_VABI *)(UCharIterator* iterator); + using NextFn = std::int32_t (APS5_VABI *)(UCharIterator* iterator); + using PreviousFn = std::int32_t (APS5_VABI *)(UCharIterator* iterator); + using ReservedFn = std::int32_t (APS5_VABI *)(UCharIterator* iterator, std::int32_t something); + using GetStateFn = std::uint32_t (APS5_VABI *)(const UCharIterator* iterator); + using SetStateFn = void (APS5_VABI *)(UCharIterator* iterator, std::uint32_t state, std::int32_t* errorCode); + + const void* context; + std::int32_t length; + std::int32_t start; + std::int32_t index; + std::int32_t limit; + std::int32_t reservedField; + GetIndexFn getIndex; + MoveFn move; + HasNextFn hasNext; + HasPreviousFn hasPrevious; + CurrentFn current; + NextFn next; + PreviousFn previous; + ReservedFn reservedFn; + GetStateFn getState; + SetStateFn setState; +}; + +static_assert(sizeof(UCharIteratorOrigin) == 4); +static_assert(offsetof(UCharIterator, getIndex) == 32); +static_assert(offsetof(UCharIterator, setState) == 104); +static_assert(sizeof(UCharIterator) == 112); + +extern "C" { +std::int32_t APS5_VABI u_strCompareIter_nid_postfix(UCharIterator* first, UCharIterator* second, std::uint8_t codePointOrder); +} diff --git a/core/libs/prx/libSceIcu/LegacyExports.cpp b/core/libs/prx/libSceIcu/LegacyExports.cpp new file mode 100644 index 0000000000..d24879e47e --- /dev/null +++ b/core/libs/prx/libSceIcu/LegacyExports.cpp @@ -0,0 +1,11742 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceIcu/include/LegacyExports.hpp" +#include "prx/libc/include/General.hpp" + +extern "C" { + +int APS5_VABI sceIcuLegacyUnknown__plus__plus_DD8eRY6mw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("++DD8eRY6mw", sceIcuLegacyUnknown__plus__plus_DD8eRY6mw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__plus_0Y71J28_minus_cM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+0Y71J28-cM", sceIcuLegacyUnknown__plus_0Y71J28_minus_cM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__plus_52eptnQ6Ac_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+52eptnQ6Ac", sceIcuLegacyUnknown__plus_52eptnQ6Ac_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__plus_77K3m8w7Fo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+77K3m8w7Fo", sceIcuLegacyUnknown__plus_77K3m8w7Fo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__plus_DlYbqV7RQ0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+DlYbqV7RQ0", sceIcuLegacyUnknown__plus_DlYbqV7RQ0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__plus_F2HUw3R_plus_7s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+F2HUw3R+7s", sceIcuLegacyUnknown__plus_F2HUw3R_plus_7s_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__plus_G4gjAnwD8o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+G4gjAnwD8o", sceIcuLegacyUnknown__plus_G4gjAnwD8o_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__plus_G9DDgji4ls_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+G9DDgji4ls", sceIcuLegacyUnknown__plus_G9DDgji4ls_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__plus_LahFsmb_plus_fY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+LahFsmb+fY", sceIcuLegacyUnknown__plus_LahFsmb_plus_fY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__plus_O_minus_z03nQpKE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+O-z03nQpKE", sceIcuLegacyUnknown__plus_O_minus_z03nQpKE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__plus_OXoJcXvd0w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+OXoJcXvd0w", sceIcuLegacyUnknown__plus_OXoJcXvd0w_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__plus_RRw8HqDZeM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+RRw8HqDZeM", sceIcuLegacyUnknown__plus_RRw8HqDZeM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__plus_V7ZusCNjx8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+V7ZusCNjx8", sceIcuLegacyUnknown__plus_V7ZusCNjx8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__plus_WCcBu66P7g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+WCcBu66P7g", sceIcuLegacyUnknown__plus_WCcBu66P7g_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__plus_WqavH2Q4rU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+WqavH2Q4rU", sceIcuLegacyUnknown__plus_WqavH2Q4rU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__plus_YVfbpoDbO4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+YVfbpoDbO4", sceIcuLegacyUnknown__plus_YVfbpoDbO4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__plus_ZODIUViXvs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+ZODIUViXvs", sceIcuLegacyUnknown__plus_ZODIUViXvs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__plus_bsxzdIbCaA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+bsxzdIbCaA", sceIcuLegacyUnknown__plus_bsxzdIbCaA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__plus_cY02h03xhQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+cY02h03xhQ", sceIcuLegacyUnknown__plus_cY02h03xhQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__plus_eNTan5doQk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+eNTan5doQk", sceIcuLegacyUnknown__plus_eNTan5doQk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__plus_hhUuDDqd4M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+hhUuDDqd4M", sceIcuLegacyUnknown__plus_hhUuDDqd4M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__plus_ia_plus_SZpGWBE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+ia+SZpGWBE", sceIcuLegacyUnknown__plus_ia_plus_SZpGWBE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__plus_kokz5WtzzU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+kokz5WtzzU", sceIcuLegacyUnknown__plus_kokz5WtzzU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__plus_nYb6g2zJHw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+nYb6g2zJHw", sceIcuLegacyUnknown__plus_nYb6g2zJHw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__plus_px0ii5HIzU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+px0ii5HIzU", sceIcuLegacyUnknown__plus_px0ii5HIzU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__plus_qtvw03UMYE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+qtvw03UMYE", sceIcuLegacyUnknown__plus_qtvw03UMYE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__plus_rN8EpE5vS8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+rN8EpE5vS8", sceIcuLegacyUnknown__plus_rN8EpE5vS8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__plus_rv2q2Va67M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+rv2q2Va67M", sceIcuLegacyUnknown__plus_rv2q2Va67M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__plus_sWc_plus_Z4PpGE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+sWc+Z4PpGE", sceIcuLegacyUnknown__plus_sWc_plus_Z4PpGE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__plus_tN1MNhj0w0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+tN1MNhj0w0", sceIcuLegacyUnknown__plus_tN1MNhj0w0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__plus_uigfKS2jic_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+uigfKS2jic", sceIcuLegacyUnknown__plus_uigfKS2jic_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__plus_wZj5WL3zfo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+wZj5WL3zfo", sceIcuLegacyUnknown__plus_wZj5WL3zfo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__plus_xUe3qWJH3I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+xUe3qWJH3I", sceIcuLegacyUnknown__plus_xUe3qWJH3I_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__plus_yTcUbxieO8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+yTcUbxieO8", sceIcuLegacyUnknown__plus_yTcUbxieO8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__plus_ydVYIaYo6w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+ydVYIaYo6w", sceIcuLegacyUnknown__plus_ydVYIaYo6w_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__plus_zWvRR9TePc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+zWvRR9TePc", sceIcuLegacyUnknown__plus_zWvRR9TePc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__plus_zt6Z3CTHGE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+zt6Z3CTHGE", sceIcuLegacyUnknown__plus_zt6Z3CTHGE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__minus_1flXphRNrw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-1flXphRNrw", sceIcuLegacyUnknown__minus_1flXphRNrw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__minus_4dhc9m_minus_vfs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-4dhc9m-vfs", sceIcuLegacyUnknown__minus_4dhc9m_minus_vfs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__minus_5VmFLmG7EY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-5VmFLmG7EY", sceIcuLegacyUnknown__minus_5VmFLmG7EY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__minus_8rPOnonqLI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-8rPOnonqLI", sceIcuLegacyUnknown__minus_8rPOnonqLI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__minus_8vX2t8cKRw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-8vX2t8cKRw", sceIcuLegacyUnknown__minus_8vX2t8cKRw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__minus_9TH_minus_30ItNI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-9TH-30ItNI", sceIcuLegacyUnknown__minus_9TH_minus_30ItNI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__minus_BjZzTTOnXs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-BjZzTTOnXs", sceIcuLegacyUnknown__minus_BjZzTTOnXs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__minus_ClgCo37kUo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-ClgCo37kUo", sceIcuLegacyUnknown__minus_ClgCo37kUo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__minus_HN1FUTwb_minus_Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-HN1FUTwb-Y", sceIcuLegacyUnknown__minus_HN1FUTwb_minus_Y_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__minus_IP5f0ezh8s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-IP5f0ezh8s", sceIcuLegacyUnknown__minus_IP5f0ezh8s_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__minus_Ig3OXhkUaY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-Ig3OXhkUaY", sceIcuLegacyUnknown__minus_Ig3OXhkUaY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__minus_JE46LEGd1Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-JE46LEGd1Q", sceIcuLegacyUnknown__minus_JE46LEGd1Q_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__minus_JdpmhDLKFk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-JdpmhDLKFk", sceIcuLegacyUnknown__minus_JdpmhDLKFk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__minus_ONE6xozIpM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-ONE6xozIpM", sceIcuLegacyUnknown__minus_ONE6xozIpM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__minus_PUXbMD1aIo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-PUXbMD1aIo", sceIcuLegacyUnknown__minus_PUXbMD1aIo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__minus_QoN5MMk6R4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-QoN5MMk6R4", sceIcuLegacyUnknown__minus_QoN5MMk6R4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__minus_U6OHKQLYBI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-U6OHKQLYBI", sceIcuLegacyUnknown__minus_U6OHKQLYBI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__minus_YnkUO45kTQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-YnkUO45kTQ", sceIcuLegacyUnknown__minus_YnkUO45kTQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__minus_aat1epaErY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-aat1epaErY", sceIcuLegacyUnknown__minus_aat1epaErY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__minus_bfgP8FN6oo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-bfgP8FN6oo", sceIcuLegacyUnknown__minus_bfgP8FN6oo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__minus_cqxOPlkLKU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-cqxOPlkLKU", sceIcuLegacyUnknown__minus_cqxOPlkLKU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__minus_fPpQmob8eM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-fPpQmob8eM", sceIcuLegacyUnknown__minus_fPpQmob8eM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__minus_jErZVgOKnQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-jErZVgOKnQ", sceIcuLegacyUnknown__minus_jErZVgOKnQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__minus_mNjSBFthmY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-mNjSBFthmY", sceIcuLegacyUnknown__minus_mNjSBFthmY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__minus_nIZEq0wDP8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-nIZEq0wDP8", sceIcuLegacyUnknown__minus_nIZEq0wDP8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__minus_ogBWgqYS80_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-ogBWgqYS80", sceIcuLegacyUnknown__minus_ogBWgqYS80_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__minus_rBq6DbmJP8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-rBq6DbmJP8", sceIcuLegacyUnknown__minus_rBq6DbmJP8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__minus_uIJMampTl4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-uIJMampTl4", sceIcuLegacyUnknown__minus_uIJMampTl4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__minus_vuNygTslwQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-vuNygTslwQ", sceIcuLegacyUnknown__minus_vuNygTslwQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__minus_wLjIvYzJEg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-wLjIvYzJEg", sceIcuLegacyUnknown__minus_wLjIvYzJEg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__minus_wV7wE9SH_minus_I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-wV7wE9SH-I", sceIcuLegacyUnknown__minus_wV7wE9SH_minus_I_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__minus_wdxqJNSaio_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-wdxqJNSaio", sceIcuLegacyUnknown__minus_wdxqJNSaio_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__minus_wkkoEzpQjQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-wkkoEzpQjQ", sceIcuLegacyUnknown__minus_wkkoEzpQjQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown__minus_zgN_plus_ttH3gU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-zgN+ttH3gU", sceIcuLegacyUnknown__minus_zgN_plus_ttH3gU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_0_plus_EP910KiRY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0+EP910KiRY", sceIcuLegacyUnknown_0_plus_EP910KiRY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_0_minus_olJNtiaeQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0-olJNtiaeQ", sceIcuLegacyUnknown_0_minus_olJNtiaeQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_00yrdeXel_minus_k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("00yrdeXel-k", sceIcuLegacyUnknown_00yrdeXel_minus_k_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_02yqiMxbKKU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("02yqiMxbKKU", sceIcuLegacyUnknown_02yqiMxbKKU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_03N9BE6uvpo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("03N9BE6uvpo", sceIcuLegacyUnknown_03N9BE6uvpo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_03uaawLzEo4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("03uaawLzEo4", sceIcuLegacyUnknown_03uaawLzEo4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_06kWUyne1pI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("06kWUyne1pI", sceIcuLegacyUnknown_06kWUyne1pI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_06lFuBZgFg8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("06lFuBZgFg8", sceIcuLegacyUnknown_06lFuBZgFg8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_07Vf0tgcA0A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("07Vf0tgcA0A", sceIcuLegacyUnknown_07Vf0tgcA0A_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_07l6cysr09c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("07l6cysr09c", sceIcuLegacyUnknown_07l6cysr09c_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_0AObz1ibcXg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0AObz1ibcXg", sceIcuLegacyUnknown_0AObz1ibcXg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_0DGoeEvu4Tc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0DGoeEvu4Tc", sceIcuLegacyUnknown_0DGoeEvu4Tc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_0GHxanfamVA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0GHxanfamVA", sceIcuLegacyUnknown_0GHxanfamVA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_0ICGFGAjfzc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0ICGFGAjfzc", sceIcuLegacyUnknown_0ICGFGAjfzc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_0IIeRyDSKiY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0IIeRyDSKiY", sceIcuLegacyUnknown_0IIeRyDSKiY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_0JIoY7BEjms_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0JIoY7BEjms", sceIcuLegacyUnknown_0JIoY7BEjms_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_0MTJN5cvZGI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0MTJN5cvZGI", sceIcuLegacyUnknown_0MTJN5cvZGI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_0NEGEdzvNw4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0NEGEdzvNw4", sceIcuLegacyUnknown_0NEGEdzvNw4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_0OVoam5Maq8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0OVoam5Maq8", sceIcuLegacyUnknown_0OVoam5Maq8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_0TnwC0nPUXk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0TnwC0nPUXk", sceIcuLegacyUnknown_0TnwC0nPUXk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_0Tudp8NZ3jg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0Tudp8NZ3jg", sceIcuLegacyUnknown_0Tudp8NZ3jg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_0UQu9LKbOrc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0UQu9LKbOrc", sceIcuLegacyUnknown_0UQu9LKbOrc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_0UgJRpFQKco_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0UgJRpFQKco", sceIcuLegacyUnknown_0UgJRpFQKco_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_0WSM7vJVmYE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0WSM7vJVmYE", sceIcuLegacyUnknown_0WSM7vJVmYE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_0YWzn0WKU44_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0YWzn0WKU44", sceIcuLegacyUnknown_0YWzn0WKU44_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_0ZHUcvkrLyI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0ZHUcvkrLyI", sceIcuLegacyUnknown_0ZHUcvkrLyI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_0c6b_plus_XCqt9o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0c6b+XCqt9o", sceIcuLegacyUnknown_0c6b_plus_XCqt9o_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_0e6vZxUFLvE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0e6vZxUFLvE", sceIcuLegacyUnknown_0e6vZxUFLvE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_0jN58mezFe0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0jN58mezFe0", sceIcuLegacyUnknown_0jN58mezFe0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_0nrht0BgxEQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0nrht0BgxEQ", sceIcuLegacyUnknown_0nrht0BgxEQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_0pw_plus_YWeLlIM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0pw+YWeLlIM", sceIcuLegacyUnknown_0pw_plus_YWeLlIM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_0qlsx0u0PMM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0qlsx0u0PMM", sceIcuLegacyUnknown_0qlsx0u0PMM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_0rZSXuHb14g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0rZSXuHb14g", sceIcuLegacyUnknown_0rZSXuHb14g_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_0scP_plus_RiZ1vc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0scP+RiZ1vc", sceIcuLegacyUnknown_0scP_plus_RiZ1vc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_0um_minus_QZ_minus_FStE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0um-QZ-FStE", sceIcuLegacyUnknown_0um_minus_QZ_minus_FStE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_0ysbJYyPbig_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0ysbJYyPbig", sceIcuLegacyUnknown_0ysbJYyPbig_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_14a9pKEYd7c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("14a9pKEYd7c", sceIcuLegacyUnknown_14a9pKEYd7c_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_17AU4VHNGec_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("17AU4VHNGec", sceIcuLegacyUnknown_17AU4VHNGec_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_1AzLgo3rATM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1AzLgo3rATM", sceIcuLegacyUnknown_1AzLgo3rATM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_1B8JLGu62mE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1B8JLGu62mE", sceIcuLegacyUnknown_1B8JLGu62mE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_1DFhG_plus_P0EYM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1DFhG+P0EYM", sceIcuLegacyUnknown_1DFhG_plus_P0EYM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_1Eovd96K_minus_Eo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1Eovd96K-Eo", sceIcuLegacyUnknown_1Eovd96K_minus_Eo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_1G1zdxo5KCk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1G1zdxo5KCk", sceIcuLegacyUnknown_1G1zdxo5KCk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_1JevuWL_minus_iMg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1JevuWL-iMg", sceIcuLegacyUnknown_1JevuWL_minus_iMg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_1LicYZSc3Q8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1LicYZSc3Q8", sceIcuLegacyUnknown_1LicYZSc3Q8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_1PD0nXtIXJ4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1PD0nXtIXJ4", sceIcuLegacyUnknown_1PD0nXtIXJ4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_1QeMhl0kTkU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1QeMhl0kTkU", sceIcuLegacyUnknown_1QeMhl0kTkU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_1QqT4Qbl38g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1QqT4Qbl38g", sceIcuLegacyUnknown_1QqT4Qbl38g_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_1WYMrva0udA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1WYMrva0udA", sceIcuLegacyUnknown_1WYMrva0udA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_1Zjsilgzlps_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1Zjsilgzlps", sceIcuLegacyUnknown_1Zjsilgzlps_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_1ZsyvW153aY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1ZsyvW153aY", sceIcuLegacyUnknown_1ZsyvW153aY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_1bRdTDPYlLA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1bRdTDPYlLA", sceIcuLegacyUnknown_1bRdTDPYlLA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_1bjQ9GJVkDM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1bjQ9GJVkDM", sceIcuLegacyUnknown_1bjQ9GJVkDM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_1fdgrQASVRg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1fdgrQASVRg", sceIcuLegacyUnknown_1fdgrQASVRg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_1fje2PbqEEA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1fje2PbqEEA", sceIcuLegacyUnknown_1fje2PbqEEA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_1g8eVPDkqCM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1g8eVPDkqCM", sceIcuLegacyUnknown_1g8eVPDkqCM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_1gbTKeDPab8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1gbTKeDPab8", sceIcuLegacyUnknown_1gbTKeDPab8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_1k6Jl84oTeI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1k6Jl84oTeI", sceIcuLegacyUnknown_1k6Jl84oTeI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_1kBbJxcDbCg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1kBbJxcDbCg", sceIcuLegacyUnknown_1kBbJxcDbCg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_1nek04WkGb0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1nek04WkGb0", sceIcuLegacyUnknown_1nek04WkGb0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_1p0FEYfvSns_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1p0FEYfvSns", sceIcuLegacyUnknown_1p0FEYfvSns_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_1pauWHrK69Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1pauWHrK69Y", sceIcuLegacyUnknown_1pauWHrK69Y_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_1q0LOIFUgeI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1q0LOIFUgeI", sceIcuLegacyUnknown_1q0LOIFUgeI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_1sUkZWnzYJA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1sUkZWnzYJA", sceIcuLegacyUnknown_1sUkZWnzYJA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_1tote7KnZZ8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1tote7KnZZ8", sceIcuLegacyUnknown_1tote7KnZZ8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_1uiDWP8AjtA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1uiDWP8AjtA", sceIcuLegacyUnknown_1uiDWP8AjtA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_1vHTKNSml4c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1vHTKNSml4c", sceIcuLegacyUnknown_1vHTKNSml4c_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_1w4mtKgopd0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1w4mtKgopd0", sceIcuLegacyUnknown_1w4mtKgopd0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_26aHn8ffkHU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("26aHn8ffkHU", sceIcuLegacyUnknown_26aHn8ffkHU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_29ENWa_plus_HYpo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("29ENWa+HYpo", sceIcuLegacyUnknown_29ENWa_plus_HYpo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_29UZt_plus_Zh554_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("29UZt+Zh554", sceIcuLegacyUnknown_29UZt_plus_Zh554_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_2BbwkVOovdE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2BbwkVOovdE", sceIcuLegacyUnknown_2BbwkVOovdE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_2FzdaDz8zYg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2FzdaDz8zYg", sceIcuLegacyUnknown_2FzdaDz8zYg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_2J8BwvsmnNA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2J8BwvsmnNA", sceIcuLegacyUnknown_2J8BwvsmnNA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_2LBrwaWFRsA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2LBrwaWFRsA", sceIcuLegacyUnknown_2LBrwaWFRsA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_2LG5XuHjr60_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2LG5XuHjr60", sceIcuLegacyUnknown_2LG5XuHjr60_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_2MQdIASFIDg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2MQdIASFIDg", sceIcuLegacyUnknown_2MQdIASFIDg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_2NJ2U_plus_r8APM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2NJ2U+r8APM", sceIcuLegacyUnknown_2NJ2U_plus_r8APM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_2OEoHDMD_minus_7k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2OEoHDMD-7k", sceIcuLegacyUnknown_2OEoHDMD_minus_7k_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_2P_minus_2TAuqsTw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2P-2TAuqsTw", sceIcuLegacyUnknown_2P_minus_2TAuqsTw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_2PSYQXpfB64_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2PSYQXpfB64", sceIcuLegacyUnknown_2PSYQXpfB64_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_2QSKf7JvliA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2QSKf7JvliA", sceIcuLegacyUnknown_2QSKf7JvliA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_2REynpmGn9U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2REynpmGn9U", sceIcuLegacyUnknown_2REynpmGn9U_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_2V6fVvK7DzM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2V6fVvK7DzM", sceIcuLegacyUnknown_2V6fVvK7DzM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_2WP_plus_PRN_plus_Tm8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2WP+PRN+Tm8", sceIcuLegacyUnknown_2WP_plus_PRN_plus_Tm8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_2WjCdmKwlOA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2WjCdmKwlOA", sceIcuLegacyUnknown_2WjCdmKwlOA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_2YRqfNusLmQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2YRqfNusLmQ", sceIcuLegacyUnknown_2YRqfNusLmQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_2Z_minus__plus_jlza4P0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2Z-+jlza4P0", sceIcuLegacyUnknown_2Z_minus__plus_jlza4P0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_2ga4PiukfYc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2ga4PiukfYc", sceIcuLegacyUnknown_2ga4PiukfYc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_2kDzl5NtoCI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2kDzl5NtoCI", sceIcuLegacyUnknown_2kDzl5NtoCI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_2lAenv_minus_SkNA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2lAenv-SkNA", sceIcuLegacyUnknown_2lAenv_minus_SkNA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_2lgT4AMFVfk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2lgT4AMFVfk", sceIcuLegacyUnknown_2lgT4AMFVfk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_2nhGEJ9Wms4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2nhGEJ9Wms4", sceIcuLegacyUnknown_2nhGEJ9Wms4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_2qCRtOAee_plus_4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2qCRtOAee+4", sceIcuLegacyUnknown_2qCRtOAee_plus_4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_2t3H7LAAANU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2t3H7LAAANU", sceIcuLegacyUnknown_2t3H7LAAANU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_2t7JjJuVD2g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2t7JjJuVD2g", sceIcuLegacyUnknown_2t7JjJuVD2g_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_2v2_plus_PgpIdLc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2v2+PgpIdLc", sceIcuLegacyUnknown_2v2_plus_PgpIdLc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_2wwoqH2KOxE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2wwoqH2KOxE", sceIcuLegacyUnknown_2wwoqH2KOxE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_2y_minus_9xpH0F_minus_s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2y-9xpH0F-s", sceIcuLegacyUnknown_2y_minus_9xpH0F_minus_s_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_3_plus__minus_eXC_minus_sHJE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3+-eXC-sHJE", sceIcuLegacyUnknown_3_plus__minus_eXC_minus_sHJE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_3_minus_kL54G6PQE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3-kL54G6PQE", sceIcuLegacyUnknown_3_minus_kL54G6PQE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_31HKveo6ZNc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("31HKveo6ZNc", sceIcuLegacyUnknown_31HKveo6ZNc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_31pIPUL8Ksg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("31pIPUL8Ksg", sceIcuLegacyUnknown_31pIPUL8Ksg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_33UUTsNxvJY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("33UUTsNxvJY", sceIcuLegacyUnknown_33UUTsNxvJY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_38A9UlubjGw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("38A9UlubjGw", sceIcuLegacyUnknown_38A9UlubjGw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_39DeDVjJXQ8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("39DeDVjJXQ8", sceIcuLegacyUnknown_39DeDVjJXQ8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_3DhL2Ls0eLg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3DhL2Ls0eLg", sceIcuLegacyUnknown_3DhL2Ls0eLg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_3Dov9hmHaAk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3Dov9hmHaAk", sceIcuLegacyUnknown_3Dov9hmHaAk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_3FHpsgySlUE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3FHpsgySlUE", sceIcuLegacyUnknown_3FHpsgySlUE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_3FXgs3h_plus_iug_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3FXgs3h+iug", sceIcuLegacyUnknown_3FXgs3h_plus_iug_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_3Ig7wunK6yU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3Ig7wunK6yU", sceIcuLegacyUnknown_3Ig7wunK6yU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_3J2cJnDt4IY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3J2cJnDt4IY", sceIcuLegacyUnknown_3J2cJnDt4IY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_3JwpiS_plus_eIQM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3JwpiS+eIQM", sceIcuLegacyUnknown_3JwpiS_plus_eIQM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_3KafdPaGfGs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3KafdPaGfGs", sceIcuLegacyUnknown_3KafdPaGfGs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_3M77S7_plus_mqc4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3M77S7+mqc4", sceIcuLegacyUnknown_3M77S7_plus_mqc4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_3MRfGDojJF4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3MRfGDojJF4", sceIcuLegacyUnknown_3MRfGDojJF4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_3Mv4rhuibnc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3Mv4rhuibnc", sceIcuLegacyUnknown_3Mv4rhuibnc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_3PrhSO6dCns_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3PrhSO6dCns", sceIcuLegacyUnknown_3PrhSO6dCns_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_3Ps_plus_hlmBTMs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3Ps+hlmBTMs", sceIcuLegacyUnknown_3Ps_plus_hlmBTMs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_3SD7R26xqXE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3SD7R26xqXE", sceIcuLegacyUnknown_3SD7R26xqXE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_3T3S5CJpecI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3T3S5CJpecI", sceIcuLegacyUnknown_3T3S5CJpecI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_3Ty3zLmTy6E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3Ty3zLmTy6E", sceIcuLegacyUnknown_3Ty3zLmTy6E_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_3WfSV0_plus_G32g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3WfSV0+G32g", sceIcuLegacyUnknown_3WfSV0_plus_G32g_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_3bI32XONrnU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3bI32XONrnU", sceIcuLegacyUnknown_3bI32XONrnU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_3liORHk2E34_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3liORHk2E34", sceIcuLegacyUnknown_3liORHk2E34_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_3ng2Nc7ipgo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3ng2Nc7ipgo", sceIcuLegacyUnknown_3ng2Nc7ipgo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_3okGL4Cutpk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3okGL4Cutpk", sceIcuLegacyUnknown_3okGL4Cutpk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_3pliHFvh22Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3pliHFvh22Y", sceIcuLegacyUnknown_3pliHFvh22Y_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_3qA1USjroSE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3qA1USjroSE", sceIcuLegacyUnknown_3qA1USjroSE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_3reaN7bH25E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3reaN7bH25E", sceIcuLegacyUnknown_3reaN7bH25E_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_3tJ8UEosCLc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3tJ8UEosCLc", sceIcuLegacyUnknown_3tJ8UEosCLc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_3tfuPx_minus_8qL0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3tfuPx-8qL0", sceIcuLegacyUnknown_3tfuPx_minus_8qL0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_3vTFnRNfm3g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3vTFnRNfm3g", sceIcuLegacyUnknown_3vTFnRNfm3g_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_3xGrCs6nGKA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3xGrCs6nGKA", sceIcuLegacyUnknown_3xGrCs6nGKA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_3yXJHxARCvQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3yXJHxARCvQ", sceIcuLegacyUnknown_3yXJHxARCvQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_400ZbLVPq7k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("400ZbLVPq7k", sceIcuLegacyUnknown_400ZbLVPq7k_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_40y5c743WCw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("40y5c743WCw", sceIcuLegacyUnknown_40y5c743WCw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_41Ny9FV0dHg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("41Ny9FV0dHg", sceIcuLegacyUnknown_41Ny9FV0dHg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_45M3NG6fOK0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("45M3NG6fOK0", sceIcuLegacyUnknown_45M3NG6fOK0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_46pVr5Vsm18_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("46pVr5Vsm18", sceIcuLegacyUnknown_46pVr5Vsm18_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_49G9TmtmutI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("49G9TmtmutI", sceIcuLegacyUnknown_49G9TmtmutI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_49T6Z4UNfkc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("49T6Z4UNfkc", sceIcuLegacyUnknown_49T6Z4UNfkc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_49xx3RbyHC0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("49xx3RbyHC0", sceIcuLegacyUnknown_49xx3RbyHC0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_4A_plus_ghLPiPBI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4A+ghLPiPBI", sceIcuLegacyUnknown_4A_plus_ghLPiPBI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_4AeztwioxWg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4AeztwioxWg", sceIcuLegacyUnknown_4AeztwioxWg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_4BUuvbmiXWs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4BUuvbmiXWs", sceIcuLegacyUnknown_4BUuvbmiXWs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_4CGhCcyWr1o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4CGhCcyWr1o", sceIcuLegacyUnknown_4CGhCcyWr1o_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_4E2E0V4hg0k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4E2E0V4hg0k", sceIcuLegacyUnknown_4E2E0V4hg0k_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_4Fa_plus_ZmJ8qn4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4Fa+ZmJ8qn4", sceIcuLegacyUnknown_4Fa_plus_ZmJ8qn4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_4Gy_plus_uvLI20c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4Gy+uvLI20c", sceIcuLegacyUnknown_4Gy_plus_uvLI20c_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_4HO90IKdeCU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4HO90IKdeCU", sceIcuLegacyUnknown_4HO90IKdeCU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_4MAf3f9YAp0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4MAf3f9YAp0", sceIcuLegacyUnknown_4MAf3f9YAp0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_4TCICEP2ap0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4TCICEP2ap0", sceIcuLegacyUnknown_4TCICEP2ap0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_4XwsW1cV91w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4XwsW1cV91w", sceIcuLegacyUnknown_4XwsW1cV91w_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_4Yna719ts4M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4Yna719ts4M", sceIcuLegacyUnknown_4Yna719ts4M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_4ZnLb8onM_plus_w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4ZnLb8onM+w", sceIcuLegacyUnknown_4ZnLb8onM_plus_w_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_4aggYAZbAqU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4aggYAZbAqU", sceIcuLegacyUnknown_4aggYAZbAqU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_4d6jiNn6CKI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4d6jiNn6CKI", sceIcuLegacyUnknown_4d6jiNn6CKI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_4d7T8Td75_plus_M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4d7T8Td75+M", sceIcuLegacyUnknown_4d7T8Td75_plus_M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_4gxNCnf2pYY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4gxNCnf2pYY", sceIcuLegacyUnknown_4gxNCnf2pYY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_4hbdNm_plus_cRu4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4hbdNm+cRu4", sceIcuLegacyUnknown_4hbdNm_plus_cRu4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_4lqHnr_minus_vIUE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4lqHnr-vIUE", sceIcuLegacyUnknown_4lqHnr_minus_vIUE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_4nV_minus_ejO0KIc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4nV-ejO0KIc", sceIcuLegacyUnknown_4nV_minus_ejO0KIc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_4rJkixSlT4U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4rJkixSlT4U", sceIcuLegacyUnknown_4rJkixSlT4U_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_4sD0BH9dn0s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4sD0BH9dn0s", sceIcuLegacyUnknown_4sD0BH9dn0s_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_4u91SYQzJzA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4u91SYQzJzA", sceIcuLegacyUnknown_4u91SYQzJzA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_4vqjI8gmXP8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4vqjI8gmXP8", sceIcuLegacyUnknown_4vqjI8gmXP8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_5_minus_CVJbmzRFE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5-CVJbmzRFE", sceIcuLegacyUnknown_5_minus_CVJbmzRFE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_50zuUppOUQQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("50zuUppOUQQ", sceIcuLegacyUnknown_50zuUppOUQQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_52WUgTwyH2s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("52WUgTwyH2s", sceIcuLegacyUnknown_52WUgTwyH2s_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_53HddFGzkKA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("53HddFGzkKA", sceIcuLegacyUnknown_53HddFGzkKA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_552Oh3lsLHQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("552Oh3lsLHQ", sceIcuLegacyUnknown_552Oh3lsLHQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_57B4p3HC1us_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("57B4p3HC1us", sceIcuLegacyUnknown_57B4p3HC1us_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_57hBP8lBBC4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("57hBP8lBBC4", sceIcuLegacyUnknown_57hBP8lBBC4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_5AKCnEfGT_plus_Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5AKCnEfGT+Y", sceIcuLegacyUnknown_5AKCnEfGT_plus_Y_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_5Ag8q0zzoo8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5Ag8q0zzoo8", sceIcuLegacyUnknown_5Ag8q0zzoo8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_5AvS0pXujVk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5AvS0pXujVk", sceIcuLegacyUnknown_5AvS0pXujVk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_5DSaJa2UKUA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5DSaJa2UKUA", sceIcuLegacyUnknown_5DSaJa2UKUA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_5HvAGuMPFgU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5HvAGuMPFgU", sceIcuLegacyUnknown_5HvAGuMPFgU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_5KHYziMl9Bs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5KHYziMl9Bs", sceIcuLegacyUnknown_5KHYziMl9Bs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_5N_plus_D61hLy1Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5N+D61hLy1Q", sceIcuLegacyUnknown_5N_plus_D61hLy1Q_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_5NBMAeDDAR0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5NBMAeDDAR0", sceIcuLegacyUnknown_5NBMAeDDAR0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_5Nwi8pVhpIY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5Nwi8pVhpIY", sceIcuLegacyUnknown_5Nwi8pVhpIY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_5OB7GYcEOzE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5OB7GYcEOzE", sceIcuLegacyUnknown_5OB7GYcEOzE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_5OpUyueKjdo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5OpUyueKjdo", sceIcuLegacyUnknown_5OpUyueKjdo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_5PWa4hFDg7I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5PWa4hFDg7I", sceIcuLegacyUnknown_5PWa4hFDg7I_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_5S_minus_OvM8yw9I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5S-OvM8yw9I", sceIcuLegacyUnknown_5S_minus_OvM8yw9I_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_5SpzTlcpsLs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5SpzTlcpsLs", sceIcuLegacyUnknown_5SpzTlcpsLs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_5UYbef67h_minus_o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5UYbef67h-o", sceIcuLegacyUnknown_5UYbef67h_minus_o_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_5UgPm09wiZQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5UgPm09wiZQ", sceIcuLegacyUnknown_5UgPm09wiZQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_5WCOijNlG2c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5WCOijNlG2c", sceIcuLegacyUnknown_5WCOijNlG2c_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_5XZt1PoqjVI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5XZt1PoqjVI", sceIcuLegacyUnknown_5XZt1PoqjVI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_5ZfH5ACb6N8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5ZfH5ACb6N8", sceIcuLegacyUnknown_5ZfH5ACb6N8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_5bcZomziXao_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5bcZomziXao", sceIcuLegacyUnknown_5bcZomziXao_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_5cYyEu1Ka2Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5cYyEu1Ka2Y", sceIcuLegacyUnknown_5cYyEu1Ka2Y_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_5cvU1Vq46XI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5cvU1Vq46XI", sceIcuLegacyUnknown_5cvU1Vq46XI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_5fC5WIiN_plus_Ac_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5fC5WIiN+Ac", sceIcuLegacyUnknown_5fC5WIiN_plus_Ac_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_5hMEsk6LsJU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5hMEsk6LsJU", sceIcuLegacyUnknown_5hMEsk6LsJU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_5i7kNj3aRSQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5i7kNj3aRSQ", sceIcuLegacyUnknown_5i7kNj3aRSQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_5jXnzyO60HQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5jXnzyO60HQ", sceIcuLegacyUnknown_5jXnzyO60HQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_5l3u5zIaF1w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5l3u5zIaF1w", sceIcuLegacyUnknown_5l3u5zIaF1w_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_5lsofcKpsOg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5lsofcKpsOg", sceIcuLegacyUnknown_5lsofcKpsOg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_5oePUQeJ7dg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5oePUQeJ7dg", sceIcuLegacyUnknown_5oePUQeJ7dg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_5q0suac3C_plus_8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5q0suac3C+8", sceIcuLegacyUnknown_5q0suac3C_plus_8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_5s0ydPMO0f0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5s0ydPMO0f0", sceIcuLegacyUnknown_5s0ydPMO0f0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_5tc_plus_6cE9fAc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5tc+6cE9fAc", sceIcuLegacyUnknown_5tc_plus_6cE9fAc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_5yoxeYXrdUE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5yoxeYXrdUE", sceIcuLegacyUnknown_5yoxeYXrdUE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_5zXCzWZhwaQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5zXCzWZhwaQ", sceIcuLegacyUnknown_5zXCzWZhwaQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_6_plus_Jj2oxVAFg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6+Jj2oxVAFg", sceIcuLegacyUnknown_6_plus_Jj2oxVAFg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_6_plus_Yy8QFHM0c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6+Yy8QFHM0c", sceIcuLegacyUnknown_6_plus_Yy8QFHM0c_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_6_minus_jAY7vwHws_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6-jAY7vwHws", sceIcuLegacyUnknown_6_minus_jAY7vwHws_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_6_minus_tsk3uHsz0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6-tsk3uHsz0", sceIcuLegacyUnknown_6_minus_tsk3uHsz0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_60IMrY75T6w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("60IMrY75T6w", sceIcuLegacyUnknown_60IMrY75T6w_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_661mp52xIO4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("661mp52xIO4", sceIcuLegacyUnknown_661mp52xIO4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_6678fYDS57Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6678fYDS57Q", sceIcuLegacyUnknown_6678fYDS57Q_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_68Pa3zZZe6M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("68Pa3zZZe6M", sceIcuLegacyUnknown_68Pa3zZZe6M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_68uKzUhNGcw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("68uKzUhNGcw", sceIcuLegacyUnknown_68uKzUhNGcw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_6AYtfmV_plus_2PQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6AYtfmV+2PQ", sceIcuLegacyUnknown_6AYtfmV_plus_2PQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_6AxJTT7_minus_yKA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6AxJTT7-yKA", sceIcuLegacyUnknown_6AxJTT7_minus_yKA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_6Dr_minus_30Wd4bA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6Dr-30Wd4bA", sceIcuLegacyUnknown_6Dr_minus_30Wd4bA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_6E6JYwebVac_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6E6JYwebVac", sceIcuLegacyUnknown_6E6JYwebVac_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_6EDEhWJtJAo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6EDEhWJtJAo", sceIcuLegacyUnknown_6EDEhWJtJAo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_6EkmAWp8AnA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6EkmAWp8AnA", sceIcuLegacyUnknown_6EkmAWp8AnA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_6FQgKV7rOxQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6FQgKV7rOxQ", sceIcuLegacyUnknown_6FQgKV7rOxQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_6FXFOERWLU8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6FXFOERWLU8", sceIcuLegacyUnknown_6FXFOERWLU8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_6HStelDKW4I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6HStelDKW4I", sceIcuLegacyUnknown_6HStelDKW4I_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_6HratGh9IeU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6HratGh9IeU", sceIcuLegacyUnknown_6HratGh9IeU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_6IbM4WFRQAQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6IbM4WFRQAQ", sceIcuLegacyUnknown_6IbM4WFRQAQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_6KsOlzLtoaE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6KsOlzLtoaE", sceIcuLegacyUnknown_6KsOlzLtoaE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_6PXF8T3sDmA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6PXF8T3sDmA", sceIcuLegacyUnknown_6PXF8T3sDmA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_6PiboOUBRro_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6PiboOUBRro", sceIcuLegacyUnknown_6PiboOUBRro_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_6QCOea4SMrg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6QCOea4SMrg", sceIcuLegacyUnknown_6QCOea4SMrg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_6TEwaLqQl_plus_A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6TEwaLqQl+A", sceIcuLegacyUnknown_6TEwaLqQl_plus_A_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_6Y1aFRqHq7I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6Y1aFRqHq7I", sceIcuLegacyUnknown_6Y1aFRqHq7I_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_6YIq5v9QLDU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6YIq5v9QLDU", sceIcuLegacyUnknown_6YIq5v9QLDU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_6Ym9UeRkaGA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6Ym9UeRkaGA", sceIcuLegacyUnknown_6Ym9UeRkaGA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_6cS4iJCfY54_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6cS4iJCfY54", sceIcuLegacyUnknown_6cS4iJCfY54_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_6d2qHvGiaRc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6d2qHvGiaRc", sceIcuLegacyUnknown_6d2qHvGiaRc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_6dsRe_minus_93_plus_zg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6dsRe-93+zg", sceIcuLegacyUnknown_6dsRe_minus_93_plus_zg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_6f3orOPOKzk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6f3orOPOKzk", sceIcuLegacyUnknown_6f3orOPOKzk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_6ibhL52eSks_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6ibhL52eSks", sceIcuLegacyUnknown_6ibhL52eSks_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_6jtnn2CzF7M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6jtnn2CzF7M", sceIcuLegacyUnknown_6jtnn2CzF7M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_6kSz7BOrmC4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6kSz7BOrmC4", sceIcuLegacyUnknown_6kSz7BOrmC4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_6n74pmh0NR0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6n74pmh0NR0", sceIcuLegacyUnknown_6n74pmh0NR0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_6pFpST8cU9o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6pFpST8cU9o", sceIcuLegacyUnknown_6pFpST8cU9o_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_6rJZBIQciRg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6rJZBIQciRg", sceIcuLegacyUnknown_6rJZBIQciRg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_6xJL4Cvolyk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6xJL4Cvolyk", sceIcuLegacyUnknown_6xJL4Cvolyk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_6xNf9CZzvyo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6xNf9CZzvyo", sceIcuLegacyUnknown_6xNf9CZzvyo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_6xaYtwoW8Wg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6xaYtwoW8Wg", sceIcuLegacyUnknown_6xaYtwoW8Wg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_6y8CT24mFXo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6y8CT24mFXo", sceIcuLegacyUnknown_6y8CT24mFXo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_7_plus_9niSP3jos_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7+9niSP3jos", sceIcuLegacyUnknown_7_plus_9niSP3jos_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_70ECiskwEoU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("70ECiskwEoU", sceIcuLegacyUnknown_70ECiskwEoU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_71IwI4r01bg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("71IwI4r01bg", sceIcuLegacyUnknown_71IwI4r01bg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_71Y9irgGVgw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("71Y9irgGVgw", sceIcuLegacyUnknown_71Y9irgGVgw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_732IbgavIZk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("732IbgavIZk", sceIcuLegacyUnknown_732IbgavIZk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_74lCQEHofHo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("74lCQEHofHo", sceIcuLegacyUnknown_74lCQEHofHo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_77xMg_plus_CSeHs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("77xMg+CSeHs", sceIcuLegacyUnknown_77xMg_plus_CSeHs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_7AhaW9gPUnM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7AhaW9gPUnM", sceIcuLegacyUnknown_7AhaW9gPUnM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_7Al54_minus_CaiIQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7Al54-CaiIQ", sceIcuLegacyUnknown_7Al54_minus_CaiIQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_7CcAXnzFkDE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7CcAXnzFkDE", sceIcuLegacyUnknown_7CcAXnzFkDE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_7Dhc9qs_plus_YIc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7Dhc9qs+YIc", sceIcuLegacyUnknown_7Dhc9qs_plus_YIc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_7I5J3V3hgog_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7I5J3V3hgog", sceIcuLegacyUnknown_7I5J3V3hgog_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_7Kxay85raLs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7Kxay85raLs", sceIcuLegacyUnknown_7Kxay85raLs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_7LND7zUihtA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7LND7zUihtA", sceIcuLegacyUnknown_7LND7zUihtA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_7N8TZmK_minus_LZA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7N8TZmK-LZA", sceIcuLegacyUnknown_7N8TZmK_minus_LZA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_7PBdP6SpMns_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7PBdP6SpMns", sceIcuLegacyUnknown_7PBdP6SpMns_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_7PP6pGZZ_plus_gw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7PP6pGZZ+gw", sceIcuLegacyUnknown_7PP6pGZZ_plus_gw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_7R4_plus__plus_kOV_minus_N0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7R4++kOV-N0", sceIcuLegacyUnknown_7R4_plus__plus_kOV_minus_N0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_7TfP_minus_C2I4rw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7TfP-C2I4rw", sceIcuLegacyUnknown_7TfP_minus_C2I4rw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_7WrMwuF56JA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7WrMwuF56JA", sceIcuLegacyUnknown_7WrMwuF56JA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_7XV6f9Fjnx0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7XV6f9Fjnx0", sceIcuLegacyUnknown_7XV6f9Fjnx0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_7Yt_minus_ZIgpucA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7Yt-ZIgpucA", sceIcuLegacyUnknown_7Yt_minus_ZIgpucA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_7Yu1Zo9FRn0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7Yu1Zo9FRn0", sceIcuLegacyUnknown_7Yu1Zo9FRn0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_7cxI38mtQ08_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7cxI38mtQ08", sceIcuLegacyUnknown_7cxI38mtQ08_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_7fk62cdEO4w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7fk62cdEO4w", sceIcuLegacyUnknown_7fk62cdEO4w_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_7g4jfloBz1k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7g4jfloBz1k", sceIcuLegacyUnknown_7g4jfloBz1k_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_7gjI7c2cfdY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7gjI7c2cfdY", sceIcuLegacyUnknown_7gjI7c2cfdY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_7h6igtOa7zc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7h6igtOa7zc", sceIcuLegacyUnknown_7h6igtOa7zc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_7iNXtJji1iI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7iNXtJji1iI", sceIcuLegacyUnknown_7iNXtJji1iI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_7ira0NBxeqw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7ira0NBxeqw", sceIcuLegacyUnknown_7ira0NBxeqw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_7kJ1QYHAhPE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7kJ1QYHAhPE", sceIcuLegacyUnknown_7kJ1QYHAhPE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_7lEIR7s7iZ4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7lEIR7s7iZ4", sceIcuLegacyUnknown_7lEIR7s7iZ4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_7lG1GjeY6qI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7lG1GjeY6qI", sceIcuLegacyUnknown_7lG1GjeY6qI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_7ql_plus_sS_plus__minus_xMc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7ql+sS+-xMc", sceIcuLegacyUnknown_7ql_plus_sS_plus__minus_xMc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_7sukzrX_minus_FQ4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7sukzrX-FQ4", sceIcuLegacyUnknown_7sukzrX_minus_FQ4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_7wGcSRiXMG0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7wGcSRiXMG0", sceIcuLegacyUnknown_7wGcSRiXMG0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_8_plus_IWPUep4uY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8+IWPUep4uY", sceIcuLegacyUnknown_8_plus_IWPUep4uY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_811wPbi7A_minus_o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("811wPbi7A-o", sceIcuLegacyUnknown_811wPbi7A_minus_o_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_81eO_minus_evrZWU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("81eO-evrZWU", sceIcuLegacyUnknown_81eO_minus_evrZWU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_82gGpLMB0cI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("82gGpLMB0cI", sceIcuLegacyUnknown_82gGpLMB0cI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_84YgNF2FogE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("84YgNF2FogE", sceIcuLegacyUnknown_84YgNF2FogE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_87TnfVuck6Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("87TnfVuck6Q", sceIcuLegacyUnknown_87TnfVuck6Q_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_8AZHHqP1m2U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8AZHHqP1m2U", sceIcuLegacyUnknown_8AZHHqP1m2U_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_8Cqqce1jSQQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8Cqqce1jSQQ", sceIcuLegacyUnknown_8Cqqce1jSQQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_8Ep9u_minus_baSZQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8Ep9u-baSZQ", sceIcuLegacyUnknown_8Ep9u_minus_baSZQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_8GdurDsJStk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8GdurDsJStk", sceIcuLegacyUnknown_8GdurDsJStk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_8Gk3lVH9ND4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8Gk3lVH9ND4", sceIcuLegacyUnknown_8Gk3lVH9ND4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_8HuKEhQV0OM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8HuKEhQV0OM", sceIcuLegacyUnknown_8HuKEhQV0OM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_8JF4eKESi8o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8JF4eKESi8o", sceIcuLegacyUnknown_8JF4eKESi8o_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_8KtiLiHVP5k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8KtiLiHVP5k", sceIcuLegacyUnknown_8KtiLiHVP5k_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_8SDSnWjCMB8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8SDSnWjCMB8", sceIcuLegacyUnknown_8SDSnWjCMB8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_8Sf0tJXMvqA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8Sf0tJXMvqA", sceIcuLegacyUnknown_8Sf0tJXMvqA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_8TrUtRVIOqc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8TrUtRVIOqc", sceIcuLegacyUnknown_8TrUtRVIOqc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_8V2Mt5IsCk4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8V2Mt5IsCk4", sceIcuLegacyUnknown_8V2Mt5IsCk4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_8ZVOe2sQhkc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8ZVOe2sQhkc", sceIcuLegacyUnknown_8ZVOe2sQhkc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_8aU3NyhPctc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8aU3NyhPctc", sceIcuLegacyUnknown_8aU3NyhPctc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_8cn1NvshDFo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8cn1NvshDFo", sceIcuLegacyUnknown_8cn1NvshDFo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_8dCD8H6qJFg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8dCD8H6qJFg", sceIcuLegacyUnknown_8dCD8H6qJFg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_8h9vn9x0sa4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8h9vn9x0sa4", sceIcuLegacyUnknown_8h9vn9x0sa4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_8hwlSdw8tDg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8hwlSdw8tDg", sceIcuLegacyUnknown_8hwlSdw8tDg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_8hyc82K8VzU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8hyc82K8VzU", sceIcuLegacyUnknown_8hyc82K8VzU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_8i27jUlPpDo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8i27jUlPpDo", sceIcuLegacyUnknown_8i27jUlPpDo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_8jpwdm_minus_hWDI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8jpwdm-hWDI", sceIcuLegacyUnknown_8jpwdm_minus_hWDI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_8ktMvwA_plus_Af4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8ktMvwA+Af4", sceIcuLegacyUnknown_8ktMvwA_plus_Af4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_8n2w3ligC94_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8n2w3ligC94", sceIcuLegacyUnknown_8n2w3ligC94_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_8nJBCqN7T2Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8nJBCqN7T2Q", sceIcuLegacyUnknown_8nJBCqN7T2Q_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_8oOHKSj5pbs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8oOHKSj5pbs", sceIcuLegacyUnknown_8oOHKSj5pbs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_8rWf7DugFKg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8rWf7DugFKg", sceIcuLegacyUnknown_8rWf7DugFKg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_8soSyGENbQ4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8soSyGENbQ4", sceIcuLegacyUnknown_8soSyGENbQ4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_8vRZXqTxKUc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8vRZXqTxKUc", sceIcuLegacyUnknown_8vRZXqTxKUc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_8xcPcZc2Gh8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8xcPcZc2Gh8", sceIcuLegacyUnknown_8xcPcZc2Gh8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9_minus_B9NNEHOwM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9-B9NNEHOwM", sceIcuLegacyUnknown_9_minus_B9NNEHOwM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9_minus_k_minus_p8La1i8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9-k-p8La1i8", sceIcuLegacyUnknown_9_minus_k_minus_p8La1i8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_90djDyTuFX0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("90djDyTuFX0", sceIcuLegacyUnknown_90djDyTuFX0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_91hUeemJRgU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("91hUeemJRgU", sceIcuLegacyUnknown_91hUeemJRgU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_91hioCaDqk8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("91hioCaDqk8", sceIcuLegacyUnknown_91hioCaDqk8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_91mpdjHGIP4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("91mpdjHGIP4", sceIcuLegacyUnknown_91mpdjHGIP4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_94b19T7_minus_7Ec_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("94b19T7-7Ec", sceIcuLegacyUnknown_94b19T7_minus_7Ec_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_954XfGJix_plus_k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("954XfGJix+k", sceIcuLegacyUnknown_954XfGJix_plus_k_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_96xtoeyxeZU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("96xtoeyxeZU", sceIcuLegacyUnknown_96xtoeyxeZU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_99itJwBBSz0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("99itJwBBSz0", sceIcuLegacyUnknown_99itJwBBSz0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9ALKSU8dWTA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9ALKSU8dWTA", sceIcuLegacyUnknown_9ALKSU8dWTA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9AP4jjDiIFE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9AP4jjDiIFE", sceIcuLegacyUnknown_9AP4jjDiIFE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9AdVLpFeSYg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9AdVLpFeSYg", sceIcuLegacyUnknown_9AdVLpFeSYg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9Ayn5JW_minus_hMY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9Ayn5JW-hMY", sceIcuLegacyUnknown_9Ayn5JW_minus_hMY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9ECaj_plus_42WkA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9ECaj+42WkA", sceIcuLegacyUnknown_9ECaj_plus_42WkA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9FXXqYxXV_minus_Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9FXXqYxXV-Y", sceIcuLegacyUnknown_9FXXqYxXV_minus_Y_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9Ff7AijH93g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9Ff7AijH93g", sceIcuLegacyUnknown_9Ff7AijH93g_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9GynEoaxy9Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9GynEoaxy9Y", sceIcuLegacyUnknown_9GynEoaxy9Y_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9HLa4YDjPwQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9HLa4YDjPwQ", sceIcuLegacyUnknown_9HLa4YDjPwQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9I3Z6Okr_plus_Mc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9I3Z6Okr+Mc", sceIcuLegacyUnknown_9I3Z6Okr_plus_Mc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9Lwt3RssOw0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9Lwt3RssOw0", sceIcuLegacyUnknown_9Lwt3RssOw0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9Mm4kLQVpJ8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9Mm4kLQVpJ8", sceIcuLegacyUnknown_9Mm4kLQVpJ8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9MqmXgb8ICQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9MqmXgb8ICQ", sceIcuLegacyUnknown_9MqmXgb8ICQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9Ng5mQNCtBY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9Ng5mQNCtBY", sceIcuLegacyUnknown_9Ng5mQNCtBY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9PG9CfYmwEk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9PG9CfYmwEk", sceIcuLegacyUnknown_9PG9CfYmwEk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9PSkXP76LW4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9PSkXP76LW4", sceIcuLegacyUnknown_9PSkXP76LW4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9PVNcvBLDwM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9PVNcvBLDwM", sceIcuLegacyUnknown_9PVNcvBLDwM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9QQacZyFYhM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9QQacZyFYhM", sceIcuLegacyUnknown_9QQacZyFYhM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9TWcXWV8SM4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9TWcXWV8SM4", sceIcuLegacyUnknown_9TWcXWV8SM4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9Uu_plus_edYJIjE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9Uu+edYJIjE", sceIcuLegacyUnknown_9Uu_plus_edYJIjE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9Ux2N_minus_F2Nm4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9Ux2N-F2Nm4", sceIcuLegacyUnknown_9Ux2N_minus_F2Nm4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9XT0E2eroig_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9XT0E2eroig", sceIcuLegacyUnknown_9XT0E2eroig_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9XuLv3vss_minus_I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9XuLv3vss-I", sceIcuLegacyUnknown_9XuLv3vss_minus_I_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9YMKGv_minus_fNys_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9YMKGv-fNys", sceIcuLegacyUnknown_9YMKGv_minus_fNys_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9Z_plus_29sFbhtM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9Z+29sFbhtM", sceIcuLegacyUnknown_9Z_plus_29sFbhtM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9Z4QCM3w9VQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9Z4QCM3w9VQ", sceIcuLegacyUnknown_9Z4QCM3w9VQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9ZPptEj2pvk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9ZPptEj2pvk", sceIcuLegacyUnknown_9ZPptEj2pvk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9ZfkrRTKFCI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9ZfkrRTKFCI", sceIcuLegacyUnknown_9ZfkrRTKFCI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9aQBNagjgcM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9aQBNagjgcM", sceIcuLegacyUnknown_9aQBNagjgcM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9bP_minus_kPBX7UA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9bP-kPBX7UA", sceIcuLegacyUnknown_9bP_minus_kPBX7UA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9dc1eU7dlJs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9dc1eU7dlJs", sceIcuLegacyUnknown_9dc1eU7dlJs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9hMhu0fnYD8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9hMhu0fnYD8", sceIcuLegacyUnknown_9hMhu0fnYD8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9hTY5LZj4fE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9hTY5LZj4fE", sceIcuLegacyUnknown_9hTY5LZj4fE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9jSuWQLNQ9M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9jSuWQLNQ9M", sceIcuLegacyUnknown_9jSuWQLNQ9M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9lpxzQHrojk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9lpxzQHrojk", sceIcuLegacyUnknown_9lpxzQHrojk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9qWnGhrFtdc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9qWnGhrFtdc", sceIcuLegacyUnknown_9qWnGhrFtdc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9qZNdB_plus_2Bc0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9qZNdB+2Bc0", sceIcuLegacyUnknown_9qZNdB_plus_2Bc0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9sXRmxOZtsY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9sXRmxOZtsY", sceIcuLegacyUnknown_9sXRmxOZtsY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9w3DvL0N2IA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9w3DvL0N2IA", sceIcuLegacyUnknown_9w3DvL0N2IA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9x1HY0NICVc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9x1HY0NICVc", sceIcuLegacyUnknown_9x1HY0NICVc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_9ylasLJoZF0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9ylasLJoZF0", sceIcuLegacyUnknown_9ylasLJoZF0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_A5tRF_minus_v_minus_SWc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("A5tRF-v-SWc", sceIcuLegacyUnknown_A5tRF_minus_v_minus_SWc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_A7vb06DjJUY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("A7vb06DjJUY", sceIcuLegacyUnknown_A7vb06DjJUY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_AATyPI2mYE0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AATyPI2mYE0", sceIcuLegacyUnknown_AATyPI2mYE0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_AAlYzrIHdKI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AAlYzrIHdKI", sceIcuLegacyUnknown_AAlYzrIHdKI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ACCS1U9GP58_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ACCS1U9GP58", sceIcuLegacyUnknown_ACCS1U9GP58_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_AEgbp5mPotQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AEgbp5mPotQ", sceIcuLegacyUnknown_AEgbp5mPotQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_AH_minus_OkiuxWa4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AH-OkiuxWa4", sceIcuLegacyUnknown_AH_minus_OkiuxWa4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_AH3nKkO3JTk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AH3nKkO3JTk", sceIcuLegacyUnknown_AH3nKkO3JTk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_AH9JGN4NkW4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AH9JGN4NkW4", sceIcuLegacyUnknown_AH9JGN4NkW4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_AHPZ9F1d1o8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AHPZ9F1d1o8", sceIcuLegacyUnknown_AHPZ9F1d1o8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_AHzY0XSZy98_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AHzY0XSZy98", sceIcuLegacyUnknown_AHzY0XSZy98_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_AMFbHTY2CMk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AMFbHTY2CMk", sceIcuLegacyUnknown_AMFbHTY2CMk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_AMyB2pmC9v4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AMyB2pmC9v4", sceIcuLegacyUnknown_AMyB2pmC9v4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ANyrhk_plus_mOQ0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ANyrhk+mOQ0", sceIcuLegacyUnknown_ANyrhk_plus_mOQ0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_AOK58KP9tRE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AOK58KP9tRE", sceIcuLegacyUnknown_AOK58KP9tRE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_APpwW2j5C78_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("APpwW2j5C78", sceIcuLegacyUnknown_APpwW2j5C78_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_AQYQEk1InJg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AQYQEk1InJg", sceIcuLegacyUnknown_AQYQEk1InJg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_AWzPZ6bpeAU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AWzPZ6bpeAU", sceIcuLegacyUnknown_AWzPZ6bpeAU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_AYqtGKPyiU4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AYqtGKPyiU4", sceIcuLegacyUnknown_AYqtGKPyiU4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_AYrSMjttAU4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AYrSMjttAU4", sceIcuLegacyUnknown_AYrSMjttAU4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_AZJPxauew_plus_A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AZJPxauew+A", sceIcuLegacyUnknown_AZJPxauew_plus_A_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_AbE0PCISyLo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AbE0PCISyLo", sceIcuLegacyUnknown_AbE0PCISyLo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_AbKBXXHa_minus_Jo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AbKBXXHa-Jo", sceIcuLegacyUnknown_AbKBXXHa_minus_Jo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_AfpzINLrJ8M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AfpzINLrJ8M", sceIcuLegacyUnknown_AfpzINLrJ8M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_AgPFrfHPJNY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AgPFrfHPJNY", sceIcuLegacyUnknown_AgPFrfHPJNY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_AiuJezekCBc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AiuJezekCBc", sceIcuLegacyUnknown_AiuJezekCBc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_AjEm95J_plus_bh4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AjEm95J+bh4", sceIcuLegacyUnknown_AjEm95J_plus_bh4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_AkagRSm3Yyk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AkagRSm3Yyk", sceIcuLegacyUnknown_AkagRSm3Yyk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_AlDrgNSVs7g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AlDrgNSVs7g", sceIcuLegacyUnknown_AlDrgNSVs7g_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_AlG1_minus_3ezfeU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AlG1-3ezfeU", sceIcuLegacyUnknown_AlG1_minus_3ezfeU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Alomt9kVI94_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Alomt9kVI94", sceIcuLegacyUnknown_Alomt9kVI94_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_AmLE6IwHVKM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AmLE6IwHVKM", sceIcuLegacyUnknown_AmLE6IwHVKM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_At5PrLwwLIE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("At5PrLwwLIE", sceIcuLegacyUnknown_At5PrLwwLIE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_AtmDJNcrTd0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AtmDJNcrTd0", sceIcuLegacyUnknown_AtmDJNcrTd0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_AuRg19KxWco_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AuRg19KxWco", sceIcuLegacyUnknown_AuRg19KxWco_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Aw_minus_0bgw1rpY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Aw-0bgw1rpY", sceIcuLegacyUnknown_Aw_minus_0bgw1rpY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_AxbB0OiJwuk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AxbB0OiJwuk", sceIcuLegacyUnknown_AxbB0OiJwuk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_AxdNnn5ChtY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AxdNnn5ChtY", sceIcuLegacyUnknown_AxdNnn5ChtY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_AyZV_minus_o2NFis_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AyZV-o2NFis", sceIcuLegacyUnknown_AyZV_minus_o2NFis_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_AzTARWDb2zs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AzTARWDb2zs", sceIcuLegacyUnknown_AzTARWDb2zs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_B2egWGluTcA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("B2egWGluTcA", sceIcuLegacyUnknown_B2egWGluTcA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_B3HBHmrUxXM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("B3HBHmrUxXM", sceIcuLegacyUnknown_B3HBHmrUxXM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_BAaDCGRLujw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BAaDCGRLujw", sceIcuLegacyUnknown_BAaDCGRLujw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_BBY8MS3YeVM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BBY8MS3YeVM", sceIcuLegacyUnknown_BBY8MS3YeVM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_BCNFIPx_plus_MUc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BCNFIPx+MUc", sceIcuLegacyUnknown_BCNFIPx_plus_MUc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_BD3I196Tksg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BD3I196Tksg", sceIcuLegacyUnknown_BD3I196Tksg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_BDxMeuepwsQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BDxMeuepwsQ", sceIcuLegacyUnknown_BDxMeuepwsQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_BEdyFFmUB6Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BEdyFFmUB6Q", sceIcuLegacyUnknown_BEdyFFmUB6Q_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_BGtQFItjoOI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BGtQFItjoOI", sceIcuLegacyUnknown_BGtQFItjoOI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_BMGP_plus_0SSwsw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BMGP+0SSwsw", sceIcuLegacyUnknown_BMGP_plus_0SSwsw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_BN_plus_Ns_plus_V0xq4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BN+Ns+V0xq4", sceIcuLegacyUnknown_BN_plus_Ns_plus_V0xq4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_BNaPsGgSVpU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BNaPsGgSVpU", sceIcuLegacyUnknown_BNaPsGgSVpU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_BO0DkVp2i7A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BO0DkVp2i7A", sceIcuLegacyUnknown_BO0DkVp2i7A_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_BPzTxU_plus_gLrU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BPzTxU+gLrU", sceIcuLegacyUnknown_BPzTxU_plus_gLrU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_BSpOFYioApw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BSpOFYioApw", sceIcuLegacyUnknown_BSpOFYioApw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_BT2XtMb0Z0Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BT2XtMb0Z0Y", sceIcuLegacyUnknown_BT2XtMb0Z0Y_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_BTYflNjQB_plus_E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BTYflNjQB+E", sceIcuLegacyUnknown_BTYflNjQB_plus_E_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_BVS3_minus_N8Xakw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BVS3-N8Xakw", sceIcuLegacyUnknown_BVS3_minus_N8Xakw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_BVaLa5GxEIY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BVaLa5GxEIY", sceIcuLegacyUnknown_BVaLa5GxEIY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_BZss8UWu4UE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BZss8UWu4UE", sceIcuLegacyUnknown_BZss8UWu4UE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_BalgMpFXM90_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BalgMpFXM90", sceIcuLegacyUnknown_BalgMpFXM90_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_BbBIUZLGxVw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BbBIUZLGxVw", sceIcuLegacyUnknown_BbBIUZLGxVw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Be2atWczd5I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Be2atWczd5I", sceIcuLegacyUnknown_Be2atWczd5I_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_BegIPDqtqKE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BegIPDqtqKE", sceIcuLegacyUnknown_BegIPDqtqKE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Bfv9xhnKHpc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Bfv9xhnKHpc", sceIcuLegacyUnknown_Bfv9xhnKHpc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_BgfvML1gcLg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BgfvML1gcLg", sceIcuLegacyUnknown_BgfvML1gcLg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Bhi9UPjI_minus__minus_w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Bhi9UPjI--w", sceIcuLegacyUnknown_Bhi9UPjI_minus__minus_w_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_BkO15T_minus_foqo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BkO15T-foqo", sceIcuLegacyUnknown_BkO15T_minus_foqo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Bm6ltBBY5dU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Bm6ltBBY5dU", sceIcuLegacyUnknown_Bm6ltBBY5dU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_BnZ46zXPc8g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BnZ46zXPc8g", sceIcuLegacyUnknown_BnZ46zXPc8g_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_BoI_minus_K4iN6Pc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BoI-K4iN6Pc", sceIcuLegacyUnknown_BoI_minus_K4iN6Pc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_BpZBr1QqKRE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BpZBr1QqKRE", sceIcuLegacyUnknown_BpZBr1QqKRE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_BqGYRCWDdCM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BqGYRCWDdCM", sceIcuLegacyUnknown_BqGYRCWDdCM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_BqvSrPQCTcs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BqvSrPQCTcs", sceIcuLegacyUnknown_BqvSrPQCTcs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_BuC3ARyjHBs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BuC3ARyjHBs", sceIcuLegacyUnknown_BuC3ARyjHBs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_BvgmG8ZqCAk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BvgmG8ZqCAk", sceIcuLegacyUnknown_BvgmG8ZqCAk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_BvtFZdpVpkg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BvtFZdpVpkg", sceIcuLegacyUnknown_BvtFZdpVpkg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Bw5Sglh6_plus_Js_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Bw5Sglh6+Js", sceIcuLegacyUnknown_Bw5Sglh6_plus_Js_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Bz2aeA6fU_plus_c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Bz2aeA6fU+c", sceIcuLegacyUnknown_Bz2aeA6fU_plus_c_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_C_plus_RMDbFOVmg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("C+RMDbFOVmg", sceIcuLegacyUnknown_C_plus_RMDbFOVmg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_C12fbSrJXes_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("C12fbSrJXes", sceIcuLegacyUnknown_C12fbSrJXes_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_C2NTqZ1au0s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("C2NTqZ1au0s", sceIcuLegacyUnknown_C2NTqZ1au0s_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_C2lC51ZWaIc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("C2lC51ZWaIc", sceIcuLegacyUnknown_C2lC51ZWaIc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_C4ksb8TTkME_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("C4ksb8TTkME", sceIcuLegacyUnknown_C4ksb8TTkME_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_C4tEEnVV7LE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("C4tEEnVV7LE", sceIcuLegacyUnknown_C4tEEnVV7LE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_CA9_plus_P32_plus_DwY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CA9+P32+DwY", sceIcuLegacyUnknown_CA9_plus_P32_plus_DwY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_CAetpPL8Em8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CAetpPL8Em8", sceIcuLegacyUnknown_CAetpPL8Em8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_CCHD3yfdDlA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CCHD3yfdDlA", sceIcuLegacyUnknown_CCHD3yfdDlA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_CESNUhb33pA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CESNUhb33pA", sceIcuLegacyUnknown_CESNUhb33pA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_CEg4Zlknm8A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CEg4Zlknm8A", sceIcuLegacyUnknown_CEg4Zlknm8A_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_CF7_plus_t_plus_JIOEo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CF7+t+JIOEo", sceIcuLegacyUnknown_CF7_plus_t_plus_JIOEo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_CGiYasyLWgc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CGiYasyLWgc", sceIcuLegacyUnknown_CGiYasyLWgc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_CHZEbSUX4o4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CHZEbSUX4o4", sceIcuLegacyUnknown_CHZEbSUX4o4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_CIYcDrsCfPE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CIYcDrsCfPE", sceIcuLegacyUnknown_CIYcDrsCfPE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_CJkitLFH_minus_II_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CJkitLFH-II", sceIcuLegacyUnknown_CJkitLFH_minus_II_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_CKWBRdmB00E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CKWBRdmB00E", sceIcuLegacyUnknown_CKWBRdmB00E_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_CMpktp_minus_bRAE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CMpktp-bRAE", sceIcuLegacyUnknown_CMpktp_minus_bRAE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_CPxo0YRjsfM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CPxo0YRjsfM", sceIcuLegacyUnknown_CPxo0YRjsfM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_CRL6FxbZiVs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CRL6FxbZiVs", sceIcuLegacyUnknown_CRL6FxbZiVs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_CSWPy4toO8k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CSWPy4toO8k", sceIcuLegacyUnknown_CSWPy4toO8k_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_CUtn45GS2M8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CUtn45GS2M8", sceIcuLegacyUnknown_CUtn45GS2M8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_CVT3PuSQdgQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CVT3PuSQdgQ", sceIcuLegacyUnknown_CVT3PuSQdgQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_CVpF3V06eyI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CVpF3V06eyI", sceIcuLegacyUnknown_CVpF3V06eyI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_CXGpVVmL6jo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CXGpVVmL6jo", sceIcuLegacyUnknown_CXGpVVmL6jo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_CXfNvRcFMMs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CXfNvRcFMMs", sceIcuLegacyUnknown_CXfNvRcFMMs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_CbByUISOl28_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CbByUISOl28", sceIcuLegacyUnknown_CbByUISOl28_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Cc1lge6eNeA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Cc1lge6eNeA", sceIcuLegacyUnknown_Cc1lge6eNeA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_CdUWh115gSU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CdUWh115gSU", sceIcuLegacyUnknown_CdUWh115gSU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_CdnnbByeuSY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CdnnbByeuSY", sceIcuLegacyUnknown_CdnnbByeuSY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_CdqL8zAUzlc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CdqL8zAUzlc", sceIcuLegacyUnknown_CdqL8zAUzlc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_CeRYvzs4RtY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CeRYvzs4RtY", sceIcuLegacyUnknown_CeRYvzs4RtY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_CeoaZ21WUxI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CeoaZ21WUxI", sceIcuLegacyUnknown_CeoaZ21WUxI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_CepeHuHB_minus_RA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CepeHuHB-RA", sceIcuLegacyUnknown_CepeHuHB_minus_RA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Ch_plus_WYJ2Ju0M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ch+WYJ2Ju0M", sceIcuLegacyUnknown_Ch_plus_WYJ2Ju0M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_CiHiAKI8gN0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CiHiAKI8gN0", sceIcuLegacyUnknown_CiHiAKI8gN0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Ckux_minus_2zYc0Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ckux-2zYc0Q", sceIcuLegacyUnknown_Ckux_minus_2zYc0Q_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ClXDatdTTy0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ClXDatdTTy0", sceIcuLegacyUnknown_ClXDatdTTy0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_CmZE73V_plus_9QY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CmZE73V+9QY", sceIcuLegacyUnknown_CmZE73V_plus_9QY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Cn4jLW8GJbo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Cn4jLW8GJbo", sceIcuLegacyUnknown_Cn4jLW8GJbo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_CncgR7C_minus_UUY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CncgR7C-UUY", sceIcuLegacyUnknown_CncgR7C_minus_UUY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_CoyVOlkpxY4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CoyVOlkpxY4", sceIcuLegacyUnknown_CoyVOlkpxY4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_CpQ2_minus_ykkw_plus_g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CpQ2-ykkw+g", sceIcuLegacyUnknown_CpQ2_minus_ykkw_plus_g_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_CrHm8ueBDeU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CrHm8ueBDeU", sceIcuLegacyUnknown_CrHm8ueBDeU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_CrWRhCMUKg4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CrWRhCMUKg4", sceIcuLegacyUnknown_CrWRhCMUKg4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_CscMPVMFQ6c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CscMPVMFQ6c", sceIcuLegacyUnknown_CscMPVMFQ6c_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_CtMEsoBvzO8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CtMEsoBvzO8", sceIcuLegacyUnknown_CtMEsoBvzO8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_CtbKEfqw_plus_g4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CtbKEfqw+g4", sceIcuLegacyUnknown_CtbKEfqw_plus_g4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_CvGSDiyU_plus_DA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CvGSDiyU+DA", sceIcuLegacyUnknown_CvGSDiyU_plus_DA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_D_minus_Gb6nw3uTc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("D-Gb6nw3uTc", sceIcuLegacyUnknown_D_minus_Gb6nw3uTc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_D0Jhk501qcw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("D0Jhk501qcw", sceIcuLegacyUnknown_D0Jhk501qcw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_D2eKAhL_minus_NwI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("D2eKAhL-NwI", sceIcuLegacyUnknown_D2eKAhL_minus_NwI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_D39HIDr9dtc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("D39HIDr9dtc", sceIcuLegacyUnknown_D39HIDr9dtc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_D3Wqrcq6Mbc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("D3Wqrcq6Mbc", sceIcuLegacyUnknown_D3Wqrcq6Mbc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_DArdMok4CAM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DArdMok4CAM", sceIcuLegacyUnknown_DArdMok4CAM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_DCVdYpWxC1I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DCVdYpWxC1I", sceIcuLegacyUnknown_DCVdYpWxC1I_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_DHi_minus_7w29ie4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DHi-7w29ie4", sceIcuLegacyUnknown_DHi_minus_7w29ie4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_DIamEz31l_plus_g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DIamEz31l+g", sceIcuLegacyUnknown_DIamEz31l_plus_g_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_DOYn8Nx8RwA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DOYn8Nx8RwA", sceIcuLegacyUnknown_DOYn8Nx8RwA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_DQwurb1sT0M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DQwurb1sT0M", sceIcuLegacyUnknown_DQwurb1sT0M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_DRijPfVa8KE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DRijPfVa8KE", sceIcuLegacyUnknown_DRijPfVa8KE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_DRp_plus_938Wjck_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DRp+938Wjck", sceIcuLegacyUnknown_DRp_plus_938Wjck_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_DRqTDtjF_minus_YY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DRqTDtjF-YY", sceIcuLegacyUnknown_DRqTDtjF_minus_YY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_DVKY4CxzYiU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DVKY4CxzYiU", sceIcuLegacyUnknown_DVKY4CxzYiU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_DWDxIHS0_minus_ww_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DWDxIHS0-ww", sceIcuLegacyUnknown_DWDxIHS0_minus_ww_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_DXmUQd4t3k4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DXmUQd4t3k4", sceIcuLegacyUnknown_DXmUQd4t3k4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_DZBfePfwL4M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DZBfePfwL4M", sceIcuLegacyUnknown_DZBfePfwL4M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_DZId6VHoc1k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DZId6VHoc1k", sceIcuLegacyUnknown_DZId6VHoc1k_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_DbMyiPBebPw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DbMyiPBebPw", sceIcuLegacyUnknown_DbMyiPBebPw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_DbYWYOMtcbQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DbYWYOMtcbQ", sceIcuLegacyUnknown_DbYWYOMtcbQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_DcHjQjQ3icA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DcHjQjQ3icA", sceIcuLegacyUnknown_DcHjQjQ3icA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Dh08HOJ_minus_BSc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Dh08HOJ-BSc", sceIcuLegacyUnknown_Dh08HOJ_minus_BSc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Dh30sZ52VPc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Dh30sZ52VPc", sceIcuLegacyUnknown_Dh30sZ52VPc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Dl8h_plus_qpuGN4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Dl8h+qpuGN4", sceIcuLegacyUnknown_Dl8h_plus_qpuGN4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_DoOfWIzlOxA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DoOfWIzlOxA", sceIcuLegacyUnknown_DoOfWIzlOxA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_DpVbD395FfQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DpVbD395FfQ", sceIcuLegacyUnknown_DpVbD395FfQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_DpmBNFoQ_plus_DA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DpmBNFoQ+DA", sceIcuLegacyUnknown_DpmBNFoQ_plus_DA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_DrcakZgJjEw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DrcakZgJjEw", sceIcuLegacyUnknown_DrcakZgJjEw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_DuHMvVjEOdc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DuHMvVjEOdc", sceIcuLegacyUnknown_DuHMvVjEOdc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_DwfnU6fgppE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DwfnU6fgppE", sceIcuLegacyUnknown_DwfnU6fgppE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_DwlyaFau3Ho_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DwlyaFau3Ho", sceIcuLegacyUnknown_DwlyaFau3Ho_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Dx7uEgs8hbE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Dx7uEgs8hbE", sceIcuLegacyUnknown_Dx7uEgs8hbE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Dzd6aATLtBk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Dzd6aATLtBk", sceIcuLegacyUnknown_Dzd6aATLtBk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_E_plus_U0VcSwzJM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("E+U0VcSwzJM", sceIcuLegacyUnknown_E_plus_U0VcSwzJM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_E_minus_QWJoRAvIo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("E-QWJoRAvIo", sceIcuLegacyUnknown_E_minus_QWJoRAvIo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_E0LkqGLRnSo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("E0LkqGLRnSo", sceIcuLegacyUnknown_E0LkqGLRnSo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_E47_minus_qFyG7HQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("E47-qFyG7HQ", sceIcuLegacyUnknown_E47_minus_qFyG7HQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_E4ns5_plus_phHrA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("E4ns5+phHrA", sceIcuLegacyUnknown_E4ns5_plus_phHrA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_E5eImJ6I_minus_EU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("E5eImJ6I-EU", sceIcuLegacyUnknown_E5eImJ6I_minus_EU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_E5tRyh_minus_Y8co_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("E5tRyh-Y8co", sceIcuLegacyUnknown_E5tRyh_minus_Y8co_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_E6LIAV2URgU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("E6LIAV2URgU", sceIcuLegacyUnknown_E6LIAV2URgU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_EB5ztY8iHko_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EB5ztY8iHko", sceIcuLegacyUnknown_EB5ztY8iHko_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_EDaHE_plus_9Yl58_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EDaHE+9Yl58", sceIcuLegacyUnknown_EDaHE_plus_9Yl58_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_EElwuCeOLGE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EElwuCeOLGE", sceIcuLegacyUnknown_EElwuCeOLGE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_EHd_plus_d98UQZA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EHd+d98UQZA", sceIcuLegacyUnknown_EHd_plus_d98UQZA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_EIA92XcP5EM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EIA92XcP5EM", sceIcuLegacyUnknown_EIA92XcP5EM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_EKOgh3juIbs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EKOgh3juIbs", sceIcuLegacyUnknown_EKOgh3juIbs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_EM_minus_Uot1fIks_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EM-Uot1fIks", sceIcuLegacyUnknown_EM_minus_Uot1fIks_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ENKm2i0IIrw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ENKm2i0IIrw", sceIcuLegacyUnknown_ENKm2i0IIrw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_EP4H61QZyz4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EP4H61QZyz4", sceIcuLegacyUnknown_EP4H61QZyz4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_EQ_minus_yMC_minus_j9YA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EQ-yMC-j9YA", sceIcuLegacyUnknown_EQ_minus_yMC_minus_j9YA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ETe_minus_1lbGXwg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ETe-1lbGXwg", sceIcuLegacyUnknown_ETe_minus_1lbGXwg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ETzWYbtluqc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ETzWYbtluqc", sceIcuLegacyUnknown_ETzWYbtluqc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_EVPd1F3bTBk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EVPd1F3bTBk", sceIcuLegacyUnknown_EVPd1F3bTBk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_EZjcSZkNsJg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EZjcSZkNsJg", sceIcuLegacyUnknown_EZjcSZkNsJg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_EddN33R45vc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EddN33R45vc", sceIcuLegacyUnknown_EddN33R45vc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_EeQHYoXi_minus_kQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EeQHYoXi-kQ", sceIcuLegacyUnknown_EeQHYoXi_minus_kQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Eh8B0aqweD4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Eh8B0aqweD4", sceIcuLegacyUnknown_Eh8B0aqweD4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Ei1Dn07XYs4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ei1Dn07XYs4", sceIcuLegacyUnknown_Ei1Dn07XYs4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Eimwqcq37dM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Eimwqcq37dM", sceIcuLegacyUnknown_Eimwqcq37dM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_EjNzq35p1yo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EjNzq35p1yo", sceIcuLegacyUnknown_EjNzq35p1yo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Ek908WJyC3A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ek908WJyC3A", sceIcuLegacyUnknown_Ek908WJyC3A_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_EkI7xPMdJjA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EkI7xPMdJjA", sceIcuLegacyUnknown_EkI7xPMdJjA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ElxN9dMnmv4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ElxN9dMnmv4", sceIcuLegacyUnknown_ElxN9dMnmv4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_EmCemkyjsGU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EmCemkyjsGU", sceIcuLegacyUnknown_EmCemkyjsGU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Eq7evA9obrg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Eq7evA9obrg", sceIcuLegacyUnknown_Eq7evA9obrg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_EqeGKk5_plus_168_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EqeGKk5+168", sceIcuLegacyUnknown_EqeGKk5_plus_168_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Equprw_minus_ihwk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Equprw-ihwk", sceIcuLegacyUnknown_Equprw_minus_ihwk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ErBCp3pvQD4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ErBCp3pvQD4", sceIcuLegacyUnknown_ErBCp3pvQD4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ErHro2ULX1M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ErHro2ULX1M", sceIcuLegacyUnknown_ErHro2ULX1M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_EsB4_minus_0_minus_aEyQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EsB4-0-aEyQ", sceIcuLegacyUnknown_EsB4_minus_0_minus_aEyQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_F1Ci8i085wQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("F1Ci8i085wQ", sceIcuLegacyUnknown_F1Ci8i085wQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_F1e57T3cT0o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("F1e57T3cT0o", sceIcuLegacyUnknown_F1e57T3cT0o_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_F2SOocy4qmw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("F2SOocy4qmw", sceIcuLegacyUnknown_F2SOocy4qmw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_F5LbzYFdlnM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("F5LbzYFdlnM", sceIcuLegacyUnknown_F5LbzYFdlnM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_F67KEzUNLTs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("F67KEzUNLTs", sceIcuLegacyUnknown_F67KEzUNLTs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_F7lEldyoKmU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("F7lEldyoKmU", sceIcuLegacyUnknown_F7lEldyoKmU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_FEeSX6k_plus__minus_EQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FEeSX6k+-EQ", sceIcuLegacyUnknown_FEeSX6k_plus__minus_EQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_FKsWoTORAOg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FKsWoTORAOg", sceIcuLegacyUnknown_FKsWoTORAOg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_FLdhwv6GhXc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FLdhwv6GhXc", sceIcuLegacyUnknown_FLdhwv6GhXc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_FPfmwCfcBV4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FPfmwCfcBV4", sceIcuLegacyUnknown_FPfmwCfcBV4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_FSNu0u7QyRY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FSNu0u7QyRY", sceIcuLegacyUnknown_FSNu0u7QyRY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_FVn20_minus_GjG3U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FVn20-GjG3U", sceIcuLegacyUnknown_FVn20_minus_GjG3U_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_FWI5xWiQF_minus_I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FWI5xWiQF-I", sceIcuLegacyUnknown_FWI5xWiQF_minus_I_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_FWI7gYi7Qs4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FWI7gYi7Qs4", sceIcuLegacyUnknown_FWI7gYi7Qs4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_FX327XZrTmE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FX327XZrTmE", sceIcuLegacyUnknown_FX327XZrTmE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_FY_plus_GgwojVl0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FY+GgwojVl0", sceIcuLegacyUnknown_FY_plus_GgwojVl0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_FYtGwAUCrAQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FYtGwAUCrAQ", sceIcuLegacyUnknown_FYtGwAUCrAQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_FZUqb7ZwIoc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FZUqb7ZwIoc", sceIcuLegacyUnknown_FZUqb7ZwIoc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Fako2QRRBfc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Fako2QRRBfc", sceIcuLegacyUnknown_Fako2QRRBfc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Fb94eVIlvVQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Fb94eVIlvVQ", sceIcuLegacyUnknown_Fb94eVIlvVQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_FcSOmvkUdPE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FcSOmvkUdPE", sceIcuLegacyUnknown_FcSOmvkUdPE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_FdKvwn4suqo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FdKvwn4suqo", sceIcuLegacyUnknown_FdKvwn4suqo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Fdkc1XcCFNs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Fdkc1XcCFNs", sceIcuLegacyUnknown_Fdkc1XcCFNs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_FezCB5jgsi4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FezCB5jgsi4", sceIcuLegacyUnknown_FezCB5jgsi4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Ff1iFY4al1Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ff1iFY4al1Q", sceIcuLegacyUnknown_Ff1iFY4al1Q_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Fgetq7dlxmI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Fgetq7dlxmI", sceIcuLegacyUnknown_Fgetq7dlxmI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_FkavOYLbvw4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FkavOYLbvw4", sceIcuLegacyUnknown_FkavOYLbvw4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Fnttd0Mqbwo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Fnttd0Mqbwo", sceIcuLegacyUnknown_Fnttd0Mqbwo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_FoMTASl07eo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FoMTASl07eo", sceIcuLegacyUnknown_FoMTASl07eo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Fqdkkb9sHiY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Fqdkkb9sHiY", sceIcuLegacyUnknown_Fqdkkb9sHiY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_FqtwM9SeBYc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FqtwM9SeBYc", sceIcuLegacyUnknown_FqtwM9SeBYc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_FtPJR1_minus_V5eQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FtPJR1-V5eQ", sceIcuLegacyUnknown_FtPJR1_minus_V5eQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_FvZXeAR_plus_4Tw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FvZXeAR+4Tw", sceIcuLegacyUnknown_FvZXeAR_plus_4Tw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Fw_plus_x3WWhA4Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Fw+x3WWhA4Y", sceIcuLegacyUnknown_Fw_plus_x3WWhA4Y_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Fyya2CVCjdQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Fyya2CVCjdQ", sceIcuLegacyUnknown_Fyya2CVCjdQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_G_plus_p7q_minus_YT24Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("G+p7q-YT24Q", sceIcuLegacyUnknown_G_plus_p7q_minus_YT24Q_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_G_plus_pVNh_plus_EhL0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("G+pVNh+EhL0", sceIcuLegacyUnknown_G_plus_pVNh_plus_EhL0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_G_minus_zR_minus_n8eybI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("G-zR-n8eybI", sceIcuLegacyUnknown_G_minus_zR_minus_n8eybI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_G6zL5dfxfyk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("G6zL5dfxfyk", sceIcuLegacyUnknown_G6zL5dfxfyk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_G7YPVQ_plus_fZKM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("G7YPVQ+fZKM", sceIcuLegacyUnknown_G7YPVQ_plus_fZKM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_G7pJXobYH40_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("G7pJXobYH40", sceIcuLegacyUnknown_G7pJXobYH40_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_GBf3S_plus_lhS1w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GBf3S+lhS1w", sceIcuLegacyUnknown_GBf3S_plus_lhS1w_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_GBst_plus_eVK5Fs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GBst+eVK5Fs", sceIcuLegacyUnknown_GBst_plus_eVK5Fs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_GCHsSTNNoJU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GCHsSTNNoJU", sceIcuLegacyUnknown_GCHsSTNNoJU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_GKQDVnl3hCk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GKQDVnl3hCk", sceIcuLegacyUnknown_GKQDVnl3hCk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_GP_plus_O5CQRAAI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GP+O5CQRAAI", sceIcuLegacyUnknown_GP_plus_O5CQRAAI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_GPJmzssza_minus_M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GPJmzssza-M", sceIcuLegacyUnknown_GPJmzssza_minus_M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_GPioTjFYKXI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GPioTjFYKXI", sceIcuLegacyUnknown_GPioTjFYKXI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_GS_plus_pgxPCaN4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GS+pgxPCaN4", sceIcuLegacyUnknown_GS_plus_pgxPCaN4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_GSMlEoessLE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GSMlEoessLE", sceIcuLegacyUnknown_GSMlEoessLE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_GUTMYZjJhNE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GUTMYZjJhNE", sceIcuLegacyUnknown_GUTMYZjJhNE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_GVRUXVxoFWE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GVRUXVxoFWE", sceIcuLegacyUnknown_GVRUXVxoFWE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_GWLdxnia_plus_ZM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GWLdxnia+ZM", sceIcuLegacyUnknown_GWLdxnia_plus_ZM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_GWjCpRNGl6E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GWjCpRNGl6E", sceIcuLegacyUnknown_GWjCpRNGl6E_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_GYOMfi8ybUI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GYOMfi8ybUI", sceIcuLegacyUnknown_GYOMfi8ybUI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_GYR6aHwlcaw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GYR6aHwlcaw", sceIcuLegacyUnknown_GYR6aHwlcaw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_GYTAGzLGs_plus_Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GYTAGzLGs+Y", sceIcuLegacyUnknown_GYTAGzLGs_plus_Y_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_GcUoh_plus_QItqQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GcUoh+QItqQ", sceIcuLegacyUnknown_GcUoh_plus_QItqQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_GegAfYIaBv4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GegAfYIaBv4", sceIcuLegacyUnknown_GegAfYIaBv4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_GeuaL3voLxo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GeuaL3voLxo", sceIcuLegacyUnknown_GeuaL3voLxo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Gf8Lm_minus_MtXAE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Gf8Lm-MtXAE", sceIcuLegacyUnknown_Gf8Lm_minus_MtXAE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_GfJNDMsBEAo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GfJNDMsBEAo", sceIcuLegacyUnknown_GfJNDMsBEAo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Gfbag_minus_ObqvM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Gfbag-ObqvM", sceIcuLegacyUnknown_Gfbag_minus_ObqvM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_GiNVKomoLHI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GiNVKomoLHI", sceIcuLegacyUnknown_GiNVKomoLHI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Gk0mg_plus_4tTUI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Gk0mg+4tTUI", sceIcuLegacyUnknown_Gk0mg_plus_4tTUI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_GlGVUa5j1ZE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GlGVUa5j1ZE", sceIcuLegacyUnknown_GlGVUa5j1ZE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_GlsvFhFemB0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GlsvFhFemB0", sceIcuLegacyUnknown_GlsvFhFemB0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_GpmKB1mg0yQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GpmKB1mg0yQ", sceIcuLegacyUnknown_GpmKB1mg0yQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_GspQ6dz1PU8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GspQ6dz1PU8", sceIcuLegacyUnknown_GspQ6dz1PU8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Gvofk1RGzaM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Gvofk1RGzaM", sceIcuLegacyUnknown_Gvofk1RGzaM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_GxMU_plus_C_minus_ybfw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GxMU+C-ybfw", sceIcuLegacyUnknown_GxMU_plus_C_minus_ybfw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_GyQvtJfBhxk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GyQvtJfBhxk", sceIcuLegacyUnknown_GyQvtJfBhxk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Gyq97Ojep04_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Gyq97Ojep04", sceIcuLegacyUnknown_Gyq97Ojep04_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_H26cWBXW184_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("H26cWBXW184", sceIcuLegacyUnknown_H26cWBXW184_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_H28AdAGo84E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("H28AdAGo84E", sceIcuLegacyUnknown_H28AdAGo84E_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_H7aYtZJ7_plus_XM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("H7aYtZJ7+XM", sceIcuLegacyUnknown_H7aYtZJ7_plus_XM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_H93VAvi0zXY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("H93VAvi0zXY", sceIcuLegacyUnknown_H93VAvi0zXY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_HAQX1zQ1hys_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HAQX1zQ1hys", sceIcuLegacyUnknown_HAQX1zQ1hys_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_HAfqFiUv_minus_y0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HAfqFiUv-y0", sceIcuLegacyUnknown_HAfqFiUv_minus_y0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_HAuBG_plus_Yzjus_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HAuBG+Yzjus", sceIcuLegacyUnknown_HAuBG_plus_Yzjus_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_HEbrYbKnE98_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HEbrYbKnE98", sceIcuLegacyUnknown_HEbrYbKnE98_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_HFNvo_plus_lEynY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HFNvo+lEynY", sceIcuLegacyUnknown_HFNvo_plus_lEynY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_HKR2Z1lI1ko_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HKR2Z1lI1ko", sceIcuLegacyUnknown_HKR2Z1lI1ko_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_HLpfF36_minus_Y5Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HLpfF36-Y5Q", sceIcuLegacyUnknown_HLpfF36_minus_Y5Q_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_HMK_plus_bh_minus_O7_plus_o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HMK+bh-O7+o", sceIcuLegacyUnknown_HMK_plus_bh_minus_O7_plus_o_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_HMhS3h9I3Fg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HMhS3h9I3Fg", sceIcuLegacyUnknown_HMhS3h9I3Fg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_HQry6lK7gZg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HQry6lK7gZg", sceIcuLegacyUnknown_HQry6lK7gZg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_HRAiRmIYtEA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HRAiRmIYtEA", sceIcuLegacyUnknown_HRAiRmIYtEA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_HSD_plus_wDNUC4Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HSD+wDNUC4Q", sceIcuLegacyUnknown_HSD_plus_wDNUC4Q_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_HW1bq1B94Wc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HW1bq1B94Wc", sceIcuLegacyUnknown_HW1bq1B94Wc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_HWJN_minus_1_plus_T_plus_Kg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HWJN-1+T+Kg", sceIcuLegacyUnknown_HWJN_minus_1_plus_T_plus_Kg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Ha1woAICuGM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ha1woAICuGM", sceIcuLegacyUnknown_Ha1woAICuGM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_HcuwTwRBS94_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HcuwTwRBS94", sceIcuLegacyUnknown_HcuwTwRBS94_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_HifZRvT1spM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HifZRvT1spM", sceIcuLegacyUnknown_HifZRvT1spM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Hj31N2JSU2M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Hj31N2JSU2M", sceIcuLegacyUnknown_Hj31N2JSU2M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_HlWym_minus_QtxMs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HlWym-QtxMs", sceIcuLegacyUnknown_HlWym_minus_QtxMs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Hn_plus_eP_minus_10c44_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Hn+eP-10c44", sceIcuLegacyUnknown_Hn_plus_eP_minus_10c44_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_HnFsbVl_plus_5HQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HnFsbVl+5HQ", sceIcuLegacyUnknown_HnFsbVl_plus_5HQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_HptHGYgcyGI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HptHGYgcyGI", sceIcuLegacyUnknown_HptHGYgcyGI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Hr5hHw597E8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Hr5hHw597E8", sceIcuLegacyUnknown_Hr5hHw597E8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_HzUnZGfHhrQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HzUnZGfHhrQ", sceIcuLegacyUnknown_HzUnZGfHhrQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_I15TaVspT_plus_c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("I15TaVspT+c", sceIcuLegacyUnknown_I15TaVspT_plus_c_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_I1SOCGoLiKM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("I1SOCGoLiKM", sceIcuLegacyUnknown_I1SOCGoLiKM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_I6GKVz52APU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("I6GKVz52APU", sceIcuLegacyUnknown_I6GKVz52APU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_I7Z_plus_QV4pRtM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("I7Z+QV4pRtM", sceIcuLegacyUnknown_I7Z_plus_QV4pRtM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_IFs3Q_minus_7NeWA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IFs3Q-7NeWA", sceIcuLegacyUnknown_IFs3Q_minus_7NeWA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_IHG6v7ticAg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IHG6v7ticAg", sceIcuLegacyUnknown_IHG6v7ticAg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_IIIJruK0CGs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IIIJruK0CGs", sceIcuLegacyUnknown_IIIJruK0CGs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_IKoxEK0uuYw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IKoxEK0uuYw", sceIcuLegacyUnknown_IKoxEK0uuYw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_IMf1gsk4h4w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IMf1gsk4h4w", sceIcuLegacyUnknown_IMf1gsk4h4w_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_INEukREU21A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("INEukREU21A", sceIcuLegacyUnknown_INEukREU21A_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_INbKhQczj9s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("INbKhQczj9s", sceIcuLegacyUnknown_INbKhQczj9s_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_IO_minus_F9H_minus_TWxA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IO-F9H-TWxA", sceIcuLegacyUnknown_IO_minus_F9H_minus_TWxA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_IOehwgJbi6k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IOehwgJbi6k", sceIcuLegacyUnknown_IOehwgJbi6k_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_IP01q2sc2xI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IP01q2sc2xI", sceIcuLegacyUnknown_IP01q2sc2xI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_IQ_minus_21YxarGo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IQ-21YxarGo", sceIcuLegacyUnknown_IQ_minus_21YxarGo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_IRf9HvKqkeM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IRf9HvKqkeM", sceIcuLegacyUnknown_IRf9HvKqkeM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_IUX1D2dfZGA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IUX1D2dfZGA", sceIcuLegacyUnknown_IUX1D2dfZGA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_IWu_minus_8_plus_2bLeY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IWu-8+2bLeY", sceIcuLegacyUnknown_IWu_minus_8_plus_2bLeY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_IYbUhxZNmBg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IYbUhxZNmBg", sceIcuLegacyUnknown_IYbUhxZNmBg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_IZ23C5wrPu0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IZ23C5wrPu0", sceIcuLegacyUnknown_IZ23C5wrPu0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_IZMlz_plus_AdIgg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IZMlz+AdIgg", sceIcuLegacyUnknown_IZMlz_plus_AdIgg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_IaB0eRggZAo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IaB0eRggZAo", sceIcuLegacyUnknown_IaB0eRggZAo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_IanTFc9GOVU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IanTFc9GOVU", sceIcuLegacyUnknown_IanTFc9GOVU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_IbHuo19xGVY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IbHuo19xGVY", sceIcuLegacyUnknown_IbHuo19xGVY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_IcfE79RIR4E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IcfE79RIR4E", sceIcuLegacyUnknown_IcfE79RIR4E_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_IdD_plus_BmsNc44_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IdD+BmsNc44", sceIcuLegacyUnknown_IdD_plus_BmsNc44_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_IdI0gfFYiDU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IdI0gfFYiDU", sceIcuLegacyUnknown_IdI0gfFYiDU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_IdxOBVfiVLk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IdxOBVfiVLk", sceIcuLegacyUnknown_IdxOBVfiVLk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_If0WrZVmgJU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("If0WrZVmgJU", sceIcuLegacyUnknown_If0WrZVmgJU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_IgQF_plus_ZfzGuE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IgQF+ZfzGuE", sceIcuLegacyUnknown_IgQF_plus_ZfzGuE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_IhoS6n3hVAI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IhoS6n3hVAI", sceIcuLegacyUnknown_IhoS6n3hVAI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_IoNHhprXb8k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IoNHhprXb8k", sceIcuLegacyUnknown_IoNHhprXb8k_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Iu5YSMuAlYM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Iu5YSMuAlYM", sceIcuLegacyUnknown_Iu5YSMuAlYM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_IujaBegS7U8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IujaBegS7U8", sceIcuLegacyUnknown_IujaBegS7U8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Iv2gq6GySGc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Iv2gq6GySGc", sceIcuLegacyUnknown_Iv2gq6GySGc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_IwvVv7Ymdpg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IwvVv7Ymdpg", sceIcuLegacyUnknown_IwvVv7Ymdpg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_IzMah3NMgUo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IzMah3NMgUo", sceIcuLegacyUnknown_IzMah3NMgUo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_J0Hb2lTb0wg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("J0Hb2lTb0wg", sceIcuLegacyUnknown_J0Hb2lTb0wg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_J2Iuz2m7sDA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("J2Iuz2m7sDA", sceIcuLegacyUnknown_J2Iuz2m7sDA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_J2m6GA6ENpY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("J2m6GA6ENpY", sceIcuLegacyUnknown_J2m6GA6ENpY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_J3JjYmGmtg0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("J3JjYmGmtg0", sceIcuLegacyUnknown_J3JjYmGmtg0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_J6sbFQ7s7u4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("J6sbFQ7s7u4", sceIcuLegacyUnknown_J6sbFQ7s7u4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_J7Cw18z9W_plus_g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("J7Cw18z9W+g", sceIcuLegacyUnknown_J7Cw18z9W_plus_g_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_JAWRJyANNUg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JAWRJyANNUg", sceIcuLegacyUnknown_JAWRJyANNUg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_JEk_minus_dOvfg3w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JEk-dOvfg3w", sceIcuLegacyUnknown_JEk_minus_dOvfg3w_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_JFVDfLUw4Zc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JFVDfLUw4Zc", sceIcuLegacyUnknown_JFVDfLUw4Zc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_JHxa8JiPmdo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JHxa8JiPmdo", sceIcuLegacyUnknown_JHxa8JiPmdo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_JI_minus_0NqOZkRw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JI-0NqOZkRw", sceIcuLegacyUnknown_JI_minus_0NqOZkRw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_JIR7FPmNgAo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JIR7FPmNgAo", sceIcuLegacyUnknown_JIR7FPmNgAo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_JIWNw5ji_plus_iA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JIWNw5ji+iA", sceIcuLegacyUnknown_JIWNw5ji_plus_iA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_JKhKXK6TANE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JKhKXK6TANE", sceIcuLegacyUnknown_JKhKXK6TANE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_JM5BQOowh9E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JM5BQOowh9E", sceIcuLegacyUnknown_JM5BQOowh9E_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_JPUUO_plus_5XGgA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JPUUO+5XGgA", sceIcuLegacyUnknown_JPUUO_plus_5XGgA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_JPysw1EVb2M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JPysw1EVb2M", sceIcuLegacyUnknown_JPysw1EVb2M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_JUu0_minus_1OqEro_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JUu0-1OqEro", sceIcuLegacyUnknown_JUu0_minus_1OqEro_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_JZ5yszZEFEY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JZ5yszZEFEY", sceIcuLegacyUnknown_JZ5yszZEFEY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_JZk2NwEVM1U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JZk2NwEVM1U", sceIcuLegacyUnknown_JZk2NwEVM1U_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Jah5ajjD_plus_qA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Jah5ajjD+qA", sceIcuLegacyUnknown_Jah5ajjD_plus_qA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_JeOBsa9XvZU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JeOBsa9XvZU", sceIcuLegacyUnknown_JeOBsa9XvZU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_JebefXW14GI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JebefXW14GI", sceIcuLegacyUnknown_JebefXW14GI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Jf4entCVZCU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Jf4entCVZCU", sceIcuLegacyUnknown_Jf4entCVZCU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_JfjfrvJ_minus_C8s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JfjfrvJ-C8s", sceIcuLegacyUnknown_JfjfrvJ_minus_C8s_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Jj_plus_wF0R3jVQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Jj+wF0R3jVQ", sceIcuLegacyUnknown_Jj_plus_wF0R3jVQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_JjEnc0UEf1Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JjEnc0UEf1Q", sceIcuLegacyUnknown_JjEnc0UEf1Q_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_JpxcMELea4U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JpxcMELea4U", sceIcuLegacyUnknown_JpxcMELea4U_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_JqFe76va0po_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JqFe76va0po", sceIcuLegacyUnknown_JqFe76va0po_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_JupuKA53kOo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JupuKA53kOo", sceIcuLegacyUnknown_JupuKA53kOo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Jv37SQyYn2A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Jv37SQyYn2A", sceIcuLegacyUnknown_Jv37SQyYn2A_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_K_plus_5wO2j41kA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("K+5wO2j41kA", sceIcuLegacyUnknown_K_plus_5wO2j41kA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_K_plus_wRE7USXXg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("K+wRE7USXXg", sceIcuLegacyUnknown_K_plus_wRE7USXXg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_K_minus_41pszCv_minus_w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("K-41pszCv-w", sceIcuLegacyUnknown_K_minus_41pszCv_minus_w_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_K2b9BAsHlUU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("K2b9BAsHlUU", sceIcuLegacyUnknown_K2b9BAsHlUU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_K2cFgHHJ9S4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("K2cFgHHJ9S4", sceIcuLegacyUnknown_K2cFgHHJ9S4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_K3PULDvimho_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("K3PULDvimho", sceIcuLegacyUnknown_K3PULDvimho_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_K4zbmpk44h8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("K4zbmpk44h8", sceIcuLegacyUnknown_K4zbmpk44h8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_K75PQrTqIys_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("K75PQrTqIys", sceIcuLegacyUnknown_K75PQrTqIys_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_K7hr7FpfeQU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("K7hr7FpfeQU", sceIcuLegacyUnknown_K7hr7FpfeQU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_KAIJx8ooGyw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KAIJx8ooGyw", sceIcuLegacyUnknown_KAIJx8ooGyw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_KB3LMUXQ93Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KB3LMUXQ93Q", sceIcuLegacyUnknown_KB3LMUXQ93Q_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_KBiJX7uBSwk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KBiJX7uBSwk", sceIcuLegacyUnknown_KBiJX7uBSwk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_KDfl4uF3qLA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KDfl4uF3qLA", sceIcuLegacyUnknown_KDfl4uF3qLA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_KDgIQCEOWRc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KDgIQCEOWRc", sceIcuLegacyUnknown_KDgIQCEOWRc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_KInRyRtlgyQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KInRyRtlgyQ", sceIcuLegacyUnknown_KInRyRtlgyQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_KIthnNHYOFc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KIthnNHYOFc", sceIcuLegacyUnknown_KIthnNHYOFc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_KJtZG_plus_ElX_plus_k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KJtZG+ElX+k", sceIcuLegacyUnknown_KJtZG_plus_ElX_plus_k_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_KK7uwBYGCVA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KK7uwBYGCVA", sceIcuLegacyUnknown_KK7uwBYGCVA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_KKuSC7kIBKM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KKuSC7kIBKM", sceIcuLegacyUnknown_KKuSC7kIBKM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_KN7v5BD_minus_XNY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KN7v5BD-XNY", sceIcuLegacyUnknown_KN7v5BD_minus_XNY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_KO8GGqFkytk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KO8GGqFkytk", sceIcuLegacyUnknown_KO8GGqFkytk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_KVKa5_plus_wS_plus_30_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KVKa5+wS+30", sceIcuLegacyUnknown_KVKa5_plus_wS_plus_30_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_KVUeCjQZJEs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KVUeCjQZJEs", sceIcuLegacyUnknown_KVUeCjQZJEs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_KVtXOV0OSEo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KVtXOV0OSEo", sceIcuLegacyUnknown_KVtXOV0OSEo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_KWRIj1nwZLg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KWRIj1nwZLg", sceIcuLegacyUnknown_KWRIj1nwZLg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_KYZNNsnfK_minus_U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KYZNNsnfK-U", sceIcuLegacyUnknown_KYZNNsnfK_minus_U_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_KaAs04Omkgg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KaAs04Omkgg", sceIcuLegacyUnknown_KaAs04Omkgg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_KfkJGR3kv5Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KfkJGR3kv5Y", sceIcuLegacyUnknown_KfkJGR3kv5Y_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_KkKMwY814FY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KkKMwY814FY", sceIcuLegacyUnknown_KkKMwY814FY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_KkQWf6HzHrQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KkQWf6HzHrQ", sceIcuLegacyUnknown_KkQWf6HzHrQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_KoNSBcVXz2Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KoNSBcVXz2Q", sceIcuLegacyUnknown_KoNSBcVXz2Q_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Kos3ziZAkOs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Kos3ziZAkOs", sceIcuLegacyUnknown_Kos3ziZAkOs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_KovIXY7wrnc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KovIXY7wrnc", sceIcuLegacyUnknown_KovIXY7wrnc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_KqHLl7_minus_V8Bw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KqHLl7-V8Bw", sceIcuLegacyUnknown_KqHLl7_minus_V8Bw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_KqkTmCmqddQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KqkTmCmqddQ", sceIcuLegacyUnknown_KqkTmCmqddQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Kr8Q8xo3B8M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Kr8Q8xo3B8M", sceIcuLegacyUnknown_Kr8Q8xo3B8M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_KrVvNUl87Og_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KrVvNUl87Og", sceIcuLegacyUnknown_KrVvNUl87Og_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Krr2_minus_TrnIYE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Krr2-TrnIYE", sceIcuLegacyUnknown_Krr2_minus_TrnIYE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Ks0DybWzY3c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ks0DybWzY3c", sceIcuLegacyUnknown_Ks0DybWzY3c_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_KsteWFxXXMk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KsteWFxXXMk", sceIcuLegacyUnknown_KsteWFxXXMk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Ku_minus_D_plus_t4G22c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ku-D+t4G22c", sceIcuLegacyUnknown_Ku_minus_D_plus_t4G22c_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Kw0rfs6PoyI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Kw0rfs6PoyI", sceIcuLegacyUnknown_Kw0rfs6PoyI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_L_plus_V3HR8yPRQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("L+V3HR8yPRQ", sceIcuLegacyUnknown_L_plus_V3HR8yPRQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_L0RiuMvlZRY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("L0RiuMvlZRY", sceIcuLegacyUnknown_L0RiuMvlZRY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_L0ifl6CL5qs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("L0ifl6CL5qs", sceIcuLegacyUnknown_L0ifl6CL5qs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_L2qqjRb7Ufg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("L2qqjRb7Ufg", sceIcuLegacyUnknown_L2qqjRb7Ufg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_L3KZqUc_minus_gDQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("L3KZqUc-gDQ", sceIcuLegacyUnknown_L3KZqUc_minus_gDQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_L4CoSJBSxQc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("L4CoSJBSxQc", sceIcuLegacyUnknown_L4CoSJBSxQc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_L5munwxksjs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("L5munwxksjs", sceIcuLegacyUnknown_L5munwxksjs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_L6Xfm2Diua8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("L6Xfm2Diua8", sceIcuLegacyUnknown_L6Xfm2Diua8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_L9fV3S2_minus_iU8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("L9fV3S2-iU8", sceIcuLegacyUnknown_L9fV3S2_minus_iU8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_LACXLQsbIrY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LACXLQsbIrY", sceIcuLegacyUnknown_LACXLQsbIrY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_LAem21NWI48_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LAem21NWI48", sceIcuLegacyUnknown_LAem21NWI48_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_LBcb0QSFZqg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LBcb0QSFZqg", sceIcuLegacyUnknown_LBcb0QSFZqg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_LEkJXXGOuHM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LEkJXXGOuHM", sceIcuLegacyUnknown_LEkJXXGOuHM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_LFnGuvXO7tA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LFnGuvXO7tA", sceIcuLegacyUnknown_LFnGuvXO7tA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_LG7qiEu4dls_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LG7qiEu4dls", sceIcuLegacyUnknown_LG7qiEu4dls_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_LGf6giFRCYc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LGf6giFRCYc", sceIcuLegacyUnknown_LGf6giFRCYc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_LHz_plus_LvKSpC8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LHz+LvKSpC8", sceIcuLegacyUnknown_LHz_plus_LvKSpC8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_LNlDAiLcUdA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LNlDAiLcUdA", sceIcuLegacyUnknown_LNlDAiLcUdA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_LNoqfkCKSbM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LNoqfkCKSbM", sceIcuLegacyUnknown_LNoqfkCKSbM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_LOibXDuc2xM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LOibXDuc2xM", sceIcuLegacyUnknown_LOibXDuc2xM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_LQXvpa1j0gc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LQXvpa1j0gc", sceIcuLegacyUnknown_LQXvpa1j0gc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_LRPd_minus_7N25a8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LRPd-7N25a8", sceIcuLegacyUnknown_LRPd_minus_7N25a8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_LRSYSJctgHc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LRSYSJctgHc", sceIcuLegacyUnknown_LRSYSJctgHc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_LRfUdv7qP9U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LRfUdv7qP9U", sceIcuLegacyUnknown_LRfUdv7qP9U_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_LW7Jgpp07Xs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LW7Jgpp07Xs", sceIcuLegacyUnknown_LW7Jgpp07Xs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_LYLtEUxjh30_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LYLtEUxjh30", sceIcuLegacyUnknown_LYLtEUxjh30_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_LYdVoWZ5u5g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LYdVoWZ5u5g", sceIcuLegacyUnknown_LYdVoWZ5u5g_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_LaosADlUoL0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LaosADlUoL0", sceIcuLegacyUnknown_LaosADlUoL0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Lbl6TNS8Zbc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Lbl6TNS8Zbc", sceIcuLegacyUnknown_Lbl6TNS8Zbc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Ld8vUQ78vY4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ld8vUQ78vY4", sceIcuLegacyUnknown_Ld8vUQ78vY4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_LeUSfXmt5pc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LeUSfXmt5pc", sceIcuLegacyUnknown_LeUSfXmt5pc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Li5hVTvoIq0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Li5hVTvoIq0", sceIcuLegacyUnknown_Li5hVTvoIq0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Ljo43aARSI0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ljo43aARSI0", sceIcuLegacyUnknown_Ljo43aARSI0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_LkxAmKtzXnQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LkxAmKtzXnQ", sceIcuLegacyUnknown_LkxAmKtzXnQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Ll0Ae2mHnws_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ll0Ae2mHnws", sceIcuLegacyUnknown_Ll0Ae2mHnws_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_LqE0Mr8ZX8g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LqE0Mr8ZX8g", sceIcuLegacyUnknown_LqE0Mr8ZX8g_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_LspUICRVlKw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LspUICRVlKw", sceIcuLegacyUnknown_LspUICRVlKw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_LuZV7KompTw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LuZV7KompTw", sceIcuLegacyUnknown_LuZV7KompTw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_M0Jx255A3Mo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("M0Jx255A3Mo", sceIcuLegacyUnknown_M0Jx255A3Mo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_M1eUUTg_plus_Ftc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("M1eUUTg+Ftc", sceIcuLegacyUnknown_M1eUUTg_plus_Ftc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_M5i9FLLxblE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("M5i9FLLxblE", sceIcuLegacyUnknown_M5i9FLLxblE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_M5mQPzN5Ra0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("M5mQPzN5Ra0", sceIcuLegacyUnknown_M5mQPzN5Ra0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_M63i58XoLaM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("M63i58XoLaM", sceIcuLegacyUnknown_M63i58XoLaM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_M7ZBa60MsrQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("M7ZBa60MsrQ", sceIcuLegacyUnknown_M7ZBa60MsrQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_M7ZzlDi_minus_pH8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("M7ZzlDi-pH8", sceIcuLegacyUnknown_M7ZzlDi_minus_pH8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_M7gBQBYsxjA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("M7gBQBYsxjA", sceIcuLegacyUnknown_M7gBQBYsxjA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_M9iCKC5Bd24_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("M9iCKC5Bd24", sceIcuLegacyUnknown_M9iCKC5Bd24_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_MBNgOH4bLWk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MBNgOH4bLWk", sceIcuLegacyUnknown_MBNgOH4bLWk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_MEBzUOmftn4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MEBzUOmftn4", sceIcuLegacyUnknown_MEBzUOmftn4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_MEcUxTGpWFs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MEcUxTGpWFs", sceIcuLegacyUnknown_MEcUxTGpWFs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_MG_minus_v0P_minus_a1MM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MG-v0P-a1MM", sceIcuLegacyUnknown_MG_minus_v0P_minus_a1MM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_MHxBljq_minus_NoE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MHxBljq-NoE", sceIcuLegacyUnknown_MHxBljq_minus_NoE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_MLXwCWvokGk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MLXwCWvokGk", sceIcuLegacyUnknown_MLXwCWvokGk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_MN0WbuPuXxs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MN0WbuPuXxs", sceIcuLegacyUnknown_MN0WbuPuXxs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_MPMZS7EM9hU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MPMZS7EM9hU", sceIcuLegacyUnknown_MPMZS7EM9hU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_MQuZ4MzYvZw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MQuZ4MzYvZw", sceIcuLegacyUnknown_MQuZ4MzYvZw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_MR8hdthuITw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MR8hdthuITw", sceIcuLegacyUnknown_MR8hdthuITw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_MRFb4OAPRh4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MRFb4OAPRh4", sceIcuLegacyUnknown_MRFb4OAPRh4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_MgIiQHL1nG8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MgIiQHL1nG8", sceIcuLegacyUnknown_MgIiQHL1nG8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_MgOULDsmF9I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MgOULDsmF9I", sceIcuLegacyUnknown_MgOULDsmF9I_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Mgt7OGGL2ks_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Mgt7OGGL2ks", sceIcuLegacyUnknown_Mgt7OGGL2ks_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_MimkniqIX_minus_U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MimkniqIX-U", sceIcuLegacyUnknown_MimkniqIX_minus_U_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Mp_minus_ed4mVBt4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Mp-ed4mVBt4", sceIcuLegacyUnknown_Mp_minus_ed4mVBt4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_MrRSiZh3Rvc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MrRSiZh3Rvc", sceIcuLegacyUnknown_MrRSiZh3Rvc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_MuT_plus_DQN4tq8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MuT+DQN4tq8", sceIcuLegacyUnknown_MuT_plus_DQN4tq8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_N_plus_M61OMzIYw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("N+M61OMzIYw", sceIcuLegacyUnknown_N_plus_M61OMzIYw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_N_minus_TkAdsDzsE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("N-TkAdsDzsE", sceIcuLegacyUnknown_N_minus_TkAdsDzsE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_N_minus_varN7jC_plus_k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("N-varN7jC+k", sceIcuLegacyUnknown_N_minus_varN7jC_plus_k_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_N0aSloOtG_minus_U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("N0aSloOtG-U", sceIcuLegacyUnknown_N0aSloOtG_minus_U_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_N757y37H3kg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("N757y37H3kg", sceIcuLegacyUnknown_N757y37H3kg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_N7JkETORE2E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("N7JkETORE2E", sceIcuLegacyUnknown_N7JkETORE2E_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_NAXVsQUIzpg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NAXVsQUIzpg", sceIcuLegacyUnknown_NAXVsQUIzpg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_NAjdfYSU_plus_nA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NAjdfYSU+nA", sceIcuLegacyUnknown_NAjdfYSU_plus_nA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_NB5FtweNAbM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NB5FtweNAbM", sceIcuLegacyUnknown_NB5FtweNAbM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_NEQb_minus_FxvCOk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NEQb-FxvCOk", sceIcuLegacyUnknown_NEQb_minus_FxvCOk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_NJ6il_plus_VCsWA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NJ6il+VCsWA", sceIcuLegacyUnknown_NJ6il_plus_VCsWA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_NLGsPqTjKbk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NLGsPqTjKbk", sceIcuLegacyUnknown_NLGsPqTjKbk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_NPm7M9jBotM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NPm7M9jBotM", sceIcuLegacyUnknown_NPm7M9jBotM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_NSO_plus_H045MLY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NSO+H045MLY", sceIcuLegacyUnknown_NSO_plus_H045MLY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_NSVDU58E0hQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NSVDU58E0hQ", sceIcuLegacyUnknown_NSVDU58E0hQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_NTI0TddqtR0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NTI0TddqtR0", sceIcuLegacyUnknown_NTI0TddqtR0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_NUNZTPajen8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NUNZTPajen8", sceIcuLegacyUnknown_NUNZTPajen8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_NWwYyioNHuY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NWwYyioNHuY", sceIcuLegacyUnknown_NWwYyioNHuY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_NXFksW1Q9R0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NXFksW1Q9R0", sceIcuLegacyUnknown_NXFksW1Q9R0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_NYUgnlAwsbE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NYUgnlAwsbE", sceIcuLegacyUnknown_NYUgnlAwsbE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_NeyR34Tm1Uk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NeyR34Tm1Uk", sceIcuLegacyUnknown_NeyR34Tm1Uk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_NiYYnZSvraA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NiYYnZSvraA", sceIcuLegacyUnknown_NiYYnZSvraA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_NkYzPGeuIVI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NkYzPGeuIVI", sceIcuLegacyUnknown_NkYzPGeuIVI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_NkfQovJsvVw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NkfQovJsvVw", sceIcuLegacyUnknown_NkfQovJsvVw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_NlW2FYMHi6U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NlW2FYMHi6U", sceIcuLegacyUnknown_NlW2FYMHi6U_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_NlZPkTwdapU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NlZPkTwdapU", sceIcuLegacyUnknown_NlZPkTwdapU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_NlgO40CIaSU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NlgO40CIaSU", sceIcuLegacyUnknown_NlgO40CIaSU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_NmrbXIkGfXE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NmrbXIkGfXE", sceIcuLegacyUnknown_NmrbXIkGfXE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_NnyxquMLrYg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NnyxquMLrYg", sceIcuLegacyUnknown_NnyxquMLrYg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_NvJla4dIB_minus_Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NvJla4dIB-Y", sceIcuLegacyUnknown_NvJla4dIB_minus_Y_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Nwd5R6GbF3g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Nwd5R6GbF3g", sceIcuLegacyUnknown_Nwd5R6GbF3g_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_O_minus_3ISZkWmqY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("O-3ISZkWmqY", sceIcuLegacyUnknown_O_minus_3ISZkWmqY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_O1AKXvnt5ME_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("O1AKXvnt5ME", sceIcuLegacyUnknown_O1AKXvnt5ME_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_O1bbepDkvus_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("O1bbepDkvus", sceIcuLegacyUnknown_O1bbepDkvus_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_O29beVrfByY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("O29beVrfByY", sceIcuLegacyUnknown_O29beVrfByY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_O2OnJIoLIaU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("O2OnJIoLIaU", sceIcuLegacyUnknown_O2OnJIoLIaU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_O335dKhiuAM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("O335dKhiuAM", sceIcuLegacyUnknown_O335dKhiuAM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_O3onBkM_plus_s00_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("O3onBkM+s00", sceIcuLegacyUnknown_O3onBkM_plus_s00_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_O4trU_plus_dXByY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("O4trU+dXByY", sceIcuLegacyUnknown_O4trU_plus_dXByY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_O5NQ1vCKL2A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("O5NQ1vCKL2A", sceIcuLegacyUnknown_O5NQ1vCKL2A_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_OCWP8GdBkA0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OCWP8GdBkA0", sceIcuLegacyUnknown_OCWP8GdBkA0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_OCjPaqrINAc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OCjPaqrINAc", sceIcuLegacyUnknown_OCjPaqrINAc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_OEDiYHbBsBw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OEDiYHbBsBw", sceIcuLegacyUnknown_OEDiYHbBsBw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_OGsAG9sZH5s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OGsAG9sZH5s", sceIcuLegacyUnknown_OGsAG9sZH5s_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_OHa5kEg4yPY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OHa5kEg4yPY", sceIcuLegacyUnknown_OHa5kEg4yPY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_OHplS_plus_3Erdw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OHplS+3Erdw", sceIcuLegacyUnknown_OHplS_plus_3Erdw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_OI0wiLlbUfU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OI0wiLlbUfU", sceIcuLegacyUnknown_OI0wiLlbUfU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_OIl3XSM6Vv8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OIl3XSM6Vv8", sceIcuLegacyUnknown_OIl3XSM6Vv8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_OJTzfPrCznk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OJTzfPrCznk", sceIcuLegacyUnknown_OJTzfPrCznk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_OMFHJyAqrik_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OMFHJyAqrik", sceIcuLegacyUnknown_OMFHJyAqrik_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_OP7lBNwG1ds_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OP7lBNwG1ds", sceIcuLegacyUnknown_OP7lBNwG1ds_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_OSoQsh3_plus_xeE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OSoQsh3+xeE", sceIcuLegacyUnknown_OSoQsh3_plus_xeE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_OTPnYDhhtL8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OTPnYDhhtL8", sceIcuLegacyUnknown_OTPnYDhhtL8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_OUNV_plus_YG4onk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OUNV+YG4onk", sceIcuLegacyUnknown_OUNV_plus_YG4onk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_OYIsVY8rPo0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OYIsVY8rPo0", sceIcuLegacyUnknown_OYIsVY8rPo0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_OYlZo_plus_lzJew_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OYlZo+lzJew", sceIcuLegacyUnknown_OYlZo_plus_lzJew_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Oa7_minus_ORUW07c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Oa7-ORUW07c", sceIcuLegacyUnknown_Oa7_minus_ORUW07c_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Oavmk5bh4b4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Oavmk5bh4b4", sceIcuLegacyUnknown_Oavmk5bh4b4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Obpp_plus_5fUIEU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Obpp+5fUIEU", sceIcuLegacyUnknown_Obpp_plus_5fUIEU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ObwzLI6lyr0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ObwzLI6lyr0", sceIcuLegacyUnknown_ObwzLI6lyr0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_OenefAIiO3o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OenefAIiO3o", sceIcuLegacyUnknown_OenefAIiO3o_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Og5tvEt3WEA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Og5tvEt3WEA", sceIcuLegacyUnknown_Og5tvEt3WEA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_OmRPdhXIoMc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OmRPdhXIoMc", sceIcuLegacyUnknown_OmRPdhXIoMc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Opz1C8EZDlU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Opz1C8EZDlU", sceIcuLegacyUnknown_Opz1C8EZDlU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_OqNHsOrRTdM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OqNHsOrRTdM", sceIcuLegacyUnknown_OqNHsOrRTdM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_OqjQgnhJ4EM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OqjQgnhJ4EM", sceIcuLegacyUnknown_OqjQgnhJ4EM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_OudedZ6XQT8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OudedZ6XQT8", sceIcuLegacyUnknown_OudedZ6XQT8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_OxIG2zZW0Kw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OxIG2zZW0Kw", sceIcuLegacyUnknown_OxIG2zZW0Kw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_P_plus_QOsZCRg1A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("P+QOsZCRg1A", sceIcuLegacyUnknown_P_plus_QOsZCRg1A_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_P23_minus_YeY1qtM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("P23-YeY1qtM", sceIcuLegacyUnknown_P23_minus_YeY1qtM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_P7Iwi4lX5Z4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("P7Iwi4lX5Z4", sceIcuLegacyUnknown_P7Iwi4lX5Z4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_P8db3_minus_BSRYE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("P8db3-BSRYE", sceIcuLegacyUnknown_P8db3_minus_BSRYE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_P9o3V_plus_9nJT0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("P9o3V+9nJT0", sceIcuLegacyUnknown_P9o3V_plus_9nJT0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_PBFHhmIPNgY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PBFHhmIPNgY", sceIcuLegacyUnknown_PBFHhmIPNgY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_PD49UhStsJI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PD49UhStsJI", sceIcuLegacyUnknown_PD49UhStsJI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_PFdxNGHYPVg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PFdxNGHYPVg", sceIcuLegacyUnknown_PFdxNGHYPVg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_PFz6YnZRRjQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PFz6YnZRRjQ", sceIcuLegacyUnknown_PFz6YnZRRjQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_PFzEdRibnT8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PFzEdRibnT8", sceIcuLegacyUnknown_PFzEdRibnT8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_PJtYzlSnrxw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PJtYzlSnrxw", sceIcuLegacyUnknown_PJtYzlSnrxw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_PKV_minus_sUiGhmU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PKV-sUiGhmU", sceIcuLegacyUnknown_PKV_minus_sUiGhmU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_PLZ_minus_4VHBXKs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PLZ-4VHBXKs", sceIcuLegacyUnknown_PLZ_minus_4VHBXKs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_PM_plus__minus_qdc3ZUk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PM+-qdc3ZUk", sceIcuLegacyUnknown_PM_plus__minus_qdc3ZUk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_PM0QT9XMliE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PM0QT9XMliE", sceIcuLegacyUnknown_PM0QT9XMliE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_PN_minus_GmlJsZD4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PN-GmlJsZD4", sceIcuLegacyUnknown_PN_minus_GmlJsZD4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_PPP_minus_EGQo_plus_oo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PPP-EGQo+oo", sceIcuLegacyUnknown_PPP_minus_EGQo_plus_oo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_PQWUxIuRIx8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PQWUxIuRIx8", sceIcuLegacyUnknown_PQWUxIuRIx8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_PSc6Lv62jyg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PSc6Lv62jyg", sceIcuLegacyUnknown_PSc6Lv62jyg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_PWISzM92NSI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PWISzM92NSI", sceIcuLegacyUnknown_PWISzM92NSI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_PX4U4igNkjo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PX4U4igNkjo", sceIcuLegacyUnknown_PX4U4igNkjo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_PXLnkfscxNE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PXLnkfscxNE", sceIcuLegacyUnknown_PXLnkfscxNE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_PXd75hGLMcY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PXd75hGLMcY", sceIcuLegacyUnknown_PXd75hGLMcY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_PYGSKRplzLE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PYGSKRplzLE", sceIcuLegacyUnknown_PYGSKRplzLE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_PcYjW1H4a_minus_s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PcYjW1H4a-s", sceIcuLegacyUnknown_PcYjW1H4a_minus_s_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_PcaAnlmxf94_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PcaAnlmxf94", sceIcuLegacyUnknown_PcaAnlmxf94_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_PctbuBEKWXE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PctbuBEKWXE", sceIcuLegacyUnknown_PctbuBEKWXE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_PdtW_plus_bHNlcU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PdtW+bHNlcU", sceIcuLegacyUnknown_PdtW_plus_bHNlcU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Pe_minus_ta4h9VJ0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Pe-ta4h9VJ0", sceIcuLegacyUnknown_Pe_minus_ta4h9VJ0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Pe9haS0YqKY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Pe9haS0YqKY", sceIcuLegacyUnknown_Pe9haS0YqKY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Pea5VQZ_minus_O5Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Pea5VQZ-O5Q", sceIcuLegacyUnknown_Pea5VQZ_minus_O5Q_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_PjAWvMoUuwY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PjAWvMoUuwY", sceIcuLegacyUnknown_PjAWvMoUuwY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_PklK_minus_cEJBgM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PklK-cEJBgM", sceIcuLegacyUnknown_PklK_minus_cEJBgM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Pl2dR3FmR24_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Pl2dR3FmR24", sceIcuLegacyUnknown_Pl2dR3FmR24_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_PotTo8Ki_minus_tA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PotTo8Ki-tA", sceIcuLegacyUnknown_PotTo8Ki_minus_tA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_PpGttpUbT8k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PpGttpUbT8k", sceIcuLegacyUnknown_PpGttpUbT8k_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_PrTDL68Pdfg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PrTDL68Pdfg", sceIcuLegacyUnknown_PrTDL68Pdfg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_PuLoqDSNPPw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PuLoqDSNPPw", sceIcuLegacyUnknown_PuLoqDSNPPw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_PvsbY_minus_71gOs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PvsbY-71gOs", sceIcuLegacyUnknown_PvsbY_minus_71gOs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_PxlmsPnf_plus_Nc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PxlmsPnf+Nc", sceIcuLegacyUnknown_PxlmsPnf_plus_Nc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Py8YS1tOPW4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Py8YS1tOPW4", sceIcuLegacyUnknown_Py8YS1tOPW4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Pz_minus_KG_minus_xEyoQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Pz-KG-xEyoQ", sceIcuLegacyUnknown_Pz_minus_KG_minus_xEyoQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Q25_plus_6thIS_minus_s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Q25+6thIS-s", sceIcuLegacyUnknown_Q25_plus_6thIS_minus_s_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Q3p9YTXm50U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Q3p9YTXm50U", sceIcuLegacyUnknown_Q3p9YTXm50U_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Q412Ms_minus_SVOA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Q412Ms-SVOA", sceIcuLegacyUnknown_Q412Ms_minus_SVOA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Q43sXfepS_plus_0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Q43sXfepS+0", sceIcuLegacyUnknown_Q43sXfepS_plus_0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Q4SpxJlEPFs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Q4SpxJlEPFs", sceIcuLegacyUnknown_Q4SpxJlEPFs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Q6TLj9e9k6E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Q6TLj9e9k6E", sceIcuLegacyUnknown_Q6TLj9e9k6E_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Q7k2GknoBY4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Q7k2GknoBY4", sceIcuLegacyUnknown_Q7k2GknoBY4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Q9SoBg_minus_fA5Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Q9SoBg-fA5Y", sceIcuLegacyUnknown_Q9SoBg_minus_fA5Y_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Q9b2pE80yXA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Q9b2pE80yXA", sceIcuLegacyUnknown_Q9b2pE80yXA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Q9iWC5cyPPU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Q9iWC5cyPPU", sceIcuLegacyUnknown_Q9iWC5cyPPU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_QAtfWx6KREg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QAtfWx6KREg", sceIcuLegacyUnknown_QAtfWx6KREg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_QCfjI087HUI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QCfjI087HUI", sceIcuLegacyUnknown_QCfjI087HUI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_QDhlB11wVSk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QDhlB11wVSk", sceIcuLegacyUnknown_QDhlB11wVSk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_QDzm7SL_minus_4So_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QDzm7SL-4So", sceIcuLegacyUnknown_QDzm7SL_minus_4So_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_QF0MnNtuTzc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QF0MnNtuTzc", sceIcuLegacyUnknown_QF0MnNtuTzc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_QFMXoOFv2wQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QFMXoOFv2wQ", sceIcuLegacyUnknown_QFMXoOFv2wQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_QFhScoCRg5s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QFhScoCRg5s", sceIcuLegacyUnknown_QFhScoCRg5s_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_QFpoqRAZMo0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QFpoqRAZMo0", sceIcuLegacyUnknown_QFpoqRAZMo0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_QGc21vGbU_plus_c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QGc21vGbU+c", sceIcuLegacyUnknown_QGc21vGbU_plus_c_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_QGiXe74ORGM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QGiXe74ORGM", sceIcuLegacyUnknown_QGiXe74ORGM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_QIM5rKGsIxo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QIM5rKGsIxo", sceIcuLegacyUnknown_QIM5rKGsIxo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_QJwd1wxTk4o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QJwd1wxTk4o", sceIcuLegacyUnknown_QJwd1wxTk4o_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_QPrUtwNPGhI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QPrUtwNPGhI", sceIcuLegacyUnknown_QPrUtwNPGhI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_QUEWShIg_plus_xM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QUEWShIg+xM", sceIcuLegacyUnknown_QUEWShIg_plus_xM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_QVKPW8w2FJg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QVKPW8w2FJg", sceIcuLegacyUnknown_QVKPW8w2FJg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_QVWsX01n08M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QVWsX01n08M", sceIcuLegacyUnknown_QVWsX01n08M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_QVxv3QrB2vM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QVxv3QrB2vM", sceIcuLegacyUnknown_QVxv3QrB2vM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_QZbGw27ZKRw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QZbGw27ZKRw", sceIcuLegacyUnknown_QZbGw27ZKRw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_QaauH67Wek4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QaauH67Wek4", sceIcuLegacyUnknown_QaauH67Wek4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_QbGY8o9qIRQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QbGY8o9qIRQ", sceIcuLegacyUnknown_QbGY8o9qIRQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Qep9CzIdxIc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Qep9CzIdxIc", sceIcuLegacyUnknown_Qep9CzIdxIc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Qet2dO4FNbM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Qet2dO4FNbM", sceIcuLegacyUnknown_Qet2dO4FNbM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Qfad41eZrts_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Qfad41eZrts", sceIcuLegacyUnknown_Qfad41eZrts_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_QjkkOo0rsYg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QjkkOo0rsYg", sceIcuLegacyUnknown_QjkkOo0rsYg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_QjuRBOGeWLA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QjuRBOGeWLA", sceIcuLegacyUnknown_QjuRBOGeWLA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Qkf6sv1EaJQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Qkf6sv1EaJQ", sceIcuLegacyUnknown_Qkf6sv1EaJQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_QmnKtuA7_plus_qk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QmnKtuA7+qk", sceIcuLegacyUnknown_QmnKtuA7_plus_qk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_QryKIm1pddE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QryKIm1pddE", sceIcuLegacyUnknown_QryKIm1pddE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Qu0xzEF6skM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Qu0xzEF6skM", sceIcuLegacyUnknown_Qu0xzEF6skM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_QvmoVAI3Ssg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QvmoVAI3Ssg", sceIcuLegacyUnknown_QvmoVAI3Ssg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_QxqHw1bTPpg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QxqHw1bTPpg", sceIcuLegacyUnknown_QxqHw1bTPpg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Qz6OvvsSneE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Qz6OvvsSneE", sceIcuLegacyUnknown_Qz6OvvsSneE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_QzZUHl7iUUQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QzZUHl7iUUQ", sceIcuLegacyUnknown_QzZUHl7iUUQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_R_plus__plus_t24b2vZY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("R++t24b2vZY", sceIcuLegacyUnknown_R_plus__plus_t24b2vZY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_R_plus_USPI3FhEo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("R+USPI3FhEo", sceIcuLegacyUnknown_R_plus_USPI3FhEo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_R_minus_26wEAR0KE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("R-26wEAR0KE", sceIcuLegacyUnknown_R_minus_26wEAR0KE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_R_minus_IGqgPKnmA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("R-IGqgPKnmA", sceIcuLegacyUnknown_R_minus_IGqgPKnmA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_R1umz1ZjrK0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("R1umz1ZjrK0", sceIcuLegacyUnknown_R1umz1ZjrK0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_R1y2_minus__minus_hQVMY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("R1y2--hQVMY", sceIcuLegacyUnknown_R1y2_minus__minus_hQVMY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_R2_plus_u4Jd0WSM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("R2+u4Jd0WSM", sceIcuLegacyUnknown_R2_plus_u4Jd0WSM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_R4QTqeddIH8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("R4QTqeddIH8", sceIcuLegacyUnknown_R4QTqeddIH8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_R5kS2YcFHgs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("R5kS2YcFHgs", sceIcuLegacyUnknown_R5kS2YcFHgs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_R6zfrGanPE8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("R6zfrGanPE8", sceIcuLegacyUnknown_R6zfrGanPE8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_R9KfptVxClc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("R9KfptVxClc", sceIcuLegacyUnknown_R9KfptVxClc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_R9MD1aSzIww_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("R9MD1aSzIww", sceIcuLegacyUnknown_R9MD1aSzIww_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_R9VpGVJ5pQA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("R9VpGVJ5pQA", sceIcuLegacyUnknown_R9VpGVJ5pQA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_RCQ7Ad5OcHU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RCQ7Ad5OcHU", sceIcuLegacyUnknown_RCQ7Ad5OcHU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_RD5_minus_H7ok4G0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RD5-H7ok4G0", sceIcuLegacyUnknown_RD5_minus_H7ok4G0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_RF74pnu5f_minus_c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RF74pnu5f-c", sceIcuLegacyUnknown_RF74pnu5f_minus_c_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_RIGuHTTLVwI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RIGuHTTLVwI", sceIcuLegacyUnknown_RIGuHTTLVwI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_RKPntPwRVJ0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RKPntPwRVJ0", sceIcuLegacyUnknown_RKPntPwRVJ0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_RKb6zm9UiMg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RKb6zm9UiMg", sceIcuLegacyUnknown_RKb6zm9UiMg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_RLsOwzAVkms_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RLsOwzAVkms", sceIcuLegacyUnknown_RLsOwzAVkms_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_RMa_minus_RssMQPo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RMa-RssMQPo", sceIcuLegacyUnknown_RMa_minus_RssMQPo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_RQks_minus_7xBOzw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RQks-7xBOzw", sceIcuLegacyUnknown_RQks_minus_7xBOzw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_RV_minus_wOVAbzAg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RV-wOVAbzAg", sceIcuLegacyUnknown_RV_minus_wOVAbzAg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_RXBUX0DSi4A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RXBUX0DSi4A", sceIcuLegacyUnknown_RXBUX0DSi4A_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Ra_minus_dDlmR6ww_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ra-dDlmR6ww", sceIcuLegacyUnknown_Ra_minus_dDlmR6ww_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_RawxplHcKrQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RawxplHcKrQ", sceIcuLegacyUnknown_RawxplHcKrQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_RbSW8vsLHy4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RbSW8vsLHy4", sceIcuLegacyUnknown_RbSW8vsLHy4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_RcrMekJ6rHg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RcrMekJ6rHg", sceIcuLegacyUnknown_RcrMekJ6rHg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_RdoI5GFNv5I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RdoI5GFNv5I", sceIcuLegacyUnknown_RdoI5GFNv5I_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_RfrqmtAotx4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RfrqmtAotx4", sceIcuLegacyUnknown_RfrqmtAotx4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_RiAyC7qKRko_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RiAyC7qKRko", sceIcuLegacyUnknown_RiAyC7qKRko_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_RlDX8OKyzIs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RlDX8OKyzIs", sceIcuLegacyUnknown_RlDX8OKyzIs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_RqjeXZhdFqQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RqjeXZhdFqQ", sceIcuLegacyUnknown_RqjeXZhdFqQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_RtesJX_minus_8Djk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RtesJX-8Djk", sceIcuLegacyUnknown_RtesJX_minus_8Djk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Rttr2uVv9xA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Rttr2uVv9xA", sceIcuLegacyUnknown_Rttr2uVv9xA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_RuOU9dUyjLw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RuOU9dUyjLw", sceIcuLegacyUnknown_RuOU9dUyjLw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_RzTwaq333ao_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RzTwaq333ao", sceIcuLegacyUnknown_RzTwaq333ao_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_S0kDm_minus_BCXLQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("S0kDm-BCXLQ", sceIcuLegacyUnknown_S0kDm_minus_BCXLQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_S0pbmazNMOI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("S0pbmazNMOI", sceIcuLegacyUnknown_S0pbmazNMOI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_S1K09W3LZCM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("S1K09W3LZCM", sceIcuLegacyUnknown_S1K09W3LZCM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_S1z2_minus_HnSbGc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("S1z2-HnSbGc", sceIcuLegacyUnknown_S1z2_minus_HnSbGc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_S2jOUuDWOkc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("S2jOUuDWOkc", sceIcuLegacyUnknown_S2jOUuDWOkc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_S4ykVJc3FuQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("S4ykVJc3FuQ", sceIcuLegacyUnknown_S4ykVJc3FuQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_S5kn7MlW1R0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("S5kn7MlW1R0", sceIcuLegacyUnknown_S5kn7MlW1R0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_S5wUrkE_plus_I_minus_E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("S5wUrkE+I-E", sceIcuLegacyUnknown_S5wUrkE_plus_I_minus_E_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_S7JSTuqsMMU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("S7JSTuqsMMU", sceIcuLegacyUnknown_S7JSTuqsMMU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_S7WyAcV434Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("S7WyAcV434Q", sceIcuLegacyUnknown_S7WyAcV434Q_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_S7fe1Y2DuhA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("S7fe1Y2DuhA", sceIcuLegacyUnknown_S7fe1Y2DuhA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_S80YBBKf1Ac_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("S80YBBKf1Ac", sceIcuLegacyUnknown_S80YBBKf1Ac_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_S9_plus_48_minus_4_plus_2wo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("S9+48-4+2wo", sceIcuLegacyUnknown_S9_plus_48_minus_4_plus_2wo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_SCdJjf8U5SQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SCdJjf8U5SQ", sceIcuLegacyUnknown_SCdJjf8U5SQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_SFMU423YB0o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SFMU423YB0o", sceIcuLegacyUnknown_SFMU423YB0o_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_SI3V3I2C_plus_JY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SI3V3I2C+JY", sceIcuLegacyUnknown_SI3V3I2C_plus_JY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_SIYy2TfsMvQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SIYy2TfsMvQ", sceIcuLegacyUnknown_SIYy2TfsMvQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_SJ97XSXofJw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SJ97XSXofJw", sceIcuLegacyUnknown_SJ97XSXofJw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_SJKtkxLFIU4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SJKtkxLFIU4", sceIcuLegacyUnknown_SJKtkxLFIU4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_SKZargS_minus_JLk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SKZargS-JLk", sceIcuLegacyUnknown_SKZargS_minus_JLk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_SN0K1oGtYcs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SN0K1oGtYcs", sceIcuLegacyUnknown_SN0K1oGtYcs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_SN4AcugB4Lo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SN4AcugB4Lo", sceIcuLegacyUnknown_SN4AcugB4Lo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_SOHunSDwYwA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SOHunSDwYwA", sceIcuLegacyUnknown_SOHunSDwYwA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_SOSJyt82sVA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SOSJyt82sVA", sceIcuLegacyUnknown_SOSJyt82sVA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_SOrpFAYQTu8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SOrpFAYQTu8", sceIcuLegacyUnknown_SOrpFAYQTu8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_SP9rMasauGo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SP9rMasauGo", sceIcuLegacyUnknown_SP9rMasauGo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_SPxBgfmpwGc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SPxBgfmpwGc", sceIcuLegacyUnknown_SPxBgfmpwGc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_SSEIovOWKac_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SSEIovOWKac", sceIcuLegacyUnknown_SSEIovOWKac_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ST9AlDHhLlk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ST9AlDHhLlk", sceIcuLegacyUnknown_ST9AlDHhLlk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_SV2dIx5VGAc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SV2dIx5VGAc", sceIcuLegacyUnknown_SV2dIx5VGAc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_SVgE7KgNewk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SVgE7KgNewk", sceIcuLegacyUnknown_SVgE7KgNewk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_SZ_minus_Opikuens_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SZ-Opikuens", sceIcuLegacyUnknown_SZ_minus_Opikuens_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Sb_plus_KkkrptYs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Sb+KkkrptYs", sceIcuLegacyUnknown_Sb_plus_KkkrptYs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ScvuwuX4CIk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ScvuwuX4CIk", sceIcuLegacyUnknown_ScvuwuX4CIk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Sg_minus_CohkNgW4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Sg-CohkNgW4", sceIcuLegacyUnknown_Sg_minus_CohkNgW4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_SjZwsoDk9zA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SjZwsoDk9zA", sceIcuLegacyUnknown_SjZwsoDk9zA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_SlKp2cqAfMU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SlKp2cqAfMU", sceIcuLegacyUnknown_SlKp2cqAfMU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_SlOncSS_minus_F_minus_M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SlOncSS-F-M", sceIcuLegacyUnknown_SlOncSS_minus_F_minus_M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_SlWBTy29_minus_S0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SlWBTy29-S0", sceIcuLegacyUnknown_SlWBTy29_minus_S0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Sn0O6JtaGD4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Sn0O6JtaGD4", sceIcuLegacyUnknown_Sn0O6JtaGD4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_SonsEmp2Hxo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SonsEmp2Hxo", sceIcuLegacyUnknown_SonsEmp2Hxo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_SouzWxGpDvc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SouzWxGpDvc", sceIcuLegacyUnknown_SouzWxGpDvc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_SowrYASQw5I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SowrYASQw5I", sceIcuLegacyUnknown_SowrYASQw5I_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_SpBYByK_minus_poI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SpBYByK-poI", sceIcuLegacyUnknown_SpBYByK_minus_poI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_SpYFGOWB7pM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SpYFGOWB7pM", sceIcuLegacyUnknown_SpYFGOWB7pM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_SrZAc_plus_R4bHU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SrZAc+R4bHU", sceIcuLegacyUnknown_SrZAc_plus_R4bHU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_SswKj9uvsFY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SswKj9uvsFY", sceIcuLegacyUnknown_SswKj9uvsFY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_StIh3ARXDvs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("StIh3ARXDvs", sceIcuLegacyUnknown_StIh3ARXDvs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Sv8mD8xrNQk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Sv8mD8xrNQk", sceIcuLegacyUnknown_Sv8mD8xrNQk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_T_plus_YBwcxaJrE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("T+YBwcxaJrE", sceIcuLegacyUnknown_T_plus_YBwcxaJrE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_T0Ky0xdCxAo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("T0Ky0xdCxAo", sceIcuLegacyUnknown_T0Ky0xdCxAo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_T122Lalytmc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("T122Lalytmc", sceIcuLegacyUnknown_T122Lalytmc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_T1lN_minus_HZtmcs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("T1lN-HZtmcs", sceIcuLegacyUnknown_T1lN_minus_HZtmcs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_T28HUwuSLPI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("T28HUwuSLPI", sceIcuLegacyUnknown_T28HUwuSLPI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_T3N1eGnTZyk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("T3N1eGnTZyk", sceIcuLegacyUnknown_T3N1eGnTZyk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_T4J7pya_minus_x4c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("T4J7pya-x4c", sceIcuLegacyUnknown_T4J7pya_minus_x4c_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_T6ag3Y1irpk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("T6ag3Y1irpk", sceIcuLegacyUnknown_T6ag3Y1irpk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_TCsDdypa3rA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TCsDdypa3rA", sceIcuLegacyUnknown_TCsDdypa3rA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_TCsn3PJcG78_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TCsn3PJcG78", sceIcuLegacyUnknown_TCsn3PJcG78_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_TED5T0OpJ6Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TED5T0OpJ6Q", sceIcuLegacyUnknown_TED5T0OpJ6Q_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_THYSpvC3tBU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("THYSpvC3tBU", sceIcuLegacyUnknown_THYSpvC3tBU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_TIobWRBQrTk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TIobWRBQrTk", sceIcuLegacyUnknown_TIobWRBQrTk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_TLMMUnutCuY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TLMMUnutCuY", sceIcuLegacyUnknown_TLMMUnutCuY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_TMkXGsxzbNY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TMkXGsxzbNY", sceIcuLegacyUnknown_TMkXGsxzbNY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_TOB1ZM3vh1Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TOB1ZM3vh1Y", sceIcuLegacyUnknown_TOB1ZM3vh1Y_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_TPYvKkkXlVg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TPYvKkkXlVg", sceIcuLegacyUnknown_TPYvKkkXlVg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_TQJDT63WFzs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TQJDT63WFzs", sceIcuLegacyUnknown_TQJDT63WFzs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_TQQnhBnCBJY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TQQnhBnCBJY", sceIcuLegacyUnknown_TQQnhBnCBJY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_TT_minus_E3Wna3O4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TT-E3Wna3O4", sceIcuLegacyUnknown_TT_minus_E3Wna3O4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_TU1vyo33xrs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TU1vyo33xrs", sceIcuLegacyUnknown_TU1vyo33xrs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_TZ96eGr55CM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TZ96eGr55CM", sceIcuLegacyUnknown_TZ96eGr55CM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_TbO9XCCGKCI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TbO9XCCGKCI", sceIcuLegacyUnknown_TbO9XCCGKCI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_TbVO1SJy7vQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TbVO1SJy7vQ", sceIcuLegacyUnknown_TbVO1SJy7vQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_TcoOrwDD83w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TcoOrwDD83w", sceIcuLegacyUnknown_TcoOrwDD83w_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ThE7tNT465U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ThE7tNT465U", sceIcuLegacyUnknown_ThE7tNT465U_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_TixJVW5LSt0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TixJVW5LSt0", sceIcuLegacyUnknown_TixJVW5LSt0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Tl_plus_4cztRRGY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Tl+4cztRRGY", sceIcuLegacyUnknown_Tl_plus_4cztRRGY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Tl3eqqHdVi8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Tl3eqqHdVi8", sceIcuLegacyUnknown_Tl3eqqHdVi8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Tl4BYiXZbsc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Tl4BYiXZbsc", sceIcuLegacyUnknown_Tl4BYiXZbsc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_TuExC_minus_Sja8o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TuExC-Sja8o", sceIcuLegacyUnknown_TuExC_minus_Sja8o_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_TvActQ7R_plus_7k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TvActQ7R+7k", sceIcuLegacyUnknown_TvActQ7R_plus_7k_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_TwQg4k8PWYE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TwQg4k8PWYE", sceIcuLegacyUnknown_TwQg4k8PWYE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_TzTAzAs0BSM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TzTAzAs0BSM", sceIcuLegacyUnknown_TzTAzAs0BSM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_U_plus_2ZqEkpDJU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("U+2ZqEkpDJU", sceIcuLegacyUnknown_U_plus_2ZqEkpDJU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_U_plus_K0Kv7v_minus_Hw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("U+K0Kv7v-Hw", sceIcuLegacyUnknown_U_plus_K0Kv7v_minus_Hw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_U_plus_Qljz48RIQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("U+Qljz48RIQ", sceIcuLegacyUnknown_U_plus_Qljz48RIQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_U_plus_ztaGWf924_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("U+ztaGWf924", sceIcuLegacyUnknown_U_plus_ztaGWf924_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_U2_plus_GS7yk5qM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("U2+GS7yk5qM", sceIcuLegacyUnknown_U2_plus_GS7yk5qM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_U2X2Jn1B7zY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("U2X2Jn1B7zY", sceIcuLegacyUnknown_U2X2Jn1B7zY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_U4pmG6z6WyQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("U4pmG6z6WyQ", sceIcuLegacyUnknown_U4pmG6z6WyQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_U65pCPANVPs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("U65pCPANVPs", sceIcuLegacyUnknown_U65pCPANVPs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_U7Le5Pe7II4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("U7Le5Pe7II4", sceIcuLegacyUnknown_U7Le5Pe7II4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_U8QCcEK9mcU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("U8QCcEK9mcU", sceIcuLegacyUnknown_U8QCcEK9mcU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_U8dzzbJxqi8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("U8dzzbJxqi8", sceIcuLegacyUnknown_U8dzzbJxqi8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_UEtioabjkYw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UEtioabjkYw", sceIcuLegacyUnknown_UEtioabjkYw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_UFWP11H6EXk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UFWP11H6EXk", sceIcuLegacyUnknown_UFWP11H6EXk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_UI9RDw4_minus_s40_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UI9RDw4-s40", sceIcuLegacyUnknown_UI9RDw4_minus_s40_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_UJx_minus_eyL5K3I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UJx-eyL5K3I", sceIcuLegacyUnknown_UJx_minus_eyL5K3I_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ULBXNgi_minus_LKs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ULBXNgi-LKs", sceIcuLegacyUnknown_ULBXNgi_minus_LKs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ULmQDELpYyA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ULmQDELpYyA", sceIcuLegacyUnknown_ULmQDELpYyA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_UPMUIWZL9ik_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UPMUIWZL9ik", sceIcuLegacyUnknown_UPMUIWZL9ik_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_UPr0g_minus_dqMUw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UPr0g-dqMUw", sceIcuLegacyUnknown_UPr0g_minus_dqMUw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_UR53llRvVU8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UR53llRvVU8", sceIcuLegacyUnknown_UR53llRvVU8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_UWKN5mHFHg0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UWKN5mHFHg0", sceIcuLegacyUnknown_UWKN5mHFHg0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_UYE9h9WG_plus_UI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UYE9h9WG+UI", sceIcuLegacyUnknown_UYE9h9WG_plus_UI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_UYcN_minus_kKZsis_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UYcN-kKZsis", sceIcuLegacyUnknown_UYcN_minus_kKZsis_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_UZr55KeYRsg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UZr55KeYRsg", sceIcuLegacyUnknown_UZr55KeYRsg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_UaLsDPXyFiY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UaLsDPXyFiY", sceIcuLegacyUnknown_UaLsDPXyFiY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_UaxqPKFDxLY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UaxqPKFDxLY", sceIcuLegacyUnknown_UaxqPKFDxLY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_UbuzZZlVxys_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UbuzZZlVxys", sceIcuLegacyUnknown_UbuzZZlVxys_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Uc0s1YgeTo8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Uc0s1YgeTo8", sceIcuLegacyUnknown_Uc0s1YgeTo8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_UhSI5QqNY7M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UhSI5QqNY7M", sceIcuLegacyUnknown_UhSI5QqNY7M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_UhTHf_minus_qYOu4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UhTHf-qYOu4", sceIcuLegacyUnknown_UhTHf_minus_qYOu4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_UiEFQ25ESqA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UiEFQ25ESqA", sceIcuLegacyUnknown_UiEFQ25ESqA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_UsOe37JWSYQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UsOe37JWSYQ", sceIcuLegacyUnknown_UsOe37JWSYQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Uu7eiKXsKvI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Uu7eiKXsKvI", sceIcuLegacyUnknown_Uu7eiKXsKvI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Uza9p0sRpuA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Uza9p0sRpuA", sceIcuLegacyUnknown_Uza9p0sRpuA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_UzhfWiLVNTg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UzhfWiLVNTg", sceIcuLegacyUnknown_UzhfWiLVNTg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Uzr5kKRl87Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Uzr5kKRl87Q", sceIcuLegacyUnknown_Uzr5kKRl87Q_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_V_plus_S1YZptqkw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("V+S1YZptqkw", sceIcuLegacyUnknown_V_plus_S1YZptqkw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_V6IEgX6fu0I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("V6IEgX6fu0I", sceIcuLegacyUnknown_V6IEgX6fu0I_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_V7YMgrTQERg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("V7YMgrTQERg", sceIcuLegacyUnknown_V7YMgrTQERg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_V9up2Gy6Z28_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("V9up2Gy6Z28", sceIcuLegacyUnknown_V9up2Gy6Z28_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_VBisVJCbwCE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VBisVJCbwCE", sceIcuLegacyUnknown_VBisVJCbwCE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_VCQ0G47pkEc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VCQ0G47pkEc", sceIcuLegacyUnknown_VCQ0G47pkEc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_VCXSaiAKRng_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VCXSaiAKRng", sceIcuLegacyUnknown_VCXSaiAKRng_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_VD5o6kIMIEY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VD5o6kIMIEY", sceIcuLegacyUnknown_VD5o6kIMIEY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_VMJ2Mhseaak_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VMJ2Mhseaak", sceIcuLegacyUnknown_VMJ2Mhseaak_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_VMWgNeCyEtQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VMWgNeCyEtQ", sceIcuLegacyUnknown_VMWgNeCyEtQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_VPGCKI2cOKI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VPGCKI2cOKI", sceIcuLegacyUnknown_VPGCKI2cOKI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_VS7WAl_plus_bpls_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VS7WAl+bpls", sceIcuLegacyUnknown_VS7WAl_plus_bpls_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_VSbQfegtoQU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VSbQfegtoQU", sceIcuLegacyUnknown_VSbQfegtoQU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_VWM9mDH6GBU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VWM9mDH6GBU", sceIcuLegacyUnknown_VWM9mDH6GBU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_VXBcu5pYBF4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VXBcu5pYBF4", sceIcuLegacyUnknown_VXBcu5pYBF4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_VZrw4AgQkn0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VZrw4AgQkn0", sceIcuLegacyUnknown_VZrw4AgQkn0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_VacWecpGrvc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VacWecpGrvc", sceIcuLegacyUnknown_VacWecpGrvc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_VcKIxG10J3c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VcKIxG10J3c", sceIcuLegacyUnknown_VcKIxG10J3c_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_VglHucBfTu4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VglHucBfTu4", sceIcuLegacyUnknown_VglHucBfTu4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_VhS8JK4jUcI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VhS8JK4jUcI", sceIcuLegacyUnknown_VhS8JK4jUcI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_VnBpPEefyl0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VnBpPEefyl0", sceIcuLegacyUnknown_VnBpPEefyl0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_VtIZ6eXtuh4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VtIZ6eXtuh4", sceIcuLegacyUnknown_VtIZ6eXtuh4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Vu86E_plus_iLcB8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Vu86E+iLcB8", sceIcuLegacyUnknown_Vu86E_plus_iLcB8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_W_plus_WBFLm9J_minus_A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("W+WBFLm9J-A", sceIcuLegacyUnknown_W_plus_WBFLm9J_minus_A_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_W2pzEcCD4Qc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("W2pzEcCD4Qc", sceIcuLegacyUnknown_W2pzEcCD4Qc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_W7AEl27VD_plus_o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("W7AEl27VD+o", sceIcuLegacyUnknown_W7AEl27VD_plus_o_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_WClCeFjJuRE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WClCeFjJuRE", sceIcuLegacyUnknown_WClCeFjJuRE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_WF1HJhXLhGs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WF1HJhXLhGs", sceIcuLegacyUnknown_WF1HJhXLhGs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_WFtc9UPJ7to_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WFtc9UPJ7to", sceIcuLegacyUnknown_WFtc9UPJ7to_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_WHZWnBwk1QY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WHZWnBwk1QY", sceIcuLegacyUnknown_WHZWnBwk1QY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_WI3JNZKsaaA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WI3JNZKsaaA", sceIcuLegacyUnknown_WI3JNZKsaaA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_WIfU7UI7Cag_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WIfU7UI7Cag", sceIcuLegacyUnknown_WIfU7UI7Cag_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_WJiWy3g2SOg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WJiWy3g2SOg", sceIcuLegacyUnknown_WJiWy3g2SOg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_WL6SpH8LNlA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WL6SpH8LNlA", sceIcuLegacyUnknown_WL6SpH8LNlA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_WMwz6jbOdME_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WMwz6jbOdME", sceIcuLegacyUnknown_WMwz6jbOdME_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_WQ1d_plus_mSnIns_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WQ1d+mSnIns", sceIcuLegacyUnknown_WQ1d_plus_mSnIns_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_WQbbbeibis4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WQbbbeibis4", sceIcuLegacyUnknown_WQbbbeibis4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_WRx5wt_minus_XPmk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WRx5wt-XPmk", sceIcuLegacyUnknown_WRx5wt_minus_XPmk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_WXYlroAVMGY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WXYlroAVMGY", sceIcuLegacyUnknown_WXYlroAVMGY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_WYZh28ILF2k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WYZh28ILF2k", sceIcuLegacyUnknown_WYZh28ILF2k_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_WZ9vkyIyxLI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WZ9vkyIyxLI", sceIcuLegacyUnknown_WZ9vkyIyxLI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_WaVmOqRC0Qs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WaVmOqRC0Qs", sceIcuLegacyUnknown_WaVmOqRC0Qs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_WdCwmDiTuFE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WdCwmDiTuFE", sceIcuLegacyUnknown_WdCwmDiTuFE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Wf5woiuN9RU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Wf5woiuN9RU", sceIcuLegacyUnknown_Wf5woiuN9RU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_WhESSNwlm08_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WhESSNwlm08", sceIcuLegacyUnknown_WhESSNwlm08_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_WhxoT9o30p8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WhxoT9o30p8", sceIcuLegacyUnknown_WhxoT9o30p8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_WiI1Xhxmhj8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WiI1Xhxmhj8", sceIcuLegacyUnknown_WiI1Xhxmhj8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Wl4iFeKAqww_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Wl4iFeKAqww", sceIcuLegacyUnknown_Wl4iFeKAqww_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_WlYNCAlZVpQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WlYNCAlZVpQ", sceIcuLegacyUnknown_WlYNCAlZVpQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_WlmCWJh41Ik_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WlmCWJh41Ik", sceIcuLegacyUnknown_WlmCWJh41Ik_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_WnbVnvSPKXE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WnbVnvSPKXE", sceIcuLegacyUnknown_WnbVnvSPKXE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_WoUHWBJcLr0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WoUHWBJcLr0", sceIcuLegacyUnknown_WoUHWBJcLr0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_WqYlfuHTlOA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WqYlfuHTlOA", sceIcuLegacyUnknown_WqYlfuHTlOA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_WtqIH1ArSCs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WtqIH1ArSCs", sceIcuLegacyUnknown_WtqIH1ArSCs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_WuAPUwIvKIo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WuAPUwIvKIo", sceIcuLegacyUnknown_WuAPUwIvKIo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_WyjerIFpJ6A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WyjerIFpJ6A", sceIcuLegacyUnknown_WyjerIFpJ6A_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_WymRosuh07Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WymRosuh07Y", sceIcuLegacyUnknown_WymRosuh07Y_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_X_plus__plus_EgTQvxIo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("X++EgTQvxIo", sceIcuLegacyUnknown_X_plus__plus_EgTQvxIo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_X0efmTfZ9cg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("X0efmTfZ9cg", sceIcuLegacyUnknown_X0efmTfZ9cg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_X2UKYjIeWY8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("X2UKYjIeWY8", sceIcuLegacyUnknown_X2UKYjIeWY8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_X2kEvJBix2Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("X2kEvJBix2Q", sceIcuLegacyUnknown_X2kEvJBix2Q_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_X2n_minus_Xq_plus_yisw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("X2n-Xq+yisw", sceIcuLegacyUnknown_X2n_minus_Xq_plus_yisw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_X4id7EaSkcw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("X4id7EaSkcw", sceIcuLegacyUnknown_X4id7EaSkcw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_X5aeECuY_plus_OA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("X5aeECuY+OA", sceIcuLegacyUnknown_X5aeECuY_plus_OA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_X69kV1omtSU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("X69kV1omtSU", sceIcuLegacyUnknown_X69kV1omtSU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_X88JXOmaenc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("X88JXOmaenc", sceIcuLegacyUnknown_X88JXOmaenc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_X8omkSsHJU4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("X8omkSsHJU4", sceIcuLegacyUnknown_X8omkSsHJU4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_X9MXfjKJS74_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("X9MXfjKJS74", sceIcuLegacyUnknown_X9MXfjKJS74_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_XAzUv4OW3ko_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XAzUv4OW3ko", sceIcuLegacyUnknown_XAzUv4OW3ko_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_XB4m_plus_USaFdg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XB4m+USaFdg", sceIcuLegacyUnknown_XB4m_plus_USaFdg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_XEd85nz_plus__minus_5g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XEd85nz+-5g", sceIcuLegacyUnknown_XEd85nz_plus__minus_5g_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_XJZ5dBSKGm0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XJZ5dBSKGm0", sceIcuLegacyUnknown_XJZ5dBSKGm0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_XKq967nGz3k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XKq967nGz3k", sceIcuLegacyUnknown_XKq967nGz3k_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_XNNb9U8P_plus_bM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XNNb9U8P+bM", sceIcuLegacyUnknown_XNNb9U8P_plus_bM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_XNUmN6q2chw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XNUmN6q2chw", sceIcuLegacyUnknown_XNUmN6q2chw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_XNthAT3b_plus_LI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XNthAT3b+LI", sceIcuLegacyUnknown_XNthAT3b_plus_LI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_XRDgIlxw2K0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XRDgIlxw2K0", sceIcuLegacyUnknown_XRDgIlxw2K0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_XUT0dUajUrA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XUT0dUajUrA", sceIcuLegacyUnknown_XUT0dUajUrA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_XVbyMlbIiZE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XVbyMlbIiZE", sceIcuLegacyUnknown_XVbyMlbIiZE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_XW3wEZX81lU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XW3wEZX81lU", sceIcuLegacyUnknown_XW3wEZX81lU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_XWCVSiFPVtI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XWCVSiFPVtI", sceIcuLegacyUnknown_XWCVSiFPVtI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_XWQ8IZE6tS4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XWQ8IZE6tS4", sceIcuLegacyUnknown_XWQ8IZE6tS4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_XaJawsCDMEY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XaJawsCDMEY", sceIcuLegacyUnknown_XaJawsCDMEY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Xaym0bZsDho_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Xaym0bZsDho", sceIcuLegacyUnknown_Xaym0bZsDho_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Xbff4k1ObhE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Xbff4k1ObhE", sceIcuLegacyUnknown_Xbff4k1ObhE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_XdMbt2HBVIw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XdMbt2HBVIw", sceIcuLegacyUnknown_XdMbt2HBVIw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_XfxCiapy168_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XfxCiapy168", sceIcuLegacyUnknown_XfxCiapy168_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_XgmSiFjC8K8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XgmSiFjC8K8", sceIcuLegacyUnknown_XgmSiFjC8K8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_XitLrAaVv_minus_o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XitLrAaVv-o", sceIcuLegacyUnknown_XitLrAaVv_minus_o_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Xjtk_minus_e0EJQU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Xjtk-e0EJQU", sceIcuLegacyUnknown_Xjtk_minus_e0EJQU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_XlTthkPHamM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XlTthkPHamM", sceIcuLegacyUnknown_XlTthkPHamM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_XnbrgRTCcoQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XnbrgRTCcoQ", sceIcuLegacyUnknown_XnbrgRTCcoQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_XoKXlFJdW1U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XoKXlFJdW1U", sceIcuLegacyUnknown_XoKXlFJdW1U_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Xoe2zSwHiZA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Xoe2zSwHiZA", sceIcuLegacyUnknown_Xoe2zSwHiZA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_XokVE7uDeBg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XokVE7uDeBg", sceIcuLegacyUnknown_XokVE7uDeBg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Xxi779NipFE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Xxi779NipFE", sceIcuLegacyUnknown_Xxi779NipFE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_XytZY8RtFrc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XytZY8RtFrc", sceIcuLegacyUnknown_XytZY8RtFrc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Y_minus_mzSGj_plus_uzU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Y-mzSGj+uzU", sceIcuLegacyUnknown_Y_minus_mzSGj_plus_uzU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Y0u2cCMBx0M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Y0u2cCMBx0M", sceIcuLegacyUnknown_Y0u2cCMBx0M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Y17Z6z1Tweg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Y17Z6z1Tweg", sceIcuLegacyUnknown_Y17Z6z1Tweg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Y3iG3lgYqic_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Y3iG3lgYqic", sceIcuLegacyUnknown_Y3iG3lgYqic_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Y8N0YYVVRlU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Y8N0YYVVRlU", sceIcuLegacyUnknown_Y8N0YYVVRlU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Y9jdWI3QUnU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Y9jdWI3QUnU", sceIcuLegacyUnknown_Y9jdWI3QUnU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_YCUKByLHrKc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YCUKByLHrKc", sceIcuLegacyUnknown_YCUKByLHrKc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_YFl7BiM3B6E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YFl7BiM3B6E", sceIcuLegacyUnknown_YFl7BiM3B6E_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_YG0WJRCFcq0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YG0WJRCFcq0", sceIcuLegacyUnknown_YG0WJRCFcq0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_YM0FQVcy2oA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YM0FQVcy2oA", sceIcuLegacyUnknown_YM0FQVcy2oA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_YMaT7OAHdMw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YMaT7OAHdMw", sceIcuLegacyUnknown_YMaT7OAHdMw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_YNG3_plus_dqpMVo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YNG3+dqpMVo", sceIcuLegacyUnknown_YNG3_plus_dqpMVo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_YQ73I81XKXI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YQ73I81XKXI", sceIcuLegacyUnknown_YQ73I81XKXI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_YQsMoGDsyS0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YQsMoGDsyS0", sceIcuLegacyUnknown_YQsMoGDsyS0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_YR5_plus_axTbrP4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YR5+axTbrP4", sceIcuLegacyUnknown_YR5_plus_axTbrP4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_YRj_plus_P_minus_F0q8E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YRj+P-F0q8E", sceIcuLegacyUnknown_YRj_plus_P_minus_F0q8E_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_YY9uDTY0pHk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YY9uDTY0pHk", sceIcuLegacyUnknown_YY9uDTY0pHk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_YYD9skAeWmY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YYD9skAeWmY", sceIcuLegacyUnknown_YYD9skAeWmY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_YcyQqYdAoBg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YcyQqYdAoBg", sceIcuLegacyUnknown_YcyQqYdAoBg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_YeP4G_minus_rHOIw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YeP4G-rHOIw", sceIcuLegacyUnknown_YeP4G_minus_rHOIw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_YizUB2G34EY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YizUB2G34EY", sceIcuLegacyUnknown_YizUB2G34EY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_YlG5XnE2pCA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YlG5XnE2pCA", sceIcuLegacyUnknown_YlG5XnE2pCA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_YpmSTp6TxcM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YpmSTp6TxcM", sceIcuLegacyUnknown_YpmSTp6TxcM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_YqtCaapjg_plus_M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YqtCaapjg+M", sceIcuLegacyUnknown_YqtCaapjg_plus_M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_YrvpvBQoyuA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YrvpvBQoyuA", sceIcuLegacyUnknown_YrvpvBQoyuA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Yt6LBZeuWh8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Yt6LBZeuWh8", sceIcuLegacyUnknown_Yt6LBZeuWh8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Yu1gqhL0PRo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Yu1gqhL0PRo", sceIcuLegacyUnknown_Yu1gqhL0PRo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_YuNy33C52Aw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YuNy33C52Aw", sceIcuLegacyUnknown_YuNy33C52Aw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_YwujtxLOtxE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YwujtxLOtxE", sceIcuLegacyUnknown_YwujtxLOtxE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_YydusuL8BgY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YydusuL8BgY", sceIcuLegacyUnknown_YydusuL8BgY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_YzkqcknjpkE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YzkqcknjpkE", sceIcuLegacyUnknown_YzkqcknjpkE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Z0fw6FavdpA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Z0fw6FavdpA", sceIcuLegacyUnknown_Z0fw6FavdpA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Z4b8UjtxAMY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Z4b8UjtxAMY", sceIcuLegacyUnknown_Z4b8UjtxAMY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Z55eL5uhu4w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Z55eL5uhu4w", sceIcuLegacyUnknown_Z55eL5uhu4w_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ZE0y3IY9xQM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZE0y3IY9xQM", sceIcuLegacyUnknown_ZE0y3IY9xQM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ZFs14dPrmzk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZFs14dPrmzk", sceIcuLegacyUnknown_ZFs14dPrmzk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ZKrYys5dF6s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZKrYys5dF6s", sceIcuLegacyUnknown_ZKrYys5dF6s_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ZKtM61uk9qQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZKtM61uk9qQ", sceIcuLegacyUnknown_ZKtM61uk9qQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ZNwpLXyw2u4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZNwpLXyw2u4", sceIcuLegacyUnknown_ZNwpLXyw2u4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ZQR5D3DAAb8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZQR5D3DAAb8", sceIcuLegacyUnknown_ZQR5D3DAAb8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ZQRpN8_minus_M6ug_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZQRpN8-M6ug", sceIcuLegacyUnknown_ZQRpN8_minus_M6ug_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ZVaJm64eIFA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZVaJm64eIFA", sceIcuLegacyUnknown_ZVaJm64eIFA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Zd0xrys03Z8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Zd0xrys03Z8", sceIcuLegacyUnknown_Zd0xrys03Z8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ZfaEltcBW3c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZfaEltcBW3c", sceIcuLegacyUnknown_ZfaEltcBW3c_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ZgHRMAe89vM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZgHRMAe89vM", sceIcuLegacyUnknown_ZgHRMAe89vM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Zh2uYzsRxA0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Zh2uYzsRxA0", sceIcuLegacyUnknown_Zh2uYzsRxA0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Zirdf28ZMIE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Zirdf28ZMIE", sceIcuLegacyUnknown_Zirdf28ZMIE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Zry1T3JFpeE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Zry1T3JFpeE", sceIcuLegacyUnknown_Zry1T3JFpeE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ZsTMAjX6Vk0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZsTMAjX6Vk0", sceIcuLegacyUnknown_ZsTMAjX6Vk0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ZuImcUh33D8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZuImcUh33D8", sceIcuLegacyUnknown_ZuImcUh33D8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_Zy_minus_SbocBd2Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Zy-SbocBd2Q", sceIcuLegacyUnknown_Zy_minus_SbocBd2Q_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ZyxrWdZ3weY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZyxrWdZ3weY", sceIcuLegacyUnknown_ZyxrWdZ3weY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ZzJE4xyTIxY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZzJE4xyTIxY", sceIcuLegacyUnknown_ZzJE4xyTIxY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_a_minus_SWNrzWGfA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("a-SWNrzWGfA", sceIcuLegacyUnknown_a_minus_SWNrzWGfA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_a0TQPwoTI2o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("a0TQPwoTI2o", sceIcuLegacyUnknown_a0TQPwoTI2o_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_a2_plus_soTqvx7M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("a2+soTqvx7M", sceIcuLegacyUnknown_a2_plus_soTqvx7M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_a2IIKj_minus_VkoU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("a2IIKj-VkoU", sceIcuLegacyUnknown_a2IIKj_minus_VkoU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_a2P_plus_Ye5pJC8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("a2P+Ye5pJC8", sceIcuLegacyUnknown_a2P_plus_Ye5pJC8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_a2WaDLoGXPA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("a2WaDLoGXPA", sceIcuLegacyUnknown_a2WaDLoGXPA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_a4cIsILLtFI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("a4cIsILLtFI", sceIcuLegacyUnknown_a4cIsILLtFI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_a5n7LJhXHaQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("a5n7LJhXHaQ", sceIcuLegacyUnknown_a5n7LJhXHaQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_a8Vjah709P8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("a8Vjah709P8", sceIcuLegacyUnknown_a8Vjah709P8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_aDYLD42_plus_EZ8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aDYLD42+EZ8", sceIcuLegacyUnknown_aDYLD42_plus_EZ8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_aE2su5DZ1Sc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aE2su5DZ1Sc", sceIcuLegacyUnknown_aE2su5DZ1Sc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_aIDxi4cYbeE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aIDxi4cYbeE", sceIcuLegacyUnknown_aIDxi4cYbeE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_aIzYHS_minus_alR0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aIzYHS-alR0", sceIcuLegacyUnknown_aIzYHS_minus_alR0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_aKdPQLVLP3M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aKdPQLVLP3M", sceIcuLegacyUnknown_aKdPQLVLP3M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_aLVOwBSrDbk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aLVOwBSrDbk", sceIcuLegacyUnknown_aLVOwBSrDbk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_aLhXGPn5dTg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aLhXGPn5dTg", sceIcuLegacyUnknown_aLhXGPn5dTg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_aO2iHLiw3_minus_U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aO2iHLiw3-U", sceIcuLegacyUnknown_aO2iHLiw3_minus_U_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_aOCdDIgiKPs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aOCdDIgiKPs", sceIcuLegacyUnknown_aOCdDIgiKPs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_aP62pPAacWw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aP62pPAacWw", sceIcuLegacyUnknown_aP62pPAacWw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_aRhwYh6tFWQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aRhwYh6tFWQ", sceIcuLegacyUnknown_aRhwYh6tFWQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_aRlIwBiVVwk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aRlIwBiVVwk", sceIcuLegacyUnknown_aRlIwBiVVwk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_aRnEag4dBFs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aRnEag4dBFs", sceIcuLegacyUnknown_aRnEag4dBFs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_aSMFZAc0k2o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aSMFZAc0k2o", sceIcuLegacyUnknown_aSMFZAc0k2o_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_aSmjsmBGPu8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aSmjsmBGPu8", sceIcuLegacyUnknown_aSmjsmBGPu8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_aVR80xoiZ1k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aVR80xoiZ1k", sceIcuLegacyUnknown_aVR80xoiZ1k_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_aWp9E_minus_j08iM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aWp9E-j08iM", sceIcuLegacyUnknown_aWp9E_minus_j08iM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_aaAt9fybyMg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aaAt9fybyMg", sceIcuLegacyUnknown_aaAt9fybyMg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_abaitqseDfI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("abaitqseDfI", sceIcuLegacyUnknown_abaitqseDfI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_aeneahlcB_minus_o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aeneahlcB-o", sceIcuLegacyUnknown_aeneahlcB_minus_o_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_afKRYaytCMU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("afKRYaytCMU", sceIcuLegacyUnknown_afKRYaytCMU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ah9tNb0Uv88_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ah9tNb0Uv88", sceIcuLegacyUnknown_ah9tNb0Uv88_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ahzU5TO8T1k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ahzU5TO8T1k", sceIcuLegacyUnknown_ahzU5TO8T1k_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_aiiMugfIM7o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aiiMugfIM7o", sceIcuLegacyUnknown_aiiMugfIM7o_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ala1MhLKocY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ala1MhLKocY", sceIcuLegacyUnknown_ala1MhLKocY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ao_minus_sgdu7Cdk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ao-sgdu7Cdk", sceIcuLegacyUnknown_ao_minus_sgdu7Cdk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_aoOntjhBL3c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aoOntjhBL3c", sceIcuLegacyUnknown_aoOntjhBL3c_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_asGB8UpyDfY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("asGB8UpyDfY", sceIcuLegacyUnknown_asGB8UpyDfY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ax38MSqRqDg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ax38MSqRqDg", sceIcuLegacyUnknown_ax38MSqRqDg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_axRdn_plus_LFHf8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("axRdn+LFHf8", sceIcuLegacyUnknown_axRdn_plus_LFHf8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ayIF66Igfsg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ayIF66Igfsg", sceIcuLegacyUnknown_ayIF66Igfsg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_azmprWFOXT4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("azmprWFOXT4", sceIcuLegacyUnknown_azmprWFOXT4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_b_minus_Ve4dnYu2Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("b-Ve4dnYu2Y", sceIcuLegacyUnknown_b_minus_Ve4dnYu2Y_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_b4V_minus_l7ujPog_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("b4V-l7ujPog", sceIcuLegacyUnknown_b4V_minus_l7ujPog_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_b72m71eLRDQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("b72m71eLRDQ", sceIcuLegacyUnknown_b72m71eLRDQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_b78ol2cn2aU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("b78ol2cn2aU", sceIcuLegacyUnknown_b78ol2cn2aU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_b7TND_minus_La7t4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("b7TND-La7t4", sceIcuLegacyUnknown_b7TND_minus_La7t4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_b9oxVnUlBi8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("b9oxVnUlBi8", sceIcuLegacyUnknown_b9oxVnUlBi8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_bBPMwG9d8ls_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bBPMwG9d8ls", sceIcuLegacyUnknown_bBPMwG9d8ls_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_bEjaWp5yK5E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bEjaWp5yK5E", sceIcuLegacyUnknown_bEjaWp5yK5E_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_bEpcHNHm9co_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bEpcHNHm9co", sceIcuLegacyUnknown_bEpcHNHm9co_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_bFT4F_plus_GBZ_plus_k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bFT4F+GBZ+k", sceIcuLegacyUnknown_bFT4F_plus_GBZ_plus_k_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_bG5UBpGzVFY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bG5UBpGzVFY", sceIcuLegacyUnknown_bG5UBpGzVFY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_bGaDEm9UZt4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bGaDEm9UZt4", sceIcuLegacyUnknown_bGaDEm9UZt4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_bGgs1bvchhg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bGgs1bvchhg", sceIcuLegacyUnknown_bGgs1bvchhg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_bHJ1vQlHwWg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bHJ1vQlHwWg", sceIcuLegacyUnknown_bHJ1vQlHwWg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_bITLP3pfST0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bITLP3pfST0", sceIcuLegacyUnknown_bITLP3pfST0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_bJZ4igT_plus_7x4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bJZ4igT+7x4", sceIcuLegacyUnknown_bJZ4igT_plus_7x4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_bLP9mqWhb1E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bLP9mqWhb1E", sceIcuLegacyUnknown_bLP9mqWhb1E_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_bNGOHm2VshA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bNGOHm2VshA", sceIcuLegacyUnknown_bNGOHm2VshA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_bNHXaC0ElMs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bNHXaC0ElMs", sceIcuLegacyUnknown_bNHXaC0ElMs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_bQB4lXqNvjw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bQB4lXqNvjw", sceIcuLegacyUnknown_bQB4lXqNvjw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_bSNRor7CGkA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bSNRor7CGkA", sceIcuLegacyUnknown_bSNRor7CGkA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_bSj0SuRJZtw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bSj0SuRJZtw", sceIcuLegacyUnknown_bSj0SuRJZtw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_bT_minus_h0Odk4PY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bT-h0Odk4PY", sceIcuLegacyUnknown_bT_minus_h0Odk4PY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_bTLjp_plus_K53h8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bTLjp+K53h8", sceIcuLegacyUnknown_bTLjp_plus_K53h8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_bTdg4NmZdDo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bTdg4NmZdDo", sceIcuLegacyUnknown_bTdg4NmZdDo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_bTeS2KsZ0S4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bTeS2KsZ0S4", sceIcuLegacyUnknown_bTeS2KsZ0S4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_bZ1DVZdIg90_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bZ1DVZdIg90", sceIcuLegacyUnknown_bZ1DVZdIg90_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_bb5xsagH_plus_cs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bb5xsagH+cs", sceIcuLegacyUnknown_bb5xsagH_plus_cs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_bd91DX27Zrs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bd91DX27Zrs", sceIcuLegacyUnknown_bd91DX27Zrs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_bdlhvSyoS3s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bdlhvSyoS3s", sceIcuLegacyUnknown_bdlhvSyoS3s_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_bgX_plus_dtmmGbI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bgX+dtmmGbI", sceIcuLegacyUnknown_bgX_plus_dtmmGbI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_bgwT_minus_Basnxo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bgwT-Basnxo", sceIcuLegacyUnknown_bgwT_minus_Basnxo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_bheB4CqZNN0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bheB4CqZNN0", sceIcuLegacyUnknown_bheB4CqZNN0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_blD_minus_5Y31_plus_do_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("blD-5Y31+do", sceIcuLegacyUnknown_blD_minus_5Y31_plus_do_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_blXNoNhmum8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("blXNoNhmum8", sceIcuLegacyUnknown_blXNoNhmum8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_bmBZz7onZz8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bmBZz7onZz8", sceIcuLegacyUnknown_bmBZz7onZz8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_bnyrG8copIU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bnyrG8copIU", sceIcuLegacyUnknown_bnyrG8copIU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_boiEI_minus_AWyAo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("boiEI-AWyAo", sceIcuLegacyUnknown_boiEI_minus_AWyAo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_bp3plbL4nrI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bp3plbL4nrI", sceIcuLegacyUnknown_bp3plbL4nrI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_bryysJ9IVo8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bryysJ9IVo8", sceIcuLegacyUnknown_bryysJ9IVo8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_bsnTl85m4pk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bsnTl85m4pk", sceIcuLegacyUnknown_bsnTl85m4pk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_btebm1_plus_QcnE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("btebm1+QcnE", sceIcuLegacyUnknown_btebm1_plus_QcnE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_bu5m9QDf_plus_qM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bu5m9QDf+qM", sceIcuLegacyUnknown_bu5m9QDf_plus_qM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_bwB4BWbM6QI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bwB4BWbM6QI", sceIcuLegacyUnknown_bwB4BWbM6QI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_bwporVBRX1U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bwporVBRX1U", sceIcuLegacyUnknown_bwporVBRX1U_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_bxF3cc023_minus_k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bxF3cc023-k", sceIcuLegacyUnknown_bxF3cc023_minus_k_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_bxwTIERiTMc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bxwTIERiTMc", sceIcuLegacyUnknown_bxwTIERiTMc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_c_minus_emNcf93X8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("c-emNcf93X8", sceIcuLegacyUnknown_c_minus_emNcf93X8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_c1q27JaWyHc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("c1q27JaWyHc", sceIcuLegacyUnknown_c1q27JaWyHc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_c48UYNX3GaE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("c48UYNX3GaE", sceIcuLegacyUnknown_c48UYNX3GaE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_c5WIVD3IdsA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("c5WIVD3IdsA", sceIcuLegacyUnknown_c5WIVD3IdsA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_c5zG4_plus_HsaZc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("c5zG4+HsaZc", sceIcuLegacyUnknown_c5zG4_plus_HsaZc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_cDpdouY0XmU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cDpdouY0XmU", sceIcuLegacyUnknown_cDpdouY0XmU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_cE1NVPNw8Yc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cE1NVPNw8Yc", sceIcuLegacyUnknown_cE1NVPNw8Yc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_cF8dbaDCzuc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cF8dbaDCzuc", sceIcuLegacyUnknown_cF8dbaDCzuc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_cJ08oWAxit4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cJ08oWAxit4", sceIcuLegacyUnknown_cJ08oWAxit4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_cJqg7OIDWFQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cJqg7OIDWFQ", sceIcuLegacyUnknown_cJqg7OIDWFQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_cKFf_plus_P20Ehc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cKFf+P20Ehc", sceIcuLegacyUnknown_cKFf_plus_P20Ehc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_cOMswmrp86c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cOMswmrp86c", sceIcuLegacyUnknown_cOMswmrp86c_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_cPDl8_plus_OiOV8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cPDl8+OiOV8", sceIcuLegacyUnknown_cPDl8_plus_OiOV8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_cQbsqtDXKxo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cQbsqtDXKxo", sceIcuLegacyUnknown_cQbsqtDXKxo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_cRYZglTPBuQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cRYZglTPBuQ", sceIcuLegacyUnknown_cRYZglTPBuQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_cTsY2tcouXI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cTsY2tcouXI", sceIcuLegacyUnknown_cTsY2tcouXI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ca9dKq_plus_5jOY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ca9dKq+5jOY", sceIcuLegacyUnknown_ca9dKq_plus_5jOY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_caPAueqbiUU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("caPAueqbiUU", sceIcuLegacyUnknown_caPAueqbiUU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_cbrzCyajhJY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cbrzCyajhJY", sceIcuLegacyUnknown_cbrzCyajhJY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ccNNnAY7T10_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ccNNnAY7T10", sceIcuLegacyUnknown_ccNNnAY7T10_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_cdcxwF_minus_YhLc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cdcxwF-YhLc", sceIcuLegacyUnknown_cdcxwF_minus_YhLc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_cfV9_plus_PXtZts_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cfV9+PXtZts", sceIcuLegacyUnknown_cfV9_plus_PXtZts_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_chI1vWFrmOY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("chI1vWFrmOY", sceIcuLegacyUnknown_chI1vWFrmOY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_chqnQlxMZuQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("chqnQlxMZuQ", sceIcuLegacyUnknown_chqnQlxMZuQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_cjGExj87wWA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cjGExj87wWA", sceIcuLegacyUnknown_cjGExj87wWA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_cjH_minus_GJG1iT0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cjH-GJG1iT0", sceIcuLegacyUnknown_cjH_minus_GJG1iT0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_cnOOldSo8jc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cnOOldSo8jc", sceIcuLegacyUnknown_cnOOldSo8jc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_cnV_minus_ki0yIhw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cnV-ki0yIhw", sceIcuLegacyUnknown_cnV_minus_ki0yIhw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_cqNT3RuXd1U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cqNT3RuXd1U", sceIcuLegacyUnknown_cqNT3RuXd1U_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_cs7AdQAdbbo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cs7AdQAdbbo", sceIcuLegacyUnknown_cs7AdQAdbbo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_cskh7pJGuAY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cskh7pJGuAY", sceIcuLegacyUnknown_cskh7pJGuAY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_csuCXX7m2UA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("csuCXX7m2UA", sceIcuLegacyUnknown_csuCXX7m2UA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_cv50Zotdx9A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cv50Zotdx9A", sceIcuLegacyUnknown_cv50Zotdx9A_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_cxQxjxsBjoU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cxQxjxsBjoU", sceIcuLegacyUnknown_cxQxjxsBjoU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_cxaH7f6tnX8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cxaH7f6tnX8", sceIcuLegacyUnknown_cxaH7f6tnX8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_d_minus_RWWf0qsHg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("d-RWWf0qsHg", sceIcuLegacyUnknown_d_minus_RWWf0qsHg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_d0Fl_plus_xrAAt8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("d0Fl+xrAAt8", sceIcuLegacyUnknown_d0Fl_plus_xrAAt8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_d0l4wj2U5Bo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("d0l4wj2U5Bo", sceIcuLegacyUnknown_d0l4wj2U5Bo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_d5kNg_plus_IqPvU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("d5kNg+IqPvU", sceIcuLegacyUnknown_d5kNg_plus_IqPvU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_dABU8HFW2zg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dABU8HFW2zg", sceIcuLegacyUnknown_dABU8HFW2zg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_dAva3cLYNKg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dAva3cLYNKg", sceIcuLegacyUnknown_dAva3cLYNKg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_dD9c_minus_tQ_minus_CV4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dD9c-tQ-CV4", sceIcuLegacyUnknown_dD9c_minus_tQ_minus_CV4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_dGiRVAks1Mk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dGiRVAks1Mk", sceIcuLegacyUnknown_dGiRVAks1Mk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_dHK_plus_gFv_plus_L_minus_o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dHK+gFv+L-o", sceIcuLegacyUnknown_dHK_plus_gFv_plus_L_minus_o_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_dHRY1GuSvGQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dHRY1GuSvGQ", sceIcuLegacyUnknown_dHRY1GuSvGQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_dHVF76BNnjc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dHVF76BNnjc", sceIcuLegacyUnknown_dHVF76BNnjc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_dHdyG1xiejY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dHdyG1xiejY", sceIcuLegacyUnknown_dHdyG1xiejY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_dKU6o9uunCI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dKU6o9uunCI", sceIcuLegacyUnknown_dKU6o9uunCI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_dMTiEV_minus_dZEg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dMTiEV-dZEg", sceIcuLegacyUnknown_dMTiEV_minus_dZEg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_dNIT3K4F_plus_dM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dNIT3K4F+dM", sceIcuLegacyUnknown_dNIT3K4F_plus_dM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_dO9RGCbBqLE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dO9RGCbBqLE", sceIcuLegacyUnknown_dO9RGCbBqLE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_dOyJ_minus_4H4j3o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dOyJ-4H4j3o", sceIcuLegacyUnknown_dOyJ_minus_4H4j3o_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_dRjnhSb9dA4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dRjnhSb9dA4", sceIcuLegacyUnknown_dRjnhSb9dA4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_dV320xnOoq8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dV320xnOoq8", sceIcuLegacyUnknown_dV320xnOoq8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_dYJ6qjv6TLQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dYJ6qjv6TLQ", sceIcuLegacyUnknown_dYJ6qjv6TLQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_dYlN29Ar7HM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dYlN29Ar7HM", sceIcuLegacyUnknown_dYlN29Ar7HM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_db9ThmIRE9s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("db9ThmIRE9s", sceIcuLegacyUnknown_db9ThmIRE9s_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_dd_minus_z7KFYJKE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dd-z7KFYJKE", sceIcuLegacyUnknown_dd_minus_z7KFYJKE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_deOMFiK_plus_18M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("deOMFiK+18M", sceIcuLegacyUnknown_deOMFiK_plus_18M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_deufikfeZZI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("deufikfeZZI", sceIcuLegacyUnknown_deufikfeZZI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_df_minus_uTT8UBPk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("df-uTT8UBPk", sceIcuLegacyUnknown_df_minus_uTT8UBPk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_dgrHsJ_plus_qZ_minus_o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dgrHsJ+qZ-o", sceIcuLegacyUnknown_dgrHsJ_plus_qZ_minus_o_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_dhGA36ttUs8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dhGA36ttUs8", sceIcuLegacyUnknown_dhGA36ttUs8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_dhTcFm_plus_8xcY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dhTcFm+8xcY", sceIcuLegacyUnknown_dhTcFm_plus_8xcY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_dhV9JuMDrIo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dhV9JuMDrIo", sceIcuLegacyUnknown_dhV9JuMDrIo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_djFvfanJqZ4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("djFvfanJqZ4", sceIcuLegacyUnknown_djFvfanJqZ4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_djLcL2KXcwI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("djLcL2KXcwI", sceIcuLegacyUnknown_djLcL2KXcwI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_dkarpOw4XO8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dkarpOw4XO8", sceIcuLegacyUnknown_dkarpOw4XO8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_dl0_minus_ob1P54Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dl0-ob1P54Y", sceIcuLegacyUnknown_dl0_minus_ob1P54Y_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_dlXA3xbd07g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dlXA3xbd07g", sceIcuLegacyUnknown_dlXA3xbd07g_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_dpFZ36JNBOA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dpFZ36JNBOA", sceIcuLegacyUnknown_dpFZ36JNBOA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_dyQ7s0Qqbzo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dyQ7s0Qqbzo", sceIcuLegacyUnknown_dyQ7s0Qqbzo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_dzuyxeM1aXU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dzuyxeM1aXU", sceIcuLegacyUnknown_dzuyxeM1aXU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_e_plus_qG2KMES_plus_Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("e+qG2KMES+Q", sceIcuLegacyUnknown_e_plus_qG2KMES_plus_Q_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_e1DWbu2sECI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("e1DWbu2sECI", sceIcuLegacyUnknown_e1DWbu2sECI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_e6V0Xi1IhzY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("e6V0Xi1IhzY", sceIcuLegacyUnknown_e6V0Xi1IhzY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_e7ZvEjJf4To_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("e7ZvEjJf4To", sceIcuLegacyUnknown_e7ZvEjJf4To_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_e7dHslq11OU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("e7dHslq11OU", sceIcuLegacyUnknown_e7dHslq11OU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_e8F3QHU22NA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("e8F3QHU22NA", sceIcuLegacyUnknown_e8F3QHU22NA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_eBKZy9FqyRU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eBKZy9FqyRU", sceIcuLegacyUnknown_eBKZy9FqyRU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_eDl56Xv_plus_HNU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eDl56Xv+HNU", sceIcuLegacyUnknown_eDl56Xv_plus_HNU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_eEH9h2oW1B4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eEH9h2oW1B4", sceIcuLegacyUnknown_eEH9h2oW1B4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_eEOAYyLG2lw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eEOAYyLG2lw", sceIcuLegacyUnknown_eEOAYyLG2lw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_eF1I_minus_yN1kwE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eF1I-yN1kwE", sceIcuLegacyUnknown_eF1I_minus_yN1kwE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_eG3TTN63xt8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eG3TTN63xt8", sceIcuLegacyUnknown_eG3TTN63xt8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_eIrauglGVzI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eIrauglGVzI", sceIcuLegacyUnknown_eIrauglGVzI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_eJaGgiq9wcw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eJaGgiq9wcw", sceIcuLegacyUnknown_eJaGgiq9wcw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_eKZgI0VaPAs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eKZgI0VaPAs", sceIcuLegacyUnknown_eKZgI0VaPAs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_eO9itAaSY5A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eO9itAaSY5A", sceIcuLegacyUnknown_eO9itAaSY5A_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_eVEtag9hF48_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eVEtag9hF48", sceIcuLegacyUnknown_eVEtag9hF48_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_eWyBuXbJCyU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eWyBuXbJCyU", sceIcuLegacyUnknown_eWyBuXbJCyU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_eYPwjfWGIH8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eYPwjfWGIH8", sceIcuLegacyUnknown_eYPwjfWGIH8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_eafBBm3dS7M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eafBBm3dS7M", sceIcuLegacyUnknown_eafBBm3dS7M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ebB3W5M3_minus_dY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ebB3W5M3-dY", sceIcuLegacyUnknown_ebB3W5M3_minus_dY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ebnGhv0EPr8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ebnGhv0EPr8", sceIcuLegacyUnknown_ebnGhv0EPr8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ee3xFIkKhd4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ee3xFIkKhd4", sceIcuLegacyUnknown_ee3xFIkKhd4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_eg2Yj1vjbGs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eg2Yj1vjbGs", sceIcuLegacyUnknown_eg2Yj1vjbGs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_egD_plus_Tl5PiJw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("egD+Tl5PiJw", sceIcuLegacyUnknown_egD_plus_Tl5PiJw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_eiAWR56A7xE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eiAWR56A7xE", sceIcuLegacyUnknown_eiAWR56A7xE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ekxSiEZEdEs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ekxSiEZEdEs", sceIcuLegacyUnknown_ekxSiEZEdEs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_epF2BhUe6q0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("epF2BhUe6q0", sceIcuLegacyUnknown_epF2BhUe6q0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_erlMgXoUaV8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("erlMgXoUaV8", sceIcuLegacyUnknown_erlMgXoUaV8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_et_plus_mwnPvIuo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("et+mwnPvIuo", sceIcuLegacyUnknown_et_plus_mwnPvIuo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_eudabMqhPko_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eudabMqhPko", sceIcuLegacyUnknown_eudabMqhPko_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_eumcD3nV3wE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eumcD3nV3wE", sceIcuLegacyUnknown_eumcD3nV3wE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_eweskBljBqI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eweskBljBqI", sceIcuLegacyUnknown_eweskBljBqI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ezuSd2pLtno_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ezuSd2pLtno", sceIcuLegacyUnknown_ezuSd2pLtno_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_f_plus_brnzWU5Ts_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("f+brnzWU5Ts", sceIcuLegacyUnknown_f_plus_brnzWU5Ts_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_f08p1khxIYk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("f08p1khxIYk", sceIcuLegacyUnknown_f08p1khxIYk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_f3JhVGEqIg4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("f3JhVGEqIg4", sceIcuLegacyUnknown_f3JhVGEqIg4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_f41fHpibqds_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("f41fHpibqds", sceIcuLegacyUnknown_f41fHpibqds_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_f6yschfjRqE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("f6yschfjRqE", sceIcuLegacyUnknown_f6yschfjRqE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_fAQp0F1MR98_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fAQp0F1MR98", sceIcuLegacyUnknown_fAQp0F1MR98_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_fBwrH3d3J5k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fBwrH3d3J5k", sceIcuLegacyUnknown_fBwrH3d3J5k_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_fEZxDVV5vS4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fEZxDVV5vS4", sceIcuLegacyUnknown_fEZxDVV5vS4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_fFxh0nar_plus_J8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fFxh0nar+J8", sceIcuLegacyUnknown_fFxh0nar_plus_J8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_fOz2ZWP1Smo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fOz2ZWP1Smo", sceIcuLegacyUnknown_fOz2ZWP1Smo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_fQEDZBZRWNw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fQEDZBZRWNw", sceIcuLegacyUnknown_fQEDZBZRWNw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_fUCKlUJcWiU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fUCKlUJcWiU", sceIcuLegacyUnknown_fUCKlUJcWiU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_fUfa06jVR_plus_c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fUfa06jVR+c", sceIcuLegacyUnknown_fUfa06jVR_plus_c_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_fUvoA5dXReA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fUvoA5dXReA", sceIcuLegacyUnknown_fUvoA5dXReA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_fXv8ZRN_minus_jVU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fXv8ZRN-jVU", sceIcuLegacyUnknown_fXv8ZRN_minus_jVU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_fZYGRTeIOq8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fZYGRTeIOq8", sceIcuLegacyUnknown_fZYGRTeIOq8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_fdsGd_plus_CTb4Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fdsGd+CTb4Y", sceIcuLegacyUnknown_fdsGd_plus_CTb4Y_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_febGb1n9rpM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("febGb1n9rpM", sceIcuLegacyUnknown_febGb1n9rpM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_fj0k1BArqS4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fj0k1BArqS4", sceIcuLegacyUnknown_fj0k1BArqS4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_fjesszT0Yjk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fjesszT0Yjk", sceIcuLegacyUnknown_fjesszT0Yjk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_fkb3icYHYEs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fkb3icYHYEs", sceIcuLegacyUnknown_fkb3icYHYEs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_flEDaMoLILU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("flEDaMoLILU", sceIcuLegacyUnknown_flEDaMoLILU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_fon4j6s4k2Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fon4j6s4k2Q", sceIcuLegacyUnknown_fon4j6s4k2Q_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_fpPV6eFUp_plus_A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fpPV6eFUp+A", sceIcuLegacyUnknown_fpPV6eFUp_plus_A_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_fpukSRJrA2g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fpukSRJrA2g", sceIcuLegacyUnknown_fpukSRJrA2g_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_frnJSnjKjuM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("frnJSnjKjuM", sceIcuLegacyUnknown_frnJSnjKjuM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_fsZaxc2Qa4A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fsZaxc2Qa4A", sceIcuLegacyUnknown_fsZaxc2Qa4A_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_fuRriVBnN78_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fuRriVBnN78", sceIcuLegacyUnknown_fuRriVBnN78_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_fvV_plus_bVSpuKU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fvV+bVSpuKU", sceIcuLegacyUnknown_fvV_plus_bVSpuKU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_fwUP5MVHX1c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fwUP5MVHX1c", sceIcuLegacyUnknown_fwUP5MVHX1c_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_fwimOLDS3ds_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fwimOLDS3ds", sceIcuLegacyUnknown_fwimOLDS3ds_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_g_minus_UdXW05cR0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("g-UdXW05cR0", sceIcuLegacyUnknown_g_minus_UdXW05cR0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_g23aN2_plus_MuMo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("g23aN2+MuMo", sceIcuLegacyUnknown_g23aN2_plus_MuMo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_g2lrOsIBGok_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("g2lrOsIBGok", sceIcuLegacyUnknown_g2lrOsIBGok_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_g5ZMpQQYqaI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("g5ZMpQQYqaI", sceIcuLegacyUnknown_g5ZMpQQYqaI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_g82SgX6IGis_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("g82SgX6IGis", sceIcuLegacyUnknown_g82SgX6IGis_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_g8EMnyKOv_minus_8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("g8EMnyKOv-8", sceIcuLegacyUnknown_g8EMnyKOv_minus_8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_g8grZDCw5vI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("g8grZDCw5vI", sceIcuLegacyUnknown_g8grZDCw5vI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_g8qJVGLGg6c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("g8qJVGLGg6c", sceIcuLegacyUnknown_g8qJVGLGg6c_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_g8rg2BKjQ78_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("g8rg2BKjQ78", sceIcuLegacyUnknown_g8rg2BKjQ78_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_g9PTo9Ucd_minus_0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("g9PTo9Ucd-0", sceIcuLegacyUnknown_g9PTo9Ucd_minus_0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_gBI6BwLWfIw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gBI6BwLWfIw", sceIcuLegacyUnknown_gBI6BwLWfIw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_gDo9Uhm1M3Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gDo9Uhm1M3Q", sceIcuLegacyUnknown_gDo9Uhm1M3Q_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_gEoNhrgO53Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gEoNhrgO53Q", sceIcuLegacyUnknown_gEoNhrgO53Q_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_gGpuGGWevhE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gGpuGGWevhE", sceIcuLegacyUnknown_gGpuGGWevhE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_gIBOGIUVhFo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gIBOGIUVhFo", sceIcuLegacyUnknown_gIBOGIUVhFo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_gJUxthIhq_plus_g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gJUxthIhq+g", sceIcuLegacyUnknown_gJUxthIhq_plus_g_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_gKQ30jyBR6s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gKQ30jyBR6s", sceIcuLegacyUnknown_gKQ30jyBR6s_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_gKQ3LS4Lkr4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gKQ3LS4Lkr4", sceIcuLegacyUnknown_gKQ3LS4Lkr4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_gKn2ySmvwDo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gKn2ySmvwDo", sceIcuLegacyUnknown_gKn2ySmvwDo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_gKrz25sSuAI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gKrz25sSuAI", sceIcuLegacyUnknown_gKrz25sSuAI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_gKwcTFGDWFI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gKwcTFGDWFI", sceIcuLegacyUnknown_gKwcTFGDWFI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_gM9EaKjzBuI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gM9EaKjzBuI", sceIcuLegacyUnknown_gM9EaKjzBuI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_gOifsQw_minus_LbY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gOifsQw-LbY", sceIcuLegacyUnknown_gOifsQw_minus_LbY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_gOuknA5kKe4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gOuknA5kKe4", sceIcuLegacyUnknown_gOuknA5kKe4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_gTALRDDOz3k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gTALRDDOz3k", sceIcuLegacyUnknown_gTALRDDOz3k_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_gYA6AsxIjy0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gYA6AsxIjy0", sceIcuLegacyUnknown_gYA6AsxIjy0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_gcIHpoxF9Bw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gcIHpoxF9Bw", sceIcuLegacyUnknown_gcIHpoxF9Bw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_gdl5AVmSFKQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gdl5AVmSFKQ", sceIcuLegacyUnknown_gdl5AVmSFKQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_gfuLEzW2CW8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gfuLEzW2CW8", sceIcuLegacyUnknown_gfuLEzW2CW8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ggHIiAVjxKA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ggHIiAVjxKA", sceIcuLegacyUnknown_ggHIiAVjxKA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ggouHOAxmCw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ggouHOAxmCw", sceIcuLegacyUnknown_ggouHOAxmCw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ggy8qptp56A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ggy8qptp56A", sceIcuLegacyUnknown_ggy8qptp56A_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_gjZlhVBy6mg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gjZlhVBy6mg", sceIcuLegacyUnknown_gjZlhVBy6mg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_gkBA7AZJ7wU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gkBA7AZJ7wU", sceIcuLegacyUnknown_gkBA7AZJ7wU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_gkPwMwcg6MM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gkPwMwcg6MM", sceIcuLegacyUnknown_gkPwMwcg6MM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_gp70KgAS4PI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gp70KgAS4PI", sceIcuLegacyUnknown_gp70KgAS4PI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_gpITgzdL428_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gpITgzdL428", sceIcuLegacyUnknown_gpITgzdL428_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_gqDyuDxmt_plus_c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gqDyuDxmt+c", sceIcuLegacyUnknown_gqDyuDxmt_plus_c_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_gqYjlq8Fm2w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gqYjlq8Fm2w", sceIcuLegacyUnknown_gqYjlq8Fm2w_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_grS2MjDLJec_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("grS2MjDLJec", sceIcuLegacyUnknown_grS2MjDLJec_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_h_plus_A_plus_2v3Y8W8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("h+A+2v3Y8W8", sceIcuLegacyUnknown_h_plus_A_plus_2v3Y8W8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_h0NmVu5FDYU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("h0NmVu5FDYU", sceIcuLegacyUnknown_h0NmVu5FDYU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_h1PNh26pQx4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("h1PNh26pQx4", sceIcuLegacyUnknown_h1PNh26pQx4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_h3c0znldOaU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("h3c0znldOaU", sceIcuLegacyUnknown_h3c0znldOaU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_h3pElir_minus_I8Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("h3pElir-I8Q", sceIcuLegacyUnknown_h3pElir_minus_I8Q_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_h6HHFebCPUY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("h6HHFebCPUY", sceIcuLegacyUnknown_h6HHFebCPUY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_h6L3lSaKl0k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("h6L3lSaKl0k", sceIcuLegacyUnknown_h6L3lSaKl0k_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_h7TjPntTtHM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("h7TjPntTtHM", sceIcuLegacyUnknown_h7TjPntTtHM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_h84MIvQPyVA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("h84MIvQPyVA", sceIcuLegacyUnknown_h84MIvQPyVA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_h8mwPFwhEPQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("h8mwPFwhEPQ", sceIcuLegacyUnknown_h8mwPFwhEPQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_hBLDFB97R44_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hBLDFB97R44", sceIcuLegacyUnknown_hBLDFB97R44_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_hCIfuiMEEjM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hCIfuiMEEjM", sceIcuLegacyUnknown_hCIfuiMEEjM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_hCfexn532_minus_w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hCfexn532-w", sceIcuLegacyUnknown_hCfexn532_minus_w_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_hEKaMzB3bH0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hEKaMzB3bH0", sceIcuLegacyUnknown_hEKaMzB3bH0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_hEaDe9k2nOw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hEaDe9k2nOw", sceIcuLegacyUnknown_hEaDe9k2nOw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_hFktHM4E9TQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hFktHM4E9TQ", sceIcuLegacyUnknown_hFktHM4E9TQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_hIZIpFAWUqI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hIZIpFAWUqI", sceIcuLegacyUnknown_hIZIpFAWUqI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_hL95IlKRacI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hL95IlKRacI", sceIcuLegacyUnknown_hL95IlKRacI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_hLUMudTnRos_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hLUMudTnRos", sceIcuLegacyUnknown_hLUMudTnRos_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_hNM0CNS6Gx4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hNM0CNS6Gx4", sceIcuLegacyUnknown_hNM0CNS6Gx4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_hNs5kncUYes_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hNs5kncUYes", sceIcuLegacyUnknown_hNs5kncUYes_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_hOHMhd3XrQk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hOHMhd3XrQk", sceIcuLegacyUnknown_hOHMhd3XrQk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_hR8oaZqI_minus_c4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hR8oaZqI-c4", sceIcuLegacyUnknown_hR8oaZqI_minus_c4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_hRZnZoEXbfQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hRZnZoEXbfQ", sceIcuLegacyUnknown_hRZnZoEXbfQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_hRtNhDTYVnY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hRtNhDTYVnY", sceIcuLegacyUnknown_hRtNhDTYVnY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_hSOO2FvvGBI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hSOO2FvvGBI", sceIcuLegacyUnknown_hSOO2FvvGBI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_hWOaeNUMlIY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hWOaeNUMlIY", sceIcuLegacyUnknown_hWOaeNUMlIY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_hXsRW1De54I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hXsRW1De54I", sceIcuLegacyUnknown_hXsRW1De54I_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_hYjOjm9IL7w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hYjOjm9IL7w", sceIcuLegacyUnknown_hYjOjm9IL7w_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_hbvj2ggxKno_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hbvj2ggxKno", sceIcuLegacyUnknown_hbvj2ggxKno_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_hdPD79wSwMk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hdPD79wSwMk", sceIcuLegacyUnknown_hdPD79wSwMk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_heNXaxM8MW0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("heNXaxM8MW0", sceIcuLegacyUnknown_heNXaxM8MW0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_hh5ROMS_minus_IAY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hh5ROMS-IAY", sceIcuLegacyUnknown_hh5ROMS_minus_IAY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_hhD_plus_W6r61Jg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hhD+W6r61Jg", sceIcuLegacyUnknown_hhD_plus_W6r61Jg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_hi0BiPpGPV8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hi0BiPpGPV8", sceIcuLegacyUnknown_hi0BiPpGPV8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_hj0KdH_minus_lwnk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hj0KdH-lwnk", sceIcuLegacyUnknown_hj0KdH_minus_lwnk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_hjI7dTR770E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hjI7dTR770E", sceIcuLegacyUnknown_hjI7dTR770E_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_hjxyOIoyZ0Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hjxyOIoyZ0Q", sceIcuLegacyUnknown_hjxyOIoyZ0Q_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_hkEX31uteAc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hkEX31uteAc", sceIcuLegacyUnknown_hkEX31uteAc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_hkPuxPeBvRM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hkPuxPeBvRM", sceIcuLegacyUnknown_hkPuxPeBvRM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_hktFnJyNfC4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hktFnJyNfC4", sceIcuLegacyUnknown_hktFnJyNfC4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_hp_plus_jjxkskGk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hp+jjxkskGk", sceIcuLegacyUnknown_hp_plus_jjxkskGk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_hpXk9zZgRLw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hpXk9zZgRLw", sceIcuLegacyUnknown_hpXk9zZgRLw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_hpeVcUchyIY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hpeVcUchyIY", sceIcuLegacyUnknown_hpeVcUchyIY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_hr8JUdVjP8w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hr8JUdVjP8w", sceIcuLegacyUnknown_hr8JUdVjP8w_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_hu81PU2O_minus_6Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hu81PU2O-6Q", sceIcuLegacyUnknown_hu81PU2O_minus_6Q_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_hvfhKH5KSuk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hvfhKH5KSuk", sceIcuLegacyUnknown_hvfhKH5KSuk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_hyjXKNKT_minus_wo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hyjXKNKT-wo", sceIcuLegacyUnknown_hyjXKNKT_minus_wo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_i_minus_aQy6616sI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("i-aQy6616sI", sceIcuLegacyUnknown_i_minus_aQy6616sI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_i37aj1V1lCo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("i37aj1V1lCo", sceIcuLegacyUnknown_i37aj1V1lCo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_i7W518yhwSw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("i7W518yhwSw", sceIcuLegacyUnknown_i7W518yhwSw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_i8djQf_plus_FnoY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("i8djQf+FnoY", sceIcuLegacyUnknown_i8djQf_plus_FnoY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_iB7XmXBdD9A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iB7XmXBdD9A", sceIcuLegacyUnknown_iB7XmXBdD9A_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_iCqbQACa19M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iCqbQACa19M", sceIcuLegacyUnknown_iCqbQACa19M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_iEfX3KVKXaM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iEfX3KVKXaM", sceIcuLegacyUnknown_iEfX3KVKXaM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_iEl3SecIbP8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iEl3SecIbP8", sceIcuLegacyUnknown_iEl3SecIbP8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_iFQi1PTTbIo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iFQi1PTTbIo", sceIcuLegacyUnknown_iFQi1PTTbIo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_iMQarT42Hpk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iMQarT42Hpk", sceIcuLegacyUnknown_iMQarT42Hpk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_iNKr64UBY_minus_Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iNKr64UBY-Q", sceIcuLegacyUnknown_iNKr64UBY_minus_Q_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_iO1ZBSuY0fA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iO1ZBSuY0fA", sceIcuLegacyUnknown_iO1ZBSuY0fA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_iOCsVJ0obo0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iOCsVJ0obo0", sceIcuLegacyUnknown_iOCsVJ0obo0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_iR2KIoNc1qA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iR2KIoNc1qA", sceIcuLegacyUnknown_iR2KIoNc1qA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_iR39TKpBQ5c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iR39TKpBQ5c", sceIcuLegacyUnknown_iR39TKpBQ5c_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_iRoy3qT_plus_RDw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iRoy3qT+RDw", sceIcuLegacyUnknown_iRoy3qT_plus_RDw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_iSeQ7pcCuiE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iSeQ7pcCuiE", sceIcuLegacyUnknown_iSeQ7pcCuiE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_iT3Y7ZpmbJw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iT3Y7ZpmbJw", sceIcuLegacyUnknown_iT3Y7ZpmbJw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_iaaW42hSxDs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iaaW42hSxDs", sceIcuLegacyUnknown_iaaW42hSxDs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ibwu_minus_672lHg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ibwu-672lHg", sceIcuLegacyUnknown_ibwu_minus_672lHg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ie_plus_Gc0W2tOo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ie+Gc0W2tOo", sceIcuLegacyUnknown_ie_plus_Gc0W2tOo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ieHw9JRbKV0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ieHw9JRbKV0", sceIcuLegacyUnknown_ieHw9JRbKV0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ike9qpEXoa0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ike9qpEXoa0", sceIcuLegacyUnknown_ike9qpEXoa0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_iobMkN9OlDg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iobMkN9OlDg", sceIcuLegacyUnknown_iobMkN9OlDg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_irJxwJwbxlU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("irJxwJwbxlU", sceIcuLegacyUnknown_irJxwJwbxlU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_itL2333RCtE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("itL2333RCtE", sceIcuLegacyUnknown_itL2333RCtE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_itNY5wJas4U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("itNY5wJas4U", sceIcuLegacyUnknown_itNY5wJas4U_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_iuIkd2DW9uc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iuIkd2DW9uc", sceIcuLegacyUnknown_iuIkd2DW9uc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ivTLfuf0zhA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ivTLfuf0zhA", sceIcuLegacyUnknown_ivTLfuf0zhA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ivuKrYwVA90_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ivuKrYwVA90", sceIcuLegacyUnknown_ivuKrYwVA90_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_iwVaI2sN_minus_v4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iwVaI2sN-v4", sceIcuLegacyUnknown_iwVaI2sN_minus_v4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_iyqq4SUxrZs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iyqq4SUxrZs", sceIcuLegacyUnknown_iyqq4SUxrZs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_iyv2v10Y3ho_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iyv2v10Y3ho", sceIcuLegacyUnknown_iyv2v10Y3ho_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_iz4u5YcAPsE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iz4u5YcAPsE", sceIcuLegacyUnknown_iz4u5YcAPsE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_j56nb81_plus_MDA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("j56nb81+MDA", sceIcuLegacyUnknown_j56nb81_plus_MDA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_j58L24x6xzI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("j58L24x6xzI", sceIcuLegacyUnknown_j58L24x6xzI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_j5KwqH5Oo60_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("j5KwqH5Oo60", sceIcuLegacyUnknown_j5KwqH5Oo60_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_j5dotld_minus_5B0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("j5dotld-5B0", sceIcuLegacyUnknown_j5dotld_minus_5B0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_j5kAfvfOR9I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("j5kAfvfOR9I", sceIcuLegacyUnknown_j5kAfvfOR9I_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_j68ap0trCg4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("j68ap0trCg4", sceIcuLegacyUnknown_j68ap0trCg4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_j6ddtaFmntI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("j6ddtaFmntI", sceIcuLegacyUnknown_j6ddtaFmntI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_j6k_minus_zPwiYbc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("j6k-zPwiYbc", sceIcuLegacyUnknown_j6k_minus_zPwiYbc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_j6zuRCqOTlw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("j6zuRCqOTlw", sceIcuLegacyUnknown_j6zuRCqOTlw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_jCEAhlQoJXY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jCEAhlQoJXY", sceIcuLegacyUnknown_jCEAhlQoJXY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_jCYFjXTF1kQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jCYFjXTF1kQ", sceIcuLegacyUnknown_jCYFjXTF1kQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_jERsFgmcFp8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jERsFgmcFp8", sceIcuLegacyUnknown_jERsFgmcFp8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_jF_minus_Amq3OxZE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jF-Amq3OxZE", sceIcuLegacyUnknown_jF_minus_Amq3OxZE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_jFlDIIIhQM0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jFlDIIIhQM0", sceIcuLegacyUnknown_jFlDIIIhQM0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_jH6SqS1rHJI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jH6SqS1rHJI", sceIcuLegacyUnknown_jH6SqS1rHJI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_jMHXk7GsPMc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jMHXk7GsPMc", sceIcuLegacyUnknown_jMHXk7GsPMc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_jMuZIs_plus_Zpxc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jMuZIs+Zpxc", sceIcuLegacyUnknown_jMuZIs_plus_Zpxc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_jPIjK59Zpy8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jPIjK59Zpy8", sceIcuLegacyUnknown_jPIjK59Zpy8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_jUpGFXt4Hes_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jUpGFXt4Hes", sceIcuLegacyUnknown_jUpGFXt4Hes_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_jVk_plus__plus_Hzhvi0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jVk++Hzhvi0", sceIcuLegacyUnknown_jVk_plus__plus_Hzhvi0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_jWRVaFD48fY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jWRVaFD48fY", sceIcuLegacyUnknown_jWRVaFD48fY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_jYtWQ53c7HE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jYtWQ53c7HE", sceIcuLegacyUnknown_jYtWQ53c7HE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_jZCJMynlpc0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jZCJMynlpc0", sceIcuLegacyUnknown_jZCJMynlpc0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_jZLb5yzkYuM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jZLb5yzkYuM", sceIcuLegacyUnknown_jZLb5yzkYuM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_jZO4ymTXMUo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jZO4ymTXMUo", sceIcuLegacyUnknown_jZO4ymTXMUo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_jaNWyA8gAxo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jaNWyA8gAxo", sceIcuLegacyUnknown_jaNWyA8gAxo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_jfJyTS2RaFI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jfJyTS2RaFI", sceIcuLegacyUnknown_jfJyTS2RaFI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_jh8qzcMfnoY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jh8qzcMfnoY", sceIcuLegacyUnknown_jh8qzcMfnoY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_jikMbJeQzdc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jikMbJeQzdc", sceIcuLegacyUnknown_jikMbJeQzdc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_jkaOcDzcE3A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jkaOcDzcE3A", sceIcuLegacyUnknown_jkaOcDzcE3A_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_jm5QiR8ubbk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jm5QiR8ubbk", sceIcuLegacyUnknown_jm5QiR8ubbk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_jpAJorTmZgo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jpAJorTmZgo", sceIcuLegacyUnknown_jpAJorTmZgo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_juEKqgb7AKY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("juEKqgb7AKY", sceIcuLegacyUnknown_juEKqgb7AKY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_jx_plus_I_plus_WDoPk8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jx+I+WDoPk8", sceIcuLegacyUnknown_jx_plus_I_plus_WDoPk8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_k1_minus_oLLAann4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("k1-oLLAann4", sceIcuLegacyUnknown_k1_minus_oLLAann4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_k6gj4XMrGYI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("k6gj4XMrGYI", sceIcuLegacyUnknown_k6gj4XMrGYI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_k8GAaeGoJNo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("k8GAaeGoJNo", sceIcuLegacyUnknown_k8GAaeGoJNo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_k8hl9_minus_oAvoI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("k8hl9-oAvoI", sceIcuLegacyUnknown_k8hl9_minus_oAvoI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_kATBXStia9Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kATBXStia9Y", sceIcuLegacyUnknown_kATBXStia9Y_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_kBKrRyH1tJc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kBKrRyH1tJc", sceIcuLegacyUnknown_kBKrRyH1tJc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_kE3kTohd9Ho_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kE3kTohd9Ho", sceIcuLegacyUnknown_kE3kTohd9Ho_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_kGRCYA8TWwc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kGRCYA8TWwc", sceIcuLegacyUnknown_kGRCYA8TWwc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_kKBJsYzah34_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kKBJsYzah34", sceIcuLegacyUnknown_kKBJsYzah34_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_kKfJucM9C9I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kKfJucM9C9I", sceIcuLegacyUnknown_kKfJucM9C9I_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_kPf7YKjM5to_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kPf7YKjM5to", sceIcuLegacyUnknown_kPf7YKjM5to_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_kPoy66Qyehc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kPoy66Qyehc", sceIcuLegacyUnknown_kPoy66Qyehc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_kR_plus_PjVB2NDo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kR+PjVB2NDo", sceIcuLegacyUnknown_kR_plus_PjVB2NDo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_kUpCrFeJ_plus_Qc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kUpCrFeJ+Qc", sceIcuLegacyUnknown_kUpCrFeJ_plus_Qc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_kVvqlOKiJuA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kVvqlOKiJuA", sceIcuLegacyUnknown_kVvqlOKiJuA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_kWO4FRTmQHw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kWO4FRTmQHw", sceIcuLegacyUnknown_kWO4FRTmQHw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_kXgwqgig_plus_7M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kXgwqgig+7M", sceIcuLegacyUnknown_kXgwqgig_plus_7M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_kZWg6kFKXoQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kZWg6kFKXoQ", sceIcuLegacyUnknown_kZWg6kFKXoQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_kbjb2Hw8yiE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kbjb2Hw8yiE", sceIcuLegacyUnknown_kbjb2Hw8yiE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_kjZ_minus_HiO9m8E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kjZ-HiO9m8E", sceIcuLegacyUnknown_kjZ_minus_HiO9m8E_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_klejBDJY8is_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("klejBDJY8is", sceIcuLegacyUnknown_klejBDJY8is_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_km_plus_ASLjmiC4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("km+ASLjmiC4", sceIcuLegacyUnknown_km_plus_ASLjmiC4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_knTLx66tdGw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("knTLx66tdGw", sceIcuLegacyUnknown_knTLx66tdGw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_knnq9laAo5U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("knnq9laAo5U", sceIcuLegacyUnknown_knnq9laAo5U_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_koNL0J1w1vU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("koNL0J1w1vU", sceIcuLegacyUnknown_koNL0J1w1vU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_kpzrc1VedVs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kpzrc1VedVs", sceIcuLegacyUnknown_kpzrc1VedVs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_krY8IJeESWM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("krY8IJeESWM", sceIcuLegacyUnknown_krY8IJeESWM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_kv1zkA_plus_6TOA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kv1zkA+6TOA", sceIcuLegacyUnknown_kv1zkA_plus_6TOA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_kvPuiQQQ0wI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kvPuiQQQ0wI", sceIcuLegacyUnknown_kvPuiQQQ0wI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_kvdoVHFQSYk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kvdoVHFQSYk", sceIcuLegacyUnknown_kvdoVHFQSYk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_kwfAtQcWQMY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kwfAtQcWQMY", sceIcuLegacyUnknown_kwfAtQcWQMY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_l06yCeuTh9o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("l06yCeuTh9o", sceIcuLegacyUnknown_l06yCeuTh9o_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_l3kOwgdzEGo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("l3kOwgdzEGo", sceIcuLegacyUnknown_l3kOwgdzEGo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_l5Kt5zwZ6Uk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("l5Kt5zwZ6Uk", sceIcuLegacyUnknown_l5Kt5zwZ6Uk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_l5x6MKHu0x0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("l5x6MKHu0x0", sceIcuLegacyUnknown_l5x6MKHu0x0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_lEzjLelXvso_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lEzjLelXvso", sceIcuLegacyUnknown_lEzjLelXvso_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_lF7uqZ_plus_SEkU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lF7uqZ+SEkU", sceIcuLegacyUnknown_lF7uqZ_plus_SEkU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_lFwCOUdgf2E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lFwCOUdgf2E", sceIcuLegacyUnknown_lFwCOUdgf2E_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_lMZjLC_minus_fee4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lMZjLC-fee4", sceIcuLegacyUnknown_lMZjLC_minus_fee4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_lMb8ru0M2xI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lMb8ru0M2xI", sceIcuLegacyUnknown_lMb8ru0M2xI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_lNz2pz61tRQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lNz2pz61tRQ", sceIcuLegacyUnknown_lNz2pz61tRQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_lOSAfhuHa2I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lOSAfhuHa2I", sceIcuLegacyUnknown_lOSAfhuHa2I_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_lPgyPj5NGKQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lPgyPj5NGKQ", sceIcuLegacyUnknown_lPgyPj5NGKQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_lPwPDdfX7L8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lPwPDdfX7L8", sceIcuLegacyUnknown_lPwPDdfX7L8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_lPyvK0d3aXc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lPyvK0d3aXc", sceIcuLegacyUnknown_lPyvK0d3aXc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_lRERGWbfk48_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lRERGWbfk48", sceIcuLegacyUnknown_lRERGWbfk48_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_lRngZXg_plus_OMw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lRngZXg+OMw", sceIcuLegacyUnknown_lRngZXg_plus_OMw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_lWkcJNbsPTs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lWkcJNbsPTs", sceIcuLegacyUnknown_lWkcJNbsPTs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_lZMV1eoqaBA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lZMV1eoqaBA", sceIcuLegacyUnknown_lZMV1eoqaBA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_lZMjf9PRbVM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lZMjf9PRbVM", sceIcuLegacyUnknown_lZMjf9PRbVM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_la8aT0BhWPY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("la8aT0BhWPY", sceIcuLegacyUnknown_la8aT0BhWPY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_lbhXmqlori4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lbhXmqlori4", sceIcuLegacyUnknown_lbhXmqlori4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_lcGp00SsLdM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lcGp00SsLdM", sceIcuLegacyUnknown_lcGp00SsLdM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_lcpTDRyKE0Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lcpTDRyKE0Q", sceIcuLegacyUnknown_lcpTDRyKE0Q_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_leDQJqf_plus_kW4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("leDQJqf+kW4", sceIcuLegacyUnknown_leDQJqf_plus_kW4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_lfZHuOlEJ_minus_E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lfZHuOlEJ-E", sceIcuLegacyUnknown_lfZHuOlEJ_minus_E_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_lggecnD_plus_eXU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lggecnD+eXU", sceIcuLegacyUnknown_lggecnD_plus_eXU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_lh5Sirif1Js_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lh5Sirif1Js", sceIcuLegacyUnknown_lh5Sirif1Js_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_lkF8nnFQFsk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lkF8nnFQFsk", sceIcuLegacyUnknown_lkF8nnFQFsk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_lsKulh_plus_FqBc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lsKulh+FqBc", sceIcuLegacyUnknown_lsKulh_plus_FqBc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_lx_plus_udvz4HM0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lx+udvz4HM0", sceIcuLegacyUnknown_lx_plus_udvz4HM0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_lxUmSKdtKG8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lxUmSKdtKG8", sceIcuLegacyUnknown_lxUmSKdtKG8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_lzE3Hr5sl8g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lzE3Hr5sl8g", sceIcuLegacyUnknown_lzE3Hr5sl8g_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_m_plus_7BDDUYx6Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("m+7BDDUYx6Q", sceIcuLegacyUnknown_m_plus_7BDDUYx6Q_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_m_minus_KXH7hf4ME_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("m-KXH7hf4ME", sceIcuLegacyUnknown_m_minus_KXH7hf4ME_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_m4C91hyQ52U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("m4C91hyQ52U", sceIcuLegacyUnknown_m4C91hyQ52U_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_m4OfgzY5d5A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("m4OfgzY5d5A", sceIcuLegacyUnknown_m4OfgzY5d5A_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_m5YN2mkmFU0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("m5YN2mkmFU0", sceIcuLegacyUnknown_m5YN2mkmFU0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_m6fBwah4Ftc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("m6fBwah4Ftc", sceIcuLegacyUnknown_m6fBwah4Ftc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_m7Mr11WLmnE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("m7Mr11WLmnE", sceIcuLegacyUnknown_m7Mr11WLmnE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_m7ZpRaRI5LM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("m7ZpRaRI5LM", sceIcuLegacyUnknown_m7ZpRaRI5LM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_m7fJCHWIHlo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("m7fJCHWIHlo", sceIcuLegacyUnknown_m7fJCHWIHlo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_m99t7FIPhXk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("m99t7FIPhXk", sceIcuLegacyUnknown_m99t7FIPhXk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_m9xuHynWoMI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("m9xuHynWoMI", sceIcuLegacyUnknown_m9xuHynWoMI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_mAI26Umpj78_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mAI26Umpj78", sceIcuLegacyUnknown_mAI26Umpj78_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_mBNLXFT1ZOc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mBNLXFT1ZOc", sceIcuLegacyUnknown_mBNLXFT1ZOc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_mD9LGPlmOxk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mD9LGPlmOxk", sceIcuLegacyUnknown_mD9LGPlmOxk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_mDkfHdI0qvo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mDkfHdI0qvo", sceIcuLegacyUnknown_mDkfHdI0qvo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_mFqGvFIlafc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mFqGvFIlafc", sceIcuLegacyUnknown_mFqGvFIlafc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_mH_minus_agKi4iSw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mH-agKi4iSw", sceIcuLegacyUnknown_mH_minus_agKi4iSw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_mJCcORDh770_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mJCcORDh770", sceIcuLegacyUnknown_mJCcORDh770_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_mJis0hBrDZ4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mJis0hBrDZ4", sceIcuLegacyUnknown_mJis0hBrDZ4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_mKBgsdtsnFc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mKBgsdtsnFc", sceIcuLegacyUnknown_mKBgsdtsnFc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_mMRUSfhpPpI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mMRUSfhpPpI", sceIcuLegacyUnknown_mMRUSfhpPpI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_mNGUNa7RMc0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mNGUNa7RMc0", sceIcuLegacyUnknown_mNGUNa7RMc0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_mOkfGGvGUaM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mOkfGGvGUaM", sceIcuLegacyUnknown_mOkfGGvGUaM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_mPruZCJVhEQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mPruZCJVhEQ", sceIcuLegacyUnknown_mPruZCJVhEQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_mU8uKTDzzCs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mU8uKTDzzCs", sceIcuLegacyUnknown_mU8uKTDzzCs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_mV3ytgZIUa4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mV3ytgZIUa4", sceIcuLegacyUnknown_mV3ytgZIUa4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_mY2wDnvDJ5I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mY2wDnvDJ5I", sceIcuLegacyUnknown_mY2wDnvDJ5I_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_mYOusR0U31c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mYOusR0U31c", sceIcuLegacyUnknown_mYOusR0U31c_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_mZbyHoyczLI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mZbyHoyczLI", sceIcuLegacyUnknown_mZbyHoyczLI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_mdtYM8TgyW8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mdtYM8TgyW8", sceIcuLegacyUnknown_mdtYM8TgyW8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_meZ2WMyv4mk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("meZ2WMyv4mk", sceIcuLegacyUnknown_meZ2WMyv4mk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_mf7Nov4Lh7Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mf7Nov4Lh7Q", sceIcuLegacyUnknown_mf7Nov4Lh7Q_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_mfCxwgoA4ig_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mfCxwgoA4ig", sceIcuLegacyUnknown_mfCxwgoA4ig_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_mgXiSq5MyCk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mgXiSq5MyCk", sceIcuLegacyUnknown_mgXiSq5MyCk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_mgd0D3MCn2A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mgd0D3MCn2A", sceIcuLegacyUnknown_mgd0D3MCn2A_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_mnKq6wtnV9c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mnKq6wtnV9c", sceIcuLegacyUnknown_mnKq6wtnV9c_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_mp6t8dwn4NM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mp6t8dwn4NM", sceIcuLegacyUnknown_mp6t8dwn4NM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_mr1Iv7iiMow_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mr1Iv7iiMow", sceIcuLegacyUnknown_mr1Iv7iiMow_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_mrIyCLFbNJg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mrIyCLFbNJg", sceIcuLegacyUnknown_mrIyCLFbNJg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_mrvMsBeOVFg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mrvMsBeOVFg", sceIcuLegacyUnknown_mrvMsBeOVFg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_mrvPNIBvyAs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mrvPNIBvyAs", sceIcuLegacyUnknown_mrvPNIBvyAs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_muhIoRKfuCU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("muhIoRKfuCU", sceIcuLegacyUnknown_muhIoRKfuCU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_mvOkTF4qq2Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mvOkTF4qq2Q", sceIcuLegacyUnknown_mvOkTF4qq2Q_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_mwewVhxHbaU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mwewVhxHbaU", sceIcuLegacyUnknown_mwewVhxHbaU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_mwvU9Nl5qZ4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mwvU9Nl5qZ4", sceIcuLegacyUnknown_mwvU9Nl5qZ4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_mxsSETrkaqw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mxsSETrkaqw", sceIcuLegacyUnknown_mxsSETrkaqw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_mxuH41H1IgI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mxuH41H1IgI", sceIcuLegacyUnknown_mxuH41H1IgI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_myt0Uy_minus_ggkI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("myt0Uy-ggkI", sceIcuLegacyUnknown_myt0Uy_minus_ggkI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_mzAC0wC2Ntc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mzAC0wC2Ntc", sceIcuLegacyUnknown_mzAC0wC2Ntc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_n4NzGbYJBfQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("n4NzGbYJBfQ", sceIcuLegacyUnknown_n4NzGbYJBfQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_n4nRSUA22go_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("n4nRSUA22go", sceIcuLegacyUnknown_n4nRSUA22go_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_n6nRxPppLkg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("n6nRxPppLkg", sceIcuLegacyUnknown_n6nRxPppLkg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_n9blDl1zmZs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("n9blDl1zmZs", sceIcuLegacyUnknown_n9blDl1zmZs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_n9vuh0BbMNM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("n9vuh0BbMNM", sceIcuLegacyUnknown_n9vuh0BbMNM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_nAF6_plus_sNhras_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nAF6+sNhras", sceIcuLegacyUnknown_nAF6_plus_sNhras_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_nB07zzaNs8M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nB07zzaNs8M", sceIcuLegacyUnknown_nB07zzaNs8M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_nEBJ_minus_EoNy6o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nEBJ-EoNy6o", sceIcuLegacyUnknown_nEBJ_minus_EoNy6o_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_nEjzMspcT_minus_M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nEjzMspcT-M", sceIcuLegacyUnknown_nEjzMspcT_minus_M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_nG_minus_fe818C6s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nG-fe818C6s", sceIcuLegacyUnknown_nG_minus_fe818C6s_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_nHCy3dJmrIc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nHCy3dJmrIc", sceIcuLegacyUnknown_nHCy3dJmrIc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_nKjqLJYwHmw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nKjqLJYwHmw", sceIcuLegacyUnknown_nKjqLJYwHmw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_nO3u1FbEt2w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nO3u1FbEt2w", sceIcuLegacyUnknown_nO3u1FbEt2w_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_nP0n9drzGsA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nP0n9drzGsA", sceIcuLegacyUnknown_nP0n9drzGsA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_nTgoE_minus_uVjrg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nTgoE-uVjrg", sceIcuLegacyUnknown_nTgoE_minus_uVjrg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_nTjK8xIr_plus_sI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nTjK8xIr+sI", sceIcuLegacyUnknown_nTjK8xIr_plus_sI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_nVJkVyHC8oY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nVJkVyHC8oY", sceIcuLegacyUnknown_nVJkVyHC8oY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_nXMgpESq1zw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nXMgpESq1zw", sceIcuLegacyUnknown_nXMgpESq1zw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_nZfC_minus_j7XA7k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nZfC-j7XA7k", sceIcuLegacyUnknown_nZfC_minus_j7XA7k_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_nZioXy_plus_ln9k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nZioXy+ln9k", sceIcuLegacyUnknown_nZioXy_plus_ln9k_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_nc3PmN_minus_znXI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nc3PmN-znXI", sceIcuLegacyUnknown_nc3PmN_minus_znXI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ncxgeUHZY9M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ncxgeUHZY9M", sceIcuLegacyUnknown_ncxgeUHZY9M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ngePHx8NlxE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ngePHx8NlxE", sceIcuLegacyUnknown_ngePHx8NlxE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_nk7y_plus_1_minus_5Rlc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nk7y+1-5Rlc", sceIcuLegacyUnknown_nk7y_plus_1_minus_5Rlc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_nlKvBmVpu_plus_4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nlKvBmVpu+4", sceIcuLegacyUnknown_nlKvBmVpu_plus_4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_nol3vzTAjz4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nol3vzTAjz4", sceIcuLegacyUnknown_nol3vzTAjz4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_nq36QnRM_minus_Tg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nq36QnRM-Tg", sceIcuLegacyUnknown_nq36QnRM_minus_Tg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_nqVb8g_plus_RaW8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nqVb8g+RaW8", sceIcuLegacyUnknown_nqVb8g_plus_RaW8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_nsQsk5TUH2M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nsQsk5TUH2M", sceIcuLegacyUnknown_nsQsk5TUH2M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ntXaBtmDtx4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ntXaBtmDtx4", sceIcuLegacyUnknown_ntXaBtmDtx4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_nvaHVEW8uGA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nvaHVEW8uGA", sceIcuLegacyUnknown_nvaHVEW8uGA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_nwaDKQ6VAjU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nwaDKQ6VAjU", sceIcuLegacyUnknown_nwaDKQ6VAjU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_nwsgqlz1Opg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nwsgqlz1Opg", sceIcuLegacyUnknown_nwsgqlz1Opg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_nxfOft45qXE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nxfOft45qXE", sceIcuLegacyUnknown_nxfOft45qXE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ny5PSQqfXQc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ny5PSQqfXQc", sceIcuLegacyUnknown_ny5PSQqfXQc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_nzcgPj2HRyE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nzcgPj2HRyE", sceIcuLegacyUnknown_nzcgPj2HRyE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_nzyF18FmY94_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nzyF18FmY94", sceIcuLegacyUnknown_nzyF18FmY94_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_o_plus_JvTLCtV_minus_o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("o+JvTLCtV-o", sceIcuLegacyUnknown_o_plus_JvTLCtV_minus_o_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_o0GUhDKnxm0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("o0GUhDKnxm0", sceIcuLegacyUnknown_o0GUhDKnxm0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_o1wSrSZJpNU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("o1wSrSZJpNU", sceIcuLegacyUnknown_o1wSrSZJpNU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_o3V5zu29DGA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("o3V5zu29DGA", sceIcuLegacyUnknown_o3V5zu29DGA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_o4ilFAxoolI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("o4ilFAxoolI", sceIcuLegacyUnknown_o4ilFAxoolI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_o7EHdTnfLdY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("o7EHdTnfLdY", sceIcuLegacyUnknown_o7EHdTnfLdY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_o800PKDzglI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("o800PKDzglI", sceIcuLegacyUnknown_o800PKDzglI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_o9KCMytXpOo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("o9KCMytXpOo", sceIcuLegacyUnknown_o9KCMytXpOo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_oBA85Qez5vo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oBA85Qez5vo", sceIcuLegacyUnknown_oBA85Qez5vo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_oCeHcIJ0CPA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oCeHcIJ0CPA", sceIcuLegacyUnknown_oCeHcIJ0CPA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_oEn8JIW94ss_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oEn8JIW94ss", sceIcuLegacyUnknown_oEn8JIW94ss_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_oFNpaJ6ArFY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oFNpaJ6ArFY", sceIcuLegacyUnknown_oFNpaJ6ArFY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_oGw_plus_hI_minus_CVD0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oGw+hI-CVD0", sceIcuLegacyUnknown_oGw_plus_hI_minus_CVD0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_oH7QNCWHUi8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oH7QNCWHUi8", sceIcuLegacyUnknown_oH7QNCWHUi8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_oJLiqgpVjck_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oJLiqgpVjck", sceIcuLegacyUnknown_oJLiqgpVjck_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_oL_plus_GQoE8gsY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oL+GQoE8gsY", sceIcuLegacyUnknown_oL_plus_GQoE8gsY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_oLcBypHdLGY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oLcBypHdLGY", sceIcuLegacyUnknown_oLcBypHdLGY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_oLcosYr17C0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oLcosYr17C0", sceIcuLegacyUnknown_oLcosYr17C0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_oM6Dhwo74Ag_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oM6Dhwo74Ag", sceIcuLegacyUnknown_oM6Dhwo74Ag_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_oMgedF8R0nw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oMgedF8R0nw", sceIcuLegacyUnknown_oMgedF8R0nw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_oOvKbv_minus_48RQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oOvKbv-48RQ", sceIcuLegacyUnknown_oOvKbv_minus_48RQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_oWrhZTKS55M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oWrhZTKS55M", sceIcuLegacyUnknown_oWrhZTKS55M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_oX_plus_5pXLxgGk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oX+5pXLxgGk", sceIcuLegacyUnknown_oX_plus_5pXLxgGk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_oYNijK1VQbk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oYNijK1VQbk", sceIcuLegacyUnknown_oYNijK1VQbk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_oYs_minus_uCXSRFM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oYs-uCXSRFM", sceIcuLegacyUnknown_oYs_minus_uCXSRFM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ocNLQuCEygs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ocNLQuCEygs", sceIcuLegacyUnknown_ocNLQuCEygs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_olP0h7Vb1as_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("olP0h7Vb1as", sceIcuLegacyUnknown_olP0h7Vb1as_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_omEfgb0X740_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("omEfgb0X740", sceIcuLegacyUnknown_omEfgb0X740_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_osoom0ghhoE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("osoom0ghhoE", sceIcuLegacyUnknown_osoom0ghhoE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_otRxM636uhw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("otRxM636uhw", sceIcuLegacyUnknown_otRxM636uhw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ouoKi_plus_bvD38_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ouoKi+bvD38", sceIcuLegacyUnknown_ouoKi_plus_bvD38_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_oxMFU7qWfD8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oxMFU7qWfD8", sceIcuLegacyUnknown_oxMFU7qWfD8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_oz3SQ9ZUwUE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oz3SQ9ZUwUE", sceIcuLegacyUnknown_oz3SQ9ZUwUE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_p0Bb5fo1gx8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("p0Bb5fo1gx8", sceIcuLegacyUnknown_p0Bb5fo1gx8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_p0Zf2imJtOg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("p0Zf2imJtOg", sceIcuLegacyUnknown_p0Zf2imJtOg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_p1py_plus_0pWihc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("p1py+0pWihc", sceIcuLegacyUnknown_p1py_plus_0pWihc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_p3d8TZiX4Zg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("p3d8TZiX4Zg", sceIcuLegacyUnknown_p3d8TZiX4Zg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_p9oKEfpeTJo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("p9oKEfpeTJo", sceIcuLegacyUnknown_p9oKEfpeTJo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_pBBjp6UCMjw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pBBjp6UCMjw", sceIcuLegacyUnknown_pBBjp6UCMjw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_pG7xF8YYhtc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pG7xF8YYhtc", sceIcuLegacyUnknown_pG7xF8YYhtc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_pGFkhWIx3NI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pGFkhWIx3NI", sceIcuLegacyUnknown_pGFkhWIx3NI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_pGg_plus_6wFDlrM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pGg+6wFDlrM", sceIcuLegacyUnknown_pGg_plus_6wFDlrM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_pGk2YpBg0Lc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pGk2YpBg0Lc", sceIcuLegacyUnknown_pGk2YpBg0Lc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_pHqoa2qR10c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pHqoa2qR10c", sceIcuLegacyUnknown_pHqoa2qR10c_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_pNsA_minus_VDPPiw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pNsA-VDPPiw", sceIcuLegacyUnknown_pNsA_minus_VDPPiw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_pOvm_plus_FVJ7lE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pOvm+FVJ7lE", sceIcuLegacyUnknown_pOvm_plus_FVJ7lE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_pPfNd6QD3nk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pPfNd6QD3nk", sceIcuLegacyUnknown_pPfNd6QD3nk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_pQMGxMtK_plus_wo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pQMGxMtK+wo", sceIcuLegacyUnknown_pQMGxMtK_plus_wo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_pRnypaMw9tE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pRnypaMw9tE", sceIcuLegacyUnknown_pRnypaMw9tE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_pSMbRMzlsUE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pSMbRMzlsUE", sceIcuLegacyUnknown_pSMbRMzlsUE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_pXbGePe2aYc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pXbGePe2aYc", sceIcuLegacyUnknown_pXbGePe2aYc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_pYIS_minus_RAnO2c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pYIS-RAnO2c", sceIcuLegacyUnknown_pYIS_minus_RAnO2c_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_pZfzCXDEAlk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pZfzCXDEAlk", sceIcuLegacyUnknown_pZfzCXDEAlk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_pagEXYKnxMs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pagEXYKnxMs", sceIcuLegacyUnknown_pagEXYKnxMs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_pb7gQyE4uLY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pb7gQyE4uLY", sceIcuLegacyUnknown_pb7gQyE4uLY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_pe_minus_Zk7GNRr4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pe-Zk7GNRr4", sceIcuLegacyUnknown_pe_minus_Zk7GNRr4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_peRY_minus_tJib_minus_Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("peRY-tJib-Y", sceIcuLegacyUnknown_peRY_minus_tJib_minus_Y_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_pj4c3_minus_54ZIk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pj4c3-54ZIk", sceIcuLegacyUnknown_pj4c3_minus_54ZIk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_pkkhXsImmQ0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pkkhXsImmQ0", sceIcuLegacyUnknown_pkkhXsImmQ0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_pkq9zVgtprI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pkq9zVgtprI", sceIcuLegacyUnknown_pkq9zVgtprI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_pn1cW19yok4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pn1cW19yok4", sceIcuLegacyUnknown_pn1cW19yok4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_poSGD3YKbnc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("poSGD3YKbnc", sceIcuLegacyUnknown_poSGD3YKbnc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_pqEL7xamJEs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pqEL7xamJEs", sceIcuLegacyUnknown_pqEL7xamJEs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_pr2ZxWaYW28_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pr2ZxWaYW28", sceIcuLegacyUnknown_pr2ZxWaYW28_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ptFolTbHt_minus_s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ptFolTbHt-s", sceIcuLegacyUnknown_ptFolTbHt_minus_s_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ptbNVFctdzM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ptbNVFctdzM", sceIcuLegacyUnknown_ptbNVFctdzM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ptqCAlQ_minus_jT4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ptqCAlQ-jT4", sceIcuLegacyUnknown_ptqCAlQ_minus_jT4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_puQ5kZBcLik_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("puQ5kZBcLik", sceIcuLegacyUnknown_puQ5kZBcLik_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_pvoNV6JEges_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pvoNV6JEges", sceIcuLegacyUnknown_pvoNV6JEges_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_q_plus_p9CIJjqtc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("q+p9CIJjqtc", sceIcuLegacyUnknown_q_plus_p9CIJjqtc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_q_minus_h_plus_bwoZNu8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("q-h+bwoZNu8", sceIcuLegacyUnknown_q_minus_h_plus_bwoZNu8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_q5qKrUmopJA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("q5qKrUmopJA", sceIcuLegacyUnknown_q5qKrUmopJA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_q6_plus_BMQkDeq4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("q6+BMQkDeq4", sceIcuLegacyUnknown_q6_plus_BMQkDeq4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_q68dIAKve_plus_U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("q68dIAKve+U", sceIcuLegacyUnknown_q68dIAKve_plus_U_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_q6dkQwjI3e4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("q6dkQwjI3e4", sceIcuLegacyUnknown_q6dkQwjI3e4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_q6fbcLPayIo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("q6fbcLPayIo", sceIcuLegacyUnknown_q6fbcLPayIo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_q9h1hIyWddg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("q9h1hIyWddg", sceIcuLegacyUnknown_q9h1hIyWddg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_qB5yE3I4878_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qB5yE3I4878", sceIcuLegacyUnknown_qB5yE3I4878_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_qDaMG0PKU_plus_8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qDaMG0PKU+8", sceIcuLegacyUnknown_qDaMG0PKU_plus_8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_qJyHEgLA0yg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qJyHEgLA0yg", sceIcuLegacyUnknown_qJyHEgLA0yg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_qMOoUDLoJNE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qMOoUDLoJNE", sceIcuLegacyUnknown_qMOoUDLoJNE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_qMjaWglGSmU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qMjaWglGSmU", sceIcuLegacyUnknown_qMjaWglGSmU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_qPP0fwPQEmE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qPP0fwPQEmE", sceIcuLegacyUnknown_qPP0fwPQEmE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_qPVPvgCLdLw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qPVPvgCLdLw", sceIcuLegacyUnknown_qPVPvgCLdLw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_qSOMklTbuMg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qSOMklTbuMg", sceIcuLegacyUnknown_qSOMklTbuMg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_qSUqGWVDKuc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qSUqGWVDKuc", sceIcuLegacyUnknown_qSUqGWVDKuc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_qUTEsJ9W_minus_1M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qUTEsJ9W-1M", sceIcuLegacyUnknown_qUTEsJ9W_minus_1M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_qUn0DQ5E7k4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qUn0DQ5E7k4", sceIcuLegacyUnknown_qUn0DQ5E7k4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_qUyg_minus_kkxMKU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qUyg-kkxMKU", sceIcuLegacyUnknown_qUyg_minus_kkxMKU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_qWcfcBfXV7g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qWcfcBfXV7g", sceIcuLegacyUnknown_qWcfcBfXV7g_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_qY9NqOyJp0s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qY9NqOyJp0s", sceIcuLegacyUnknown_qY9NqOyJp0s_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_qYDJ4jw_plus_nr4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qYDJ4jw+nr4", sceIcuLegacyUnknown_qYDJ4jw_plus_nr4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_qZpoCMIWjho_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qZpoCMIWjho", sceIcuLegacyUnknown_qZpoCMIWjho_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_qcXKIRP2SWI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qcXKIRP2SWI", sceIcuLegacyUnknown_qcXKIRP2SWI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_qfYYcaEjkEg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qfYYcaEjkEg", sceIcuLegacyUnknown_qfYYcaEjkEg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_qgOegSRidWk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qgOegSRidWk", sceIcuLegacyUnknown_qgOegSRidWk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_qisHypG_plus_THA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qisHypG+THA", sceIcuLegacyUnknown_qisHypG_plus_THA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_qjOgGXHAGEA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qjOgGXHAGEA", sceIcuLegacyUnknown_qjOgGXHAGEA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_qlXqSUQnCyo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qlXqSUQnCyo", sceIcuLegacyUnknown_qlXqSUQnCyo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_qnB_plus_y2qRV48_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qnB+y2qRV48", sceIcuLegacyUnknown_qnB_plus_y2qRV48_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_qqDpxJnCHyo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qqDpxJnCHyo", sceIcuLegacyUnknown_qqDpxJnCHyo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_qsrqpMOCXYE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qsrqpMOCXYE", sceIcuLegacyUnknown_qsrqpMOCXYE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_qzRKFPZapIk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qzRKFPZapIk", sceIcuLegacyUnknown_qzRKFPZapIk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_r_plus__plus_oFgAiV3A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("r++oFgAiV3A", sceIcuLegacyUnknown_r_plus__plus_oFgAiV3A_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_r_minus_f6QCLZd44_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("r-f6QCLZd44", sceIcuLegacyUnknown_r_minus_f6QCLZd44_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_r2Cn7mA9SCI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("r2Cn7mA9SCI", sceIcuLegacyUnknown_r2Cn7mA9SCI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_r2X_minus_hz282fU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("r2X-hz282fU", sceIcuLegacyUnknown_r2X_minus_hz282fU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_r9_plus_sAKTSqqA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("r9+sAKTSqqA", sceIcuLegacyUnknown_r9_plus_sAKTSqqA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_rEzX0rUufrE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rEzX0rUufrE", sceIcuLegacyUnknown_rEzX0rUufrE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_rGHLA1FOwo4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rGHLA1FOwo4", sceIcuLegacyUnknown_rGHLA1FOwo4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_rGSY5kqmIQo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rGSY5kqmIQo", sceIcuLegacyUnknown_rGSY5kqmIQo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_rGub6wKg4Ik_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rGub6wKg4Ik", sceIcuLegacyUnknown_rGub6wKg4Ik_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_rIVQ5YCe_plus_Nw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rIVQ5YCe+Nw", sceIcuLegacyUnknown_rIVQ5YCe_plus_Nw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_rLKY4FABiz8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rLKY4FABiz8", sceIcuLegacyUnknown_rLKY4FABiz8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_rML4gdd9p2g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rML4gdd9p2g", sceIcuLegacyUnknown_rML4gdd9p2g_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_rPiSXJItylg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rPiSXJItylg", sceIcuLegacyUnknown_rPiSXJItylg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_rPxOsbwzIkI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rPxOsbwzIkI", sceIcuLegacyUnknown_rPxOsbwzIkI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_rQWVALnzV4c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rQWVALnzV4c", sceIcuLegacyUnknown_rQWVALnzV4c_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_rWAUF2EsiOU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rWAUF2EsiOU", sceIcuLegacyUnknown_rWAUF2EsiOU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_rYA4HhTMtx4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rYA4HhTMtx4", sceIcuLegacyUnknown_rYA4HhTMtx4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_raPSwcqnyag_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("raPSwcqnyag", sceIcuLegacyUnknown_raPSwcqnyag_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_rcJ02tqrEDw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rcJ02tqrEDw", sceIcuLegacyUnknown_rcJ02tqrEDw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_rcfakU19Yw8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rcfakU19Yw8", sceIcuLegacyUnknown_rcfakU19Yw8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_rdwS0m4Ef4s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rdwS0m4Ef4s", sceIcuLegacyUnknown_rdwS0m4Ef4s_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ri40vr7nItM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ri40vr7nItM", sceIcuLegacyUnknown_ri40vr7nItM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_rleKF2T_plus_tSs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rleKF2T+tSs", sceIcuLegacyUnknown_rleKF2T_plus_tSs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_rnQLHC631T0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rnQLHC631T0", sceIcuLegacyUnknown_rnQLHC631T0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_rnd4RdgRN6o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rnd4RdgRN6o", sceIcuLegacyUnknown_rnd4RdgRN6o_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_rsK0PDTZ8o4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rsK0PDTZ8o4", sceIcuLegacyUnknown_rsK0PDTZ8o4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ru2bpPUp5_plus_Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ru2bpPUp5+Q", sceIcuLegacyUnknown_ru2bpPUp5_plus_Q_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_rw_plus_8ygNaJa4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rw+8ygNaJa4", sceIcuLegacyUnknown_rw_plus_8ygNaJa4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ryF_plus_klA1y44_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ryF+klA1y44", sceIcuLegacyUnknown_ryF_plus_klA1y44_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_s_plus_voBeuCyhU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("s+voBeuCyhU", sceIcuLegacyUnknown_s_plus_voBeuCyhU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_s_minus_ZHwpqG0NE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("s-ZHwpqG0NE", sceIcuLegacyUnknown_s_minus_ZHwpqG0NE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_s0aR0qaOgvo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("s0aR0qaOgvo", sceIcuLegacyUnknown_s0aR0qaOgvo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_s2je4VSEpWc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("s2je4VSEpWc", sceIcuLegacyUnknown_s2je4VSEpWc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_s4PzHCqbUJE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("s4PzHCqbUJE", sceIcuLegacyUnknown_s4PzHCqbUJE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_s5Wprcn_plus_jqU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("s5Wprcn+jqU", sceIcuLegacyUnknown_s5Wprcn_plus_jqU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_s90ukY5BwAk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("s90ukY5BwAk", sceIcuLegacyUnknown_s90ukY5BwAk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_sDA5QTiq_plus_mY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sDA5QTiq+mY", sceIcuLegacyUnknown_sDA5QTiq_plus_mY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_sDd36F0WnLM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sDd36F0WnLM", sceIcuLegacyUnknown_sDd36F0WnLM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_sELpIbkpBXM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sELpIbkpBXM", sceIcuLegacyUnknown_sELpIbkpBXM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_sHOLNouGWu0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sHOLNouGWu0", sceIcuLegacyUnknown_sHOLNouGWu0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_sI0jCaqkt_plus_U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sI0jCaqkt+U", sceIcuLegacyUnknown_sI0jCaqkt_plus_U_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_sJaNZ_minus_bGYJM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sJaNZ-bGYJM", sceIcuLegacyUnknown_sJaNZ_minus_bGYJM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_sM6zaDAjMb8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sM6zaDAjMb8", sceIcuLegacyUnknown_sM6zaDAjMb8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_sQCJorTXRiM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sQCJorTXRiM", sceIcuLegacyUnknown_sQCJorTXRiM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_sQWBQmtDmFI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sQWBQmtDmFI", sceIcuLegacyUnknown_sQWBQmtDmFI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_sUf1IwOVqkw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sUf1IwOVqkw", sceIcuLegacyUnknown_sUf1IwOVqkw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_sVN9UvNqz3k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sVN9UvNqz3k", sceIcuLegacyUnknown_sVN9UvNqz3k_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_sXkOZdYHmec_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sXkOZdYHmec", sceIcuLegacyUnknown_sXkOZdYHmec_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_sY6TJzzoXjA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sY6TJzzoXjA", sceIcuLegacyUnknown_sY6TJzzoXjA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_sbs1gkGQMRc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sbs1gkGQMRc", sceIcuLegacyUnknown_sbs1gkGQMRc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_se9_plus_A9HXuhA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("se9+A9HXuhA", sceIcuLegacyUnknown_se9_plus_A9HXuhA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_sh4tekSCfDg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sh4tekSCfDg", sceIcuLegacyUnknown_sh4tekSCfDg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_siF3T91uDNc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("siF3T91uDNc", sceIcuLegacyUnknown_siF3T91uDNc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_siNPpPSorwY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("siNPpPSorwY", sceIcuLegacyUnknown_siNPpPSorwY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_sijsfM_minus_blKs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sijsfM-blKs", sceIcuLegacyUnknown_sijsfM_minus_blKs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_sj9YiLphihc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sj9YiLphihc", sceIcuLegacyUnknown_sj9YiLphihc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_skWJdxykO_minus_c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("skWJdxykO-c", sceIcuLegacyUnknown_skWJdxykO_minus_c_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_sl7UWXx_plus_9Uc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sl7UWXx+9Uc", sceIcuLegacyUnknown_sl7UWXx_plus_9Uc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_spLNXZdR_minus_XQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("spLNXZdR-XQ", sceIcuLegacyUnknown_spLNXZdR_minus_XQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_sqS31_plus_ABfJQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sqS31+ABfJQ", sceIcuLegacyUnknown_sqS31_plus_ABfJQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_sqcFew1Fa64_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sqcFew1Fa64", sceIcuLegacyUnknown_sqcFew1Fa64_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_srWXZm_plus_uUZU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("srWXZm+uUZU", sceIcuLegacyUnknown_srWXZm_plus_uUZU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_suTFBF_minus_YYJo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("suTFBF-YYJo", sceIcuLegacyUnknown_suTFBF_minus_YYJo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_svSitLIoR0M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("svSitLIoR0M", sceIcuLegacyUnknown_svSitLIoR0M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_svdvfCobobM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("svdvfCobobM", sceIcuLegacyUnknown_svdvfCobobM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_svygVJARrD4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("svygVJARrD4", sceIcuLegacyUnknown_svygVJARrD4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_sx1OJpJQNKo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sx1OJpJQNKo", sceIcuLegacyUnknown_sx1OJpJQNKo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_sxCnywYf1UU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sxCnywYf1UU", sceIcuLegacyUnknown_sxCnywYf1UU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_syuiOxqv2FI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("syuiOxqv2FI", sceIcuLegacyUnknown_syuiOxqv2FI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_sz2Q8LAojQI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sz2Q8LAojQI", sceIcuLegacyUnknown_sz2Q8LAojQI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_szLrcdR3eyY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("szLrcdR3eyY", sceIcuLegacyUnknown_szLrcdR3eyY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_t_minus_hL9pkzNqs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("t-hL9pkzNqs", sceIcuLegacyUnknown_t_minus_hL9pkzNqs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_t0QQEaFsC_minus_M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("t0QQEaFsC-M", sceIcuLegacyUnknown_t0QQEaFsC_minus_M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_t1Bl3QUgCIw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("t1Bl3QUgCIw", sceIcuLegacyUnknown_t1Bl3QUgCIw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_t1kRYepQFw0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("t1kRYepQFw0", sceIcuLegacyUnknown_t1kRYepQFw0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_t6IQPJDVfqw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("t6IQPJDVfqw", sceIcuLegacyUnknown_t6IQPJDVfqw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_tBP5x0sTch8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tBP5x0sTch8", sceIcuLegacyUnknown_tBP5x0sTch8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_tC_minus_llfh3fbE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tC-llfh3fbE", sceIcuLegacyUnknown_tC_minus_llfh3fbE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_tCRUBE4pMPk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tCRUBE4pMPk", sceIcuLegacyUnknown_tCRUBE4pMPk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_tCu7fTjq5js_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tCu7fTjq5js", sceIcuLegacyUnknown_tCu7fTjq5js_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_tF_plus_U1Hj7iZM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tF+U1Hj7iZM", sceIcuLegacyUnknown_tF_plus_U1Hj7iZM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_tGEuB_minus_fAbpo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tGEuB-fAbpo", sceIcuLegacyUnknown_tGEuB_minus_fAbpo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_tGoJJ8VZk5s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tGoJJ8VZk5s", sceIcuLegacyUnknown_tGoJJ8VZk5s_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_tJ8hf8Obkzo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tJ8hf8Obkzo", sceIcuLegacyUnknown_tJ8hf8Obkzo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_tJCcHU3yuD4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tJCcHU3yuD4", sceIcuLegacyUnknown_tJCcHU3yuD4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_tLuHMUUGAbU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tLuHMUUGAbU", sceIcuLegacyUnknown_tLuHMUUGAbU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_tOr9C4XdXeM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tOr9C4XdXeM", sceIcuLegacyUnknown_tOr9C4XdXeM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_tQ4iMig6GhI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tQ4iMig6GhI", sceIcuLegacyUnknown_tQ4iMig6GhI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_tQC7mhwIcYI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tQC7mhwIcYI", sceIcuLegacyUnknown_tQC7mhwIcYI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_tRuMuMyfsCw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tRuMuMyfsCw", sceIcuLegacyUnknown_tRuMuMyfsCw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_tT6m4kPCaiw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tT6m4kPCaiw", sceIcuLegacyUnknown_tT6m4kPCaiw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_tYdK4jFgB10_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tYdK4jFgB10", sceIcuLegacyUnknown_tYdK4jFgB10_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_td3_minus_B6sLCag_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("td3-B6sLCag", sceIcuLegacyUnknown_td3_minus_B6sLCag_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_thnBrjve5WY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("thnBrjve5WY", sceIcuLegacyUnknown_thnBrjve5WY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_tiMMuYmTWRo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tiMMuYmTWRo", sceIcuLegacyUnknown_tiMMuYmTWRo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_tjBm_minus_5cNIyQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tjBm-5cNIyQ", sceIcuLegacyUnknown_tjBm_minus_5cNIyQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_tlF0Q4BsxOc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tlF0Q4BsxOc", sceIcuLegacyUnknown_tlF0Q4BsxOc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_tmx6qeUDqns_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tmx6qeUDqns", sceIcuLegacyUnknown_tmx6qeUDqns_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_toZfIU2SFGg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("toZfIU2SFGg", sceIcuLegacyUnknown_toZfIU2SFGg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_tqeCpXiyN3Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tqeCpXiyN3Y", sceIcuLegacyUnknown_tqeCpXiyN3Y_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_twrIHWOkgFY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("twrIHWOkgFY", sceIcuLegacyUnknown_twrIHWOkgFY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_tzaSPxMt7II_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tzaSPxMt7II", sceIcuLegacyUnknown_tzaSPxMt7II_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_u0PMOwRW2Nw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("u0PMOwRW2Nw", sceIcuLegacyUnknown_u0PMOwRW2Nw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_u0d88zW5hEg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("u0d88zW5hEg", sceIcuLegacyUnknown_u0d88zW5hEg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_u3wHcvgUlYQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("u3wHcvgUlYQ", sceIcuLegacyUnknown_u3wHcvgUlYQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_u7ol_plus_VUrT9k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("u7ol+VUrT9k", sceIcuLegacyUnknown_u7ol_plus_VUrT9k_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_uA2aJgvkoug_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uA2aJgvkoug", sceIcuLegacyUnknown_uA2aJgvkoug_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_uAwfiZ4QJpI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uAwfiZ4QJpI", sceIcuLegacyUnknown_uAwfiZ4QJpI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_uCRpl3IKxnI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uCRpl3IKxnI", sceIcuLegacyUnknown_uCRpl3IKxnI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_uEXjuCbdkTs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uEXjuCbdkTs", sceIcuLegacyUnknown_uEXjuCbdkTs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_uF_plus_dNdiMQwI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uF+dNdiMQwI", sceIcuLegacyUnknown_uF_plus_dNdiMQwI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_uFVdaafMFT0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uFVdaafMFT0", sceIcuLegacyUnknown_uFVdaafMFT0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_uHi4sSMujQ4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uHi4sSMujQ4", sceIcuLegacyUnknown_uHi4sSMujQ4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_uJbTUKDL3hE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uJbTUKDL3hE", sceIcuLegacyUnknown_uJbTUKDL3hE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_uJoZRn_minus_1Zcg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uJoZRn-1Zcg", sceIcuLegacyUnknown_uJoZRn_minus_1Zcg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_uM7LE3DSVGc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uM7LE3DSVGc", sceIcuLegacyUnknown_uM7LE3DSVGc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_uNWFSn6bdMs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uNWFSn6bdMs", sceIcuLegacyUnknown_uNWFSn6bdMs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_uPZVT8JKnVg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uPZVT8JKnVg", sceIcuLegacyUnknown_uPZVT8JKnVg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_uSILYbnnX_minus_E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uSILYbnnX-E", sceIcuLegacyUnknown_uSILYbnnX_minus_E_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_uU2a4i_plus_CXyI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uU2a4i+CXyI", sceIcuLegacyUnknown_uU2a4i_plus_CXyI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_uUMihdIHoRs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uUMihdIHoRs", sceIcuLegacyUnknown_uUMihdIHoRs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_uVLLF8GNXfE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uVLLF8GNXfE", sceIcuLegacyUnknown_uVLLF8GNXfE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_udJxb7Ft4Lw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("udJxb7Ft4Lw", sceIcuLegacyUnknown_udJxb7Ft4Lw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_udmT4cGBjAY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("udmT4cGBjAY", sceIcuLegacyUnknown_udmT4cGBjAY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_uf_minus_RIkZUazQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uf-RIkZUazQ", sceIcuLegacyUnknown_uf_minus_RIkZUazQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ufrcocK7QxI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ufrcocK7QxI", sceIcuLegacyUnknown_ufrcocK7QxI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ug7AKrj3k9k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ug7AKrj3k9k", sceIcuLegacyUnknown_ug7AKrj3k9k_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_uiPs6XyAwzM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uiPs6XyAwzM", sceIcuLegacyUnknown_uiPs6XyAwzM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_uioVIhZPdZY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uioVIhZPdZY", sceIcuLegacyUnknown_uioVIhZPdZY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ujJ515S8XC8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ujJ515S8XC8", sceIcuLegacyUnknown_ujJ515S8XC8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_uk3KonVWyRA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uk3KonVWyRA", sceIcuLegacyUnknown_uk3KonVWyRA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_unl_minus_pBAxQqQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("unl-pBAxQqQ", sceIcuLegacyUnknown_unl_minus_pBAxQqQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_upA0jOZLS_plus_0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("upA0jOZLS+0", sceIcuLegacyUnknown_upA0jOZLS_plus_0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_uqaePRcFldE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uqaePRcFldE", sceIcuLegacyUnknown_uqaePRcFldE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_uvnCoBHdWRY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uvnCoBHdWRY", sceIcuLegacyUnknown_uvnCoBHdWRY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_uw_minus_LwJbM_minus_FI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uw-LwJbM-FI", sceIcuLegacyUnknown_uw_minus_LwJbM_minus_FI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_uwah6RiPSLg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uwah6RiPSLg", sceIcuLegacyUnknown_uwah6RiPSLg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_uy004AKIiV8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uy004AKIiV8", sceIcuLegacyUnknown_uy004AKIiV8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_uyQEbL6cyXY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uyQEbL6cyXY", sceIcuLegacyUnknown_uyQEbL6cyXY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_v_minus_IeGKAkNwk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("v-IeGKAkNwk", sceIcuLegacyUnknown_v_minus_IeGKAkNwk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_v0_plus_AjZnbZYY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("v0+AjZnbZYY", sceIcuLegacyUnknown_v0_plus_AjZnbZYY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_v0f0mWaZLuo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("v0f0mWaZLuo", sceIcuLegacyUnknown_v0f0mWaZLuo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_v0q0kTm2wHo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("v0q0kTm2wHo", sceIcuLegacyUnknown_v0q0kTm2wHo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_v7HZoO_minus_4HTw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("v7HZoO-4HTw", sceIcuLegacyUnknown_v7HZoO_minus_4HTw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_vBabh_plus_AsWjs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vBabh+AsWjs", sceIcuLegacyUnknown_vBabh_plus_AsWjs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_vE_plus_ITy9E1kk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vE+ITy9E1kk", sceIcuLegacyUnknown_vE_plus_ITy9E1kk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_vENhdeMSnzA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vENhdeMSnzA", sceIcuLegacyUnknown_vENhdeMSnzA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_vESt8BsBw6s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vESt8BsBw6s", sceIcuLegacyUnknown_vESt8BsBw6s_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_vFIZ0zLtcjA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vFIZ0zLtcjA", sceIcuLegacyUnknown_vFIZ0zLtcjA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_vFhTf6l2lug_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vFhTf6l2lug", sceIcuLegacyUnknown_vFhTf6l2lug_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_vG8EIliqpe8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vG8EIliqpe8", sceIcuLegacyUnknown_vG8EIliqpe8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_vJ49MTq8T3U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vJ49MTq8T3U", sceIcuLegacyUnknown_vJ49MTq8T3U_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_vKPF4Ae2jXU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vKPF4Ae2jXU", sceIcuLegacyUnknown_vKPF4Ae2jXU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_vKgiq6x2U4k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vKgiq6x2U4k", sceIcuLegacyUnknown_vKgiq6x2U4k_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_vL3RYX_plus_17z0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vL3RYX+17z0", sceIcuLegacyUnknown_vL3RYX_plus_17z0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_vObz7uYgvaw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vObz7uYgvaw", sceIcuLegacyUnknown_vObz7uYgvaw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_vP2u_minus_EKySz8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vP2u-EKySz8", sceIcuLegacyUnknown_vP2u_minus_EKySz8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_vQ2tKAFtwnw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vQ2tKAFtwnw", sceIcuLegacyUnknown_vQ2tKAFtwnw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_vQj7629_minus_Q6s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vQj7629-Q6s", sceIcuLegacyUnknown_vQj7629_minus_Q6s_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_vRbXx0hOIl0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vRbXx0hOIl0", sceIcuLegacyUnknown_vRbXx0hOIl0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_vVBXVwprC1c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vVBXVwprC1c", sceIcuLegacyUnknown_vVBXVwprC1c_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_vZj9Ghirb88_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vZj9Ghirb88", sceIcuLegacyUnknown_vZj9Ghirb88_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_vcEmTpxouso_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vcEmTpxouso", sceIcuLegacyUnknown_vcEmTpxouso_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_vd_plus_jCNiphKY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vd+jCNiphKY", sceIcuLegacyUnknown_vd_plus_jCNiphKY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_vfn772pcPcs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vfn772pcPcs", sceIcuLegacyUnknown_vfn772pcPcs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_vhEasOXrXSQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vhEasOXrXSQ", sceIcuLegacyUnknown_vhEasOXrXSQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_vhtZPCh8h50_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vhtZPCh8h50", sceIcuLegacyUnknown_vhtZPCh8h50_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_viJgRPnvNAM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("viJgRPnvNAM", sceIcuLegacyUnknown_viJgRPnvNAM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_vixR1D34h8c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vixR1D34h8c", sceIcuLegacyUnknown_vixR1D34h8c_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_vkweVxJWAb0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vkweVxJWAb0", sceIcuLegacyUnknown_vkweVxJWAb0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_vlmudbliYtE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vlmudbliYtE", sceIcuLegacyUnknown_vlmudbliYtE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_vnzVCb9fLYY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vnzVCb9fLYY", sceIcuLegacyUnknown_vnzVCb9fLYY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_vo6bvI_plus_oYEw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vo6bvI+oYEw", sceIcuLegacyUnknown_vo6bvI_plus_oYEw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_vqfNc8gKX7M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vqfNc8gKX7M", sceIcuLegacyUnknown_vqfNc8gKX7M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_vrSTiBp7Bxc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vrSTiBp7Bxc", sceIcuLegacyUnknown_vrSTiBp7Bxc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_vyY43_plus_VLd_minus_0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vyY43+VLd-0", sceIcuLegacyUnknown_vyY43_plus_VLd_minus_0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_vzEk9g_plus_8pjo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vzEk9g+8pjo", sceIcuLegacyUnknown_vzEk9g_plus_8pjo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_vzIRGkHE5Ec_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vzIRGkHE5Ec", sceIcuLegacyUnknown_vzIRGkHE5Ec_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_w_plus_andXbNt9w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("w+andXbNt9w", sceIcuLegacyUnknown_w_plus_andXbNt9w_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_w0LHtIi60Sk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("w0LHtIi60Sk", sceIcuLegacyUnknown_w0LHtIi60Sk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_w1k0uL_minus_2zrQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("w1k0uL-2zrQ", sceIcuLegacyUnknown_w1k0uL_minus_2zrQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_w3QmqwGb7iw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("w3QmqwGb7iw", sceIcuLegacyUnknown_w3QmqwGb7iw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_w4TVmUxJClA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("w4TVmUxJClA", sceIcuLegacyUnknown_w4TVmUxJClA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_w5koSZnpf68_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("w5koSZnpf68", sceIcuLegacyUnknown_w5koSZnpf68_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_w63v6LpnB_minus_A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("w63v6LpnB-A", sceIcuLegacyUnknown_w63v6LpnB_minus_A_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_w9nVhDr6Tuk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("w9nVhDr6Tuk", sceIcuLegacyUnknown_w9nVhDr6Tuk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_wCUi7kMa96E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wCUi7kMa96E", sceIcuLegacyUnknown_wCUi7kMa96E_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_wERs34fb56w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wERs34fb56w", sceIcuLegacyUnknown_wERs34fb56w_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_wEoREeLcJvE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wEoREeLcJvE", sceIcuLegacyUnknown_wEoREeLcJvE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_wFXQr_plus_ADp0I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wFXQr+ADp0I", sceIcuLegacyUnknown_wFXQr_plus_ADp0I_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_wNCY2fmsBy8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wNCY2fmsBy8", sceIcuLegacyUnknown_wNCY2fmsBy8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_wOPixgiIoJ8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wOPixgiIoJ8", sceIcuLegacyUnknown_wOPixgiIoJ8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_wORJc9ExK_minus_U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wORJc9ExK-U", sceIcuLegacyUnknown_wORJc9ExK_minus_U_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_wOWXwyIvlew_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wOWXwyIvlew", sceIcuLegacyUnknown_wOWXwyIvlew_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_wPC_minus_ecqXeKY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wPC-ecqXeKY", sceIcuLegacyUnknown_wPC_minus_ecqXeKY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_wQLMyxkpyoY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wQLMyxkpyoY", sceIcuLegacyUnknown_wQLMyxkpyoY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_wR3MAUetM9M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wR3MAUetM9M", sceIcuLegacyUnknown_wR3MAUetM9M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_wUo8uggCIKI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wUo8uggCIKI", sceIcuLegacyUnknown_wUo8uggCIKI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_wVoC0_plus_Jf2EY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wVoC0+Jf2EY", sceIcuLegacyUnknown_wVoC0_plus_Jf2EY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_wa5T0WC1Geo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wa5T0WC1Geo", sceIcuLegacyUnknown_wa5T0WC1Geo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_wcv7pk_minus_Cm4Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wcv7pk-Cm4Q", sceIcuLegacyUnknown_wcv7pk_minus_Cm4Q_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_wg6kvThzUC4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wg6kvThzUC4", sceIcuLegacyUnknown_wg6kvThzUC4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_wgTWmXK4OWo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wgTWmXK4OWo", sceIcuLegacyUnknown_wgTWmXK4OWo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_wh8nG_minus_MSV94_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wh8nG-MSV94", sceIcuLegacyUnknown_wh8nG_minus_MSV94_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_wiJx0nugsWQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wiJx0nugsWQ", sceIcuLegacyUnknown_wiJx0nugsWQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_wjcxye4juLE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wjcxye4juLE", sceIcuLegacyUnknown_wjcxye4juLE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_wkpMPlbnk2s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wkpMPlbnk2s", sceIcuLegacyUnknown_wkpMPlbnk2s_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_wmcxMdGsZqM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wmcxMdGsZqM", sceIcuLegacyUnknown_wmcxMdGsZqM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_woFQKgSI4vI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("woFQKgSI4vI", sceIcuLegacyUnknown_woFQKgSI4vI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_wp2Ap_plus_Lg4gk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wp2Ap+Lg4gk", sceIcuLegacyUnknown_wp2Ap_plus_Lg4gk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_wqW7jY27LdU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wqW7jY27LdU", sceIcuLegacyUnknown_wqW7jY27LdU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_wxEMfjv1CKI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wxEMfjv1CKI", sceIcuLegacyUnknown_wxEMfjv1CKI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_wxNataLE6Pw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wxNataLE6Pw", sceIcuLegacyUnknown_wxNataLE6Pw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_x06LLPToh7o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("x06LLPToh7o", sceIcuLegacyUnknown_x06LLPToh7o_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_x0ky5DM7TBM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("x0ky5DM7TBM", sceIcuLegacyUnknown_x0ky5DM7TBM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_x3kS1PpguWo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("x3kS1PpguWo", sceIcuLegacyUnknown_x3kS1PpguWo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_x61cJE335hY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("x61cJE335hY", sceIcuLegacyUnknown_x61cJE335hY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_x79QZl_plus_cE_minus_M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("x79QZl+cE-M", sceIcuLegacyUnknown_x79QZl_plus_cE_minus_M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_x9VLNbp_minus_0bc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("x9VLNbp-0bc", sceIcuLegacyUnknown_x9VLNbp_minus_0bc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_x9yhzIIKwPY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("x9yhzIIKwPY", sceIcuLegacyUnknown_x9yhzIIKwPY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_xBsk4a8QjNY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xBsk4a8QjNY", sceIcuLegacyUnknown_xBsk4a8QjNY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_xBtnc_minus_hPeag_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xBtnc-hPeag", sceIcuLegacyUnknown_xBtnc_minus_hPeag_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_xC9LUxhrTe8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xC9LUxhrTe8", sceIcuLegacyUnknown_xC9LUxhrTe8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_xDPnsCvHEDs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xDPnsCvHEDs", sceIcuLegacyUnknown_xDPnsCvHEDs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_xE6liwbu0NE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xE6liwbu0NE", sceIcuLegacyUnknown_xE6liwbu0NE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_xIlJnQmf360_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xIlJnQmf360", sceIcuLegacyUnknown_xIlJnQmf360_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_xIpYVsuNBnA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xIpYVsuNBnA", sceIcuLegacyUnknown_xIpYVsuNBnA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_xJn60MTZ_plus_yU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xJn60MTZ+yU", sceIcuLegacyUnknown_xJn60MTZ_plus_yU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_xKZwQWXnnG0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xKZwQWXnnG0", sceIcuLegacyUnknown_xKZwQWXnnG0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_xKwfiFkxxag_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xKwfiFkxxag", sceIcuLegacyUnknown_xKwfiFkxxag_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_xLaM0VCrVBA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xLaM0VCrVBA", sceIcuLegacyUnknown_xLaM0VCrVBA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_xO2xPJPvrwM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xO2xPJPvrwM", sceIcuLegacyUnknown_xO2xPJPvrwM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_xOMwqeWCShk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xOMwqeWCShk", sceIcuLegacyUnknown_xOMwqeWCShk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_xONY95TlvKg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xONY95TlvKg", sceIcuLegacyUnknown_xONY95TlvKg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_xOWFCWYRUr4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xOWFCWYRUr4", sceIcuLegacyUnknown_xOWFCWYRUr4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_xPkJ2Vpl2Pw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xPkJ2Vpl2Pw", sceIcuLegacyUnknown_xPkJ2Vpl2Pw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_xUU3stOMxhA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xUU3stOMxhA", sceIcuLegacyUnknown_xUU3stOMxhA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_xV6YYVaiWCE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xV6YYVaiWCE", sceIcuLegacyUnknown_xV6YYVaiWCE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_xYyYTfVM38w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xYyYTfVM38w", sceIcuLegacyUnknown_xYyYTfVM38w_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_xayqByEfWxo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xayqByEfWxo", sceIcuLegacyUnknown_xayqByEfWxo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_xh6w4XzEvrE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xh6w4XzEvrE", sceIcuLegacyUnknown_xh6w4XzEvrE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_xhAjjXBoIsU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xhAjjXBoIsU", sceIcuLegacyUnknown_xhAjjXBoIsU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_xhJF17DTz5Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xhJF17DTz5Y", sceIcuLegacyUnknown_xhJF17DTz5Y_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_xj3JN8SfKIM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xj3JN8SfKIM", sceIcuLegacyUnknown_xj3JN8SfKIM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_xjWTXQmF_plus_EQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xjWTXQmF+EQ", sceIcuLegacyUnknown_xjWTXQmF_plus_EQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_xkakgh5LbYs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xkakgh5LbYs", sceIcuLegacyUnknown_xkakgh5LbYs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_xmON0DJSgzE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xmON0DJSgzE", sceIcuLegacyUnknown_xmON0DJSgzE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_xmhE1gHh3uo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xmhE1gHh3uo", sceIcuLegacyUnknown_xmhE1gHh3uo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_xpMX_plus_6Jsoac_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xpMX+6Jsoac", sceIcuLegacyUnknown_xpMX_plus_6Jsoac_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_xpdCYsHYfh0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xpdCYsHYfh0", sceIcuLegacyUnknown_xpdCYsHYfh0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_xrQmlazU1dM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xrQmlazU1dM", sceIcuLegacyUnknown_xrQmlazU1dM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_xrnmEo_plus_rNiU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xrnmEo+rNiU", sceIcuLegacyUnknown_xrnmEo_plus_rNiU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_xt4UIk6b2W4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xt4UIk6b2W4", sceIcuLegacyUnknown_xt4UIk6b2W4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_xuBB_minus_BrALSM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xuBB-BrALSM", sceIcuLegacyUnknown_xuBB_minus_BrALSM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_xx4FGisubsA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xx4FGisubsA", sceIcuLegacyUnknown_xx4FGisubsA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_xxzE5TCEbmY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xxzE5TCEbmY", sceIcuLegacyUnknown_xxzE5TCEbmY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_xzLgzGOHQto_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xzLgzGOHQto", sceIcuLegacyUnknown_xzLgzGOHQto_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_y0aapzyadSw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("y0aapzyadSw", sceIcuLegacyUnknown_y0aapzyadSw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_y0dJq9TC59U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("y0dJq9TC59U", sceIcuLegacyUnknown_y0dJq9TC59U_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_y11t0atzpyU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("y11t0atzpyU", sceIcuLegacyUnknown_y11t0atzpyU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_y3T_plus_uuG1YGg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("y3T+uuG1YGg", sceIcuLegacyUnknown_y3T_plus_uuG1YGg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_y5_minus_WNLXJkDc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("y5-WNLXJkDc", sceIcuLegacyUnknown_y5_minus_WNLXJkDc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_y6NFnit0JKY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("y6NFnit0JKY", sceIcuLegacyUnknown_y6NFnit0JKY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_y7ep3yHJDpU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("y7ep3yHJDpU", sceIcuLegacyUnknown_y7ep3yHJDpU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_y80RbT7hxCY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("y80RbT7hxCY", sceIcuLegacyUnknown_y80RbT7hxCY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_y8RT4Qrm7Gg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("y8RT4Qrm7Gg", sceIcuLegacyUnknown_y8RT4Qrm7Gg_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_y96_minus_Pq7pkDo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("y96-Pq7pkDo", sceIcuLegacyUnknown_y96_minus_Pq7pkDo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_y9eFAhCasms_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("y9eFAhCasms", sceIcuLegacyUnknown_y9eFAhCasms_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_y9lK9tQhLug_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("y9lK9tQhLug", sceIcuLegacyUnknown_y9lK9tQhLug_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_yF_plus_BpY38rbY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yF+BpY38rbY", sceIcuLegacyUnknown_yF_plus_BpY38rbY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_yGPvGhI4OfU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yGPvGhI4OfU", sceIcuLegacyUnknown_yGPvGhI4OfU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_yH0uHhM3qwE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yH0uHhM3qwE", sceIcuLegacyUnknown_yH0uHhM3qwE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_yH7ECRoEfBE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yH7ECRoEfBE", sceIcuLegacyUnknown_yH7ECRoEfBE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_yT2KrJcVN2w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yT2KrJcVN2w", sceIcuLegacyUnknown_yT2KrJcVN2w_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_yUrPaK9R4zI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yUrPaK9R4zI", sceIcuLegacyUnknown_yUrPaK9R4zI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_yXIXf6YY3S8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yXIXf6YY3S8", sceIcuLegacyUnknown_yXIXf6YY3S8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_yYblB5YQKKE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yYblB5YQKKE", sceIcuLegacyUnknown_yYblB5YQKKE_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_yZALu4_minus_9KfM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yZALu4-9KfM", sceIcuLegacyUnknown_yZALu4_minus_9KfM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ya5EhVt4c0Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ya5EhVt4c0Y", sceIcuLegacyUnknown_ya5EhVt4c0Y_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_yc6_plus_6xulIOs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yc6+6xulIOs", sceIcuLegacyUnknown_yc6_plus_6xulIOs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ycgIs7zcXBs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ycgIs7zcXBs", sceIcuLegacyUnknown_ycgIs7zcXBs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ycpVzhaLHM4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ycpVzhaLHM4", sceIcuLegacyUnknown_ycpVzhaLHM4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ydzM6_minus_5QEAo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ydzM6-5QEAo", sceIcuLegacyUnknown_ydzM6_minus_5QEAo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_yeYZ3i4o04M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yeYZ3i4o04M", sceIcuLegacyUnknown_yeYZ3i4o04M_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_yeiwp5OQZUo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yeiwp5OQZUo", sceIcuLegacyUnknown_yeiwp5OQZUo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_yet584Rwd64_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yet584Rwd64", sceIcuLegacyUnknown_yet584Rwd64_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_yfVdzhuA8v0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yfVdzhuA8v0", sceIcuLegacyUnknown_yfVdzhuA8v0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_yh0eJOfRoVw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yh0eJOfRoVw", sceIcuLegacyUnknown_yh0eJOfRoVw_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_yiFFhwZWdZU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yiFFhwZWdZU", sceIcuLegacyUnknown_yiFFhwZWdZU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_yjKiaXVikr8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yjKiaXVikr8", sceIcuLegacyUnknown_yjKiaXVikr8_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_yjkykVlf_plus_OI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yjkykVlf+OI", sceIcuLegacyUnknown_yjkykVlf_plus_OI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_yko_minus_aU3XiYc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yko-aU3XiYc", sceIcuLegacyUnknown_yko_minus_aU3XiYc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_yp5Nh_plus_hby74_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yp5Nh+hby74", sceIcuLegacyUnknown_yp5Nh_plus_hby74_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_yrPTLmYWUIM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yrPTLmYWUIM", sceIcuLegacyUnknown_yrPTLmYWUIM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_yt5SoFC3Qbs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yt5SoFC3Qbs", sceIcuLegacyUnknown_yt5SoFC3Qbs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_yuIik2mcgeM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yuIik2mcgeM", sceIcuLegacyUnknown_yuIik2mcgeM_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_yve4yO82NQs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yve4yO82NQs", sceIcuLegacyUnknown_yve4yO82NQs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_yymH_plus_TZdDxk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yymH+TZdDxk", sceIcuLegacyUnknown_yymH_plus_TZdDxk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_z0ii_plus_Z6tfh0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("z0ii+Z6tfh0", sceIcuLegacyUnknown_z0ii_plus_Z6tfh0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_z9oSx_plus_BxBp0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("z9oSx+BxBp0", sceIcuLegacyUnknown_z9oSx_plus_BxBp0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_zDKSAcAiuE0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zDKSAcAiuE0", sceIcuLegacyUnknown_zDKSAcAiuE0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_zDsH55AYTkI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zDsH55AYTkI", sceIcuLegacyUnknown_zDsH55AYTkI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_zJLKZ2_minus_wfHA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zJLKZ2-wfHA", sceIcuLegacyUnknown_zJLKZ2_minus_wfHA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_zJY1wEUT9to_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zJY1wEUT9to", sceIcuLegacyUnknown_zJY1wEUT9to_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_zRBjLUcjnwk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zRBjLUcjnwk", sceIcuLegacyUnknown_zRBjLUcjnwk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_zVHpQA69C5c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zVHpQA69C5c", sceIcuLegacyUnknown_zVHpQA69C5c_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_zWXkbTqqg58_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zWXkbTqqg58", sceIcuLegacyUnknown_zWXkbTqqg58_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_zY4SBiM0p_plus_E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zY4SBiM0p+E", sceIcuLegacyUnknown_zY4SBiM0p_plus_E_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_zYuuBWEeHFY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zYuuBWEeHFY", sceIcuLegacyUnknown_zYuuBWEeHFY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_zYv9dq9nt9s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zYv9dq9nt9s", sceIcuLegacyUnknown_zYv9dq9nt9s_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_zdFKxyUS_plus_VQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zdFKxyUS+VQ", sceIcuLegacyUnknown_zdFKxyUS_plus_VQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_zdwQUDfqqmQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zdwQUDfqqmQ", sceIcuLegacyUnknown_zdwQUDfqqmQ_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_zfbaslbmYuc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zfbaslbmYuc", sceIcuLegacyUnknown_zfbaslbmYuc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_zgOivA6B644_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zgOivA6B644", sceIcuLegacyUnknown_zgOivA6B644_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_zh9pYpSp8Vc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zh9pYpSp8Vc", sceIcuLegacyUnknown_zh9pYpSp8Vc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_zhMBwQWHeJI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zhMBwQWHeJI", sceIcuLegacyUnknown_zhMBwQWHeJI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_ziXgDOJkgGI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ziXgDOJkgGI", sceIcuLegacyUnknown_ziXgDOJkgGI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_zj_plus_bI9tzkgo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zj+bI9tzkgo", sceIcuLegacyUnknown_zj_plus_bI9tzkgo_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_zjRKro4sFxc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zjRKro4sFxc", sceIcuLegacyUnknown_zjRKro4sFxc_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_zjs5ZIIBqqI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zjs5ZIIBqqI", sceIcuLegacyUnknown_zjs5ZIIBqqI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_zlOx0Eh6i90_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zlOx0Eh6i90", sceIcuLegacyUnknown_zlOx0Eh6i90_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_zmmG6Otbj70_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zmmG6Otbj70", sceIcuLegacyUnknown_zmmG6Otbj70_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_zmxAXmg0bJ4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zmxAXmg0bJ4", sceIcuLegacyUnknown_zmxAXmg0bJ4_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_zntZbHbwwI0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zntZbHbwwI0", sceIcuLegacyUnknown_zntZbHbwwI0_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_zo8D_plus_GelrUI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zo8D+GelrUI", sceIcuLegacyUnknown_zo8D_plus_GelrUI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_zp6cAKKM0MI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zp6cAKKM0MI", sceIcuLegacyUnknown_zp6cAKKM0MI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_zpVzOhv4Ins_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zpVzOhv4Ins", sceIcuLegacyUnknown_zpVzOhv4Ins_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_zqc3B1lvZfI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zqc3B1lvZfI", sceIcuLegacyUnknown_zqc3B1lvZfI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_zsvSU8ak9MU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zsvSU8ak9MU", sceIcuLegacyUnknown_zsvSU8ak9MU_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_zt8eCP3KyHA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zt8eCP3KyHA", sceIcuLegacyUnknown_zt8eCP3KyHA_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_zuOORqVPSRI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zuOORqVPSRI", sceIcuLegacyUnknown_zuOORqVPSRI_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_zuT3a9l0_plus_SY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zuT3a9l0+SY", sceIcuLegacyUnknown_zuT3a9l0_plus_SY_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_zvP6iihpPvk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zvP6iihpPvk", sceIcuLegacyUnknown_zvP6iihpPvk_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_zw4stEd_minus_8Cs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zw4stEd-8Cs", sceIcuLegacyUnknown_zw4stEd_minus_8Cs_nid_no_patch); + +int APS5_VABI sceIcuLegacyUnknown_zzjAIUpprxE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zzjAIUpprxE", sceIcuLegacyUnknown_zzjAIUpprxE_nid_no_patch); + +} diff --git a/core/libs/prx/libSceIcu/Resource.cpp b/core/libs/prx/libSceIcu/Resource.cpp new file mode 100644 index 0000000000..94aa6fe9e8 --- /dev/null +++ b/core/libs/prx/libSceIcu/Resource.cpp @@ -0,0 +1,8 @@ +#include "prx/libSceIcu/Identified.hpp" +#include +#include + +extern "C" std::int32_t APS5_VABI res_getPublicType_nid_postfix(std::uint32_t resource) { + static constexpr std::array publicTypes{0, 1, 2, 3, 2, 2, 0, 7, 8, 8, -1, -1, -1, -1, 14, -1}; + return publicTypes[resource >> 28]; +} diff --git a/core/libs/prx/libSceIcu/Version.cpp b/core/libs/prx/libSceIcu/Version.cpp index 5916903a82..3c55a14e17 100644 --- a/core/libs/prx/libSceIcu/Version.cpp +++ b/core/libs/prx/libSceIcu/Version.cpp @@ -7,6 +7,7 @@ namespace { constexpr std::uint16_t VersionLength = 4; constexpr std::int32_t VersionStringLength = 20; constexpr char VersionDelimiter = '.'; +constexpr std::uint8_t UnicodeVersion[VersionLength] = {17, 0, 0, 0}; char* WriteField(char* text, std::uint8_t field) { if (field >= 100) { @@ -66,4 +67,9 @@ void APS5_VABI u_versionToString_nid_postfix(const std::uint8_t* version, char* *text = 0; } +void APS5_VABI u_getUnicodeVersion_nid_postfix(std::uint8_t* version) { + if (!version) return; + for (std::uint16_t part = 0; part < VersionLength; ++part) version[part] = UnicodeVersion[part]; +} + } diff --git a/core/libs/prx/libSceIcu/Version.hpp b/core/libs/prx/libSceIcu/Version.hpp index 4963a77ed2..7bfee06d7b 100644 --- a/core/libs/prx/libSceIcu/Version.hpp +++ b/core/libs/prx/libSceIcu/Version.hpp @@ -6,4 +6,5 @@ extern "C" { void APS5_VABI u_versionFromString_nid_postfix(std::uint8_t*, const char*); void APS5_VABI u_versionFromUString_nid_postfix(std::uint8_t*, const char16_t*); void APS5_VABI u_versionToString_nid_postfix(const std::uint8_t*, char*); +void APS5_VABI u_getUnicodeVersion_nid_postfix(std::uint8_t*); } diff --git a/core/libs/prx/libSceIcu/include/InventoryDispatch.hpp b/core/libs/prx/libSceIcu/include/InventoryDispatch.hpp new file mode 100644 index 0000000000..e47fb79877 --- /dev/null +++ b/core/libs/prx/libSceIcu/include/InventoryDispatch.hpp @@ -0,0 +1,12 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI sceIcuDispatchUnknown_BufsAiaX0_plus_s_nid_no_patch(); +int APS5_VABI sceIcuDispatchUnknown_xdF5zg0V5Oc_nid_no_patch(); +int APS5_VABI sceIcuDispatchUnknown_Con4H1SB3nw_nid_no_patch(); +int APS5_VABI sceIcuDispatchUnknown_lME28PLmu54_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceIcu/include/LegacyExports.hpp b/core/libs/prx/libSceIcu/include/LegacyExports.hpp new file mode 100644 index 0000000000..c1ec59189a --- /dev/null +++ b/core/libs/prx/libSceIcu/include/LegacyExports.hpp @@ -0,0 +1,2355 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI sceIcuLegacyUnknown__plus__plus_DD8eRY6mw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__plus_0Y71J28_minus_cM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__plus_52eptnQ6Ac_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__plus_77K3m8w7Fo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__plus_DlYbqV7RQ0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__plus_F2HUw3R_plus_7s_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__plus_G4gjAnwD8o_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__plus_G9DDgji4ls_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__plus_LahFsmb_plus_fY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__plus_O_minus_z03nQpKE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__plus_OXoJcXvd0w_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__plus_RRw8HqDZeM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__plus_V7ZusCNjx8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__plus_WCcBu66P7g_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__plus_WqavH2Q4rU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__plus_YVfbpoDbO4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__plus_ZODIUViXvs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__plus_bsxzdIbCaA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__plus_cY02h03xhQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__plus_eNTan5doQk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__plus_hhUuDDqd4M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__plus_ia_plus_SZpGWBE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__plus_kokz5WtzzU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__plus_nYb6g2zJHw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__plus_px0ii5HIzU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__plus_qtvw03UMYE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__plus_rN8EpE5vS8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__plus_rv2q2Va67M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__plus_sWc_plus_Z4PpGE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__plus_tN1MNhj0w0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__plus_uigfKS2jic_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__plus_wZj5WL3zfo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__plus_xUe3qWJH3I_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__plus_yTcUbxieO8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__plus_ydVYIaYo6w_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__plus_zWvRR9TePc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__plus_zt6Z3CTHGE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__minus_1flXphRNrw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__minus_4dhc9m_minus_vfs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__minus_5VmFLmG7EY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__minus_8rPOnonqLI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__minus_8vX2t8cKRw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__minus_9TH_minus_30ItNI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__minus_BjZzTTOnXs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__minus_ClgCo37kUo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__minus_HN1FUTwb_minus_Y_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__minus_IP5f0ezh8s_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__minus_Ig3OXhkUaY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__minus_JE46LEGd1Q_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__minus_JdpmhDLKFk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__minus_ONE6xozIpM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__minus_PUXbMD1aIo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__minus_QoN5MMk6R4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__minus_U6OHKQLYBI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__minus_YnkUO45kTQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__minus_aat1epaErY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__minus_bfgP8FN6oo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__minus_cqxOPlkLKU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__minus_fPpQmob8eM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__minus_jErZVgOKnQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__minus_mNjSBFthmY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__minus_nIZEq0wDP8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__minus_ogBWgqYS80_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__minus_rBq6DbmJP8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__minus_uIJMampTl4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__minus_vuNygTslwQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__minus_wLjIvYzJEg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__minus_wV7wE9SH_minus_I_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__minus_wdxqJNSaio_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__minus_wkkoEzpQjQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown__minus_zgN_plus_ttH3gU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_0_plus_EP910KiRY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_0_minus_olJNtiaeQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_00yrdeXel_minus_k_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_02yqiMxbKKU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_03N9BE6uvpo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_03uaawLzEo4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_06kWUyne1pI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_06lFuBZgFg8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_07Vf0tgcA0A_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_07l6cysr09c_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_0AObz1ibcXg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_0DGoeEvu4Tc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_0GHxanfamVA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_0ICGFGAjfzc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_0IIeRyDSKiY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_0JIoY7BEjms_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_0MTJN5cvZGI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_0NEGEdzvNw4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_0OVoam5Maq8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_0TnwC0nPUXk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_0Tudp8NZ3jg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_0UQu9LKbOrc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_0UgJRpFQKco_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_0WSM7vJVmYE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_0YWzn0WKU44_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_0ZHUcvkrLyI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_0c6b_plus_XCqt9o_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_0e6vZxUFLvE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_0jN58mezFe0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_0nrht0BgxEQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_0pw_plus_YWeLlIM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_0qlsx0u0PMM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_0rZSXuHb14g_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_0scP_plus_RiZ1vc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_0um_minus_QZ_minus_FStE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_0ysbJYyPbig_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_14a9pKEYd7c_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_17AU4VHNGec_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_1AzLgo3rATM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_1B8JLGu62mE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_1DFhG_plus_P0EYM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_1Eovd96K_minus_Eo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_1G1zdxo5KCk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_1JevuWL_minus_iMg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_1LicYZSc3Q8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_1PD0nXtIXJ4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_1QeMhl0kTkU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_1QqT4Qbl38g_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_1WYMrva0udA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_1Zjsilgzlps_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_1ZsyvW153aY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_1bRdTDPYlLA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_1bjQ9GJVkDM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_1fdgrQASVRg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_1fje2PbqEEA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_1g8eVPDkqCM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_1gbTKeDPab8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_1k6Jl84oTeI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_1kBbJxcDbCg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_1nek04WkGb0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_1p0FEYfvSns_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_1pauWHrK69Y_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_1q0LOIFUgeI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_1sUkZWnzYJA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_1tote7KnZZ8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_1uiDWP8AjtA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_1vHTKNSml4c_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_1w4mtKgopd0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_26aHn8ffkHU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_29ENWa_plus_HYpo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_29UZt_plus_Zh554_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_2BbwkVOovdE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_2FzdaDz8zYg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_2J8BwvsmnNA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_2LBrwaWFRsA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_2LG5XuHjr60_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_2MQdIASFIDg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_2NJ2U_plus_r8APM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_2OEoHDMD_minus_7k_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_2P_minus_2TAuqsTw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_2PSYQXpfB64_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_2QSKf7JvliA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_2REynpmGn9U_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_2V6fVvK7DzM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_2WP_plus_PRN_plus_Tm8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_2WjCdmKwlOA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_2YRqfNusLmQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_2Z_minus__plus_jlza4P0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_2ga4PiukfYc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_2kDzl5NtoCI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_2lAenv_minus_SkNA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_2lgT4AMFVfk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_2nhGEJ9Wms4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_2qCRtOAee_plus_4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_2t3H7LAAANU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_2t7JjJuVD2g_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_2v2_plus_PgpIdLc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_2wwoqH2KOxE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_2y_minus_9xpH0F_minus_s_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_3_plus__minus_eXC_minus_sHJE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_3_minus_kL54G6PQE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_31HKveo6ZNc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_31pIPUL8Ksg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_33UUTsNxvJY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_38A9UlubjGw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_39DeDVjJXQ8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_3DhL2Ls0eLg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_3Dov9hmHaAk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_3FHpsgySlUE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_3FXgs3h_plus_iug_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_3Ig7wunK6yU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_3J2cJnDt4IY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_3JwpiS_plus_eIQM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_3KafdPaGfGs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_3M77S7_plus_mqc4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_3MRfGDojJF4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_3Mv4rhuibnc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_3PrhSO6dCns_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_3Ps_plus_hlmBTMs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_3SD7R26xqXE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_3T3S5CJpecI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_3Ty3zLmTy6E_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_3WfSV0_plus_G32g_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_3bI32XONrnU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_3liORHk2E34_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_3ng2Nc7ipgo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_3okGL4Cutpk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_3pliHFvh22Y_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_3qA1USjroSE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_3reaN7bH25E_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_3tJ8UEosCLc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_3tfuPx_minus_8qL0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_3vTFnRNfm3g_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_3xGrCs6nGKA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_3yXJHxARCvQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_400ZbLVPq7k_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_40y5c743WCw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_41Ny9FV0dHg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_45M3NG6fOK0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_46pVr5Vsm18_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_49G9TmtmutI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_49T6Z4UNfkc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_49xx3RbyHC0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_4A_plus_ghLPiPBI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_4AeztwioxWg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_4BUuvbmiXWs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_4CGhCcyWr1o_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_4E2E0V4hg0k_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_4Fa_plus_ZmJ8qn4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_4Gy_plus_uvLI20c_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_4HO90IKdeCU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_4MAf3f9YAp0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_4TCICEP2ap0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_4XwsW1cV91w_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_4Yna719ts4M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_4ZnLb8onM_plus_w_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_4aggYAZbAqU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_4d6jiNn6CKI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_4d7T8Td75_plus_M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_4gxNCnf2pYY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_4hbdNm_plus_cRu4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_4lqHnr_minus_vIUE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_4nV_minus_ejO0KIc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_4rJkixSlT4U_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_4sD0BH9dn0s_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_4u91SYQzJzA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_4vqjI8gmXP8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_5_minus_CVJbmzRFE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_50zuUppOUQQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_52WUgTwyH2s_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_53HddFGzkKA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_552Oh3lsLHQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_57B4p3HC1us_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_57hBP8lBBC4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_5AKCnEfGT_plus_Y_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_5Ag8q0zzoo8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_5AvS0pXujVk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_5DSaJa2UKUA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_5HvAGuMPFgU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_5KHYziMl9Bs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_5N_plus_D61hLy1Q_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_5NBMAeDDAR0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_5Nwi8pVhpIY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_5OB7GYcEOzE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_5OpUyueKjdo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_5PWa4hFDg7I_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_5S_minus_OvM8yw9I_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_5SpzTlcpsLs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_5UYbef67h_minus_o_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_5UgPm09wiZQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_5WCOijNlG2c_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_5XZt1PoqjVI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_5ZfH5ACb6N8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_5bcZomziXao_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_5cYyEu1Ka2Y_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_5cvU1Vq46XI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_5fC5WIiN_plus_Ac_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_5hMEsk6LsJU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_5i7kNj3aRSQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_5jXnzyO60HQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_5l3u5zIaF1w_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_5lsofcKpsOg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_5oePUQeJ7dg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_5q0suac3C_plus_8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_5s0ydPMO0f0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_5tc_plus_6cE9fAc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_5yoxeYXrdUE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_5zXCzWZhwaQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_6_plus_Jj2oxVAFg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_6_plus_Yy8QFHM0c_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_6_minus_jAY7vwHws_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_6_minus_tsk3uHsz0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_60IMrY75T6w_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_661mp52xIO4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_6678fYDS57Q_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_68Pa3zZZe6M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_68uKzUhNGcw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_6AYtfmV_plus_2PQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_6AxJTT7_minus_yKA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_6Dr_minus_30Wd4bA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_6E6JYwebVac_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_6EDEhWJtJAo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_6EkmAWp8AnA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_6FQgKV7rOxQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_6FXFOERWLU8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_6HStelDKW4I_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_6HratGh9IeU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_6IbM4WFRQAQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_6KsOlzLtoaE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_6PXF8T3sDmA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_6PiboOUBRro_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_6QCOea4SMrg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_6TEwaLqQl_plus_A_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_6Y1aFRqHq7I_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_6YIq5v9QLDU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_6Ym9UeRkaGA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_6cS4iJCfY54_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_6d2qHvGiaRc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_6dsRe_minus_93_plus_zg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_6f3orOPOKzk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_6ibhL52eSks_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_6jtnn2CzF7M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_6kSz7BOrmC4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_6n74pmh0NR0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_6pFpST8cU9o_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_6rJZBIQciRg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_6xJL4Cvolyk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_6xNf9CZzvyo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_6xaYtwoW8Wg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_6y8CT24mFXo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_7_plus_9niSP3jos_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_70ECiskwEoU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_71IwI4r01bg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_71Y9irgGVgw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_732IbgavIZk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_74lCQEHofHo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_77xMg_plus_CSeHs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_7AhaW9gPUnM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_7Al54_minus_CaiIQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_7CcAXnzFkDE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_7Dhc9qs_plus_YIc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_7I5J3V3hgog_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_7Kxay85raLs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_7LND7zUihtA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_7N8TZmK_minus_LZA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_7PBdP6SpMns_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_7PP6pGZZ_plus_gw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_7R4_plus__plus_kOV_minus_N0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_7TfP_minus_C2I4rw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_7WrMwuF56JA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_7XV6f9Fjnx0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_7Yt_minus_ZIgpucA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_7Yu1Zo9FRn0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_7cxI38mtQ08_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_7fk62cdEO4w_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_7g4jfloBz1k_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_7gjI7c2cfdY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_7h6igtOa7zc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_7iNXtJji1iI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_7ira0NBxeqw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_7kJ1QYHAhPE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_7lEIR7s7iZ4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_7lG1GjeY6qI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_7ql_plus_sS_plus__minus_xMc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_7sukzrX_minus_FQ4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_7wGcSRiXMG0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_8_plus_IWPUep4uY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_811wPbi7A_minus_o_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_81eO_minus_evrZWU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_82gGpLMB0cI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_84YgNF2FogE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_87TnfVuck6Q_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_8AZHHqP1m2U_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_8Cqqce1jSQQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_8Ep9u_minus_baSZQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_8GdurDsJStk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_8Gk3lVH9ND4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_8HuKEhQV0OM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_8JF4eKESi8o_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_8KtiLiHVP5k_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_8SDSnWjCMB8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_8Sf0tJXMvqA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_8TrUtRVIOqc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_8V2Mt5IsCk4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_8ZVOe2sQhkc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_8aU3NyhPctc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_8cn1NvshDFo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_8dCD8H6qJFg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_8h9vn9x0sa4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_8hwlSdw8tDg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_8hyc82K8VzU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_8i27jUlPpDo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_8jpwdm_minus_hWDI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_8ktMvwA_plus_Af4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_8n2w3ligC94_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_8nJBCqN7T2Q_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_8oOHKSj5pbs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_8rWf7DugFKg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_8soSyGENbQ4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_8vRZXqTxKUc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_8xcPcZc2Gh8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9_minus_B9NNEHOwM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9_minus_k_minus_p8La1i8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_90djDyTuFX0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_91hUeemJRgU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_91hioCaDqk8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_91mpdjHGIP4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_94b19T7_minus_7Ec_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_954XfGJix_plus_k_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_96xtoeyxeZU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_99itJwBBSz0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9ALKSU8dWTA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9AP4jjDiIFE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9AdVLpFeSYg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9Ayn5JW_minus_hMY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9ECaj_plus_42WkA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9FXXqYxXV_minus_Y_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9Ff7AijH93g_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9GynEoaxy9Y_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9HLa4YDjPwQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9I3Z6Okr_plus_Mc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9Lwt3RssOw0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9Mm4kLQVpJ8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9MqmXgb8ICQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9Ng5mQNCtBY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9PG9CfYmwEk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9PSkXP76LW4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9PVNcvBLDwM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9QQacZyFYhM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9TWcXWV8SM4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9Uu_plus_edYJIjE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9Ux2N_minus_F2Nm4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9XT0E2eroig_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9XuLv3vss_minus_I_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9YMKGv_minus_fNys_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9Z_plus_29sFbhtM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9Z4QCM3w9VQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9ZPptEj2pvk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9ZfkrRTKFCI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9aQBNagjgcM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9bP_minus_kPBX7UA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9dc1eU7dlJs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9hMhu0fnYD8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9hTY5LZj4fE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9jSuWQLNQ9M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9lpxzQHrojk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9qWnGhrFtdc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9qZNdB_plus_2Bc0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9sXRmxOZtsY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9w3DvL0N2IA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9x1HY0NICVc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_9ylasLJoZF0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_A5tRF_minus_v_minus_SWc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_A7vb06DjJUY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_AATyPI2mYE0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_AAlYzrIHdKI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ACCS1U9GP58_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_AEgbp5mPotQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_AH_minus_OkiuxWa4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_AH3nKkO3JTk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_AH9JGN4NkW4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_AHPZ9F1d1o8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_AHzY0XSZy98_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_AMFbHTY2CMk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_AMyB2pmC9v4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ANyrhk_plus_mOQ0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_AOK58KP9tRE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_APpwW2j5C78_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_AQYQEk1InJg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_AWzPZ6bpeAU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_AYqtGKPyiU4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_AYrSMjttAU4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_AZJPxauew_plus_A_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_AbE0PCISyLo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_AbKBXXHa_minus_Jo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_AfpzINLrJ8M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_AgPFrfHPJNY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_AiuJezekCBc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_AjEm95J_plus_bh4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_AkagRSm3Yyk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_AlDrgNSVs7g_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_AlG1_minus_3ezfeU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Alomt9kVI94_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_AmLE6IwHVKM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_At5PrLwwLIE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_AtmDJNcrTd0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_AuRg19KxWco_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Aw_minus_0bgw1rpY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_AxbB0OiJwuk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_AxdNnn5ChtY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_AyZV_minus_o2NFis_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_AzTARWDb2zs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_B2egWGluTcA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_B3HBHmrUxXM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_BAaDCGRLujw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_BBY8MS3YeVM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_BCNFIPx_plus_MUc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_BD3I196Tksg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_BDxMeuepwsQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_BEdyFFmUB6Q_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_BGtQFItjoOI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_BMGP_plus_0SSwsw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_BN_plus_Ns_plus_V0xq4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_BNaPsGgSVpU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_BO0DkVp2i7A_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_BPzTxU_plus_gLrU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_BSpOFYioApw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_BT2XtMb0Z0Y_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_BTYflNjQB_plus_E_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_BVS3_minus_N8Xakw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_BVaLa5GxEIY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_BZss8UWu4UE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_BalgMpFXM90_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_BbBIUZLGxVw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Be2atWczd5I_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_BegIPDqtqKE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Bfv9xhnKHpc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_BgfvML1gcLg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Bhi9UPjI_minus__minus_w_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_BkO15T_minus_foqo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Bm6ltBBY5dU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_BnZ46zXPc8g_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_BoI_minus_K4iN6Pc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_BpZBr1QqKRE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_BqGYRCWDdCM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_BqvSrPQCTcs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_BuC3ARyjHBs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_BvgmG8ZqCAk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_BvtFZdpVpkg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Bw5Sglh6_plus_Js_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Bz2aeA6fU_plus_c_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_C_plus_RMDbFOVmg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_C12fbSrJXes_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_C2NTqZ1au0s_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_C2lC51ZWaIc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_C4ksb8TTkME_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_C4tEEnVV7LE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_CA9_plus_P32_plus_DwY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_CAetpPL8Em8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_CCHD3yfdDlA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_CESNUhb33pA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_CEg4Zlknm8A_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_CF7_plus_t_plus_JIOEo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_CGiYasyLWgc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_CHZEbSUX4o4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_CIYcDrsCfPE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_CJkitLFH_minus_II_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_CKWBRdmB00E_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_CMpktp_minus_bRAE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_CPxo0YRjsfM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_CRL6FxbZiVs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_CSWPy4toO8k_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_CUtn45GS2M8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_CVT3PuSQdgQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_CVpF3V06eyI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_CXGpVVmL6jo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_CXfNvRcFMMs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_CbByUISOl28_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Cc1lge6eNeA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_CdUWh115gSU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_CdnnbByeuSY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_CdqL8zAUzlc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_CeRYvzs4RtY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_CeoaZ21WUxI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_CepeHuHB_minus_RA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Ch_plus_WYJ2Ju0M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_CiHiAKI8gN0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Ckux_minus_2zYc0Q_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ClXDatdTTy0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_CmZE73V_plus_9QY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Cn4jLW8GJbo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_CncgR7C_minus_UUY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_CoyVOlkpxY4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_CpQ2_minus_ykkw_plus_g_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_CrHm8ueBDeU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_CrWRhCMUKg4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_CscMPVMFQ6c_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_CtMEsoBvzO8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_CtbKEfqw_plus_g4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_CvGSDiyU_plus_DA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_D_minus_Gb6nw3uTc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_D0Jhk501qcw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_D2eKAhL_minus_NwI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_D39HIDr9dtc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_D3Wqrcq6Mbc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_DArdMok4CAM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_DCVdYpWxC1I_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_DHi_minus_7w29ie4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_DIamEz31l_plus_g_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_DOYn8Nx8RwA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_DQwurb1sT0M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_DRijPfVa8KE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_DRp_plus_938Wjck_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_DRqTDtjF_minus_YY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_DVKY4CxzYiU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_DWDxIHS0_minus_ww_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_DXmUQd4t3k4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_DZBfePfwL4M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_DZId6VHoc1k_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_DbMyiPBebPw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_DbYWYOMtcbQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_DcHjQjQ3icA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Dh08HOJ_minus_BSc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Dh30sZ52VPc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Dl8h_plus_qpuGN4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_DoOfWIzlOxA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_DpVbD395FfQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_DpmBNFoQ_plus_DA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_DrcakZgJjEw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_DuHMvVjEOdc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_DwfnU6fgppE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_DwlyaFau3Ho_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Dx7uEgs8hbE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Dzd6aATLtBk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_E_plus_U0VcSwzJM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_E_minus_QWJoRAvIo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_E0LkqGLRnSo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_E47_minus_qFyG7HQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_E4ns5_plus_phHrA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_E5eImJ6I_minus_EU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_E5tRyh_minus_Y8co_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_E6LIAV2URgU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_EB5ztY8iHko_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_EDaHE_plus_9Yl58_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_EElwuCeOLGE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_EHd_plus_d98UQZA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_EIA92XcP5EM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_EKOgh3juIbs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_EM_minus_Uot1fIks_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ENKm2i0IIrw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_EP4H61QZyz4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_EQ_minus_yMC_minus_j9YA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ETe_minus_1lbGXwg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ETzWYbtluqc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_EVPd1F3bTBk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_EZjcSZkNsJg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_EddN33R45vc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_EeQHYoXi_minus_kQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Eh8B0aqweD4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Ei1Dn07XYs4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Eimwqcq37dM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_EjNzq35p1yo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Ek908WJyC3A_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_EkI7xPMdJjA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ElxN9dMnmv4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_EmCemkyjsGU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Eq7evA9obrg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_EqeGKk5_plus_168_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Equprw_minus_ihwk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ErBCp3pvQD4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ErHro2ULX1M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_EsB4_minus_0_minus_aEyQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_F1Ci8i085wQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_F1e57T3cT0o_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_F2SOocy4qmw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_F5LbzYFdlnM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_F67KEzUNLTs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_F7lEldyoKmU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_FEeSX6k_plus__minus_EQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_FKsWoTORAOg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_FLdhwv6GhXc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_FPfmwCfcBV4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_FSNu0u7QyRY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_FVn20_minus_GjG3U_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_FWI5xWiQF_minus_I_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_FWI7gYi7Qs4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_FX327XZrTmE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_FY_plus_GgwojVl0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_FYtGwAUCrAQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_FZUqb7ZwIoc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Fako2QRRBfc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Fb94eVIlvVQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_FcSOmvkUdPE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_FdKvwn4suqo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Fdkc1XcCFNs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_FezCB5jgsi4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Ff1iFY4al1Q_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Fgetq7dlxmI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_FkavOYLbvw4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Fnttd0Mqbwo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_FoMTASl07eo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Fqdkkb9sHiY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_FqtwM9SeBYc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_FtPJR1_minus_V5eQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_FvZXeAR_plus_4Tw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Fw_plus_x3WWhA4Y_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Fyya2CVCjdQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_G_plus_p7q_minus_YT24Q_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_G_plus_pVNh_plus_EhL0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_G_minus_zR_minus_n8eybI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_G6zL5dfxfyk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_G7YPVQ_plus_fZKM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_G7pJXobYH40_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_GBf3S_plus_lhS1w_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_GBst_plus_eVK5Fs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_GCHsSTNNoJU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_GKQDVnl3hCk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_GP_plus_O5CQRAAI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_GPJmzssza_minus_M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_GPioTjFYKXI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_GS_plus_pgxPCaN4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_GSMlEoessLE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_GUTMYZjJhNE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_GVRUXVxoFWE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_GWLdxnia_plus_ZM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_GWjCpRNGl6E_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_GYOMfi8ybUI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_GYR6aHwlcaw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_GYTAGzLGs_plus_Y_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_GcUoh_plus_QItqQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_GegAfYIaBv4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_GeuaL3voLxo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Gf8Lm_minus_MtXAE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_GfJNDMsBEAo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Gfbag_minus_ObqvM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_GiNVKomoLHI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Gk0mg_plus_4tTUI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_GlGVUa5j1ZE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_GlsvFhFemB0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_GpmKB1mg0yQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_GspQ6dz1PU8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Gvofk1RGzaM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_GxMU_plus_C_minus_ybfw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_GyQvtJfBhxk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Gyq97Ojep04_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_H26cWBXW184_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_H28AdAGo84E_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_H7aYtZJ7_plus_XM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_H93VAvi0zXY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_HAQX1zQ1hys_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_HAfqFiUv_minus_y0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_HAuBG_plus_Yzjus_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_HEbrYbKnE98_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_HFNvo_plus_lEynY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_HKR2Z1lI1ko_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_HLpfF36_minus_Y5Q_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_HMK_plus_bh_minus_O7_plus_o_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_HMhS3h9I3Fg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_HQry6lK7gZg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_HRAiRmIYtEA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_HSD_plus_wDNUC4Q_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_HW1bq1B94Wc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_HWJN_minus_1_plus_T_plus_Kg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Ha1woAICuGM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_HcuwTwRBS94_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_HifZRvT1spM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Hj31N2JSU2M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_HlWym_minus_QtxMs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Hn_plus_eP_minus_10c44_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_HnFsbVl_plus_5HQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_HptHGYgcyGI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Hr5hHw597E8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_HzUnZGfHhrQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_I15TaVspT_plus_c_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_I1SOCGoLiKM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_I6GKVz52APU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_I7Z_plus_QV4pRtM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_IFs3Q_minus_7NeWA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_IHG6v7ticAg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_IIIJruK0CGs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_IKoxEK0uuYw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_IMf1gsk4h4w_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_INEukREU21A_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_INbKhQczj9s_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_IO_minus_F9H_minus_TWxA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_IOehwgJbi6k_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_IP01q2sc2xI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_IQ_minus_21YxarGo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_IRf9HvKqkeM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_IUX1D2dfZGA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_IWu_minus_8_plus_2bLeY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_IYbUhxZNmBg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_IZ23C5wrPu0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_IZMlz_plus_AdIgg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_IaB0eRggZAo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_IanTFc9GOVU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_IbHuo19xGVY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_IcfE79RIR4E_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_IdD_plus_BmsNc44_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_IdI0gfFYiDU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_IdxOBVfiVLk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_If0WrZVmgJU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_IgQF_plus_ZfzGuE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_IhoS6n3hVAI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_IoNHhprXb8k_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Iu5YSMuAlYM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_IujaBegS7U8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Iv2gq6GySGc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_IwvVv7Ymdpg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_IzMah3NMgUo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_J0Hb2lTb0wg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_J2Iuz2m7sDA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_J2m6GA6ENpY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_J3JjYmGmtg0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_J6sbFQ7s7u4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_J7Cw18z9W_plus_g_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_JAWRJyANNUg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_JEk_minus_dOvfg3w_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_JFVDfLUw4Zc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_JHxa8JiPmdo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_JI_minus_0NqOZkRw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_JIR7FPmNgAo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_JIWNw5ji_plus_iA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_JKhKXK6TANE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_JM5BQOowh9E_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_JPUUO_plus_5XGgA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_JPysw1EVb2M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_JUu0_minus_1OqEro_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_JZ5yszZEFEY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_JZk2NwEVM1U_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Jah5ajjD_plus_qA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_JeOBsa9XvZU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_JebefXW14GI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Jf4entCVZCU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_JfjfrvJ_minus_C8s_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Jj_plus_wF0R3jVQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_JjEnc0UEf1Q_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_JpxcMELea4U_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_JqFe76va0po_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_JupuKA53kOo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Jv37SQyYn2A_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_K_plus_5wO2j41kA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_K_plus_wRE7USXXg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_K_minus_41pszCv_minus_w_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_K2b9BAsHlUU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_K2cFgHHJ9S4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_K3PULDvimho_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_K4zbmpk44h8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_K75PQrTqIys_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_K7hr7FpfeQU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_KAIJx8ooGyw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_KB3LMUXQ93Q_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_KBiJX7uBSwk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_KDfl4uF3qLA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_KDgIQCEOWRc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_KInRyRtlgyQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_KIthnNHYOFc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_KJtZG_plus_ElX_plus_k_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_KK7uwBYGCVA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_KKuSC7kIBKM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_KN7v5BD_minus_XNY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_KO8GGqFkytk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_KVKa5_plus_wS_plus_30_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_KVUeCjQZJEs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_KVtXOV0OSEo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_KWRIj1nwZLg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_KYZNNsnfK_minus_U_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_KaAs04Omkgg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_KfkJGR3kv5Y_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_KkKMwY814FY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_KkQWf6HzHrQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_KoNSBcVXz2Q_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Kos3ziZAkOs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_KovIXY7wrnc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_KqHLl7_minus_V8Bw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_KqkTmCmqddQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Kr8Q8xo3B8M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_KrVvNUl87Og_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Krr2_minus_TrnIYE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Ks0DybWzY3c_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_KsteWFxXXMk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Ku_minus_D_plus_t4G22c_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Kw0rfs6PoyI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_L_plus_V3HR8yPRQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_L0RiuMvlZRY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_L0ifl6CL5qs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_L2qqjRb7Ufg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_L3KZqUc_minus_gDQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_L4CoSJBSxQc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_L5munwxksjs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_L6Xfm2Diua8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_L9fV3S2_minus_iU8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_LACXLQsbIrY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_LAem21NWI48_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_LBcb0QSFZqg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_LEkJXXGOuHM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_LFnGuvXO7tA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_LG7qiEu4dls_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_LGf6giFRCYc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_LHz_plus_LvKSpC8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_LNlDAiLcUdA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_LNoqfkCKSbM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_LOibXDuc2xM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_LQXvpa1j0gc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_LRPd_minus_7N25a8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_LRSYSJctgHc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_LRfUdv7qP9U_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_LW7Jgpp07Xs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_LYLtEUxjh30_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_LYdVoWZ5u5g_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_LaosADlUoL0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Lbl6TNS8Zbc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Ld8vUQ78vY4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_LeUSfXmt5pc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Li5hVTvoIq0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Ljo43aARSI0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_LkxAmKtzXnQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Ll0Ae2mHnws_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_LqE0Mr8ZX8g_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_LspUICRVlKw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_LuZV7KompTw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_M0Jx255A3Mo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_M1eUUTg_plus_Ftc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_M5i9FLLxblE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_M5mQPzN5Ra0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_M63i58XoLaM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_M7ZBa60MsrQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_M7ZzlDi_minus_pH8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_M7gBQBYsxjA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_M9iCKC5Bd24_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_MBNgOH4bLWk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_MEBzUOmftn4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_MEcUxTGpWFs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_MG_minus_v0P_minus_a1MM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_MHxBljq_minus_NoE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_MLXwCWvokGk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_MN0WbuPuXxs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_MPMZS7EM9hU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_MQuZ4MzYvZw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_MR8hdthuITw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_MRFb4OAPRh4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_MgIiQHL1nG8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_MgOULDsmF9I_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Mgt7OGGL2ks_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_MimkniqIX_minus_U_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Mp_minus_ed4mVBt4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_MrRSiZh3Rvc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_MuT_plus_DQN4tq8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_N_plus_M61OMzIYw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_N_minus_TkAdsDzsE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_N_minus_varN7jC_plus_k_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_N0aSloOtG_minus_U_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_N757y37H3kg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_N7JkETORE2E_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_NAXVsQUIzpg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_NAjdfYSU_plus_nA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_NB5FtweNAbM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_NEQb_minus_FxvCOk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_NJ6il_plus_VCsWA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_NLGsPqTjKbk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_NPm7M9jBotM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_NSO_plus_H045MLY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_NSVDU58E0hQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_NTI0TddqtR0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_NUNZTPajen8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_NWwYyioNHuY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_NXFksW1Q9R0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_NYUgnlAwsbE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_NeyR34Tm1Uk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_NiYYnZSvraA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_NkYzPGeuIVI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_NkfQovJsvVw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_NlW2FYMHi6U_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_NlZPkTwdapU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_NlgO40CIaSU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_NmrbXIkGfXE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_NnyxquMLrYg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_NvJla4dIB_minus_Y_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Nwd5R6GbF3g_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_O_minus_3ISZkWmqY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_O1AKXvnt5ME_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_O1bbepDkvus_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_O29beVrfByY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_O2OnJIoLIaU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_O335dKhiuAM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_O3onBkM_plus_s00_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_O4trU_plus_dXByY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_O5NQ1vCKL2A_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_OCWP8GdBkA0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_OCjPaqrINAc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_OEDiYHbBsBw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_OGsAG9sZH5s_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_OHa5kEg4yPY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_OHplS_plus_3Erdw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_OI0wiLlbUfU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_OIl3XSM6Vv8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_OJTzfPrCznk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_OMFHJyAqrik_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_OP7lBNwG1ds_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_OSoQsh3_plus_xeE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_OTPnYDhhtL8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_OUNV_plus_YG4onk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_OYIsVY8rPo0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_OYlZo_plus_lzJew_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Oa7_minus_ORUW07c_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Oavmk5bh4b4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Obpp_plus_5fUIEU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ObwzLI6lyr0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_OenefAIiO3o_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Og5tvEt3WEA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_OmRPdhXIoMc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Opz1C8EZDlU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_OqNHsOrRTdM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_OqjQgnhJ4EM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_OudedZ6XQT8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_OxIG2zZW0Kw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_P_plus_QOsZCRg1A_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_P23_minus_YeY1qtM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_P7Iwi4lX5Z4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_P8db3_minus_BSRYE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_P9o3V_plus_9nJT0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_PBFHhmIPNgY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_PD49UhStsJI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_PFdxNGHYPVg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_PFz6YnZRRjQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_PFzEdRibnT8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_PJtYzlSnrxw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_PKV_minus_sUiGhmU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_PLZ_minus_4VHBXKs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_PM_plus__minus_qdc3ZUk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_PM0QT9XMliE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_PN_minus_GmlJsZD4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_PPP_minus_EGQo_plus_oo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_PQWUxIuRIx8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_PSc6Lv62jyg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_PWISzM92NSI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_PX4U4igNkjo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_PXLnkfscxNE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_PXd75hGLMcY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_PYGSKRplzLE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_PcYjW1H4a_minus_s_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_PcaAnlmxf94_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_PctbuBEKWXE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_PdtW_plus_bHNlcU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Pe_minus_ta4h9VJ0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Pe9haS0YqKY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Pea5VQZ_minus_O5Q_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_PjAWvMoUuwY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_PklK_minus_cEJBgM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Pl2dR3FmR24_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_PotTo8Ki_minus_tA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_PpGttpUbT8k_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_PrTDL68Pdfg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_PuLoqDSNPPw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_PvsbY_minus_71gOs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_PxlmsPnf_plus_Nc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Py8YS1tOPW4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Pz_minus_KG_minus_xEyoQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Q25_plus_6thIS_minus_s_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Q3p9YTXm50U_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Q412Ms_minus_SVOA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Q43sXfepS_plus_0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Q4SpxJlEPFs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Q6TLj9e9k6E_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Q7k2GknoBY4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Q9SoBg_minus_fA5Y_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Q9b2pE80yXA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Q9iWC5cyPPU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_QAtfWx6KREg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_QCfjI087HUI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_QDhlB11wVSk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_QDzm7SL_minus_4So_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_QF0MnNtuTzc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_QFMXoOFv2wQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_QFhScoCRg5s_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_QFpoqRAZMo0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_QGc21vGbU_plus_c_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_QGiXe74ORGM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_QIM5rKGsIxo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_QJwd1wxTk4o_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_QPrUtwNPGhI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_QUEWShIg_plus_xM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_QVKPW8w2FJg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_QVWsX01n08M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_QVxv3QrB2vM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_QZbGw27ZKRw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_QaauH67Wek4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_QbGY8o9qIRQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Qep9CzIdxIc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Qet2dO4FNbM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Qfad41eZrts_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_QjkkOo0rsYg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_QjuRBOGeWLA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Qkf6sv1EaJQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_QmnKtuA7_plus_qk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_QryKIm1pddE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Qu0xzEF6skM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_QvmoVAI3Ssg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_QxqHw1bTPpg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Qz6OvvsSneE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_QzZUHl7iUUQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_R_plus__plus_t24b2vZY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_R_plus_USPI3FhEo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_R_minus_26wEAR0KE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_R_minus_IGqgPKnmA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_R1umz1ZjrK0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_R1y2_minus__minus_hQVMY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_R2_plus_u4Jd0WSM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_R4QTqeddIH8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_R5kS2YcFHgs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_R6zfrGanPE8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_R9KfptVxClc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_R9MD1aSzIww_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_R9VpGVJ5pQA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_RCQ7Ad5OcHU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_RD5_minus_H7ok4G0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_RF74pnu5f_minus_c_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_RIGuHTTLVwI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_RKPntPwRVJ0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_RKb6zm9UiMg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_RLsOwzAVkms_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_RMa_minus_RssMQPo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_RQks_minus_7xBOzw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_RV_minus_wOVAbzAg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_RXBUX0DSi4A_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Ra_minus_dDlmR6ww_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_RawxplHcKrQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_RbSW8vsLHy4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_RcrMekJ6rHg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_RdoI5GFNv5I_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_RfrqmtAotx4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_RiAyC7qKRko_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_RlDX8OKyzIs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_RqjeXZhdFqQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_RtesJX_minus_8Djk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Rttr2uVv9xA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_RuOU9dUyjLw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_RzTwaq333ao_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_S0kDm_minus_BCXLQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_S0pbmazNMOI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_S1K09W3LZCM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_S1z2_minus_HnSbGc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_S2jOUuDWOkc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_S4ykVJc3FuQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_S5kn7MlW1R0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_S5wUrkE_plus_I_minus_E_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_S7JSTuqsMMU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_S7WyAcV434Q_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_S7fe1Y2DuhA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_S80YBBKf1Ac_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_S9_plus_48_minus_4_plus_2wo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_SCdJjf8U5SQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_SFMU423YB0o_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_SI3V3I2C_plus_JY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_SIYy2TfsMvQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_SJ97XSXofJw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_SJKtkxLFIU4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_SKZargS_minus_JLk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_SN0K1oGtYcs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_SN4AcugB4Lo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_SOHunSDwYwA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_SOSJyt82sVA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_SOrpFAYQTu8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_SP9rMasauGo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_SPxBgfmpwGc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_SSEIovOWKac_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ST9AlDHhLlk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_SV2dIx5VGAc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_SVgE7KgNewk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_SZ_minus_Opikuens_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Sb_plus_KkkrptYs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ScvuwuX4CIk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Sg_minus_CohkNgW4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_SjZwsoDk9zA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_SlKp2cqAfMU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_SlOncSS_minus_F_minus_M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_SlWBTy29_minus_S0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Sn0O6JtaGD4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_SonsEmp2Hxo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_SouzWxGpDvc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_SowrYASQw5I_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_SpBYByK_minus_poI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_SpYFGOWB7pM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_SrZAc_plus_R4bHU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_SswKj9uvsFY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_StIh3ARXDvs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Sv8mD8xrNQk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_T_plus_YBwcxaJrE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_T0Ky0xdCxAo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_T122Lalytmc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_T1lN_minus_HZtmcs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_T28HUwuSLPI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_T3N1eGnTZyk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_T4J7pya_minus_x4c_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_T6ag3Y1irpk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_TCsDdypa3rA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_TCsn3PJcG78_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_TED5T0OpJ6Q_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_THYSpvC3tBU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_TIobWRBQrTk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_TLMMUnutCuY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_TMkXGsxzbNY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_TOB1ZM3vh1Y_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_TPYvKkkXlVg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_TQJDT63WFzs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_TQQnhBnCBJY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_TT_minus_E3Wna3O4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_TU1vyo33xrs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_TZ96eGr55CM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_TbO9XCCGKCI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_TbVO1SJy7vQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_TcoOrwDD83w_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ThE7tNT465U_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_TixJVW5LSt0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Tl_plus_4cztRRGY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Tl3eqqHdVi8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Tl4BYiXZbsc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_TuExC_minus_Sja8o_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_TvActQ7R_plus_7k_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_TwQg4k8PWYE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_TzTAzAs0BSM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_U_plus_2ZqEkpDJU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_U_plus_K0Kv7v_minus_Hw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_U_plus_Qljz48RIQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_U_plus_ztaGWf924_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_U2_plus_GS7yk5qM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_U2X2Jn1B7zY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_U4pmG6z6WyQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_U65pCPANVPs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_U7Le5Pe7II4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_U8QCcEK9mcU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_U8dzzbJxqi8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_UEtioabjkYw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_UFWP11H6EXk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_UI9RDw4_minus_s40_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_UJx_minus_eyL5K3I_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ULBXNgi_minus_LKs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ULmQDELpYyA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_UPMUIWZL9ik_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_UPr0g_minus_dqMUw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_UR53llRvVU8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_UWKN5mHFHg0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_UYE9h9WG_plus_UI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_UYcN_minus_kKZsis_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_UZr55KeYRsg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_UaLsDPXyFiY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_UaxqPKFDxLY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_UbuzZZlVxys_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Uc0s1YgeTo8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_UhSI5QqNY7M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_UhTHf_minus_qYOu4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_UiEFQ25ESqA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_UsOe37JWSYQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Uu7eiKXsKvI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Uza9p0sRpuA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_UzhfWiLVNTg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Uzr5kKRl87Q_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_V_plus_S1YZptqkw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_V6IEgX6fu0I_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_V7YMgrTQERg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_V9up2Gy6Z28_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_VBisVJCbwCE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_VCQ0G47pkEc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_VCXSaiAKRng_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_VD5o6kIMIEY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_VMJ2Mhseaak_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_VMWgNeCyEtQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_VPGCKI2cOKI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_VS7WAl_plus_bpls_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_VSbQfegtoQU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_VWM9mDH6GBU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_VXBcu5pYBF4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_VZrw4AgQkn0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_VacWecpGrvc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_VcKIxG10J3c_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_VglHucBfTu4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_VhS8JK4jUcI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_VnBpPEefyl0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_VtIZ6eXtuh4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Vu86E_plus_iLcB8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_W_plus_WBFLm9J_minus_A_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_W2pzEcCD4Qc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_W7AEl27VD_plus_o_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_WClCeFjJuRE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_WF1HJhXLhGs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_WFtc9UPJ7to_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_WHZWnBwk1QY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_WI3JNZKsaaA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_WIfU7UI7Cag_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_WJiWy3g2SOg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_WL6SpH8LNlA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_WMwz6jbOdME_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_WQ1d_plus_mSnIns_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_WQbbbeibis4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_WRx5wt_minus_XPmk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_WXYlroAVMGY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_WYZh28ILF2k_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_WZ9vkyIyxLI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_WaVmOqRC0Qs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_WdCwmDiTuFE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Wf5woiuN9RU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_WhESSNwlm08_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_WhxoT9o30p8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_WiI1Xhxmhj8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Wl4iFeKAqww_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_WlYNCAlZVpQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_WlmCWJh41Ik_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_WnbVnvSPKXE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_WoUHWBJcLr0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_WqYlfuHTlOA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_WtqIH1ArSCs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_WuAPUwIvKIo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_WyjerIFpJ6A_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_WymRosuh07Y_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_X_plus__plus_EgTQvxIo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_X0efmTfZ9cg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_X2UKYjIeWY8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_X2kEvJBix2Q_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_X2n_minus_Xq_plus_yisw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_X4id7EaSkcw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_X5aeECuY_plus_OA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_X69kV1omtSU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_X88JXOmaenc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_X8omkSsHJU4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_X9MXfjKJS74_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_XAzUv4OW3ko_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_XB4m_plus_USaFdg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_XEd85nz_plus__minus_5g_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_XJZ5dBSKGm0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_XKq967nGz3k_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_XNNb9U8P_plus_bM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_XNUmN6q2chw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_XNthAT3b_plus_LI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_XRDgIlxw2K0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_XUT0dUajUrA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_XVbyMlbIiZE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_XW3wEZX81lU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_XWCVSiFPVtI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_XWQ8IZE6tS4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_XaJawsCDMEY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Xaym0bZsDho_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Xbff4k1ObhE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_XdMbt2HBVIw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_XfxCiapy168_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_XgmSiFjC8K8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_XitLrAaVv_minus_o_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Xjtk_minus_e0EJQU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_XlTthkPHamM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_XnbrgRTCcoQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_XoKXlFJdW1U_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Xoe2zSwHiZA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_XokVE7uDeBg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Xxi779NipFE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_XytZY8RtFrc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Y_minus_mzSGj_plus_uzU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Y0u2cCMBx0M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Y17Z6z1Tweg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Y3iG3lgYqic_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Y8N0YYVVRlU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Y9jdWI3QUnU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_YCUKByLHrKc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_YFl7BiM3B6E_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_YG0WJRCFcq0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_YM0FQVcy2oA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_YMaT7OAHdMw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_YNG3_plus_dqpMVo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_YQ73I81XKXI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_YQsMoGDsyS0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_YR5_plus_axTbrP4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_YRj_plus_P_minus_F0q8E_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_YY9uDTY0pHk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_YYD9skAeWmY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_YcyQqYdAoBg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_YeP4G_minus_rHOIw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_YizUB2G34EY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_YlG5XnE2pCA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_YpmSTp6TxcM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_YqtCaapjg_plus_M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_YrvpvBQoyuA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Yt6LBZeuWh8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Yu1gqhL0PRo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_YuNy33C52Aw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_YwujtxLOtxE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_YydusuL8BgY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_YzkqcknjpkE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Z0fw6FavdpA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Z4b8UjtxAMY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Z55eL5uhu4w_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ZE0y3IY9xQM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ZFs14dPrmzk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ZKrYys5dF6s_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ZKtM61uk9qQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ZNwpLXyw2u4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ZQR5D3DAAb8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ZQRpN8_minus_M6ug_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ZVaJm64eIFA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Zd0xrys03Z8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ZfaEltcBW3c_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ZgHRMAe89vM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Zh2uYzsRxA0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Zirdf28ZMIE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Zry1T3JFpeE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ZsTMAjX6Vk0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ZuImcUh33D8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_Zy_minus_SbocBd2Q_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ZyxrWdZ3weY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ZzJE4xyTIxY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_a_minus_SWNrzWGfA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_a0TQPwoTI2o_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_a2_plus_soTqvx7M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_a2IIKj_minus_VkoU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_a2P_plus_Ye5pJC8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_a2WaDLoGXPA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_a4cIsILLtFI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_a5n7LJhXHaQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_a8Vjah709P8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_aDYLD42_plus_EZ8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_aE2su5DZ1Sc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_aIDxi4cYbeE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_aIzYHS_minus_alR0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_aKdPQLVLP3M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_aLVOwBSrDbk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_aLhXGPn5dTg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_aO2iHLiw3_minus_U_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_aOCdDIgiKPs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_aP62pPAacWw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_aRhwYh6tFWQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_aRlIwBiVVwk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_aRnEag4dBFs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_aSMFZAc0k2o_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_aSmjsmBGPu8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_aVR80xoiZ1k_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_aWp9E_minus_j08iM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_aaAt9fybyMg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_abaitqseDfI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_aeneahlcB_minus_o_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_afKRYaytCMU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ah9tNb0Uv88_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ahzU5TO8T1k_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_aiiMugfIM7o_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ala1MhLKocY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ao_minus_sgdu7Cdk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_aoOntjhBL3c_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_asGB8UpyDfY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ax38MSqRqDg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_axRdn_plus_LFHf8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ayIF66Igfsg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_azmprWFOXT4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_b_minus_Ve4dnYu2Y_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_b4V_minus_l7ujPog_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_b72m71eLRDQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_b78ol2cn2aU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_b7TND_minus_La7t4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_b9oxVnUlBi8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_bBPMwG9d8ls_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_bEjaWp5yK5E_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_bEpcHNHm9co_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_bFT4F_plus_GBZ_plus_k_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_bG5UBpGzVFY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_bGaDEm9UZt4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_bGgs1bvchhg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_bHJ1vQlHwWg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_bITLP3pfST0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_bJZ4igT_plus_7x4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_bLP9mqWhb1E_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_bNGOHm2VshA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_bNHXaC0ElMs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_bQB4lXqNvjw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_bSNRor7CGkA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_bSj0SuRJZtw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_bT_minus_h0Odk4PY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_bTLjp_plus_K53h8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_bTdg4NmZdDo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_bTeS2KsZ0S4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_bZ1DVZdIg90_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_bb5xsagH_plus_cs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_bd91DX27Zrs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_bdlhvSyoS3s_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_bgX_plus_dtmmGbI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_bgwT_minus_Basnxo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_bheB4CqZNN0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_blD_minus_5Y31_plus_do_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_blXNoNhmum8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_bmBZz7onZz8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_bnyrG8copIU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_boiEI_minus_AWyAo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_bp3plbL4nrI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_bryysJ9IVo8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_bsnTl85m4pk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_btebm1_plus_QcnE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_bu5m9QDf_plus_qM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_bwB4BWbM6QI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_bwporVBRX1U_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_bxF3cc023_minus_k_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_bxwTIERiTMc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_c_minus_emNcf93X8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_c1q27JaWyHc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_c48UYNX3GaE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_c5WIVD3IdsA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_c5zG4_plus_HsaZc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_cDpdouY0XmU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_cE1NVPNw8Yc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_cF8dbaDCzuc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_cJ08oWAxit4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_cJqg7OIDWFQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_cKFf_plus_P20Ehc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_cOMswmrp86c_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_cPDl8_plus_OiOV8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_cQbsqtDXKxo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_cRYZglTPBuQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_cTsY2tcouXI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ca9dKq_plus_5jOY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_caPAueqbiUU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_cbrzCyajhJY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ccNNnAY7T10_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_cdcxwF_minus_YhLc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_cfV9_plus_PXtZts_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_chI1vWFrmOY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_chqnQlxMZuQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_cjGExj87wWA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_cjH_minus_GJG1iT0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_cnOOldSo8jc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_cnV_minus_ki0yIhw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_cqNT3RuXd1U_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_cs7AdQAdbbo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_cskh7pJGuAY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_csuCXX7m2UA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_cv50Zotdx9A_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_cxQxjxsBjoU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_cxaH7f6tnX8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_d_minus_RWWf0qsHg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_d0Fl_plus_xrAAt8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_d0l4wj2U5Bo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_d5kNg_plus_IqPvU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_dABU8HFW2zg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_dAva3cLYNKg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_dD9c_minus_tQ_minus_CV4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_dGiRVAks1Mk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_dHK_plus_gFv_plus_L_minus_o_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_dHRY1GuSvGQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_dHVF76BNnjc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_dHdyG1xiejY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_dKU6o9uunCI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_dMTiEV_minus_dZEg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_dNIT3K4F_plus_dM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_dO9RGCbBqLE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_dOyJ_minus_4H4j3o_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_dRjnhSb9dA4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_dV320xnOoq8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_dYJ6qjv6TLQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_dYlN29Ar7HM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_db9ThmIRE9s_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_dd_minus_z7KFYJKE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_deOMFiK_plus_18M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_deufikfeZZI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_df_minus_uTT8UBPk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_dgrHsJ_plus_qZ_minus_o_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_dhGA36ttUs8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_dhTcFm_plus_8xcY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_dhV9JuMDrIo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_djFvfanJqZ4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_djLcL2KXcwI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_dkarpOw4XO8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_dl0_minus_ob1P54Y_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_dlXA3xbd07g_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_dpFZ36JNBOA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_dyQ7s0Qqbzo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_dzuyxeM1aXU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_e_plus_qG2KMES_plus_Q_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_e1DWbu2sECI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_e6V0Xi1IhzY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_e7ZvEjJf4To_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_e7dHslq11OU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_e8F3QHU22NA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_eBKZy9FqyRU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_eDl56Xv_plus_HNU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_eEH9h2oW1B4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_eEOAYyLG2lw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_eF1I_minus_yN1kwE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_eG3TTN63xt8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_eIrauglGVzI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_eJaGgiq9wcw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_eKZgI0VaPAs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_eO9itAaSY5A_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_eVEtag9hF48_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_eWyBuXbJCyU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_eYPwjfWGIH8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_eafBBm3dS7M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ebB3W5M3_minus_dY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ebnGhv0EPr8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ee3xFIkKhd4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_eg2Yj1vjbGs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_egD_plus_Tl5PiJw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_eiAWR56A7xE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ekxSiEZEdEs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_epF2BhUe6q0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_erlMgXoUaV8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_et_plus_mwnPvIuo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_eudabMqhPko_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_eumcD3nV3wE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_eweskBljBqI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ezuSd2pLtno_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_f_plus_brnzWU5Ts_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_f08p1khxIYk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_f3JhVGEqIg4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_f41fHpibqds_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_f6yschfjRqE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_fAQp0F1MR98_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_fBwrH3d3J5k_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_fEZxDVV5vS4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_fFxh0nar_plus_J8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_fOz2ZWP1Smo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_fQEDZBZRWNw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_fUCKlUJcWiU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_fUfa06jVR_plus_c_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_fUvoA5dXReA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_fXv8ZRN_minus_jVU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_fZYGRTeIOq8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_fdsGd_plus_CTb4Y_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_febGb1n9rpM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_fj0k1BArqS4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_fjesszT0Yjk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_fkb3icYHYEs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_flEDaMoLILU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_fon4j6s4k2Q_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_fpPV6eFUp_plus_A_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_fpukSRJrA2g_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_frnJSnjKjuM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_fsZaxc2Qa4A_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_fuRriVBnN78_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_fvV_plus_bVSpuKU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_fwUP5MVHX1c_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_fwimOLDS3ds_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_g_minus_UdXW05cR0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_g23aN2_plus_MuMo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_g2lrOsIBGok_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_g5ZMpQQYqaI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_g82SgX6IGis_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_g8EMnyKOv_minus_8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_g8grZDCw5vI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_g8qJVGLGg6c_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_g8rg2BKjQ78_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_g9PTo9Ucd_minus_0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_gBI6BwLWfIw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_gDo9Uhm1M3Q_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_gEoNhrgO53Q_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_gGpuGGWevhE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_gIBOGIUVhFo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_gJUxthIhq_plus_g_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_gKQ30jyBR6s_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_gKQ3LS4Lkr4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_gKn2ySmvwDo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_gKrz25sSuAI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_gKwcTFGDWFI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_gM9EaKjzBuI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_gOifsQw_minus_LbY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_gOuknA5kKe4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_gTALRDDOz3k_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_gYA6AsxIjy0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_gcIHpoxF9Bw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_gdl5AVmSFKQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_gfuLEzW2CW8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ggHIiAVjxKA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ggouHOAxmCw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ggy8qptp56A_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_gjZlhVBy6mg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_gkBA7AZJ7wU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_gkPwMwcg6MM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_gp70KgAS4PI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_gpITgzdL428_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_gqDyuDxmt_plus_c_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_gqYjlq8Fm2w_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_grS2MjDLJec_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_h_plus_A_plus_2v3Y8W8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_h0NmVu5FDYU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_h1PNh26pQx4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_h3c0znldOaU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_h3pElir_minus_I8Q_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_h6HHFebCPUY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_h6L3lSaKl0k_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_h7TjPntTtHM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_h84MIvQPyVA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_h8mwPFwhEPQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_hBLDFB97R44_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_hCIfuiMEEjM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_hCfexn532_minus_w_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_hEKaMzB3bH0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_hEaDe9k2nOw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_hFktHM4E9TQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_hIZIpFAWUqI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_hL95IlKRacI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_hLUMudTnRos_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_hNM0CNS6Gx4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_hNs5kncUYes_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_hOHMhd3XrQk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_hR8oaZqI_minus_c4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_hRZnZoEXbfQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_hRtNhDTYVnY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_hSOO2FvvGBI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_hWOaeNUMlIY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_hXsRW1De54I_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_hYjOjm9IL7w_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_hbvj2ggxKno_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_hdPD79wSwMk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_heNXaxM8MW0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_hh5ROMS_minus_IAY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_hhD_plus_W6r61Jg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_hi0BiPpGPV8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_hj0KdH_minus_lwnk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_hjI7dTR770E_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_hjxyOIoyZ0Q_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_hkEX31uteAc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_hkPuxPeBvRM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_hktFnJyNfC4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_hp_plus_jjxkskGk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_hpXk9zZgRLw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_hpeVcUchyIY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_hr8JUdVjP8w_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_hu81PU2O_minus_6Q_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_hvfhKH5KSuk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_hyjXKNKT_minus_wo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_i_minus_aQy6616sI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_i37aj1V1lCo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_i7W518yhwSw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_i8djQf_plus_FnoY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_iB7XmXBdD9A_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_iCqbQACa19M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_iEfX3KVKXaM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_iEl3SecIbP8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_iFQi1PTTbIo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_iMQarT42Hpk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_iNKr64UBY_minus_Q_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_iO1ZBSuY0fA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_iOCsVJ0obo0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_iR2KIoNc1qA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_iR39TKpBQ5c_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_iRoy3qT_plus_RDw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_iSeQ7pcCuiE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_iT3Y7ZpmbJw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_iaaW42hSxDs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ibwu_minus_672lHg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ie_plus_Gc0W2tOo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ieHw9JRbKV0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ike9qpEXoa0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_iobMkN9OlDg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_irJxwJwbxlU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_itL2333RCtE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_itNY5wJas4U_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_iuIkd2DW9uc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ivTLfuf0zhA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ivuKrYwVA90_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_iwVaI2sN_minus_v4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_iyqq4SUxrZs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_iyv2v10Y3ho_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_iz4u5YcAPsE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_j56nb81_plus_MDA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_j58L24x6xzI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_j5KwqH5Oo60_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_j5dotld_minus_5B0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_j5kAfvfOR9I_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_j68ap0trCg4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_j6ddtaFmntI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_j6k_minus_zPwiYbc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_j6zuRCqOTlw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_jCEAhlQoJXY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_jCYFjXTF1kQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_jERsFgmcFp8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_jF_minus_Amq3OxZE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_jFlDIIIhQM0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_jH6SqS1rHJI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_jMHXk7GsPMc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_jMuZIs_plus_Zpxc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_jPIjK59Zpy8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_jUpGFXt4Hes_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_jVk_plus__plus_Hzhvi0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_jWRVaFD48fY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_jYtWQ53c7HE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_jZCJMynlpc0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_jZLb5yzkYuM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_jZO4ymTXMUo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_jaNWyA8gAxo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_jfJyTS2RaFI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_jh8qzcMfnoY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_jikMbJeQzdc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_jkaOcDzcE3A_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_jm5QiR8ubbk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_jpAJorTmZgo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_juEKqgb7AKY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_jx_plus_I_plus_WDoPk8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_k1_minus_oLLAann4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_k6gj4XMrGYI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_k8GAaeGoJNo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_k8hl9_minus_oAvoI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_kATBXStia9Y_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_kBKrRyH1tJc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_kE3kTohd9Ho_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_kGRCYA8TWwc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_kKBJsYzah34_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_kKfJucM9C9I_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_kPf7YKjM5to_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_kPoy66Qyehc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_kR_plus_PjVB2NDo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_kUpCrFeJ_plus_Qc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_kVvqlOKiJuA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_kWO4FRTmQHw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_kXgwqgig_plus_7M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_kZWg6kFKXoQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_kbjb2Hw8yiE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_kjZ_minus_HiO9m8E_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_klejBDJY8is_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_km_plus_ASLjmiC4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_knTLx66tdGw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_knnq9laAo5U_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_koNL0J1w1vU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_kpzrc1VedVs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_krY8IJeESWM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_kv1zkA_plus_6TOA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_kvPuiQQQ0wI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_kvdoVHFQSYk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_kwfAtQcWQMY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_l06yCeuTh9o_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_l3kOwgdzEGo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_l5Kt5zwZ6Uk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_l5x6MKHu0x0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_lEzjLelXvso_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_lF7uqZ_plus_SEkU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_lFwCOUdgf2E_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_lMZjLC_minus_fee4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_lMb8ru0M2xI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_lNz2pz61tRQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_lOSAfhuHa2I_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_lPgyPj5NGKQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_lPwPDdfX7L8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_lPyvK0d3aXc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_lRERGWbfk48_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_lRngZXg_plus_OMw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_lWkcJNbsPTs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_lZMV1eoqaBA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_lZMjf9PRbVM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_la8aT0BhWPY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_lbhXmqlori4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_lcGp00SsLdM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_lcpTDRyKE0Q_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_leDQJqf_plus_kW4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_lfZHuOlEJ_minus_E_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_lggecnD_plus_eXU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_lh5Sirif1Js_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_lkF8nnFQFsk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_lsKulh_plus_FqBc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_lx_plus_udvz4HM0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_lxUmSKdtKG8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_lzE3Hr5sl8g_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_m_plus_7BDDUYx6Q_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_m_minus_KXH7hf4ME_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_m4C91hyQ52U_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_m4OfgzY5d5A_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_m5YN2mkmFU0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_m6fBwah4Ftc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_m7Mr11WLmnE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_m7ZpRaRI5LM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_m7fJCHWIHlo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_m99t7FIPhXk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_m9xuHynWoMI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_mAI26Umpj78_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_mBNLXFT1ZOc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_mD9LGPlmOxk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_mDkfHdI0qvo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_mFqGvFIlafc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_mH_minus_agKi4iSw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_mJCcORDh770_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_mJis0hBrDZ4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_mKBgsdtsnFc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_mMRUSfhpPpI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_mNGUNa7RMc0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_mOkfGGvGUaM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_mPruZCJVhEQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_mU8uKTDzzCs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_mV3ytgZIUa4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_mY2wDnvDJ5I_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_mYOusR0U31c_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_mZbyHoyczLI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_mdtYM8TgyW8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_meZ2WMyv4mk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_mf7Nov4Lh7Q_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_mfCxwgoA4ig_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_mgXiSq5MyCk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_mgd0D3MCn2A_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_mnKq6wtnV9c_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_mp6t8dwn4NM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_mr1Iv7iiMow_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_mrIyCLFbNJg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_mrvMsBeOVFg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_mrvPNIBvyAs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_muhIoRKfuCU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_mvOkTF4qq2Q_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_mwewVhxHbaU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_mwvU9Nl5qZ4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_mxsSETrkaqw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_mxuH41H1IgI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_myt0Uy_minus_ggkI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_mzAC0wC2Ntc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_n4NzGbYJBfQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_n4nRSUA22go_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_n6nRxPppLkg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_n9blDl1zmZs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_n9vuh0BbMNM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_nAF6_plus_sNhras_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_nB07zzaNs8M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_nEBJ_minus_EoNy6o_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_nEjzMspcT_minus_M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_nG_minus_fe818C6s_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_nHCy3dJmrIc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_nKjqLJYwHmw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_nO3u1FbEt2w_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_nP0n9drzGsA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_nTgoE_minus_uVjrg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_nTjK8xIr_plus_sI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_nVJkVyHC8oY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_nXMgpESq1zw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_nZfC_minus_j7XA7k_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_nZioXy_plus_ln9k_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_nc3PmN_minus_znXI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ncxgeUHZY9M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ngePHx8NlxE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_nk7y_plus_1_minus_5Rlc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_nlKvBmVpu_plus_4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_nol3vzTAjz4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_nq36QnRM_minus_Tg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_nqVb8g_plus_RaW8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_nsQsk5TUH2M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ntXaBtmDtx4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_nvaHVEW8uGA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_nwaDKQ6VAjU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_nwsgqlz1Opg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_nxfOft45qXE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ny5PSQqfXQc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_nzcgPj2HRyE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_nzyF18FmY94_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_o_plus_JvTLCtV_minus_o_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_o0GUhDKnxm0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_o1wSrSZJpNU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_o3V5zu29DGA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_o4ilFAxoolI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_o7EHdTnfLdY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_o800PKDzglI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_o9KCMytXpOo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_oBA85Qez5vo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_oCeHcIJ0CPA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_oEn8JIW94ss_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_oFNpaJ6ArFY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_oGw_plus_hI_minus_CVD0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_oH7QNCWHUi8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_oJLiqgpVjck_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_oL_plus_GQoE8gsY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_oLcBypHdLGY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_oLcosYr17C0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_oM6Dhwo74Ag_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_oMgedF8R0nw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_oOvKbv_minus_48RQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_oWrhZTKS55M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_oX_plus_5pXLxgGk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_oYNijK1VQbk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_oYs_minus_uCXSRFM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ocNLQuCEygs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_olP0h7Vb1as_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_omEfgb0X740_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_osoom0ghhoE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_otRxM636uhw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ouoKi_plus_bvD38_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_oxMFU7qWfD8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_oz3SQ9ZUwUE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_p0Bb5fo1gx8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_p0Zf2imJtOg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_p1py_plus_0pWihc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_p3d8TZiX4Zg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_p9oKEfpeTJo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_pBBjp6UCMjw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_pG7xF8YYhtc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_pGFkhWIx3NI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_pGg_plus_6wFDlrM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_pGk2YpBg0Lc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_pHqoa2qR10c_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_pNsA_minus_VDPPiw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_pOvm_plus_FVJ7lE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_pPfNd6QD3nk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_pQMGxMtK_plus_wo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_pRnypaMw9tE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_pSMbRMzlsUE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_pXbGePe2aYc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_pYIS_minus_RAnO2c_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_pZfzCXDEAlk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_pagEXYKnxMs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_pb7gQyE4uLY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_pe_minus_Zk7GNRr4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_peRY_minus_tJib_minus_Y_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_pj4c3_minus_54ZIk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_pkkhXsImmQ0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_pkq9zVgtprI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_pn1cW19yok4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_poSGD3YKbnc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_pqEL7xamJEs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_pr2ZxWaYW28_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ptFolTbHt_minus_s_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ptbNVFctdzM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ptqCAlQ_minus_jT4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_puQ5kZBcLik_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_pvoNV6JEges_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_q_plus_p9CIJjqtc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_q_minus_h_plus_bwoZNu8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_q5qKrUmopJA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_q6_plus_BMQkDeq4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_q68dIAKve_plus_U_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_q6dkQwjI3e4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_q6fbcLPayIo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_q9h1hIyWddg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_qB5yE3I4878_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_qDaMG0PKU_plus_8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_qJyHEgLA0yg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_qMOoUDLoJNE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_qMjaWglGSmU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_qPP0fwPQEmE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_qPVPvgCLdLw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_qSOMklTbuMg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_qSUqGWVDKuc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_qUTEsJ9W_minus_1M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_qUn0DQ5E7k4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_qUyg_minus_kkxMKU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_qWcfcBfXV7g_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_qY9NqOyJp0s_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_qYDJ4jw_plus_nr4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_qZpoCMIWjho_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_qcXKIRP2SWI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_qfYYcaEjkEg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_qgOegSRidWk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_qisHypG_plus_THA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_qjOgGXHAGEA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_qlXqSUQnCyo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_qnB_plus_y2qRV48_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_qqDpxJnCHyo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_qsrqpMOCXYE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_qzRKFPZapIk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_r_plus__plus_oFgAiV3A_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_r_minus_f6QCLZd44_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_r2Cn7mA9SCI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_r2X_minus_hz282fU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_r9_plus_sAKTSqqA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_rEzX0rUufrE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_rGHLA1FOwo4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_rGSY5kqmIQo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_rGub6wKg4Ik_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_rIVQ5YCe_plus_Nw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_rLKY4FABiz8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_rML4gdd9p2g_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_rPiSXJItylg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_rPxOsbwzIkI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_rQWVALnzV4c_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_rWAUF2EsiOU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_rYA4HhTMtx4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_raPSwcqnyag_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_rcJ02tqrEDw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_rcfakU19Yw8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_rdwS0m4Ef4s_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ri40vr7nItM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_rleKF2T_plus_tSs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_rnQLHC631T0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_rnd4RdgRN6o_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_rsK0PDTZ8o4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ru2bpPUp5_plus_Q_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_rw_plus_8ygNaJa4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ryF_plus_klA1y44_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_s_plus_voBeuCyhU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_s_minus_ZHwpqG0NE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_s0aR0qaOgvo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_s2je4VSEpWc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_s4PzHCqbUJE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_s5Wprcn_plus_jqU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_s90ukY5BwAk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_sDA5QTiq_plus_mY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_sDd36F0WnLM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_sELpIbkpBXM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_sHOLNouGWu0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_sI0jCaqkt_plus_U_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_sJaNZ_minus_bGYJM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_sM6zaDAjMb8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_sQCJorTXRiM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_sQWBQmtDmFI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_sUf1IwOVqkw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_sVN9UvNqz3k_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_sXkOZdYHmec_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_sY6TJzzoXjA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_sbs1gkGQMRc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_se9_plus_A9HXuhA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_sh4tekSCfDg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_siF3T91uDNc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_siNPpPSorwY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_sijsfM_minus_blKs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_sj9YiLphihc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_skWJdxykO_minus_c_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_sl7UWXx_plus_9Uc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_spLNXZdR_minus_XQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_sqS31_plus_ABfJQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_sqcFew1Fa64_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_srWXZm_plus_uUZU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_suTFBF_minus_YYJo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_svSitLIoR0M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_svdvfCobobM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_svygVJARrD4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_sx1OJpJQNKo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_sxCnywYf1UU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_syuiOxqv2FI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_sz2Q8LAojQI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_szLrcdR3eyY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_t_minus_hL9pkzNqs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_t0QQEaFsC_minus_M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_t1Bl3QUgCIw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_t1kRYepQFw0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_t6IQPJDVfqw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_tBP5x0sTch8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_tC_minus_llfh3fbE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_tCRUBE4pMPk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_tCu7fTjq5js_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_tF_plus_U1Hj7iZM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_tGEuB_minus_fAbpo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_tGoJJ8VZk5s_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_tJ8hf8Obkzo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_tJCcHU3yuD4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_tLuHMUUGAbU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_tOr9C4XdXeM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_tQ4iMig6GhI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_tQC7mhwIcYI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_tRuMuMyfsCw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_tT6m4kPCaiw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_tYdK4jFgB10_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_td3_minus_B6sLCag_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_thnBrjve5WY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_tiMMuYmTWRo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_tjBm_minus_5cNIyQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_tlF0Q4BsxOc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_tmx6qeUDqns_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_toZfIU2SFGg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_tqeCpXiyN3Y_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_twrIHWOkgFY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_tzaSPxMt7II_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_u0PMOwRW2Nw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_u0d88zW5hEg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_u3wHcvgUlYQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_u7ol_plus_VUrT9k_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_uA2aJgvkoug_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_uAwfiZ4QJpI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_uCRpl3IKxnI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_uEXjuCbdkTs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_uF_plus_dNdiMQwI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_uFVdaafMFT0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_uHi4sSMujQ4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_uJbTUKDL3hE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_uJoZRn_minus_1Zcg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_uM7LE3DSVGc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_uNWFSn6bdMs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_uPZVT8JKnVg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_uSILYbnnX_minus_E_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_uU2a4i_plus_CXyI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_uUMihdIHoRs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_uVLLF8GNXfE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_udJxb7Ft4Lw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_udmT4cGBjAY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_uf_minus_RIkZUazQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ufrcocK7QxI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ug7AKrj3k9k_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_uiPs6XyAwzM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_uioVIhZPdZY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ujJ515S8XC8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_uk3KonVWyRA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_unl_minus_pBAxQqQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_upA0jOZLS_plus_0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_uqaePRcFldE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_uvnCoBHdWRY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_uw_minus_LwJbM_minus_FI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_uwah6RiPSLg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_uy004AKIiV8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_uyQEbL6cyXY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_v_minus_IeGKAkNwk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_v0_plus_AjZnbZYY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_v0f0mWaZLuo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_v0q0kTm2wHo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_v7HZoO_minus_4HTw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_vBabh_plus_AsWjs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_vE_plus_ITy9E1kk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_vENhdeMSnzA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_vESt8BsBw6s_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_vFIZ0zLtcjA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_vFhTf6l2lug_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_vG8EIliqpe8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_vJ49MTq8T3U_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_vKPF4Ae2jXU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_vKgiq6x2U4k_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_vL3RYX_plus_17z0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_vObz7uYgvaw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_vP2u_minus_EKySz8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_vQ2tKAFtwnw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_vQj7629_minus_Q6s_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_vRbXx0hOIl0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_vVBXVwprC1c_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_vZj9Ghirb88_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_vcEmTpxouso_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_vd_plus_jCNiphKY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_vfn772pcPcs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_vhEasOXrXSQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_vhtZPCh8h50_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_viJgRPnvNAM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_vixR1D34h8c_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_vkweVxJWAb0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_vlmudbliYtE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_vnzVCb9fLYY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_vo6bvI_plus_oYEw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_vqfNc8gKX7M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_vrSTiBp7Bxc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_vyY43_plus_VLd_minus_0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_vzEk9g_plus_8pjo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_vzIRGkHE5Ec_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_w_plus_andXbNt9w_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_w0LHtIi60Sk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_w1k0uL_minus_2zrQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_w3QmqwGb7iw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_w4TVmUxJClA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_w5koSZnpf68_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_w63v6LpnB_minus_A_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_w9nVhDr6Tuk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_wCUi7kMa96E_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_wERs34fb56w_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_wEoREeLcJvE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_wFXQr_plus_ADp0I_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_wNCY2fmsBy8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_wOPixgiIoJ8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_wORJc9ExK_minus_U_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_wOWXwyIvlew_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_wPC_minus_ecqXeKY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_wQLMyxkpyoY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_wR3MAUetM9M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_wUo8uggCIKI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_wVoC0_plus_Jf2EY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_wa5T0WC1Geo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_wcv7pk_minus_Cm4Q_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_wg6kvThzUC4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_wgTWmXK4OWo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_wh8nG_minus_MSV94_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_wiJx0nugsWQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_wjcxye4juLE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_wkpMPlbnk2s_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_wmcxMdGsZqM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_woFQKgSI4vI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_wp2Ap_plus_Lg4gk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_wqW7jY27LdU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_wxEMfjv1CKI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_wxNataLE6Pw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_x06LLPToh7o_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_x0ky5DM7TBM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_x3kS1PpguWo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_x61cJE335hY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_x79QZl_plus_cE_minus_M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_x9VLNbp_minus_0bc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_x9yhzIIKwPY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_xBsk4a8QjNY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_xBtnc_minus_hPeag_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_xC9LUxhrTe8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_xDPnsCvHEDs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_xE6liwbu0NE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_xIlJnQmf360_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_xIpYVsuNBnA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_xJn60MTZ_plus_yU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_xKZwQWXnnG0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_xKwfiFkxxag_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_xLaM0VCrVBA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_xO2xPJPvrwM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_xOMwqeWCShk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_xONY95TlvKg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_xOWFCWYRUr4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_xPkJ2Vpl2Pw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_xUU3stOMxhA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_xV6YYVaiWCE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_xYyYTfVM38w_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_xayqByEfWxo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_xh6w4XzEvrE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_xhAjjXBoIsU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_xhJF17DTz5Y_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_xj3JN8SfKIM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_xjWTXQmF_plus_EQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_xkakgh5LbYs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_xmON0DJSgzE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_xmhE1gHh3uo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_xpMX_plus_6Jsoac_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_xpdCYsHYfh0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_xrQmlazU1dM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_xrnmEo_plus_rNiU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_xt4UIk6b2W4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_xuBB_minus_BrALSM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_xx4FGisubsA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_xxzE5TCEbmY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_xzLgzGOHQto_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_y0aapzyadSw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_y0dJq9TC59U_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_y11t0atzpyU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_y3T_plus_uuG1YGg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_y5_minus_WNLXJkDc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_y6NFnit0JKY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_y7ep3yHJDpU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_y80RbT7hxCY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_y8RT4Qrm7Gg_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_y96_minus_Pq7pkDo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_y9eFAhCasms_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_y9lK9tQhLug_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_yF_plus_BpY38rbY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_yGPvGhI4OfU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_yH0uHhM3qwE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_yH7ECRoEfBE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_yT2KrJcVN2w_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_yUrPaK9R4zI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_yXIXf6YY3S8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_yYblB5YQKKE_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_yZALu4_minus_9KfM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ya5EhVt4c0Y_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_yc6_plus_6xulIOs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ycgIs7zcXBs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ycpVzhaLHM4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ydzM6_minus_5QEAo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_yeYZ3i4o04M_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_yeiwp5OQZUo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_yet584Rwd64_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_yfVdzhuA8v0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_yh0eJOfRoVw_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_yiFFhwZWdZU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_yjKiaXVikr8_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_yjkykVlf_plus_OI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_yko_minus_aU3XiYc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_yp5Nh_plus_hby74_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_yrPTLmYWUIM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_yt5SoFC3Qbs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_yuIik2mcgeM_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_yve4yO82NQs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_yymH_plus_TZdDxk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_z0ii_plus_Z6tfh0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_z9oSx_plus_BxBp0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_zDKSAcAiuE0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_zDsH55AYTkI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_zJLKZ2_minus_wfHA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_zJY1wEUT9to_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_zRBjLUcjnwk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_zVHpQA69C5c_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_zWXkbTqqg58_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_zY4SBiM0p_plus_E_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_zYuuBWEeHFY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_zYv9dq9nt9s_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_zdFKxyUS_plus_VQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_zdwQUDfqqmQ_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_zfbaslbmYuc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_zgOivA6B644_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_zh9pYpSp8Vc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_zhMBwQWHeJI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_ziXgDOJkgGI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_zj_plus_bI9tzkgo_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_zjRKro4sFxc_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_zjs5ZIIBqqI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_zlOx0Eh6i90_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_zmmG6Otbj70_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_zmxAXmg0bJ4_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_zntZbHbwwI0_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_zo8D_plus_GelrUI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_zp6cAKKM0MI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_zpVzOhv4Ins_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_zqc3B1lvZfI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_zsvSU8ak9MU_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_zt8eCP3KyHA_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_zuOORqVPSRI_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_zuT3a9l0_plus_SY_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_zvP6iihpPvk_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_zw4stEd_minus_8Cs_nid_no_patch(); +int APS5_VABI sceIcuLegacyUnknown_zzjAIUpprxE_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceIcu/libSceIcu.hpp b/core/libs/prx/libSceIcu/libSceIcu.hpp index bcbcf0130a..300ae3ebb7 100644 --- a/core/libs/prx/libSceIcu/libSceIcu.hpp +++ b/core/libs/prx/libSceIcu/libSceIcu.hpp @@ -1,8 +1,12 @@ #pragma once +#include "prx/libSceIcu/include/LegacyExports.hpp" #include "Invariant.hpp" +#include "Iterator.hpp" +#include "prx/libSceIcu/include/InventoryDispatch.hpp" #include "Utf8.hpp" #include "Version.hpp" #include "ConverterCallbacks.hpp" #include "CString.hpp" #include "Space.hpp" #include "Unescape.hpp" +#include "Identified.hpp" diff --git a/core/libs/prx/libSceIcu/tests/CompareIter.cpp b/core/libs/prx/libSceIcu/tests/CompareIter.cpp new file mode 100644 index 0000000000..cf354c26a2 --- /dev/null +++ b/core/libs/prx/libSceIcu/tests/CompareIter.cpp @@ -0,0 +1,195 @@ +#include "prx/libSceIcu/libSceIcu.hpp" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { + +void Require(bool condition, std::source_location location = std::source_location::current()) { + if (condition) return; + std::fprintf(stderr, "ICU iterator comparison check failed at line %u\n", location.line()); + std::abort(); +} + +struct Text { + std::vector units; + std::string calls; +}; + +Text& Of(UCharIterator* iterator) { + return *static_cast(const_cast(iterator->context)); +} + +std::int32_t APS5_VABI Move_nid_no_patch(UCharIterator* iterator, std::int32_t delta, UCharIteratorOrigin origin) { + auto& text = Of(iterator); + Require(origin == UITER_START); + text.calls += 'm'; + iterator->index = iterator->start + delta; + return iterator->index; +} + +std::int32_t APS5_VABI Next_nid_no_patch(UCharIterator* iterator) { + auto& text = Of(iterator); + text.calls += 'n'; + return iterator->index < iterator->limit ? text.units[iterator->index++] : -1; +} + +std::int32_t APS5_VABI Current_nid_no_patch(UCharIterator* iterator) { + auto& text = Of(iterator); + text.calls += 'c'; + return iterator->index < iterator->limit ? text.units[iterator->index] : -1; +} + +std::int32_t APS5_VABI Previous_nid_no_patch(UCharIterator* iterator) { + auto& text = Of(iterator); + text.calls += 'p'; + return iterator->index > iterator->start ? text.units[--iterator->index] : -1; +} + +struct Iterator { + Text text; + UCharIterator iterator{}; + + explicit Iterator(std::vector units, std::int32_t index = 0) : text{std::move(units), {}} { + iterator.context = &text; + iterator.length = static_cast(text.units.size()); + iterator.start = 0; + iterator.index = index; + iterator.limit = iterator.length; + iterator.move = Move_nid_no_patch; + iterator.next = Next_nid_no_patch; + iterator.current = Current_nid_no_patch; + iterator.previous = Previous_nid_no_patch; + } +}; + +struct Result { + std::int32_t value; + std::string first; + std::string second; +}; + +Result Compare(std::vector left, std::vector right, std::uint8_t codePointOrder) { + Iterator first(std::move(left), 1); + Iterator second(std::move(right), 1); + const auto value = u_strCompareIter_nid_postfix(&first.iterator, &second.iterator, codePointOrder); + return {value, first.text.calls, second.text.calls}; +} + +void Expect(std::vector left, std::vector right, std::uint8_t codePointOrder, + std::int32_t value, const char* first, const char* second, std::source_location location = std::source_location::current()) { + const auto result = Compare(std::move(left), std::move(right), codePointOrder); + Require(result.value == value, location); + Require(result.first == first, location); + Require(result.second == second, location); +} + +template +void RequireInvalidArgument(TAction action, std::source_location location = std::source_location::current()) { + try { action(); } catch (const std::invalid_argument&) { return; } + Require(false, location); +} + +void Arguments() { + Iterator text({u'a'}); + Require(u_strCompareIter_nid_postfix(nullptr, &text.iterator, 1) == 0); + Require(u_strCompareIter_nid_postfix(&text.iterator, nullptr, 1) == 0); + Require(u_strCompareIter_nid_postfix(nullptr, nullptr, 0) == 0); + Require(u_strCompareIter_nid_postfix(&text.iterator, &text.iterator, 1) == 0); + Require(text.text.calls.empty()); +} + +void Units() { + Expect({}, {}, 0, 0, "mn", "mn"); + Expect({u'a', u'b'}, {u'a', u'b'}, 1, 0, "mnnn", "mnnn"); + Expect({u'a', u'b', u'c'}, {u'a', u'b', u'd'}, 0, -1, "mnnn", "mnnn"); + Expect({u'a', u'b'}, {u'a', u'b', u'c'}, 1, -1 - u'c', "mnnn", "mnnn"); + Expect({u'b'}, {u'a', u'z'}, 1, 1, "mn", "mn"); + Expect({0xff61}, {0xd800, 0xdc00}, 0, 0xff61 - 0xd800, "mn", "mn"); + Expect({0xdc00}, {0xd800, 0xdc00}, 0, 0x400, "mn", "mn"); +} + +void CodePoints() { + Expect({0xff61}, {0xd800, 0xdc00}, 1, 0xff61 - 0x2800 - 0xd800, "mn", "mnc"); + Expect({0xd800, 0xdc00}, {0xff61}, 0x80, 0xd800 - (0xff61 - 0x2800), "mnc", "mn"); + Expect({0xdc00}, {0xd800, 0xdc00}, 1, 0xdc00 - 0x2800 - 0xd800, "mnpp", "mnc"); + Expect({0xd800, 0xdc00}, {0xd800, 0xdc01}, 1, -1, "mnnpp", "mnnpp"); + Expect({u'x', 0xdc00}, {u'x', 0xe000}, 1, 0xdc00 - 0xe000, "mnnpp", "mnn"); + Expect({0xd800}, {0xe000}, 1, -0x800, "mnc", "mn"); + Expect({0xd800, u'a'}, {0xdbff, 0xdfff}, 1, 0xd800 - 0x2800 - 0xdbff, "mnc", "mnc"); + Expect({0xffff}, {0x10000}, 1, 0xffff - 0x2800 - (0x10000 - 0x2800), "mn", "mn"); + Expect({u'a', 0xd7ff}, {u'a', 0xd800}, 1, -1, "mnn", "mnn"); + Expect({0xd800}, {}, 1, 0xd801, "mn", "mn"); +} + +void Wrapping() { + Expect({std::numeric_limits::min()}, {1}, 0, std::numeric_limits::max(), "mn", "mn"); + Expect({std::numeric_limits::max()}, {-1}, 1, std::numeric_limits::min(), "mn", "mn"); +} + +void Callbacks() { + for (int missing = 0; missing < 4; ++missing) { + Iterator first({0xdc00}); + Iterator second({0xd800, 0xdc00}); + auto& target = missing < 2 ? first.iterator : second.iterator; + if (missing % 2 == 0) target.move = nullptr; else target.next = nullptr; + RequireInvalidArgument([&] { u_strCompareIter_nid_postfix(&first.iterator, &second.iterator, 1); }); + } + { + Iterator first({0xdc00}); + Iterator second({0xd800, 0xdc00}); + first.iterator.previous = nullptr; + RequireInvalidArgument([&] { u_strCompareIter_nid_postfix(&first.iterator, &second.iterator, 1); }); + } + { + Iterator first({0xdc00}); + Iterator second({0xd800, 0xdc00}); + second.iterator.current = nullptr; + RequireInvalidArgument([&] { u_strCompareIter_nid_postfix(&first.iterator, &second.iterator, 1); }); + } + { + Iterator first({0xdc00}); + Iterator second({0xd800, 0xdc00}); + first.iterator.current = nullptr; + second.iterator.previous = nullptr; + Require(u_strCompareIter_nid_postfix(&first.iterator, &second.iterator, 1) == 0xdc00 - 0x2800 - 0xd800); + Require(first.text.calls == "mnpp"); + Require(second.text.calls == "mnc"); + } + { + Iterator first({u'a'}); + Iterator second({u'b'}); + first.iterator.current = nullptr; + first.iterator.previous = nullptr; + second.iterator.current = nullptr; + second.iterator.previous = nullptr; + Require(u_strCompareIter_nid_postfix(&first.iterator, &second.iterator, 1) == -1); + } +} + +void UnicodeVersion() { + std::array version{}; + version.fill(0xa5); + u_getUnicodeVersion_nid_postfix(version.data()); + Require(version == std::array{17, 0, 0, 0, 0xa5, 0xa5}); + u_getUnicodeVersion_nid_postfix(nullptr); +} + +} + +int main() { + Arguments(); + Units(); + CodePoints(); + Wrapping(); + Callbacks(); + UnicodeVersion(); + return 0; +} diff --git a/core/libs/prx/libSceIcu/tests/Resource.cpp b/core/libs/prx/libSceIcu/tests/Resource.cpp new file mode 100644 index 0000000000..0b0ef39b15 --- /dev/null +++ b/core/libs/prx/libSceIcu/tests/Resource.cpp @@ -0,0 +1,41 @@ +#include "prx/libSceIcu/libSceIcu.hpp" +#include +#include +#include +#include +#include +#include + +static_assert(std::is_same_v); + +namespace { + +void Check(std::uint32_t resource, std::int32_t expected) { + const auto actual = res_getPublicType_nid_postfix(resource); + if (actual != expected) { + std::fprintf(stderr, "resource 0x%08x: expected %d, got %d\n", resource, expected, actual); + std::abort(); + } +} + +} // namespace + +int main() { + constexpr std::array expectedTypes{0, 1, 2, 3, 2, 2, 0, 7, 8, 8, -1, -1, -1, -1, 14, -1}; + constexpr std::array offsets{0, 1, 0x07ffffff, 0x08000000, 0x0ffffffe, 0x0fffffff}; + std::uint32_t state = 0x62734a91; + for (std::uint32_t type = 0; type < expectedTypes.size(); ++type) { + const auto tag = type << 28; + for (const auto offset : offsets) Check(tag | offset, expectedTypes[type]); + for (unsigned bit = 0; bit < 28; ++bit) { + Check(tag | (std::uint32_t{1} << bit), expectedTypes[type]); + Check(tag | (0x0fffffff ^ (std::uint32_t{1} << bit)), expectedTypes[type]); + } + for (unsigned sample = 0; sample < 4096; ++sample) { + state = state * 1664525u + 1013904223u; + Check(tag | (state & 0x0fffffff), expectedTypes[type]); + } + } + Check(std::numeric_limits::max(), -1); + std::puts("ICU resource public type tests passed"); +} diff --git a/core/libs/prx/libSceImageUtil/Export.cpp b/core/libs/prx/libSceImageUtil/Export.cpp index d81f4a5e32..f51d208d98 100644 --- a/core/libs/prx/libSceImageUtil/Export.cpp +++ b/core/libs/prx/libSceImageUtil/Export.cpp @@ -1,3 +1,6 @@ +#include "prx/libSceImageUtil/include/LegacyExports.hpp" +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceImageUtil/include/InventoryExports.hpp" #include #include #include "SceTypes.hpp" @@ -8,3 +11,61 @@ extern "C" { APS5_DUMMY_FUN } + +extern "C" { + +int APS5_VABI libSceImageUtilUnknown_CttPwxlzc1A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CttPwxlzc1A", libSceImageUtilUnknown_CttPwxlzc1A_nid_no_patch); + +int APS5_VABI libSceImageUtilUnknown_o9hdefxVx_minus_0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("o9hdefxVx-0", libSceImageUtilUnknown_o9hdefxVx_minus_0_nid_no_patch); + +int APS5_VABI libSceImageUtilUnknown_pjWv_plus__plus_MzaJY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pjWv++MzaJY", libSceImageUtilUnknown_pjWv_plus__plus_MzaJY_nid_no_patch); + +int APS5_VABI libSceImageUtilUnknown_rSoaNeazErw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rSoaNeazErw", libSceImageUtilUnknown_rSoaNeazErw_nid_no_patch); + +int APS5_VABI libSceImageUtilUnknown_yjU_minus_5r3TDtc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yjU-5r3TDtc", libSceImageUtilUnknown_yjU_minus_5r3TDtc_nid_no_patch); + +} + +extern "C" { + +int APS5_VABI imageUtilLegacyUnknown_3Wr_minus_d3LSAAs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3Wr-d3LSAAs", imageUtilLegacyUnknown_3Wr_minus_d3LSAAs_nid_no_patch); + +int APS5_VABI imageUtilLegacyUnknown_YpFwL2gtFWo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YpFwL2gtFWo", imageUtilLegacyUnknown_YpFwL2gtFWo_nid_no_patch); + +int APS5_VABI imageUtilLegacyUnknown_hsXeUWEBufA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hsXeUWEBufA", imageUtilLegacyUnknown_hsXeUWEBufA_nid_no_patch); + +int APS5_VABI imageUtilLegacyUnknown_vUK2ZahdWkQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vUK2ZahdWkQ", imageUtilLegacyUnknown_vUK2ZahdWkQ_nid_no_patch); + +int APS5_VABI imageUtilLegacyUnknown_wxDgXPkLn8o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wxDgXPkLn8o", imageUtilLegacyUnknown_wxDgXPkLn8o_nid_no_patch); + +} diff --git a/core/libs/prx/libSceImageUtil/include/InventoryExports.hpp b/core/libs/prx/libSceImageUtil/include/InventoryExports.hpp new file mode 100644 index 0000000000..2455d281ae --- /dev/null +++ b/core/libs/prx/libSceImageUtil/include/InventoryExports.hpp @@ -0,0 +1,13 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceImageUtilUnknown_CttPwxlzc1A_nid_no_patch(); +int APS5_VABI libSceImageUtilUnknown_o9hdefxVx_minus_0_nid_no_patch(); +int APS5_VABI libSceImageUtilUnknown_pjWv_plus__plus_MzaJY_nid_no_patch(); +int APS5_VABI libSceImageUtilUnknown_rSoaNeazErw_nid_no_patch(); +int APS5_VABI libSceImageUtilUnknown_yjU_minus_5r3TDtc_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceImageUtil/include/LegacyExports.hpp b/core/libs/prx/libSceImageUtil/include/LegacyExports.hpp new file mode 100644 index 0000000000..886da6bdd5 --- /dev/null +++ b/core/libs/prx/libSceImageUtil/include/LegacyExports.hpp @@ -0,0 +1,13 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI imageUtilLegacyUnknown_3Wr_minus_d3LSAAs_nid_no_patch(); +int APS5_VABI imageUtilLegacyUnknown_YpFwL2gtFWo_nid_no_patch(); +int APS5_VABI imageUtilLegacyUnknown_hsXeUWEBufA_nid_no_patch(); +int APS5_VABI imageUtilLegacyUnknown_vUK2ZahdWkQ_nid_no_patch(); +int APS5_VABI imageUtilLegacyUnknown_wxDgXPkLn8o_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceImageUtil/libSceImageUtil.hpp b/core/libs/prx/libSceImageUtil/libSceImageUtil.hpp index 6f70f09bee..cf97765e34 100644 --- a/core/libs/prx/libSceImageUtil/libSceImageUtil.hpp +++ b/core/libs/prx/libSceImageUtil/libSceImageUtil.hpp @@ -1 +1,3 @@ #pragma once +#include "prx/libSceImageUtil/include/InventoryExports.hpp" +#include "prx/libSceImageUtil/include/LegacyExports.hpp" diff --git a/core/libs/prx/libSceIme/CMakeLists.txt b/core/libs/prx/libSceIme/CMakeLists.txt index 4f5c70898d..e91845fe5a 100644 --- a/core/libs/prx/libSceIme/CMakeLists.txt +++ b/core/libs/prx/libSceIme/CMakeLists.txt @@ -1,4 +1,4 @@ -add_library(libSceIme SHARED EXCLUDE_FROM_ALL ${CMAKE_CURRENT_SOURCE_DIR}/Export.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/ModalDialog.cpp) +add_library(libSceIme SHARED EXCLUDE_FROM_ALL ${CMAKE_CURRENT_SOURCE_DIR}/Export.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/ModalDialog.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/PsnDialogNotice.cpp) target_include_directories(libSceIme PRIVATE ${LIBS_INCLUDE_DIR}) configure_windows_unwind(libSceIme) @@ -53,6 +53,21 @@ if(BUILD_TESTING) "PATH=path_list_prepend:$") endif() + add_test_executable(psn_dialog_notice_mode_tests ${LIBS_INCLUDE_DIR}/tests/PsnDialogNoticeMode.cpp) + target_include_directories(psn_dialog_notice_mode_tests PRIVATE ${LIBS_INCLUDE_DIR}) + configure_host_test_executable(psn_dialog_notice_mode_tests) + add_test(NAME psn_dialog_notice_mode COMMAND psn_dialog_notice_mode_tests) + + add_test_executable(psn_dialog_notice_tests ${LIBS_INCLUDE_DIR}/tests/PsnDialogNotice.cpp) + target_include_directories(psn_dialog_notice_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(psn_dialog_notice_tests PRIVATE libSceIme libc) + configure_windows_unwind(psn_dialog_notice_tests) + add_test(NAME psn_dialog_notice COMMAND psn_dialog_notice_tests) + if(WIN32) + set_tests_properties(psn_dialog_notice PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test_executable(guest_ime_open_tests ${LIBS_INCLUDE_DIR}/tests/GuestImeOpen.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../libSceVideoOut/src/ImeTextInput.cpp) target_include_directories(guest_ime_open_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_SDL2_INCLUDE_DIR}) diff --git a/core/libs/prx/libSceIme/Export.cpp b/core/libs/prx/libSceIme/Export.cpp index 6b93ad9510..29b09103c1 100644 --- a/core/libs/prx/libSceIme/Export.cpp +++ b/core/libs/prx/libSceIme/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceIme/include/InventoryExports.hpp" #include "prx/libSceIme/include/Api.hpp" #include #include @@ -835,3 +837,17 @@ int APS5_VABI InitializeImeModule_nid_postfix(void) { } } + +extern "C" { + +int APS5_VABI libSceImeUnknown_NbbzN9GRg_plus_c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NbbzN9GRg+c", libSceImeUnknown_NbbzN9GRg_plus_c_nid_no_patch); + +int APS5_VABI libSceImeUnknown_aChMGUoc7QI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aChMGUoc7QI", libSceImeUnknown_aChMGUoc7QI_nid_no_patch); + +} diff --git a/core/libs/prx/libSceIme/include/InventoryExports.hpp b/core/libs/prx/libSceIme/include/InventoryExports.hpp new file mode 100644 index 0000000000..eda62cf5b3 --- /dev/null +++ b/core/libs/prx/libSceIme/include/InventoryExports.hpp @@ -0,0 +1,10 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceImeUnknown_NbbzN9GRg_plus_c_nid_no_patch(); +int APS5_VABI libSceImeUnknown_aChMGUoc7QI_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceIme/include/ModalDialog.hpp b/core/libs/prx/libSceIme/include/ModalDialog.hpp index 3d6efdcecb..21a2eeec56 100644 --- a/core/libs/prx/libSceIme/include/ModalDialog.hpp +++ b/core/libs/prx/libSceIme/include/ModalDialog.hpp @@ -14,6 +14,7 @@ inline constexpr std::size_t ModalDialogMaxButtons = 3; inline constexpr std::uint32_t ModalDialogAnyOwner = 0; inline constexpr std::uint32_t ModalDialogOwnerMsgDialog = 1; inline constexpr std::uint32_t ModalDialogOwnerErrorDialog = 2; +inline constexpr std::uint32_t ModalDialogOwnerPsnNotice = 3; struct ModalDialogRequest { std::uint32_t owner = ModalDialogAnyOwner; diff --git a/core/libs/prx/libSceIme/include/PsnDialogNotice.hpp b/core/libs/prx/libSceIme/include/PsnDialogNotice.hpp new file mode 100644 index 0000000000..c12b228f42 --- /dev/null +++ b/core/libs/prx/libSceIme/include/PsnDialogNotice.hpp @@ -0,0 +1,42 @@ +#ifndef CORE_LIBS_PRX_LIBSCEIME_INCLUDE_PSNDIALOGNOTICE_HPP +#define CORE_LIBS_PRX_LIBSCEIME_INCLUDE_PSNDIALOGNOTICE_HPP + +#include +#include +#include + +#include "prx/libSceIme/include/ModalDialog.hpp" + +enum class PsnDialogNoticeMode : std::uint8_t { Silent, Show }; + +enum class PsnDialogNoticeKind : std::uint8_t { PsnFeature, GenericFeature }; + +inline constexpr std::uint64_t PsnDialogNoticeIntervalMilliseconds = 2000; + +inline PsnDialogNoticeMode ParsePsnDialogNoticeMode(const char* text) { + if (text == nullptr || *text == '\0') return PsnDialogNoticeMode::Silent; + const std::string value(text); + if (value == "silent") return PsnDialogNoticeMode::Silent; + if (value == "show") return PsnDialogNoticeMode::Show; + throw std::runtime_error("ANYPS5_PSN_DIALOGS must be show or silent, not '" + value + "'"); +} + +inline ModalDialogRequest PsnDialogNoticeRequest(PsnDialogNoticeKind kind) { + ModalDialogRequest request; + request.owner = ModalDialogOwnerPsnNotice; + if (kind == PsnDialogNoticeKind::PsnFeature) { + request.message = u"This feature needs PlayStation Network, which AnyPS5 does not provide, so it is not available."; + } else { + request.message = u"This system feature is not available in AnyPS5."; + } + request.buttons = {u"OK"}; + request.focus = 0; + request.cancel = 0; + return request; +} + +extern "C" void PsnDialogNoticeSetMode_nid_postfix(PsnDialogNoticeMode mode); +extern "C" bool PsnDialogNoticeOffer_nid_postfix(PsnDialogNoticeKind kind); +extern "C" bool PsnDialogNoticeOfferAt_nid_postfix(PsnDialogNoticeKind kind, std::uint64_t nowMilliseconds); + +#endif diff --git a/core/libs/prx/libSceIme/libSceIme.hpp b/core/libs/prx/libSceIme/libSceIme.hpp index 01b649be31..1e26db7d6f 100644 --- a/core/libs/prx/libSceIme/libSceIme.hpp +++ b/core/libs/prx/libSceIme/libSceIme.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceIme/include/Api.hpp" +#include "prx/libSceIme/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceIme/src/PsnDialogNotice.cpp b/core/libs/prx/libSceIme/src/PsnDialogNotice.cpp new file mode 100644 index 0000000000..ee5d3fc00b --- /dev/null +++ b/core/libs/prx/libSceIme/src/PsnDialogNotice.cpp @@ -0,0 +1,49 @@ +#include "prx/libSceIme/include/PsnDialogNotice.hpp" + +#include +#include +#include +#include + +namespace { + +std::mutex g_mutex; +std::optional g_mode; +bool g_shown = false; +std::uint64_t g_lastShown = 0; + +PsnDialogNoticeMode Mode() { + if (!g_mode) g_mode = ParsePsnDialogNoticeMode(std::getenv("ANYPS5_PSN_DIALOGS")); + return *g_mode; +} + +std::uint64_t NowMilliseconds() { + return static_cast(std::chrono::duration_cast(std::chrono::steady_clock::now().time_since_epoch()).count()); +} + +} + +extern "C" { + +void PsnDialogNoticeSetMode_nid_postfix(PsnDialogNoticeMode mode) { + std::lock_guard lock(g_mutex); + g_mode = mode; + g_shown = false; + g_lastShown = 0; +} + +bool PsnDialogNoticeOfferAt_nid_postfix(PsnDialogNoticeKind kind, std::uint64_t nowMilliseconds) { + std::lock_guard lock(g_mutex); + if (Mode() != PsnDialogNoticeMode::Show) return false; + if (g_shown && nowMilliseconds >= g_lastShown && nowMilliseconds - g_lastShown < PsnDialogNoticeIntervalMilliseconds) return false; + if (!ModalDialogOpen_nid_postfix(PsnDialogNoticeRequest(kind))) return false; + g_shown = true; + g_lastShown = nowMilliseconds; + return true; +} + +bool PsnDialogNoticeOffer_nid_postfix(PsnDialogNoticeKind kind) { + return PsnDialogNoticeOfferAt_nid_postfix(kind, NowMilliseconds()); +} + +} diff --git a/core/libs/prx/libSceImeBackend/Export.cpp b/core/libs/prx/libSceImeBackend/Export.cpp index 081f2a8da3..5c35d74531 100644 --- a/core/libs/prx/libSceImeBackend/Export.cpp +++ b/core/libs/prx/libSceImeBackend/Export.cpp @@ -114,4 +114,29 @@ int APS5_VABI sceImeBackendGetCandidateSelect(void) { return 0; } +int APS5_VABI sceImeBackendGetConvertMode(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceImeBackendTemporalConfirm(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceImeBackendSetConvertMode(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceImeBackendForTestFunction(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceImeBackendDeleteCharacter(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + } diff --git a/core/libs/prx/libSceImeBackend/include/Api.hpp b/core/libs/prx/libSceImeBackend/include/Api.hpp index 313043e3c0..b5cc395a73 100644 --- a/core/libs/prx/libSceImeBackend/include/Api.hpp +++ b/core/libs/prx/libSceImeBackend/include/Api.hpp @@ -26,5 +26,10 @@ int APS5_VABI sceImeBackendModeCaretPrevious(void); int APS5_VABI sceImeBackendGetCandidateList(void); int APS5_VABI sceImeBackendGetCandidateListSize(void); int APS5_VABI sceImeBackendGetCandidateSelect(void); +int APS5_VABI sceImeBackendGetConvertMode(void); +int APS5_VABI sceImeBackendTemporalConfirm(void); +int APS5_VABI sceImeBackendSetConvertMode(void); +int APS5_VABI sceImeBackendForTestFunction(void); +int APS5_VABI sceImeBackendDeleteCharacter(void); } diff --git a/core/libs/prx/libSceInvitationDialog/CMakeLists.txt b/core/libs/prx/libSceInvitationDialog/CMakeLists.txt index 56b44db4a6..a5a4393458 100644 --- a/core/libs/prx/libSceInvitationDialog/CMakeLists.txt +++ b/core/libs/prx/libSceInvitationDialog/CMakeLists.txt @@ -1,4 +1,5 @@ add_library(libSceInvitationDialog SHARED EXCLUDE_FROM_ALL Export.cpp) +target_link_libraries(libSceInvitationDialog PRIVATE libSceIme) target_include_directories(libSceInvitationDialog PRIVATE ${LIBS_INCLUDE_DIR}) target_link_libraries(libSceInvitationDialog PRIVATE libSceCommonDialog libc) configure_windows_unwind(libSceInvitationDialog) @@ -6,11 +7,11 @@ configure_windows_unwind(libSceInvitationDialog) if(BUILD_TESTING) add_test_executable(guest_invitation_dialog_tests ${LIBS_INCLUDE_DIR}/tests/GuestInvitationDialog.cpp) target_include_directories(guest_invitation_dialog_tests PRIVATE ${LIBS_INCLUDE_DIR}) - target_link_libraries(guest_invitation_dialog_tests PRIVATE libSceInvitationDialog libSceCommonDialog libc) + target_link_libraries(guest_invitation_dialog_tests PRIVATE libSceInvitationDialog libSceCommonDialog libSceIme libc) configure_windows_unwind(guest_invitation_dialog_tests) add_test(NAME guest_invitation_dialog COMMAND guest_invitation_dialog_tests) if(WIN32) set_tests_properties(guest_invitation_dialog PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") + "PATH=path_list_prepend:$;PATH=path_list_prepend:$") endif() endif() diff --git a/core/libs/prx/libSceInvitationDialog/Export.cpp b/core/libs/prx/libSceInvitationDialog/Export.cpp index 0b41f35ebe..5b10dbd0fa 100644 --- a/core/libs/prx/libSceInvitationDialog/Export.cpp +++ b/core/libs/prx/libSceInvitationDialog/Export.cpp @@ -2,6 +2,7 @@ #include "prx/libSceCommonDialog/include/DialogUse.hpp" #include "SceTypes.hpp" #include "prx/libc/include/General.hpp" +#include "prx/libSceIme/include/PsnDialogNotice.hpp" #include #include #include @@ -85,6 +86,7 @@ int APS5_VABI sceInvitationDialogOpen(const InvitationDialogParam* param) { } dialog.callbackArg = param->callbackArg; dialog.status = COMMON_DIALOG_STATUS_FINISHED; + PsnDialogNoticeOffer_nid_postfix(PsnDialogNoticeKind::PsnFeature); return COMMON_DIALOG_OK; } diff --git a/core/libs/prx/libSceIpmi/Export.cpp b/core/libs/prx/libSceIpmi/Export.cpp index cf2898d050..6bd6f70161 100644 --- a/core/libs/prx/libSceIpmi/Export.cpp +++ b/core/libs/prx/libSceIpmi/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceIpmi/include/InventoryExports.hpp" #include "prx/libSceIpmi/include/Api.hpp" #include #include @@ -233,3 +235,22 @@ int APS5_VABI sceIpmiUnknown_r0t1NxWUNwI_nid_no_patch() { APS5_EXPORT("r0t1NxWUNwI", sceIpmiUnknown_r0t1NxWUNwI_nid_no_patch); } + +extern "C" { + +int APS5_VABI libSceIpmiUnknown_fjPNqzuUop8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fjPNqzuUop8", libSceIpmiUnknown_fjPNqzuUop8_nid_no_patch); + +int APS5_VABI libSceIpmiUnknown_gL4bo5h2nwU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gL4bo5h2nwU", libSceIpmiUnknown_gL4bo5h2nwU_nid_no_patch); + +int APS5_VABI libSceIpmiUnknown_rq3L3xKnt3Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rq3L3xKnt3Y", libSceIpmiUnknown_rq3L3xKnt3Y_nid_no_patch); + +} diff --git a/core/libs/prx/libSceIpmi/include/InventoryExports.hpp b/core/libs/prx/libSceIpmi/include/InventoryExports.hpp new file mode 100644 index 0000000000..3179e3820b --- /dev/null +++ b/core/libs/prx/libSceIpmi/include/InventoryExports.hpp @@ -0,0 +1,11 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceIpmiUnknown_fjPNqzuUop8_nid_no_patch(); +int APS5_VABI libSceIpmiUnknown_gL4bo5h2nwU_nid_no_patch(); +int APS5_VABI libSceIpmiUnknown_rq3L3xKnt3Y_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceIpmi/libSceIpmi.hpp b/core/libs/prx/libSceIpmi/libSceIpmi.hpp index c7fc7c9a22..1f9fd9aa5d 100644 --- a/core/libs/prx/libSceIpmi/libSceIpmi.hpp +++ b/core/libs/prx/libSceIpmi/libSceIpmi.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceIpmi/include/Api.hpp" +#include "prx/libSceIpmi/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceJsc/CMakeLists.txt b/core/libs/prx/libSceJsc/CMakeLists.txt index 73915bc4ff..c3c478aab7 100644 --- a/core/libs/prx/libSceJsc/CMakeLists.txt +++ b/core/libs/prx/libSceJsc/CMakeLists.txt @@ -1,4 +1,5 @@ add_library(libSceJsc SHARED EXCLUDE_FROM_ALL Export.cpp) +target_sources(libSceJsc PRIVATE LegacyExports.cpp) target_include_directories(libSceJsc PRIVATE ${LIBS_INCLUDE_DIR}) configure_windows_unwind(libSceJsc) diff --git a/core/libs/prx/libSceJsc/Export.cpp b/core/libs/prx/libSceJsc/Export.cpp index 41ff8bf419..fdbbde917f 100644 --- a/core/libs/prx/libSceJsc/Export.cpp +++ b/core/libs/prx/libSceJsc/Export.cpp @@ -82,7 +82,7 @@ bool Equal(const GuestJSString* first, const GuestJSString* second) { extern "C" { -GuestJSString* APS5_VABI JSStringCreateWithCharacters(const std::uint16_t* characters, std::size_t count) { +GuestJSString* APS5_VABI JSStringCreateWithCharacters_nid_postfix(const std::uint16_t* characters, std::size_t count) { if (!characters) return NullString().release(); if (!GuestJSStringValidLength(count)) throw std::length_error("JSStringCreateWithCharacters: length above the string limit"); auto string = std::make_unique(); @@ -91,36 +91,36 @@ GuestJSString* APS5_VABI JSStringCreateWithCharacters(const std::uint16_t* chara return string.release(); } -GuestJSString* APS5_VABI JSStringCreateWithUTF8CString(const char* text) { +GuestJSString* APS5_VABI JSStringCreateWithUTF8CString_nid_postfix(const char* text) { return Decode(text).release(); } -GuestJSString* APS5_VABI JSStringRetain(GuestJSString* string) { +GuestJSString* APS5_VABI JSStringRetain_nid_postfix(GuestJSString* string) { if (!string) throw std::invalid_argument("JSStringRetain: null string"); string->references.fetch_add(1, std::memory_order_relaxed); return string; } -void APS5_VABI JSStringRelease(GuestJSString* string) { +void APS5_VABI JSStringRelease_nid_postfix(GuestJSString* string) { if (!string) throw std::invalid_argument("JSStringRelease: null string"); if (string->references.fetch_sub(1, std::memory_order_acq_rel) == 1) delete string; } -std::size_t APS5_VABI JSStringGetLength(const GuestJSString* string) { +std::size_t APS5_VABI JSStringGetLength_nid_postfix(const GuestJSString* string) { return string ? string->characters.size() - 1 : 0; } -const std::uint16_t* APS5_VABI JSStringGetCharactersPtr(const GuestJSString* string) { +const std::uint16_t* APS5_VABI JSStringGetCharactersPtr_nid_postfix(const GuestJSString* string) { return string && !string->nullString ? string->characters.data() : nullptr; } -std::size_t APS5_VABI JSStringGetMaximumUTF8CStringSize(const GuestJSString* string) { +std::size_t APS5_VABI JSStringGetMaximumUTF8CStringSize_nid_postfix(const GuestJSString* string) { if (!string) throw std::invalid_argument("JSStringGetMaximumUTF8CStringSize: null string"); const auto length = static_cast(string->characters.size() - 1); return static_cast(length * 3u + 1u); } -std::size_t APS5_VABI JSStringGetUTF8CString(const GuestJSString* string, char* buffer, std::size_t bufferSize) { +std::size_t APS5_VABI JSStringGetUTF8CString_nid_postfix(const GuestJSString* string, char* buffer, std::size_t bufferSize) { if (!string || !buffer || !bufferSize) return 0; std::size_t written = 0; const auto count = string->characters.size() - 1; diff --git a/core/libs/prx/libSceJsc/LegacyExports.cpp b/core/libs/prx/libSceJsc/LegacyExports.cpp new file mode 100644 index 0000000000..9edbab880a --- /dev/null +++ b/core/libs/prx/libSceJsc/LegacyExports.cpp @@ -0,0 +1,997 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceJsc/include/LegacyExports.hpp" +#include "prx/libc/include/General.hpp" + +extern "C" { + +int APS5_VABI sceJscLegacyUnknown_1ltmAFyyuTY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1ltmAFyyuTY", sceJscLegacyUnknown_1ltmAFyyuTY_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_1vI7n0NDK5A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1vI7n0NDK5A", sceJscLegacyUnknown_1vI7n0NDK5A_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_2LjuMOz0Huw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2LjuMOz0Huw", sceJscLegacyUnknown_2LjuMOz0Huw_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_2T_plus_wNpL97hA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2T+wNpL97hA", sceJscLegacyUnknown_2T_plus_wNpL97hA_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_3NBpOpqlXLw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3NBpOpqlXLw", sceJscLegacyUnknown_3NBpOpqlXLw_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_3PYPan9HaUc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3PYPan9HaUc", sceJscLegacyUnknown_3PYPan9HaUc_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_4EgB2myNw30_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4EgB2myNw30", sceJscLegacyUnknown_4EgB2myNw30_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_4fWCBQp6dpU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4fWCBQp6dpU", sceJscLegacyUnknown_4fWCBQp6dpU_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_4rNwTKsu_minus_Yo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4rNwTKsu-Yo", sceJscLegacyUnknown_4rNwTKsu_minus_Yo_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_4rXkglfN_minus_zU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4rXkglfN-zU", sceJscLegacyUnknown_4rXkglfN_minus_zU_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_5fPWZogQ_plus_cA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5fPWZogQ+cA", sceJscLegacyUnknown_5fPWZogQ_plus_cA_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_5kWpFDZfzJo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5kWpFDZfzJo", sceJscLegacyUnknown_5kWpFDZfzJo_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_6FsIeMre8Q8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6FsIeMre8Q8", sceJscLegacyUnknown_6FsIeMre8Q8_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_6ViqJEpMCTI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6ViqJEpMCTI", sceJscLegacyUnknown_6ViqJEpMCTI_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_7leJXUoEpTI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7leJXUoEpTI", sceJscLegacyUnknown_7leJXUoEpTI_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_8m8ow0jgOt0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8m8ow0jgOt0", sceJscLegacyUnknown_8m8ow0jgOt0_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_8u9N9gPDYUw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8u9N9gPDYUw", sceJscLegacyUnknown_8u9N9gPDYUw_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_9F5Sj4paZRI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9F5Sj4paZRI", sceJscLegacyUnknown_9F5Sj4paZRI_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_9khel5Vjd2w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9khel5Vjd2w", sceJscLegacyUnknown_9khel5Vjd2w_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_9n4hSgs6_plus_3s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9n4hSgs6+3s", sceJscLegacyUnknown_9n4hSgs6_plus_3s_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_9w_minus_7ZjiH5IA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9w-7ZjiH5IA", sceJscLegacyUnknown_9w_minus_7ZjiH5IA_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_AS1ADdtdIsM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AS1ADdtdIsM", sceJscLegacyUnknown_AS1ADdtdIsM_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_Ab2SnolJqnM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ab2SnolJqnM", sceJscLegacyUnknown_Ab2SnolJqnM_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_Aquv9EuC1l8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Aquv9EuC1l8", sceJscLegacyUnknown_Aquv9EuC1l8_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_AvngEisH1bU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AvngEisH1bU", sceJscLegacyUnknown_AvngEisH1bU_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_AySE3F7Vpek_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AySE3F7Vpek", sceJscLegacyUnknown_AySE3F7Vpek_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_BV8Pb6uxFqE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BV8Pb6uxFqE", sceJscLegacyUnknown_BV8Pb6uxFqE_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_CbkaS7C3Hig_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CbkaS7C3Hig", sceJscLegacyUnknown_CbkaS7C3Hig_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_Ccryri_plus_NLTA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ccryri+NLTA", sceJscLegacyUnknown_Ccryri_plus_NLTA_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_CoCSdxl8BQ0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CoCSdxl8BQ0", sceJscLegacyUnknown_CoCSdxl8BQ0_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_DW1fCLHEE44_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DW1fCLHEE44", sceJscLegacyUnknown_DW1fCLHEE44_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_DhlMRns11E8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DhlMRns11E8", sceJscLegacyUnknown_DhlMRns11E8_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_EAIg2Gn1_minus_LI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EAIg2Gn1-LI", sceJscLegacyUnknown_EAIg2Gn1_minus_LI_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_EeNITvom5Rk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EeNITvom5Rk", sceJscLegacyUnknown_EeNITvom5Rk_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_EsKp8iBwvYY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EsKp8iBwvYY", sceJscLegacyUnknown_EsKp8iBwvYY_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_FFFhWCcPg6M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FFFhWCcPg6M", sceJscLegacyUnknown_FFFhWCcPg6M_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_FHlvn6PPP_plus_g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FHlvn6PPP+g", sceJscLegacyUnknown_FHlvn6PPP_plus_g_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_FVYB7IIuaoE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FVYB7IIuaoE", sceJscLegacyUnknown_FVYB7IIuaoE_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_FfKiMCov2SE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FfKiMCov2SE", sceJscLegacyUnknown_FfKiMCov2SE_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_FjnHRgk9IxM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FjnHRgk9IxM", sceJscLegacyUnknown_FjnHRgk9IxM_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_FoBddwLfphM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FoBddwLfphM", sceJscLegacyUnknown_FoBddwLfphM_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_Fu8AxlYjsaE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Fu8AxlYjsaE", sceJscLegacyUnknown_Fu8AxlYjsaE_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_GBszOLs8eUg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GBszOLs8eUg", sceJscLegacyUnknown_GBszOLs8eUg_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_GJb4mvM_minus_4L0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GJb4mvM-4L0", sceJscLegacyUnknown_GJb4mvM_minus_4L0_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_GYPt0JrQAEg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GYPt0JrQAEg", sceJscLegacyUnknown_GYPt0JrQAEg_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_GqkuC6oXppA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GqkuC6oXppA", sceJscLegacyUnknown_GqkuC6oXppA_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_H6ANjVQ4ffU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("H6ANjVQ4ffU", sceJscLegacyUnknown_H6ANjVQ4ffU_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_HCBJrafmCOk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HCBJrafmCOk", sceJscLegacyUnknown_HCBJrafmCOk_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_HN8MvfCT_minus_Us_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HN8MvfCT-Us", sceJscLegacyUnknown_HN8MvfCT_minus_Us_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_HNNNIyL293s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HNNNIyL293s", sceJscLegacyUnknown_HNNNIyL293s_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_HVBR9dQxqC0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HVBR9dQxqC0", sceJscLegacyUnknown_HVBR9dQxqC0_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_HjmQjfMb2VA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HjmQjfMb2VA", sceJscLegacyUnknown_HjmQjfMb2VA_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_Hx5k9hp9kyY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Hx5k9hp9kyY", sceJscLegacyUnknown_Hx5k9hp9kyY_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_I3IOLIQFlxQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("I3IOLIQFlxQ", sceJscLegacyUnknown_I3IOLIQFlxQ_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_IO88_minus_PkBhAE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IO88-PkBhAE", sceJscLegacyUnknown_IO88_minus_PkBhAE_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_IUo0jjFPjFw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IUo0jjFPjFw", sceJscLegacyUnknown_IUo0jjFPjFw_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_Ir0lsyLpQB8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ir0lsyLpQB8", sceJscLegacyUnknown_Ir0lsyLpQB8_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_IwIvO92zFQs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IwIvO92zFQs", sceJscLegacyUnknown_IwIvO92zFQs_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_K9q2setOBr0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("K9q2setOBr0", sceJscLegacyUnknown_K9q2setOBr0_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_Kr6YtxnrK_minus_M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Kr6YtxnrK-M", sceJscLegacyUnknown_Kr6YtxnrK_minus_M_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_L_plus_BOKR5S3mg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("L+BOKR5S3mg", sceJscLegacyUnknown_L_plus_BOKR5S3mg_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_LUoZYlw5EnU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LUoZYlw5EnU", sceJscLegacyUnknown_LUoZYlw5EnU_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_LdkRYOvB25E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LdkRYOvB25E", sceJscLegacyUnknown_LdkRYOvB25E_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_M5JRhfoHsPM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("M5JRhfoHsPM", sceJscLegacyUnknown_M5JRhfoHsPM_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_MHHjIYX6gMs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MHHjIYX6gMs", sceJscLegacyUnknown_MHHjIYX6gMs_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_MHx408JKMA0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MHx408JKMA0", sceJscLegacyUnknown_MHx408JKMA0_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_MK7qJxiIl_plus_0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MK7qJxiIl+0", sceJscLegacyUnknown_MK7qJxiIl_plus_0_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_MM8VpZAWCUg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MM8VpZAWCUg", sceJscLegacyUnknown_MM8VpZAWCUg_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_NKE5vAmeA_minus_o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NKE5vAmeA-o", sceJscLegacyUnknown_NKE5vAmeA_minus_o_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_OAO2JTA4Sxs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OAO2JTA4Sxs", sceJscLegacyUnknown_OAO2JTA4Sxs_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_OEbCNr9dISs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OEbCNr9dISs", sceJscLegacyUnknown_OEbCNr9dISs_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_OPk_plus_VfpeCek_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OPk+VfpeCek", sceJscLegacyUnknown_OPk_plus_VfpeCek_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_OYCZHcK_plus_hDc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OYCZHcK+hDc", sceJscLegacyUnknown_OYCZHcK_plus_hDc_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_OiqbmBScZ24_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OiqbmBScZ24", sceJscLegacyUnknown_OiqbmBScZ24_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_Or_plus_uVMoHADk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Or+uVMoHADk", sceJscLegacyUnknown_Or_plus_uVMoHADk_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_PPDIeeuz2B8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PPDIeeuz2B8", sceJscLegacyUnknown_PPDIeeuz2B8_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_Q_plus_bu_plus_FUpCqI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Q+bu+FUpCqI", sceJscLegacyUnknown_Q_plus_bu_plus_FUpCqI_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_Q6f_minus_t2dL0HQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Q6f-t2dL0HQ", sceJscLegacyUnknown_Q6f_minus_t2dL0HQ_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_QOzWBuxaP60_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QOzWBuxaP60", sceJscLegacyUnknown_QOzWBuxaP60_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_QjGfyW53SRc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QjGfyW53SRc", sceJscLegacyUnknown_QjGfyW53SRc_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_R02QiWYvp74_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("R02QiWYvp74", sceJscLegacyUnknown_R02QiWYvp74_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_RGubjN6I4Qs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RGubjN6I4Qs", sceJscLegacyUnknown_RGubjN6I4Qs_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_RH08Afgpods_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RH08Afgpods", sceJscLegacyUnknown_RH08Afgpods_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_Re0EOopQq2M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Re0EOopQq2M", sceJscLegacyUnknown_Re0EOopQq2M_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_RjPhhAMXXqU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RjPhhAMXXqU", sceJscLegacyUnknown_RjPhhAMXXqU_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_RxESdmR_plus_oEo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RxESdmR+oEo", sceJscLegacyUnknown_RxESdmR_plus_oEo_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_SlvlKAdTaqQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SlvlKAdTaqQ", sceJscLegacyUnknown_SlvlKAdTaqQ_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_SyPivvfm1ac_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SyPivvfm1ac", sceJscLegacyUnknown_SyPivvfm1ac_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_TNtABxYBSaw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TNtABxYBSaw", sceJscLegacyUnknown_TNtABxYBSaw_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_TWK37p54V_plus_g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TWK37p54V+g", sceJscLegacyUnknown_TWK37p54V_plus_g_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_TmO98uqZoE8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TmO98uqZoE8", sceJscLegacyUnknown_TmO98uqZoE8_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_Uz5JhHH5z5o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Uz5JhHH5z5o", sceJscLegacyUnknown_Uz5JhHH5z5o_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_VfBBDcKdt9E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VfBBDcKdt9E", sceJscLegacyUnknown_VfBBDcKdt9E_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_WQ0nGarhFOE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WQ0nGarhFOE", sceJscLegacyUnknown_WQ0nGarhFOE_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_WeQpWb13_minus_vk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WeQpWb13-vk", sceJscLegacyUnknown_WeQpWb13_minus_vk_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_WqiOCaxRWfo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WqiOCaxRWfo", sceJscLegacyUnknown_WqiOCaxRWfo_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_XlGMZGdTcP0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XlGMZGdTcP0", sceJscLegacyUnknown_XlGMZGdTcP0_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_YEomiEV1E7g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YEomiEV1E7g", sceJscLegacyUnknown_YEomiEV1E7g_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_YkteMJWChnI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YkteMJWChnI", sceJscLegacyUnknown_YkteMJWChnI_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_Z_minus_H26XtrDsY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Z-H26XtrDsY", sceJscLegacyUnknown_Z_minus_H26XtrDsY_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_ZNdqR4juqr0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZNdqR4juqr0", sceJscLegacyUnknown_ZNdqR4juqr0_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_ZQAK8OGpDO4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZQAK8OGpDO4", sceJscLegacyUnknown_ZQAK8OGpDO4_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_ZpWlCuQ_minus_A_plus_Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZpWlCuQ-A+Q", sceJscLegacyUnknown_ZpWlCuQ_minus_A_plus_Q_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_a14_plus_Sqrvr_plus_8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("a14+Sqrvr+8", sceJscLegacyUnknown_a14_plus_Sqrvr_plus_8_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_aQhlwYy6PD8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aQhlwYy6PD8", sceJscLegacyUnknown_aQhlwYy6PD8_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_abi3xMBV4Pc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("abi3xMBV4Pc", sceJscLegacyUnknown_abi3xMBV4Pc_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_aiMrw3MShgI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aiMrw3MShgI", sceJscLegacyUnknown_aiMrw3MShgI_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_bU8kj_plus_qSq8E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bU8kj+qSq8E", sceJscLegacyUnknown_bU8kj_plus_qSq8E_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_biVLfNfcZ4A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("biVLfNfcZ4A", sceJscLegacyUnknown_biVLfNfcZ4A_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_cmhG7wkwBcg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cmhG7wkwBcg", sceJscLegacyUnknown_cmhG7wkwBcg_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_d6y7mcKBkgM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("d6y7mcKBkgM", sceJscLegacyUnknown_d6y7mcKBkgM_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_dxGMonV0pkM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dxGMonV0pkM", sceJscLegacyUnknown_dxGMonV0pkM_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_e_minus_k60B14HBw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("e-k60B14HBw", sceJscLegacyUnknown_e_minus_k60B14HBw_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_eBXs6uG0HZE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eBXs6uG0HZE", sceJscLegacyUnknown_eBXs6uG0HZE_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_eOo_minus__plus_Zg6i1g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eOo-+Zg6i1g", sceJscLegacyUnknown_eOo_minus__plus_Zg6i1g_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_eplqt6mH_minus_9o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eplqt6mH-9o", sceJscLegacyUnknown_eplqt6mH_minus_9o_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_f8HhJCMtC8Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("f8HhJCMtC8Q", sceJscLegacyUnknown_f8HhJCMtC8Q_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_fJgRj2mZGpw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fJgRj2mZGpw", sceJscLegacyUnknown_fJgRj2mZGpw_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_fQh5MaD3OUg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fQh5MaD3OUg", sceJscLegacyUnknown_fQh5MaD3OUg_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_fR8gSj9xmeQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fR8gSj9xmeQ", sceJscLegacyUnknown_fR8gSj9xmeQ_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_fbvhAaRux_plus_0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fbvhAaRux+0", sceJscLegacyUnknown_fbvhAaRux_plus_0_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_gFlvNmUaVYI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gFlvNmUaVYI", sceJscLegacyUnknown_gFlvNmUaVYI_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_gahPm4BDCh4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gahPm4BDCh4", sceJscLegacyUnknown_gahPm4BDCh4_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_giUATEGYtTg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("giUATEGYtTg", sceJscLegacyUnknown_giUATEGYtTg_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_gve68fVQYAo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gve68fVQYAo", sceJscLegacyUnknown_gve68fVQYAo_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_hATk_minus_YlNy2g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hATk-YlNy2g", sceJscLegacyUnknown_hATk_minus_YlNy2g_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_hIr26pvu3tA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hIr26pvu3tA", sceJscLegacyUnknown_hIr26pvu3tA_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_hbg9_minus_bYvgbY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hbg9-bYvgbY", sceJscLegacyUnknown_hbg9_minus_bYvgbY_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_hvGSp7rj2RU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hvGSp7rj2RU", sceJscLegacyUnknown_hvGSp7rj2RU_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_hxkhCvDitnc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hxkhCvDitnc", sceJscLegacyUnknown_hxkhCvDitnc_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_iQ_plus_fE3Hz8oM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iQ+fE3Hz8oM", sceJscLegacyUnknown_iQ_plus_fE3Hz8oM_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_iQz_plus_TP1SYMc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iQz+TP1SYMc", sceJscLegacyUnknown_iQz_plus_TP1SYMc_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_iWXYETp96rs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iWXYETp96rs", sceJscLegacyUnknown_iWXYETp96rs_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_j_minus_DtpR_plus_c_minus_L8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("j-DtpR+c-L8", sceJscLegacyUnknown_j_minus_DtpR_plus_c_minus_L8_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_jPLQGNm6JF8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jPLQGNm6JF8", sceJscLegacyUnknown_jPLQGNm6JF8_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_jXKnl9o_plus_Qr0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jXKnl9o+Qr0", sceJscLegacyUnknown_jXKnl9o_plus_Qr0_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_jzflzfTsOUA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jzflzfTsOUA", sceJscLegacyUnknown_jzflzfTsOUA_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_k7OUqpSPwj4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("k7OUqpSPwj4", sceJscLegacyUnknown_k7OUqpSPwj4_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_kUsuzoxFVik_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kUsuzoxFVik", sceJscLegacyUnknown_kUsuzoxFVik_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_kt6OY9y7BeI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kt6OY9y7BeI", sceJscLegacyUnknown_kt6OY9y7BeI_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_lXAAtUp_minus_VT4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lXAAtUp-VT4", sceJscLegacyUnknown_lXAAtUp_minus_VT4_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_lzcQmfnbKVg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lzcQmfnbKVg", sceJscLegacyUnknown_lzcQmfnbKVg_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_n5QPPs_plus_RqkM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("n5QPPs+RqkM", sceJscLegacyUnknown_n5QPPs_plus_RqkM_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_nMn3TggOwso_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nMn3TggOwso", sceJscLegacyUnknown_nMn3TggOwso_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_nSrHoiuCTKA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nSrHoiuCTKA", sceJscLegacyUnknown_nSrHoiuCTKA_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_nYo3aWOnM0Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nYo3aWOnM0Y", sceJscLegacyUnknown_nYo3aWOnM0Y_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_nqVQ8s_plus_oTjc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nqVQ8s+oTjc", sceJscLegacyUnknown_nqVQ8s_plus_oTjc_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_o1G08_minus_hE8vc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("o1G08-hE8vc", sceJscLegacyUnknown_o1G08_minus_hE8vc_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_oChVQCK_minus_iZE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oChVQCK-iZE", sceJscLegacyUnknown_oChVQCK_minus_iZE_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_oMEm9ihtCbY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oMEm9ihtCbY", sceJscLegacyUnknown_oMEm9ihtCbY_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_oqt9KM5_plus_mjw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oqt9KM5+mjw", sceJscLegacyUnknown_oqt9KM5_plus_mjw_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_orYJL3tJx2E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("orYJL3tJx2E", sceJscLegacyUnknown_orYJL3tJx2E_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_oxX0AY0gWmk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oxX0AY0gWmk", sceJscLegacyUnknown_oxX0AY0gWmk_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_pS_minus_TVEH_plus_IMU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pS-TVEH+IMU", sceJscLegacyUnknown_pS_minus_TVEH_plus_IMU_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_pvRf2YD38ao_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pvRf2YD38ao", sceJscLegacyUnknown_pvRf2YD38ao_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_q_plus_RCF9lNURo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("q+RCF9lNURo", sceJscLegacyUnknown_q_plus_RCF9lNURo_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_q8znOzx38hc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("q8znOzx38hc", sceJscLegacyUnknown_q8znOzx38hc_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_qXJKxeEqmic_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qXJKxeEqmic", sceJscLegacyUnknown_qXJKxeEqmic_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_qgWF_minus_qoQ_plus_R8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qgWF-qoQ+R8", sceJscLegacyUnknown_qgWF_minus_qoQ_plus_R8_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_r6a_minus_IftYxWU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("r6a-IftYxWU", sceJscLegacyUnknown_r6a_minus_IftYxWU_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_rKVl_minus_biX8jw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rKVl-biX8jw", sceJscLegacyUnknown_rKVl_minus_biX8jw_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_rhJAq1MYySE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rhJAq1MYySE", sceJscLegacyUnknown_rhJAq1MYySE_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_rwXcAOpCnAA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rwXcAOpCnAA", sceJscLegacyUnknown_rwXcAOpCnAA_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_s_minus_XBRBn5djs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("s-XBRBn5djs", sceJscLegacyUnknown_s_minus_XBRBn5djs_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_s2JYrJe6Zuo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("s2JYrJe6Zuo", sceJscLegacyUnknown_s2JYrJe6Zuo_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_s7DDlZ4lEKM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("s7DDlZ4lEKM", sceJscLegacyUnknown_s7DDlZ4lEKM_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_sAJjj1NITcM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sAJjj1NITcM", sceJscLegacyUnknown_sAJjj1NITcM_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_sTEnCZ5sWOY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sTEnCZ5sWOY", sceJscLegacyUnknown_sTEnCZ5sWOY_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_sl19nLank4w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sl19nLank4w", sceJscLegacyUnknown_sl19nLank4w_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_smUYzLBhGeU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("smUYzLBhGeU", sceJscLegacyUnknown_smUYzLBhGeU_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_tShtKH_plus_FF6s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tShtKH+FF6s", sceJscLegacyUnknown_tShtKH_plus_FF6s_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_tZpSnzYhp9Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tZpSnzYhp9Q", sceJscLegacyUnknown_tZpSnzYhp9Q_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_ttuNAM8JMDc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ttuNAM8JMDc", sceJscLegacyUnknown_ttuNAM8JMDc_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_uKOneIfJrbs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uKOneIfJrbs", sceJscLegacyUnknown_uKOneIfJrbs_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_uOXvPwJZ_plus_2w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uOXvPwJZ+2w", sceJscLegacyUnknown_uOXvPwJZ_plus_2w_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_uZE97FeWiKs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uZE97FeWiKs", sceJscLegacyUnknown_uZE97FeWiKs_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_ulFPuTDRh3U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ulFPuTDRh3U", sceJscLegacyUnknown_ulFPuTDRh3U_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_vYb5IYXfmuc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vYb5IYXfmuc", sceJscLegacyUnknown_vYb5IYXfmuc_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_vhmAOnNcTqE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vhmAOnNcTqE", sceJscLegacyUnknown_vhmAOnNcTqE_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_vtL_minus_VxXOi_plus_U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vtL-VxXOi+U", sceJscLegacyUnknown_vtL_minus_VxXOi_plus_U_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_vvwFM5P4jLs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vvwFM5P4jLs", sceJscLegacyUnknown_vvwFM5P4jLs_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_w9Nsaw9iEHg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("w9Nsaw9iEHg", sceJscLegacyUnknown_w9Nsaw9iEHg_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_wDQjpdaJG9A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wDQjpdaJG9A", sceJscLegacyUnknown_wDQjpdaJG9A_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_wGByAWBOtd4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wGByAWBOtd4", sceJscLegacyUnknown_wGByAWBOtd4_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_wa0ENtgf4mI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wa0ENtgf4mI", sceJscLegacyUnknown_wa0ENtgf4mI_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_weJ7sVMp_minus_Xo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("weJ7sVMp-Xo", sceJscLegacyUnknown_weJ7sVMp_minus_Xo_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_xIRTqklHvOE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xIRTqklHvOE", sceJscLegacyUnknown_xIRTqklHvOE_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_xN8ylEqf_plus_8U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xN8ylEqf+8U", sceJscLegacyUnknown_xN8ylEqf_plus_8U_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_xT2qjFxeXB4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xT2qjFxeXB4", sceJscLegacyUnknown_xT2qjFxeXB4_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_xT41NJu_plus_3vg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xT41NJu+3vg", sceJscLegacyUnknown_xT41NJu_plus_3vg_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_xt2r_minus_7qWZL8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xt2r-7qWZL8", sceJscLegacyUnknown_xt2r_minus_7qWZL8_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_y1fI457JCrA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("y1fI457JCrA", sceJscLegacyUnknown_y1fI457JCrA_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_yQ8js9JjOx4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yQ8js9JjOx4", sceJscLegacyUnknown_yQ8js9JjOx4_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_yfM7279lnTU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yfM7279lnTU", sceJscLegacyUnknown_yfM7279lnTU_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_z_plus_wmg9OZiSo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("z+wmg9OZiSo", sceJscLegacyUnknown_z_plus_wmg9OZiSo_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_z7qlJZ6B0po_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("z7qlJZ6B0po", sceJscLegacyUnknown_z7qlJZ6B0po_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_zBbfvllFSSs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zBbfvllFSSs", sceJscLegacyUnknown_zBbfvllFSSs_nid_no_patch); + +int APS5_VABI sceJscLegacyUnknown_zevFdK2mpc0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zevFdK2mpc0", sceJscLegacyUnknown_zevFdK2mpc0_nid_no_patch); + +} diff --git a/core/libs/prx/libSceJsc/include/Api.hpp b/core/libs/prx/libSceJsc/include/Api.hpp index e4c285ccf1..b5b8bfd055 100644 --- a/core/libs/prx/libSceJsc/include/Api.hpp +++ b/core/libs/prx/libSceJsc/include/Api.hpp @@ -22,14 +22,14 @@ template constexpr bool GuestJSStringValidLength(std::size_t leng extern "C" { -GuestJSString* APS5_VABI JSStringCreateWithCharacters(const std::uint16_t* characters, std::size_t count); -GuestJSString* APS5_VABI JSStringCreateWithUTF8CString(const char* text); -GuestJSString* APS5_VABI JSStringRetain(GuestJSString* string); -void APS5_VABI JSStringRelease(GuestJSString* string); -std::size_t APS5_VABI JSStringGetLength(const GuestJSString* string); -const std::uint16_t* APS5_VABI JSStringGetCharactersPtr(const GuestJSString* string); -std::size_t APS5_VABI JSStringGetMaximumUTF8CStringSize(const GuestJSString* string); -std::size_t APS5_VABI JSStringGetUTF8CString(const GuestJSString* string, char* buffer, std::size_t bufferSize); +GuestJSString* APS5_VABI JSStringCreateWithCharacters_nid_postfix(const std::uint16_t* characters, std::size_t count); +GuestJSString* APS5_VABI JSStringCreateWithUTF8CString_nid_postfix(const char* text); +GuestJSString* APS5_VABI JSStringRetain_nid_postfix(GuestJSString* string); +void APS5_VABI JSStringRelease_nid_postfix(GuestJSString* string); +std::size_t APS5_VABI JSStringGetLength_nid_postfix(const GuestJSString* string); +const std::uint16_t* APS5_VABI JSStringGetCharactersPtr_nid_postfix(const GuestJSString* string); +std::size_t APS5_VABI JSStringGetMaximumUTF8CStringSize_nid_postfix(const GuestJSString* string); +std::size_t APS5_VABI JSStringGetUTF8CString_nid_postfix(const GuestJSString* string, char* buffer, std::size_t bufferSize); bool APS5_VABI JSStringIsEqual(const GuestJSString* first, const GuestJSString* second); bool APS5_VABI JSStringIsEqualToUTF8CString(const GuestJSString* string, const char* text); diff --git a/core/libs/prx/libSceJsc/include/LegacyExports.hpp b/core/libs/prx/libSceJsc/include/LegacyExports.hpp new file mode 100644 index 0000000000..a877744b90 --- /dev/null +++ b/core/libs/prx/libSceJsc/include/LegacyExports.hpp @@ -0,0 +1,206 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI sceJscLegacyUnknown_1ltmAFyyuTY_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_1vI7n0NDK5A_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_2LjuMOz0Huw_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_2T_plus_wNpL97hA_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_3NBpOpqlXLw_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_3PYPan9HaUc_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_4EgB2myNw30_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_4fWCBQp6dpU_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_4rNwTKsu_minus_Yo_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_4rXkglfN_minus_zU_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_5fPWZogQ_plus_cA_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_5kWpFDZfzJo_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_6FsIeMre8Q8_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_6ViqJEpMCTI_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_7leJXUoEpTI_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_8m8ow0jgOt0_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_8u9N9gPDYUw_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_9F5Sj4paZRI_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_9khel5Vjd2w_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_9n4hSgs6_plus_3s_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_9w_minus_7ZjiH5IA_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_AS1ADdtdIsM_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_Ab2SnolJqnM_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_Aquv9EuC1l8_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_AvngEisH1bU_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_AySE3F7Vpek_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_BV8Pb6uxFqE_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_CbkaS7C3Hig_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_Ccryri_plus_NLTA_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_CoCSdxl8BQ0_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_DW1fCLHEE44_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_DhlMRns11E8_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_EAIg2Gn1_minus_LI_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_EeNITvom5Rk_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_EsKp8iBwvYY_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_FFFhWCcPg6M_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_FHlvn6PPP_plus_g_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_FVYB7IIuaoE_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_FfKiMCov2SE_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_FjnHRgk9IxM_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_FoBddwLfphM_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_Fu8AxlYjsaE_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_GBszOLs8eUg_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_GJb4mvM_minus_4L0_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_GYPt0JrQAEg_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_GqkuC6oXppA_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_H6ANjVQ4ffU_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_HCBJrafmCOk_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_HN8MvfCT_minus_Us_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_HNNNIyL293s_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_HVBR9dQxqC0_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_HjmQjfMb2VA_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_Hx5k9hp9kyY_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_I3IOLIQFlxQ_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_IO88_minus_PkBhAE_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_IUo0jjFPjFw_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_Ir0lsyLpQB8_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_IwIvO92zFQs_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_K9q2setOBr0_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_Kr6YtxnrK_minus_M_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_L_plus_BOKR5S3mg_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_LUoZYlw5EnU_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_LdkRYOvB25E_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_M5JRhfoHsPM_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_MHHjIYX6gMs_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_MHx408JKMA0_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_MK7qJxiIl_plus_0_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_MM8VpZAWCUg_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_NKE5vAmeA_minus_o_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_OAO2JTA4Sxs_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_OEbCNr9dISs_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_OPk_plus_VfpeCek_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_OYCZHcK_plus_hDc_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_OiqbmBScZ24_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_Or_plus_uVMoHADk_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_PPDIeeuz2B8_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_Q_plus_bu_plus_FUpCqI_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_Q6f_minus_t2dL0HQ_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_QOzWBuxaP60_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_QjGfyW53SRc_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_R02QiWYvp74_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_RGubjN6I4Qs_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_RH08Afgpods_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_Re0EOopQq2M_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_RjPhhAMXXqU_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_RxESdmR_plus_oEo_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_SlvlKAdTaqQ_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_SyPivvfm1ac_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_TNtABxYBSaw_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_TWK37p54V_plus_g_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_TmO98uqZoE8_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_Uz5JhHH5z5o_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_VfBBDcKdt9E_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_WQ0nGarhFOE_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_WeQpWb13_minus_vk_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_WqiOCaxRWfo_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_XlGMZGdTcP0_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_YEomiEV1E7g_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_YkteMJWChnI_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_Z_minus_H26XtrDsY_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_ZNdqR4juqr0_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_ZQAK8OGpDO4_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_ZpWlCuQ_minus_A_plus_Q_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_a14_plus_Sqrvr_plus_8_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_aQhlwYy6PD8_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_abi3xMBV4Pc_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_aiMrw3MShgI_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_bU8kj_plus_qSq8E_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_biVLfNfcZ4A_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_cmhG7wkwBcg_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_d6y7mcKBkgM_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_dxGMonV0pkM_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_e_minus_k60B14HBw_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_eBXs6uG0HZE_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_eOo_minus__plus_Zg6i1g_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_eplqt6mH_minus_9o_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_f8HhJCMtC8Q_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_fJgRj2mZGpw_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_fQh5MaD3OUg_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_fR8gSj9xmeQ_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_fbvhAaRux_plus_0_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_gFlvNmUaVYI_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_gahPm4BDCh4_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_giUATEGYtTg_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_gve68fVQYAo_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_hATk_minus_YlNy2g_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_hIr26pvu3tA_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_hbg9_minus_bYvgbY_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_hvGSp7rj2RU_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_hxkhCvDitnc_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_iQ_plus_fE3Hz8oM_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_iQz_plus_TP1SYMc_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_iWXYETp96rs_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_j_minus_DtpR_plus_c_minus_L8_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_jPLQGNm6JF8_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_jXKnl9o_plus_Qr0_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_jzflzfTsOUA_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_k7OUqpSPwj4_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_kUsuzoxFVik_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_kt6OY9y7BeI_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_lXAAtUp_minus_VT4_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_lzcQmfnbKVg_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_n5QPPs_plus_RqkM_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_nMn3TggOwso_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_nSrHoiuCTKA_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_nYo3aWOnM0Y_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_nqVQ8s_plus_oTjc_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_o1G08_minus_hE8vc_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_oChVQCK_minus_iZE_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_oMEm9ihtCbY_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_oqt9KM5_plus_mjw_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_orYJL3tJx2E_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_oxX0AY0gWmk_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_pS_minus_TVEH_plus_IMU_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_pvRf2YD38ao_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_q_plus_RCF9lNURo_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_q8znOzx38hc_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_qXJKxeEqmic_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_qgWF_minus_qoQ_plus_R8_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_r6a_minus_IftYxWU_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_rKVl_minus_biX8jw_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_rhJAq1MYySE_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_rwXcAOpCnAA_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_s_minus_XBRBn5djs_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_s2JYrJe6Zuo_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_s7DDlZ4lEKM_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_sAJjj1NITcM_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_sTEnCZ5sWOY_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_sl19nLank4w_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_smUYzLBhGeU_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_tShtKH_plus_FF6s_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_tZpSnzYhp9Q_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_ttuNAM8JMDc_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_uKOneIfJrbs_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_uOXvPwJZ_plus_2w_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_uZE97FeWiKs_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_ulFPuTDRh3U_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_vYb5IYXfmuc_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_vhmAOnNcTqE_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_vtL_minus_VxXOi_plus_U_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_vvwFM5P4jLs_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_w9Nsaw9iEHg_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_wDQjpdaJG9A_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_wGByAWBOtd4_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_wa0ENtgf4mI_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_weJ7sVMp_minus_Xo_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_xIRTqklHvOE_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_xN8ylEqf_plus_8U_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_xT2qjFxeXB4_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_xT41NJu_plus_3vg_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_xt2r_minus_7qWZL8_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_y1fI457JCrA_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_yQ8js9JjOx4_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_yfM7279lnTU_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_z_plus_wmg9OZiSo_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_z7qlJZ6B0po_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_zBbfvllFSSs_nid_no_patch(); +int APS5_VABI sceJscLegacyUnknown_zevFdK2mpc0_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceJsc/libSceJsc.hpp b/core/libs/prx/libSceJsc/libSceJsc.hpp index 28a1869c2c..528053545f 100644 --- a/core/libs/prx/libSceJsc/libSceJsc.hpp +++ b/core/libs/prx/libSceJsc/libSceJsc.hpp @@ -1,3 +1,5 @@ #pragma once +#include "prx/libSceJsc/include/LegacyExports.hpp" + #include "prx/libSceJsc/include/Api.hpp" diff --git a/core/libs/prx/libSceJxr/CMakeLists.txt b/core/libs/prx/libSceJxr/CMakeLists.txt index c94b793736..5d76a6870f 100644 --- a/core/libs/prx/libSceJxr/CMakeLists.txt +++ b/core/libs/prx/libSceJxr/CMakeLists.txt @@ -2,7 +2,7 @@ add_library(jxr_lookup_native STATIC src/NativeLookup.c) configure_jxr_native(jxr_lookup_native) target_include_directories(jxr_lookup_native PRIVATE ${LIBS_INCLUDE_DIR}) target_link_libraries(jxr_lookup_native PRIVATE jxr) -add_library(libSceJxr SHARED EXCLUDE_FROM_ALL Export.cpp src/PixelFormatLookup.cpp) +add_library(libSceJxr SHARED EXCLUDE_FROM_ALL Export.cpp src/PixelFormatLookup.cpp src/GuidExports.cpp) target_link_libraries(libSceJxr PRIVATE jxr_lookup_native) if(NOT APPLE) target_link_options(libSceJxr PRIVATE LINKER:--exclude-libs,ALL) diff --git a/core/libs/prx/libSceJxr/include/GuidExports.hpp b/core/libs/prx/libSceJxr/include/GuidExports.hpp new file mode 100644 index 0000000000..cd36d73a03 --- /dev/null +++ b/core/libs/prx/libSceJxr/include/GuidExports.hpp @@ -0,0 +1,107 @@ +#pragma once + +#include + +struct JxrGuestGuid { + std::uint32_t data1; + std::uint16_t data2; + std::uint16_t data3; + std::uint8_t data4[8]; +}; + +static_assert(sizeof(JxrGuestGuid) == 16); + +extern "C" { + +extern const std::uint32_t JxrGuest_IID_PKImageScanEncode_nid_no_patch; +extern const std::uint32_t JxrGuest_IID_PKImageFrameEncode_nid_no_patch; +extern const std::uint32_t JxrGuest_IID_PKImageWmpEncode_nid_no_patch; +extern const std::uint32_t JxrGuest_IID_PKImageWmpDecode_nid_no_patch; + +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormatDontCare_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormatBlackWhite_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat8bppGray_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat16bppRGB555_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat16bppRGB565_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat16bppGray_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat24bppBGR_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat24bppRGB_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat32bppBGR_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat32bppBGRA_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat32bppPBGRA_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat32bppGrayFloat_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat32bppRGB_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat32bppRGBA_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat32bppPRGBA_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat48bppRGBFixedPoint_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat16bppGrayFixedPoint_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat32bppRGB101010_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat48bppRGB_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat64bppRGBA_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat64bppPRGBA_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat96bppRGBFixedPoint_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat96bppRGBFloat_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat128bppRGBAFloat_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat128bppPRGBAFloat_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat128bppRGBFloat_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat32bppCMYK_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat64bppRGBAFixedPoint_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat64bppRGBFixedPoint_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat128bppRGBAFixedPoint_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat128bppRGBFixedPoint_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat64bppRGBAHalf_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat64bppRGBHalf_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat48bppRGBHalf_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat32bppRGBE_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat16bppGrayHalf_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat32bppGrayFixedPoint_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat64bppCMYK_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat24bpp3Channels_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat32bpp4Channels_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat40bpp5Channels_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat48bpp6Channels_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat56bpp7Channels_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat64bpp8Channels_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat48bpp3Channels_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat64bpp4Channels_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat80bpp5Channels_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat96bpp6Channels_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat112bpp7Channels_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat128bpp8Channels_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat40bppCMYKAlpha_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat80bppCMYKAlpha_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat32bpp3ChannelsAlpha_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat40bpp4ChannelsAlpha_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat48bpp5ChannelsAlpha_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat56bpp6ChannelsAlpha_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat64bpp7ChannelsAlpha_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat72bpp8ChannelsAlpha_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat64bpp3ChannelsAlpha_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat80bpp4ChannelsAlpha_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat96bpp5ChannelsAlpha_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat112bpp6ChannelsAlpha_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat128bpp7ChannelsAlpha_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat144bpp8ChannelsAlpha_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat12bppYCC420_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat16bppYCC422_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat20bppYCC422_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat32bppYCC422_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat24bppYCC444_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat30bppYCC444_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat48bppYCC444_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat16bpp48bppYCC444FixedPoint_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat20bppYCC420Alpha_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat24bppYCC422Alpha_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat30bppYCC422Alpha_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat48bppYCC422Alpha_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat32bppYCC444Alpha_nid_no_patch; + +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat40bppYCC444Alpha_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat64bppYCC444Alpha_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat64bppYCC444AlphaFixedPoint_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat32bppCMYKDIRECT_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat64bppCMYKDIRECT_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat40bppCMYKDIRECTAlpha_nid_no_patch; +extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat80bppCMYKDIRECTAlpha_nid_no_patch; + +} diff --git a/core/libs/prx/libSceJxr/libSceJxr.hpp b/core/libs/prx/libSceJxr/libSceJxr.hpp index e92de5c284..c9875fcd39 100644 --- a/core/libs/prx/libSceJxr/libSceJxr.hpp +++ b/core/libs/prx/libSceJxr/libSceJxr.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceJxr/include/Api.hpp" +#include "prx/libSceJxr/include/GuidExports.hpp" diff --git a/core/libs/prx/libSceJxr/src/GuidExports.cpp b/core/libs/prx/libSceJxr/src/GuidExports.cpp new file mode 100644 index 0000000000..101b322790 --- /dev/null +++ b/core/libs/prx/libSceJxr/src/GuidExports.cpp @@ -0,0 +1,271 @@ +#include "prx/libSceJxr/include/GuidExports.hpp" +#include "prx/libc/include/general/ExportMacros.hpp" + +extern "C" { + +extern const std::uint32_t JxrGuest_IID_PKImageScanEncode_nid_no_patch = 1; +APS5_EXPORT("k+4-1XDjo9w", JxrGuest_IID_PKImageScanEncode_nid_no_patch); + +extern const std::uint32_t JxrGuest_IID_PKImageFrameEncode_nid_no_patch = 2; +APS5_EXPORT("HCxT7mELyYA", JxrGuest_IID_PKImageFrameEncode_nid_no_patch); + +extern const std::uint32_t JxrGuest_IID_PKImageWmpEncode_nid_no_patch = 101; +APS5_EXPORT("qpgXDRp+K6M", JxrGuest_IID_PKImageWmpEncode_nid_no_patch); + +extern const std::uint32_t JxrGuest_IID_PKImageWmpDecode_nid_no_patch = 201; +APS5_EXPORT("ggCncb0pD6w", JxrGuest_IID_PKImageWmpDecode_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormatDontCare_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x00}}; +APS5_EXPORT("ARu4CYmNAv4", JxrGuest_GUID_PKPixelFormatDontCare_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormatBlackWhite_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x05}}; +APS5_EXPORT("PO3BC1DgHLE", JxrGuest_GUID_PKPixelFormatBlackWhite_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat8bppGray_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x08}}; +APS5_EXPORT("SPdQvn+6-IA", JxrGuest_GUID_PKPixelFormat8bppGray_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat16bppRGB555_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x09}}; +APS5_EXPORT("ZzhKDfRQLJM", JxrGuest_GUID_PKPixelFormat16bppRGB555_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat16bppRGB565_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x0a}}; +APS5_EXPORT("d7qKE91sSbo", JxrGuest_GUID_PKPixelFormat16bppRGB565_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat16bppGray_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x0b}}; +APS5_EXPORT("dgRB7DymShE", JxrGuest_GUID_PKPixelFormat16bppGray_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat24bppBGR_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x0c}}; +APS5_EXPORT("TDdhPFYpZAU", JxrGuest_GUID_PKPixelFormat24bppBGR_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat24bppRGB_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x0d}}; +APS5_EXPORT("WQqAaPODWYI", JxrGuest_GUID_PKPixelFormat24bppRGB_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat32bppBGR_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x0e}}; +APS5_EXPORT("unIMs0yxFZs", JxrGuest_GUID_PKPixelFormat32bppBGR_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat32bppBGRA_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x0f}}; +APS5_EXPORT("5u2pHqFmb9g", JxrGuest_GUID_PKPixelFormat32bppBGRA_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat32bppPBGRA_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x10}}; +APS5_EXPORT("05eGAnryyiw", JxrGuest_GUID_PKPixelFormat32bppPBGRA_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat32bppGrayFloat_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x11}}; +APS5_EXPORT("vZTU4AyhEOk", JxrGuest_GUID_PKPixelFormat32bppGrayFloat_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat32bppRGB_nid_no_patch = {0xd98c6b95, 0x3efe, 0x47d6, {0xbb, 0x25, 0xeb, 0x17, 0x48, 0xab, 0x0c, 0xf1}}; +APS5_EXPORT("5MaZkdEc9BQ", JxrGuest_GUID_PKPixelFormat32bppRGB_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat32bppRGBA_nid_no_patch = {0xf5c7ad2d, 0x6a8d, 0x43dd, {0xa7, 0xa8, 0xa2, 0x99, 0x35, 0x26, 0x1a, 0xe9}}; +APS5_EXPORT("mgkns1BblWY", JxrGuest_GUID_PKPixelFormat32bppRGBA_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat32bppPRGBA_nid_no_patch = {0x3cc4a650, 0xa527, 0x4d37, {0xa9, 0x16, 0x31, 0x42, 0xc7, 0xeb, 0xed, 0xba}}; +APS5_EXPORT("L0Si5auWTEo", JxrGuest_GUID_PKPixelFormat32bppPRGBA_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat48bppRGBFixedPoint_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x12}}; +APS5_EXPORT("DnkFj6lZF5w", JxrGuest_GUID_PKPixelFormat48bppRGBFixedPoint_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat16bppGrayFixedPoint_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x13}}; +APS5_EXPORT("Wt4oOBGF0So", JxrGuest_GUID_PKPixelFormat16bppGrayFixedPoint_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat32bppRGB101010_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x14}}; +APS5_EXPORT("uFpo2xCrPG8", JxrGuest_GUID_PKPixelFormat32bppRGB101010_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat48bppRGB_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x15}}; +APS5_EXPORT("+YIdytIXyvU", JxrGuest_GUID_PKPixelFormat48bppRGB_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat64bppRGBA_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x16}}; +APS5_EXPORT("46z48JE1paw", JxrGuest_GUID_PKPixelFormat64bppRGBA_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat64bppPRGBA_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x17}}; +APS5_EXPORT("qFTJ2V+wm-Q", JxrGuest_GUID_PKPixelFormat64bppPRGBA_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat96bppRGBFixedPoint_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x18}}; +APS5_EXPORT("wngGhyFkshU", JxrGuest_GUID_PKPixelFormat96bppRGBFixedPoint_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat96bppRGBFloat_nid_no_patch = {0xe3fed78f, 0xe8db, 0x4acf, {0x84, 0xc1, 0xe9, 0x7f, 0x61, 0x36, 0xb3, 0x27}}; +APS5_EXPORT("KZ2B9jzXu54", JxrGuest_GUID_PKPixelFormat96bppRGBFloat_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat128bppRGBAFloat_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x19}}; +APS5_EXPORT("GbfEgFicT7k", JxrGuest_GUID_PKPixelFormat128bppRGBAFloat_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat128bppPRGBAFloat_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x1a}}; +APS5_EXPORT("WRFinIMCpJU", JxrGuest_GUID_PKPixelFormat128bppPRGBAFloat_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat128bppRGBFloat_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x1b}}; +APS5_EXPORT("YDuGS0CuL2s", JxrGuest_GUID_PKPixelFormat128bppRGBFloat_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat32bppCMYK_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x1c}}; +APS5_EXPORT("DiqVd7P8DY0", JxrGuest_GUID_PKPixelFormat32bppCMYK_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat64bppRGBAFixedPoint_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x1d}}; +APS5_EXPORT("06f2DnK44YY", JxrGuest_GUID_PKPixelFormat64bppRGBAFixedPoint_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat64bppRGBFixedPoint_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x40}}; +APS5_EXPORT("ABnV+vmQiJI", JxrGuest_GUID_PKPixelFormat64bppRGBFixedPoint_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat128bppRGBAFixedPoint_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x1e}}; +APS5_EXPORT("GTWRpdSwpKw", JxrGuest_GUID_PKPixelFormat128bppRGBAFixedPoint_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat128bppRGBFixedPoint_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x41}}; +APS5_EXPORT("PdXB8yu44fw", JxrGuest_GUID_PKPixelFormat128bppRGBFixedPoint_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat64bppRGBAHalf_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x3a}}; +APS5_EXPORT("U0MM8JPlZI8", JxrGuest_GUID_PKPixelFormat64bppRGBAHalf_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat64bppRGBHalf_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x42}}; +APS5_EXPORT("Ql-oH0xyvDI", JxrGuest_GUID_PKPixelFormat64bppRGBHalf_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat48bppRGBHalf_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x3b}}; +APS5_EXPORT("QFvdVWU36Q0", JxrGuest_GUID_PKPixelFormat48bppRGBHalf_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat32bppRGBE_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x3d}}; +APS5_EXPORT("A4t28oTv8g8", JxrGuest_GUID_PKPixelFormat32bppRGBE_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat16bppGrayHalf_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x3e}}; +APS5_EXPORT("RQx6tTbZ3xQ", JxrGuest_GUID_PKPixelFormat16bppGrayHalf_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat32bppGrayFixedPoint_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x3f}}; +APS5_EXPORT("xnAN-Ufho9I", JxrGuest_GUID_PKPixelFormat32bppGrayFixedPoint_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat64bppCMYK_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x1f}}; +APS5_EXPORT("HLF+65tDspU", JxrGuest_GUID_PKPixelFormat64bppCMYK_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat24bpp3Channels_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x20}}; +APS5_EXPORT("fCFuyvBe1NQ", JxrGuest_GUID_PKPixelFormat24bpp3Channels_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat32bpp4Channels_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x21}}; +APS5_EXPORT("L1VdkAJD+sQ", JxrGuest_GUID_PKPixelFormat32bpp4Channels_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat40bpp5Channels_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x22}}; +APS5_EXPORT("04gezThSOq8", JxrGuest_GUID_PKPixelFormat40bpp5Channels_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat48bpp6Channels_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x23}}; +APS5_EXPORT("lHcp7BFLHug", JxrGuest_GUID_PKPixelFormat48bpp6Channels_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat56bpp7Channels_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x24}}; +APS5_EXPORT("f+pGjW7yNOo", JxrGuest_GUID_PKPixelFormat56bpp7Channels_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat64bpp8Channels_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x25}}; +APS5_EXPORT("yw0GhXXFVNs", JxrGuest_GUID_PKPixelFormat64bpp8Channels_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat48bpp3Channels_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x26}}; +APS5_EXPORT("ceYJzakllDw", JxrGuest_GUID_PKPixelFormat48bpp3Channels_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat64bpp4Channels_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x27}}; +APS5_EXPORT("k+DoNFUeaBM", JxrGuest_GUID_PKPixelFormat64bpp4Channels_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat80bpp5Channels_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x28}}; +APS5_EXPORT("6GsFuAd3Bn0", JxrGuest_GUID_PKPixelFormat80bpp5Channels_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat96bpp6Channels_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x29}}; +APS5_EXPORT("UCr7TmGqlaU", JxrGuest_GUID_PKPixelFormat96bpp6Channels_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat112bpp7Channels_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x2a}}; +APS5_EXPORT("4ls+WFa2W40", JxrGuest_GUID_PKPixelFormat112bpp7Channels_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat128bpp8Channels_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x2b}}; +APS5_EXPORT("lYUnVyUIGzs", JxrGuest_GUID_PKPixelFormat128bpp8Channels_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat40bppCMYKAlpha_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x2c}}; +APS5_EXPORT("ngysx11SmnA", JxrGuest_GUID_PKPixelFormat40bppCMYKAlpha_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat80bppCMYKAlpha_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x2d}}; +APS5_EXPORT("WfTaV5a-YsI", JxrGuest_GUID_PKPixelFormat80bppCMYKAlpha_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat32bpp3ChannelsAlpha_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x2e}}; +APS5_EXPORT("F8mgUbD0rZw", JxrGuest_GUID_PKPixelFormat32bpp3ChannelsAlpha_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat40bpp4ChannelsAlpha_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x2f}}; +APS5_EXPORT("LSORoadastA", JxrGuest_GUID_PKPixelFormat40bpp4ChannelsAlpha_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat48bpp5ChannelsAlpha_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x30}}; +APS5_EXPORT("NLSGYFs2xwk", JxrGuest_GUID_PKPixelFormat48bpp5ChannelsAlpha_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat56bpp6ChannelsAlpha_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x31}}; +APS5_EXPORT("zlIvPlVwIqo", JxrGuest_GUID_PKPixelFormat56bpp6ChannelsAlpha_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat64bpp7ChannelsAlpha_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x32}}; +APS5_EXPORT("M-dFaQXoQyU", JxrGuest_GUID_PKPixelFormat64bpp7ChannelsAlpha_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat72bpp8ChannelsAlpha_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x33}}; +APS5_EXPORT("ETD8h9pcZpI", JxrGuest_GUID_PKPixelFormat72bpp8ChannelsAlpha_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat64bpp3ChannelsAlpha_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x34}}; +APS5_EXPORT("Y03aWqjKxXE", JxrGuest_GUID_PKPixelFormat64bpp3ChannelsAlpha_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat80bpp4ChannelsAlpha_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x35}}; +APS5_EXPORT("lE6q7pwIi3Y", JxrGuest_GUID_PKPixelFormat80bpp4ChannelsAlpha_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat96bpp5ChannelsAlpha_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x36}}; +APS5_EXPORT("jNEmLmHfAQg", JxrGuest_GUID_PKPixelFormat96bpp5ChannelsAlpha_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat112bpp6ChannelsAlpha_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x37}}; +APS5_EXPORT("XrurdHYlD-k", JxrGuest_GUID_PKPixelFormat112bpp6ChannelsAlpha_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat128bpp7ChannelsAlpha_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x38}}; +APS5_EXPORT("f4WRNvD4kCQ", JxrGuest_GUID_PKPixelFormat128bpp7ChannelsAlpha_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat144bpp8ChannelsAlpha_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x39}}; +APS5_EXPORT("Qomd+yNVG40", JxrGuest_GUID_PKPixelFormat144bpp8ChannelsAlpha_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat12bppYCC420_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x44}}; +APS5_EXPORT("bZ4uODE6+pQ", JxrGuest_GUID_PKPixelFormat12bppYCC420_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat16bppYCC422_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x45}}; +APS5_EXPORT("p77vi6TJETU", JxrGuest_GUID_PKPixelFormat16bppYCC422_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat20bppYCC422_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x46}}; +APS5_EXPORT("l5X1-80+dGc", JxrGuest_GUID_PKPixelFormat20bppYCC422_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat32bppYCC422_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x47}}; +APS5_EXPORT("8wflBNXIjoY", JxrGuest_GUID_PKPixelFormat32bppYCC422_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat24bppYCC444_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x48}}; +APS5_EXPORT("zsIlykImlTQ", JxrGuest_GUID_PKPixelFormat24bppYCC444_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat30bppYCC444_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x49}}; +APS5_EXPORT("swODZdeYsFg", JxrGuest_GUID_PKPixelFormat30bppYCC444_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat48bppYCC444_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x4a}}; +APS5_EXPORT("lvCPvJ5n7UU", JxrGuest_GUID_PKPixelFormat48bppYCC444_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat16bpp48bppYCC444FixedPoint_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x4b}}; +APS5_EXPORT("H9hiD5bYlYE", JxrGuest_GUID_PKPixelFormat16bpp48bppYCC444FixedPoint_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat20bppYCC420Alpha_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x4c}}; +APS5_EXPORT("n6VjiS1qwmc", JxrGuest_GUID_PKPixelFormat20bppYCC420Alpha_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat24bppYCC422Alpha_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x4d}}; +APS5_EXPORT("PKVFXcnzRcI", JxrGuest_GUID_PKPixelFormat24bppYCC422Alpha_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat30bppYCC422Alpha_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x4e}}; +APS5_EXPORT("VvWreHEx5FM", JxrGuest_GUID_PKPixelFormat30bppYCC422Alpha_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat48bppYCC422Alpha_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x4f}}; +APS5_EXPORT("Khk7j95AFxY", JxrGuest_GUID_PKPixelFormat48bppYCC422Alpha_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat32bppYCC444Alpha_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x50}}; +APS5_EXPORT("JunvTxpYsIs", JxrGuest_GUID_PKPixelFormat32bppYCC444Alpha_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat40bppYCC444Alpha_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x51}}; +APS5_EXPORT("jZNu08W8XXY", JxrGuest_GUID_PKPixelFormat40bppYCC444Alpha_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat64bppYCC444Alpha_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x52}}; +APS5_EXPORT("1meVKABZwuw", JxrGuest_GUID_PKPixelFormat64bppYCC444Alpha_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat64bppYCC444AlphaFixedPoint_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x53}}; +APS5_EXPORT("AvvYpgObYk8", JxrGuest_GUID_PKPixelFormat64bppYCC444AlphaFixedPoint_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat32bppCMYKDIRECT_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x54}}; +APS5_EXPORT("rcl+HxedP2c", JxrGuest_GUID_PKPixelFormat32bppCMYKDIRECT_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat64bppCMYKDIRECT_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x55}}; +APS5_EXPORT("DHb-XsNuRuY", JxrGuest_GUID_PKPixelFormat64bppCMYKDIRECT_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat40bppCMYKDIRECTAlpha_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x56}}; +APS5_EXPORT("6DpPg7OgAhQ", JxrGuest_GUID_PKPixelFormat40bppCMYKDIRECTAlpha_nid_no_patch); + +alignas(16) extern const JxrGuestGuid JxrGuest_GUID_PKPixelFormat80bppCMYKDIRECTAlpha_nid_no_patch = {0x6fddc324, 0x4e03, 0x4bfe, {0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x43}}; +APS5_EXPORT("e6RoRSSlCwI", JxrGuest_GUID_PKPixelFormat80bppCMYKDIRECTAlpha_nid_no_patch); + + +} diff --git a/core/libs/prx/libSceJxrParser/Export.cpp b/core/libs/prx/libSceJxrParser/Export.cpp index d81f4a5e32..bd805b6cfa 100644 --- a/core/libs/prx/libSceJxrParser/Export.cpp +++ b/core/libs/prx/libSceJxrParser/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceJxrParser/include/InventoryExports.hpp" #include #include #include "SceTypes.hpp" @@ -8,3 +10,42 @@ extern "C" { APS5_DUMMY_FUN } + +extern "C" { + +int APS5_VABI libSceJxrParserUnknown_AtKk9raT6RY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AtKk9raT6RY", libSceJxrParserUnknown_AtKk9raT6RY_nid_no_patch); + +int APS5_VABI libSceJxrParserUnknown_49M11VyJ5yY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("49M11VyJ5yY", libSceJxrParserUnknown_49M11VyJ5yY_nid_no_patch); + +int APS5_VABI libSceJxrParserUnknown_6hIumDu08nU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6hIumDu08nU", libSceJxrParserUnknown_6hIumDu08nU_nid_no_patch); + +int APS5_VABI libSceJxrParserUnknown_kLMZZCRRYTk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kLMZZCRRYTk", libSceJxrParserUnknown_kLMZZCRRYTk_nid_no_patch); + +int APS5_VABI libSceJxrParserUnknown_COdxsPL_minus_o10_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("COdxsPL-o10", libSceJxrParserUnknown_COdxsPL_minus_o10_nid_no_patch); + +int APS5_VABI libSceJxrParserUnknown_MHKqYjFGm4I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MHKqYjFGm4I", libSceJxrParserUnknown_MHKqYjFGm4I_nid_no_patch); + +int APS5_VABI libSceJxrParserUnknown_mPgrnwDKe8I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mPgrnwDKe8I", libSceJxrParserUnknown_mPgrnwDKe8I_nid_no_patch); + +} diff --git a/core/libs/prx/libSceJxrParser/include/InventoryExports.hpp b/core/libs/prx/libSceJxrParser/include/InventoryExports.hpp new file mode 100644 index 0000000000..2622f0b572 --- /dev/null +++ b/core/libs/prx/libSceJxrParser/include/InventoryExports.hpp @@ -0,0 +1,16 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceJxrParserUnknown_AtKk9raT6RY_nid_no_patch(); + +int APS5_VABI libSceJxrParserUnknown_49M11VyJ5yY_nid_no_patch(); +int APS5_VABI libSceJxrParserUnknown_6hIumDu08nU_nid_no_patch(); +int APS5_VABI libSceJxrParserUnknown_kLMZZCRRYTk_nid_no_patch(); +int APS5_VABI libSceJxrParserUnknown_COdxsPL_minus_o10_nid_no_patch(); +int APS5_VABI libSceJxrParserUnknown_MHKqYjFGm4I_nid_no_patch(); +int APS5_VABI libSceJxrParserUnknown_mPgrnwDKe8I_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceJxrParser/libSceJxrParser.hpp b/core/libs/prx/libSceJxrParser/libSceJxrParser.hpp index 6f70f09bee..e3aa210558 100644 --- a/core/libs/prx/libSceJxrParser/libSceJxrParser.hpp +++ b/core/libs/prx/libSceJxrParser/libSceJxrParser.hpp @@ -1 +1,2 @@ #pragma once +#include "prx/libSceJxrParser/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceKeyboard/Export.cpp b/core/libs/prx/libSceKeyboard/Export.cpp index cd28a18209..75aecad681 100644 --- a/core/libs/prx/libSceKeyboard/Export.cpp +++ b/core/libs/prx/libSceKeyboard/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceKeyboard/include/InventoryExports.hpp" #include "prx/libSceKeyboard/include/Api.hpp" #include "prx/libc/include/General.hpp" #include "prx/libSceKeyboard/include/KeyboardState.hpp" @@ -136,3 +138,12 @@ void KeyboardPublishInput_nid_postfix(const KeyboardInputEvent& event) { } } + +extern "C" { + +int APS5_VABI libSceKeyboardUnknown_l76jptHfizM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("l76jptHfizM", libSceKeyboardUnknown_l76jptHfizM_nid_no_patch); + +} diff --git a/core/libs/prx/libSceKeyboard/include/InventoryExports.hpp b/core/libs/prx/libSceKeyboard/include/InventoryExports.hpp new file mode 100644 index 0000000000..f681e37880 --- /dev/null +++ b/core/libs/prx/libSceKeyboard/include/InventoryExports.hpp @@ -0,0 +1,9 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceKeyboardUnknown_l76jptHfizM_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceKeyboard/libSceKeyboard.hpp b/core/libs/prx/libSceKeyboard/libSceKeyboard.hpp index 8ab2bf1b0d..56ec048352 100644 --- a/core/libs/prx/libSceKeyboard/libSceKeyboard.hpp +++ b/core/libs/prx/libSceKeyboard/libSceKeyboard.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceKeyboard/include/Api.hpp" +#include "prx/libSceKeyboard/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceLibcInternal/CMakeLists.txt b/core/libs/prx/libSceLibcInternal/CMakeLists.txt index bd4246bfcc..1520005e79 100644 --- a/core/libs/prx/libSceLibcInternal/CMakeLists.txt +++ b/core/libs/prx/libSceLibcInternal/CMakeLists.txt @@ -3,6 +3,7 @@ target_include_directories(libSceLibcInternal PRIVATE ${LIBS_INCLUDE_DIR}) set_source_files_properties(UserContext.cpp PROPERTIES COMPILE_OPTIONS -fno-omit-frame-pointer) target_link_libraries(libSceLibcInternal PRIVATE ${CMAKE_DL_LIBS}) target_sources(libSceLibcInternal PRIVATE Directory.cpp) +target_sources(libSceLibcInternal PRIVATE InventoryExports.cpp) target_sources(libSceLibcInternal PRIVATE InitOnce.cpp) if(BUILD_TESTING) add_test_executable(guest_init_once_tests ${LIBS_INCLUDE_DIR}/tests/GuestInitOnce.cpp) diff --git a/core/libs/prx/libSceLibcInternal/Export.cpp b/core/libs/prx/libSceLibcInternal/Export.cpp index c113004eb3..d1d2c114af 100644 --- a/core/libs/prx/libSceLibcInternal/Export.cpp +++ b/core/libs/prx/libSceLibcInternal/Export.cpp @@ -17,6 +17,904 @@ extern "C" const char* __progname_nid_postfix; +extern "C" { + +int APS5_VABI sceLibcInternalPending4_002_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("F27xQUBtNdU", sceLibcInternalPending4_002_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_003_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("XxsPrrWJ52I", sceLibcInternalPending4_003_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_004_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("U2t+WvMQj8A", sceLibcInternalPending4_004_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_005_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("EeBQ7253LkE", sceLibcInternalPending4_005_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_006_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("vbgCuYKySLI", sceLibcInternalPending4_006_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_007_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("HeBwePMtuFs", sceLibcInternalPending4_007_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_008_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("rRmMX83UL1E", sceLibcInternalPending4_008_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_009_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("Ea+awuQ5Bm8", sceLibcInternalPending4_009_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_010_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("TPq0HfoACeI", sceLibcInternalPending4_010_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_011_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("GGoH7e6SZSY", sceLibcInternalPending4_011_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_012_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("UM6rGQxnEMg", sceLibcInternalPending4_012_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_013_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("zSehLdHI0FA", sceLibcInternalPending4_013_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_014_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("AjkxQBlsOOY", sceLibcInternalPending4_014_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_015_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("cnNz2ftNwEU", sceLibcInternalPending4_015_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_016_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("nRf0VQ++OEw", sceLibcInternalPending4_016_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_017_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("ozLi0i4r6ds", sceLibcInternalPending4_017_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_018_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("klWxQ2nKAHY", sceLibcInternalPending4_018_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_019_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("QGSIlqfIU2c", sceLibcInternalPending4_019_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_020_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("JXzQGOtumdM", sceLibcInternalPending4_020_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_021_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("zv1EMhI7R1c", sceLibcInternalPending4_021_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_022_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("JWplGh2O0Rs", sceLibcInternalPending4_022_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_023_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("fXUuZEw7C24", sceLibcInternalPending4_023_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_024_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("3+VwUA8-QPI", sceLibcInternalPending4_024_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_025_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("2BmJdX269kI", sceLibcInternalPending4_025_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_026_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("nvSsAW7tcX8", sceLibcInternalPending4_026_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_027_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("-amctzWbEtw", sceLibcInternalPending4_027_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_028_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("leSFwTZZuE4", sceLibcInternalPending4_028_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_029_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("2Olt9gqOauQ", sceLibcInternalPending4_029_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_030_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("mzRlAVX65hQ", sceLibcInternalPending4_030_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_031_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("Utj8Sh5L0jE", sceLibcInternalPending4_031_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_032_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("VsJCpXqMPJU", sceLibcInternalPending4_032_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_033_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("3M20pLo9Gdk", sceLibcInternalPending4_033_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_034_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("LDbKkgI-TZg", sceLibcInternalPending4_034_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_035_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("ShlQcYrzRF8", sceLibcInternalPending4_035_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_036_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("T85u2sPrKOo", sceLibcInternalPending4_036_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_037_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("73GV+sRHbeY", sceLibcInternalPending4_037_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_038_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("dSfKN47p6ac", sceLibcInternalPending4_038_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_039_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("KwJ5V3D0v3A", sceLibcInternalPending4_039_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_040_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("8PIh8BFpNYQ", sceLibcInternalPending4_040_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_041_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("vvA7HtdtWnY", sceLibcInternalPending4_041_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_042_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("xzYpD5d24aA", sceLibcInternalPending4_042_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_043_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("ZuCHPDq-dPw", sceLibcInternalPending4_043_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_044_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("+RuThw5axA4", sceLibcInternalPending4_044_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_045_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("Vw03kdKZUN0", sceLibcInternalPending4_045_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_046_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("E7UermPZVcw", sceLibcInternalPending4_046_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_047_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("8raXTYQ11cg", sceLibcInternalPending4_047_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_048_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("OY5mqEBxP+8", sceLibcInternalPending4_048_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_049_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("rrqNi95bhMs", sceLibcInternalPending4_049_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_050_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("5L5Aft+9nZU", sceLibcInternalPending4_050_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_051_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("nc6OsiDx630", sceLibcInternalPending4_051_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_052_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("SYCwZXKZQ08", sceLibcInternalPending4_052_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_053_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("2pJJ0dl-aPQ", sceLibcInternalPending4_053_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_054_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("cRSJysDpVl4", sceLibcInternalPending4_054_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_055_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("A0PftWMfrhk", sceLibcInternalPending4_055_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_056_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("dP14OHWe4nI", sceLibcInternalPending4_056_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_057_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("xy0MR+OOZI8", sceLibcInternalPending4_057_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_058_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("hGlkh5YpcKw", sceLibcInternalPending4_058_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_059_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("R1ITHuTUMEI", sceLibcInternalPending4_059_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_060_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("B8c4P1vCixQ", sceLibcInternalPending4_060_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_061_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("64pqofAwJEg", sceLibcInternalPending4_061_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_062_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("0MzJAexrlr4", sceLibcInternalPending4_062_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_063_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("r8003V6UwZg", sceLibcInternalPending4_063_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_064_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("lhJWkEh-HXM", sceLibcInternalPending4_064_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_065_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("kwp-0uidHpw", sceLibcInternalPending4_065_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_066_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("9TfGnN6xq-U", sceLibcInternalPending4_066_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_067_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("Krt-A7EnHHs", sceLibcInternalPending4_067_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_068_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("j9LU8GsuEGw", sceLibcInternalPending4_068_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_069_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("qkuA-unH7PU", sceLibcInternalPending4_069_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_070_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("+i81FtUCarA", sceLibcInternalPending4_070_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_071_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("Sc0lXhQG5Ko", sceLibcInternalPending4_071_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_072_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("Nt6eyVKm+Z4", sceLibcInternalPending4_072_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_073_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("Fr7j8dMsy4s", sceLibcInternalPending4_073_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_074_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("pS-t9AJblSM", sceLibcInternalPending4_074_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_075_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("2fxdcyt5tGs", sceLibcInternalPending4_075_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_076_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("G84okRnyJJg", sceLibcInternalPending4_076_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_077_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("D2njLPpEt1E", sceLibcInternalPending4_077_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_078_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("IRVqdGwSNXE", sceLibcInternalPending4_078_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_079_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("CLT04GjI7UE", sceLibcInternalPending4_079_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_080_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("wWIsjOqfcSc", sceLibcInternalPending4_080_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_081_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("cx-1THpef1A", sceLibcInternalPending4_081_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_082_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("DhXTD5eM7LQ", sceLibcInternalPending4_082_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_083_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("zzubCm+nDzc", sceLibcInternalPending4_083_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_084_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("RalOJcOXJJo", sceLibcInternalPending4_084_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_085_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("DR029KeWsHw", sceLibcInternalPending4_085_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_086_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("65cvm2NDLmU", sceLibcInternalPending4_086_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_087_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("OR-4zyIi2aE", sceLibcInternalPending4_087_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_088_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("iXVrhA51z0M", sceLibcInternalPending4_088_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_089_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("d57FDzON1h0", sceLibcInternalPending4_089_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_090_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("JruBeQgsAaU", sceLibcInternalPending4_090_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_091_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("fsF-tGtGsD4", sceLibcInternalPending4_091_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_092_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("GDiCYtaiUyM", sceLibcInternalPending4_092_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_093_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("wVY5DpvU6PU", sceLibcInternalPending4_093_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_094_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("r-JSsJQFUsY", sceLibcInternalPending4_094_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_095_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("Ti86LmOKvr0", sceLibcInternalPending4_095_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_096_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("TgEb5a+nOnk", sceLibcInternalPending4_096_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_097_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("hSUcSStZEHM", sceLibcInternalPending4_097_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_098_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("nF8-CM+tro4", sceLibcInternalPending4_098_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_099_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("IJmeA5ayVJA", sceLibcInternalPending4_099_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_100_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("piJabTDQRVs", sceLibcInternalPending4_100_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_101_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("8oO55jndPRg", sceLibcInternalPending4_101_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_102_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("w2GyuoXCnkw", sceLibcInternalPending4_102_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_103_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("6ZDv6ZusiFg", sceLibcInternalPending4_103_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_104_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("tJU-ttrsXsk", sceLibcInternalPending4_104_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_105_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("gVTWlvyBSIc", sceLibcInternalPending4_105_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_106_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("nk+0yTWvoRE", sceLibcInternalPending4_106_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_107_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("lTTrDj5OIwQ", sceLibcInternalPending4_107_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_108_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("HpCeP12cuNY", sceLibcInternalPending4_108_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_109_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("9HILqEoh24E", sceLibcInternalPending4_109_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_110_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("0Ir3jiT4V6Q", sceLibcInternalPending4_110_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_111_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("qiR-4jx1abE", sceLibcInternalPending4_111_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_112_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("QqBWUNEfIAo", sceLibcInternalPending4_112_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_113_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("xSxPHmpcNzY", sceLibcInternalPending4_113_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_114_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("pGxNI4JKfmY", sceLibcInternalPending4_114_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_115_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("ikjnoeemspQ", sceLibcInternalPending4_115_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_116_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("KDgQWX1eDeo", sceLibcInternalPending4_116_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_117_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("PbCV7juCZVo", sceLibcInternalPending4_117_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_118_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("SQ02ZA5E-UE", sceLibcInternalPending4_118_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_119_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("XD9FmX1mavU", sceLibcInternalPending4_119_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_120_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("Yl10kSufa5k", sceLibcInternalPending4_120_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_121_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("yL8dMdCi4Ys", sceLibcInternalPending4_121_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_122_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("HCB1auZdcmo", sceLibcInternalPending4_122_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_123_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("Wut42WAe7Rw", sceLibcInternalPending4_123_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_124_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("VSk+sij2mwg", sceLibcInternalPending4_124_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_125_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("EBwahsMLokw", sceLibcInternalPending4_125_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_126_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("o1qlZJqrvmI", sceLibcInternalPending4_126_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_127_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("srwl1hhFoUI", sceLibcInternalPending4_127_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_128_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("O4mPool-pow", sceLibcInternalPending4_128_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_129_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("SdKk439pgjg", sceLibcInternalPending4_129_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_130_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("mU88GYCirhI", sceLibcInternalPending4_130_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_131_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("5afBJmEfUQI", sceLibcInternalPending4_131_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_132_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("wrR3T5i7gpY", sceLibcInternalPending4_132_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_133_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("tYBLm0BoQdQ", sceLibcInternalPending4_133_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_134_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("aNfpdhcsMWI", sceLibcInternalPending4_134_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_135_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("uQFv8aNF8Jc", sceLibcInternalPending4_135_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_136_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("5DFeXjP+Plg", sceLibcInternalPending4_136_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_137_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("sS5fF+fht2c", sceLibcInternalPending4_137_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_138_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("3cW6MrkCKt0", sceLibcInternalPending4_138_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_139_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("mbGmSOLXgN0", sceLibcInternalPending4_139_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_140_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("BuxsERsopss", sceLibcInternalPending4_140_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_141_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("9S960jA8tB0", sceLibcInternalPending4_141_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_142_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("TRn3cMU4mjY", sceLibcInternalPending4_142_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_143_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("nbTAoMwiO38", sceLibcInternalPending4_143_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_144_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("RxJnJ-HoySc", sceLibcInternalPending4_144_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_145_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("7e3DrnZea-Q", sceLibcInternalPending4_145_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_146_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("kPELiw9L-gw", sceLibcInternalPending4_146_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_147_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("tcdvTUlPnL0", sceLibcInternalPending4_147_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_148_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("wT+HL7oqjYc", sceLibcInternalPending4_148_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_149_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("F7CUCpiasec", sceLibcInternalPending4_149_nid_no_patch); + +int APS5_VABI sceLibcInternalPending4_150_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("0OjBJZd9VeM", sceLibcInternalPending4_150_nid_no_patch); + +} + namespace { struct ThreadDestructor { diff --git a/core/libs/prx/libSceLibcInternal/InventoryExports.cpp b/core/libs/prx/libSceLibcInternal/InventoryExports.cpp new file mode 100644 index 0000000000..056e657d70 --- /dev/null +++ b/core/libs/prx/libSceLibcInternal/InventoryExports.cpp @@ -0,0 +1,1492 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceLibcInternal/include/InventoryExports.hpp" +#include "prx/libc/include/General.hpp" + +extern "C" { + +int APS5_VABI libSceLibcInternalInventory_000_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ww3UUl317Ng", libSceLibcInternalInventory_000_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_001_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dXy+lFOiaQA", libSceLibcInternalInventory_001_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_002_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HpAlvhNKb2Y", libSceLibcInternalInventory_002_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_003_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5bQqdR3hTZw", libSceLibcInternalInventory_003_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_004_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1kvQkOSaaVo", libSceLibcInternalInventory_004_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_005_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bBGvmspg3Xs", libSceLibcInternalInventory_005_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_006_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("95MaQlRbfC8", libSceLibcInternalInventory_006_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_007_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ki5SQPsB4m4", libSceLibcInternalInventory_007_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_008_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6F1JfiING18", libSceLibcInternalInventory_008_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_009_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HmcMLz3cPkM", libSceLibcInternalInventory_009_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_010_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pyBabUesXN4", libSceLibcInternalInventory_010_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_011_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uROsAczW6OU", libSceLibcInternalInventory_011_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_012_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("X69UlAXF-Oc", libSceLibcInternalInventory_012_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_013_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GS1AvxBwVgY", libSceLibcInternalInventory_013_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_014_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sTaUDDnGOpE", libSceLibcInternalInventory_014_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_015_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OM0FnA7Tldk", libSceLibcInternalInventory_015_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_016_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uVOxy7dQTFc", libSceLibcInternalInventory_016_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_017_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rNYLEsL7M0k", libSceLibcInternalInventory_017_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_018_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XFh0C66aEms", libSceLibcInternalInventory_018_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_019_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oly3wSwEJ2A", libSceLibcInternalInventory_019_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_020_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lX9M5u0e48k", libSceLibcInternalInventory_020_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_021_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("t6egllDqQ2M", libSceLibcInternalInventory_021_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_022_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iWNC2tkDgxw", libSceLibcInternalInventory_022_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_023_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VNaqectsZNs", libSceLibcInternalInventory_023_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_024_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9biiDDejX3Q", libSceLibcInternalInventory_024_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_025_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jfr41GGp2jA", libSceLibcInternalInventory_025_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_026_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SYFNsz9K2rs", libSceLibcInternalInventory_026_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_027_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7oio2Gs1GNk", libSceLibcInternalInventory_027_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_028_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rsS5cBMihAM", libSceLibcInternalInventory_028_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_029_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oYMRgkQHoJM", libSceLibcInternalInventory_029_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_030_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MYCRRmc7cDA", libSceLibcInternalInventory_030_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_031_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Yc2gZRtDeNQ", libSceLibcInternalInventory_031_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_032_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gOxGOQmSVU0", libSceLibcInternalInventory_032_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_033_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GYTma8zq0NU", libSceLibcInternalInventory_033_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_034_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wAcnCK2HCeI", libSceLibcInternalInventory_034_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_035_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("10VcrHqHAlw", libSceLibcInternalInventory_035_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_036_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PjH5dZGfQHQ", libSceLibcInternalInventory_036_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_037_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NeiFvKblpZM", libSceLibcInternalInventory_037_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_038_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JJ-mkOhdook", libSceLibcInternalInventory_038_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_039_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RP7ijkGGx50", libSceLibcInternalInventory_039_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_040_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4GbIwW5u5us", libSceLibcInternalInventory_040_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_041_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MB1VCygerRU", libSceLibcInternalInventory_041_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_042_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7VRfkz22vPk", libSceLibcInternalInventory_042_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_043_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EYZJsnX58DE", libSceLibcInternalInventory_043_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_044_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OypvNf3Uq3c", libSceLibcInternalInventory_044_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_045_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VpwymQiS4ck", libSceLibcInternalInventory_045_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_046_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sXaxl1QGorg", libSceLibcInternalInventory_046_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_047_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IAEl1Ta7yVU", libSceLibcInternalInventory_047_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_048_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lZVehk7yFok", libSceLibcInternalInventory_048_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_049_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("041c37QfoUc", libSceLibcInternalInventory_049_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_050_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("olsoiZsezkk", libSceLibcInternalInventory_050_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_051_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xiqd+QkuYXc", libSceLibcInternalInventory_051_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_052_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+qKS53qzWdA", libSceLibcInternalInventory_052_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_053_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8R00hgzXQDY", libSceLibcInternalInventory_053_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_054_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WDKzMM-uuLE", libSceLibcInternalInventory_054_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_055_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Dc4ZMWmPMl8", libSceLibcInternalInventory_055_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_056_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hVQgfGhJz3U", libSceLibcInternalInventory_056_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_057_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MAalgQhejPc", libSceLibcInternalInventory_057_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_058_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("27Z-Cx1jbkU", libSceLibcInternalInventory_058_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_059_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9G32u5RRYxE", libSceLibcInternalInventory_059_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_060_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("d2u38zs4Pe8", libSceLibcInternalInventory_060_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_061_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("H7-7Z3ixv-w", libSceLibcInternalInventory_061_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_062_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PBbZjsL6nfc", libSceLibcInternalInventory_062_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_063_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uhnb6dnXOnc", libSceLibcInternalInventory_063_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_064_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("p8-44cVeO84", libSceLibcInternalInventory_064_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_065_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tPsGA6EzNKA", libSceLibcInternalInventory_065_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_066_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zOPA5qnbW2U", libSceLibcInternalInventory_066_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_067_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("U54NBtdj6UY", libSceLibcInternalInventory_067_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_068_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7OCTkL2oWyg", libSceLibcInternalInventory_068_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_069_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("log6zy2C9iQ", libSceLibcInternalInventory_069_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_070_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("j7e7EQBD6ZA", libSceLibcInternalInventory_070_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_071_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-Bl9-SZ2noc", libSceLibcInternalInventory_071_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_072_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("57mMrw0l-40", libSceLibcInternalInventory_072_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_073_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1TaQLyPDJEY", libSceLibcInternalInventory_073_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_074_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("K-5mtupQZ4g", libSceLibcInternalInventory_074_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_075_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AgxEl+HeWRQ", libSceLibcInternalInventory_075_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_076_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-EgSegeAKl4", libSceLibcInternalInventory_076_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_077_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5r801ZWiJJI", libSceLibcInternalInventory_077_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_078_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BcbHFSrcg3Y", libSceLibcInternalInventory_078_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_079_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fkFGlPdquqI", libSceLibcInternalInventory_079_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_080_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dsJKehuajH4", libSceLibcInternalInventory_080_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_081_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aD-iqbVlHmQ", libSceLibcInternalInventory_081_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_082_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("So6gSmJMYDs", libSceLibcInternalInventory_082_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_083_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pMWnITHysPc", libSceLibcInternalInventory_083_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_084_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("m7qAgircaZY", libSceLibcInternalInventory_084_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_085_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0il9qdo6fhs", libSceLibcInternalInventory_085_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_086_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0AeC+qCELEA", libSceLibcInternalInventory_086_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_087_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iCoD0EOIbTM", libSceLibcInternalInventory_087_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_088_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TDhjx3nyaoU", libSceLibcInternalInventory_088_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_089_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0TADyPWrobI", libSceLibcInternalInventory_089_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_090_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vwMx2NhWdLw", libSceLibcInternalInventory_090_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_091_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TuhGCIxgLvA", libSceLibcInternalInventory_091_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_092_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zYHryd8vd0w", libSceLibcInternalInventory_092_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_093_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3YCLxZqgIdo", libSceLibcInternalInventory_093_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_094_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4qHwSTPt-t8", libSceLibcInternalInventory_094_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_095_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("e5Hwcntvd8c", libSceLibcInternalInventory_095_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_096_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2TYdayAO39E", libSceLibcInternalInventory_096_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_097_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("djNkrJKTb6Q", libSceLibcInternalInventory_097_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_098_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0fkFA3za2N8", libSceLibcInternalInventory_098_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_099_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("L71JAnoQees", libSceLibcInternalInventory_099_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_100_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tkqNipin1EI", libSceLibcInternalInventory_100_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_101_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Lt4407UMs2o", libSceLibcInternalInventory_101_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_102_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8pXCeme0FC4", libSceLibcInternalInventory_102_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_103_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dP5zwQ2Yc8g", libSceLibcInternalInventory_103_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_104_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LxKs-IGDsFU", libSceLibcInternalInventory_104_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_105_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fjHAU8OSaW8", libSceLibcInternalInventory_105_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_106_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wggIIjWSt-E", libSceLibcInternalInventory_106_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_107_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PSAw7g1DD24", libSceLibcInternalInventory_107_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_108_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2PoQu-K2qXk", libSceLibcInternalInventory_108_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_109_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HQbgeUdQyyw", libSceLibcInternalInventory_109_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_110_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ig4VDIRc21Q", libSceLibcInternalInventory_110_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_111_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZO3a6HfALTQ", libSceLibcInternalInventory_111_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_112_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("84wIPnwBGiU", libSceLibcInternalInventory_112_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_113_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uXj-oWD2334", libSceLibcInternalInventory_113_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_114_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yAobGI2Whrg", libSceLibcInternalInventory_114_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_115_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RNmYVYlZvv8", libSceLibcInternalInventory_115_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_116_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-1G1iE3KyGI", libSceLibcInternalInventory_116_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_117_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kAay0hfgDJs", libSceLibcInternalInventory_117_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_118_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6S8jzWWGcWo", libSceLibcInternalInventory_118_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_119_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4MHgRGOKOXY", libSceLibcInternalInventory_119_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_120_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0UPU3kvxWb0", libSceLibcInternalInventory_120_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_121_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("18rLbEV-NQs", libSceLibcInternalInventory_121_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_122_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("e3shgCIZxRc", libSceLibcInternalInventory_122_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_123_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-+RKa3As0gE", libSceLibcInternalInventory_123_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_124_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aHDdLa7jA1U", libSceLibcInternalInventory_124_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_125_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Zbaaq-d70ms", libSceLibcInternalInventory_125_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_126_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bwVJf3kat9c", libSceLibcInternalInventory_126_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_127_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BbJ4naWZeRw", libSceLibcInternalInventory_127_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_128_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Hg1im-rUeHc", libSceLibcInternalInventory_128_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_129_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LAEVU8cBSh4", libSceLibcInternalInventory_129_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_130_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Mniutm2JL2M", libSceLibcInternalInventory_130_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_131_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aOK5ucXO-5g", libSceLibcInternalInventory_131_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_132_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WoCt9o2SYHw", libSceLibcInternalInventory_132_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_133_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ky+C-qbKcX0", libSceLibcInternalInventory_133_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_134_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xdHqQoggdfo", libSceLibcInternalInventory_134_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_135_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("f1ZGLUnQGgo", libSceLibcInternalInventory_135_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_136_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jyXTVnmlJD4", libSceLibcInternalInventory_136_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_137_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WiUy3dEtCOQ", libSceLibcInternalInventory_137_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_138_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6hV3y21d59k", libSceLibcInternalInventory_138_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_139_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WkAsdy5CUAo", libSceLibcInternalInventory_139_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_140_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2aSk2ruCP0E", libSceLibcInternalInventory_140_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_141_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pN02FS5SPgg", libSceLibcInternalInventory_141_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_142_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ReK9U6EUWuU", libSceLibcInternalInventory_142_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_143_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("i180MNC9p4c", libSceLibcInternalInventory_143_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_144_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sqWytnhYdEg", libSceLibcInternalInventory_144_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_145_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kxXCvcat1cM", libSceLibcInternalInventory_145_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_146_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bxLH5WHgMBY", libSceLibcInternalInventory_146_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_147_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QXJCcrXoqpU", libSceLibcInternalInventory_147_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_148_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("I5jcbATyIWo", libSceLibcInternalInventory_148_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_149_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eLB2+1+mVvg", libSceLibcInternalInventory_149_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_150_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("96Ev+CE1luE", libSceLibcInternalInventory_150_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_151_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6gCBQs1mIi4", libSceLibcInternalInventory_151_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_152_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qF3mHeMAHVk", libSceLibcInternalInventory_152_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_153_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("34mi8lteNTs", libSceLibcInternalInventory_153_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_154_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yDdbQr1oLOc", libSceLibcInternalInventory_154_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_155_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XghI4vmw8mU", libSceLibcInternalInventory_155_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_156_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("n4+3hznhkU4", libSceLibcInternalInventory_156_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_157_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DlDsyX+XsoA", libSceLibcInternalInventory_157_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_158_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DDQjbwNC31E", libSceLibcInternalInventory_158_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_159_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6sAaleB7Zgk", libSceLibcInternalInventory_159_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_160_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("I-e7Dxo087A", libSceLibcInternalInventory_160_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_161_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1LvbNeZZJ-o", libSceLibcInternalInventory_161_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_162_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fFnht9SPed8", libSceLibcInternalInventory_162_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_163_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CDm+TUClE7E", libSceLibcInternalInventory_163_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_164_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TEtyeXjcZ0w", libSceLibcInternalInventory_164_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_165_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yIn4l8OO1zA", libSceLibcInternalInventory_165_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_166_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1eVdDzPtzD4", libSceLibcInternalInventory_166_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_167_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qEob3o53s2M", libSceLibcInternalInventory_167_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_168_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2YCDWkuFEy8", libSceLibcInternalInventory_168_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_169_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("H+T2VJ91dds", libSceLibcInternalInventory_169_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_170_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("s1EM2NdPf0Y", libSceLibcInternalInventory_170_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_171_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XOgjMgZ3fjo", libSceLibcInternalInventory_171_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_172_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("m4kEqv7eGVY", libSceLibcInternalInventory_172_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_173_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MQJQCxbLfM0", libSceLibcInternalInventory_173_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_174_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ElKI+ReiehU", libSceLibcInternalInventory_174_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_175_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VHBnRBxBg5E", libSceLibcInternalInventory_175_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_176_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lzK3uL1rWJY", libSceLibcInternalInventory_176_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_177_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XDm4jTtoEbo", libSceLibcInternalInventory_177_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_178_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+yrOX7MgVlk", libSceLibcInternalInventory_178_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_179_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iO5AOflrTaA", libSceLibcInternalInventory_179_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_180_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("M0n7l76UVyE", libSceLibcInternalInventory_180_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_181_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("l7OtvplI42U", libSceLibcInternalInventory_181_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_182_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dU8Q2yzFNQg", libSceLibcInternalInventory_182_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_183_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mmq9OwwYx74", libSceLibcInternalInventory_183_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_184_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Cp9ksNOeun8", libSceLibcInternalInventory_184_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_185_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ImblNB7fVVU", libSceLibcInternalInventory_185_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_186_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("e5jQyuEE+9U", libSceLibcInternalInventory_186_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_187_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("y0hzUSFrkng", libSceLibcInternalInventory_187_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_188_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("J2xO4cttypo", libSceLibcInternalInventory_188_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_189_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bU3S1OS1sc0", libSceLibcInternalInventory_189_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_190_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("p-SW25yE-Q8", libSceLibcInternalInventory_190_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_191_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8H3yBUytv-0", libSceLibcInternalInventory_191_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_192_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QTgRx1NTp6o", libSceLibcInternalInventory_192_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_193_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QdPT7uDTlo0", libSceLibcInternalInventory_193_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_194_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6htjEH2Gi-w", libSceLibcInternalInventory_194_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_195_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WQQlL0n2SpU", libSceLibcInternalInventory_195_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_196_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bF2uVCqVhBY", libSceLibcInternalInventory_196_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_197_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oi3kpQPqpMY", libSceLibcInternalInventory_197_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_198_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("b1LciG4lUUk", libSceLibcInternalInventory_198_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_199_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lOF5jrFNZUA", libSceLibcInternalInventory_199_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_200_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UQPicLg8Sx8", libSceLibcInternalInventory_200_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_201_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uqLGWOX7-YE", libSceLibcInternalInventory_201_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_202_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6zg3ziZ4Qis", libSceLibcInternalInventory_202_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_203_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MSSvHmcbs3g", libSceLibcInternalInventory_203_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_204_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7NQGsY7VY3c", libSceLibcInternalInventory_204_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_205_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YGPopdkhujM", libSceLibcInternalInventory_205_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_206_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iWtXRduTjHA", libSceLibcInternalInventory_206_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_207_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("f+1EaDVL5C4", libSceLibcInternalInventory_207_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_208_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("b9QSruV4nnc", libSceLibcInternalInventory_208_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_209_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CClObiVHzDY", libSceLibcInternalInventory_209_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_210_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JOj6qfc4VLs", libSceLibcInternalInventory_210_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_211_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ej+44l1PjjY", libSceLibcInternalInventory_211_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_212_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RB3ratfpZDc", libSceLibcInternalInventory_212_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_213_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("a6yvHMSqsV0", libSceLibcInternalInventory_213_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_214_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7ZmeGHyM6ew", libSceLibcInternalInventory_214_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_215_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("66AuqgLnsQE", libSceLibcInternalInventory_215_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_216_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1dY2KJfkgMM", libSceLibcInternalInventory_216_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_217_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("riBxNiKLvI0", libSceLibcInternalInventory_217_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_218_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("w9fCz0pbHdw", libSceLibcInternalInventory_218_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_219_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mdYczJb+bb0", libSceLibcInternalInventory_219_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_220_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Qi5fpNt5+T0", libSceLibcInternalInventory_220_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_221_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("b2na0Dzd5j8", libSceLibcInternalInventory_221_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_222_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XqbpfYmAZB4", libSceLibcInternalInventory_222_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_223_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("s2zG12AYKTg", libSceLibcInternalInventory_223_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_224_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AnE9WWbyWkM", libSceLibcInternalInventory_224_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_225_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MuACiCSA8-s", libSceLibcInternalInventory_225_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_226_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6QU40olMkOM", libSceLibcInternalInventory_226_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_227_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kJmdxo4uM+8", libSceLibcInternalInventory_227_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_228_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0sHarDG9BY4", libSceLibcInternalInventory_228_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_229_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rme+Po9yI5M", libSceLibcInternalInventory_229_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_230_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jIvWFH24Bjw", libSceLibcInternalInventory_230_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_231_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4+oswXtp7PQ", libSceLibcInternalInventory_231_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_232_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("N5nZ3wQw+Vc", libSceLibcInternalInventory_232_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_233_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LLssoYjMOow", libSceLibcInternalInventory_233_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_234_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zb3436295XU", libSceLibcInternalInventory_234_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_235_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FX+eS2YsEtY", libSceLibcInternalInventory_235_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_236_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("i4J5FvRPG-w", libSceLibcInternalInventory_236_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_237_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VrWUXy1gqn8", libSceLibcInternalInventory_237_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_238_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qMXslRdZVj4", libSceLibcInternalInventory_238_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_239_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Zn44KZgJtWY", libSceLibcInternalInventory_239_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_240_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zPWCqkg7V+o", libSceLibcInternalInventory_240_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_241_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Eva2i4D5J6I", libSceLibcInternalInventory_241_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_242_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("saSUnPWLq9E", libSceLibcInternalInventory_242_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_243_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0r8rbw2SFqk", libSceLibcInternalInventory_243_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_244_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mDIHE-aaRaI", libSceLibcInternalInventory_244_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_245_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pDFe-IgbTPg", libSceLibcInternalInventory_245_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_246_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aqyjhIx7jaY", libSceLibcInternalInventory_246_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_247_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QfPuSqhub7o", libSceLibcInternalInventory_247_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_248_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lrQSsTRMMr4", libSceLibcInternalInventory_248_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_249_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Gav1Xt1Ce+c", libSceLibcInternalInventory_249_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_250_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ozk+Z6QnlTY", libSceLibcInternalInventory_250_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_251_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4rrOHCHAV1w", libSceLibcInternalInventory_251_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_252_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("V62E2Q8bJVY", libSceLibcInternalInventory_252_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_253_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BloPUt1HCH0", libSceLibcInternalInventory_253_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_254_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+Uuj++A+I14", libSceLibcInternalInventory_254_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_255_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QJJ-4Dgm8YQ", libSceLibcInternalInventory_255_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_256_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kvqg376KsJo", libSceLibcInternalInventory_256_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_257_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("q05IXuNA2NE", libSceLibcInternalInventory_257_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_258_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0j1jspKbuFk", libSceLibcInternalInventory_258_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_259_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HSkPyRyFFHQ", libSceLibcInternalInventory_259_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_260_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Suc8W0QPxjw", libSceLibcInternalInventory_260_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_261_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1vo6qqqa9F4", libSceLibcInternalInventory_261_nid_no_patch); + +int APS5_VABI libSceLibcInternalUnknown_hsn2TaF3poY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hsn2TaF3poY", libSceLibcInternalUnknown_hsn2TaF3poY_nid_no_patch); + +int APS5_VABI libSceLibcInternalUnknown_oCH4efUlxZ0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oCH4efUlxZ0", libSceLibcInternalUnknown_oCH4efUlxZ0_nid_no_patch); + +int APS5_VABI libSceLibcInternalUnknown_GdwuPYbVpP4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GdwuPYbVpP4", libSceLibcInternalUnknown_GdwuPYbVpP4_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_262_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("E1iwBYkG3CM", libSceLibcInternalInventory_262_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_263_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-m7FIvSBbMM", libSceLibcInternalInventory_263_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_264_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7ruwcMCJVGI", libSceLibcInternalInventory_264_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_265_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2Lvc7KWtErs", libSceLibcInternalInventory_265_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_266_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9mKjVppFsL0", libSceLibcInternalInventory_266_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_267_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yAZ5vOpmBus", libSceLibcInternalInventory_267_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_268_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6NCOqr3cD74", libSceLibcInternalInventory_268_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_269_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RnqlvEmvkdw", libSceLibcInternalInventory_269_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_270_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("21KFhEQDJ3s", libSceLibcInternalInventory_270_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_271_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("20cUk0qX9zo", libSceLibcInternalInventory_271_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_272_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("z8GPiQwaAEY", libSceLibcInternalInventory_272_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_273_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("V94pLruduLg", libSceLibcInternalInventory_273_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_274_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aLYyS4Kx6rQ", libSceLibcInternalInventory_274_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_275_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KNNNbyRieqQ", libSceLibcInternalInventory_275_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_276_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-u3XfqNumMU", libSceLibcInternalInventory_276_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_277_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("i-7v8+UGglc", libSceLibcInternalInventory_277_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_278_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dmHEVUqDYGw", libSceLibcInternalInventory_278_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_279_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AdYYKgtPlqg", libSceLibcInternalInventory_279_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_280_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gRw4XrztJ4Q", libSceLibcInternalInventory_280_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_281_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1nZ4Xfnyp38", libSceLibcInternalInventory_281_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_282_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Do3zPpsXj1o", libSceLibcInternalInventory_282_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_283_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jFSmlgyyEUg", libSceLibcInternalInventory_283_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_284_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("n8onIBR4Qdk", libSceLibcInternalInventory_284_nid_no_patch); + +int APS5_VABI libSceLibcInternalUnknown_BIALMFTZ75I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BIALMFTZ75I", libSceLibcInternalUnknown_BIALMFTZ75I_nid_no_patch); + +int APS5_VABI libSceLibcInternalUnknown_fqLrWSWcGHw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fqLrWSWcGHw", libSceLibcInternalUnknown_fqLrWSWcGHw_nid_no_patch); + +int APS5_VABI libSceLibcInternalInventory_285_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("owT6zLJxrTs", libSceLibcInternalInventory_285_nid_no_patch); + +int APS5_VABI libSceLibcInternalUnknown_GG6441JdYkA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GG6441JdYkA", libSceLibcInternalUnknown_GG6441JdYkA_nid_no_patch); + +int APS5_VABI libSceLibcInternalUnknown_QZ9YgTk_plus_yrE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QZ9YgTk+yrE", libSceLibcInternalUnknown_QZ9YgTk_plus_yrE_nid_no_patch); + +int APS5_VABI libSceLibcInternalUnknown_bGuDd3kWVKQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bGuDd3kWVKQ", libSceLibcInternalUnknown_bGuDd3kWVKQ_nid_no_patch); + +int APS5_VABI libSceLibcInternalUnknown_f9LVyN8Ky8g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("f9LVyN8Ky8g", libSceLibcInternalUnknown_f9LVyN8Ky8g_nid_no_patch); + +int APS5_VABI libSceLibcInternalUnknown_o1Ez0fsXvhI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("o1Ez0fsXvhI", libSceLibcInternalUnknown_o1Ez0fsXvhI_nid_no_patch); + +int APS5_VABI libSceLibcInternalUnknown_wUqJ0psUjDo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wUqJ0psUjDo", libSceLibcInternalUnknown_wUqJ0psUjDo_nid_no_patch); + +} diff --git a/core/libs/prx/libSceLibcInternal/include/InventoryExports.hpp b/core/libs/prx/libSceLibcInternal/include/InventoryExports.hpp new file mode 100644 index 0000000000..f513e0d264 --- /dev/null +++ b/core/libs/prx/libSceLibcInternal/include/InventoryExports.hpp @@ -0,0 +1,305 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceLibcInternalInventory_000_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_001_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_002_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_003_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_004_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_005_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_006_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_007_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_008_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_009_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_010_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_011_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_012_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_013_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_014_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_015_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_016_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_017_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_018_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_019_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_020_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_021_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_022_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_023_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_024_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_025_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_026_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_027_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_028_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_029_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_030_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_031_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_032_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_033_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_034_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_035_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_036_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_037_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_038_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_039_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_040_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_041_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_042_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_043_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_044_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_045_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_046_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_047_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_048_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_049_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_050_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_051_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_052_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_053_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_054_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_055_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_056_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_057_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_058_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_059_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_060_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_061_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_062_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_063_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_064_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_065_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_066_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_067_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_068_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_069_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_070_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_071_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_072_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_073_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_074_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_075_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_076_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_077_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_078_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_079_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_080_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_081_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_082_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_083_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_084_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_085_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_086_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_087_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_088_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_089_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_090_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_091_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_092_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_093_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_094_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_095_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_096_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_097_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_098_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_099_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_100_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_101_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_102_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_103_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_104_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_105_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_106_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_107_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_108_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_109_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_110_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_111_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_112_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_113_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_114_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_115_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_116_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_117_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_118_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_119_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_120_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_121_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_122_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_123_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_124_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_125_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_126_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_127_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_128_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_129_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_130_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_131_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_132_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_133_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_134_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_135_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_136_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_137_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_138_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_139_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_140_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_141_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_142_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_143_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_144_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_145_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_146_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_147_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_148_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_149_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_150_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_151_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_152_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_153_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_154_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_155_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_156_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_157_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_158_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_159_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_160_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_161_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_162_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_163_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_164_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_165_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_166_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_167_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_168_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_169_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_170_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_171_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_172_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_173_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_174_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_175_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_176_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_177_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_178_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_179_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_180_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_181_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_182_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_183_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_184_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_185_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_186_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_187_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_188_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_189_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_190_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_191_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_192_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_193_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_194_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_195_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_196_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_197_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_198_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_199_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_200_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_201_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_202_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_203_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_204_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_205_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_206_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_207_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_208_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_209_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_210_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_211_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_212_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_213_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_214_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_215_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_216_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_217_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_218_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_219_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_220_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_221_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_222_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_223_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_224_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_225_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_226_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_227_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_228_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_229_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_230_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_231_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_232_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_233_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_234_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_235_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_236_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_237_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_238_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_239_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_240_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_241_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_242_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_243_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_244_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_245_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_246_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_247_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_248_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_249_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_250_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_251_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_252_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_253_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_254_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_255_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_256_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_257_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_258_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_259_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_260_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_261_nid_no_patch(); +int APS5_VABI libSceLibcInternalUnknown_hsn2TaF3poY_nid_no_patch(); +int APS5_VABI libSceLibcInternalUnknown_oCH4efUlxZ0_nid_no_patch(); +int APS5_VABI libSceLibcInternalUnknown_GdwuPYbVpP4_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_262_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_263_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_264_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_265_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_266_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_267_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_268_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_269_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_270_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_271_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_272_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_273_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_274_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_275_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_276_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_277_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_278_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_279_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_280_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_281_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_282_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_283_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_284_nid_no_patch(); +int APS5_VABI libSceLibcInternalUnknown_BIALMFTZ75I_nid_no_patch(); +int APS5_VABI libSceLibcInternalUnknown_fqLrWSWcGHw_nid_no_patch(); +int APS5_VABI libSceLibcInternalInventory_285_nid_no_patch(); +int APS5_VABI libSceLibcInternalUnknown_GG6441JdYkA_nid_no_patch(); +int APS5_VABI libSceLibcInternalUnknown_QZ9YgTk_plus_yrE_nid_no_patch(); +int APS5_VABI libSceLibcInternalUnknown_bGuDd3kWVKQ_nid_no_patch(); +int APS5_VABI libSceLibcInternalUnknown_f9LVyN8Ky8g_nid_no_patch(); +int APS5_VABI libSceLibcInternalUnknown_o1Ez0fsXvhI_nid_no_patch(); +int APS5_VABI libSceLibcInternalUnknown_wUqJ0psUjDo_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceLibcInternal/libSceLibcInternal.hpp b/core/libs/prx/libSceLibcInternal/libSceLibcInternal.hpp index 7da0381b01..5640c404c8 100644 --- a/core/libs/prx/libSceLibcInternal/libSceLibcInternal.hpp +++ b/core/libs/prx/libSceLibcInternal/libSceLibcInternal.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceLibcInternal/include/Api.hpp" +#include "prx/libSceLibcInternal/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceLibreSsl/CMakeLists.txt b/core/libs/prx/libSceLibreSsl/CMakeLists.txt index 442fdbe021..f22572c2ed 100644 --- a/core/libs/prx/libSceLibreSsl/CMakeLists.txt +++ b/core/libs/prx/libSceLibreSsl/CMakeLists.txt @@ -206,7 +206,7 @@ if(BUILD_TESTING) endif() endif() -target_sources(libSceLibreSsl PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/ObjectTable.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/ObjectText.cpp) +target_sources(libSceLibreSsl PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/ObjectTable.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/ObjectText.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/ObjectCreate.cpp) if(BUILD_TESTING) add_test_executable(guest_libressl_object_text_tests ${CMAKE_CURRENT_SOURCE_DIR}/tests/ObjectText.cpp) @@ -223,7 +223,7 @@ endif() if(BUILD_TESTING) add_test_executable(guest_libressl_object_allocation_tests - tests/ObjectTextAllocation.cpp src/ObjectText.cpp src/ObjectTable.cpp src/Error.cpp) + tests/ObjectTextAllocation.cpp src/ObjectText.cpp src/ObjectCreate.cpp src/ObjectTable.cpp src/Error.cpp) target_include_directories(guest_libressl_object_allocation_tests PRIVATE ${LIBS_INCLUDE_DIR}) target_compile_features(guest_libressl_object_allocation_tests PRIVATE cxx_std_23) target_link_libraries(guest_libressl_object_allocation_tests PRIVATE libc) diff --git a/core/libs/prx/libSceLibreSsl/Export.cpp b/core/libs/prx/libSceLibreSsl/Export.cpp index d3c66c41de..78d3b801d2 100644 --- a/core/libs/prx/libSceLibreSsl/Export.cpp +++ b/core/libs/prx/libSceLibreSsl/Export.cpp @@ -764,13 +764,6 @@ int APS5_VABI HMAC_Update_nid_postfix(void) { return 0; } -void APS5_VABI OBJ_cleanup_nid_postfix(void) {} - -int APS5_VABI OBJ_create_nid_postfix(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI OBJ_nid2sn_nid_postfix(void) { NotImplemented_nid_no_patch(__func__); return 0; diff --git a/core/libs/prx/libSceLibreSsl/include/Api.hpp b/core/libs/prx/libSceLibreSsl/include/Api.hpp index 3419a18af1..7e8b8b4d10 100644 --- a/core/libs/prx/libSceLibreSsl/include/Api.hpp +++ b/core/libs/prx/libSceLibreSsl/include/Api.hpp @@ -405,7 +405,7 @@ int APS5_VABI HMAC_Init_nid_postfix(void); int APS5_VABI HMAC_Init_ex_nid_postfix(void); int APS5_VABI HMAC_Update_nid_postfix(void); void APS5_VABI OBJ_cleanup_nid_postfix(void); -int APS5_VABI OBJ_create_nid_postfix(void); +int APS5_VABI OBJ_create_nid_postfix(const char* oid, const char* shortName, const char* longName); int APS5_VABI OBJ_nid2sn_nid_postfix(void); int APS5_VABI OBJ_obj2nid_nid_postfix(void); int APS5_VABI OBJ_sn2nid_nid_postfix(void); diff --git a/core/libs/prx/libSceLibreSsl/include/ObjectTable.hpp b/core/libs/prx/libSceLibreSsl/include/ObjectTable.hpp index fa770930f3..fa072b1508 100644 --- a/core/libs/prx/libSceLibreSsl/include/ObjectTable.hpp +++ b/core/libs/prx/libSceLibreSsl/include/ObjectTable.hpp @@ -14,6 +14,8 @@ extern const unsigned short LibreSslObjectOrder_nid_no_patch[LibreSslObjectOrder int LibreSslObjectNid_nid_no_patch(const LibreSslAsn1Object* object); const char* LibreSslObjectShortName_nid_no_patch(int nid); const char* LibreSslObjectLongName_nid_no_patch(int nid); +int LibreSslAddedObjectNid_nid_no_patch(const LibreSslAsn1Object* object); +const char* LibreSslAddedObjectName_nid_no_patch(int nid, bool longName); } diff --git a/core/libs/prx/libSceLibreSsl/src/ObjectCreate.cpp b/core/libs/prx/libSceLibreSsl/src/ObjectCreate.cpp new file mode 100644 index 0000000000..bac2635cf5 --- /dev/null +++ b/core/libs/prx/libSceLibreSsl/src/ObjectCreate.cpp @@ -0,0 +1,255 @@ +/* Derived from LibreSSL 2.5.4 (openbsd 2e2c612066aa993717528a0249c15c51128d61cb) src/lib/libcrypto/asn1/a_object.c + * (a_object.c,v 1.29) and src/lib/libcrypto/objects/obj_dat.c (obj_dat.c,v 1.39) */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +#include "prx/libSceLibreSsl/include/ObjectTable.hpp" +#include "prx/libSceLibreSsl/include/Error.hpp" +#include "prx/libc/include/General.hpp" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { + +constexpr int ObjectLibrary = 8; +constexpr int Asn1Library = 13; +constexpr int AnyFunction = 0xfff; +constexpr int UnknownNid = 101; +constexpr int FirstNumberTooLarge = 122; +constexpr int InvalidDigit = 130; +constexpr int InvalidSeparator = 131; +constexpr int MissingSecondNumber = 138; +constexpr int SecondNumberTooLarge = 147; +constexpr std::uint64_t BigNumberThreshold = (UINT64_MAX - 80) / 10; + +struct AddedObject { + LibreSslAsn1Object object{}; + std::vector data; + std::optional shortName; + std::optional longName; +}; + +std::mutex mutex; +bool tableExists = false; +int nextNid = LibreSslObjectCount; +std::vector> objects; +std::map, const AddedObject*> byData; +std::map byNid; + +void Asn1Error(int reason) { + LibreSslPutError_nid_no_patch(Asn1Library, AnyFunction, reason); +} + +class Arc { +public: + explicit Arc(std::uint64_t value) : limbs{static_cast(value), static_cast(value >> 32)} {} + + void MultiplyAdd(std::uint32_t factor, std::uint32_t addend) { + std::uint64_t carry = addend; + for (auto& limb : limbs) { + const std::uint64_t product = static_cast(limb) * factor + carry; + limb = static_cast(product); + carry = product >> 32; + } + if (carry) limbs.push_back(static_cast(carry)); + } + + int Bits() const { + for (std::size_t index = limbs.size(); index-- > 0;) { + if (limbs[index]) return static_cast(index * 32) + 32 - std::countl_zero(limbs[index]); + } + return 0; + } + + unsigned char DivideBy128() { + std::uint64_t remainder = 0; + for (std::size_t index = limbs.size(); index-- > 0;) { + const std::uint64_t current = (remainder << 32) | limbs[index]; + limbs[index] = static_cast(current / 128); + remainder = current % 128; + } + return static_cast(remainder); + } + +private: + std::vector limbs; +}; + +std::vector TextToContent(const char* text) { + std::vector out; + std::size_t remaining = std::strlen(text); + const char* next = text; + int character = static_cast(*next++); + if (character < '0' || character > '2') { + Asn1Error(FirstNumberTooLarge); + return {}; + } + --remaining; + const int first = character - '0'; + if (!remaining) { + Asn1Error(MissingSecondNumber); + return {}; + } + character = static_cast(*next++); + --remaining; + while (remaining) { + if (character != '.' && character != ' ') { + Asn1Error(InvalidSeparator); + return {}; + } + std::uint64_t value = 0; + std::optional big; + while (remaining) { + --remaining; + character = static_cast(*next++); + if (character == ' ' || character == '.') break; + if (character < '0' || character > '9') { + Asn1Error(InvalidDigit); + return {}; + } + if (!big && value >= BigNumberThreshold) big.emplace(value); + if (big) big->MultiplyAdd(10, static_cast(character - '0')); + else value = value * 10 + static_cast(character - '0'); + } + if (out.empty()) { + if (first < 2 && value >= 40) { + Asn1Error(SecondNumberTooLarge); + return {}; + } + if (big) big->MultiplyAdd(1, static_cast(first * 40)); + else value += static_cast(first) * 40; + } + std::vector groups; + if (big) { + for (int count = (big->Bits() + 6) / 7; count > 0; --count) groups.push_back(big->DivideBy128()); + } else { + do { + groups.push_back(static_cast(value & 0x7f)); + value >>= 7; + } while (value); + } + for (std::size_t index = groups.size(); index-- > 1;) out.push_back(groups[index] | 0x80); + out.push_back(groups[0]); + } + return out; +} + +} // namespace + +extern "C" { + +int LibreSslAddedObjectNid_nid_no_patch(const LibreSslAsn1Object* object) { + std::lock_guard lock(mutex); + if (!tableExists || !object->data || object->length <= 0) return 0; + const auto found = byData.find(std::vector(object->data, object->data + object->length)); + return found == byData.end() ? 0 : found->second->object.nid; +} + +const char* LibreSslAddedObjectName_nid_no_patch(int nid, bool longName) { + std::lock_guard lock(mutex); + if (!tableExists) return nullptr; + const auto found = byNid.find(nid); + if (found == byNid.end()) { + LibreSslPutError_nid_no_patch(ObjectLibrary, AnyFunction, UnknownNid); + return nullptr; + } + return longName ? found->second->object.longName : found->second->object.shortName; +} + +int APS5_VABI OBJ_create_nid_postfix(const char* oid, const char* shortName, const char* longName) { + if (!oid) throw std::invalid_argument("OBJ_create: null OID text"); + std::vector content = TextToContent(oid); + if (content.empty()) return 0; + std::lock_guard lock(mutex); + tableExists = true; + const int nid = nextNid++; + auto added = std::make_unique(); + added->data = std::move(content); + if (shortName) added->shortName = shortName; + if (longName) added->longName = longName; + added->object = {added->shortName ? added->shortName->c_str() : nullptr, added->longName ? added->longName->c_str() : nullptr, nid, + static_cast(added->data.size()), added->data.data(), 0}; + objects.reserve(objects.size() + 1); + const auto indexed = byNid.try_emplace(nid, added.get()).first; + std::map, const AddedObject*>::iterator encoding; + try { + encoding = byData.try_emplace(added->data, nullptr).first; + } catch (...) { + byNid.erase(indexed); + throw; + } + encoding->second = added.get(); + objects.push_back(std::move(added)); + return nid; +} + +void APS5_VABI OBJ_cleanup_nid_postfix(void) { + std::lock_guard lock(mutex); + byData.clear(); + byNid.clear(); + objects.clear(); + tableExists = false; +} + +} diff --git a/core/libs/prx/libSceLibreSsl/src/ObjectText.cpp b/core/libs/prx/libSceLibreSsl/src/ObjectText.cpp index 3d954047ac..2125a23b72 100644 --- a/core/libs/prx/libSceLibreSsl/src/ObjectText.cpp +++ b/core/libs/prx/libSceLibreSsl/src/ObjectText.cpp @@ -89,7 +89,7 @@ int CompareObject(const LibreSslAsn1Object* key, const LibreSslAsn1Object* entry } const char* Name(int nid, bool longName) { - if (nid < 0 || nid >= LibreSslObjectCount) return nullptr; + if (nid < 0 || nid >= LibreSslObjectCount) return LibreSslAddedObjectName_nid_no_patch(nid, longName); const auto& object = LibreSslObjects_nid_no_patch[nid]; if (nid != 0 && object.nid == 0) { LibreSslPutError_nid_no_patch(ObjectLibrary, AnyFunction, UnknownNid); @@ -203,6 +203,7 @@ extern "C" { int LibreSslObjectNid_nid_no_patch(const LibreSslAsn1Object* object) { if (!object) return 0; if (object->nid != 0) return object->nid; + if (const int added = LibreSslAddedObjectNid_nid_no_patch(object)) return added; int low = 0; int high = LibreSslObjectOrderCount; while (low < high) { diff --git a/core/libs/prx/libSceLibreSsl/src/ProtocolSelection.cpp b/core/libs/prx/libSceLibreSsl/src/ProtocolSelection.cpp index 537988df72..8781b9db21 100644 --- a/core/libs/prx/libSceLibreSsl/src/ProtocolSelection.cpp +++ b/core/libs/prx/libSceLibreSsl/src/ProtocolSelection.cpp @@ -1,37 +1,34 @@ #include "prx/libSceLibreSsl/include/Api.hpp" #include "prx/libc/include/General.hpp" -#include #include #include namespace { -bool ValidProtocols(const unsigned char* protocols, std::size_t size) { - if (!protocols || size == 0) return false; - for (std::size_t offset = 0; offset < size;) { - const std::size_t length = protocols[offset++]; - if (length == 0 || length > size - offset) return false; - offset += length; +constexpr int Negotiated = 1; +constexpr int NoOverlap = 2; + +const unsigned char* FirstOffered_nid_no_patch(const unsigned char* peer, std::uint32_t peerLength, const unsigned char* supported, std::uint32_t supportedLength) { + for (std::uint32_t offered = 0; offered < peerLength; offered += 1u + peer[offered]) { + for (std::uint32_t local = 0; local < supportedLength; local += 1u + supported[local]) { + if (peer[offered] == supported[local] && std::memcmp(peer + offered + 1, supported + local + 1, peer[offered]) == 0) + return peer + offered; + } } - return true; + return nullptr; } } extern "C" int APS5_VABI SSL_select_next_proto_nid_postfix(unsigned char** output, unsigned char* outputLength, const unsigned char* peer, std::uint32_t peerLength, const unsigned char* supported, std::uint32_t supportedLength) { - if (!output || !outputLength || !ValidProtocols(peer, peerLength) || !ValidProtocols(supported, supportedLength)) - NotImplemented_nid_no_patch("SSL_select_next_proto: null output or invalid protocol list"); - for (std::size_t offered = 0; offered < peerLength; offered += 1 + peer[offered]) { - for (std::size_t local = 0; local < supportedLength; local += 1 + supported[local]) { - if (peer[offered] != supported[local] || std::memcmp(peer + offered + 1, supported + local + 1, peer[offered]) != 0) continue; - *output = const_cast(peer + offered + 1); - *outputLength = peer[offered]; - return 1; - } - } - *output = const_cast(supported + 1); - *outputLength = supported[0]; - return 2; + if (!output || !outputLength) NotImplemented_nid_no_patch("SSL_select_next_proto: null output"); + if (!supported || (!peer && peerLength != 0)) NotImplemented_nid_no_patch("SSL_select_next_proto: null protocol list"); + const unsigned char* result = FirstOffered_nid_no_patch(peer, peerLength, supported, supportedLength); + const int status = result ? Negotiated : NoOverlap; + if (!result) result = supported; + *output = const_cast(result) + 1; + *outputLength = result[0]; + return status; } diff --git a/core/libs/prx/libSceLibreSsl/tests/ObjectText.cpp b/core/libs/prx/libSceLibreSsl/tests/ObjectText.cpp index b0f93aa427..cfabef2fc4 100644 --- a/core/libs/prx/libSceLibreSsl/tests/ObjectText.cpp +++ b/core/libs/prx/libSceLibreSsl/tests/ObjectText.cpp @@ -125,6 +125,56 @@ void Errors() { RequireThrows([&] { i2t_ASN1_OBJECT_nid_postfix(nullptr, 8, &gap.object); }, "a null buffer with a length"); } +constexpr std::uint64_t Asn1Error(int reason) { + return (13ull << 24) | (0xfffull << 12) | static_cast(reason); +} + +void Rejects(const char* oid, std::uint64_t error, const char* message) { + ERR_clear_error_nid_postfix(); + Require(OBJ_create_nid_postfix(oid, "x", "y") == 0, message); + Require(ERR_get_error_nid_postfix() == error && ERR_get_error_nid_postfix() == 0, message); +} + +void Created() { + Encoded added{0x2a, 0x03, 0x04}, commonName{0x55, 0x04, 0x03}; + Encoded big{0x2a, 0x82, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x05}; + Rejects("3.1", Asn1Error(122), "a first arc above 2"); + Rejects("1", Asn1Error(138), "a missing second arc"); + Rejects("12.3", Asn1Error(131), "a missing separator"); + Rejects("1.2x", Asn1Error(130), "a non-digit"); + Rejects("1.40", Asn1Error(147), "a second arc of 40 under 0 or 1"); + Rejects("", Asn1Error(122), "an empty text reads its terminator as the first arc"); + Rejects("1.", 0, "a text without a second arc value adds nothing and queues nothing"); + RequireThrows([] { OBJ_create_nid_postfix(nullptr, "x", "y"); }, "a null OID text"); + Require(OBJ_create_nid_postfix("1.2.3.4", "addedShort", "addedLong") == LibreSslObjectCount, "the first added object takes NID 956"); + RequireText(added.object, 64, 9, "addedLong", "an added object prints its long name"); + Require(LibreSslObjectNid_nid_no_patch(&added.object) == LibreSslObjectCount, "an added encoding resolves to its NID"); + Require(OBJ_create_nid_postfix("1 2 3 4", "secondShort", nullptr) == LibreSslObjectCount + 1, "spaces separate arcs and each object takes the next NID"); + RequireText(added.object, 64, 11, "secondShort", "the latest object with an encoding wins, and a missing long name falls back to the short name"); + Require(OBJ_create_nid_postfix("2.5.4.3", nullptr, nullptr) == LibreSslObjectCount + 2, "an added object may repeat a built-in OID"); + RequireText(commonName.object, 64, 7, "2.5.4.3", "added encodings are searched before the table, and a nameless one prints in dotted form"); + Require(OBJ_create_nid_postfix("1.2.18446744073709551616.5", "big", "bigLong") == LibreSslObjectCount + 3, "an arc past 64 bits"); + RequireText(big.object, 64, 7, "bigLong", "an arc past 64 bits is encoded exactly"); + Require(OBJ_create_nid_postfix("2.999..", "trailing", nullptr) == LibreSslObjectCount + 4, "empty arcs count as zero"); + Encoded trailing{0x88, 0x37, 0x00}; + RequireText(trailing.object, 64, 8, "trailing", "empty arcs count as zero"); + Encoded unknown{0x2a, 0x05}; + unknown.object.nid = 5000; + ERR_clear_error_nid_postfix(); + RequireText(unknown.object, 64, 5, "1.2.5", "a NID past the table that was not added prints the encoding"); + Require(ERR_get_error_nid_postfix() == UnknownNidError && ERR_get_error_nid_postfix() == UnknownNidError && ERR_get_error_nid_postfix() == 0, + "once objects were added, an unknown NID past the table reports OBJ_R_UNKNOWN_NID for each name"); + OBJ_cleanup_nid_postfix(); + RequireText(added.object, 64, 7, "1.2.3.4", "OBJ_cleanup removes added objects"); + RequireText(commonName.object, 64, 10, "commonName", "OBJ_cleanup restores the built-in names"); + RequireText(unknown.object, 64, 5, "1.2.5", "after OBJ_cleanup an unknown NID past the table reports no error"); + Require(ERR_get_error_nid_postfix() == 0, "after OBJ_cleanup an unknown NID past the table reports no error"); + OBJ_cleanup_nid_postfix(); + Require(OBJ_create_nid_postfix("1.2.3.4", "again", nullptr) == LibreSslObjectCount + 5, "NIDs keep counting after OBJ_cleanup"); + RequireText(added.object, 64, 5, "again", "objects can be added again after OBJ_cleanup"); + OBJ_cleanup_nid_postfix(); +} + } // namespace int main() { @@ -135,4 +185,5 @@ int main() { Names(); Numbers(); Errors(); + Created(); } diff --git a/core/libs/prx/libSceLibreSsl/tests/ObjectTextAllocation.cpp b/core/libs/prx/libSceLibreSsl/tests/ObjectTextAllocation.cpp index d18cd76455..6605e2d395 100644 --- a/core/libs/prx/libSceLibreSsl/tests/ObjectTextAllocation.cpp +++ b/core/libs/prx/libSceLibreSsl/tests/ObjectTextAllocation.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include namespace { @@ -79,6 +80,39 @@ NumericRun Run(const unsigned char* data, int length, int space, std::size_t fai return result; } +std::string Name(const std::vector& data) { + LibreSslAsn1Object object{nullptr, nullptr, 0, static_cast(data.size()), data.data(), 0}; + char buffer[64]; + i2t_ASN1_OBJECT_nid_postfix(buffer, sizeof(buffer), &object); + return buffer; +} + +void CreateFailures() { + const std::vector replaced{0x2a, 0x03, 0x04}, fresh{0x2a, 0x03, 0x05}; + for (std::size_t point = 1;; ++point) { + OBJ_cleanup_nid_postfix(); + Check(OBJ_create_nid_postfix("1.2.3.4", "base", nullptr) > 0, "the object to replace is added"); + allocations = 0; failAt = point; fired = false; + armed = true; + bool threw = false; + int replacing = 0; + try { replacing = OBJ_create_nid_postfix("1.2.3.4", "replacing", nullptr); } + catch (const std::bad_alloc&) { threw = true; } + armed = false; + const bool failed = fired; + ++faultCases; + Check(threw == failed, "an allocation failure in OBJ_create throws std::bad_alloc"); + Check(Name(replaced) == (failed ? "base" : "replacing"), "a failed OBJ_create leaves the replaced encoding as it was"); + const int next = OBJ_create_nid_postfix("1.2.3.5", "fresh", nullptr); + Check(next > 0 && (failed || next == replacing + 1), "objects can still be added after a failed OBJ_create"); + Check(Name(fresh) == "fresh", "lookups still work after a failed OBJ_create"); + OBJ_cleanup_nid_postfix(); + Check(Live() == 0, "OBJ_cleanup frees everything a failed OBJ_create allocated"); + Check(Name(replaced) == "1.2.3.4" && Name(fresh) == "1.2.3.5", "OBJ_cleanup removes every added object"); + if (!failed) break; + } +} + int main() { constexpr std::uint64_t allocationError = (3ull << 24) | (0xfffull << 12) | 65; std::size_t fastCases = 0; @@ -129,6 +163,7 @@ int main() { Check(!seeded.threw && seeded.returned == 0 && seeded.error == ((8ull << 24) | (0xfffull << 12) | 101) && seeded.following == allocationError, "allocation error appends to existing queue entries"); Check(ERR_get_error_nid_postfix() == 0 && seeded.live == 0, "seeded failure adds exactly one error and leaks nothing"); + CreateFailures(); std::printf("{\"fast_cases\":%zu,\"allocation_fault_cases\":%zu,\"checks\":%zu,\"failures\":%zu,\"escaped\":%zu,\"final_live\":%zu}\n", fastCases, faultCases, checks, failures, escaped, Live()); return failures ? 1 : 0; diff --git a/core/libs/prx/libSceLibreSsl/tests/Oracle.cpp b/core/libs/prx/libSceLibreSsl/tests/Oracle.cpp index 3d18ba451b..187eabe597 100644 --- a/core/libs/prx/libSceLibreSsl/tests/Oracle.cpp +++ b/core/libs/prx/libSceLibreSsl/tests/Oracle.cpp @@ -34,6 +34,11 @@ const char* SslAlertDescStringLong(int value); const char* OcspCertStatusString(long status); const char* OcspCrlReasonString(long reason); const char* OcspResponseStatusString(long status); +int ObjCreate(const char* oid, const char* shortName, const char* longName); +void ObjCleanup(); +int I2tAsn1Object(char* buffer, int length, const void* object); +unsigned long ErrGetError(); +void ErrClearError(); } namespace { @@ -302,6 +307,98 @@ void CompareStrings() { CompareStrings("OCSP_response_status_str", Range(-2, 10), [](long v) { return OCSP_response_status_str_nid_postfix(v); }, LibreSslReference::OcspResponseStatusString); } + +std::string Errors(const std::function& next) { + std::string text; + while (const unsigned long code = next()) text += " " + std::to_string(code); + return text; +} + +struct Oid { + std::string text; + std::vector content; +}; + +Oid RandomOid() { + static const char* const huge[] = {"18446744073709551535", "18446744073709551616", "1844674407370955161", "99999999999999999999999999", "340282366920938463463374607431768211455"}; + Oid oid; + const unsigned first = static_cast(generator() % 3); + oid.text = std::to_string(first); + const unsigned arcs = 1 + static_cast(generator() % 5); + bool exact = true; + for (unsigned index = 0; index < arcs; ++index) { + oid.text += generator() % 5 ? '.' : ' '; + if (generator() % 12 == 0) { + oid.text += huge[generator() % std::size(huge)]; + exact = false; + continue; + } + std::uint64_t value = index == 0 && first < 2 ? generator() % 40 : generator() % 3 ? generator() % 300 : generator() >> (generator() % 64); + if (index == 0) value += first * 40; + oid.text += std::to_string(index == 0 ? value - first * 40 : value); + std::vector groups; + do { + groups.push_back(static_cast(value & 0x7f)); + value >>= 7; + } while (value); + for (std::size_t at = groups.size(); at-- > 1;) oid.content.push_back(groups[at] | 0x80); + oid.content.push_back(groups[0]); + } + if (!exact) oid.content.clear(); + if (generator() % 4 == 0) { + static constexpr char junk[] = {'.', ' ', 'x', '3', '-', '\x80', '0', '4'}; + const std::size_t at = generator() % (oid.text.size() + 1); + if (generator() % 2 && at < oid.text.size()) oid.text[at] = junk[generator() % sizeof junk]; + else oid.text.insert(at, 1, junk[generator() % sizeof junk]); + oid.content.clear(); + } + if (generator() % 30 == 0) oid.text = std::string("012").substr(0, generator() % 3); + return oid; +} + +std::string Describe(int result, const std::function& errors) { + return std::to_string(result) + Errors(errors); +} + +void CompareCreatedObjects() { + static const char* const names[] = {"alpha", "beta", "CN", "commonName", "", "x"}; + std::vector> probes = {{0x55, 0x04, 0x03}, {0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b}, {0x2a, 0x03, 0x04}, {0x2b}, {0x88, 0x37, 0x05}}; + std::string mineLog; + std::string theirLog; + for (int round = 0; round < 20000; ++round) { + if (generator() % 25 == 0) { + OBJ_cleanup_nid_postfix(); + LibreSslReference::ObjCleanup(); + } + const Oid oid = RandomOid(); + const char* shortName = generator() % 5 ? names[generator() % std::size(names)] : nullptr; + const char* longName = generator() % 3 ? names[generator() % std::size(names)] : nullptr; + ERR_clear_error_nid_postfix(); + LibreSslReference::ErrClearError(); + int mineResult = 0; + const auto error = Attempt([&] { mineResult = OBJ_create_nid_postfix(oid.text.c_str(), shortName, longName); }); + std::string mineText = error.empty() ? Describe(mineResult, ERR_get_error_nid_postfix) : error; + std::string theirText = Describe(LibreSslReference::ObjCreate(oid.text.c_str(), shortName, longName), LibreSslReference::ErrGetError); + if (!oid.content.empty() && probes.size() < 64) probes.push_back(oid.content); + for (int probe = 0; probe < 4; ++probe) { + std::vector data = probes[generator() % probes.size()]; + LibreSslAsn1Object object{nullptr, nullptr, generator() % 4 ? 0 : static_cast(940 + generator() % 60), static_cast(data.size()), data.data(), 0}; + const int space = static_cast(generator() % 40); + char mine[48]; + char theirs[48]; + std::memset(mine, 0x5a, sizeof mine); + std::memset(theirs, 0x5a, sizeof theirs); + const int mineLength = i2t_ASN1_OBJECT_nid_postfix(mine, space, &object); + mineText += " | " + std::to_string(mineLength) + " " + Hex(mine, sizeof mine) + Errors(ERR_get_error_nid_postfix); + const int theirLength = LibreSslReference::I2tAsn1Object(theirs, space, &object); + theirText += " | " + std::to_string(theirLength) + " " + Hex(theirs, sizeof theirs) + Errors(LibreSslReference::ErrGetError); + } + Record("OBJ_create", mineText == theirText, [&] { return Quoted(oid.text.c_str()) + " " + Quoted(shortName) + " " + Quoted(longName) + "\n mine " + mineText + "\n theirs " + theirText; }); + } + OBJ_cleanup_nid_postfix(); + LibreSslReference::ObjCleanup(); +} + } int main() { @@ -310,6 +407,7 @@ int main() { CompareDigests(); CompareDesParity(); CompareStrings(); + CompareCreatedObjects(); long cases = 0; long differing = 0; for (const auto& [function, count] : counts) { diff --git a/core/libs/prx/libSceLibreSsl/tests/OracleReference.cpp b/core/libs/prx/libSceLibreSsl/tests/OracleReference.cpp index db478c863f..4759b2cdec 100644 --- a/core/libs/prx/libSceLibreSsl/tests/OracleReference.cpp +++ b/core/libs/prx/libSceLibreSsl/tests/OracleReference.cpp @@ -1,7 +1,9 @@ #include #include +#include #include #include +#include #include #include #include @@ -77,5 +79,10 @@ const char* SslAlertDescStringLong(int value) { return SSL_alert_desc_string_lon const char* OcspCertStatusString(long status) { return OCSP_cert_status_str(status); } const char* OcspCrlReasonString(long reason) { return OCSP_crl_reason_str(reason); } const char* OcspResponseStatusString(long status) { return OCSP_response_status_str(status); } +int ObjCreate(const char* oid, const char* shortName, const char* longName) { return OBJ_create(oid, shortName, longName); } +void ObjCleanup() { OBJ_cleanup(); } +int I2tAsn1Object(char* buffer, int length, const void* object) { return i2t_ASN1_OBJECT(buffer, length, const_cast(static_cast(object))); } +unsigned long ErrGetError() { return ERR_get_error(); } +void ErrClearError() { ERR_clear_error(); } } diff --git a/core/libs/prx/libSceLibreSsl3/AdditionalExports.cpp b/core/libs/prx/libSceLibreSsl3/AdditionalExports.cpp index b0b55ec98a..62b20995c5 100644 --- a/core/libs/prx/libSceLibreSsl3/AdditionalExports.cpp +++ b/core/libs/prx/libSceLibreSsl3/AdditionalExports.cpp @@ -23,18 +23,6 @@ int APS5_VABI ERR_func_error_string_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI EVP_CIPHER_iv_length_nid_postfix() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI EVP_CIPHER_key_length_nid_postfix() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI EVP_MD_CTX_md_nid_postfix() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI EVP_PKEY_CTX_free_nid_postfix() { NotImplemented_nid_no_patch(__func__); } @@ -155,10 +143,6 @@ int APS5_VABI X509_STORE_load_locations_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI X509_VERIFY_PARAM_set_flags_nid_postfix() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI X509_get0_pubkey_nid_postfix() { NotImplemented_nid_no_patch(__func__); } diff --git a/core/libs/prx/libSceLibreSsl3/CMakeLists.txt b/core/libs/prx/libSceLibreSsl3/CMakeLists.txt index 63ec1811e4..00f81a6be1 100644 --- a/core/libs/prx/libSceLibreSsl3/CMakeLists.txt +++ b/core/libs/prx/libSceLibreSsl3/CMakeLists.txt @@ -5,6 +5,9 @@ configure_windows_unwind(libSceLibreSsl3) target_sources(libSceLibreSsl3 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/AdditionalExports.cpp) target_sources(libSceLibreSsl3 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/Stack.cpp) +target_sources(libSceLibreSsl3 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/DigestContext.cpp) +target_sources(libSceLibreSsl3 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/Cipher.cpp) +target_sources(libSceLibreSsl3 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/X509VerifyParam.cpp) if(WIN32) target_sources(libSceLibreSsl3 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/ParentExports.cpp) endif() @@ -21,12 +24,32 @@ if(BUILD_TESTING) configure_windows_unwind(guest_libressl3_digest_tests) add_test(NAME guest_libressl3_digest COMMAND guest_libressl3_digest_tests) set_tests_properties(guest_libressl3_digest PROPERTIES TIMEOUT 30) + add_test_executable(guest_libressl3_digest_context_tests ${CMAKE_CURRENT_SOURCE_DIR}/tests/DigestContext.cpp) + target_include_directories(guest_libressl3_digest_context_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_libressl3_digest_context_tests PRIVATE libSceLibreSsl3) + configure_windows_unwind(guest_libressl3_digest_context_tests) + add_test(NAME guest_libressl3_digest_context COMMAND guest_libressl3_digest_context_tests) + set_tests_properties(guest_libressl3_digest_context PROPERTIES TIMEOUT 20) + if(WIN32) + set_tests_properties(guest_libressl3_digest_context PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() add_test_executable(guest_libressl3_asn1_tests ${CMAKE_CURRENT_SOURCE_DIR}/tests/Asn1.cpp) target_include_directories(guest_libressl3_asn1_tests PRIVATE ${LIBS_INCLUDE_DIR}) target_link_libraries(guest_libressl3_asn1_tests PRIVATE libSceLibreSsl3 libc) configure_windows_unwind(guest_libressl3_asn1_tests) add_test(NAME guest_libressl3_asn1 COMMAND guest_libressl3_asn1_tests) set_tests_properties(guest_libressl3_asn1 PROPERTIES TIMEOUT 30) + add_test_executable(guest_libressl3_x509_verify_param_tests ${CMAKE_CURRENT_SOURCE_DIR}/tests/X509VerifyParam.cpp) + target_include_directories(guest_libressl3_x509_verify_param_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_libressl3_x509_verify_param_tests PRIVATE libSceLibreSsl3) + configure_windows_unwind(guest_libressl3_x509_verify_param_tests) + add_test(NAME guest_libressl3_x509_verify_param COMMAND guest_libressl3_x509_verify_param_tests) + set_tests_properties(guest_libressl3_x509_verify_param PROPERTIES TIMEOUT 20) + if(WIN32) + set_tests_properties(guest_libressl3_x509_verify_param PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() add_test_executable(guest_libressl3_stack_tests ${CMAKE_CURRENT_SOURCE_DIR}/tests/Stack.cpp) target_include_directories(guest_libressl3_stack_tests PRIVATE ${LIBS_INCLUDE_DIR}) target_link_libraries(guest_libressl3_stack_tests PRIVATE libSceLibreSsl3 libSceLibreSsl libc) @@ -37,6 +60,16 @@ if(BUILD_TESTING) set_tests_properties(guest_libressl3_stack PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") endif() + add_test_executable(guest_libressl3_cipher_tests ${CMAKE_CURRENT_SOURCE_DIR}/tests/Cipher.cpp) + target_include_directories(guest_libressl3_cipher_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_libressl3_cipher_tests PRIVATE libSceLibreSsl3) + configure_windows_unwind(guest_libressl3_cipher_tests) + add_test(NAME guest_libressl3_cipher COMMAND guest_libressl3_cipher_tests) + set_tests_properties(guest_libressl3_cipher PROPERTIES TIMEOUT 20) + if(WIN32) + set_tests_properties(guest_libressl3_cipher PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() add_test_executable(guest_libressl3_key_reference_tests ${LIBS_INCLUDE_DIR}/tests/GuestLibreSsl3KeyReference.cpp) target_include_directories(guest_libressl3_key_reference_tests PRIVATE ${LIBS_INCLUDE_DIR}) target_link_libraries(guest_libressl3_key_reference_tests PRIVATE libSceLibreSsl3) diff --git a/core/libs/prx/libSceLibreSsl3/Export.cpp b/core/libs/prx/libSceLibreSsl3/Export.cpp index 0f7cb0e894..a299a4c7a7 100644 --- a/core/libs/prx/libSceLibreSsl3/Export.cpp +++ b/core/libs/prx/libSceLibreSsl3/Export.cpp @@ -266,11 +266,6 @@ int APS5_VABI RSA_padding_add_PKCS1_PSS_mgf1_nid_postfix(void) { return 0; } -int APS5_VABI RSA_up_ref_nid_postfix(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI SSL_CTX_add0_chain_cert_nid_postfix(void) { NotImplemented_nid_no_patch(__func__); return 0; diff --git a/core/libs/prx/libSceLibreSsl3/include/Api.hpp b/core/libs/prx/libSceLibreSsl3/include/Api.hpp index 771580b4fb..53b7c392b1 100644 --- a/core/libs/prx/libSceLibreSsl3/include/Api.hpp +++ b/core/libs/prx/libSceLibreSsl3/include/Api.hpp @@ -3,6 +3,7 @@ #include "SceTypes.hpp" #include "prx/libSceLibreSsl3/include/Key.hpp" #include "prx/libSceLibreSsl/include/Api.hpp" +#include "prx/libSceLibreSsl3/include/Cipher.hpp" extern "C" { @@ -59,7 +60,7 @@ int APS5_VABI PKCS8_PRIV_KEY_INFO_free_nid_postfix(void); int APS5_VABI RSA_check_key_nid_postfix(void); int APS5_VABI RSA_get0_key_nid_postfix(void); int APS5_VABI RSA_padding_add_PKCS1_PSS_mgf1_nid_postfix(void); -int APS5_VABI RSA_up_ref_nid_postfix(void); +int APS5_VABI RSA_up_ref_nid_postfix(LibreSsl3Rsa* rsa); int APS5_VABI SSL_CTX_add0_chain_cert_nid_postfix(void); int APS5_VABI SSL_CTX_clear_chain_certs_nid_postfix(void); int APS5_VABI SSL_CTX_set_max_proto_version_nid_postfix(void); @@ -99,9 +100,9 @@ int APS5_VABI BIO_set_flags_nid_postfix(); int APS5_VABI BN_clear_free_nid_postfix(); int APS5_VABI BN_dup_nid_postfix(); int APS5_VABI ERR_func_error_string_nid_postfix(); -int APS5_VABI EVP_CIPHER_iv_length_nid_postfix(); -int APS5_VABI EVP_CIPHER_key_length_nid_postfix(); -int APS5_VABI EVP_MD_CTX_md_nid_postfix(); +int APS5_VABI EVP_CIPHER_iv_length_nid_postfix(const LibreSsl3EvpCipher* cipher); +int APS5_VABI EVP_CIPHER_key_length_nid_postfix(const LibreSsl3EvpCipher* cipher); +const void* APS5_VABI EVP_MD_CTX_md_nid_postfix(const void* context); int APS5_VABI EVP_PKEY_CTX_free_nid_postfix(); int APS5_VABI EVP_PKEY_assign_nid_postfix(); int APS5_VABI EVP_PKEY_bits_nid_postfix(); @@ -132,7 +133,7 @@ int APS5_VABI TLS_server_method_nid_postfix(); int APS5_VABI X509_EXTENSION_free_nid_postfix(); int APS5_VABI X509_STORE_CTX_get0_param_nid_postfix(); int APS5_VABI X509_STORE_load_locations_nid_postfix(); -int APS5_VABI X509_VERIFY_PARAM_set_flags_nid_postfix(); +int APS5_VABI X509_VERIFY_PARAM_set_flags_nid_postfix(LibreSslX509VerifyParam* param, std::uint64_t flags); int APS5_VABI X509_get0_pubkey_nid_postfix(); int APS5_VABI d2i_SSL_SESSION_nid_postfix(); int APS5_VABI d2i_X509_CRL_nid_postfix(); diff --git a/core/libs/prx/libSceLibreSsl3/include/Cipher.hpp b/core/libs/prx/libSceLibreSsl3/include/Cipher.hpp new file mode 100644 index 0000000000..6980b787f5 --- /dev/null +++ b/core/libs/prx/libSceLibreSsl3/include/Cipher.hpp @@ -0,0 +1,24 @@ +#pragma once + +#include +#include + +struct LibreSsl3EvpCipher { + std::int32_t nid; + std::int32_t blockSize; + std::int32_t keyLength; + std::int32_t ivLength; + std::uint64_t flags; + const void* init; + const void* doCipher; + const void* cleanup; + std::int32_t contextSize; + const void* setAsn1Parameters; + const void* getAsn1Parameters; + const void* control; +}; + +static_assert(sizeof(LibreSsl3EvpCipher) == 80); +static_assert(offsetof(LibreSsl3EvpCipher, keyLength) == 8); +static_assert(offsetof(LibreSsl3EvpCipher, ivLength) == 12); +static_assert(offsetof(LibreSsl3EvpCipher, contextSize) == 48); diff --git a/core/libs/prx/libSceLibreSsl3/include/Key.hpp b/core/libs/prx/libSceLibreSsl3/include/Key.hpp index bc0a301686..4dac85fd57 100644 --- a/core/libs/prx/libSceLibreSsl3/include/Key.hpp +++ b/core/libs/prx/libSceLibreSsl3/include/Key.hpp @@ -24,7 +24,32 @@ struct LibreSsl3EcKey { void* extraData; }; +struct LibreSsl3Rsa { + std::int32_t pad; + std::int64_t version; + const void* method; + void* n; + void* e; + void* d; + void* p; + void* q; + void* dmp1; + void* dmq1; + void* iqmp; + void* pss; + void* extraData; + std::int32_t references; + std::int32_t flags; + void* methodModN; + void* methodModP; + void* methodModQ; + void* blinding; + void* mtBlinding; +}; + static_assert(sizeof(LibreSsl3EvpPkey) == 32); static_assert(offsetof(LibreSsl3EvpPkey, references) == 4); static_assert(sizeof(LibreSsl3EcKey) == 64); static_assert(offsetof(LibreSsl3EcKey, references) == 48); +static_assert(sizeof(LibreSsl3Rsa) == 152); +static_assert(offsetof(LibreSsl3Rsa, references) == 104); diff --git a/core/libs/prx/libSceLibreSsl3/src/Cipher.cpp b/core/libs/prx/libSceLibreSsl3/src/Cipher.cpp new file mode 100644 index 0000000000..a3dba97b2f --- /dev/null +++ b/core/libs/prx/libSceLibreSsl3/src/Cipher.cpp @@ -0,0 +1,19 @@ +#include "prx/libSceLibreSsl3/libSceLibreSsl3.hpp" + +#include + +extern "C" { + +int APS5_VABI EVP_CIPHER_iv_length_nid_postfix(const LibreSsl3EvpCipher* cipher) { + if (!cipher) + throw std::invalid_argument("EVP_CIPHER_iv_length requires a cipher"); + return cipher->ivLength; +} + +int APS5_VABI EVP_CIPHER_key_length_nid_postfix(const LibreSsl3EvpCipher* cipher) { + if (!cipher) + throw std::invalid_argument("EVP_CIPHER_key_length requires a cipher"); + return cipher->keyLength; +} + +} diff --git a/core/libs/prx/libSceLibreSsl3/src/DigestContext.cpp b/core/libs/prx/libSceLibreSsl3/src/DigestContext.cpp new file mode 100644 index 0000000000..aba7ed2dbf --- /dev/null +++ b/core/libs/prx/libSceLibreSsl3/src/DigestContext.cpp @@ -0,0 +1,15 @@ +#include "prx/libSceLibreSsl3/libSceLibreSsl3.hpp" + +#include + +extern "C" { + +const void* APS5_VABI EVP_MD_CTX_md_nid_postfix(const void* context) { + if (!context) + return nullptr; + const void* digest; + std::memcpy(&digest, context, sizeof(digest)); + return digest; +} + +} diff --git a/core/libs/prx/libSceLibreSsl3/src/Key.cpp b/core/libs/prx/libSceLibreSsl3/src/Key.cpp index d5c4b7a856..dfca8410ad 100644 --- a/core/libs/prx/libSceLibreSsl3/src/Key.cpp +++ b/core/libs/prx/libSceLibreSsl3/src/Key.cpp @@ -35,4 +35,10 @@ int APS5_VABI EC_KEY_up_ref_nid_postfix(LibreSsl3EcKey* key) { return Retain_nid_no_patch(key->references); } +int APS5_VABI RSA_up_ref_nid_postfix(LibreSsl3Rsa* rsa) { + if (!rsa) + throw std::invalid_argument("RSA_up_ref requires a key"); + return Retain_nid_no_patch(rsa->references); +} + } diff --git a/core/libs/prx/libSceLibreSsl3/src/X509VerifyParam.cpp b/core/libs/prx/libSceLibreSsl3/src/X509VerifyParam.cpp new file mode 100644 index 0000000000..b1dc4e0daf --- /dev/null +++ b/core/libs/prx/libSceLibreSsl3/src/X509VerifyParam.cpp @@ -0,0 +1,28 @@ +#include "prx/libSceLibreSsl3/libSceLibreSsl3.hpp" +#include "prx/libc/include/General.hpp" + +#include +#include +#include + +static_assert(offsetof(LibreSslX509VerifyParam, flags) == 24); + +namespace { + +constexpr std::uint64_t PolicyCheck = 0x80; +constexpr std::uint64_t PolicyVariables = 0x100 | 0x200 | 0x400; + +} + +extern "C" { + +int APS5_VABI X509_VERIFY_PARAM_set_flags_nid_postfix(LibreSslX509VerifyParam* param, std::uint64_t flags) { + if (!param) + throw std::invalid_argument("X509_VERIFY_PARAM_set_flags requires parameters"); + if ((flags & PolicyVariables) && !((param->flags | flags) & PolicyCheck)) + NotImplemented_nid_no_patch(__func__); + param->flags |= flags; + return 1; +} + +} diff --git a/core/libs/prx/libSceLibreSsl3/tests/Cipher.cpp b/core/libs/prx/libSceLibreSsl3/tests/Cipher.cpp new file mode 100644 index 0000000000..20dac414b1 --- /dev/null +++ b/core/libs/prx/libSceLibreSsl3/tests/Cipher.cpp @@ -0,0 +1,75 @@ +#include "prx/libSceLibreSsl3/libSceLibreSsl3.hpp" + +#include +#include +#include +#include +#include +#include +#include + +namespace { + +void Require(bool condition, std::source_location location = std::source_location::current()) { + if (condition) return; + std::fprintf(stderr, "LibreSSL3 EVP_CIPHER check failed at line %u\n", location.line()); + std::abort(); +} + +template void RequireInvalidArgument(TAction action, std::source_location location = std::source_location::current()) { + try { + action(); + } catch (const std::invalid_argument&) { + return; + } + Require(false, location); +} + +LibreSsl3EvpCipher Filled() { + LibreSsl3EvpCipher cipher; + std::memset(&cipher, 0xA5, sizeof(cipher)); + return cipher; +} + +LibreSsl3EvpCipher Aes256Cbc() { + LibreSsl3EvpCipher cipher {}; + cipher.nid = 427; + cipher.blockSize = 16; + cipher.keyLength = 32; + cipher.ivLength = 16; + cipher.flags = 2; + cipher.contextSize = 264; + return cipher; +} + +template void CheckField(TRead read, std::int32_t LibreSsl3EvpCipher::* field) { + for (std::int32_t value : {0, 1, 8, 12, 16, 24, 32, 64, -1, std::numeric_limits::max(), std::numeric_limits::min()}) { + LibreSsl3EvpCipher cipher = Filled(); + cipher.*field = value; + LibreSsl3EvpCipher before; + std::memcpy(&before, &cipher, sizeof(cipher)); + Require(read(&cipher) == value); + Require(std::memcmp(&before, &cipher, sizeof(cipher)) == 0); + } + RequireInvalidArgument([&] { read(nullptr); }); +} + +void TestKeyLength() { + CheckField(EVP_CIPHER_key_length_nid_postfix, &LibreSsl3EvpCipher::keyLength); + const LibreSsl3EvpCipher cipher = Aes256Cbc(); + Require(EVP_CIPHER_key_length_nid_postfix(&cipher) == 32); +} + +void TestIvLength() { + CheckField(EVP_CIPHER_iv_length_nid_postfix, &LibreSsl3EvpCipher::ivLength); + const LibreSsl3EvpCipher cipher = Aes256Cbc(); + Require(EVP_CIPHER_iv_length_nid_postfix(&cipher) == 16); +} + +} + +int main() { + TestKeyLength(); + TestIvLength(); + std::puts("LibreSSL3 EVP_CIPHER tests passed"); +} diff --git a/core/libs/prx/libSceLibreSsl3/tests/DigestContext.cpp b/core/libs/prx/libSceLibreSsl3/tests/DigestContext.cpp new file mode 100644 index 0000000000..c37586deb3 --- /dev/null +++ b/core/libs/prx/libSceLibreSsl3/tests/DigestContext.cpp @@ -0,0 +1,44 @@ +#include "prx/libSceLibreSsl3/libSceLibreSsl3.hpp" + +#include +#include +#include +#include +#include +#include + +namespace { + +void Require(bool condition, std::source_location location = std::source_location::current()) { + if (condition) return; + std::fprintf(stderr, "LibreSSL3 EVP_MD_CTX check failed at line %u\n", location.line()); + std::abort(); +} + +constexpr std::size_t ContextSize = 48; + +const void* Digest(const void* digest, unsigned char fill) { + alignas(8) std::array context; + std::memset(context.data(), fill, context.size()); + std::memcpy(context.data(), &digest, sizeof(digest)); + std::array before = context; + const void* result = EVP_MD_CTX_md_nid_postfix(context.data()); + Require(context == before); + return result; +} + +void TestDigest() { + const std::array sha256 {672, 668, 32, 0}; + const std::array sha1 {64, 65, 20, 0}; + Require(Digest(sha256.data(), 0xA5) == sha256.data()); + Require(Digest(sha1.data(), 0x00) == sha1.data()); + Require(Digest(nullptr, 0xA5) == nullptr); + Require(EVP_MD_CTX_md_nid_postfix(nullptr) == nullptr); +} + +} + +int main() { + TestDigest(); + std::puts("LibreSSL3 EVP_MD_CTX tests passed"); +} diff --git a/core/libs/prx/libSceLibreSsl3/tests/X509VerifyParam.cpp b/core/libs/prx/libSceLibreSsl3/tests/X509VerifyParam.cpp new file mode 100644 index 0000000000..e71e219e9c --- /dev/null +++ b/core/libs/prx/libSceLibreSsl3/tests/X509VerifyParam.cpp @@ -0,0 +1,86 @@ +#include "prx/libSceLibreSsl3/libSceLibreSsl3.hpp" + +#include +#include +#include +#include +#include +#include +#include + +namespace { + +void Require(bool condition, std::source_location location = std::source_location::current()) { + if (condition) return; + std::fprintf(stderr, "LibreSSL3 X509_VERIFY_PARAM check failed at line %u\n", location.line()); + std::abort(); +} + +constexpr std::uint64_t PolicyCheck = 0x80; +constexpr std::uint64_t ExplicitPolicy = 0x100; +constexpr std::uint64_t InhibitAny = 0x200; +constexpr std::uint64_t InhibitMap = 0x400; +constexpr std::uint64_t PartialChain = 0x80000; + +struct GuardedParam { + std::array before; + LibreSslX509VerifyParam param; + std::array after; +}; + +void CheckSetFlags(std::uint64_t initial, std::uint64_t flags) { + GuardedParam guarded; + std::memset(&guarded, 0x5A, sizeof(guarded)); + guarded.param.flags = initial; + GuardedParam expected; + std::memcpy(&expected, &guarded, sizeof(guarded)); + expected.param.flags = initial | flags; + Require(X509_VERIFY_PARAM_set_flags_nid_postfix(&guarded.param, flags) == 1); + Require(std::memcmp(&guarded, &expected, sizeof(guarded)) == 0); +} + +void CheckVersionDependent(std::uint64_t initial, std::uint64_t flags) { + GuardedParam guarded; + std::memset(&guarded, 0x5A, sizeof(guarded)); + guarded.param.flags = initial; + GuardedParam expected; + std::memcpy(&expected, &guarded, sizeof(guarded)); + bool thrown = false; + try { + X509_VERIFY_PARAM_set_flags_nid_postfix(&guarded.param, flags); + } catch (const std::runtime_error&) { + thrown = true; + } + Require(thrown); + Require(std::memcmp(&guarded, &expected, sizeof(guarded)) == 0); +} + +void TestSetFlags() { + CheckSetFlags(0, 0); + CheckSetFlags(0, PartialChain); + CheckSetFlags(PartialChain, PartialChain); + CheckSetFlags(0x8000, 0x4); + CheckSetFlags(~std::uint64_t {0}, 0x1); + CheckSetFlags(0x1, ~std::uint64_t {0}); + CheckSetFlags(0, PolicyCheck); + CheckSetFlags(0, PolicyCheck | ExplicitPolicy); + CheckSetFlags(PolicyCheck, ExplicitPolicy); + CheckSetFlags(PolicyCheck | PartialChain, InhibitAny | InhibitMap); + for (std::uint64_t initial : {std::uint64_t {0}, PartialChain, ExplicitPolicy}) + for (std::uint64_t flags : {ExplicitPolicy, InhibitAny, InhibitMap, ExplicitPolicy | PartialChain}) + CheckVersionDependent(initial, flags); + bool thrown = false; + try { + X509_VERIFY_PARAM_set_flags_nid_postfix(nullptr, PartialChain); + } catch (const std::invalid_argument&) { + thrown = true; + } + Require(thrown); +} + +} + +int main() { + TestSetFlags(); + std::puts("LibreSSL3 X509_VERIFY_PARAM tests passed"); +} diff --git a/core/libs/prx/libSceLoginMgrServer/Export.cpp b/core/libs/prx/libSceLoginMgrServer/Export.cpp index 075d7401a5..12e4dea8f1 100644 --- a/core/libs/prx/libSceLoginMgrServer/Export.cpp +++ b/core/libs/prx/libSceLoginMgrServer/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceLoginMgrServer/include/InventoryExports.hpp" #include "prx/libSceLoginMgrServer/include/Api.hpp" #include #include @@ -165,3 +167,32 @@ int APS5_VABI sceLoginMgrServerCheckSafetyNoticeShownForGen2Vr() { } } + +extern "C" { + +int APS5_VABI libSceLoginMgrServerUnknown_GzbYqYyRTBg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GzbYqYyRTBg", libSceLoginMgrServerUnknown_GzbYqYyRTBg_nid_no_patch); + +int APS5_VABI libSceLoginMgrServerUnknown_M1h7vFE7Hm0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("M1h7vFE7Hm0", libSceLoginMgrServerUnknown_M1h7vFE7Hm0_nid_no_patch); + +int APS5_VABI libSceLoginMgrServerUnknown_NvO5e_minus_NOkXU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NvO5e-NOkXU", libSceLoginMgrServerUnknown_NvO5e_minus_NOkXU_nid_no_patch); + +int APS5_VABI libSceLoginMgrServerUnknown_T7HQTX_minus_ylss_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("T7HQTX-ylss", libSceLoginMgrServerUnknown_T7HQTX_minus_ylss_nid_no_patch); + +int APS5_VABI libSceLoginMgrServerUnknown_uD_minus_Sde_plus_R4D8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uD-Sde+R4D8", libSceLoginMgrServerUnknown_uD_minus_Sde_plus_R4D8_nid_no_patch); + +} diff --git a/core/libs/prx/libSceLoginMgrServer/include/InventoryExports.hpp b/core/libs/prx/libSceLoginMgrServer/include/InventoryExports.hpp new file mode 100644 index 0000000000..f03ffc8ca6 --- /dev/null +++ b/core/libs/prx/libSceLoginMgrServer/include/InventoryExports.hpp @@ -0,0 +1,13 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceLoginMgrServerUnknown_GzbYqYyRTBg_nid_no_patch(); +int APS5_VABI libSceLoginMgrServerUnknown_M1h7vFE7Hm0_nid_no_patch(); +int APS5_VABI libSceLoginMgrServerUnknown_NvO5e_minus_NOkXU_nid_no_patch(); +int APS5_VABI libSceLoginMgrServerUnknown_T7HQTX_minus_ylss_nid_no_patch(); +int APS5_VABI libSceLoginMgrServerUnknown_uD_minus_Sde_plus_R4D8_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceLoginMgrServer/libSceLoginMgrServer.hpp b/core/libs/prx/libSceLoginMgrServer/libSceLoginMgrServer.hpp index 244b5b6a16..972589e59e 100644 --- a/core/libs/prx/libSceLoginMgrServer/libSceLoginMgrServer.hpp +++ b/core/libs/prx/libSceLoginMgrServer/libSceLoginMgrServer.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceLoginMgrServer/include/Api.hpp" +#include "prx/libSceLoginMgrServer/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceM4aacEnc/Export.cpp b/core/libs/prx/libSceM4aacEnc/Export.cpp index 64de066d07..f620a61a29 100644 --- a/core/libs/prx/libSceM4aacEnc/Export.cpp +++ b/core/libs/prx/libSceM4aacEnc/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceM4aacEnc/include/InventoryExports.hpp" #include "prx/libSceM4aacEnc/include/Api.hpp" #include #include @@ -92,3 +94,12 @@ int APS5_VABI sceM4aacEncTerminate() { } } + +extern "C" { + +int APS5_VABI libSceM4aacEncUnknown_dyjd6gEaAXw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dyjd6gEaAXw", libSceM4aacEncUnknown_dyjd6gEaAXw_nid_no_patch); + +} diff --git a/core/libs/prx/libSceM4aacEnc/include/InventoryExports.hpp b/core/libs/prx/libSceM4aacEnc/include/InventoryExports.hpp new file mode 100644 index 0000000000..41d35ab257 --- /dev/null +++ b/core/libs/prx/libSceM4aacEnc/include/InventoryExports.hpp @@ -0,0 +1,9 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceM4aacEncUnknown_dyjd6gEaAXw_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceM4aacEnc/libSceM4aacEnc.hpp b/core/libs/prx/libSceM4aacEnc/libSceM4aacEnc.hpp index 23842cc39b..b403325e05 100644 --- a/core/libs/prx/libSceM4aacEnc/libSceM4aacEnc.hpp +++ b/core/libs/prx/libSceM4aacEnc/libSceM4aacEnc.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceM4aacEnc/include/Api.hpp" +#include "prx/libSceM4aacEnc/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceMbus/PendingExports.cpp b/core/libs/prx/libSceMbus/PendingExports.cpp index 1b161451be..c696940b17 100644 --- a/core/libs/prx/libSceMbus/PendingExports.cpp +++ b/core/libs/prx/libSceMbus/PendingExports.cpp @@ -86,18 +86,22 @@ int APS5_VABI sceMbusCheckDriverCallback() { } int APS5_VABI sceMbusConvertToLocalDeviceId(std::uint64_t deviceId, std::uint32_t* localId, std::uint32_t* deviceClass) { - NotImplemented_nid_no_patch(__func__); + if (localId != nullptr) *localId = static_cast(deviceId); + if (deviceClass != nullptr) *deviceClass = static_cast(deviceId >> 48); return 0; } int APS5_VABI sceMbusConvertToLocalDeviceId2(std::uint64_t deviceId, std::uint32_t deviceClass, std::uint64_t* localId) { - NotImplemented_nid_no_patch(__func__); + if (deviceClass != deviceId >> 48) NotImplemented_nid_no_patch("sceMbusConvertToLocalDeviceId2: a device class other than the identifier's"); + if (localId != nullptr) *localId = deviceId & 0xFFFFFFFFFFFFull; return 0; } int APS5_VABI sceMbusConvertToMbusDeviceId(std::uint64_t localId, std::uint32_t deviceClass, std::uint64_t* deviceId) { - NotImplemented_nid_no_patch(__func__); - return 0; + constexpr auto unconvertibleClass = static_cast(0x809B0008u); + const bool convertible = deviceClass == 0x10 || deviceClass == 0x20; + if (deviceId != nullptr) *deviceId = convertible ? (static_cast(deviceClass) << 48) | localId : 0; + return convertible ? 0 : unconvertibleClass; } int APS5_VABI sceMbusDebugAcquireControl(std::uint64_t control, std::int32_t first, std::int32_t second, std::int32_t processId) { diff --git a/core/libs/prx/libSceMetadataReaderWriter/Export.cpp b/core/libs/prx/libSceMetadataReaderWriter/Export.cpp index 6cdea6e0d3..256c9a2a56 100644 --- a/core/libs/prx/libSceMetadataReaderWriter/Export.cpp +++ b/core/libs/prx/libSceMetadataReaderWriter/Export.cpp @@ -1,3 +1,6 @@ +#include "prx/libSceMetadataReaderWriter/include/LegacyExports.hpp" +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceMetadataReaderWriter/include/InventoryExports.hpp" #include "prx/libSceMetadataReaderWriter/include/Api.hpp" #include #include @@ -202,3 +205,51 @@ int APS5_VABI _ZNK23sceMetadataReaderWriter8Metadata9dumpValueEv() { } } + +extern "C" { + +int APS5_VABI libSceMetadataReaderWriterUnknown_2oFr2hbrkRs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2oFr2hbrkRs", libSceMetadataReaderWriterUnknown_2oFr2hbrkRs_nid_no_patch); + +int APS5_VABI libSceMetadataReaderWriterUnknown_ElB1bNKymPg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ElB1bNKymPg", libSceMetadataReaderWriterUnknown_ElB1bNKymPg_nid_no_patch); + +int APS5_VABI libSceMetadataReaderWriterUnknown_GCOzTsybYr0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GCOzTsybYr0", libSceMetadataReaderWriterUnknown_GCOzTsybYr0_nid_no_patch); + +int APS5_VABI libSceMetadataReaderWriterUnknown_Ly4V1dsyKCA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ly4V1dsyKCA", libSceMetadataReaderWriterUnknown_Ly4V1dsyKCA_nid_no_patch); + +int APS5_VABI libSceMetadataReaderWriterUnknown_YeIbFGmyUVM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YeIbFGmyUVM", libSceMetadataReaderWriterUnknown_YeIbFGmyUVM_nid_no_patch); + +int APS5_VABI libSceMetadataReaderWriterUnknown_ckVz4iaNj4E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ckVz4iaNj4E", libSceMetadataReaderWriterUnknown_ckVz4iaNj4E_nid_no_patch); + +} + +extern "C" { + +int APS5_VABI metadataReaderLegacyUnknown_2n7W08UL4yA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2n7W08UL4yA", metadataReaderLegacyUnknown_2n7W08UL4yA_nid_no_patch); + +int APS5_VABI metadataReaderLegacyUnknown_4SkB_plus_X3N5F0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4SkB+X3N5F0", metadataReaderLegacyUnknown_4SkB_plus_X3N5F0_nid_no_patch); + +} diff --git a/core/libs/prx/libSceMetadataReaderWriter/include/InventoryExports.hpp b/core/libs/prx/libSceMetadataReaderWriter/include/InventoryExports.hpp new file mode 100644 index 0000000000..6f81fdae02 --- /dev/null +++ b/core/libs/prx/libSceMetadataReaderWriter/include/InventoryExports.hpp @@ -0,0 +1,14 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceMetadataReaderWriterUnknown_2oFr2hbrkRs_nid_no_patch(); +int APS5_VABI libSceMetadataReaderWriterUnknown_ElB1bNKymPg_nid_no_patch(); +int APS5_VABI libSceMetadataReaderWriterUnknown_GCOzTsybYr0_nid_no_patch(); +int APS5_VABI libSceMetadataReaderWriterUnknown_Ly4V1dsyKCA_nid_no_patch(); +int APS5_VABI libSceMetadataReaderWriterUnknown_YeIbFGmyUVM_nid_no_patch(); +int APS5_VABI libSceMetadataReaderWriterUnknown_ckVz4iaNj4E_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceMetadataReaderWriter/include/LegacyExports.hpp b/core/libs/prx/libSceMetadataReaderWriter/include/LegacyExports.hpp new file mode 100644 index 0000000000..82eb3d65ab --- /dev/null +++ b/core/libs/prx/libSceMetadataReaderWriter/include/LegacyExports.hpp @@ -0,0 +1,10 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI metadataReaderLegacyUnknown_2n7W08UL4yA_nid_no_patch(); +int APS5_VABI metadataReaderLegacyUnknown_4SkB_plus_X3N5F0_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceMetadataReaderWriter/libSceMetadataReaderWriter.hpp b/core/libs/prx/libSceMetadataReaderWriter/libSceMetadataReaderWriter.hpp index 4e504bad70..cad0c1fa2b 100644 --- a/core/libs/prx/libSceMetadataReaderWriter/libSceMetadataReaderWriter.hpp +++ b/core/libs/prx/libSceMetadataReaderWriter/libSceMetadataReaderWriter.hpp @@ -1,3 +1,5 @@ #pragma once #include "prx/libSceMetadataReaderWriter/include/Api.hpp" +#include "prx/libSceMetadataReaderWriter/include/InventoryExports.hpp" +#include "prx/libSceMetadataReaderWriter/include/LegacyExports.hpp" diff --git a/core/libs/prx/libSceNKWeb/Export.cpp b/core/libs/prx/libSceNKWeb/Export.cpp index fdef9184da..a3126dd71d 100644 --- a/core/libs/prx/libSceNKWeb/Export.cpp +++ b/core/libs/prx/libSceNKWeb/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceNKWeb/include/InventoryExports.hpp" #include "prx/libSceNKWeb/include/Api.hpp" #include #include @@ -17,3 +19,22 @@ int APS5_VABI sceNKWebTerminate() { } } + +extern "C" { + +int APS5_VABI libSceNKWebUnknown_HTKKQjsQMiQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HTKKQjsQMiQ", libSceNKWebUnknown_HTKKQjsQMiQ_nid_no_patch); + +int APS5_VABI libSceNKWebUnknown_HvqTa7FlgMI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HvqTa7FlgMI", libSceNKWebUnknown_HvqTa7FlgMI_nid_no_patch); + +int APS5_VABI libSceNKWebUnknown_q_plus_Emt1gYris_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("q+Emt1gYris", libSceNKWebUnknown_q_plus_Emt1gYris_nid_no_patch); + +} diff --git a/core/libs/prx/libSceNKWeb/include/InventoryExports.hpp b/core/libs/prx/libSceNKWeb/include/InventoryExports.hpp new file mode 100644 index 0000000000..4b1e568b93 --- /dev/null +++ b/core/libs/prx/libSceNKWeb/include/InventoryExports.hpp @@ -0,0 +1,11 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceNKWebUnknown_HTKKQjsQMiQ_nid_no_patch(); +int APS5_VABI libSceNKWebUnknown_HvqTa7FlgMI_nid_no_patch(); +int APS5_VABI libSceNKWebUnknown_q_plus_Emt1gYris_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceNKWeb/libSceNKWeb.hpp b/core/libs/prx/libSceNKWeb/libSceNKWeb.hpp index d65e494889..bea71c4a5c 100644 --- a/core/libs/prx/libSceNKWeb/libSceNKWeb.hpp +++ b/core/libs/prx/libSceNKWeb/libSceNKWeb.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceNKWeb/include/Api.hpp" +#include "prx/libSceNKWeb/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceNKWebKit/CMakeLists.txt b/core/libs/prx/libSceNKWebKit/CMakeLists.txt new file mode 100644 index 0000000000..9bad4ef4d0 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/CMakeLists.txt @@ -0,0 +1,63 @@ +function(configure_quickjs_backend) + set(BUILD_SHARED_LIBS OFF) + set(QJS_ENABLE_INSTALL OFF CACHE BOOL "" FORCE) + add_subdirectory(${CMAKE_SOURCE_DIR}/3rdparty/quickjs ${CMAKE_BINARY_DIR}/3rdparty/quickjs EXCLUDE_FROM_ALL) +endfunction() +configure_quickjs_backend() +foreach(property LINK_LIBRARIES INTERFACE_LINK_LIBRARIES) + get_target_property(libraries qjs ${property}) + if(libraries) + list(REMOVE_ITEM libraries windows_seh_personalities) + set_property(TARGET qjs PROPERTY ${property} "${libraries}") + endif() +endforeach() +set_target_properties(qjs PROPERTIES POSITION_INDEPENDENT_CODE ON C_VISIBILITY_PRESET hidden) +if(MINGW OR CMAKE_SYSTEM_NAME STREQUAL "Linux") + target_link_options(qjs INTERFACE LINKER:--exclude-libs,libqjs.a) +endif() +install(FILES ${CMAKE_SOURCE_DIR}/3rdparty/quickjs/LICENSE DESTINATION licenses/quickjs) + +file(GLOB nkWebKitSources CONFIGURE_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp) +add_library(libSceNKWebKit SHARED EXCLUDE_FROM_ALL Export.cpp DateParsing.cpp CharactersToNumber.cpp ${nkWebKitSources}) +target_include_directories(libSceNKWebKit PRIVATE ${LIBS_INCLUDE_DIR}) +target_link_libraries(libSceNKWebKit PUBLIC libSceJsc PRIVATE qjs libc) +configure_windows_unwind(libSceNKWebKit) + +if(BUILD_TESTING) + add_test_executable(guest_nkwebkit_dates_tests ${LIBS_INCLUDE_DIR}/tests/GuestNKWebKitDates.cpp) + target_include_directories(guest_nkwebkit_dates_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_nkwebkit_dates_tests PRIVATE libSceNKWebKit libc) + configure_windows_unwind(guest_nkwebkit_dates_tests) + add_test(NAME guest_nkwebkit_dates COMMAND guest_nkwebkit_dates_tests) + set_tests_properties(guest_nkwebkit_dates PROPERTIES TIMEOUT 20) + if(WIN32) + set_tests_properties(guest_nkwebkit_dates PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + + add_test_executable(guest_nkwebkit_numbers_tests ${LIBS_INCLUDE_DIR}/tests/GuestNKWebKitNumbers.cpp) + target_include_directories(guest_nkwebkit_numbers_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_nkwebkit_numbers_tests PRIVATE libSceNKWebKit libc) + configure_windows_unwind(guest_nkwebkit_numbers_tests) + add_test(NAME guest_nkwebkit_numbers COMMAND guest_nkwebkit_numbers_tests) + set_tests_properties(guest_nkwebkit_numbers PROPERTIES TIMEOUT 20) + if(WIN32) + set_tests_properties(guest_nkwebkit_numbers PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + + file(GLOB nkWebKitTests CONFIGURE_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/tests/*.cpp) + foreach(testSource ${nkWebKitTests}) + get_filename_component(testName ${testSource} NAME_WE) + string(TOLOWER ${testName} testName) + add_test_executable(nkwebkit_${testName}_tests ${testSource}) + target_include_directories(nkwebkit_${testName}_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(nkwebkit_${testName}_tests PRIVATE libSceNKWebKit libSceJsc libc) + configure_windows_unwind(nkwebkit_${testName}_tests) + add_test(NAME nkwebkit_${testName} COMMAND nkwebkit_${testName}_tests) + if(WIN32) + set_tests_properties(nkwebkit_${testName} PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + endforeach() +endif() diff --git a/core/libs/prx/libSceNKWebKit/CharactersToNumber.cpp b/core/libs/prx/libSceNKWebKit/CharactersToNumber.cpp new file mode 100644 index 0000000000..ff157d6b70 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/CharactersToNumber.cpp @@ -0,0 +1,296 @@ +// Copyright 2010 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/* + * (C) 1999 Lars Knoll (knoll@kde.org) + * Copyright (C) 2004-2019 Apple Inc. All rights reserved. + * Copyright (C) 2007-2009 Torch Mobile, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ +/* Derived from Source/WTF/wtf/dtoa/double-conversion.cc and Source/WTF/wtf/text/WTFString.cpp (WebKit c55364d53f97) */ + +#include "prx/libSceNKWebKit/include/InventoryExports.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { + +constexpr std::size_t MaxSignificantDigits = 772; +constexpr std::size_t ConversionBufferSize = 64; +constexpr std::int64_t MaxExponent = std::numeric_limits::max() / 2; +constexpr std::int64_t MaxDecimalPower = 309; +constexpr std::int64_t MinDecimalPower = -324; + +template +struct ParsedNumber { + TFloat value; + std::size_t length; +}; + +template +bool IsDigit(TCharacter character) { + return character >= '0' && character <= '9'; +} + +std::int64_t CheckedExponent(std::int64_t value) { + if (value < std::numeric_limits::min() || value > std::numeric_limits::max()) throw std::overflow_error("WTF::double_conversion: the decimal exponent overflows int, which is undefined in WebKit"); + return value; +} + +template +bool IsSpace(TCharacter character) { + return character <= ' ' && (character == ' ' || (character <= 0xD && character >= 0x9)); +} + +template +TFloat Convert(std::string digits, std::int64_t exponent) { + while (!digits.empty() && digits.back() == '0') { + digits.pop_back(); + exponent = CheckedExponent(exponent + 1); + } + if (digits.empty()) return 0; + const auto count = static_cast(digits.size()); + CheckedExponent(exponent + count); + if (exponent + count - 1 >= MaxDecimalPower) return std::numeric_limits::infinity(); + if (exponent + count <= MinDecimalPower) return 0; + digits += 'e'; + digits += std::to_string(exponent); + TFloat value = 0; + const auto result = std::from_chars(digits.data(), digits.data() + digits.size(), value); + if (result.ec == std::errc::result_out_of_range) return exponent + count > 0 ? std::numeric_limits::infinity() : 0; + if (result.ec != std::errc() || result.ptr != digits.data() + digits.size()) throw std::logic_error("WTF::parseDouble: decimal conversion rejected its digits"); + return value; +} + +template +class DecimalParser { +public: + DecimalParser(const TCharacter* input, std::size_t length) : input(input), current(input), end(input + length) {} + + ParsedNumber Parse() { + if (current == end) return {0, 0}; + if (*current == '+' || *current == '-') { + negative = *current == '-'; + if (++current == end) return {0, 0}; + } + bool leadingZero = false; + if (*current == '0') { + leadingZero = true; + while (*current == '0') { + if (++current == end) return signedZero(); + } + } + while (IsDigit(*current)) { + if (digits.size() < MaxSignificantDigits) digits.push_back(static_cast(*current)); + else { + insignificantDigits = CheckedExponent(insignificantDigits + 1); + nonzeroDigitDropped = nonzeroDigitDropped || *current != '0'; + } + if (++current == end) return finish(); + } + if (*current == '.') { + if (++current == end) { + if (digits.empty() && !leadingZero) return {0, 0}; + return finish(); + } + if (digits.empty()) { + while (*current == '0') { + if (++current == end) return signedZero(); + exponent = CheckedExponent(exponent - 1); + } + } + while (IsDigit(*current)) { + if (digits.size() < MaxSignificantDigits) { + digits.push_back(static_cast(*current)); + exponent = CheckedExponent(exponent - 1); + } else nonzeroDigitDropped = nonzeroDigitDropped || *current != '0'; + if (++current == end) return finish(); + } + } + if (!leadingZero && exponent == 0 && digits.empty()) return {0, 0}; + if (*current == 'e' || *current == 'E') { + const auto* marker = current; + if (++current == end) return finishAt(marker); + bool negativeExponent = false; + if (*current == '+' || *current == '-') { + negativeExponent = *current == '-'; + if (++current == end) return finishAt(marker); + } + if (!IsDigit(*current)) return finishAt(marker); + std::int64_t number = 0; + do { + const int digit = *current - '0'; + if (number >= MaxExponent / 10 && !(number == MaxExponent / 10 && digit <= MaxExponent % 10)) number = MaxExponent; + else number = number * 10 + digit; + ++current; + } while (current != end && IsDigit(*current)); + exponent = CheckedExponent(exponent + (negativeExponent ? -number : number)); + } + return finish(); + } + +private: + ParsedNumber signedZero() const { + return {negative ? -TFloat(0) : TFloat(0), static_cast(current - input)}; + } + + ParsedNumber finishAt(const TCharacter* position) { + current = position; + return finish(); + } + + ParsedNumber finish() { + exponent = CheckedExponent(exponent + insignificantDigits); + if (nonzeroDigitDropped) { + digits.push_back('1'); + exponent = CheckedExponent(exponent - 1); + } + const TFloat converted = Convert(digits, exponent); + return {negative ? -converted : converted, static_cast(current - input)}; + } + + const TCharacter* input; + const TCharacter* current; + const TCharacter* end; + std::string digits; + std::int64_t exponent = 0; + std::int64_t insignificantDigits = 0; + bool nonzeroDigitDropped = false; + bool negative = false; +}; + +template +TFloat StringToIeee(const TCharacter* data, std::size_t length, std::size_t* processedCount) { + if (!processedCount) throw std::invalid_argument("WTF::double_conversion: a null processed length faults in WebKit"); + *processedCount = 0; + if (!data && length) throw std::invalid_argument("WTF::double_conversion: null characters with a nonzero length fault in WebKit"); + const auto parsed = DecimalParser(data, length).Parse(); + *processedCount = parsed.length; + return parsed.value; +} + +double ParseDouble(const unsigned char* data, std::size_t length, std::size_t* parsedLength) { + return StringToIeee(data, length, parsedLength); +} + +double ParseDouble(const char16_t* data, std::size_t length, std::size_t* parsedLength) { + if (length <= ConversionBufferSize) { + std::array buffer{}; + for (std::size_t index = 0; index < length; ++index) buffer[index] = data[index] < 0x80 ? static_cast(data[index]) : 0; + return ParseDouble(buffer.data(), length, parsedLength); + } + if (length > std::numeric_limits::max()) throw std::length_error("WTF::Vector: conversion buffer capacity above UINT_MAX"); + std::vector buffer(length); + for (std::size_t index = 0; index < length; ++index) buffer[index] = data[index] < 0x80 ? static_cast(data[index]) : 0; + return ParseDouble(buffer.data(), length, parsedLength); +} + +template +double ToDouble(const TCharacter* data, std::size_t length, bool allowTrailingJunk, bool* ok, std::size_t* parsedLength) { + if (!data && length) throw std::invalid_argument("WTF number parsing: null characters with a nonzero length fault in WebKit"); + std::size_t leadingSpaces = 0; + while (leadingSpaces < length && IsSpace(data[leadingSpaces])) ++leadingSpaces; + const double value = ParseDouble(data + leadingSpaces, length - leadingSpaces, parsedLength); + if (!*parsedLength) { + if (ok) *ok = false; + return 0.0; + } + *parsedLength += leadingSpaces; + if (ok) *ok = allowTrailingJunk || *parsedLength == length; + return value; +} + +} + +extern "C" { + +float APS5_VABI _ZN3WTF17charactersToFloatEPKDsmPb(const char16_t* data, std::size_t length, bool* ok) { + std::size_t parsedLength = 0; + return static_cast(ToDouble(data, length, false, ok, &parsedLength)); +} + +float APS5_VABI _ZN3WTF17charactersToFloatEPKDsmRm(const char16_t* data, std::size_t length, std::size_t* parsedLength) { + return static_cast(ToDouble(data, length, true, nullptr, parsedLength)); +} + +float APS5_VABI _ZN3WTF17charactersToFloatEPKhmPb(const unsigned char* data, std::size_t length, bool* ok) { + std::size_t parsedLength = 0; + return static_cast(ToDouble(data, length, false, ok, &parsedLength)); +} + +float APS5_VABI _ZN3WTF17charactersToFloatEPKhmRm(const unsigned char* data, std::size_t length, std::size_t* parsedLength) { + return static_cast(ToDouble(data, length, true, nullptr, parsedLength)); +} + +double APS5_VABI _ZN3WTF18charactersToDoubleEPKDsmPb(const char16_t* data, std::size_t length, bool* ok) { + std::size_t parsedLength = 0; + return ToDouble(data, length, false, ok, &parsedLength); +} + +double APS5_VABI _ZN3WTF18charactersToDoubleEPKhmPb(const unsigned char* data, std::size_t length, bool* ok) { + std::size_t parsedLength = 0; + return ToDouble(data, length, false, ok, &parsedLength); +} + +float APS5_VABI _ZN3WTF17double_conversion23StringToDoubleConverter13StringToFloatEPKcmPm(const char* buffer, std::size_t length, std::size_t* processedCharactersCount) { + return StringToIeee(buffer, length, processedCharactersCount); +} + +float APS5_VABI _ZN3WTF17double_conversion23StringToDoubleConverter13StringToFloatEPKtmPm(const std::uint16_t* buffer, std::size_t length, std::size_t* processedCharactersCount) { + return StringToIeee(buffer, length, processedCharactersCount); +} + +double APS5_VABI _ZN3WTF17double_conversion23StringToDoubleConverter14StringToDoubleEPKcmPm(const char* buffer, std::size_t length, std::size_t* processedCharactersCount) { + return StringToIeee(buffer, length, processedCharactersCount); +} + +double APS5_VABI _ZN3WTF17double_conversion23StringToDoubleConverter14StringToDoubleEPKtmPm(const std::uint16_t* buffer, std::size_t length, std::size_t* processedCharactersCount) { + return StringToIeee(buffer, length, processedCharactersCount); +} + +} diff --git a/core/libs/prx/libSceNKWebKit/DateParsing.cpp b/core/libs/prx/libSceNKWebKit/DateParsing.cpp new file mode 100644 index 0000000000..ffec2e0000 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/DateParsing.cpp @@ -0,0 +1,401 @@ +/* + * Copyright (C) 1999-2000 Harri Porten (porten@kde.org) + * Copyright (C) 2006-2019 Apple Inc. All rights reserved. + * Copyright (C) 2009 Google Inc. All rights reserved. + * Copyright (C) 2007-2009 Torch Mobile, Inc. + * Copyright (C) 2010 &yet, LLC. (nate@andyet.net) + * + * The Original Code is Mozilla Communicator client code, released + * March 31, 1998. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Alternatively, the contents of this file may be used under the terms + * of either the Mozilla Public License Version 1.1, found at + * http://www.mozilla.org/MPL/ (the "MPL") or the GNU General Public + * License Version 2.0, found at http://www.fsf.org/copyleft/gpl.html + * (the "GPL"), in which case the provisions of the MPL or the GPL are + * applicable instead of those above. If you wish to allow use of your + * version of this file only under the terms of one of those two + * licenses (the MPL or the GPL) and not to allow others to use your + * version of this file under the LGPL, indicate your decision by + * deletingthe provisions above and replace them with the notice and + * other provisions required by the MPL or the GPL, as the case may be. + * If you do not delete the provisions above, a recipient may use your + * version of this file under any of the LGPL, the MPL or the GPL. + + * Copyright 2006-2008 the V8 project authors. All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +// Derived from Source/WTF/wtf/DateMath.cpp (WebKit c55364d53f97) + +#include "prx/libSceNKWebKit/include/InventoryExports.hpp" +#include "prx/libc/include/Api.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { + +constexpr double SecondsPerMinute = 60.0; +constexpr double SecondsPerHour = SecondsPerMinute * 60.0; +constexpr double SecondsPerDay = SecondsPerHour * 24.0; +constexpr double MsPerSecond = 1000.0; +constexpr std::int64_t LongMin = std::numeric_limits::min(); +constexpr std::int64_t LongMax = std::numeric_limits::max(); +constexpr int IntMin = std::numeric_limits::min(); +constexpr int IntMax = std::numeric_limits::max(); + +constexpr int FirstDayOfMonth[2][12] = { + {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}, + {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335}, +}; + +struct KnownZone { + const char* name; + std::size_t length; + int offset; +}; + +constexpr KnownZone KnownZones[] = { + {"ut", 2, 0}, + {"gmt", 3, 0}, + {"est", 3, -300}, + {"edt", 3, -240}, + {"cst", 3, -360}, + {"cdt", 3, -300}, + {"mst", 3, -420}, + {"mdt", 3, -360}, + {"pst", 3, -480}, + {"pdt", 3, -420}, +}; + +double NaN() { + return std::numeric_limits::quiet_NaN(); +} + +bool IsSpace(char character) { + return character <= ' ' && (character == ' ' || (character <= 0xD && character >= 0x9)); +} + +bool IsDigit(char character) { + return character >= '0' && character <= '9'; +} + +char ToLower(char character) { + return static_cast(character | ((character >= 'A' && character <= 'Z') << 5)); +} + +bool StartsWithLetters(const char* string, const char* letters, std::size_t length) { + for (std::size_t i = 0; i < length; ++i) { + if (static_cast(string[i] | 0x20) != letters[i]) return false; + } + return true; +} + +bool IsLeapYear(int year) { + if (year % 4 != 0) return false; + if (year % 400 == 0) return true; + if (year % 100 == 0) return false; + return true; +} + +double DaysFrom1970ToYear(int year) { + const double yearMinusOne = year - 1; + const double yearsToAddBy4Rule = std::floor(yearMinusOne / 4.0) - 1970 / 4; + const double yearsToExcludeBy100Rule = std::floor(yearMinusOne / 100.0) - 1970 / 100; + const double yearsToAddBy400Rule = std::floor(yearMinusOne / 400.0) - 1970 / 400; + return 365.0 * (year - 1970.0) + yearsToAddBy4Rule - yearsToExcludeBy100Rule + yearsToAddBy400Rule; +} + +double YmdhmsToSeconds(int year, std::int64_t month, std::int64_t day, std::int64_t hour, std::int64_t minute, double second) { + const int monthDay = FirstDayOfMonth[IsLeapYear(year)][month - 1]; + const double yearDays = DaysFrom1970ToYear(year); + std::int64_t days = 0; + if (__builtin_add_overflow(static_cast(monthDay), day, &days) || __builtin_sub_overflow(days, std::int64_t{1}, &days)) + throw std::overflow_error("WTF date parsing: the day count overflows long, which is undefined in WebKit"); + const double dateSeconds = second + minute * SecondsPerMinute + hour * SecondsPerHour + (days + yearDays) * SecondsPerDay; + if (dateSeconds < -8640000000000.0 || dateSeconds > 8640000000000.0) return NaN(); + return dateSeconds; +} + +void SkipSpacesAndComments(const char*& string) { + int nesting = 0; + char character; + while ((character = *string)) { + if (!IsSpace(character)) { + if (character == '(') { + if (nesting == IntMax) throw std::overflow_error("WTF date parsing: the comment nesting overflows int, which is undefined in WebKit"); + ++nesting; + } else if (character == ')' && nesting > 0) { + --nesting; + } else if (nesting == 0) { + break; + } + } + ++string; + } +} + +int FindMonth(const char* monthString) { + char needle[4]; + for (int i = 0; i < 3; ++i) { + if (!*monthString) return -1; + needle[i] = ToLower(*monthString++); + } + needle[3] = '\0'; + const char* haystack = "janfebmaraprmayjunjulaugsepoctnovdec"; + const char* found = std::strstr(haystack, needle); + if (found) { + const auto position = static_cast(found - haystack); + if (position % 3 == 0) return position / 3; + } + return -1; +} + +bool ParseInt(const char* string, char** stopPosition, int* result) { + const std::int64_t value = strtol_nid_postfix(string, stopPosition, 10); + if (string == *stopPosition || value <= IntMin || value >= IntMax) return false; + *result = static_cast(value); + return true; +} + +bool ParseLong(const char* string, char** stopPosition, std::int64_t* result) { + *result = strtol_nid_postfix(string, stopPosition, 10); + return !(string == *stopPosition || *result == LongMin || *result == LongMax); +} + +void RequireArguments(const char* dateString, const bool* isLocalTime, const char* function) { + if (isLocalTime == nullptr) throw std::invalid_argument(std::string(function) + ": null isLocalTime reference faults in WebKit"); + if (dateString == nullptr) throw std::invalid_argument(std::string(function) + ": null date string faults in WebKit"); +} + +double ParseDate(const char* dateString, bool& isLocalTime) { + isLocalTime = true; + int offset = 0; + SkipSpacesAndComments(dateString); + std::int64_t month = -1; + const char* wordStart = dateString; + while (*dateString && !IsDigit(*dateString)) { + if (IsSpace(*dateString) || *dateString == '(') { + if (dateString - wordStart >= 3) month = FindMonth(wordStart); + SkipSpacesAndComments(dateString); + wordStart = dateString; + } else { + ++dateString; + } + } + if (month == -1 && wordStart != dateString) month = FindMonth(wordStart); + SkipSpacesAndComments(dateString); + if (!*dateString) return NaN(); + char* end = nullptr; + std::int64_t day; + if (!ParseLong(dateString, &end, &day)) return NaN(); + dateString = end; + if (day < 0) return NaN(); + std::optional year; + if (day > 31) { + if (*dateString != '/') return NaN(); + if (!*++dateString) return NaN(); + if (day <= IntMin || day >= IntMax) return NaN(); + year = static_cast(day); + if (!ParseLong(dateString, &end, &month)) return NaN(); + month -= 1; + dateString = end; + if (*dateString++ != '/' || !*dateString) return NaN(); + if (!ParseLong(dateString, &end, &day)) return NaN(); + dateString = end; + } else if (*dateString == '/' && month == -1) { + ++dateString; + month = day - 1; + if (!ParseLong(dateString, &end, &day)) return NaN(); + if (day < 1 || day > 31) return NaN(); + dateString = end; + if (*dateString == '/') ++dateString; + if (!*dateString) return NaN(); + } else { + if (*dateString == '-') ++dateString; + SkipSpacesAndComments(dateString); + if (*dateString == ',') ++dateString; + if (month == -1) { + month = FindMonth(dateString); + if (month == -1) return NaN(); + while (*dateString && *dateString != '-' && *dateString != ',' && !IsSpace(*dateString)) ++dateString; + if (!*dateString) return NaN(); + if (*dateString != '-' && *dateString != '/' && *dateString != ',' && !IsSpace(*dateString)) return NaN(); + ++dateString; + } + } + if (month < 0 || month > 11) return NaN(); + if (*dateString && !year) { + int result = 0; + if (!ParseInt(dateString, &end, &result)) return NaN(); + year = result; + } + std::int64_t hour = 0; + std::int64_t minute = 0; + std::int64_t second = 0; + if (!*end) { + dateString = end; + } else { + if (!(IsSpace(*end) || *end == ',')) { + if (*end != ':') return NaN(); + year.reset(); + } else { + dateString = ++end; + SkipSpacesAndComments(dateString); + } + ParseLong(dateString, &end, &hour); + if (end != dateString) { + dateString = end; + if (hour < 0 || hour > 23) return NaN(); + if (!*dateString) return NaN(); + if (*dateString++ != ':') return NaN(); + if (!ParseLong(dateString, &end, &minute)) return NaN(); + dateString = end; + if (minute < 0 || minute > 59) return NaN(); + if (*dateString && *dateString != ':' && !IsSpace(*dateString)) return NaN(); + if (*dateString == ':') { + ++dateString; + if (!ParseLong(dateString, &end, &second)) return NaN(); + dateString = end; + if (second < 0 || second > 59) return NaN(); + } + SkipSpacesAndComments(dateString); + if (StartsWithLetters(dateString, "am", 2)) { + if (hour > 12) return NaN(); + if (hour == 12) hour = 0; + dateString += 2; + SkipSpacesAndComments(dateString); + } else if (StartsWithLetters(dateString, "pm", 2)) { + if (hour > 12) return NaN(); + if (hour != 12) hour += 12; + dateString += 2; + SkipSpacesAndComments(dateString); + } + } + } + if (IsDigit(*dateString) && !year) { + int result = 0; + if (!ParseInt(dateString, &end, &result)) return NaN(); + year = result; + dateString = end; + SkipSpacesAndComments(dateString); + } + if (*dateString) { + if (StartsWithLetters(dateString, "gmt", 3) || StartsWithLetters(dateString, "utc", 3)) { + dateString += 3; + isLocalTime = false; + } + if (*dateString == '+' || *dateString == '-') { + int zone; + if (!ParseInt(dateString, &end, &zone)) return NaN(); + dateString = end; + if (zone < -9959 || zone > 9959) return NaN(); + const int sign = zone < 0 ? -1 : 1; + zone = zone < 0 ? -zone : zone; + if (*dateString != ':') { + if (zone >= 24) + offset = ((zone / 100) * 60 + (zone % 100)) * sign; + else + offset = zone * 60 * sign; + } else { + ++dateString; + int zoneMinutes; + if (!ParseInt(dateString, &end, &zoneMinutes)) return NaN(); + dateString = end; + int total = 0; + if (__builtin_add_overflow(zone * 60, zoneMinutes, &total)) + throw std::overflow_error("WTF date parsing: the time zone offset overflows int, which is undefined in WebKit"); + offset = total * sign; + } + isLocalTime = false; + } else { + for (const auto& zone : KnownZones) { + if (StartsWithLetters(dateString, zone.name, zone.length)) { + offset = zone.offset; + dateString += zone.length; + isLocalTime = false; + break; + } + } + } + } + SkipSpacesAndComments(dateString); + if (*dateString && !year) { + int result = 0; + if (!ParseInt(dateString, &end, &result)) return NaN(); + year = result; + dateString = end; + SkipSpacesAndComments(dateString); + } + if (*dateString) return NaN(); + if (year) { + int yearValue = *year; + if (yearValue >= 0 && yearValue < 100) yearValue += yearValue < 50 ? 2000 : 1900; + year = yearValue; + } else { + year = 2000; + } + const double dateSeconds = YmdhmsToSeconds(*year, month + 1, day, hour, minute, static_cast(second)) - offset * SecondsPerMinute; + return dateSeconds * MsPerSecond; +} + +} + +extern "C" { + +double APS5_VABI _ZN3WTF37parseDateFromNullTerminatedCharactersEPKcRb(const char* dateString, bool* isLocalTime) { + RequireArguments(dateString, isLocalTime, __func__); + return ParseDate(dateString, *isLocalTime); +} + +} diff --git a/core/libs/prx/libSceNKWebKit/Export.cpp b/core/libs/prx/libSceNKWebKit/Export.cpp index 20c75a6833..bcadc15ba7 100644 --- a/core/libs/prx/libSceNKWebKit/Export.cpp +++ b/core/libs/prx/libSceNKWebKit/Export.cpp @@ -8,10 +8,12077 @@ extern "C" { +int APS5_VABI WKURLRequestSetDefaultTimeoutInterval() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKErrorCopyDomain() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKErrorGetErrorCode() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKErrorCopyFailingURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKErrorCopyLocalizedDescription() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKURLRequestCopyURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKURLRequestCopyFirstPartyForCookies() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKURLRequestCopyHTTPMethod() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKURLRequestCopySettingHTTPBody() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKURLResponseCopyURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKURLResponseCopyMIMEType() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKURLResponseHTTPStatusCode() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKURLResponseCopySuggestedFilename() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKURLResponseIsAttachment() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKURLResponseGetExpectedContentLength() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKSecurityOriginCopyProtocol() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKSecurityOriginCopyHost() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKSecurityOriginGetPort() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKSecurityOriginCopyToString() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKSecurityOriginCopyDatabaseIdentifier() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKSecurityOriginCreate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKSecurityOriginCreateFromString() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKSecurityOriginCreateFromDatabaseIdentifier() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKUserContentURLPatternMatchesURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKURLRequestCreateWithWKURL() { + NotImplemented_nid_no_patch(__func__); +} + int APS5_VABI _ZN9Inspector17ScriptDebugServer23removeBreakpointActionsEm() { NotImplemented_nid_no_patch(__func__); } +int APS5_VABI libSceNKWebKitLegacyUnknown__plus__plus_v_plus_KlCLFK8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("++v+KlCLFK8", libSceNKWebKitLegacyUnknown__plus__plus_v_plus_KlCLFK8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__plus_3x15QTFgbE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+3x15QTFgbE", libSceNKWebKitLegacyUnknown__plus_3x15QTFgbE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__plus_GswMYdofqU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+GswMYdofqU", libSceNKWebKitLegacyUnknown__plus_GswMYdofqU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__plus_ql0c7n6O7g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+ql0c7n6O7g", libSceNKWebKitLegacyUnknown__plus_ql0c7n6O7g_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__plus_vYbN13ER6E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+vYbN13ER6E", libSceNKWebKitLegacyUnknown__plus_vYbN13ER6E_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__plus_yQL0OwuFF0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+yQL0OwuFF0", libSceNKWebKitLegacyUnknown__plus_yQL0OwuFF0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__plus_ywmZyVOmck_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+ywmZyVOmck", libSceNKWebKitLegacyUnknown__plus_ywmZyVOmck_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__plus_z6_minus_FwD_plus_tTk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+z6-FwD+tTk", libSceNKWebKitLegacyUnknown__plus_z6_minus_FwD_plus_tTk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__plus_zB9xXLFJgU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+zB9xXLFJgU", libSceNKWebKitLegacyUnknown__plus_zB9xXLFJgU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_0sh4cUML6A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-0sh4cUML6A", libSceNKWebKitLegacyUnknown__minus_0sh4cUML6A_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_11_plus_UlGuM2c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-11+UlGuM2c", libSceNKWebKitLegacyUnknown__minus_11_plus_UlGuM2c_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_1m9ME90DBs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-1m9ME90DBs", libSceNKWebKitLegacyUnknown__minus_1m9ME90DBs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_5bKeSMgJmo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-5bKeSMgJmo", libSceNKWebKitLegacyUnknown__minus_5bKeSMgJmo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_6ZCz5jKYD0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-6ZCz5jKYD0", libSceNKWebKitLegacyUnknown__minus_6ZCz5jKYD0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_6fHtBCBprM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-6fHtBCBprM", libSceNKWebKitLegacyUnknown__minus_6fHtBCBprM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_CsJzdsf8W8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-CsJzdsf8W8", libSceNKWebKitLegacyUnknown__minus_CsJzdsf8W8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_DHemZ_plus_GUvg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-DHemZ+GUvg", libSceNKWebKitLegacyUnknown__minus_DHemZ_plus_GUvg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_Gl_minus_h_plus_vKl14_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-Gl-h+vKl14", libSceNKWebKitLegacyUnknown__minus_Gl_minus_h_plus_vKl14_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_HXv2nr0jQY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-HXv2nr0jQY", libSceNKWebKitLegacyUnknown__minus_HXv2nr0jQY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_KAFm9ogxVU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-KAFm9ogxVU", libSceNKWebKitLegacyUnknown__minus_KAFm9ogxVU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_KN6FGZnxzs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-KN6FGZnxzs", libSceNKWebKitLegacyUnknown__minus_KN6FGZnxzs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_MlTHMZSyok_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-MlTHMZSyok", libSceNKWebKitLegacyUnknown__minus_MlTHMZSyok_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_P2S5xXIrJA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-P2S5xXIrJA", libSceNKWebKitLegacyUnknown__minus_P2S5xXIrJA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_PMWKYwBckw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-PMWKYwBckw", libSceNKWebKitLegacyUnknown__minus_PMWKYwBckw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_Sfv5wYgPII_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-Sfv5wYgPII", libSceNKWebKitLegacyUnknown__minus_Sfv5wYgPII_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_ULswyDImAE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-ULswyDImAE", libSceNKWebKitLegacyUnknown__minus_ULswyDImAE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_VR6wClvMLE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-VR6wClvMLE", libSceNKWebKitLegacyUnknown__minus_VR6wClvMLE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_VuMy2HRhOk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-VuMy2HRhOk", libSceNKWebKitLegacyUnknown__minus_VuMy2HRhOk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_ZgVWWKVFxM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-ZgVWWKVFxM", libSceNKWebKitLegacyUnknown__minus_ZgVWWKVFxM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_aFZ7KgGnP0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-aFZ7KgGnP0", libSceNKWebKitLegacyUnknown__minus_aFZ7KgGnP0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_bAOp4w2_plus_xU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-bAOp4w2+xU", libSceNKWebKitLegacyUnknown__minus_bAOp4w2_plus_xU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_bw_minus_RAJILdQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-bw-RAJILdQ", libSceNKWebKitLegacyUnknown__minus_bw_minus_RAJILdQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_byOlo6AGuE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-byOlo6AGuE", libSceNKWebKitLegacyUnknown__minus_byOlo6AGuE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_cLkFY3gJ_minus_U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-cLkFY3gJ-U", libSceNKWebKitLegacyUnknown__minus_cLkFY3gJ_minus_U_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_cSBibV9kcg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-cSBibV9kcg", libSceNKWebKitLegacyUnknown__minus_cSBibV9kcg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_cSnNI8Oe74_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-cSnNI8Oe74", libSceNKWebKitLegacyUnknown__minus_cSnNI8Oe74_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_cn9shohjwo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-cn9shohjwo", libSceNKWebKitLegacyUnknown__minus_cn9shohjwo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_dpBUekyxiY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-dpBUekyxiY", libSceNKWebKitLegacyUnknown__minus_dpBUekyxiY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_gm8FTrfR3g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-gm8FTrfR3g", libSceNKWebKitLegacyUnknown__minus_gm8FTrfR3g_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_mU5FIJnEQw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-mU5FIJnEQw", libSceNKWebKitLegacyUnknown__minus_mU5FIJnEQw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_pnxCYYTHdA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-pnxCYYTHdA", libSceNKWebKitLegacyUnknown__minus_pnxCYYTHdA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_r0HgIg9s9o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-r0HgIg9s9o", libSceNKWebKitLegacyUnknown__minus_r0HgIg9s9o_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_rvO2El6asc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-rvO2El6asc", libSceNKWebKitLegacyUnknown__minus_rvO2El6asc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_t_plus_qNlMCAQU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-t+qNlMCAQU", libSceNKWebKitLegacyUnknown__minus_t_plus_qNlMCAQU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_tMIMzDv13g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-tMIMzDv13g", libSceNKWebKitLegacyUnknown__minus_tMIMzDv13g_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_tpoeCMP1oE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-tpoeCMP1oE", libSceNKWebKitLegacyUnknown__minus_tpoeCMP1oE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_uGg2VIywqc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-uGg2VIywqc", libSceNKWebKitLegacyUnknown__minus_uGg2VIywqc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_uyhX_plus_nfLTw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-uyhX+nfLTw", libSceNKWebKitLegacyUnknown__minus_uyhX_plus_nfLTw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_zBw8551Q0Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-zBw8551Q0Q", libSceNKWebKitLegacyUnknown__minus_zBw8551Q0Q_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_0_minus_ZdVDOV_plus_Yc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0-ZdVDOV+Yc", libSceNKWebKitLegacyUnknown_0_minus_ZdVDOV_plus_Yc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_01GvW40Rco8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("01GvW40Rco8", libSceNKWebKitLegacyUnknown_01GvW40Rco8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_01ujcXr_minus_BT8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("01ujcXr-BT8", libSceNKWebKitLegacyUnknown_01ujcXr_minus_BT8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_031dJi8CRG4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("031dJi8CRG4", libSceNKWebKitLegacyUnknown_031dJi8CRG4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_05ISb1sxzE4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("05ISb1sxzE4", libSceNKWebKitLegacyUnknown_05ISb1sxzE4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_08YRbeTpcSk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("08YRbeTpcSk", libSceNKWebKitLegacyUnknown_08YRbeTpcSk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_08u5HmSZLWI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("08u5HmSZLWI", libSceNKWebKitLegacyUnknown_08u5HmSZLWI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_09XYbBK4zOk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("09XYbBK4zOk", libSceNKWebKitLegacyUnknown_09XYbBK4zOk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_0AVQjKBoUZQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0AVQjKBoUZQ", libSceNKWebKitLegacyUnknown_0AVQjKBoUZQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_0Asl1MoAb7Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0Asl1MoAb7Y", libSceNKWebKitLegacyUnknown_0Asl1MoAb7Y_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_0C2wShXZc8Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0C2wShXZc8Q", libSceNKWebKitLegacyUnknown_0C2wShXZc8Q_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_0CXUHdlOyB0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0CXUHdlOyB0", libSceNKWebKitLegacyUnknown_0CXUHdlOyB0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_0D2KyH6te08_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0D2KyH6te08", libSceNKWebKitLegacyUnknown_0D2KyH6te08_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_0FfP3qcsmAw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0FfP3qcsmAw", libSceNKWebKitLegacyUnknown_0FfP3qcsmAw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_0GGFzi4CsQg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0GGFzi4CsQg", libSceNKWebKitLegacyUnknown_0GGFzi4CsQg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_0H810BYRZk0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0H810BYRZk0", libSceNKWebKitLegacyUnknown_0H810BYRZk0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_0HG6ycBGyNs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0HG6ycBGyNs", libSceNKWebKitLegacyUnknown_0HG6ycBGyNs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_0JxNOxFh7mU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0JxNOxFh7mU", libSceNKWebKitLegacyUnknown_0JxNOxFh7mU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_0M5xxtd3KVs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0M5xxtd3KVs", libSceNKWebKitLegacyUnknown_0M5xxtd3KVs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_0Nda0t_minus_A_plus_8A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0Nda0t-A+8A", libSceNKWebKitLegacyUnknown_0Nda0t_minus_A_plus_8A_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_0PGKqY9wbgg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0PGKqY9wbgg", libSceNKWebKitLegacyUnknown_0PGKqY9wbgg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_0Pcj1zY3QX0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0Pcj1zY3QX0", libSceNKWebKitLegacyUnknown_0Pcj1zY3QX0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_0Vm5ZtZD8Zw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0Vm5ZtZD8Zw", libSceNKWebKitLegacyUnknown_0Vm5ZtZD8Zw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_0W5pY_plus_f2e8M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0W5pY+f2e8M", libSceNKWebKitLegacyUnknown_0W5pY_plus_f2e8M_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_0ZS1wR9V5NA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0ZS1wR9V5NA", libSceNKWebKitLegacyUnknown_0ZS1wR9V5NA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_0ae0oDSPoAg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0ae0oDSPoAg", libSceNKWebKitLegacyUnknown_0ae0oDSPoAg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_0bKu3ZjjnMY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0bKu3ZjjnMY", libSceNKWebKitLegacyUnknown_0bKu3ZjjnMY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_0bkH4IQFtTc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0bkH4IQFtTc", libSceNKWebKitLegacyUnknown_0bkH4IQFtTc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_0hC6Uj6W6wU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0hC6Uj6W6wU", libSceNKWebKitLegacyUnknown_0hC6Uj6W6wU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_0j_plus_UOubWqvU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0j+UOubWqvU", libSceNKWebKitLegacyUnknown_0j_plus_UOubWqvU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_0k9yhLp_plus_cHE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0k9yhLp+cHE", libSceNKWebKitLegacyUnknown_0k9yhLp_plus_cHE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_0krKV0DRrAk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0krKV0DRrAk", libSceNKWebKitLegacyUnknown_0krKV0DRrAk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_0lDFiUba_minus_Qc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0lDFiUba-Qc", libSceNKWebKitLegacyUnknown_0lDFiUba_minus_Qc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_0lgq0Nb5PZg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0lgq0Nb5PZg", libSceNKWebKitLegacyUnknown_0lgq0Nb5PZg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_0mgFAAcQ5oc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0mgFAAcQ5oc", libSceNKWebKitLegacyUnknown_0mgFAAcQ5oc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_0mhooUPTcOI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0mhooUPTcOI", libSceNKWebKitLegacyUnknown_0mhooUPTcOI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_0oR2Is0DWTQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0oR2Is0DWTQ", libSceNKWebKitLegacyUnknown_0oR2Is0DWTQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_0qPkXg6hR0M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0qPkXg6hR0M", libSceNKWebKitLegacyUnknown_0qPkXg6hR0M_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_0twFo_plus_SpZ8M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0twFo+SpZ8M", libSceNKWebKitLegacyUnknown_0twFo_plus_SpZ8M_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_0w6LRl9ZOGc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0w6LRl9ZOGc", libSceNKWebKitLegacyUnknown_0w6LRl9ZOGc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_10sQaMQxi70_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("10sQaMQxi70", libSceNKWebKitLegacyUnknown_10sQaMQxi70_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_14Zfc72Ykbc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("14Zfc72Ykbc", libSceNKWebKitLegacyUnknown_14Zfc72Ykbc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_14pK67tlLag_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("14pK67tlLag", libSceNKWebKitLegacyUnknown_14pK67tlLag_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_15TtZHNz4Zg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("15TtZHNz4Zg", libSceNKWebKitLegacyUnknown_15TtZHNz4Zg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_195DFuuHr6U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("195DFuuHr6U", libSceNKWebKitLegacyUnknown_195DFuuHr6U_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_1M8YTpO_minus_JyM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1M8YTpO-JyM", libSceNKWebKitLegacyUnknown_1M8YTpO_minus_JyM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_1P8wwHM7De8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1P8wwHM7De8", libSceNKWebKitLegacyUnknown_1P8wwHM7De8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_1QPJreBoNXY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1QPJreBoNXY", libSceNKWebKitLegacyUnknown_1QPJreBoNXY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_1QYet5c7akM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1QYet5c7akM", libSceNKWebKitLegacyUnknown_1QYet5c7akM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_1Wij5bpNZbk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1Wij5bpNZbk", libSceNKWebKitLegacyUnknown_1Wij5bpNZbk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_1a5hFKC5SdU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1a5hFKC5SdU", libSceNKWebKitLegacyUnknown_1a5hFKC5SdU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_1bCfZiqfPT4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1bCfZiqfPT4", libSceNKWebKitLegacyUnknown_1bCfZiqfPT4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_1cBDX0UvFXE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1cBDX0UvFXE", libSceNKWebKitLegacyUnknown_1cBDX0UvFXE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_1cqAxUdM5E4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1cqAxUdM5E4", libSceNKWebKitLegacyUnknown_1cqAxUdM5E4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_1g2ot19eUEk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1g2ot19eUEk", libSceNKWebKitLegacyUnknown_1g2ot19eUEk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_1hNKARbz3I4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1hNKARbz3I4", libSceNKWebKitLegacyUnknown_1hNKARbz3I4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_1hPemFIVUys_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1hPemFIVUys", libSceNKWebKitLegacyUnknown_1hPemFIVUys_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_1kkTnF6SNog_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1kkTnF6SNog", libSceNKWebKitLegacyUnknown_1kkTnF6SNog_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_1lC32Kty_plus_84_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1lC32Kty+84", libSceNKWebKitLegacyUnknown_1lC32Kty_plus_84_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_1nQ_plus_8zpQbns_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1nQ+8zpQbns", libSceNKWebKitLegacyUnknown_1nQ_plus_8zpQbns_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_1sqJ_plus_5rsEzs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1sqJ+5rsEzs", libSceNKWebKitLegacyUnknown_1sqJ_plus_5rsEzs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_1w_plus_iLcjzd10_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1w+iLcjzd10", libSceNKWebKitLegacyUnknown_1w_plus_iLcjzd10_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_1wgLUOSOs9Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1wgLUOSOs9Q", libSceNKWebKitLegacyUnknown_1wgLUOSOs9Q_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_2_plus_uRH9hvLWM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2+uRH9hvLWM", libSceNKWebKitLegacyUnknown_2_plus_uRH9hvLWM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_2_minus_E7zx_plus_MSTE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2-E7zx+MSTE", libSceNKWebKitLegacyUnknown_2_minus_E7zx_plus_MSTE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_2_minus_Htz3Rhqy4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2-Htz3Rhqy4", libSceNKWebKitLegacyUnknown_2_minus_Htz3Rhqy4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_20fktvybHIM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("20fktvybHIM", libSceNKWebKitLegacyUnknown_20fktvybHIM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_21MSzOuqZi0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("21MSzOuqZi0", libSceNKWebKitLegacyUnknown_21MSzOuqZi0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_22GfJEfmVVM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("22GfJEfmVVM", libSceNKWebKitLegacyUnknown_22GfJEfmVVM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_22ngKDr3G28_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("22ngKDr3G28", libSceNKWebKitLegacyUnknown_22ngKDr3G28_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_23jQPF1C6aE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("23jQPF1C6aE", libSceNKWebKitLegacyUnknown_23jQPF1C6aE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_27E4o5mMxTs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("27E4o5mMxTs", libSceNKWebKitLegacyUnknown_27E4o5mMxTs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_2BlJ_minus_QwxMRo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2BlJ-QwxMRo", libSceNKWebKitLegacyUnknown_2BlJ_minus_QwxMRo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_2D9yfogw5bs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2D9yfogw5bs", libSceNKWebKitLegacyUnknown_2D9yfogw5bs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_2DDULE_minus_MYmQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2DDULE-MYmQ", libSceNKWebKitLegacyUnknown_2DDULE_minus_MYmQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_2EVvhVabsJM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2EVvhVabsJM", libSceNKWebKitLegacyUnknown_2EVvhVabsJM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_2GdBuLgUeSI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2GdBuLgUeSI", libSceNKWebKitLegacyUnknown_2GdBuLgUeSI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_2LKVAt2Daw8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2LKVAt2Daw8", libSceNKWebKitLegacyUnknown_2LKVAt2Daw8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_2M0ZLmwaVd8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2M0ZLmwaVd8", libSceNKWebKitLegacyUnknown_2M0ZLmwaVd8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_2NThFFu5XdE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2NThFFu5XdE", libSceNKWebKitLegacyUnknown_2NThFFu5XdE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_2PX8AY1a0Eo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2PX8AY1a0Eo", libSceNKWebKitLegacyUnknown_2PX8AY1a0Eo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_2QhFHIOZPNM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2QhFHIOZPNM", libSceNKWebKitLegacyUnknown_2QhFHIOZPNM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_2R7sNgYqmi0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2R7sNgYqmi0", libSceNKWebKitLegacyUnknown_2R7sNgYqmi0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_2SYvas_minus_fF18_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2SYvas-fF18", libSceNKWebKitLegacyUnknown_2SYvas_minus_fF18_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_2U8P_plus_6Bcrd4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2U8P+6Bcrd4", libSceNKWebKitLegacyUnknown_2U8P_plus_6Bcrd4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_2WqXdvWNwdY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2WqXdvWNwdY", libSceNKWebKitLegacyUnknown_2WqXdvWNwdY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_2YS0DtL8qSc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2YS0DtL8qSc", libSceNKWebKitLegacyUnknown_2YS0DtL8qSc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_2Yc8JPHyUSY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2Yc8JPHyUSY", libSceNKWebKitLegacyUnknown_2Yc8JPHyUSY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_2aBO17Mqrpw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2aBO17Mqrpw", libSceNKWebKitLegacyUnknown_2aBO17Mqrpw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_2awYqsMSHr0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2awYqsMSHr0", libSceNKWebKitLegacyUnknown_2awYqsMSHr0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_2bOKQcArI2k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2bOKQcArI2k", libSceNKWebKitLegacyUnknown_2bOKQcArI2k_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_2d1tYzrlpS8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2d1tYzrlpS8", libSceNKWebKitLegacyUnknown_2d1tYzrlpS8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_2dbm0DhmsPc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2dbm0DhmsPc", libSceNKWebKitLegacyUnknown_2dbm0DhmsPc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_2dnaEy8W7Q0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2dnaEy8W7Q0", libSceNKWebKitLegacyUnknown_2dnaEy8W7Q0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_2hEyEaCxl8A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2hEyEaCxl8A", libSceNKWebKitLegacyUnknown_2hEyEaCxl8A_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_2hoav7M2FjY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2hoav7M2FjY", libSceNKWebKitLegacyUnknown_2hoav7M2FjY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_2jdQQaVWuAw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2jdQQaVWuAw", libSceNKWebKitLegacyUnknown_2jdQQaVWuAw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_2kDZb3V0F5g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2kDZb3V0F5g", libSceNKWebKitLegacyUnknown_2kDZb3V0F5g_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_2m3K29qJSuM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2m3K29qJSuM", libSceNKWebKitLegacyUnknown_2m3K29qJSuM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_2mrmvVrTd_minus_w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2mrmvVrTd-w", libSceNKWebKitLegacyUnknown_2mrmvVrTd_minus_w_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_2oCktOzZ86s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2oCktOzZ86s", libSceNKWebKitLegacyUnknown_2oCktOzZ86s_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_2vSWgtyiSPg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2vSWgtyiSPg", libSceNKWebKitLegacyUnknown_2vSWgtyiSPg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_2x24iCBAFo4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2x24iCBAFo4", libSceNKWebKitLegacyUnknown_2x24iCBAFo4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_2xwKcxPCnpA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2xwKcxPCnpA", libSceNKWebKitLegacyUnknown_2xwKcxPCnpA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_3_plus_XgrwoE_plus_KQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3+XgrwoE+KQ", libSceNKWebKitLegacyUnknown_3_plus_XgrwoE_plus_KQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_3_minus_NJmGjTdGU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3-NJmGjTdGU", libSceNKWebKitLegacyUnknown_3_minus_NJmGjTdGU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_30O8gNuBEx8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("30O8gNuBEx8", libSceNKWebKitLegacyUnknown_30O8gNuBEx8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_34Ri_minus_I2zseI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("34Ri-I2zseI", libSceNKWebKitLegacyUnknown_34Ri_minus_I2zseI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_36GRau6llzM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("36GRau6llzM", libSceNKWebKitLegacyUnknown_36GRau6llzM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_38zYSKmTGIc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("38zYSKmTGIc", libSceNKWebKitLegacyUnknown_38zYSKmTGIc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_39_minus_glXtDPsE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("39-glXtDPsE", libSceNKWebKitLegacyUnknown_39_minus_glXtDPsE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_3AFe2ppI85A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3AFe2ppI85A", libSceNKWebKitLegacyUnknown_3AFe2ppI85A_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_3AsGIs7lx2w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3AsGIs7lx2w", libSceNKWebKitLegacyUnknown_3AsGIs7lx2w_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_3BNqOa83GtA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3BNqOa83GtA", libSceNKWebKitLegacyUnknown_3BNqOa83GtA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_3Dq2mSdXqgE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3Dq2mSdXqgE", libSceNKWebKitLegacyUnknown_3Dq2mSdXqgE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_3FiKO2eDhvU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3FiKO2eDhvU", libSceNKWebKitLegacyUnknown_3FiKO2eDhvU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_3H2suBucSJI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3H2suBucSJI", libSceNKWebKitLegacyUnknown_3H2suBucSJI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_3JhQ4Bntk_plus_o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3JhQ4Bntk+o", libSceNKWebKitLegacyUnknown_3JhQ4Bntk_plus_o_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_3KCaG4gsj7k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3KCaG4gsj7k", libSceNKWebKitLegacyUnknown_3KCaG4gsj7k_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_3LK6wLO8kxY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3LK6wLO8kxY", libSceNKWebKitLegacyUnknown_3LK6wLO8kxY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_3MUAm69291I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3MUAm69291I", libSceNKWebKitLegacyUnknown_3MUAm69291I_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_3QDJXWo8JlM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3QDJXWo8JlM", libSceNKWebKitLegacyUnknown_3QDJXWo8JlM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_3WhL7xY5dHM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3WhL7xY5dHM", libSceNKWebKitLegacyUnknown_3WhL7xY5dHM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_3XR2IhSEjfM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3XR2IhSEjfM", libSceNKWebKitLegacyUnknown_3XR2IhSEjfM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_3YC2LF72_minus_f4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3YC2LF72-f4", libSceNKWebKitLegacyUnknown_3YC2LF72_minus_f4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_3cu_plus_NjdfhSU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3cu+NjdfhSU", libSceNKWebKitLegacyUnknown_3cu_plus_NjdfhSU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_3jEYk0EGAyY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3jEYk0EGAyY", libSceNKWebKitLegacyUnknown_3jEYk0EGAyY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_3ktOaECB77A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3ktOaECB77A", libSceNKWebKitLegacyUnknown_3ktOaECB77A_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_3lXEdk0z8pE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3lXEdk0z8pE", libSceNKWebKitLegacyUnknown_3lXEdk0z8pE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_3lXfROkmZXg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3lXfROkmZXg", libSceNKWebKitLegacyUnknown_3lXfROkmZXg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_3mzq2F6BGBE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3mzq2F6BGBE", libSceNKWebKitLegacyUnknown_3mzq2F6BGBE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_3qTwQ5MjCiU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3qTwQ5MjCiU", libSceNKWebKitLegacyUnknown_3qTwQ5MjCiU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_3qxE14ptOEo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3qxE14ptOEo", libSceNKWebKitLegacyUnknown_3qxE14ptOEo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_3vsGWl6l7LY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3vsGWl6l7LY", libSceNKWebKitLegacyUnknown_3vsGWl6l7LY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_3wiEzJG_plus_o5A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3wiEzJG+o5A", libSceNKWebKitLegacyUnknown_3wiEzJG_plus_o5A_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_3wxAGOWA5rw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3wxAGOWA5rw", libSceNKWebKitLegacyUnknown_3wxAGOWA5rw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_3yRgYSwNWAE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3yRgYSwNWAE", libSceNKWebKitLegacyUnknown_3yRgYSwNWAE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4_plus_xG8NftNiY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4+xG8NftNiY", libSceNKWebKitLegacyUnknown_4_plus_xG8NftNiY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4_minus_WCEZyXPog_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4-WCEZyXPog", libSceNKWebKitLegacyUnknown_4_minus_WCEZyXPog_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_40_plus_6pS1CK6w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("40+6pS1CK6w", libSceNKWebKitLegacyUnknown_40_plus_6pS1CK6w_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_408v7lhN4QU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("408v7lhN4QU", libSceNKWebKitLegacyUnknown_408v7lhN4QU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_42u6gUWvUTg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("42u6gUWvUTg", libSceNKWebKitLegacyUnknown_42u6gUWvUTg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_44vO54zyfwM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("44vO54zyfwM", libSceNKWebKitLegacyUnknown_44vO54zyfwM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_45XFIt8UG6k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("45XFIt8UG6k", libSceNKWebKitLegacyUnknown_45XFIt8UG6k_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_45z6WoZYP_minus_A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("45z6WoZYP-A", libSceNKWebKitLegacyUnknown_45z6WoZYP_minus_A_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_47lUe3tPqY0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("47lUe3tPqY0", libSceNKWebKitLegacyUnknown_47lUe3tPqY0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_48xOTJNKul0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("48xOTJNKul0", libSceNKWebKitLegacyUnknown_48xOTJNKul0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4A_minus_G9UeZp5k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4A-G9UeZp5k", libSceNKWebKitLegacyUnknown_4A_minus_G9UeZp5k_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4AzDMjaSMI4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4AzDMjaSMI4", libSceNKWebKitLegacyUnknown_4AzDMjaSMI4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4Bvq8TB95oA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4Bvq8TB95oA", libSceNKWebKitLegacyUnknown_4Bvq8TB95oA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4DEzfatKlS0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4DEzfatKlS0", libSceNKWebKitLegacyUnknown_4DEzfatKlS0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4DYQZqufDdI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4DYQZqufDdI", libSceNKWebKitLegacyUnknown_4DYQZqufDdI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4EzrAohwbaI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4EzrAohwbaI", libSceNKWebKitLegacyUnknown_4EzrAohwbaI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4GlEjaWWXdo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4GlEjaWWXdo", libSceNKWebKitLegacyUnknown_4GlEjaWWXdo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4MLq_plus_nXcg1A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4MLq+nXcg1A", libSceNKWebKitLegacyUnknown_4MLq_plus_nXcg1A_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4N5OJ0irX88_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4N5OJ0irX88", libSceNKWebKitLegacyUnknown_4N5OJ0irX88_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4OP5qoYLgE0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4OP5qoYLgE0", libSceNKWebKitLegacyUnknown_4OP5qoYLgE0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4R5DWBzSrag_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4R5DWBzSrag", libSceNKWebKitLegacyUnknown_4R5DWBzSrag_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4TS7CSj8s00_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4TS7CSj8s00", libSceNKWebKitLegacyUnknown_4TS7CSj8s00_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4U9CKqxDyK8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4U9CKqxDyK8", libSceNKWebKitLegacyUnknown_4U9CKqxDyK8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4UFYk_minus_Rr_plus_EM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4UFYk-Rr+EM", libSceNKWebKitLegacyUnknown_4UFYk_minus_Rr_plus_EM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4WYxZvXzQow_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4WYxZvXzQow", libSceNKWebKitLegacyUnknown_4WYxZvXzQow_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4XS2Wv8dC5Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4XS2Wv8dC5Q", libSceNKWebKitLegacyUnknown_4XS2Wv8dC5Q_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4Y0OZ9CebmM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4Y0OZ9CebmM", libSceNKWebKitLegacyUnknown_4Y0OZ9CebmM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4bOt65l9CT8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4bOt65l9CT8", libSceNKWebKitLegacyUnknown_4bOt65l9CT8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4ejzo1EOtPM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4ejzo1EOtPM", libSceNKWebKitLegacyUnknown_4ejzo1EOtPM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4fymWXPdseo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4fymWXPdseo", libSceNKWebKitLegacyUnknown_4fymWXPdseo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4gDriHUPM_plus_k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4gDriHUPM+k", libSceNKWebKitLegacyUnknown_4gDriHUPM_plus_k_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4hPLek5k2kQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4hPLek5k2kQ", libSceNKWebKitLegacyUnknown_4hPLek5k2kQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4kECg3pDbnI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4kECg3pDbnI", libSceNKWebKitLegacyUnknown_4kECg3pDbnI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4kJcQKeuIOg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4kJcQKeuIOg", libSceNKWebKitLegacyUnknown_4kJcQKeuIOg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4kKYBQ3b5HQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4kKYBQ3b5HQ", libSceNKWebKitLegacyUnknown_4kKYBQ3b5HQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4liiepBP0Ac_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4liiepBP0Ac", libSceNKWebKitLegacyUnknown_4liiepBP0Ac_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4mtpkZh7myg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4mtpkZh7myg", libSceNKWebKitLegacyUnknown_4mtpkZh7myg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4n5s0cpDf9w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4n5s0cpDf9w", libSceNKWebKitLegacyUnknown_4n5s0cpDf9w_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4oRem_minus_AuOiA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4oRem-AuOiA", libSceNKWebKitLegacyUnknown_4oRem_minus_AuOiA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4r_minus_B36POyF0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4r-B36POyF0", libSceNKWebKitLegacyUnknown_4r_minus_B36POyF0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4rK4KSfYuW4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4rK4KSfYuW4", libSceNKWebKitLegacyUnknown_4rK4KSfYuW4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4t8oDmpFfGw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4t8oDmpFfGw", libSceNKWebKitLegacyUnknown_4t8oDmpFfGw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4v4AzFlXiQM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4v4AzFlXiQM", libSceNKWebKitLegacyUnknown_4v4AzFlXiQM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4x9f9f50VxA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4x9f9f50VxA", libSceNKWebKitLegacyUnknown_4x9f9f50VxA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4xLuLt_minus_6LXI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4xLuLt-6LXI", libSceNKWebKitLegacyUnknown_4xLuLt_minus_6LXI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4yTdU9Hg_minus_Rw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4yTdU9Hg-Rw", libSceNKWebKitLegacyUnknown_4yTdU9Hg_minus_Rw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_4zjydcbDOv4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4zjydcbDOv4", libSceNKWebKitLegacyUnknown_4zjydcbDOv4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_53XsM4QkTfc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("53XsM4QkTfc", libSceNKWebKitLegacyUnknown_53XsM4QkTfc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_55PWVPMKRBQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("55PWVPMKRBQ", libSceNKWebKitLegacyUnknown_55PWVPMKRBQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_564_minus_xfiutdc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("564-xfiutdc", libSceNKWebKitLegacyUnknown_564_minus_xfiutdc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_58xOuBct8co_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("58xOuBct8co", libSceNKWebKitLegacyUnknown_58xOuBct8co_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_59Je3FKsDu4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("59Je3FKsDu4", libSceNKWebKitLegacyUnknown_59Je3FKsDu4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_5BGpQ4IRBHA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5BGpQ4IRBHA", libSceNKWebKitLegacyUnknown_5BGpQ4IRBHA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_5BQsDP_minus_Id8g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5BQsDP-Id8g", libSceNKWebKitLegacyUnknown_5BQsDP_minus_Id8g_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_5ESzBPcRI7U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5ESzBPcRI7U", libSceNKWebKitLegacyUnknown_5ESzBPcRI7U_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_5EU0WjubeF0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5EU0WjubeF0", libSceNKWebKitLegacyUnknown_5EU0WjubeF0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_5F9VIeQgPyU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5F9VIeQgPyU", libSceNKWebKitLegacyUnknown_5F9VIeQgPyU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_5GU52ZPB07s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5GU52ZPB07s", libSceNKWebKitLegacyUnknown_5GU52ZPB07s_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_5K0NVMGxk7E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5K0NVMGxk7E", libSceNKWebKitLegacyUnknown_5K0NVMGxk7E_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_5N0mvyPNqqo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5N0mvyPNqqo", libSceNKWebKitLegacyUnknown_5N0mvyPNqqo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_5NBTfOR8YYo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5NBTfOR8YYo", libSceNKWebKitLegacyUnknown_5NBTfOR8YYo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_5Q6JTf0hQvI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5Q6JTf0hQvI", libSceNKWebKitLegacyUnknown_5Q6JTf0hQvI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_5QF2sLtBPOU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5QF2sLtBPOU", libSceNKWebKitLegacyUnknown_5QF2sLtBPOU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_5RICSJuTYNs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5RICSJuTYNs", libSceNKWebKitLegacyUnknown_5RICSJuTYNs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_5S41GRIUTOQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5S41GRIUTOQ", libSceNKWebKitLegacyUnknown_5S41GRIUTOQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_5XDBYQU1Fc0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5XDBYQU1Fc0", libSceNKWebKitLegacyUnknown_5XDBYQU1Fc0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_5Xbk73Dvu8E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5Xbk73Dvu8E", libSceNKWebKitLegacyUnknown_5Xbk73Dvu8E_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_5YGfwZHHFbw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5YGfwZHHFbw", libSceNKWebKitLegacyUnknown_5YGfwZHHFbw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_5Yyd2vDsUWg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5Yyd2vDsUWg", libSceNKWebKitLegacyUnknown_5Yyd2vDsUWg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_5ZZWCZQJF_plus_M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5ZZWCZQJF+M", libSceNKWebKitLegacyUnknown_5ZZWCZQJF_plus_M_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_5cJ3RuOZuBs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5cJ3RuOZuBs", libSceNKWebKitLegacyUnknown_5cJ3RuOZuBs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_5j6_minus_WEttbuw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5j6-WEttbuw", libSceNKWebKitLegacyUnknown_5j6_minus_WEttbuw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_5jpU6nIoG7s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5jpU6nIoG7s", libSceNKWebKitLegacyUnknown_5jpU6nIoG7s_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_5pbw5vA7vRQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5pbw5vA7vRQ", libSceNKWebKitLegacyUnknown_5pbw5vA7vRQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_5rCCrgOuFtQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5rCCrgOuFtQ", libSceNKWebKitLegacyUnknown_5rCCrgOuFtQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_5rINiSr7Wa8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5rINiSr7Wa8", libSceNKWebKitLegacyUnknown_5rINiSr7Wa8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_5rS_minus_6rO0R6g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5rS-6rO0R6g", libSceNKWebKitLegacyUnknown_5rS_minus_6rO0R6g_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_5s4TinvE_plus_1c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5s4TinvE+1c", libSceNKWebKitLegacyUnknown_5s4TinvE_plus_1c_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_5sNT63YuvME_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5sNT63YuvME", libSceNKWebKitLegacyUnknown_5sNT63YuvME_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_5trdnX5Neq0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5trdnX5Neq0", libSceNKWebKitLegacyUnknown_5trdnX5Neq0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_5u_minus_OHNy_plus_7cc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5u-OHNy+7cc", libSceNKWebKitLegacyUnknown_5u_minus_OHNy_plus_7cc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_5udeImdKV88_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5udeImdKV88", libSceNKWebKitLegacyUnknown_5udeImdKV88_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_5w_plus_Rr9_plus_LpNk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5w+Rr9+LpNk", libSceNKWebKitLegacyUnknown_5w_plus_Rr9_plus_LpNk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_5wtV7AmfJHM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5wtV7AmfJHM", libSceNKWebKitLegacyUnknown_5wtV7AmfJHM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_5zNKDCKx4bU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5zNKDCKx4bU", libSceNKWebKitLegacyUnknown_5zNKDCKx4bU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_5zyEbeBeTlE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5zyEbeBeTlE", libSceNKWebKitLegacyUnknown_5zyEbeBeTlE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_6_plus_57_plus_Sew7Gc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6+57+Sew7Gc", libSceNKWebKitLegacyUnknown_6_plus_57_plus_Sew7Gc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_61wgc_minus_NcB7U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("61wgc-NcB7U", libSceNKWebKitLegacyUnknown_61wgc_minus_NcB7U_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_64qh3Wh088M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("64qh3Wh088M", libSceNKWebKitLegacyUnknown_64qh3Wh088M_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_64zPqAZVyN8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("64zPqAZVyN8", libSceNKWebKitLegacyUnknown_64zPqAZVyN8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_655LHN8zlcI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("655LHN8zlcI", libSceNKWebKitLegacyUnknown_655LHN8zlcI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_67xw5D1OJts_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("67xw5D1OJts", libSceNKWebKitLegacyUnknown_67xw5D1OJts_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_68a7dt2jTZo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("68a7dt2jTZo", libSceNKWebKitLegacyUnknown_68a7dt2jTZo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_6964_minus_bbBA9Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6964-bbBA9Q", libSceNKWebKitLegacyUnknown_6964_minus_bbBA9Q_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_6CD9L46HBRQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6CD9L46HBRQ", libSceNKWebKitLegacyUnknown_6CD9L46HBRQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_6FHQ2_minus_xTuPY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6FHQ2-xTuPY", libSceNKWebKitLegacyUnknown_6FHQ2_minus_xTuPY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_6FzbW6sUGgo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6FzbW6sUGgo", libSceNKWebKitLegacyUnknown_6FzbW6sUGgo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_6G7dGMr3wtI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6G7dGMr3wtI", libSceNKWebKitLegacyUnknown_6G7dGMr3wtI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_6HZNd7nhoLo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6HZNd7nhoLo", libSceNKWebKitLegacyUnknown_6HZNd7nhoLo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_6OD_minus_q4DoVyE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6OD-q4DoVyE", libSceNKWebKitLegacyUnknown_6OD_minus_q4DoVyE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_6OdqxwePEgA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6OdqxwePEgA", libSceNKWebKitLegacyUnknown_6OdqxwePEgA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_6Ra_plus_NbLw5iU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6Ra+NbLw5iU", libSceNKWebKitLegacyUnknown_6Ra_plus_NbLw5iU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_6RxzKEvl31I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6RxzKEvl31I", libSceNKWebKitLegacyUnknown_6RxzKEvl31I_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_6TIkwWdSsy0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6TIkwWdSsy0", libSceNKWebKitLegacyUnknown_6TIkwWdSsy0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_6V_plus_as96kvy4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6V+as96kvy4", libSceNKWebKitLegacyUnknown_6V_plus_as96kvy4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_6ZQ64IUQsOA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6ZQ64IUQsOA", libSceNKWebKitLegacyUnknown_6ZQ64IUQsOA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_6b1uHtKrbEo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6b1uHtKrbEo", libSceNKWebKitLegacyUnknown_6b1uHtKrbEo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_6cbxzqSLXVU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6cbxzqSLXVU", libSceNKWebKitLegacyUnknown_6cbxzqSLXVU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_6cxt2rJQec0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6cxt2rJQec0", libSceNKWebKitLegacyUnknown_6cxt2rJQec0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_6dHgysQUfVc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6dHgysQUfVc", libSceNKWebKitLegacyUnknown_6dHgysQUfVc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_6eXsoe6i_plus_w4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6eXsoe6i+w4", libSceNKWebKitLegacyUnknown_6eXsoe6i_plus_w4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_6fwKnXym170_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6fwKnXym170", libSceNKWebKitLegacyUnknown_6fwKnXym170_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_6glQ8kD_minus_GTc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6glQ8kD-GTc", libSceNKWebKitLegacyUnknown_6glQ8kD_minus_GTc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_6hnjdHQRIjg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6hnjdHQRIjg", libSceNKWebKitLegacyUnknown_6hnjdHQRIjg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_6jXcZuxLnX4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6jXcZuxLnX4", libSceNKWebKitLegacyUnknown_6jXcZuxLnX4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_6kdiTAwx4_plus_A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6kdiTAwx4+A", libSceNKWebKitLegacyUnknown_6kdiTAwx4_plus_A_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_6lxsEIodP9k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6lxsEIodP9k", libSceNKWebKitLegacyUnknown_6lxsEIodP9k_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_6m65wOWTyCI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6m65wOWTyCI", libSceNKWebKitLegacyUnknown_6m65wOWTyCI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_6oCPeed_plus_v4M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6oCPeed+v4M", libSceNKWebKitLegacyUnknown_6oCPeed_plus_v4M_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_6oEykmqYVfk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6oEykmqYVfk", libSceNKWebKitLegacyUnknown_6oEykmqYVfk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_6oh0rtZZZE0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6oh0rtZZZE0", libSceNKWebKitLegacyUnknown_6oh0rtZZZE0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_6orDtmsPu64_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6orDtmsPu64", libSceNKWebKitLegacyUnknown_6orDtmsPu64_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_6qJpqcBfN4U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6qJpqcBfN4U", libSceNKWebKitLegacyUnknown_6qJpqcBfN4U_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_6qe2QcAHHk8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6qe2QcAHHk8", libSceNKWebKitLegacyUnknown_6qe2QcAHHk8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_6vQp2stBq68_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6vQp2stBq68", libSceNKWebKitLegacyUnknown_6vQp2stBq68_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_6xvl3JBzRek_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6xvl3JBzRek", libSceNKWebKitLegacyUnknown_6xvl3JBzRek_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_6zcc4vyhfLQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6zcc4vyhfLQ", libSceNKWebKitLegacyUnknown_6zcc4vyhfLQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_7_plus_d1LZxLTvk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7+d1LZxLTvk", libSceNKWebKitLegacyUnknown_7_plus_d1LZxLTvk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_7_minus_Gdiep3RZg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7-Gdiep3RZg", libSceNKWebKitLegacyUnknown_7_minus_Gdiep3RZg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_73XzI6MdHu4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("73XzI6MdHu4", libSceNKWebKitLegacyUnknown_73XzI6MdHu4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_78Wi0rCCkdA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("78Wi0rCCkdA", libSceNKWebKitLegacyUnknown_78Wi0rCCkdA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_79bfFTip_plus_p4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("79bfFTip+p4", libSceNKWebKitLegacyUnknown_79bfFTip_plus_p4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_7A_minus_lPhBoeXM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7A-lPhBoeXM", libSceNKWebKitLegacyUnknown_7A_minus_lPhBoeXM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_7BEhz5YZqec_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7BEhz5YZqec", libSceNKWebKitLegacyUnknown_7BEhz5YZqec_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_7GLcx3V_minus_PiI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7GLcx3V-PiI", libSceNKWebKitLegacyUnknown_7GLcx3V_minus_PiI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_7Ht6FFZ6ziw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7Ht6FFZ6ziw", libSceNKWebKitLegacyUnknown_7Ht6FFZ6ziw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_7IB2cMpxifg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7IB2cMpxifg", libSceNKWebKitLegacyUnknown_7IB2cMpxifg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_7Muy2w1kJzc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7Muy2w1kJzc", libSceNKWebKitLegacyUnknown_7Muy2w1kJzc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_7OD_plus_b_plus_1FcDY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7OD+b+1FcDY", libSceNKWebKitLegacyUnknown_7OD_plus_b_plus_1FcDY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_7Rsq06tRYkc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7Rsq06tRYkc", libSceNKWebKitLegacyUnknown_7Rsq06tRYkc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_7SSGacw8bLM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7SSGacw8bLM", libSceNKWebKitLegacyUnknown_7SSGacw8bLM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_7T2NcREE1iw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7T2NcREE1iw", libSceNKWebKitLegacyUnknown_7T2NcREE1iw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_7TSQcd66UoE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7TSQcd66UoE", libSceNKWebKitLegacyUnknown_7TSQcd66UoE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_7X4NgwKIpj8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7X4NgwKIpj8", libSceNKWebKitLegacyUnknown_7X4NgwKIpj8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_7XRV7tj5XDo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7XRV7tj5XDo", libSceNKWebKitLegacyUnknown_7XRV7tj5XDo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_7Y_minus_NEXDwcdM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7Y-NEXDwcdM", libSceNKWebKitLegacyUnknown_7Y_minus_NEXDwcdM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_7YMs1mf_minus_FgY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7YMs1mf-FgY", libSceNKWebKitLegacyUnknown_7YMs1mf_minus_FgY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_7Yjm0aibBRo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7Yjm0aibBRo", libSceNKWebKitLegacyUnknown_7Yjm0aibBRo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_7YnPVddogS0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7YnPVddogS0", libSceNKWebKitLegacyUnknown_7YnPVddogS0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_7au5moeRlPU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7au5moeRlPU", libSceNKWebKitLegacyUnknown_7au5moeRlPU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_7gIdYyBzf4Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7gIdYyBzf4Y", libSceNKWebKitLegacyUnknown_7gIdYyBzf4Y_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_7hRWTOqVQ9w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7hRWTOqVQ9w", libSceNKWebKitLegacyUnknown_7hRWTOqVQ9w_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_7khEIoGv2Q8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7khEIoGv2Q8", libSceNKWebKitLegacyUnknown_7khEIoGv2Q8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_7l3U5RmuZ60_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7l3U5RmuZ60", libSceNKWebKitLegacyUnknown_7l3U5RmuZ60_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_7l44TDMrkeE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7l44TDMrkeE", libSceNKWebKitLegacyUnknown_7l44TDMrkeE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_7n0ehnQc0Gw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7n0ehnQc0Gw", libSceNKWebKitLegacyUnknown_7n0ehnQc0Gw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_7o36Jzkuwfs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7o36Jzkuwfs", libSceNKWebKitLegacyUnknown_7o36Jzkuwfs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_7pDRHhO7Hxw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7pDRHhO7Hxw", libSceNKWebKitLegacyUnknown_7pDRHhO7Hxw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_7r_minus_cRJ8ieEM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7r-cRJ8ieEM", libSceNKWebKitLegacyUnknown_7r_minus_cRJ8ieEM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_7v4h8nXSHVw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7v4h8nXSHVw", libSceNKWebKitLegacyUnknown_7v4h8nXSHVw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_7xOeJ01pYMw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7xOeJ01pYMw", libSceNKWebKitLegacyUnknown_7xOeJ01pYMw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_7xewwX3b8DU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7xewwX3b8DU", libSceNKWebKitLegacyUnknown_7xewwX3b8DU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_81w0cOjyw3k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("81w0cOjyw3k", libSceNKWebKitLegacyUnknown_81w0cOjyw3k_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_83TnXMiZhoI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("83TnXMiZhoI", libSceNKWebKitLegacyUnknown_83TnXMiZhoI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_83fgB0siJ7k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("83fgB0siJ7k", libSceNKWebKitLegacyUnknown_83fgB0siJ7k_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_84aS8IPKiZs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("84aS8IPKiZs", libSceNKWebKitLegacyUnknown_84aS8IPKiZs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_87rZESXTlek_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("87rZESXTlek", libSceNKWebKitLegacyUnknown_87rZESXTlek_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_89XGwsfC4cs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("89XGwsfC4cs", libSceNKWebKitLegacyUnknown_89XGwsfC4cs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8AgQaMFPjgk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8AgQaMFPjgk", libSceNKWebKitLegacyUnknown_8AgQaMFPjgk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8CKXZM9mjBk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8CKXZM9mjBk", libSceNKWebKitLegacyUnknown_8CKXZM9mjBk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8DpRIrt_plus_JH4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8DpRIrt+JH4", libSceNKWebKitLegacyUnknown_8DpRIrt_plus_JH4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8E1w2JMg4VU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8E1w2JMg4VU", libSceNKWebKitLegacyUnknown_8E1w2JMg4VU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8FQEz_plus_Hqbyk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8FQEz+Hqbyk", libSceNKWebKitLegacyUnknown_8FQEz_plus_Hqbyk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8IHHK_plus_8Ip_minus_Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8IHHK+8Ip-Q", libSceNKWebKitLegacyUnknown_8IHHK_plus_8Ip_minus_Q_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8J3ctSNLYQg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8J3ctSNLYQg", libSceNKWebKitLegacyUnknown_8J3ctSNLYQg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8JA1CHE5IGw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8JA1CHE5IGw", libSceNKWebKitLegacyUnknown_8JA1CHE5IGw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8KXX2Cg3q5I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8KXX2Cg3q5I", libSceNKWebKitLegacyUnknown_8KXX2Cg3q5I_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8MNwOmGRJiQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8MNwOmGRJiQ", libSceNKWebKitLegacyUnknown_8MNwOmGRJiQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8NZOKIOOCHQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8NZOKIOOCHQ", libSceNKWebKitLegacyUnknown_8NZOKIOOCHQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8OJ8j1Uyunk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8OJ8j1Uyunk", libSceNKWebKitLegacyUnknown_8OJ8j1Uyunk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8ORxSr_plus_WMPQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8ORxSr+WMPQ", libSceNKWebKitLegacyUnknown_8ORxSr_plus_WMPQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8SvGrBTpEYM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8SvGrBTpEYM", libSceNKWebKitLegacyUnknown_8SvGrBTpEYM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8TfNVjoESl8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8TfNVjoESl8", libSceNKWebKitLegacyUnknown_8TfNVjoESl8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8U_minus_ovgOO1Ik_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8U-ovgOO1Ik", libSceNKWebKitLegacyUnknown_8U_minus_ovgOO1Ik_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8U1vo21oMoU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8U1vo21oMoU", libSceNKWebKitLegacyUnknown_8U1vo21oMoU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8bjgDkrRz_plus_Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8bjgDkrRz+Q", libSceNKWebKitLegacyUnknown_8bjgDkrRz_plus_Q_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8eupyb22g_plus_o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8eupyb22g+o", libSceNKWebKitLegacyUnknown_8eupyb22g_plus_o_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8fFXTukOa9c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8fFXTukOa9c", libSceNKWebKitLegacyUnknown_8fFXTukOa9c_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8fZVMX4a2_plus_I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8fZVMX4a2+I", libSceNKWebKitLegacyUnknown_8fZVMX4a2_plus_I_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8ff0Ui9A1Pc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8ff0Ui9A1Pc", libSceNKWebKitLegacyUnknown_8ff0Ui9A1Pc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8iEGAigWFrI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8iEGAigWFrI", libSceNKWebKitLegacyUnknown_8iEGAigWFrI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8ijDcsqEnnw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8ijDcsqEnnw", libSceNKWebKitLegacyUnknown_8ijDcsqEnnw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8jL9xlJREyA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8jL9xlJREyA", libSceNKWebKitLegacyUnknown_8jL9xlJREyA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8jeUVytNXpw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8jeUVytNXpw", libSceNKWebKitLegacyUnknown_8jeUVytNXpw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8kTpmAaPOaM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8kTpmAaPOaM", libSceNKWebKitLegacyUnknown_8kTpmAaPOaM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8lPvbU_plus_0nPo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8lPvbU+0nPo", libSceNKWebKitLegacyUnknown_8lPvbU_plus_0nPo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8llaUJJ9iG0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8llaUJJ9iG0", libSceNKWebKitLegacyUnknown_8llaUJJ9iG0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8milg8QNAII_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8milg8QNAII", libSceNKWebKitLegacyUnknown_8milg8QNAII_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8nlEm_minus_PUWjQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8nlEm-PUWjQ", libSceNKWebKitLegacyUnknown_8nlEm_minus_PUWjQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8qjW8fYssto_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8qjW8fYssto", libSceNKWebKitLegacyUnknown_8qjW8fYssto_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8qyJEnqVsso_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8qyJEnqVsso", libSceNKWebKitLegacyUnknown_8qyJEnqVsso_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8rkYT4LS3Lc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8rkYT4LS3Lc", libSceNKWebKitLegacyUnknown_8rkYT4LS3Lc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8sS3nubeVL4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8sS3nubeVL4", libSceNKWebKitLegacyUnknown_8sS3nubeVL4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8t9Vk74CkmU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8t9Vk74CkmU", libSceNKWebKitLegacyUnknown_8t9Vk74CkmU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8tq87pgLk_plus_8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8tq87pgLk+8", libSceNKWebKitLegacyUnknown_8tq87pgLk_plus_8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8vdU3tjLqgE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8vdU3tjLqgE", libSceNKWebKitLegacyUnknown_8vdU3tjLqgE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8vlYNyAUFlU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8vlYNyAUFlU", libSceNKWebKitLegacyUnknown_8vlYNyAUFlU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_8z5gjWiHnvA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8z5gjWiHnvA", libSceNKWebKitLegacyUnknown_8z5gjWiHnvA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_9_plus_uzG6bu_minus_R8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9+uzG6bu-R8", libSceNKWebKitLegacyUnknown_9_plus_uzG6bu_minus_R8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_90S9Y9dYReA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("90S9Y9dYReA", libSceNKWebKitLegacyUnknown_90S9Y9dYReA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_90tCdPotPR0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("90tCdPotPR0", libSceNKWebKitLegacyUnknown_90tCdPotPR0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_91kCCWMU75A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("91kCCWMU75A", libSceNKWebKitLegacyUnknown_91kCCWMU75A_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_97UFbB1wPXs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("97UFbB1wPXs", libSceNKWebKitLegacyUnknown_97UFbB1wPXs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_9BQ3lAY5LZY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9BQ3lAY5LZY", libSceNKWebKitLegacyUnknown_9BQ3lAY5LZY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_9D1PY1C0XK4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9D1PY1C0XK4", libSceNKWebKitLegacyUnknown_9D1PY1C0XK4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_9GNi_plus_zOp9Qs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9GNi+zOp9Qs", libSceNKWebKitLegacyUnknown_9GNi_plus_zOp9Qs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_9KpvLOwPxsw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9KpvLOwPxsw", libSceNKWebKitLegacyUnknown_9KpvLOwPxsw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_9LmCRDbA_minus_Oo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9LmCRDbA-Oo", libSceNKWebKitLegacyUnknown_9LmCRDbA_minus_Oo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_9POEXdfKlMY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9POEXdfKlMY", libSceNKWebKitLegacyUnknown_9POEXdfKlMY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_9QBr0EuWoHA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9QBr0EuWoHA", libSceNKWebKitLegacyUnknown_9QBr0EuWoHA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_9XBBldjWb_plus_k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9XBBldjWb+k", libSceNKWebKitLegacyUnknown_9XBBldjWb_plus_k_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_9YMojY3k_plus_IE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9YMojY3k+IE", libSceNKWebKitLegacyUnknown_9YMojY3k_plus_IE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_9bHSd64WzB0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9bHSd64WzB0", libSceNKWebKitLegacyUnknown_9bHSd64WzB0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_9cwzuFnbszA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9cwzuFnbszA", libSceNKWebKitLegacyUnknown_9cwzuFnbszA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_9dulQPS5uJg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9dulQPS5uJg", libSceNKWebKitLegacyUnknown_9dulQPS5uJg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_9e61iN5WLxg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9e61iN5WLxg", libSceNKWebKitLegacyUnknown_9e61iN5WLxg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_9ej2hBD_plus_fc0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9ej2hBD+fc0", libSceNKWebKitLegacyUnknown_9ej2hBD_plus_fc0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_9iSJPgI_plus_hoY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9iSJPgI+hoY", libSceNKWebKitLegacyUnknown_9iSJPgI_plus_hoY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_9j6AQ2zpBw4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9j6AQ2zpBw4", libSceNKWebKitLegacyUnknown_9j6AQ2zpBw4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_9lfIaClBKHQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9lfIaClBKHQ", libSceNKWebKitLegacyUnknown_9lfIaClBKHQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_9ltF1xBh8u0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9ltF1xBh8u0", libSceNKWebKitLegacyUnknown_9ltF1xBh8u0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_9o4lPDNBpLI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9o4lPDNBpLI", libSceNKWebKitLegacyUnknown_9o4lPDNBpLI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_9qI0dw2DSpQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9qI0dw2DSpQ", libSceNKWebKitLegacyUnknown_9qI0dw2DSpQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_9r7PpojYy68_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9r7PpojYy68", libSceNKWebKitLegacyUnknown_9r7PpojYy68_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_9vxj1CYn_plus_Fo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9vxj1CYn+Fo", libSceNKWebKitLegacyUnknown_9vxj1CYn_plus_Fo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_9wbUJuYetY8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9wbUJuYetY8", libSceNKWebKitLegacyUnknown_9wbUJuYetY8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_9wn_minus_erEKew4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9wn-erEKew4", libSceNKWebKitLegacyUnknown_9wn_minus_erEKew4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_9x5f0140e_minus_c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9x5f0140e-c", libSceNKWebKitLegacyUnknown_9x5f0140e_minus_c_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_9xDz4aqfRec_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9xDz4aqfRec", libSceNKWebKitLegacyUnknown_9xDz4aqfRec_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_9xN76g0Nw0g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9xN76g0Nw0g", libSceNKWebKitLegacyUnknown_9xN76g0Nw0g_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_A_plus_k81GS7Dzs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("A+k81GS7Dzs", libSceNKWebKitLegacyUnknown_A_plus_k81GS7Dzs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_A_plus_uMGgdfMa8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("A+uMGgdfMa8", libSceNKWebKitLegacyUnknown_A_plus_uMGgdfMa8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_A3vIdrdhcdk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("A3vIdrdhcdk", libSceNKWebKitLegacyUnknown_A3vIdrdhcdk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_A4vEPN_minus_BQAw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("A4vEPN-BQAw", libSceNKWebKitLegacyUnknown_A4vEPN_minus_BQAw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_A5HsmsXdCnw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("A5HsmsXdCnw", libSceNKWebKitLegacyUnknown_A5HsmsXdCnw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_A923XQeoiUY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("A923XQeoiUY", libSceNKWebKitLegacyUnknown_A923XQeoiUY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_AExYkCj1R2Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AExYkCj1R2Q", libSceNKWebKitLegacyUnknown_AExYkCj1R2Q_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_AFs8wZ7wnJQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AFs8wZ7wnJQ", libSceNKWebKitLegacyUnknown_AFs8wZ7wnJQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_AG_minus_xi62BJTU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AG-xi62BJTU", libSceNKWebKitLegacyUnknown_AG_minus_xi62BJTU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_AH8sEAQe3Ts_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AH8sEAQe3Ts", libSceNKWebKitLegacyUnknown_AH8sEAQe3Ts_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_AMUIydtUy7w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AMUIydtUy7w", libSceNKWebKitLegacyUnknown_AMUIydtUy7w_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_AQBadyACkJc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AQBadyACkJc", libSceNKWebKitLegacyUnknown_AQBadyACkJc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_AQTcevtsafI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AQTcevtsafI", libSceNKWebKitLegacyUnknown_AQTcevtsafI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ARQuup8gtks_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ARQuup8gtks", libSceNKWebKitLegacyUnknown_ARQuup8gtks_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ASH2Xwo63xM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ASH2Xwo63xM", libSceNKWebKitLegacyUnknown_ASH2Xwo63xM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_AUrZewA40Vo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AUrZewA40Vo", libSceNKWebKitLegacyUnknown_AUrZewA40Vo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Aa8cXoodZg4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Aa8cXoodZg4", libSceNKWebKitLegacyUnknown_Aa8cXoodZg4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_AamWGSiwlLs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AamWGSiwlLs", libSceNKWebKitLegacyUnknown_AamWGSiwlLs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Ac4nZvBPfYU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ac4nZvBPfYU", libSceNKWebKitLegacyUnknown_Ac4nZvBPfYU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Ad9LVYzibBM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ad9LVYzibBM", libSceNKWebKitLegacyUnknown_Ad9LVYzibBM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Aej69rTqBWI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Aej69rTqBWI", libSceNKWebKitLegacyUnknown_Aej69rTqBWI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Af6qMnbcSqI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Af6qMnbcSqI", libSceNKWebKitLegacyUnknown_Af6qMnbcSqI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_AfORewp_plus_ARE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AfORewp+ARE", libSceNKWebKitLegacyUnknown_AfORewp_plus_ARE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_AfttByu5ALE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AfttByu5ALE", libSceNKWebKitLegacyUnknown_AfttByu5ALE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Aj4Ha7tFybU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Aj4Ha7tFybU", libSceNKWebKitLegacyUnknown_Aj4Ha7tFybU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_AkI8IiQHqkA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AkI8IiQHqkA", libSceNKWebKitLegacyUnknown_AkI8IiQHqkA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_AkqlD9D8CyI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AkqlD9D8CyI", libSceNKWebKitLegacyUnknown_AkqlD9D8CyI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_AlIvAQxkLX0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AlIvAQxkLX0", libSceNKWebKitLegacyUnknown_AlIvAQxkLX0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_AnIwPVeSiNg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AnIwPVeSiNg", libSceNKWebKitLegacyUnknown_AnIwPVeSiNg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_AnjvbLUFtro_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AnjvbLUFtro", libSceNKWebKitLegacyUnknown_AnjvbLUFtro_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_AoJV7ZZ7qnY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AoJV7ZZ7qnY", libSceNKWebKitLegacyUnknown_AoJV7ZZ7qnY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ArMYOcHPmzs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ArMYOcHPmzs", libSceNKWebKitLegacyUnknown_ArMYOcHPmzs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_As3I17TV4BE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("As3I17TV4BE", libSceNKWebKitLegacyUnknown_As3I17TV4BE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Atdux08uxSM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Atdux08uxSM", libSceNKWebKitLegacyUnknown_Atdux08uxSM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Au_plus_ni2kldkk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Au+ni2kldkk", libSceNKWebKitLegacyUnknown_Au_plus_ni2kldkk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Au_minus_YQEODZBY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Au-YQEODZBY", libSceNKWebKitLegacyUnknown_Au_minus_YQEODZBY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_AvQjbt0RSyo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AvQjbt0RSyo", libSceNKWebKitLegacyUnknown_AvQjbt0RSyo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_AwiR8FKViZ8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AwiR8FKViZ8", libSceNKWebKitLegacyUnknown_AwiR8FKViZ8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_AyIo9E7XKTU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AyIo9E7XKTU", libSceNKWebKitLegacyUnknown_AyIo9E7XKTU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_B_plus_GM09yeizA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("B+GM09yeizA", libSceNKWebKitLegacyUnknown_B_plus_GM09yeizA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_B7pGVW6pRjU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("B7pGVW6pRjU", libSceNKWebKitLegacyUnknown_B7pGVW6pRjU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_B9lE08nMQWs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("B9lE08nMQWs", libSceNKWebKitLegacyUnknown_B9lE08nMQWs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_BEK5iZulCwI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BEK5iZulCwI", libSceNKWebKitLegacyUnknown_BEK5iZulCwI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_BG0nGfpkivk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BG0nGfpkivk", libSceNKWebKitLegacyUnknown_BG0nGfpkivk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_BG5OCkaVjWg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BG5OCkaVjWg", libSceNKWebKitLegacyUnknown_BG5OCkaVjWg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_BH5Tfw8jd04_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BH5Tfw8jd04", libSceNKWebKitLegacyUnknown_BH5Tfw8jd04_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_BLVwFfgGWes_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BLVwFfgGWes", libSceNKWebKitLegacyUnknown_BLVwFfgGWes_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_BR_plus_IIG39U6E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BR+IIG39U6E", libSceNKWebKitLegacyUnknown_BR_plus_IIG39U6E_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_BSe_minus_1Yjjpe8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BSe-1Yjjpe8", libSceNKWebKitLegacyUnknown_BSe_minus_1Yjjpe8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_BTFHrRJO5DE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BTFHrRJO5DE", libSceNKWebKitLegacyUnknown_BTFHrRJO5DE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_BTWl0NaPmmY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BTWl0NaPmmY", libSceNKWebKitLegacyUnknown_BTWl0NaPmmY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_BV5sgWMa2to_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BV5sgWMa2to", libSceNKWebKitLegacyUnknown_BV5sgWMa2to_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_BXgtCsp0EDU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BXgtCsp0EDU", libSceNKWebKitLegacyUnknown_BXgtCsp0EDU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_BXmuwIQiwZ0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BXmuwIQiwZ0", libSceNKWebKitLegacyUnknown_BXmuwIQiwZ0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_BcL6vGkrowk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BcL6vGkrowk", libSceNKWebKitLegacyUnknown_BcL6vGkrowk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_BcYfhsAI_minus_y0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BcYfhsAI-y0", libSceNKWebKitLegacyUnknown_BcYfhsAI_minus_y0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Be1fGLBPbcs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Be1fGLBPbcs", libSceNKWebKitLegacyUnknown_Be1fGLBPbcs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Bg_plus_ekiciYNs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Bg+ekiciYNs", libSceNKWebKitLegacyUnknown_Bg_plus_ekiciYNs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_BghkhNf6ax4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BghkhNf6ax4", libSceNKWebKitLegacyUnknown_BghkhNf6ax4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_BhD9cBcAGJk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BhD9cBcAGJk", libSceNKWebKitLegacyUnknown_BhD9cBcAGJk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_BjLA08Ot7N4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BjLA08Ot7N4", libSceNKWebKitLegacyUnknown_BjLA08Ot7N4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Bl5m20wA4HU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Bl5m20wA4HU", libSceNKWebKitLegacyUnknown_Bl5m20wA4HU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Bl6rAJiQGWI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Bl6rAJiQGWI", libSceNKWebKitLegacyUnknown_Bl6rAJiQGWI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_BlHxtSQOjXo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BlHxtSQOjXo", libSceNKWebKitLegacyUnknown_BlHxtSQOjXo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Bnhc4tdyQOE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Bnhc4tdyQOE", libSceNKWebKitLegacyUnknown_Bnhc4tdyQOE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_BoakLOKHTSo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BoakLOKHTSo", libSceNKWebKitLegacyUnknown_BoakLOKHTSo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_BpOvU_minus_QgYaE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BpOvU-QgYaE", libSceNKWebKitLegacyUnknown_BpOvU_minus_QgYaE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_BqBkwvs0b5U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BqBkwvs0b5U", libSceNKWebKitLegacyUnknown_BqBkwvs0b5U_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_BqfBIchFGgY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BqfBIchFGgY", libSceNKWebKitLegacyUnknown_BqfBIchFGgY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_BrqxKujapGU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BrqxKujapGU", libSceNKWebKitLegacyUnknown_BrqxKujapGU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_BtHxQ6Pv6fk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BtHxQ6Pv6fk", libSceNKWebKitLegacyUnknown_BtHxQ6Pv6fk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_BulZV_plus_Yia3Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BulZV+Yia3Q", libSceNKWebKitLegacyUnknown_BulZV_plus_Yia3Q_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Bw_minus_QDxYd1jc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Bw-QDxYd1jc", libSceNKWebKitLegacyUnknown_Bw_minus_QDxYd1jc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Bw3SBGdil8Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Bw3SBGdil8Q", libSceNKWebKitLegacyUnknown_Bw3SBGdil8Q_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Bxm_plus_T4kzc1A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Bxm+T4kzc1A", libSceNKWebKitLegacyUnknown_Bxm_plus_T4kzc1A_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Bz_plus__minus_KFhYkWQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Bz+-KFhYkWQ", libSceNKWebKitLegacyUnknown_Bz_plus__minus_KFhYkWQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_BzS42mcRG_minus_Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BzS42mcRG-Q", libSceNKWebKitLegacyUnknown_BzS42mcRG_minus_Q_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Bzj6EDufzVw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Bzj6EDufzVw", libSceNKWebKitLegacyUnknown_Bzj6EDufzVw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_C_plus_e8Hg4gjU0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("C+e8Hg4gjU0", libSceNKWebKitLegacyUnknown_C_plus_e8Hg4gjU0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_C49LgOV_minus_jPo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("C49LgOV-jPo", libSceNKWebKitLegacyUnknown_C49LgOV_minus_jPo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_C6ibH_minus_4Ydg0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("C6ibH-4Ydg0", libSceNKWebKitLegacyUnknown_C6ibH_minus_4Ydg0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_C9dKmTrHrxg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("C9dKmTrHrxg", libSceNKWebKitLegacyUnknown_C9dKmTrHrxg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_CBQGMZDDQD4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CBQGMZDDQD4", libSceNKWebKitLegacyUnknown_CBQGMZDDQD4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_CBV1LMkpn1U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CBV1LMkpn1U", libSceNKWebKitLegacyUnknown_CBV1LMkpn1U_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_CBpZOt_minus_r2hU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CBpZOt-r2hU", libSceNKWebKitLegacyUnknown_CBpZOt_minus_r2hU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_CBrj1sUFTZ0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CBrj1sUFTZ0", libSceNKWebKitLegacyUnknown_CBrj1sUFTZ0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_CC1FIVcHVpc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CC1FIVcHVpc", libSceNKWebKitLegacyUnknown_CC1FIVcHVpc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_CDWSy6_minus_98q8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CDWSy6-98q8", libSceNKWebKitLegacyUnknown_CDWSy6_minus_98q8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_CE0O_minus_D1AG_plus_w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CE0O-D1AG+w", libSceNKWebKitLegacyUnknown_CE0O_minus_D1AG_plus_w_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_CFzLYUJTbUg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CFzLYUJTbUg", libSceNKWebKitLegacyUnknown_CFzLYUJTbUg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_CG2UUtwfu20_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CG2UUtwfu20", libSceNKWebKitLegacyUnknown_CG2UUtwfu20_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_CHEGG9KvmR4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CHEGG9KvmR4", libSceNKWebKitLegacyUnknown_CHEGG9KvmR4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_CHF4vI44PXs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CHF4vI44PXs", libSceNKWebKitLegacyUnknown_CHF4vI44PXs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_CMBoQfBTRBY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CMBoQfBTRBY", libSceNKWebKitLegacyUnknown_CMBoQfBTRBY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_CMGXXKpT_plus_VA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CMGXXKpT+VA", libSceNKWebKitLegacyUnknown_CMGXXKpT_plus_VA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_CPC0fBIeh_minus_c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CPC0fBIeh-c", libSceNKWebKitLegacyUnknown_CPC0fBIeh_minus_c_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_CV4VWEe0QK8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CV4VWEe0QK8", libSceNKWebKitLegacyUnknown_CV4VWEe0QK8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Cbi5bE14zRk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Cbi5bE14zRk", libSceNKWebKitLegacyUnknown_Cbi5bE14zRk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Cc_minus__plus_O41_plus_qDY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Cc-+O41+qDY", libSceNKWebKitLegacyUnknown_Cc_minus__plus_O41_plus_qDY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_CfjSBS_plus_DW_minus_g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CfjSBS+DW-g", libSceNKWebKitLegacyUnknown_CfjSBS_plus_DW_minus_g_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_CflkoWdTwuA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CflkoWdTwuA", libSceNKWebKitLegacyUnknown_CflkoWdTwuA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_CiT0N4PeQU0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CiT0N4PeQU0", libSceNKWebKitLegacyUnknown_CiT0N4PeQU0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_CjDIf5btcyI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CjDIf5btcyI", libSceNKWebKitLegacyUnknown_CjDIf5btcyI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_CjRpsQTPLyQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CjRpsQTPLyQ", libSceNKWebKitLegacyUnknown_CjRpsQTPLyQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_CmllLfpXY8A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CmllLfpXY8A", libSceNKWebKitLegacyUnknown_CmllLfpXY8A_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Cn1RbccDNP0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Cn1RbccDNP0", libSceNKWebKitLegacyUnknown_Cn1RbccDNP0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_CtogCIVTBsk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CtogCIVTBsk", libSceNKWebKitLegacyUnknown_CtogCIVTBsk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Ctw8TmmIXFs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ctw8TmmIXFs", libSceNKWebKitLegacyUnknown_Ctw8TmmIXFs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_CuE2jWA_minus_RaY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CuE2jWA-RaY", libSceNKWebKitLegacyUnknown_CuE2jWA_minus_RaY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_CwDNrs5xFWk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CwDNrs5xFWk", libSceNKWebKitLegacyUnknown_CwDNrs5xFWk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_CxCYeGea0gg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CxCYeGea0gg", libSceNKWebKitLegacyUnknown_CxCYeGea0gg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_D_minus_XrjSUAVYo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("D-XrjSUAVYo", libSceNKWebKitLegacyUnknown_D_minus_XrjSUAVYo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_D2JOQimv1is_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("D2JOQimv1is", libSceNKWebKitLegacyUnknown_D2JOQimv1is_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_D3lyiLzU0yM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("D3lyiLzU0yM", libSceNKWebKitLegacyUnknown_D3lyiLzU0yM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_D4kJWO3rclA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("D4kJWO3rclA", libSceNKWebKitLegacyUnknown_D4kJWO3rclA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_D5_minus_UlH_minus_hxT8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("D5-UlH-hxT8", libSceNKWebKitLegacyUnknown_D5_minus_UlH_minus_hxT8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_D6D9QvimnPc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("D6D9QvimnPc", libSceNKWebKitLegacyUnknown_D6D9QvimnPc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_D87MssF_plus_SDE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("D87MssF+SDE", libSceNKWebKitLegacyUnknown_D87MssF_plus_SDE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_DBwxPItsqE8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DBwxPItsqE8", libSceNKWebKitLegacyUnknown_DBwxPItsqE8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_DC6bLPb4VD8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DC6bLPb4VD8", libSceNKWebKitLegacyUnknown_DC6bLPb4VD8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_DFBZJzYu0MM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DFBZJzYu0MM", libSceNKWebKitLegacyUnknown_DFBZJzYu0MM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_DFjv_plus_LHtSFs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DFjv+LHtSFs", libSceNKWebKitLegacyUnknown_DFjv_plus_LHtSFs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_DFpikNdC3w4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DFpikNdC3w4", libSceNKWebKitLegacyUnknown_DFpikNdC3w4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_DGHBlx7MdZU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DGHBlx7MdZU", libSceNKWebKitLegacyUnknown_DGHBlx7MdZU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_DHZFFMpeKrk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DHZFFMpeKrk", libSceNKWebKitLegacyUnknown_DHZFFMpeKrk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_DHrbwttBFig_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DHrbwttBFig", libSceNKWebKitLegacyUnknown_DHrbwttBFig_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_DKdo2D2V5qc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DKdo2D2V5qc", libSceNKWebKitLegacyUnknown_DKdo2D2V5qc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_DKo3NJKlHGk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DKo3NJKlHGk", libSceNKWebKitLegacyUnknown_DKo3NJKlHGk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_DLs73j9k0q4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DLs73j9k0q4", libSceNKWebKitLegacyUnknown_DLs73j9k0q4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_DOHD6PjWmZ0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DOHD6PjWmZ0", libSceNKWebKitLegacyUnknown_DOHD6PjWmZ0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_DR11Ly2iWCo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DR11Ly2iWCo", libSceNKWebKitLegacyUnknown_DR11Ly2iWCo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_DS8NMQ0HIHo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DS8NMQ0HIHo", libSceNKWebKitLegacyUnknown_DS8NMQ0HIHo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_DT5Wcmk2vwQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DT5Wcmk2vwQ", libSceNKWebKitLegacyUnknown_DT5Wcmk2vwQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_DU2LPrXa1_minus_k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DU2LPrXa1-k", libSceNKWebKitLegacyUnknown_DU2LPrXa1_minus_k_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_DUwSS3OMOiw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DUwSS3OMOiw", libSceNKWebKitLegacyUnknown_DUwSS3OMOiw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_DXqOIg6G_plus_L4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DXqOIg6G+L4", libSceNKWebKitLegacyUnknown_DXqOIg6G_plus_L4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_DZTGCw2Bpi4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DZTGCw2Bpi4", libSceNKWebKitLegacyUnknown_DZTGCw2Bpi4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Db2K8M0KqP8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Db2K8M0KqP8", libSceNKWebKitLegacyUnknown_Db2K8M0KqP8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Dbe23izGT8U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Dbe23izGT8U", libSceNKWebKitLegacyUnknown_Dbe23izGT8U_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_DeToQFef2dA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DeToQFef2dA", libSceNKWebKitLegacyUnknown_DeToQFef2dA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_DfF_minus_Hdld5XA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DfF-Hdld5XA", libSceNKWebKitLegacyUnknown_DfF_minus_Hdld5XA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_DfafhdwOwXg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DfafhdwOwXg", libSceNKWebKitLegacyUnknown_DfafhdwOwXg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_DkQVriP9PA4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DkQVriP9PA4", libSceNKWebKitLegacyUnknown_DkQVriP9PA4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_DlPnDzttAtg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DlPnDzttAtg", libSceNKWebKitLegacyUnknown_DlPnDzttAtg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_DnQZHQhq8u4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DnQZHQhq8u4", libSceNKWebKitLegacyUnknown_DnQZHQhq8u4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_DoVa5dq8LBk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DoVa5dq8LBk", libSceNKWebKitLegacyUnknown_DoVa5dq8LBk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_DxUAcjpayC8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DxUAcjpayC8", libSceNKWebKitLegacyUnknown_DxUAcjpayC8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_E_plus_sOp_plus_H1I_plus_w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("E+sOp+H1I+w", libSceNKWebKitLegacyUnknown_E_plus_sOp_plus_H1I_plus_w_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_E0R5cfrGk7E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("E0R5cfrGk7E", libSceNKWebKitLegacyUnknown_E0R5cfrGk7E_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_E36oE_minus_G5CNo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("E36oE-G5CNo", libSceNKWebKitLegacyUnknown_E36oE_minus_G5CNo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_E3yZgI3uyrE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("E3yZgI3uyrE", libSceNKWebKitLegacyUnknown_E3yZgI3uyrE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_E4A0yvypFeA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("E4A0yvypFeA", libSceNKWebKitLegacyUnknown_E4A0yvypFeA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_E50FRi5Pcs4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("E50FRi5Pcs4", libSceNKWebKitLegacyUnknown_E50FRi5Pcs4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_E5TfXUcLDCE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("E5TfXUcLDCE", libSceNKWebKitLegacyUnknown_E5TfXUcLDCE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_E5cL6Get_minus_QI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("E5cL6Get-QI", libSceNKWebKitLegacyUnknown_E5cL6Get_minus_QI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_E6TRIoaA9Wo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("E6TRIoaA9Wo", libSceNKWebKitLegacyUnknown_E6TRIoaA9Wo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_E8mRcgwBtkM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("E8mRcgwBtkM", libSceNKWebKitLegacyUnknown_E8mRcgwBtkM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_EBKSsPIuTIg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EBKSsPIuTIg", libSceNKWebKitLegacyUnknown_EBKSsPIuTIg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_EBOgtWMb7rk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EBOgtWMb7rk", libSceNKWebKitLegacyUnknown_EBOgtWMb7rk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_EBjFh2V6YIQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EBjFh2V6YIQ", libSceNKWebKitLegacyUnknown_EBjFh2V6YIQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_EFcR_plus_ibkKM0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EFcR+ibkKM0", libSceNKWebKitLegacyUnknown_EFcR_plus_ibkKM0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_EI7UwdLMv6I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EI7UwdLMv6I", libSceNKWebKitLegacyUnknown_EI7UwdLMv6I_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_EIKwAopGAgI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EIKwAopGAgI", libSceNKWebKitLegacyUnknown_EIKwAopGAgI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_EJJiV41CZgA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EJJiV41CZgA", libSceNKWebKitLegacyUnknown_EJJiV41CZgA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_EKRu5EFU6j0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EKRu5EFU6j0", libSceNKWebKitLegacyUnknown_EKRu5EFU6j0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_EKndqtwAA5M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EKndqtwAA5M", libSceNKWebKitLegacyUnknown_EKndqtwAA5M_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ENCKCkxW_plus_k0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ENCKCkxW+k0", libSceNKWebKitLegacyUnknown_ENCKCkxW_plus_k0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ENi_minus__plus_3RjOHU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ENi-+3RjOHU", libSceNKWebKitLegacyUnknown_ENi_minus__plus_3RjOHU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_EPSZnEudIso_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EPSZnEudIso", libSceNKWebKitLegacyUnknown_EPSZnEudIso_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_EQV776115vk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EQV776115vk", libSceNKWebKitLegacyUnknown_EQV776115vk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ERUQawyiFiU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ERUQawyiFiU", libSceNKWebKitLegacyUnknown_ERUQawyiFiU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ETsJ_plus_wG6puw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ETsJ+wG6puw", libSceNKWebKitLegacyUnknown_ETsJ_plus_wG6puw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_EVN0_plus_KhaDss_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EVN0+KhaDss", libSceNKWebKitLegacyUnknown_EVN0_plus_KhaDss_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_EYX18O31OWk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EYX18O31OWk", libSceNKWebKitLegacyUnknown_EYX18O31OWk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_EaK2AflMZhQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EaK2AflMZhQ", libSceNKWebKitLegacyUnknown_EaK2AflMZhQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_EbihZup1hoA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EbihZup1hoA", libSceNKWebKitLegacyUnknown_EbihZup1hoA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_EfbN1PNbQ7w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EfbN1PNbQ7w", libSceNKWebKitLegacyUnknown_EfbN1PNbQ7w_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_EhU6GNY5CVw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EhU6GNY5CVw", libSceNKWebKitLegacyUnknown_EhU6GNY5CVw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Eota8FMl3bc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Eota8FMl3bc", libSceNKWebKitLegacyUnknown_Eota8FMl3bc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Er5QliqBi5c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Er5QliqBi5c", libSceNKWebKitLegacyUnknown_Er5QliqBi5c_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_EsNkhwlGnIg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EsNkhwlGnIg", libSceNKWebKitLegacyUnknown_EsNkhwlGnIg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_EuvdPRQiK7g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EuvdPRQiK7g", libSceNKWebKitLegacyUnknown_EuvdPRQiK7g_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Ex_plus_cnRETa4s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ex+cnRETa4s", libSceNKWebKitLegacyUnknown_Ex_plus_cnRETa4s_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Ex_minus_YbdUMRm4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ex-YbdUMRm4", libSceNKWebKitLegacyUnknown_Ex_minus_YbdUMRm4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_EyHDz7bL4q8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EyHDz7bL4q8", libSceNKWebKitLegacyUnknown_EyHDz7bL4q8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_EySRvVSytPw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EySRvVSytPw", libSceNKWebKitLegacyUnknown_EySRvVSytPw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_F00rJQ1aWWA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("F00rJQ1aWWA", libSceNKWebKitLegacyUnknown_F00rJQ1aWWA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_F2A0G_minus_vIz0k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("F2A0G-vIz0k", libSceNKWebKitLegacyUnknown_F2A0G_minus_vIz0k_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_F2u7VJoHjSM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("F2u7VJoHjSM", libSceNKWebKitLegacyUnknown_F2u7VJoHjSM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_F2uJJj9ieBQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("F2uJJj9ieBQ", libSceNKWebKitLegacyUnknown_F2uJJj9ieBQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_F4wrULqVMpE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("F4wrULqVMpE", libSceNKWebKitLegacyUnknown_F4wrULqVMpE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_F6kf_plus_33gnwk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("F6kf+33gnwk", libSceNKWebKitLegacyUnknown_F6kf_plus_33gnwk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_F6pGveCt2Ho_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("F6pGveCt2Ho", libSceNKWebKitLegacyUnknown_F6pGveCt2Ho_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_F98laITjKEg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("F98laITjKEg", libSceNKWebKitLegacyUnknown_F98laITjKEg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_FAeGfmN1Dio_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FAeGfmN1Dio", libSceNKWebKitLegacyUnknown_FAeGfmN1Dio_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_FClr6_minus_hkMx4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FClr6-hkMx4", libSceNKWebKitLegacyUnknown_FClr6_minus_hkMx4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_FFQ99YStuJU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FFQ99YStuJU", libSceNKWebKitLegacyUnknown_FFQ99YStuJU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_FGFb8rldXJ0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FGFb8rldXJ0", libSceNKWebKitLegacyUnknown_FGFb8rldXJ0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_FK_plus_8maQ3KE8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FK+8maQ3KE8", libSceNKWebKitLegacyUnknown_FK_plus_8maQ3KE8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_FKzWNFUwhgw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FKzWNFUwhgw", libSceNKWebKitLegacyUnknown_FKzWNFUwhgw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_FLYJ02qgHI8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FLYJ02qgHI8", libSceNKWebKitLegacyUnknown_FLYJ02qgHI8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_FO2oM5nyfjQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FO2oM5nyfjQ", libSceNKWebKitLegacyUnknown_FO2oM5nyfjQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_FPhiNyoXyrY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FPhiNyoXyrY", libSceNKWebKitLegacyUnknown_FPhiNyoXyrY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_FQqiBC8oep4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FQqiBC8oep4", libSceNKWebKitLegacyUnknown_FQqiBC8oep4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_FYhW0cFVkfU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FYhW0cFVkfU", libSceNKWebKitLegacyUnknown_FYhW0cFVkfU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_FaGbTl7GSKY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FaGbTl7GSKY", libSceNKWebKitLegacyUnknown_FaGbTl7GSKY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_FamucWKpUiI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FamucWKpUiI", libSceNKWebKitLegacyUnknown_FamucWKpUiI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_FbgsoB_minus_Gp0k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FbgsoB-Gp0k", libSceNKWebKitLegacyUnknown_FbgsoB_minus_Gp0k_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Ff8YIEBYu24_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ff8YIEBYu24", libSceNKWebKitLegacyUnknown_Ff8YIEBYu24_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_FgU6G1oyHUk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FgU6G1oyHUk", libSceNKWebKitLegacyUnknown_FgU6G1oyHUk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Fh_minus_CX4ssmf8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Fh-CX4ssmf8", libSceNKWebKitLegacyUnknown_Fh_minus_CX4ssmf8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_FhQR7Qc_minus_hZk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FhQR7Qc-hZk", libSceNKWebKitLegacyUnknown_FhQR7Qc_minus_hZk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_FkqcX0GrERw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FkqcX0GrERw", libSceNKWebKitLegacyUnknown_FkqcX0GrERw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_FkyGnTaZnss_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FkyGnTaZnss", libSceNKWebKitLegacyUnknown_FkyGnTaZnss_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Fl1VFB0eJHM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Fl1VFB0eJHM", libSceNKWebKitLegacyUnknown_Fl1VFB0eJHM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_FoIPs0G_plus_QqM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FoIPs0G+QqM", libSceNKWebKitLegacyUnknown_FoIPs0G_plus_QqM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_FrH6fg5FSeI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FrH6fg5FSeI", libSceNKWebKitLegacyUnknown_FrH6fg5FSeI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_FtnH_plus_ny7aDw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FtnH+ny7aDw", libSceNKWebKitLegacyUnknown_FtnH_plus_ny7aDw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Fuh2NwPuKyQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Fuh2NwPuKyQ", libSceNKWebKitLegacyUnknown_Fuh2NwPuKyQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_FwLum2FjiBQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FwLum2FjiBQ", libSceNKWebKitLegacyUnknown_FwLum2FjiBQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_FwZmL9nLii0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FwZmL9nLii0", libSceNKWebKitLegacyUnknown_FwZmL9nLii0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Fy3Br9HMIi8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Fy3Br9HMIi8", libSceNKWebKitLegacyUnknown_Fy3Br9HMIi8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_FyQIb3s4_minus_Ow_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FyQIb3s4-Ow", libSceNKWebKitLegacyUnknown_FyQIb3s4_minus_Ow_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_FyfQgbZli5w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FyfQgbZli5w", libSceNKWebKitLegacyUnknown_FyfQgbZli5w_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_G0VGrAWh0Iw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("G0VGrAWh0Iw", libSceNKWebKitLegacyUnknown_G0VGrAWh0Iw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_G1RjxI6BFSg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("G1RjxI6BFSg", libSceNKWebKitLegacyUnknown_G1RjxI6BFSg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_G1vXshIWBi8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("G1vXshIWBi8", libSceNKWebKitLegacyUnknown_G1vXshIWBi8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_G30u3vZ0xGc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("G30u3vZ0xGc", libSceNKWebKitLegacyUnknown_G30u3vZ0xGc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_G43WQVeW3Bo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("G43WQVeW3Bo", libSceNKWebKitLegacyUnknown_G43WQVeW3Bo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_G4Og6jdimtI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("G4Og6jdimtI", libSceNKWebKitLegacyUnknown_G4Og6jdimtI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_G7f58FAIqec_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("G7f58FAIqec", libSceNKWebKitLegacyUnknown_G7f58FAIqec_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_G8oXWyZcgHw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("G8oXWyZcgHw", libSceNKWebKitLegacyUnknown_G8oXWyZcgHw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_G9Vx7CH6DII_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("G9Vx7CH6DII", libSceNKWebKitLegacyUnknown_G9Vx7CH6DII_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_GBrFO98kCU4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GBrFO98kCU4", libSceNKWebKitLegacyUnknown_GBrFO98kCU4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_GDA5UhZlpEQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GDA5UhZlpEQ", libSceNKWebKitLegacyUnknown_GDA5UhZlpEQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_GDHqV2AO5dU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GDHqV2AO5dU", libSceNKWebKitLegacyUnknown_GDHqV2AO5dU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_GFn06UKhyHw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GFn06UKhyHw", libSceNKWebKitLegacyUnknown_GFn06UKhyHw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_GJZYj1sMy1U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GJZYj1sMy1U", libSceNKWebKitLegacyUnknown_GJZYj1sMy1U_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_GJeqgaC2mck_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GJeqgaC2mck", libSceNKWebKitLegacyUnknown_GJeqgaC2mck_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_GMzhcYmBETc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GMzhcYmBETc", libSceNKWebKitLegacyUnknown_GMzhcYmBETc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_GPfIAuctD9U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GPfIAuctD9U", libSceNKWebKitLegacyUnknown_GPfIAuctD9U_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_GR_plus_f8ocq5VE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GR+f8ocq5VE", libSceNKWebKitLegacyUnknown_GR_plus_f8ocq5VE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_GRVtsCkrnnA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GRVtsCkrnnA", libSceNKWebKitLegacyUnknown_GRVtsCkrnnA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_GRjtnoy4iHI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GRjtnoy4iHI", libSceNKWebKitLegacyUnknown_GRjtnoy4iHI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_GRyswm3by1E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GRyswm3by1E", libSceNKWebKitLegacyUnknown_GRyswm3by1E_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_GRzmXI6WftI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GRzmXI6WftI", libSceNKWebKitLegacyUnknown_GRzmXI6WftI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_GSQjbagr8F4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GSQjbagr8F4", libSceNKWebKitLegacyUnknown_GSQjbagr8F4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_GU4AF9Yrvzw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GU4AF9Yrvzw", libSceNKWebKitLegacyUnknown_GU4AF9Yrvzw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Gak6zrIRaWo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Gak6zrIRaWo", libSceNKWebKitLegacyUnknown_Gak6zrIRaWo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_GbaStDk1a24_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GbaStDk1a24", libSceNKWebKitLegacyUnknown_GbaStDk1a24_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_GbxTmw_plus_P_minus_A4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GbxTmw+P-A4", libSceNKWebKitLegacyUnknown_GbxTmw_plus_P_minus_A4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Ggznek_plus_dXtg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ggznek+dXtg", libSceNKWebKitLegacyUnknown_Ggznek_plus_dXtg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_GiGIymC7UiI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GiGIymC7UiI", libSceNKWebKitLegacyUnknown_GiGIymC7UiI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_GiWN6uxe6TU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GiWN6uxe6TU", libSceNKWebKitLegacyUnknown_GiWN6uxe6TU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_GlIrjgdHfGc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GlIrjgdHfGc", libSceNKWebKitLegacyUnknown_GlIrjgdHfGc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_GmIN5ZvUPSM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GmIN5ZvUPSM", libSceNKWebKitLegacyUnknown_GmIN5ZvUPSM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_GnRsxVHRrro_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GnRsxVHRrro", libSceNKWebKitLegacyUnknown_GnRsxVHRrro_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_GpML4e_minus_O11Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GpML4e-O11Q", libSceNKWebKitLegacyUnknown_GpML4e_minus_O11Q_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Gqz3wQ_minus_Cnec_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Gqz3wQ-Cnec", libSceNKWebKitLegacyUnknown_Gqz3wQ_minus_Cnec_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_GrLxGc23gQc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GrLxGc23gQc", libSceNKWebKitLegacyUnknown_GrLxGc23gQc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_GsZGs1DOSWo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GsZGs1DOSWo", libSceNKWebKitLegacyUnknown_GsZGs1DOSWo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Gt5F5_minus_pfTRw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Gt5F5-pfTRw", libSceNKWebKitLegacyUnknown_Gt5F5_minus_pfTRw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_GtSIY8asgS8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GtSIY8asgS8", libSceNKWebKitLegacyUnknown_GtSIY8asgS8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_GuLJLDkyoYQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GuLJLDkyoYQ", libSceNKWebKitLegacyUnknown_GuLJLDkyoYQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_GuYMrSZQWHE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GuYMrSZQWHE", libSceNKWebKitLegacyUnknown_GuYMrSZQWHE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_GvWrHi5LzyU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GvWrHi5LzyU", libSceNKWebKitLegacyUnknown_GvWrHi5LzyU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Gw5Vza07VAM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Gw5Vza07VAM", libSceNKWebKitLegacyUnknown_Gw5Vza07VAM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_GwkxP7923yc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GwkxP7923yc", libSceNKWebKitLegacyUnknown_GwkxP7923yc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Gxt5BB8ahXg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Gxt5BB8ahXg", libSceNKWebKitLegacyUnknown_Gxt5BB8ahXg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_GyQu9uZuDXQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GyQu9uZuDXQ", libSceNKWebKitLegacyUnknown_GyQu9uZuDXQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_H_plus_BMUU6oC8s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("H+BMUU6oC8s", libSceNKWebKitLegacyUnknown_H_plus_BMUU6oC8s_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_H_plus_xN7NKoyu0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("H+xN7NKoyu0", libSceNKWebKitLegacyUnknown_H_plus_xN7NKoyu0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_H3pmc6s_minus_Yuw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("H3pmc6s-Yuw", libSceNKWebKitLegacyUnknown_H3pmc6s_minus_Yuw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_H4YH99UeGXY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("H4YH99UeGXY", libSceNKWebKitLegacyUnknown_H4YH99UeGXY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_H5CkYadPsXQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("H5CkYadPsXQ", libSceNKWebKitLegacyUnknown_H5CkYadPsXQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_H8rNrDvHhVY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("H8rNrDvHhVY", libSceNKWebKitLegacyUnknown_H8rNrDvHhVY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_H9CREnB62Lo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("H9CREnB62Lo", libSceNKWebKitLegacyUnknown_H9CREnB62Lo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_H9dlkTGyCMc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("H9dlkTGyCMc", libSceNKWebKitLegacyUnknown_H9dlkTGyCMc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_H9kEqtoTXGs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("H9kEqtoTXGs", libSceNKWebKitLegacyUnknown_H9kEqtoTXGs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_H9vHkdES8OE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("H9vHkdES8OE", libSceNKWebKitLegacyUnknown_H9vHkdES8OE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_HA2IEgsyebU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HA2IEgsyebU", libSceNKWebKitLegacyUnknown_HA2IEgsyebU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_HAfbPkozGjI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HAfbPkozGjI", libSceNKWebKitLegacyUnknown_HAfbPkozGjI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_HCqK45DPIyk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HCqK45DPIyk", libSceNKWebKitLegacyUnknown_HCqK45DPIyk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_HDnItyT5UOc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HDnItyT5UOc", libSceNKWebKitLegacyUnknown_HDnItyT5UOc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_HEo6yqMeXGc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HEo6yqMeXGc", libSceNKWebKitLegacyUnknown_HEo6yqMeXGc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_HFws8ku_minus__minus_Aw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HFws8ku--Aw", libSceNKWebKitLegacyUnknown_HFws8ku_minus__minus_Aw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_HHnnPwUh7oM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HHnnPwUh7oM", libSceNKWebKitLegacyUnknown_HHnnPwUh7oM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_HIXKlk5DVsw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HIXKlk5DVsw", libSceNKWebKitLegacyUnknown_HIXKlk5DVsw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_HJFP_plus_q84cmM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HJFP+q84cmM", libSceNKWebKitLegacyUnknown_HJFP_plus_q84cmM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_HKg0cUj4hkU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HKg0cUj4hkU", libSceNKWebKitLegacyUnknown_HKg0cUj4hkU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_HME4a24OKUo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HME4a24OKUo", libSceNKWebKitLegacyUnknown_HME4a24OKUo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_HRCfQVxjVQ4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HRCfQVxjVQ4", libSceNKWebKitLegacyUnknown_HRCfQVxjVQ4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_HRFf_minus_IW_plus_9h4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HRFf-IW+9h4", libSceNKWebKitLegacyUnknown_HRFf_minus_IW_plus_9h4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_HT8ovS_minus_O_plus_qI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HT8ovS-O+qI", libSceNKWebKitLegacyUnknown_HT8ovS_minus_O_plus_qI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_HTpFP1m31J8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HTpFP1m31J8", libSceNKWebKitLegacyUnknown_HTpFP1m31J8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_HW0KT3iPct8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HW0KT3iPct8", libSceNKWebKitLegacyUnknown_HW0KT3iPct8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_HWOIqk8iU3c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HWOIqk8iU3c", libSceNKWebKitLegacyUnknown_HWOIqk8iU3c_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_HXFeUnyqnHE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HXFeUnyqnHE", libSceNKWebKitLegacyUnknown_HXFeUnyqnHE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_HXc9paDU7vM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HXc9paDU7vM", libSceNKWebKitLegacyUnknown_HXc9paDU7vM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_HYCMyLzgjyE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HYCMyLzgjyE", libSceNKWebKitLegacyUnknown_HYCMyLzgjyE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Ha8E_minus_qWvyWc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ha8E-qWvyWc", libSceNKWebKitLegacyUnknown_Ha8E_minus_qWvyWc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Hd7DOz4Bih8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Hd7DOz4Bih8", libSceNKWebKitLegacyUnknown_Hd7DOz4Bih8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Heb0_plus_T4zTGo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Heb0+T4zTGo", libSceNKWebKitLegacyUnknown_Heb0_plus_T4zTGo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_HgPiXeD6iK8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HgPiXeD6iK8", libSceNKWebKitLegacyUnknown_HgPiXeD6iK8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_HhV2Og_minus_Q_plus_yA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HhV2Og-Q+yA", libSceNKWebKitLegacyUnknown_HhV2Og_minus_Q_plus_yA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_HjIpHPp6ZTU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HjIpHPp6ZTU", libSceNKWebKitLegacyUnknown_HjIpHPp6ZTU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_HvjZPtAnjuQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HvjZPtAnjuQ", libSceNKWebKitLegacyUnknown_HvjZPtAnjuQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_HwzmV2hFl78_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HwzmV2hFl78", libSceNKWebKitLegacyUnknown_HwzmV2hFl78_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_HzB_plus_FOawf44_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HzB+FOawf44", libSceNKWebKitLegacyUnknown_HzB_plus_FOawf44_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_I45yc4MY9nc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("I45yc4MY9nc", libSceNKWebKitLegacyUnknown_I45yc4MY9nc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_I5UU_minus_OsptFI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("I5UU-OsptFI", libSceNKWebKitLegacyUnknown_I5UU_minus_OsptFI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_I5ysvI_minus_IIJw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("I5ysvI-IIJw", libSceNKWebKitLegacyUnknown_I5ysvI_minus_IIJw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_I9SizkX_plus_i5Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("I9SizkX+i5Y", libSceNKWebKitLegacyUnknown_I9SizkX_plus_i5Y_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_IBWy9uGWcp8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IBWy9uGWcp8", libSceNKWebKitLegacyUnknown_IBWy9uGWcp8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_IE0xYGwycW0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IE0xYGwycW0", libSceNKWebKitLegacyUnknown_IE0xYGwycW0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_IEXEP8fmFr8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IEXEP8fmFr8", libSceNKWebKitLegacyUnknown_IEXEP8fmFr8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_IGd5X5j9_plus_Dc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IGd5X5j9+Dc", libSceNKWebKitLegacyUnknown_IGd5X5j9_plus_Dc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_IK6MOOvNFqY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IK6MOOvNFqY", libSceNKWebKitLegacyUnknown_IK6MOOvNFqY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_IKfl43nS_plus_JM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IKfl43nS+JM", libSceNKWebKitLegacyUnknown_IKfl43nS_plus_JM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_IQHXZTYq3X8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IQHXZTYq3X8", libSceNKWebKitLegacyUnknown_IQHXZTYq3X8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_IRLQrLWkA_minus_M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IRLQrLWkA-M", libSceNKWebKitLegacyUnknown_IRLQrLWkA_minus_M_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_IRYhi2PKG9M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IRYhi2PKG9M", libSceNKWebKitLegacyUnknown_IRYhi2PKG9M_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ISssLJI2eC8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ISssLJI2eC8", libSceNKWebKitLegacyUnknown_ISssLJI2eC8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_IUY0ho_minus_22JE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IUY0ho-22JE", libSceNKWebKitLegacyUnknown_IUY0ho_minus_22JE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_IVHQGH8yyB4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IVHQGH8yyB4", libSceNKWebKitLegacyUnknown_IVHQGH8yyB4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_IVjy5rAsRjI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IVjy5rAsRjI", libSceNKWebKitLegacyUnknown_IVjy5rAsRjI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Ifa0CArZ1Yg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ifa0CArZ1Yg", libSceNKWebKitLegacyUnknown_Ifa0CArZ1Yg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_IiMePajfzUI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IiMePajfzUI", libSceNKWebKitLegacyUnknown_IiMePajfzUI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_IiTx9BwArWM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IiTx9BwArWM", libSceNKWebKitLegacyUnknown_IiTx9BwArWM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_IiafdfHa2bc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IiafdfHa2bc", libSceNKWebKitLegacyUnknown_IiafdfHa2bc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_IitctlDZLbw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IitctlDZLbw", libSceNKWebKitLegacyUnknown_IitctlDZLbw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_IknlaoECxqg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IknlaoECxqg", libSceNKWebKitLegacyUnknown_IknlaoECxqg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_IlMM_minus_ZmxY28_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IlMM-ZmxY28", libSceNKWebKitLegacyUnknown_IlMM_minus_ZmxY28_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_InrAKcZaX_minus_A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("InrAKcZaX-A", libSceNKWebKitLegacyUnknown_InrAKcZaX_minus_A_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_IoNVJKklWm0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IoNVJKklWm0", libSceNKWebKitLegacyUnknown_IoNVJKklWm0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_IqZuVex4Q7k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IqZuVex4Q7k", libSceNKWebKitLegacyUnknown_IqZuVex4Q7k_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Is_minus_YM6hO4hw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Is-YM6hO4hw", libSceNKWebKitLegacyUnknown_Is_minus_YM6hO4hw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_IsauUl8mDDY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IsauUl8mDDY", libSceNKWebKitLegacyUnknown_IsauUl8mDDY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_IthJS_minus_ZcEV4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IthJS-ZcEV4", libSceNKWebKitLegacyUnknown_IthJS_minus_ZcEV4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_IuGjnl4i730_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IuGjnl4i730", libSceNKWebKitLegacyUnknown_IuGjnl4i730_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Iw5XW_minus_1wgr0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Iw5XW-1wgr0", libSceNKWebKitLegacyUnknown_Iw5XW_minus_1wgr0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_IxIUdWwopT0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IxIUdWwopT0", libSceNKWebKitLegacyUnknown_IxIUdWwopT0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_J_plus_oVFGsb0Qg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("J+oVFGsb0Qg", libSceNKWebKitLegacyUnknown_J_plus_oVFGsb0Qg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_J0bGGwdIfhk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("J0bGGwdIfhk", libSceNKWebKitLegacyUnknown_J0bGGwdIfhk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_J1qKTkCk00o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("J1qKTkCk00o", libSceNKWebKitLegacyUnknown_J1qKTkCk00o_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_J2L1Rr_minus_IbE8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("J2L1Rr-IbE8", libSceNKWebKitLegacyUnknown_J2L1Rr_minus_IbE8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_J48l6n1RaV4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("J48l6n1RaV4", libSceNKWebKitLegacyUnknown_J48l6n1RaV4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_J4FBpvaSdJA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("J4FBpvaSdJA", libSceNKWebKitLegacyUnknown_J4FBpvaSdJA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_J4MWXF1kCdQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("J4MWXF1kCdQ", libSceNKWebKitLegacyUnknown_J4MWXF1kCdQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_J7UlpDGmVaI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("J7UlpDGmVaI", libSceNKWebKitLegacyUnknown_J7UlpDGmVaI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_J7ZwIjC_minus_NF4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("J7ZwIjC-NF4", libSceNKWebKitLegacyUnknown_J7ZwIjC_minus_NF4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_J8US_plus_J_minus_vRnI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("J8US+J-vRnI", libSceNKWebKitLegacyUnknown_J8US_plus_J_minus_vRnI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_J9u8UeS_plus_3ZU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("J9u8UeS+3ZU", libSceNKWebKitLegacyUnknown_J9u8UeS_plus_3ZU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_JAzqiBpYj_minus_0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JAzqiBpYj-0", libSceNKWebKitLegacyUnknown_JAzqiBpYj_minus_0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_JCGNnROcK6w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JCGNnROcK6w", libSceNKWebKitLegacyUnknown_JCGNnROcK6w_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_JEC0lbbB2gU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JEC0lbbB2gU", libSceNKWebKitLegacyUnknown_JEC0lbbB2gU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_JEcmyPMu0mU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JEcmyPMu0mU", libSceNKWebKitLegacyUnknown_JEcmyPMu0mU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_JEwTPXFKpS4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JEwTPXFKpS4", libSceNKWebKitLegacyUnknown_JEwTPXFKpS4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_JML3Tj99IdM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JML3Tj99IdM", libSceNKWebKitLegacyUnknown_JML3Tj99IdM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_JMap_plus_RuWCso_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JMap+RuWCso", libSceNKWebKitLegacyUnknown_JMap_plus_RuWCso_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_JMpyFyWW4sQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JMpyFyWW4sQ", libSceNKWebKitLegacyUnknown_JMpyFyWW4sQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_JQkp_plus_nemtRY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JQkp+nemtRY", libSceNKWebKitLegacyUnknown_JQkp_plus_nemtRY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_JT4sPygD4nc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JT4sPygD4nc", libSceNKWebKitLegacyUnknown_JT4sPygD4nc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_JUjyOzXdCWc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JUjyOzXdCWc", libSceNKWebKitLegacyUnknown_JUjyOzXdCWc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_JV2k5nGxZS4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JV2k5nGxZS4", libSceNKWebKitLegacyUnknown_JV2k5nGxZS4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_JWTacfe3XYY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JWTacfe3XYY", libSceNKWebKitLegacyUnknown_JWTacfe3XYY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_JaFNOBMM5rA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JaFNOBMM5rA", libSceNKWebKitLegacyUnknown_JaFNOBMM5rA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_JbIQkQ1snOo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JbIQkQ1snOo", libSceNKWebKitLegacyUnknown_JbIQkQ1snOo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_JhuM8xmtn6E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JhuM8xmtn6E", libSceNKWebKitLegacyUnknown_JhuM8xmtn6E_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_JlbgPGsx3oU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JlbgPGsx3oU", libSceNKWebKitLegacyUnknown_JlbgPGsx3oU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_JmwlvppRWE4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JmwlvppRWE4", libSceNKWebKitLegacyUnknown_JmwlvppRWE4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Jo3nZh3qW_minus_E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Jo3nZh3qW-E", libSceNKWebKitLegacyUnknown_Jo3nZh3qW_minus_E_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_JqkF17rNelU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JqkF17rNelU", libSceNKWebKitLegacyUnknown_JqkF17rNelU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Jr1tSCtuUiY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Jr1tSCtuUiY", libSceNKWebKitLegacyUnknown_Jr1tSCtuUiY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_JsCJTp_plus_PHMc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JsCJTp+PHMc", libSceNKWebKitLegacyUnknown_JsCJTp_plus_PHMc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_JvOPWYEC8Ac_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JvOPWYEC8Ac", libSceNKWebKitLegacyUnknown_JvOPWYEC8Ac_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_JzGiDlmIxsI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JzGiDlmIxsI", libSceNKWebKitLegacyUnknown_JzGiDlmIxsI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_K_plus_InrvOGqvo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("K+InrvOGqvo", libSceNKWebKitLegacyUnknown_K_plus_InrvOGqvo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_K67v9Ocojlk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("K67v9Ocojlk", libSceNKWebKitLegacyUnknown_K67v9Ocojlk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_K7eIytThnzg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("K7eIytThnzg", libSceNKWebKitLegacyUnknown_K7eIytThnzg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_KAtBjvAqdeM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KAtBjvAqdeM", libSceNKWebKitLegacyUnknown_KAtBjvAqdeM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_KMGUMPfAJo4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KMGUMPfAJo4", libSceNKWebKitLegacyUnknown_KMGUMPfAJo4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_KN6UJcgVrI8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KN6UJcgVrI8", libSceNKWebKitLegacyUnknown_KN6UJcgVrI8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_KQFqO8W4q0Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KQFqO8W4q0Y", libSceNKWebKitLegacyUnknown_KQFqO8W4q0Y_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_KQSSDOhD9JQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KQSSDOhD9JQ", libSceNKWebKitLegacyUnknown_KQSSDOhD9JQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_KbeBjjWXFiU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KbeBjjWXFiU", libSceNKWebKitLegacyUnknown_KbeBjjWXFiU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_KbrWG6wNosM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KbrWG6wNosM", libSceNKWebKitLegacyUnknown_KbrWG6wNosM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_KdodA4V3qgY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KdodA4V3qgY", libSceNKWebKitLegacyUnknown_KdodA4V3qgY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_KfCkq5bmAe8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KfCkq5bmAe8", libSceNKWebKitLegacyUnknown_KfCkq5bmAe8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_KfLzRLJd85c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KfLzRLJd85c", libSceNKWebKitLegacyUnknown_KfLzRLJd85c_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_KgQLdQ0w2r0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KgQLdQ0w2r0", libSceNKWebKitLegacyUnknown_KgQLdQ0w2r0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_KhNPclgFOIM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KhNPclgFOIM", libSceNKWebKitLegacyUnknown_KhNPclgFOIM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_KjDDu4tYcyk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KjDDu4tYcyk", libSceNKWebKitLegacyUnknown_KjDDu4tYcyk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_KjfjFCr_minus_FwY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KjfjFCr-FwY", libSceNKWebKitLegacyUnknown_KjfjFCr_minus_FwY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_KjosapOEgbc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KjosapOEgbc", libSceNKWebKitLegacyUnknown_KjosapOEgbc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_KnQ5SdQ4FxU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KnQ5SdQ4FxU", libSceNKWebKitLegacyUnknown_KnQ5SdQ4FxU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Knnq2wiIFDE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Knnq2wiIFDE", libSceNKWebKitLegacyUnknown_Knnq2wiIFDE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_KpJXyTP7N7Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KpJXyTP7N7Y", libSceNKWebKitLegacyUnknown_KpJXyTP7N7Y_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Ks3ryhyLfOE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ks3ryhyLfOE", libSceNKWebKitLegacyUnknown_Ks3ryhyLfOE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Ksofj08b_plus_b8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ksofj08b+b8", libSceNKWebKitLegacyUnknown_Ksofj08b_plus_b8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Kt_plus_4DRHYz_plus_o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Kt+4DRHYz+o", libSceNKWebKitLegacyUnknown_Kt_plus_4DRHYz_plus_o_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_KtMM_minus_5WGMnQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KtMM-5WGMnQ", libSceNKWebKitLegacyUnknown_KtMM_minus_5WGMnQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_KwVnRtplhDU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KwVnRtplhDU", libSceNKWebKitLegacyUnknown_KwVnRtplhDU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_KyYcTJPssvU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KyYcTJPssvU", libSceNKWebKitLegacyUnknown_KyYcTJPssvU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_KzCSdPeqlt0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KzCSdPeqlt0", libSceNKWebKitLegacyUnknown_KzCSdPeqlt0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_L_minus_kFwFmRVQc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("L-kFwFmRVQc", libSceNKWebKitLegacyUnknown_L_minus_kFwFmRVQc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_L5fhPLk1uak_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("L5fhPLk1uak", libSceNKWebKitLegacyUnknown_L5fhPLk1uak_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_L8RmHugddLk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("L8RmHugddLk", libSceNKWebKitLegacyUnknown_L8RmHugddLk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_LAXPlDvApHg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LAXPlDvApHg", libSceNKWebKitLegacyUnknown_LAXPlDvApHg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_LCinyLbasnU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LCinyLbasnU", libSceNKWebKitLegacyUnknown_LCinyLbasnU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_LDgc9wGxxEQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LDgc9wGxxEQ", libSceNKWebKitLegacyUnknown_LDgc9wGxxEQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_LG9TwFMFa6w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LG9TwFMFa6w", libSceNKWebKitLegacyUnknown_LG9TwFMFa6w_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_LNuuQgbgxCE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LNuuQgbgxCE", libSceNKWebKitLegacyUnknown_LNuuQgbgxCE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_LPR1Xoax82w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LPR1Xoax82w", libSceNKWebKitLegacyUnknown_LPR1Xoax82w_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_LPXrs0psMG8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LPXrs0psMG8", libSceNKWebKitLegacyUnknown_LPXrs0psMG8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_LRDUvLHRY5A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LRDUvLHRY5A", libSceNKWebKitLegacyUnknown_LRDUvLHRY5A_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_LUARjf_minus_LuyQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LUARjf-LuyQ", libSceNKWebKitLegacyUnknown_LUARjf_minus_LuyQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_LUWh4Vaivfk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LUWh4Vaivfk", libSceNKWebKitLegacyUnknown_LUWh4Vaivfk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_LXSxok_minus_AfFY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LXSxok-AfFY", libSceNKWebKitLegacyUnknown_LXSxok_minus_AfFY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_LYzR6YTZDAY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LYzR6YTZDAY", libSceNKWebKitLegacyUnknown_LYzR6YTZDAY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_LcpGxUvT5E0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LcpGxUvT5E0", libSceNKWebKitLegacyUnknown_LcpGxUvT5E0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Ldf7UpFfDEI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ldf7UpFfDEI", libSceNKWebKitLegacyUnknown_Ldf7UpFfDEI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_LfZcWFkd3xg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LfZcWFkd3xg", libSceNKWebKitLegacyUnknown_LfZcWFkd3xg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_LfjVIt9q60k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LfjVIt9q60k", libSceNKWebKitLegacyUnknown_LfjVIt9q60k_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Lgn3VirnPms_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Lgn3VirnPms", libSceNKWebKitLegacyUnknown_Lgn3VirnPms_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_LhVX0MoZqvQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LhVX0MoZqvQ", libSceNKWebKitLegacyUnknown_LhVX0MoZqvQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Lie4WB59IKE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Lie4WB59IKE", libSceNKWebKitLegacyUnknown_Lie4WB59IKE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_LjoYwmMxdek_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LjoYwmMxdek", libSceNKWebKitLegacyUnknown_LjoYwmMxdek_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Lkshkij4gp8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Lkshkij4gp8", libSceNKWebKitLegacyUnknown_Lkshkij4gp8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Ll7geN7OE0c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ll7geN7OE0c", libSceNKWebKitLegacyUnknown_Ll7geN7OE0c_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_LmAqwKsb97g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LmAqwKsb97g", libSceNKWebKitLegacyUnknown_LmAqwKsb97g_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_LpI1Qlzmpco_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LpI1Qlzmpco", libSceNKWebKitLegacyUnknown_LpI1Qlzmpco_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_LtA5aM_minus_3lbw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LtA5aM-3lbw", libSceNKWebKitLegacyUnknown_LtA5aM_minus_3lbw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_LtXxp9OpEPI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LtXxp9OpEPI", libSceNKWebKitLegacyUnknown_LtXxp9OpEPI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_LuDSC7EdhME_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LuDSC7EdhME", libSceNKWebKitLegacyUnknown_LuDSC7EdhME_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Lv_plus_HgpCH0l4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Lv+HgpCH0l4", libSceNKWebKitLegacyUnknown_Lv_plus_HgpCH0l4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Lw4mW6vvqk0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Lw4mW6vvqk0", libSceNKWebKitLegacyUnknown_Lw4mW6vvqk0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_LwZikYLMqm8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LwZikYLMqm8", libSceNKWebKitLegacyUnknown_LwZikYLMqm8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Lxk6KBx9R2Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Lxk6KBx9R2Y", libSceNKWebKitLegacyUnknown_Lxk6KBx9R2Y_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_M_plus_ElTgUSbuc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("M+ElTgUSbuc", libSceNKWebKitLegacyUnknown_M_plus_ElTgUSbuc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_M1CvsjqkJhs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("M1CvsjqkJhs", libSceNKWebKitLegacyUnknown_M1CvsjqkJhs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_M1oyrqKQAK8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("M1oyrqKQAK8", libSceNKWebKitLegacyUnknown_M1oyrqKQAK8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_M2qSGvpmhFQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("M2qSGvpmhFQ", libSceNKWebKitLegacyUnknown_M2qSGvpmhFQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_M4AQDDBAdoQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("M4AQDDBAdoQ", libSceNKWebKitLegacyUnknown_M4AQDDBAdoQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_M6QbxqVTnxQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("M6QbxqVTnxQ", libSceNKWebKitLegacyUnknown_M6QbxqVTnxQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_M6w_minus_7bUrYGE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("M6w-7bUrYGE", libSceNKWebKitLegacyUnknown_M6w_minus_7bUrYGE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_M704rXTcR0U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("M704rXTcR0U", libSceNKWebKitLegacyUnknown_M704rXTcR0U_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_M7mvWG7IyPw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("M7mvWG7IyPw", libSceNKWebKitLegacyUnknown_M7mvWG7IyPw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_M7o1DcnrzY4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("M7o1DcnrzY4", libSceNKWebKitLegacyUnknown_M7o1DcnrzY4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_MFnPTtcUaaI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MFnPTtcUaaI", libSceNKWebKitLegacyUnknown_MFnPTtcUaaI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_MGUslo9y4pk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MGUslo9y4pk", libSceNKWebKitLegacyUnknown_MGUslo9y4pk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_MGsRyeabMac_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MGsRyeabMac", libSceNKWebKitLegacyUnknown_MGsRyeabMac_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_MHKqp9DcHxg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MHKqp9DcHxg", libSceNKWebKitLegacyUnknown_MHKqp9DcHxg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_MHNehRu9aiA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MHNehRu9aiA", libSceNKWebKitLegacyUnknown_MHNehRu9aiA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_MHViGeMRIts_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MHViGeMRIts", libSceNKWebKitLegacyUnknown_MHViGeMRIts_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_MJaz3ZdDGXM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MJaz3ZdDGXM", libSceNKWebKitLegacyUnknown_MJaz3ZdDGXM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_MM4H2zXQPNk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MM4H2zXQPNk", libSceNKWebKitLegacyUnknown_MM4H2zXQPNk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_MMbG34X_plus_eNs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MMbG34X+eNs", libSceNKWebKitLegacyUnknown_MMbG34X_plus_eNs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_MQCz1XFMyMI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MQCz1XFMyMI", libSceNKWebKitLegacyUnknown_MQCz1XFMyMI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_MQaz32JQzWE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MQaz32JQzWE", libSceNKWebKitLegacyUnknown_MQaz32JQzWE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_MRWmhIY5G1A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MRWmhIY5G1A", libSceNKWebKitLegacyUnknown_MRWmhIY5G1A_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_MReN_minus_ksLzMA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MReN-ksLzMA", libSceNKWebKitLegacyUnknown_MReN_minus_ksLzMA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_MSsDM4u1jQw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MSsDM4u1jQw", libSceNKWebKitLegacyUnknown_MSsDM4u1jQw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_MUfRnfkRncU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MUfRnfkRncU", libSceNKWebKitLegacyUnknown_MUfRnfkRncU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_MUyBSmwGR3w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MUyBSmwGR3w", libSceNKWebKitLegacyUnknown_MUyBSmwGR3w_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_MXD4s01fNmw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MXD4s01fNmw", libSceNKWebKitLegacyUnknown_MXD4s01fNmw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_MYnZJQWLNog_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MYnZJQWLNog", libSceNKWebKitLegacyUnknown_MYnZJQWLNog_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_MaSYk4D3OgU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MaSYk4D3OgU", libSceNKWebKitLegacyUnknown_MaSYk4D3OgU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Maa_minus_feacM3k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Maa-feacM3k", libSceNKWebKitLegacyUnknown_Maa_minus_feacM3k_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Mc_minus_9bwQuK6o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Mc-9bwQuK6o", libSceNKWebKitLegacyUnknown_Mc_minus_9bwQuK6o_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_McPcQ_plus_8HesY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("McPcQ+8HesY", libSceNKWebKitLegacyUnknown_McPcQ_plus_8HesY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_MeAJyg5gq58_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MeAJyg5gq58", libSceNKWebKitLegacyUnknown_MeAJyg5gq58_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_MeogIIr66Ew_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MeogIIr66Ew", libSceNKWebKitLegacyUnknown_MeogIIr66Ew_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_MhMNLxT8xOU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MhMNLxT8xOU", libSceNKWebKitLegacyUnknown_MhMNLxT8xOU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_MiQralGSkeo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MiQralGSkeo", libSceNKWebKitLegacyUnknown_MiQralGSkeo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Mkr_plus_ZvMqMPE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Mkr+ZvMqMPE", libSceNKWebKitLegacyUnknown_Mkr_plus_ZvMqMPE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_MlO_plus_RK1HoyI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MlO+RK1HoyI", libSceNKWebKitLegacyUnknown_MlO_plus_RK1HoyI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_MmJGKpfVpZo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MmJGKpfVpZo", libSceNKWebKitLegacyUnknown_MmJGKpfVpZo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Mo4KJwvZPxc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Mo4KJwvZPxc", libSceNKWebKitLegacyUnknown_Mo4KJwvZPxc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_MpI2NyWcgaQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MpI2NyWcgaQ", libSceNKWebKitLegacyUnknown_MpI2NyWcgaQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_MqLIXYTJPR8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MqLIXYTJPR8", libSceNKWebKitLegacyUnknown_MqLIXYTJPR8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_MsZr4Y9YsYU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MsZr4Y9YsYU", libSceNKWebKitLegacyUnknown_MsZr4Y9YsYU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_MxDsAIPWad4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MxDsAIPWad4", libSceNKWebKitLegacyUnknown_MxDsAIPWad4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_MzsdXuP_minus_TTs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MzsdXuP-TTs", libSceNKWebKitLegacyUnknown_MzsdXuP_minus_TTs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_N0U6ySGTkHI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("N0U6ySGTkHI", libSceNKWebKitLegacyUnknown_N0U6ySGTkHI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_N1rKdeTQ22s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("N1rKdeTQ22s", libSceNKWebKitLegacyUnknown_N1rKdeTQ22s_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_N2ZPBAvQ4P4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("N2ZPBAvQ4P4", libSceNKWebKitLegacyUnknown_N2ZPBAvQ4P4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_N61c8_plus_bAHYA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("N61c8+bAHYA", libSceNKWebKitLegacyUnknown_N61c8_plus_bAHYA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_N6Bb9tOzbOE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("N6Bb9tOzbOE", libSceNKWebKitLegacyUnknown_N6Bb9tOzbOE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_N6Y0fJoacEU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("N6Y0fJoacEU", libSceNKWebKitLegacyUnknown_N6Y0fJoacEU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_NBgXD4SrmfY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NBgXD4SrmfY", libSceNKWebKitLegacyUnknown_NBgXD4SrmfY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_NDFvu6iq9PE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NDFvu6iq9PE", libSceNKWebKitLegacyUnknown_NDFvu6iq9PE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_NDJ1JNuoSNI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NDJ1JNuoSNI", libSceNKWebKitLegacyUnknown_NDJ1JNuoSNI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_NDecA6TqMWI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NDecA6TqMWI", libSceNKWebKitLegacyUnknown_NDecA6TqMWI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_NFiMz6zysyI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NFiMz6zysyI", libSceNKWebKitLegacyUnknown_NFiMz6zysyI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_NGfsoXi2arU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NGfsoXi2arU", libSceNKWebKitLegacyUnknown_NGfsoXi2arU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_NH8C4UTIAG0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NH8C4UTIAG0", libSceNKWebKitLegacyUnknown_NH8C4UTIAG0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_NIq7Ht4pOnw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NIq7Ht4pOnw", libSceNKWebKitLegacyUnknown_NIq7Ht4pOnw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_NM2sfG425Ks_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NM2sfG425Ks", libSceNKWebKitLegacyUnknown_NM2sfG425Ks_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_NMXJOYzVUWk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NMXJOYzVUWk", libSceNKWebKitLegacyUnknown_NMXJOYzVUWk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_NMtDf5GMwo0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NMtDf5GMwo0", libSceNKWebKitLegacyUnknown_NMtDf5GMwo0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_NO9mhkI0uzY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NO9mhkI0uzY", libSceNKWebKitLegacyUnknown_NO9mhkI0uzY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_NPVjik59zT0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NPVjik59zT0", libSceNKWebKitLegacyUnknown_NPVjik59zT0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_NRPEF7lw_plus_Lk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NRPEF7lw+Lk", libSceNKWebKitLegacyUnknown_NRPEF7lw_plus_Lk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_NRwbrebG1RI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NRwbrebG1RI", libSceNKWebKitLegacyUnknown_NRwbrebG1RI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_NTV7JIcSG3s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NTV7JIcSG3s", libSceNKWebKitLegacyUnknown_NTV7JIcSG3s_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_NTY7MAqUV0k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NTY7MAqUV0k", libSceNKWebKitLegacyUnknown_NTY7MAqUV0k_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_NTuEbbLnmjw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NTuEbbLnmjw", libSceNKWebKitLegacyUnknown_NTuEbbLnmjw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_NUOb_plus_z3WQ5A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NUOb+z3WQ5A", libSceNKWebKitLegacyUnknown_NUOb_plus_z3WQ5A_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_NUqwHobH5SY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NUqwHobH5SY", libSceNKWebKitLegacyUnknown_NUqwHobH5SY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_NVsPBrf4TV8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NVsPBrf4TV8", libSceNKWebKitLegacyUnknown_NVsPBrf4TV8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_NXKFbxr0xFI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NXKFbxr0xFI", libSceNKWebKitLegacyUnknown_NXKFbxr0xFI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_NXkvdp_minus_rsg8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NXkvdp-rsg8", libSceNKWebKitLegacyUnknown_NXkvdp_minus_rsg8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_NZjxIjwuSuQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NZjxIjwuSuQ", libSceNKWebKitLegacyUnknown_NZjxIjwuSuQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_NeBjCy2urKA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NeBjCy2urKA", libSceNKWebKitLegacyUnknown_NeBjCy2urKA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Nf_minus_OGV9Nx6I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Nf-OGV9Nx6I", libSceNKWebKitLegacyUnknown_Nf_minus_OGV9Nx6I_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_NlCqp_minus_s1Btc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NlCqp-s1Btc", libSceNKWebKitLegacyUnknown_NlCqp_minus_s1Btc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_NlXWVHo_plus_9lI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NlXWVHo+9lI", libSceNKWebKitLegacyUnknown_NlXWVHo_plus_9lI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_NoAtTlpb3tg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NoAtTlpb3tg", libSceNKWebKitLegacyUnknown_NoAtTlpb3tg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_NsvNBGoyTLo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NsvNBGoyTLo", libSceNKWebKitLegacyUnknown_NsvNBGoyTLo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_NtBJpphF4R0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NtBJpphF4R0", libSceNKWebKitLegacyUnknown_NtBJpphF4R0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_NwfBp8_plus_IAFk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NwfBp8+IAFk", libSceNKWebKitLegacyUnknown_NwfBp8_plus_IAFk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_NxHsvCeeBmE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NxHsvCeeBmE", libSceNKWebKitLegacyUnknown_NxHsvCeeBmE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_NyQ1zvjWDBQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NyQ1zvjWDBQ", libSceNKWebKitLegacyUnknown_NyQ1zvjWDBQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_O172A7JvUxE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("O172A7JvUxE", libSceNKWebKitLegacyUnknown_O172A7JvUxE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_O2BqIB6Lx44_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("O2BqIB6Lx44", libSceNKWebKitLegacyUnknown_O2BqIB6Lx44_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_O2MUM522wd4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("O2MUM522wd4", libSceNKWebKitLegacyUnknown_O2MUM522wd4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_O3YLX2pzow4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("O3YLX2pzow4", libSceNKWebKitLegacyUnknown_O3YLX2pzow4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_O7svMQwjr_plus_w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("O7svMQwjr+w", libSceNKWebKitLegacyUnknown_O7svMQwjr_plus_w_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_O81B1G4VdKw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("O81B1G4VdKw", libSceNKWebKitLegacyUnknown_O81B1G4VdKw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_O95ij_plus_4uvh8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("O95ij+4uvh8", libSceNKWebKitLegacyUnknown_O95ij_plus_4uvh8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_OAWKIXxSRSc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OAWKIXxSRSc", libSceNKWebKitLegacyUnknown_OAWKIXxSRSc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_OD0u88wuP78_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OD0u88wuP78", libSceNKWebKitLegacyUnknown_OD0u88wuP78_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_OEtF_minus_8T3cN8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OEtF-8T3cN8", libSceNKWebKitLegacyUnknown_OEtF_minus_8T3cN8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_OGAnhdA1OMk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OGAnhdA1OMk", libSceNKWebKitLegacyUnknown_OGAnhdA1OMk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_OIypNkAP7ik_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OIypNkAP7ik", libSceNKWebKitLegacyUnknown_OIypNkAP7ik_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_OJd0bIxwg0E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OJd0bIxwg0E", libSceNKWebKitLegacyUnknown_OJd0bIxwg0E_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_OLMJwrBsDng_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OLMJwrBsDng", libSceNKWebKitLegacyUnknown_OLMJwrBsDng_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_OMAYDli_minus_mdA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OMAYDli-mdA", libSceNKWebKitLegacyUnknown_OMAYDli_minus_mdA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_OMmHcRMQOAc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OMmHcRMQOAc", libSceNKWebKitLegacyUnknown_OMmHcRMQOAc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_OOGKeH9U85M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OOGKeH9U85M", libSceNKWebKitLegacyUnknown_OOGKeH9U85M_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_OQK15N2qqpc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OQK15N2qqpc", libSceNKWebKitLegacyUnknown_OQK15N2qqpc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ORRr3FoycIg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ORRr3FoycIg", libSceNKWebKitLegacyUnknown_ORRr3FoycIg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ORi3kf_plus_dya8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ORi3kf+dya8", libSceNKWebKitLegacyUnknown_ORi3kf_plus_dya8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_OVFr_plus_OvcYRY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OVFr+OvcYRY", libSceNKWebKitLegacyUnknown_OVFr_plus_OvcYRY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_OVR7jc8mpFQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OVR7jc8mpFQ", libSceNKWebKitLegacyUnknown_OVR7jc8mpFQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_OWgBI2ZiSLg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OWgBI2ZiSLg", libSceNKWebKitLegacyUnknown_OWgBI2ZiSLg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Oa4DkE23caQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Oa4DkE23caQ", libSceNKWebKitLegacyUnknown_Oa4DkE23caQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_OaBNSvmGtv4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OaBNSvmGtv4", libSceNKWebKitLegacyUnknown_OaBNSvmGtv4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ObWxi4aV0Fs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ObWxi4aV0Fs", libSceNKWebKitLegacyUnknown_ObWxi4aV0Fs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_OcXqr0lwnSc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OcXqr0lwnSc", libSceNKWebKitLegacyUnknown_OcXqr0lwnSc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_OgEd4N62_minus_dg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OgEd4N62-dg", libSceNKWebKitLegacyUnknown_OgEd4N62_minus_dg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_OhGxI60LXPo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OhGxI60LXPo", libSceNKWebKitLegacyUnknown_OhGxI60LXPo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_OhnH8C16wZc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OhnH8C16wZc", libSceNKWebKitLegacyUnknown_OhnH8C16wZc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_OilqfSGtoCk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OilqfSGtoCk", libSceNKWebKitLegacyUnknown_OilqfSGtoCk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_On5Zzm0ftIc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("On5Zzm0ftIc", libSceNKWebKitLegacyUnknown_On5Zzm0ftIc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_OnFvmA5G_plus_Y8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OnFvmA5G+Y8", libSceNKWebKitLegacyUnknown_OnFvmA5G_plus_Y8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_OnOrY8PLUjs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OnOrY8PLUjs", libSceNKWebKitLegacyUnknown_OnOrY8PLUjs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Onj_plus_Mfcmrzg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Onj+Mfcmrzg", libSceNKWebKitLegacyUnknown_Onj_plus_Mfcmrzg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Oo_minus_hIEH2WdI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Oo-hIEH2WdI", libSceNKWebKitLegacyUnknown_Oo_minus_hIEH2WdI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_OpnuHE0j6kE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OpnuHE0j6kE", libSceNKWebKitLegacyUnknown_OpnuHE0j6kE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Oq_minus_KLpNjd1U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Oq-KLpNjd1U", libSceNKWebKitLegacyUnknown_Oq_minus_KLpNjd1U_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_OqA30GvDJP0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OqA30GvDJP0", libSceNKWebKitLegacyUnknown_OqA30GvDJP0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Orf2rx4UpaQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Orf2rx4UpaQ", libSceNKWebKitLegacyUnknown_Orf2rx4UpaQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_OvpZv1jKQtw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OvpZv1jKQtw", libSceNKWebKitLegacyUnknown_OvpZv1jKQtw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Oz5tpCZoK_plus_s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Oz5tpCZoK+s", libSceNKWebKitLegacyUnknown_Oz5tpCZoK_plus_s_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_P0M0YeyW_plus_Lo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("P0M0YeyW+Lo", libSceNKWebKitLegacyUnknown_P0M0YeyW_plus_Lo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_P0uFWnN7IWs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("P0uFWnN7IWs", libSceNKWebKitLegacyUnknown_P0uFWnN7IWs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_P2GaYQ7Y4lg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("P2GaYQ7Y4lg", libSceNKWebKitLegacyUnknown_P2GaYQ7Y4lg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_P2SmsaHHQRM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("P2SmsaHHQRM", libSceNKWebKitLegacyUnknown_P2SmsaHHQRM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_P4AZdmrG9iQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("P4AZdmrG9iQ", libSceNKWebKitLegacyUnknown_P4AZdmrG9iQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_P6Fc747iUjI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("P6Fc747iUjI", libSceNKWebKitLegacyUnknown_P6Fc747iUjI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_PA_plus_PwQax14c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PA+PwQax14c", libSceNKWebKitLegacyUnknown_PA_plus_PwQax14c_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_PA3hKfVqH00_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PA3hKfVqH00", libSceNKWebKitLegacyUnknown_PA3hKfVqH00_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_PBzhGhm9efc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PBzhGhm9efc", libSceNKWebKitLegacyUnknown_PBzhGhm9efc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_PGttEJNabMo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PGttEJNabMo", libSceNKWebKitLegacyUnknown_PGttEJNabMo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_PHUWlwS59cM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PHUWlwS59cM", libSceNKWebKitLegacyUnknown_PHUWlwS59cM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_PHVPK9wRYjI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PHVPK9wRYjI", libSceNKWebKitLegacyUnknown_PHVPK9wRYjI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_PHs_minus_EtAF2zU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PHs-EtAF2zU", libSceNKWebKitLegacyUnknown_PHs_minus_EtAF2zU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_PJSbVdbIOug_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PJSbVdbIOug", libSceNKWebKitLegacyUnknown_PJSbVdbIOug_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_PJT6Jhs3y_plus_4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PJT6Jhs3y+4", libSceNKWebKitLegacyUnknown_PJT6Jhs3y_plus_4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_PNF4BV_plus_QsUU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PNF4BV+QsUU", libSceNKWebKitLegacyUnknown_PNF4BV_plus_QsUU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_PPOIHtgtkO8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PPOIHtgtkO8", libSceNKWebKitLegacyUnknown_PPOIHtgtkO8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_PQFF_plus_WEWARg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PQFF+WEWARg", libSceNKWebKitLegacyUnknown_PQFF_plus_WEWARg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_PQS29ynWmeE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PQS29ynWmeE", libSceNKWebKitLegacyUnknown_PQS29ynWmeE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_PS2fWS_minus_1dEw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PS2fWS-1dEw", libSceNKWebKitLegacyUnknown_PS2fWS_minus_1dEw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_PTdhkxtDUYg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PTdhkxtDUYg", libSceNKWebKitLegacyUnknown_PTdhkxtDUYg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_PVIoDan63h0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PVIoDan63h0", libSceNKWebKitLegacyUnknown_PVIoDan63h0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_PWFHeGMRnU8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PWFHeGMRnU8", libSceNKWebKitLegacyUnknown_PWFHeGMRnU8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_PX2JkQE8Fx8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PX2JkQE8Fx8", libSceNKWebKitLegacyUnknown_PX2JkQE8Fx8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_PexfHz4VoJM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PexfHz4VoJM", libSceNKWebKitLegacyUnknown_PexfHz4VoJM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_PfzhaLrZ1O8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PfzhaLrZ1O8", libSceNKWebKitLegacyUnknown_PfzhaLrZ1O8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_PhTR98wtFCg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PhTR98wtFCg", libSceNKWebKitLegacyUnknown_PhTR98wtFCg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_PpX1vzTqOIg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PpX1vzTqOIg", libSceNKWebKitLegacyUnknown_PpX1vzTqOIg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Pr_plus_3cKCW_minus_Vk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Pr+3cKCW-Vk", libSceNKWebKitLegacyUnknown_Pr_plus_3cKCW_minus_Vk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Ps0mzMxBXNI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ps0mzMxBXNI", libSceNKWebKitLegacyUnknown_Ps0mzMxBXNI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_PtLL62KSqNE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PtLL62KSqNE", libSceNKWebKitLegacyUnknown_PtLL62KSqNE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Q_plus_85zvk4FB8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Q+85zvk4FB8", libSceNKWebKitLegacyUnknown_Q_plus_85zvk4FB8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Q_minus_EqLnxcZMo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Q-EqLnxcZMo", libSceNKWebKitLegacyUnknown_Q_minus_EqLnxcZMo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Q0DOEo6XxTI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Q0DOEo6XxTI", libSceNKWebKitLegacyUnknown_Q0DOEo6XxTI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Q0GjAmlMAzE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Q0GjAmlMAzE", libSceNKWebKitLegacyUnknown_Q0GjAmlMAzE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Q0v3WNMvbvk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Q0v3WNMvbvk", libSceNKWebKitLegacyUnknown_Q0v3WNMvbvk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Q1zMBRuiOZE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Q1zMBRuiOZE", libSceNKWebKitLegacyUnknown_Q1zMBRuiOZE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Q43Qwcd7W_minus_Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Q43Qwcd7W-Q", libSceNKWebKitLegacyUnknown_Q43Qwcd7W_minus_Q_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Q5SxpvFCi2s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Q5SxpvFCi2s", libSceNKWebKitLegacyUnknown_Q5SxpvFCi2s_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Q5kgx9_plus_xeQU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Q5kgx9+xeQU", libSceNKWebKitLegacyUnknown_Q5kgx9_plus_xeQU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Q6J7DAtr0Fk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Q6J7DAtr0Fk", libSceNKWebKitLegacyUnknown_Q6J7DAtr0Fk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Q6f8EtTfC7E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Q6f8EtTfC7E", libSceNKWebKitLegacyUnknown_Q6f8EtTfC7E_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Q8CtPGQDhhI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Q8CtPGQDhhI", libSceNKWebKitLegacyUnknown_Q8CtPGQDhhI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Q8PbGtLOqaE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Q8PbGtLOqaE", libSceNKWebKitLegacyUnknown_Q8PbGtLOqaE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_QGlyLx75ZyU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QGlyLx75ZyU", libSceNKWebKitLegacyUnknown_QGlyLx75ZyU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_QILgXEZAVZQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QILgXEZAVZQ", libSceNKWebKitLegacyUnknown_QILgXEZAVZQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_QKXk1l0g0fY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QKXk1l0g0fY", libSceNKWebKitLegacyUnknown_QKXk1l0g0fY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_QLcy5UgKqxU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QLcy5UgKqxU", libSceNKWebKitLegacyUnknown_QLcy5UgKqxU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_QN7bxzzZsYs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QN7bxzzZsYs", libSceNKWebKitLegacyUnknown_QN7bxzzZsYs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_QOSkS_plus_V5Me8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QOSkS+V5Me8", libSceNKWebKitLegacyUnknown_QOSkS_plus_V5Me8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_QOwNdOdlkw0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QOwNdOdlkw0", libSceNKWebKitLegacyUnknown_QOwNdOdlkw0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_QP99f0_plus_e_plus_B4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QP99f0+e+B4", libSceNKWebKitLegacyUnknown_QP99f0_plus_e_plus_B4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_QQ_plus_5GjIApTM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QQ+5GjIApTM", libSceNKWebKitLegacyUnknown_QQ_plus_5GjIApTM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_QSzdUqTrd_minus_s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QSzdUqTrd-s", libSceNKWebKitLegacyUnknown_QSzdUqTrd_minus_s_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_QT3ve5whb04_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QT3ve5whb04", libSceNKWebKitLegacyUnknown_QT3ve5whb04_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_QT9ArotZAcs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QT9ArotZAcs", libSceNKWebKitLegacyUnknown_QT9ArotZAcs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_QX6b_plus_NQ1NE8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QX6b+NQ1NE8", libSceNKWebKitLegacyUnknown_QX6b_plus_NQ1NE8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_QZtLzqKvmi8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QZtLzqKvmi8", libSceNKWebKitLegacyUnknown_QZtLzqKvmi8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Qcs_minus_Q005CTs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Qcs-Q005CTs", libSceNKWebKitLegacyUnknown_Qcs_minus_Q005CTs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_QdSnOK4Am1M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QdSnOK4Am1M", libSceNKWebKitLegacyUnknown_QdSnOK4Am1M_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_QeB_plus_bflf6s0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QeB+bflf6s0", libSceNKWebKitLegacyUnknown_QeB_plus_bflf6s0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Qf91WH8Hta0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Qf91WH8Hta0", libSceNKWebKitLegacyUnknown_Qf91WH8Hta0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_QfcDJbA0V0E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QfcDJbA0V0E", libSceNKWebKitLegacyUnknown_QfcDJbA0V0E_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Qg_minus_b_minus_j8dTZY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Qg-b-j8dTZY", libSceNKWebKitLegacyUnknown_Qg_minus_b_minus_j8dTZY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Qhihnfy5GpY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Qhihnfy5GpY", libSceNKWebKitLegacyUnknown_Qhihnfy5GpY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_QjqsTDTTSis_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QjqsTDTTSis", libSceNKWebKitLegacyUnknown_QjqsTDTTSis_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_QoBYcBsP0gs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QoBYcBsP0gs", libSceNKWebKitLegacyUnknown_QoBYcBsP0gs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_QpeSMH_minus_lx_plus_s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QpeSMH-lx+s", libSceNKWebKitLegacyUnknown_QpeSMH_minus_lx_plus_s_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Qq1NluKTwJA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Qq1NluKTwJA", libSceNKWebKitLegacyUnknown_Qq1NluKTwJA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_QrX8HQgwS84_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QrX8HQgwS84", libSceNKWebKitLegacyUnknown_QrX8HQgwS84_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Qs1P8UBKBK4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Qs1P8UBKBK4", libSceNKWebKitLegacyUnknown_Qs1P8UBKBK4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_QsQXic2xPs4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QsQXic2xPs4", libSceNKWebKitLegacyUnknown_QsQXic2xPs4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_QxaNoUYvdls_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QxaNoUYvdls", libSceNKWebKitLegacyUnknown_QxaNoUYvdls_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_QyvqJWoYgL0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QyvqJWoYgL0", libSceNKWebKitLegacyUnknown_QyvqJWoYgL0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_QzYuh6Ftszk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QzYuh6Ftszk", libSceNKWebKitLegacyUnknown_QzYuh6Ftszk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_QzySiql0nAE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QzySiql0nAE", libSceNKWebKitLegacyUnknown_QzySiql0nAE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_R_plus_IJy1KVaj0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("R+IJy1KVaj0", libSceNKWebKitLegacyUnknown_R_plus_IJy1KVaj0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_R_plus_m1LCvKL1o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("R+m1LCvKL1o", libSceNKWebKitLegacyUnknown_R_plus_m1LCvKL1o_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_R15hN8_minus_oipQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("R15hN8-oipQ", libSceNKWebKitLegacyUnknown_R15hN8_minus_oipQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_R2ZQAobL0VM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("R2ZQAobL0VM", libSceNKWebKitLegacyUnknown_R2ZQAobL0VM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_R7woYOzL7is_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("R7woYOzL7is", libSceNKWebKitLegacyUnknown_R7woYOzL7is_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_RB7voJMuUZs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RB7voJMuUZs", libSceNKWebKitLegacyUnknown_RB7voJMuUZs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_RDPTNEkwy7c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RDPTNEkwy7c", libSceNKWebKitLegacyUnknown_RDPTNEkwy7c_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_RERXvPDMdhg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RERXvPDMdhg", libSceNKWebKitLegacyUnknown_RERXvPDMdhg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_RFnMq7_minus_6lq8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RFnMq7-6lq8", libSceNKWebKitLegacyUnknown_RFnMq7_minus_6lq8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_RHS7MAfFQpU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RHS7MAfFQpU", libSceNKWebKitLegacyUnknown_RHS7MAfFQpU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_RIVWLt7NdUQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RIVWLt7NdUQ", libSceNKWebKitLegacyUnknown_RIVWLt7NdUQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_RIX1IKndFDA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RIX1IKndFDA", libSceNKWebKitLegacyUnknown_RIX1IKndFDA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_RKlOnSYZlt4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RKlOnSYZlt4", libSceNKWebKitLegacyUnknown_RKlOnSYZlt4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_RMv7LG_plus_0dtU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RMv7LG+0dtU", libSceNKWebKitLegacyUnknown_RMv7LG_plus_0dtU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_RO4bVWqJOcs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RO4bVWqJOcs", libSceNKWebKitLegacyUnknown_RO4bVWqJOcs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_RPCuYciZiwQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RPCuYciZiwQ", libSceNKWebKitLegacyUnknown_RPCuYciZiwQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_RQgG57FfUJ4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RQgG57FfUJ4", libSceNKWebKitLegacyUnknown_RQgG57FfUJ4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_RRGLE10_minus_qZM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RRGLE10-qZM", libSceNKWebKitLegacyUnknown_RRGLE10_minus_qZM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_RRKdTtpdRzQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RRKdTtpdRzQ", libSceNKWebKitLegacyUnknown_RRKdTtpdRzQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_RS4OaWn3Yaw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RS4OaWn3Yaw", libSceNKWebKitLegacyUnknown_RS4OaWn3Yaw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_RSPispNSqPY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RSPispNSqPY", libSceNKWebKitLegacyUnknown_RSPispNSqPY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_RU1SaHyqexQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RU1SaHyqexQ", libSceNKWebKitLegacyUnknown_RU1SaHyqexQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_RUQkLQHBnr8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RUQkLQHBnr8", libSceNKWebKitLegacyUnknown_RUQkLQHBnr8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_RUenQ1WZQoA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RUenQ1WZQoA", libSceNKWebKitLegacyUnknown_RUenQ1WZQoA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_RW96fIbhPBA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RW96fIbhPBA", libSceNKWebKitLegacyUnknown_RW96fIbhPBA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_RWy5PmNFDLE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RWy5PmNFDLE", libSceNKWebKitLegacyUnknown_RWy5PmNFDLE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_RatFQeKvheU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RatFQeKvheU", libSceNKWebKitLegacyUnknown_RatFQeKvheU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_RfEoZpq_minus_3rU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RfEoZpq-3rU", libSceNKWebKitLegacyUnknown_RfEoZpq_minus_3rU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_RgPLWdJJGBM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RgPLWdJJGBM", libSceNKWebKitLegacyUnknown_RgPLWdJJGBM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_RiIlTQtCn_minus_s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RiIlTQtCn-s", libSceNKWebKitLegacyUnknown_RiIlTQtCn_minus_s_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_RidOPwWxJes_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RidOPwWxJes", libSceNKWebKitLegacyUnknown_RidOPwWxJes_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_RjRflLHq_plus_zA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RjRflLHq+zA", libSceNKWebKitLegacyUnknown_RjRflLHq_plus_zA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_RjmV_plus_cXDxkI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RjmV+cXDxkI", libSceNKWebKitLegacyUnknown_RjmV_plus_cXDxkI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_RlE2mhkZ72U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RlE2mhkZ72U", libSceNKWebKitLegacyUnknown_RlE2mhkZ72U_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_RmbbHWTxhgM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RmbbHWTxhgM", libSceNKWebKitLegacyUnknown_RmbbHWTxhgM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Ro2ieAw9m3g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ro2ieAw9m3g", libSceNKWebKitLegacyUnknown_Ro2ieAw9m3g_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_RohovwYkYO8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RohovwYkYO8", libSceNKWebKitLegacyUnknown_RohovwYkYO8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_RrcozTK0fHM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RrcozTK0fHM", libSceNKWebKitLegacyUnknown_RrcozTK0fHM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_RrrkSeBmV6U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RrrkSeBmV6U", libSceNKWebKitLegacyUnknown_RrrkSeBmV6U_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Rtn2Xw7gr0g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Rtn2Xw7gr0g", libSceNKWebKitLegacyUnknown_Rtn2Xw7gr0g_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_RwxEnlbCkug_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RwxEnlbCkug", libSceNKWebKitLegacyUnknown_RwxEnlbCkug_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_RxLscALFA00_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RxLscALFA00", libSceNKWebKitLegacyUnknown_RxLscALFA00_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_RxbpvVvQ20Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RxbpvVvQ20Q", libSceNKWebKitLegacyUnknown_RxbpvVvQ20Q_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Rz5M5L_plus_9X9g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Rz5M5L+9X9g", libSceNKWebKitLegacyUnknown_Rz5M5L_plus_9X9g_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_RzGLHpwR2_plus_k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RzGLHpwR2+k", libSceNKWebKitLegacyUnknown_RzGLHpwR2_plus_k_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_S2ESgvbzvXI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("S2ESgvbzvXI", libSceNKWebKitLegacyUnknown_S2ESgvbzvXI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_S6vKxYoIrBU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("S6vKxYoIrBU", libSceNKWebKitLegacyUnknown_S6vKxYoIrBU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_S7ILo_plus_YCsOA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("S7ILo+YCsOA", libSceNKWebKitLegacyUnknown_S7ILo_plus_YCsOA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_S7kvkV6SznU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("S7kvkV6SznU", libSceNKWebKitLegacyUnknown_S7kvkV6SznU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_S8NC57PFC7U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("S8NC57PFC7U", libSceNKWebKitLegacyUnknown_S8NC57PFC7U_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_SAB_plus_QaBUXA8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SAB+QaBUXA8", libSceNKWebKitLegacyUnknown_SAB_plus_QaBUXA8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_SB138NuKbpQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SB138NuKbpQ", libSceNKWebKitLegacyUnknown_SB138NuKbpQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_SFB_plus__minus_ofqbik_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SFB+-ofqbik", libSceNKWebKitLegacyUnknown_SFB_plus__minus_ofqbik_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_SKvxLm9t0OM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SKvxLm9t0OM", libSceNKWebKitLegacyUnknown_SKvxLm9t0OM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_SMJ3ZI_plus_lcnU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SMJ3ZI+lcnU", libSceNKWebKitLegacyUnknown_SMJ3ZI_plus_lcnU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_SMr0Ma_minus_uQt0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SMr0Ma-uQt0", libSceNKWebKitLegacyUnknown_SMr0Ma_minus_uQt0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_SQR1u6Zuzk0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SQR1u6Zuzk0", libSceNKWebKitLegacyUnknown_SQR1u6Zuzk0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_SVIcrS84xVo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SVIcrS84xVo", libSceNKWebKitLegacyUnknown_SVIcrS84xVo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_SVzqxdTgx_minus_k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SVzqxdTgx-k", libSceNKWebKitLegacyUnknown_SVzqxdTgx_minus_k_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_SbUkE4iXYM4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SbUkE4iXYM4", libSceNKWebKitLegacyUnknown_SbUkE4iXYM4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Sd9lCybeKgM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Sd9lCybeKgM", libSceNKWebKitLegacyUnknown_Sd9lCybeKgM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Sev444QPGAU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Sev444QPGAU", libSceNKWebKitLegacyUnknown_Sev444QPGAU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ShWGA1OTMoI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ShWGA1OTMoI", libSceNKWebKitLegacyUnknown_ShWGA1OTMoI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Sm3oDIlxp0o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Sm3oDIlxp0o", libSceNKWebKitLegacyUnknown_Sm3oDIlxp0o_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_So0jzJiWB_plus_I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("So0jzJiWB+I", libSceNKWebKitLegacyUnknown_So0jzJiWB_plus_I_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_SpuLBXsLhn0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SpuLBXsLhn0", libSceNKWebKitLegacyUnknown_SpuLBXsLhn0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_SqCGJaZoMJQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SqCGJaZoMJQ", libSceNKWebKitLegacyUnknown_SqCGJaZoMJQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Ss7pQku6zPY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ss7pQku6zPY", libSceNKWebKitLegacyUnknown_Ss7pQku6zPY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_T0_plus_lIzKYWj4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("T0+lIzKYWj4", libSceNKWebKitLegacyUnknown_T0_plus_lIzKYWj4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_T0oW10Z_minus_9Fw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("T0oW10Z-9Fw", libSceNKWebKitLegacyUnknown_T0oW10Z_minus_9Fw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_T2RMTQRTuYY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("T2RMTQRTuYY", libSceNKWebKitLegacyUnknown_T2RMTQRTuYY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_T4w31LJSLNo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("T4w31LJSLNo", libSceNKWebKitLegacyUnknown_T4w31LJSLNo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_T5OFqfz31ls_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("T5OFqfz31ls", libSceNKWebKitLegacyUnknown_T5OFqfz31ls_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_T8VkAKBOWl8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("T8VkAKBOWl8", libSceNKWebKitLegacyUnknown_T8VkAKBOWl8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_T8ukb53jIwc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("T8ukb53jIwc", libSceNKWebKitLegacyUnknown_T8ukb53jIwc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_TBoSLF0Ro9g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TBoSLF0Ro9g", libSceNKWebKitLegacyUnknown_TBoSLF0Ro9g_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_THYrKHts64I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("THYrKHts64I", libSceNKWebKitLegacyUnknown_THYrKHts64I_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_THhPk_minus_FTXPk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("THhPk-FTXPk", libSceNKWebKitLegacyUnknown_THhPk_minus_FTXPk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_TI5Vxsw0xME_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TI5Vxsw0xME", libSceNKWebKitLegacyUnknown_TI5Vxsw0xME_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_TInUPMGSSWE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TInUPMGSSWE", libSceNKWebKitLegacyUnknown_TInUPMGSSWE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_TLK1GcvZ8Bk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TLK1GcvZ8Bk", libSceNKWebKitLegacyUnknown_TLK1GcvZ8Bk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_TOYFo8wa2h8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TOYFo8wa2h8", libSceNKWebKitLegacyUnknown_TOYFo8wa2h8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_TRd7S9n3juU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TRd7S9n3juU", libSceNKWebKitLegacyUnknown_TRd7S9n3juU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_TU8QndXbCBg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TU8QndXbCBg", libSceNKWebKitLegacyUnknown_TU8QndXbCBg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_TUnX49erAaA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TUnX49erAaA", libSceNKWebKitLegacyUnknown_TUnX49erAaA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_TV0vBdSa6OU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TV0vBdSa6OU", libSceNKWebKitLegacyUnknown_TV0vBdSa6OU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_TWEfZQh62V8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TWEfZQh62V8", libSceNKWebKitLegacyUnknown_TWEfZQh62V8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_TWPUIv6uW_minus_g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TWPUIv6uW-g", libSceNKWebKitLegacyUnknown_TWPUIv6uW_minus_g_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_TYP_plus_vYIYVpg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TYP+vYIYVpg", libSceNKWebKitLegacyUnknown_TYP_plus_vYIYVpg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_TYVKHQWMtS4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TYVKHQWMtS4", libSceNKWebKitLegacyUnknown_TYVKHQWMtS4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_TZ5K24vde6w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TZ5K24vde6w", libSceNKWebKitLegacyUnknown_TZ5K24vde6w_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_TaswYPAvtOQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TaswYPAvtOQ", libSceNKWebKitLegacyUnknown_TaswYPAvtOQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Te7DHp8Gy2Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Te7DHp8Gy2Y", libSceNKWebKitLegacyUnknown_Te7DHp8Gy2Y_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_TeKuYOUHoKU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TeKuYOUHoKU", libSceNKWebKitLegacyUnknown_TeKuYOUHoKU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_TeYoK0Kka_minus_M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TeYoK0Kka-M", libSceNKWebKitLegacyUnknown_TeYoK0Kka_minus_M_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ThNb0pZMjQ8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ThNb0pZMjQ8", libSceNKWebKitLegacyUnknown_ThNb0pZMjQ8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Ti67furXZ9o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ti67furXZ9o", libSceNKWebKitLegacyUnknown_Ti67furXZ9o_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Tj09N7FCeV8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Tj09N7FCeV8", libSceNKWebKitLegacyUnknown_Tj09N7FCeV8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_TkScCUuSRfw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TkScCUuSRfw", libSceNKWebKitLegacyUnknown_TkScCUuSRfw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_TmjdoE3VDfU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TmjdoE3VDfU", libSceNKWebKitLegacyUnknown_TmjdoE3VDfU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Tn_minus_I7zTWVXs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Tn-I7zTWVXs", libSceNKWebKitLegacyUnknown_Tn_minus_I7zTWVXs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Tn8l_plus_qMDk0c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Tn8l+qMDk0c", libSceNKWebKitLegacyUnknown_Tn8l_plus_qMDk0c_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_TpQxwP5ZEOE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TpQxwP5ZEOE", libSceNKWebKitLegacyUnknown_TpQxwP5ZEOE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Tv4PMhvwfW0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Tv4PMhvwfW0", libSceNKWebKitLegacyUnknown_Tv4PMhvwfW0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_TvTj_plus_wvaKxU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TvTj+wvaKxU", libSceNKWebKitLegacyUnknown_TvTj_plus_wvaKxU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_TvXo6CimTsk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TvXo6CimTsk", libSceNKWebKitLegacyUnknown_TvXo6CimTsk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Tw8Hf_plus_j_plus_mTA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Tw8Hf+j+mTA", libSceNKWebKitLegacyUnknown_Tw8Hf_plus_j_plus_mTA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_TwA2gtUXK7k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TwA2gtUXK7k", libSceNKWebKitLegacyUnknown_TwA2gtUXK7k_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_U_plus_o_plus_bGvUe24_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("U+o+bGvUe24", libSceNKWebKitLegacyUnknown_U_plus_o_plus_bGvUe24_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_U_minus_IFsK6ipPA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("U-IFsK6ipPA", libSceNKWebKitLegacyUnknown_U_minus_IFsK6ipPA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_U_minus_J5g5HlYgs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("U-J5g5HlYgs", libSceNKWebKitLegacyUnknown_U_minus_J5g5HlYgs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_U_minus_pDROUPL40_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("U-pDROUPL40", libSceNKWebKitLegacyUnknown_U_minus_pDROUPL40_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_U1uukdMUipQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("U1uukdMUipQ", libSceNKWebKitLegacyUnknown_U1uukdMUipQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_U2yI_minus_GjuK2A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("U2yI-GjuK2A", libSceNKWebKitLegacyUnknown_U2yI_minus_GjuK2A_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_U4FJEJCKEUA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("U4FJEJCKEUA", libSceNKWebKitLegacyUnknown_U4FJEJCKEUA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_U4J9hC7k_minus_iE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("U4J9hC7k-iE", libSceNKWebKitLegacyUnknown_U4J9hC7k_minus_iE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_U5zbMe_minus_5x_plus_4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("U5zbMe-5x+4", libSceNKWebKitLegacyUnknown_U5zbMe_minus_5x_plus_4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_U6U8Yenax_plus_Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("U6U8Yenax+Q", libSceNKWebKitLegacyUnknown_U6U8Yenax_plus_Q_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_U7QZzL5OgXM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("U7QZzL5OgXM", libSceNKWebKitLegacyUnknown_U7QZzL5OgXM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_U7XbaR_plus_TNak_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("U7XbaR+TNak", libSceNKWebKitLegacyUnknown_U7XbaR_plus_TNak_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_U7bM3T1ZwUg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("U7bM3T1ZwUg", libSceNKWebKitLegacyUnknown_U7bM3T1ZwUg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_U7o_plus_A03Tkr4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("U7o+A03Tkr4", libSceNKWebKitLegacyUnknown_U7o_plus_A03Tkr4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_UBaDrYbn3JA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UBaDrYbn3JA", libSceNKWebKitLegacyUnknown_UBaDrYbn3JA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_UDhyoWgI8Uw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UDhyoWgI8Uw", libSceNKWebKitLegacyUnknown_UDhyoWgI8Uw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_UFpIkohgGKI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UFpIkohgGKI", libSceNKWebKitLegacyUnknown_UFpIkohgGKI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_UIPTgJxCeEs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UIPTgJxCeEs", libSceNKWebKitLegacyUnknown_UIPTgJxCeEs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_UJVOusdtHuU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UJVOusdtHuU", libSceNKWebKitLegacyUnknown_UJVOusdtHuU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_UQ989EpPn8A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UQ989EpPn8A", libSceNKWebKitLegacyUnknown_UQ989EpPn8A_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_UR1fvBzmIbU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UR1fvBzmIbU", libSceNKWebKitLegacyUnknown_UR1fvBzmIbU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_USh443unLZ0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("USh443unLZ0", libSceNKWebKitLegacyUnknown_USh443unLZ0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_UTQPX7MYbAM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UTQPX7MYbAM", libSceNKWebKitLegacyUnknown_UTQPX7MYbAM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_UTrzzCUsH0w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UTrzzCUsH0w", libSceNKWebKitLegacyUnknown_UTrzzCUsH0w_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_UUGJ8eCwfNo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UUGJ8eCwfNo", libSceNKWebKitLegacyUnknown_UUGJ8eCwfNo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_UYQaSVs2HPc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UYQaSVs2HPc", libSceNKWebKitLegacyUnknown_UYQaSVs2HPc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_UYlpfXiijCM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UYlpfXiijCM", libSceNKWebKitLegacyUnknown_UYlpfXiijCM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_UZrHnfnijms_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UZrHnfnijms", libSceNKWebKitLegacyUnknown_UZrHnfnijms_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_UaRW96_minus_F3t0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UaRW96-F3t0", libSceNKWebKitLegacyUnknown_UaRW96_minus_F3t0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_UdKXYoeVDLc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UdKXYoeVDLc", libSceNKWebKitLegacyUnknown_UdKXYoeVDLc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_UeYiDCqHWuM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UeYiDCqHWuM", libSceNKWebKitLegacyUnknown_UeYiDCqHWuM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Ug_minus_13mhenfY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ug-13mhenfY", libSceNKWebKitLegacyUnknown_Ug_minus_13mhenfY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_UiIGhwPoY88_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UiIGhwPoY88", libSceNKWebKitLegacyUnknown_UiIGhwPoY88_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_UkSUouA_minus_9nk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UkSUouA-9nk", libSceNKWebKitLegacyUnknown_UkSUouA_minus_9nk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_UlrFGydwCGc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UlrFGydwCGc", libSceNKWebKitLegacyUnknown_UlrFGydwCGc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_UrRAqrfyFU0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UrRAqrfyFU0", libSceNKWebKitLegacyUnknown_UrRAqrfyFU0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Ut7Ri_minus_h_minus_0l0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ut7Ri-h-0l0", libSceNKWebKitLegacyUnknown_Ut7Ri_minus_h_minus_0l0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_UuHE5QHmCgs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UuHE5QHmCgs", libSceNKWebKitLegacyUnknown_UuHE5QHmCgs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_UxiF1uDl7FU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UxiF1uDl7FU", libSceNKWebKitLegacyUnknown_UxiF1uDl7FU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_UzOOayOyogU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UzOOayOyogU", libSceNKWebKitLegacyUnknown_UzOOayOyogU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_V_minus_if5aVCwR0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("V-if5aVCwR0", libSceNKWebKitLegacyUnknown_V_minus_if5aVCwR0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_V1_plus_y6My2DTE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("V1+y6My2DTE", libSceNKWebKitLegacyUnknown_V1_plus_y6My2DTE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_V5NAmXVlwlQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("V5NAmXVlwlQ", libSceNKWebKitLegacyUnknown_V5NAmXVlwlQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_V6frA_plus_LevAI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("V6frA+LevAI", libSceNKWebKitLegacyUnknown_V6frA_plus_LevAI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_V7R_plus_CUqEAZw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("V7R+CUqEAZw", libSceNKWebKitLegacyUnknown_V7R_plus_CUqEAZw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_V9_minus_Tsgb8r3E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("V9-Tsgb8r3E", libSceNKWebKitLegacyUnknown_V9_minus_Tsgb8r3E_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_V95p6e6FXys_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("V95p6e6FXys", libSceNKWebKitLegacyUnknown_V95p6e6FXys_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_V9kLv_minus_tveB4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("V9kLv-tveB4", libSceNKWebKitLegacyUnknown_V9kLv_minus_tveB4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_V9t7N6GTEX4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("V9t7N6GTEX4", libSceNKWebKitLegacyUnknown_V9t7N6GTEX4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_VALOmUGH78g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VALOmUGH78g", libSceNKWebKitLegacyUnknown_VALOmUGH78g_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_VANh7N2knZg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VANh7N2knZg", libSceNKWebKitLegacyUnknown_VANh7N2knZg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_VB1MYFFuaL4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VB1MYFFuaL4", libSceNKWebKitLegacyUnknown_VB1MYFFuaL4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_VB75ZVdylrU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VB75ZVdylrU", libSceNKWebKitLegacyUnknown_VB75ZVdylrU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_VDHk4HzzbhQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VDHk4HzzbhQ", libSceNKWebKitLegacyUnknown_VDHk4HzzbhQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_VDf83PLBqk0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VDf83PLBqk0", libSceNKWebKitLegacyUnknown_VDf83PLBqk0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_VGX61DLo18s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VGX61DLo18s", libSceNKWebKitLegacyUnknown_VGX61DLo18s_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_VGcTl36kCDs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VGcTl36kCDs", libSceNKWebKitLegacyUnknown_VGcTl36kCDs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_VGsLj5rElVo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VGsLj5rElVo", libSceNKWebKitLegacyUnknown_VGsLj5rElVo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_VHBH_plus_p1IqKU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VHBH+p1IqKU", libSceNKWebKitLegacyUnknown_VHBH_plus_p1IqKU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_VK_plus_BaGSZH_plus_c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VK+BaGSZH+c", libSceNKWebKitLegacyUnknown_VK_plus_BaGSZH_plus_c_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_VL6s6xtBiGQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VL6s6xtBiGQ", libSceNKWebKitLegacyUnknown_VL6s6xtBiGQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_VMfdd6k7stI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VMfdd6k7stI", libSceNKWebKitLegacyUnknown_VMfdd6k7stI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_VN4sywtV7RE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VN4sywtV7RE", libSceNKWebKitLegacyUnknown_VN4sywtV7RE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_VOffDjveSnE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VOffDjveSnE", libSceNKWebKitLegacyUnknown_VOffDjveSnE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_VOk0yH4MyAc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VOk0yH4MyAc", libSceNKWebKitLegacyUnknown_VOk0yH4MyAc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_VQKfg6VE5sE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VQKfg6VE5sE", libSceNKWebKitLegacyUnknown_VQKfg6VE5sE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_VQV1bLZ7Zbc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VQV1bLZ7Zbc", libSceNKWebKitLegacyUnknown_VQV1bLZ7Zbc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_VR9vkpt_plus_2Iw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VR9vkpt+2Iw", libSceNKWebKitLegacyUnknown_VR9vkpt_plus_2Iw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_VRWvCz180Rk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VRWvCz180Rk", libSceNKWebKitLegacyUnknown_VRWvCz180Rk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_VRjYxJUaGag_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VRjYxJUaGag", libSceNKWebKitLegacyUnknown_VRjYxJUaGag_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_VWz_plus_QkA9f70_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VWz+QkA9f70", libSceNKWebKitLegacyUnknown_VWz_plus_QkA9f70_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_VXngsm4dulg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VXngsm4dulg", libSceNKWebKitLegacyUnknown_VXngsm4dulg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_VYbHr8Xemoc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VYbHr8Xemoc", libSceNKWebKitLegacyUnknown_VYbHr8Xemoc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_VYz4Rw2KU6E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VYz4Rw2KU6E", libSceNKWebKitLegacyUnknown_VYz4Rw2KU6E_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Va9rLemqS1c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Va9rLemqS1c", libSceNKWebKitLegacyUnknown_Va9rLemqS1c_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_VbIkV4JS3PE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VbIkV4JS3PE", libSceNKWebKitLegacyUnknown_VbIkV4JS3PE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Vbx1HlmSMf0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Vbx1HlmSMf0", libSceNKWebKitLegacyUnknown_Vbx1HlmSMf0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_VcdA7UkL3fo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VcdA7UkL3fo", libSceNKWebKitLegacyUnknown_VcdA7UkL3fo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_VhXAk2UQP5s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VhXAk2UQP5s", libSceNKWebKitLegacyUnknown_VhXAk2UQP5s_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_VhfrUFgM6bM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VhfrUFgM6bM", libSceNKWebKitLegacyUnknown_VhfrUFgM6bM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Viv12czuiVY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Viv12czuiVY", libSceNKWebKitLegacyUnknown_Viv12czuiVY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Vkhewx6tULs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Vkhewx6tULs", libSceNKWebKitLegacyUnknown_Vkhewx6tULs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_VpTB5N6G_minus_0o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VpTB5N6G-0o", libSceNKWebKitLegacyUnknown_VpTB5N6G_minus_0o_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_VrmP11iLJ_minus_E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VrmP11iLJ-E", libSceNKWebKitLegacyUnknown_VrmP11iLJ_minus_E_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_VyKZGaC_plus_ugc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VyKZGaC+ugc", libSceNKWebKitLegacyUnknown_VyKZGaC_plus_ugc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_W_plus_aj8nyPyJE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("W+aj8nyPyJE", libSceNKWebKitLegacyUnknown_W_plus_aj8nyPyJE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_W_minus_1_minus_yJl_plus_8K8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("W-1-yJl+8K8", libSceNKWebKitLegacyUnknown_W_minus_1_minus_yJl_plus_8K8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_W0WNrK6rzeg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("W0WNrK6rzeg", libSceNKWebKitLegacyUnknown_W0WNrK6rzeg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_W1jN4F8FOPs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("W1jN4F8FOPs", libSceNKWebKitLegacyUnknown_W1jN4F8FOPs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_W2_plus_NxxjVm2I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("W2+NxxjVm2I", libSceNKWebKitLegacyUnknown_W2_plus_NxxjVm2I_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_W4xAZU6nKyg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("W4xAZU6nKyg", libSceNKWebKitLegacyUnknown_W4xAZU6nKyg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_W4xH4Id8odI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("W4xH4Id8odI", libSceNKWebKitLegacyUnknown_W4xH4Id8odI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_W9lYgVU32Ro_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("W9lYgVU32Ro", libSceNKWebKitLegacyUnknown_W9lYgVU32Ro_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_WEKtamcbO64_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WEKtamcbO64", libSceNKWebKitLegacyUnknown_WEKtamcbO64_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_WFp9BrIB_minus_H4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WFp9BrIB-H4", libSceNKWebKitLegacyUnknown_WFp9BrIB_minus_H4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_WGU_plus_pJ2JIrc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WGU+pJ2JIrc", libSceNKWebKitLegacyUnknown_WGU_plus_pJ2JIrc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_WJSeWoz_minus_Ew0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WJSeWoz-Ew0", libSceNKWebKitLegacyUnknown_WJSeWoz_minus_Ew0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_WLEmFxnh71I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WLEmFxnh71I", libSceNKWebKitLegacyUnknown_WLEmFxnh71I_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_WLdDxIWd3GE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WLdDxIWd3GE", libSceNKWebKitLegacyUnknown_WLdDxIWd3GE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_WMiHOVv7EKo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WMiHOVv7EKo", libSceNKWebKitLegacyUnknown_WMiHOVv7EKo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_WOtHs6_minus_3ft8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WOtHs6-3ft8", libSceNKWebKitLegacyUnknown_WOtHs6_minus_3ft8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_WQK8hN6ZRh4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WQK8hN6ZRh4", libSceNKWebKitLegacyUnknown_WQK8hN6ZRh4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_WQN7AOxNX_minus_w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WQN7AOxNX-w", libSceNKWebKitLegacyUnknown_WQN7AOxNX_minus_w_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_WRiVOEl8rIQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WRiVOEl8rIQ", libSceNKWebKitLegacyUnknown_WRiVOEl8rIQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_WUa0o9AnJFg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WUa0o9AnJFg", libSceNKWebKitLegacyUnknown_WUa0o9AnJFg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_WUan2x6u318_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WUan2x6u318", libSceNKWebKitLegacyUnknown_WUan2x6u318_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_WUqVrto4TxI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WUqVrto4TxI", libSceNKWebKitLegacyUnknown_WUqVrto4TxI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_WWBe8NYcfrs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WWBe8NYcfrs", libSceNKWebKitLegacyUnknown_WWBe8NYcfrs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_WbOJP2JWG_plus_o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WbOJP2JWG+o", libSceNKWebKitLegacyUnknown_WbOJP2JWG_plus_o_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_WdgNKFD3V_plus_c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WdgNKFD3V+c", libSceNKWebKitLegacyUnknown_WdgNKFD3V_plus_c_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Wfiq93CqG9A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Wfiq93CqG9A", libSceNKWebKitLegacyUnknown_Wfiq93CqG9A_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_WjTI2Z1q3FA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WjTI2Z1q3FA", libSceNKWebKitLegacyUnknown_WjTI2Z1q3FA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_WlG9NNIrcok_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WlG9NNIrcok", libSceNKWebKitLegacyUnknown_WlG9NNIrcok_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_WmYrwvOzOuM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WmYrwvOzOuM", libSceNKWebKitLegacyUnknown_WmYrwvOzOuM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_WnOO_plus_2F_plus_y3c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WnOO+2F+y3c", libSceNKWebKitLegacyUnknown_WnOO_plus_2F_plus_y3c_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_WokVIWzuBos_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WokVIWzuBos", libSceNKWebKitLegacyUnknown_WokVIWzuBos_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_WqqA2zraxGw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WqqA2zraxGw", libSceNKWebKitLegacyUnknown_WqqA2zraxGw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_WrVbuRtQ9CM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WrVbuRtQ9CM", libSceNKWebKitLegacyUnknown_WrVbuRtQ9CM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_WvZllaEpQmU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WvZllaEpQmU", libSceNKWebKitLegacyUnknown_WvZllaEpQmU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_WvrkJR4lSmU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WvrkJR4lSmU", libSceNKWebKitLegacyUnknown_WvrkJR4lSmU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_WwwFtuQcJaE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WwwFtuQcJaE", libSceNKWebKitLegacyUnknown_WwwFtuQcJaE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_WxLwWxd53kE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WxLwWxd53kE", libSceNKWebKitLegacyUnknown_WxLwWxd53kE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_WxXXVDHBAt4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WxXXVDHBAt4", libSceNKWebKitLegacyUnknown_WxXXVDHBAt4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_X0GioSb2T2c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("X0GioSb2T2c", libSceNKWebKitLegacyUnknown_X0GioSb2T2c_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_X0k5NNO6f_minus_g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("X0k5NNO6f-g", libSceNKWebKitLegacyUnknown_X0k5NNO6f_minus_g_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_X9elh51SOlo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("X9elh51SOlo", libSceNKWebKitLegacyUnknown_X9elh51SOlo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_X9hfd0RTsfc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("X9hfd0RTsfc", libSceNKWebKitLegacyUnknown_X9hfd0RTsfc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_XAJVvSm_minus_llo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XAJVvSm-llo", libSceNKWebKitLegacyUnknown_XAJVvSm_minus_llo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_XBFr1zrK8W0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XBFr1zrK8W0", libSceNKWebKitLegacyUnknown_XBFr1zrK8W0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_XITKbTGdwMo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XITKbTGdwMo", libSceNKWebKitLegacyUnknown_XITKbTGdwMo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_XLIYwMUXO4Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XLIYwMUXO4Y", libSceNKWebKitLegacyUnknown_XLIYwMUXO4Y_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_XLvJTbeeirw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XLvJTbeeirw", libSceNKWebKitLegacyUnknown_XLvJTbeeirw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_XOiajqEw2so_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XOiajqEw2so", libSceNKWebKitLegacyUnknown_XOiajqEw2so_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_XP9P8ExXwVY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XP9P8ExXwVY", libSceNKWebKitLegacyUnknown_XP9P8ExXwVY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_XPRyDKbZgSg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XPRyDKbZgSg", libSceNKWebKitLegacyUnknown_XPRyDKbZgSg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_XPl1UutZuKs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XPl1UutZuKs", libSceNKWebKitLegacyUnknown_XPl1UutZuKs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_XV_plus_i9UTTxVs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XV+i9UTTxVs", libSceNKWebKitLegacyUnknown_XV_plus_i9UTTxVs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_XXEv4APk8Ec_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XXEv4APk8Ec", libSceNKWebKitLegacyUnknown_XXEv4APk8Ec_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Xb8wCHkcTNE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Xb8wCHkcTNE", libSceNKWebKitLegacyUnknown_Xb8wCHkcTNE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_XbBoGslgGRA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XbBoGslgGRA", libSceNKWebKitLegacyUnknown_XbBoGslgGRA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_XdnNymUKO_plus_g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XdnNymUKO+g", libSceNKWebKitLegacyUnknown_XdnNymUKO_plus_g_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Xf9SA7rm2Ew_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Xf9SA7rm2Ew", libSceNKWebKitLegacyUnknown_Xf9SA7rm2Ew_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_XfzRS3gSO9U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XfzRS3gSO9U", libSceNKWebKitLegacyUnknown_XfzRS3gSO9U_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Xh5oMZsw3o8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Xh5oMZsw3o8", libSceNKWebKitLegacyUnknown_Xh5oMZsw3o8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_XhQ9AFaiQ4c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XhQ9AFaiQ4c", libSceNKWebKitLegacyUnknown_XhQ9AFaiQ4c_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Xk_plus_Fm_plus_YTF2c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Xk+Fm+YTF2c", libSceNKWebKitLegacyUnknown_Xk_plus_Fm_plus_YTF2c_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_XkvjXpuyzLs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XkvjXpuyzLs", libSceNKWebKitLegacyUnknown_XkvjXpuyzLs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_XlElXM6Ycvo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XlElXM6Ycvo", libSceNKWebKitLegacyUnknown_XlElXM6Ycvo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_XlLLnggzxAk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XlLLnggzxAk", libSceNKWebKitLegacyUnknown_XlLLnggzxAk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_XnCul31fdJ0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XnCul31fdJ0", libSceNKWebKitLegacyUnknown_XnCul31fdJ0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_XqLRjTothgA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XqLRjTothgA", libSceNKWebKitLegacyUnknown_XqLRjTothgA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_XrmqhAFeRW4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XrmqhAFeRW4", libSceNKWebKitLegacyUnknown_XrmqhAFeRW4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_XutqeVaOqec_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XutqeVaOqec", libSceNKWebKitLegacyUnknown_XutqeVaOqec_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Xz1rPddzDVg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Xz1rPddzDVg", libSceNKWebKitLegacyUnknown_Xz1rPddzDVg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Y0Koxq4KEkg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Y0Koxq4KEkg", libSceNKWebKitLegacyUnknown_Y0Koxq4KEkg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Y2Jm_plus_RcExHE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Y2Jm+RcExHE", libSceNKWebKitLegacyUnknown_Y2Jm_plus_RcExHE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Y3wceZOjVQk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Y3wceZOjVQk", libSceNKWebKitLegacyUnknown_Y3wceZOjVQk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Y6PHykAxGfg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Y6PHykAxGfg", libSceNKWebKitLegacyUnknown_Y6PHykAxGfg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_YBkEmv18woc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YBkEmv18woc", libSceNKWebKitLegacyUnknown_YBkEmv18woc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_YFxsVHTIE7U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YFxsVHTIE7U", libSceNKWebKitLegacyUnknown_YFxsVHTIE7U_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_YH_minus_MFaHAyyg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YH-MFaHAyyg", libSceNKWebKitLegacyUnknown_YH_minus_MFaHAyyg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_YIhn_plus_OJcAXY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YIhn+OJcAXY", libSceNKWebKitLegacyUnknown_YIhn_plus_OJcAXY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_YIoaVBTsw8c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YIoaVBTsw8c", libSceNKWebKitLegacyUnknown_YIoaVBTsw8c_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_YJ7r9QVu_plus_Us_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YJ7r9QVu+Us", libSceNKWebKitLegacyUnknown_YJ7r9QVu_plus_Us_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_YLSTCl2QgrM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YLSTCl2QgrM", libSceNKWebKitLegacyUnknown_YLSTCl2QgrM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_YMYZ_minus_NoyDe8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YMYZ-NoyDe8", libSceNKWebKitLegacyUnknown_YMYZ_minus_NoyDe8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_YMfvOz7pfZU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YMfvOz7pfZU", libSceNKWebKitLegacyUnknown_YMfvOz7pfZU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_YPnEw0kxArM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YPnEw0kxArM", libSceNKWebKitLegacyUnknown_YPnEw0kxArM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_YQTUOMqlO_plus_I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YQTUOMqlO+I", libSceNKWebKitLegacyUnknown_YQTUOMqlO_plus_I_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_YSJx5IKTaGI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YSJx5IKTaGI", libSceNKWebKitLegacyUnknown_YSJx5IKTaGI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_YSTUNjs1X_minus_Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YSTUNjs1X-Q", libSceNKWebKitLegacyUnknown_YSTUNjs1X_minus_Q_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_YX4eHKXZFzM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YX4eHKXZFzM", libSceNKWebKitLegacyUnknown_YX4eHKXZFzM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_YY6Y_plus_gccbSM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YY6Y+gccbSM", libSceNKWebKitLegacyUnknown_YY6Y_plus_gccbSM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_YYtb1cztSt4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YYtb1cztSt4", libSceNKWebKitLegacyUnknown_YYtb1cztSt4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_YbjmTV_plus_ax8o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YbjmTV+ax8o", libSceNKWebKitLegacyUnknown_YbjmTV_plus_ax8o_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Yc7MS15t82U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Yc7MS15t82U", libSceNKWebKitLegacyUnknown_Yc7MS15t82U_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Yc9WoO8O2TI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Yc9WoO8O2TI", libSceNKWebKitLegacyUnknown_Yc9WoO8O2TI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Ye8GdYv6eQg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ye8GdYv6eQg", libSceNKWebKitLegacyUnknown_Ye8GdYv6eQg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_YeDBQJ9XxA8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YeDBQJ9XxA8", libSceNKWebKitLegacyUnknown_YeDBQJ9XxA8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_YfaTfjLOpSk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YfaTfjLOpSk", libSceNKWebKitLegacyUnknown_YfaTfjLOpSk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_YgE0K2soT1I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YgE0K2soT1I", libSceNKWebKitLegacyUnknown_YgE0K2soT1I_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_YiUqZpp24Qg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YiUqZpp24Qg", libSceNKWebKitLegacyUnknown_YiUqZpp24Qg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_YibE_minus_6u4Qrw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YibE-6u4Qrw", libSceNKWebKitLegacyUnknown_YibE_minus_6u4Qrw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Yjwnz9edXs8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Yjwnz9edXs8", libSceNKWebKitLegacyUnknown_Yjwnz9edXs8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_YkFUQ5ae4TU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YkFUQ5ae4TU", libSceNKWebKitLegacyUnknown_YkFUQ5ae4TU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_YkdhyjfsYA8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YkdhyjfsYA8", libSceNKWebKitLegacyUnknown_YkdhyjfsYA8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Ynq1hrw2xlg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ynq1hrw2xlg", libSceNKWebKitLegacyUnknown_Ynq1hrw2xlg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_YozFcQLcUS4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YozFcQLcUS4", libSceNKWebKitLegacyUnknown_YozFcQLcUS4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_YpbMa2dXQzM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YpbMa2dXQzM", libSceNKWebKitLegacyUnknown_YpbMa2dXQzM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Yvbm9A1hKWA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Yvbm9A1hKWA", libSceNKWebKitLegacyUnknown_Yvbm9A1hKWA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_YvwAxfqATTA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YvwAxfqATTA", libSceNKWebKitLegacyUnknown_YvwAxfqATTA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Yxafith2tNw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Yxafith2tNw", libSceNKWebKitLegacyUnknown_Yxafith2tNw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Z3gQsF6mZZg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Z3gQsF6mZZg", libSceNKWebKitLegacyUnknown_Z3gQsF6mZZg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Z70nLhrFrvE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Z70nLhrFrvE", libSceNKWebKitLegacyUnknown_Z70nLhrFrvE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Z7X7OGIvMqc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Z7X7OGIvMqc", libSceNKWebKitLegacyUnknown_Z7X7OGIvMqc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Z7svZeTUxpg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Z7svZeTUxpg", libSceNKWebKitLegacyUnknown_Z7svZeTUxpg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ZDMkZOif_plus_yo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZDMkZOif+yo", libSceNKWebKitLegacyUnknown_ZDMkZOif_plus_yo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ZFeVn7_plus_X36Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZFeVn7+X36Y", libSceNKWebKitLegacyUnknown_ZFeVn7_plus_X36Y_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ZGc3yyMGbS0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZGc3yyMGbS0", libSceNKWebKitLegacyUnknown_ZGc3yyMGbS0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ZGyS7rVVrR0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZGyS7rVVrR0", libSceNKWebKitLegacyUnknown_ZGyS7rVVrR0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ZH6IIT7suc4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZH6IIT7suc4", libSceNKWebKitLegacyUnknown_ZH6IIT7suc4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ZIyKMovAI5c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZIyKMovAI5c", libSceNKWebKitLegacyUnknown_ZIyKMovAI5c_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ZJoMz_plus_o_minus_jAo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZJoMz+o-jAo", libSceNKWebKitLegacyUnknown_ZJoMz_plus_o_minus_jAo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ZKUhHIwgLsQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZKUhHIwgLsQ", libSceNKWebKitLegacyUnknown_ZKUhHIwgLsQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ZKelftVx9w0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZKelftVx9w0", libSceNKWebKitLegacyUnknown_ZKelftVx9w0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ZTD_minus_3MVA_minus_ko_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZTD-3MVA-ko", libSceNKWebKitLegacyUnknown_ZTD_minus_3MVA_minus_ko_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ZTzz2r6zLoc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZTzz2r6zLoc", libSceNKWebKitLegacyUnknown_ZTzz2r6zLoc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ZVMhnReGqSA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZVMhnReGqSA", libSceNKWebKitLegacyUnknown_ZVMhnReGqSA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ZWJCSrdfz0s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZWJCSrdfz0s", libSceNKWebKitLegacyUnknown_ZWJCSrdfz0s_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ZXz01hGaKEc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZXz01hGaKEc", libSceNKWebKitLegacyUnknown_ZXz01hGaKEc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ZYf8J3iAOqA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZYf8J3iAOqA", libSceNKWebKitLegacyUnknown_ZYf8J3iAOqA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Zbr2ZBysIQ0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Zbr2ZBysIQ0", libSceNKWebKitLegacyUnknown_Zbr2ZBysIQ0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Zde1_plus_uvL7Tw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Zde1+uvL7Tw", libSceNKWebKitLegacyUnknown_Zde1_plus_uvL7Tw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ZeMeznRWk0w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZeMeznRWk0w", libSceNKWebKitLegacyUnknown_ZeMeznRWk0w_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ZewVaBb1pVQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZewVaBb1pVQ", libSceNKWebKitLegacyUnknown_ZewVaBb1pVQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Zex3reFRPzc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Zex3reFRPzc", libSceNKWebKitLegacyUnknown_Zex3reFRPzc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ZfQVzLJrgNY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZfQVzLJrgNY", libSceNKWebKitLegacyUnknown_ZfQVzLJrgNY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Zh1KEFFP74E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Zh1KEFFP74E", libSceNKWebKitLegacyUnknown_Zh1KEFFP74E_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Zje1uXnfnaE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Zje1uXnfnaE", libSceNKWebKitLegacyUnknown_Zje1uXnfnaE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ZjoSrNK_minus_n_plus_o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZjoSrNK-n+o", libSceNKWebKitLegacyUnknown_ZjoSrNK_minus_n_plus_o_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ZkBLOP3Jj9E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZkBLOP3Jj9E", libSceNKWebKitLegacyUnknown_ZkBLOP3Jj9E_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_Zp8kdKB7kKE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Zp8kdKB7kKE", libSceNKWebKitLegacyUnknown_Zp8kdKB7kKE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ZsrAAP9d0cA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZsrAAP9d0cA", libSceNKWebKitLegacyUnknown_ZsrAAP9d0cA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ZuT1KV1VR5o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZuT1KV1VR5o", libSceNKWebKitLegacyUnknown_ZuT1KV1VR5o_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ZvCSTapahr4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZvCSTapahr4", libSceNKWebKitLegacyUnknown_ZvCSTapahr4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_a_plus_km6hI3XmM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("a+km6hI3XmM", libSceNKWebKitLegacyUnknown_a_plus_km6hI3XmM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_a_minus_hR4VbQsMM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("a-hR4VbQsMM", libSceNKWebKitLegacyUnknown_a_minus_hR4VbQsMM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_a0Y_minus_FGkqKJs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("a0Y-FGkqKJs", libSceNKWebKitLegacyUnknown_a0Y_minus_FGkqKJs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_a0bksb5xlc8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("a0bksb5xlc8", libSceNKWebKitLegacyUnknown_a0bksb5xlc8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_a3rhW_minus_q8XQs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("a3rhW-q8XQs", libSceNKWebKitLegacyUnknown_a3rhW_minus_q8XQs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_a4P5tSNq9yE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("a4P5tSNq9yE", libSceNKWebKitLegacyUnknown_a4P5tSNq9yE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_a51bkE3Vyb8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("a51bkE3Vyb8", libSceNKWebKitLegacyUnknown_a51bkE3Vyb8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_a6i347xqjMs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("a6i347xqjMs", libSceNKWebKitLegacyUnknown_a6i347xqjMs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_a7GaTu06OJk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("a7GaTu06OJk", libSceNKWebKitLegacyUnknown_a7GaTu06OJk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_a9Zs7NKm1wc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("a9Zs7NKm1wc", libSceNKWebKitLegacyUnknown_a9Zs7NKm1wc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_aB8FRbUv4mo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aB8FRbUv4mo", libSceNKWebKitLegacyUnknown_aB8FRbUv4mo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_aF3wlbLTmwI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aF3wlbLTmwI", libSceNKWebKitLegacyUnknown_aF3wlbLTmwI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_aL0ECHyeRb0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aL0ECHyeRb0", libSceNKWebKitLegacyUnknown_aL0ECHyeRb0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_aNg0BriFqKg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aNg0BriFqKg", libSceNKWebKitLegacyUnknown_aNg0BriFqKg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_aP0X_minus_4W9Lgg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aP0X-4W9Lgg", libSceNKWebKitLegacyUnknown_aP0X_minus_4W9Lgg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_aPLRiChMvvY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aPLRiChMvvY", libSceNKWebKitLegacyUnknown_aPLRiChMvvY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_aRBAciXgfug_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aRBAciXgfug", libSceNKWebKitLegacyUnknown_aRBAciXgfug_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_aRKF3rRoH2o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aRKF3rRoH2o", libSceNKWebKitLegacyUnknown_aRKF3rRoH2o_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_aRfavhxkoIc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aRfavhxkoIc", libSceNKWebKitLegacyUnknown_aRfavhxkoIc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_aTGaTk6DHfw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aTGaTk6DHfw", libSceNKWebKitLegacyUnknown_aTGaTk6DHfw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_aWmkW6Qm_plus__plus_U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aWmkW6Qm++U", libSceNKWebKitLegacyUnknown_aWmkW6Qm_plus__plus_U_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_aY4BPn5zXHw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aY4BPn5zXHw", libSceNKWebKitLegacyUnknown_aY4BPn5zXHw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_adMZUdkLHqE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("adMZUdkLHqE", libSceNKWebKitLegacyUnknown_adMZUdkLHqE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_aeoeNp7Ujl8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aeoeNp7Ujl8", libSceNKWebKitLegacyUnknown_aeoeNp7Ujl8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_aoAgc7_plus__minus_6Kc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aoAgc7+-6Kc", libSceNKWebKitLegacyUnknown_aoAgc7_plus__minus_6Kc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_apjEBKUh_minus_CQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("apjEBKUh-CQ", libSceNKWebKitLegacyUnknown_apjEBKUh_minus_CQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_arCP3jQ_plus_Jbo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("arCP3jQ+Jbo", libSceNKWebKitLegacyUnknown_arCP3jQ_plus_Jbo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_asSa1lvhVzs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("asSa1lvhVzs", libSceNKWebKitLegacyUnknown_asSa1lvhVzs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_asubj27c4Vg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("asubj27c4Vg", libSceNKWebKitLegacyUnknown_asubj27c4Vg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_aue91NktFx4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aue91NktFx4", libSceNKWebKitLegacyUnknown_aue91NktFx4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_av_minus_FCO70Ci8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("av-FCO70Ci8", libSceNKWebKitLegacyUnknown_av_minus_FCO70Ci8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_axN4ia12Iyo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("axN4ia12Iyo", libSceNKWebKitLegacyUnknown_axN4ia12Iyo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ay86oU9E3EI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ay86oU9E3EI", libSceNKWebKitLegacyUnknown_ay86oU9E3EI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_b_plus__minus_zb6vnBYo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("b+-zb6vnBYo", libSceNKWebKitLegacyUnknown_b_plus__minus_zb6vnBYo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_b_minus_eohnstyik_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("b-eohnstyik", libSceNKWebKitLegacyUnknown_b_minus_eohnstyik_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_b0Mj_minus_9dxn1k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("b0Mj-9dxn1k", libSceNKWebKitLegacyUnknown_b0Mj_minus_9dxn1k_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_b0TvwShFDFs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("b0TvwShFDFs", libSceNKWebKitLegacyUnknown_b0TvwShFDFs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_b0ej_minus_WaBrzk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("b0ej-WaBrzk", libSceNKWebKitLegacyUnknown_b0ej_minus_WaBrzk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_b0sySzeuW1g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("b0sySzeuW1g", libSceNKWebKitLegacyUnknown_b0sySzeuW1g_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_b24EsQw4Ge8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("b24EsQw4Ge8", libSceNKWebKitLegacyUnknown_b24EsQw4Ge8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_b28S1_minus_fSTZQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("b28S1-fSTZQ", libSceNKWebKitLegacyUnknown_b28S1_minus_fSTZQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_b3rDPNhttSI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("b3rDPNhttSI", libSceNKWebKitLegacyUnknown_b3rDPNhttSI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_b4BU62VsgYA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("b4BU62VsgYA", libSceNKWebKitLegacyUnknown_b4BU62VsgYA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_b8HJyPHX26I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("b8HJyPHX26I", libSceNKWebKitLegacyUnknown_b8HJyPHX26I_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_b9bNwUpMY5w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("b9bNwUpMY5w", libSceNKWebKitLegacyUnknown_b9bNwUpMY5w_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_bIAlhZGTsh0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bIAlhZGTsh0", libSceNKWebKitLegacyUnknown_bIAlhZGTsh0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_bIgO5XD4RxA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bIgO5XD4RxA", libSceNKWebKitLegacyUnknown_bIgO5XD4RxA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_bJ6HTP9OLhc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bJ6HTP9OLhc", libSceNKWebKitLegacyUnknown_bJ6HTP9OLhc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_bK7G4c3cHbY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bK7G4c3cHbY", libSceNKWebKitLegacyUnknown_bK7G4c3cHbY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_bKCBjuO0ktM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bKCBjuO0ktM", libSceNKWebKitLegacyUnknown_bKCBjuO0ktM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_bL1R7711ZNA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bL1R7711ZNA", libSceNKWebKitLegacyUnknown_bL1R7711ZNA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_bLm9B8rJJK0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bLm9B8rJJK0", libSceNKWebKitLegacyUnknown_bLm9B8rJJK0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_bLqZd5zFR0s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bLqZd5zFR0s", libSceNKWebKitLegacyUnknown_bLqZd5zFR0s_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_bMSWimwFcww_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bMSWimwFcww", libSceNKWebKitLegacyUnknown_bMSWimwFcww_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_bMzSvkfgMEU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bMzSvkfgMEU", libSceNKWebKitLegacyUnknown_bMzSvkfgMEU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_bNeY0cKkjBM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bNeY0cKkjBM", libSceNKWebKitLegacyUnknown_bNeY0cKkjBM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_bQdate8ybz8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bQdate8ybz8", libSceNKWebKitLegacyUnknown_bQdate8ybz8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_bQvSyDp1Igo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bQvSyDp1Igo", libSceNKWebKitLegacyUnknown_bQvSyDp1Igo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_bRMpa4zkung_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bRMpa4zkung", libSceNKWebKitLegacyUnknown_bRMpa4zkung_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_bU0llzXLpXo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bU0llzXLpXo", libSceNKWebKitLegacyUnknown_bU0llzXLpXo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_bUCul5MjZcQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bUCul5MjZcQ", libSceNKWebKitLegacyUnknown_bUCul5MjZcQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_bWVxyOJYjZw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bWVxyOJYjZw", libSceNKWebKitLegacyUnknown_bWVxyOJYjZw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_bZYKXT_plus_p6Rw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bZYKXT+p6Rw", libSceNKWebKitLegacyUnknown_bZYKXT_plus_p6Rw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_bdLj8YKhyTw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bdLj8YKhyTw", libSceNKWebKitLegacyUnknown_bdLj8YKhyTw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_bf9DmWEMjZg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bf9DmWEMjZg", libSceNKWebKitLegacyUnknown_bf9DmWEMjZg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_bfgzXZxYkpw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bfgzXZxYkpw", libSceNKWebKitLegacyUnknown_bfgzXZxYkpw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_bfunI2KsEys_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bfunI2KsEys", libSceNKWebKitLegacyUnknown_bfunI2KsEys_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_bhAs4QggKkM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bhAs4QggKkM", libSceNKWebKitLegacyUnknown_bhAs4QggKkM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_bhbcVkPa6RI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bhbcVkPa6RI", libSceNKWebKitLegacyUnknown_bhbcVkPa6RI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_bk1XvWVITTc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bk1XvWVITTc", libSceNKWebKitLegacyUnknown_bk1XvWVITTc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_blgK3ktWIdw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("blgK3ktWIdw", libSceNKWebKitLegacyUnknown_blgK3ktWIdw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_blx3VqDu8LY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("blx3VqDu8LY", libSceNKWebKitLegacyUnknown_blx3VqDu8LY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_bqeYTznqCq0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bqeYTznqCq0", libSceNKWebKitLegacyUnknown_bqeYTznqCq0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_btecxUhKaBA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("btecxUhKaBA", libSceNKWebKitLegacyUnknown_btecxUhKaBA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_bub7IttNbmw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bub7IttNbmw", libSceNKWebKitLegacyUnknown_bub7IttNbmw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_bwd0PkfdVqg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bwd0PkfdVqg", libSceNKWebKitLegacyUnknown_bwd0PkfdVqg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_c_plus_Y5l4iz_plus_lE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("c+Y5l4iz+lE", libSceNKWebKitLegacyUnknown_c_plus_Y5l4iz_plus_lE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_c_plus_iQ_plus_GiUuC0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("c+iQ+GiUuC0", libSceNKWebKitLegacyUnknown_c_plus_iQ_plus_GiUuC0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_c_minus_B36418E98_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("c-B36418E98", libSceNKWebKitLegacyUnknown_c_minus_B36418E98_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_c_minus_a_plus_EQMdXpo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("c-a+EQMdXpo", libSceNKWebKitLegacyUnknown_c_minus_a_plus_EQMdXpo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_c11C_minus_fn9vZg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("c11C-fn9vZg", libSceNKWebKitLegacyUnknown_c11C_minus_fn9vZg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_c2_minus_jXzNCn5M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("c2-jXzNCn5M", libSceNKWebKitLegacyUnknown_c2_minus_jXzNCn5M_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_c8QrOAdar0E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("c8QrOAdar0E", libSceNKWebKitLegacyUnknown_c8QrOAdar0E_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_c9XbEhLwkjw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("c9XbEhLwkjw", libSceNKWebKitLegacyUnknown_c9XbEhLwkjw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_cAxbLiUQcu0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cAxbLiUQcu0", libSceNKWebKitLegacyUnknown_cAxbLiUQcu0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_cC15lQACT2I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cC15lQACT2I", libSceNKWebKitLegacyUnknown_cC15lQACT2I_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_cC9KrTAFBuk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cC9KrTAFBuk", libSceNKWebKitLegacyUnknown_cC9KrTAFBuk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_cEDXATPf1ZE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cEDXATPf1ZE", libSceNKWebKitLegacyUnknown_cEDXATPf1ZE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_cFPSQe7KGBo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cFPSQe7KGBo", libSceNKWebKitLegacyUnknown_cFPSQe7KGBo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_cFi5bW1xv5A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cFi5bW1xv5A", libSceNKWebKitLegacyUnknown_cFi5bW1xv5A_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_cFsWvjIGSME_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cFsWvjIGSME", libSceNKWebKitLegacyUnknown_cFsWvjIGSME_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_cG7spfNJ9o0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cG7spfNJ9o0", libSceNKWebKitLegacyUnknown_cG7spfNJ9o0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_cGa7C2V0mG8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cGa7C2V0mG8", libSceNKWebKitLegacyUnknown_cGa7C2V0mG8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_cJgFKARD73M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cJgFKARD73M", libSceNKWebKitLegacyUnknown_cJgFKARD73M_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_cLdg9UqH2bM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cLdg9UqH2bM", libSceNKWebKitLegacyUnknown_cLdg9UqH2bM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_cNrLnyzLDqg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cNrLnyzLDqg", libSceNKWebKitLegacyUnknown_cNrLnyzLDqg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_cOVqfTsm6i4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cOVqfTsm6i4", libSceNKWebKitLegacyUnknown_cOVqfTsm6i4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_cSkKJIJGV6k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cSkKJIJGV6k", libSceNKWebKitLegacyUnknown_cSkKJIJGV6k_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_cWhUEvN1sPM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cWhUEvN1sPM", libSceNKWebKitLegacyUnknown_cWhUEvN1sPM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_cWkAVHLzoMk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cWkAVHLzoMk", libSceNKWebKitLegacyUnknown_cWkAVHLzoMk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_cXxWzbWi9dE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cXxWzbWi9dE", libSceNKWebKitLegacyUnknown_cXxWzbWi9dE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_cYdqE_minus_4jp7o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cYdqE-4jp7o", libSceNKWebKitLegacyUnknown_cYdqE_minus_4jp7o_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_cZJFK2VPA_plus_s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cZJFK2VPA+s", libSceNKWebKitLegacyUnknown_cZJFK2VPA_plus_s_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_cbSw7XoHt_minus_k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cbSw7XoHt-k", libSceNKWebKitLegacyUnknown_cbSw7XoHt_minus_k_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_cbnC1jsRLzI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cbnC1jsRLzI", libSceNKWebKitLegacyUnknown_cbnC1jsRLzI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ce_plus_00gaZAN0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ce+00gaZAN0", libSceNKWebKitLegacyUnknown_ce_plus_00gaZAN0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_cgTvG0jp_plus_MY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cgTvG0jp+MY", libSceNKWebKitLegacyUnknown_cgTvG0jp_plus_MY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_cgYcQIHDtlU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cgYcQIHDtlU", libSceNKWebKitLegacyUnknown_cgYcQIHDtlU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_chXuVQrRI94_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("chXuVQrRI94", libSceNKWebKitLegacyUnknown_chXuVQrRI94_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_clmZOokkqHA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("clmZOokkqHA", libSceNKWebKitLegacyUnknown_clmZOokkqHA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_cot6LYWF_minus_Ow_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cot6LYWF-Ow", libSceNKWebKitLegacyUnknown_cot6LYWF_minus_Ow_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_cowaLyqYExA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cowaLyqYExA", libSceNKWebKitLegacyUnknown_cowaLyqYExA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_csI7RzcFXRE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("csI7RzcFXRE", libSceNKWebKitLegacyUnknown_csI7RzcFXRE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_cvRjESxp7QM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cvRjESxp7QM", libSceNKWebKitLegacyUnknown_cvRjESxp7QM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_cvTYAEyd_plus_cs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cvTYAEyd+cs", libSceNKWebKitLegacyUnknown_cvTYAEyd_plus_cs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_cxyAtDRWyvQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cxyAtDRWyvQ", libSceNKWebKitLegacyUnknown_cxyAtDRWyvQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_czYtDOJxbwc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("czYtDOJxbwc", libSceNKWebKitLegacyUnknown_czYtDOJxbwc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_cziLsQ2mp9k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cziLsQ2mp9k", libSceNKWebKitLegacyUnknown_cziLsQ2mp9k_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_d_plus_c5fq1tjZk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("d+c5fq1tjZk", libSceNKWebKitLegacyUnknown_d_plus_c5fq1tjZk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_d0DP2t5FZmY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("d0DP2t5FZmY", libSceNKWebKitLegacyUnknown_d0DP2t5FZmY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_d0DUtS4NbvM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("d0DUtS4NbvM", libSceNKWebKitLegacyUnknown_d0DUtS4NbvM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_d0bS5rA7fCk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("d0bS5rA7fCk", libSceNKWebKitLegacyUnknown_d0bS5rA7fCk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_d88b2LEdd2Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("d88b2LEdd2Q", libSceNKWebKitLegacyUnknown_d88b2LEdd2Q_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_dFMHRcV7j2Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dFMHRcV7j2Y", libSceNKWebKitLegacyUnknown_dFMHRcV7j2Y_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_dFZTklj4f8U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dFZTklj4f8U", libSceNKWebKitLegacyUnknown_dFZTklj4f8U_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_dFvQIOI_minus_g98_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dFvQIOI-g98", libSceNKWebKitLegacyUnknown_dFvQIOI_minus_g98_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_dGgPG3NxLOY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dGgPG3NxLOY", libSceNKWebKitLegacyUnknown_dGgPG3NxLOY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_dHEUIM99LTw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dHEUIM99LTw", libSceNKWebKitLegacyUnknown_dHEUIM99LTw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_dJGMa_plus_okDOg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dJGMa+okDOg", libSceNKWebKitLegacyUnknown_dJGMa_plus_okDOg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_dJQV4HTNzuQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dJQV4HTNzuQ", libSceNKWebKitLegacyUnknown_dJQV4HTNzuQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_dKu10FXNBC0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dKu10FXNBC0", libSceNKWebKitLegacyUnknown_dKu10FXNBC0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_dLRVhzwk4h4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dLRVhzwk4h4", libSceNKWebKitLegacyUnknown_dLRVhzwk4h4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_dPRTZh5BsuU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dPRTZh5BsuU", libSceNKWebKitLegacyUnknown_dPRTZh5BsuU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_dRNCLyDeAM8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dRNCLyDeAM8", libSceNKWebKitLegacyUnknown_dRNCLyDeAM8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_dSbNeGQsi_plus_k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dSbNeGQsi+k", libSceNKWebKitLegacyUnknown_dSbNeGQsi_plus_k_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_dThMLuDxuM0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dThMLuDxuM0", libSceNKWebKitLegacyUnknown_dThMLuDxuM0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_dVw2spCtjmg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dVw2spCtjmg", libSceNKWebKitLegacyUnknown_dVw2spCtjmg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_dWbZ_minus_HBojqU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dWbZ-HBojqU", libSceNKWebKitLegacyUnknown_dWbZ_minus_HBojqU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_dWih9qPFB38_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dWih9qPFB38", libSceNKWebKitLegacyUnknown_dWih9qPFB38_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_dXdRdbl9xtU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dXdRdbl9xtU", libSceNKWebKitLegacyUnknown_dXdRdbl9xtU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_depsxzkj_minus_Dc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("depsxzkj-Dc", libSceNKWebKitLegacyUnknown_depsxzkj_minus_Dc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_df8bbmIdNIM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("df8bbmIdNIM", libSceNKWebKitLegacyUnknown_df8bbmIdNIM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_dgY_plus_IAMNNNU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dgY+IAMNNNU", libSceNKWebKitLegacyUnknown_dgY_plus_IAMNNNU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_dj3Gl1YYvJ8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dj3Gl1YYvJ8", libSceNKWebKitLegacyUnknown_dj3Gl1YYvJ8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_dlnCxzP9v24_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dlnCxzP9v24", libSceNKWebKitLegacyUnknown_dlnCxzP9v24_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_dnvpRyqCZtA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dnvpRyqCZtA", libSceNKWebKitLegacyUnknown_dnvpRyqCZtA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_do8mXcIf7SA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("do8mXcIf7SA", libSceNKWebKitLegacyUnknown_do8mXcIf7SA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_dqIP0RA9gtg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dqIP0RA9gtg", libSceNKWebKitLegacyUnknown_dqIP0RA9gtg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_dsY0Mmpb_plus_Mk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dsY0Mmpb+Mk", libSceNKWebKitLegacyUnknown_dsY0Mmpb_plus_Mk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_dtnKsC6nivE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dtnKsC6nivE", libSceNKWebKitLegacyUnknown_dtnKsC6nivE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_duXH3bhyztI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("duXH3bhyztI", libSceNKWebKitLegacyUnknown_duXH3bhyztI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_dwW65etqqMg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dwW65etqqMg", libSceNKWebKitLegacyUnknown_dwW65etqqMg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_e1_minus_41W6j0pA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("e1-41W6j0pA", libSceNKWebKitLegacyUnknown_e1_minus_41W6j0pA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_e1I_minus_WZknBEk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("e1I-WZknBEk", libSceNKWebKitLegacyUnknown_e1I_minus_WZknBEk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_e2VSkMBqCfY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("e2VSkMBqCfY", libSceNKWebKitLegacyUnknown_e2VSkMBqCfY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_e371vKyHvfE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("e371vKyHvfE", libSceNKWebKitLegacyUnknown_e371vKyHvfE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_e39S_plus_saPElI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("e39S+saPElI", libSceNKWebKitLegacyUnknown_e39S_plus_saPElI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_e3G2dB0myhM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("e3G2dB0myhM", libSceNKWebKitLegacyUnknown_e3G2dB0myhM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_e52cFlZ1trI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("e52cFlZ1trI", libSceNKWebKitLegacyUnknown_e52cFlZ1trI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_e70IJ6o4pR0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("e70IJ6o4pR0", libSceNKWebKitLegacyUnknown_e70IJ6o4pR0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_e8Swq6_plus_iac4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("e8Swq6+iac4", libSceNKWebKitLegacyUnknown_e8Swq6_plus_iac4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_e9ZLQs9eieE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("e9ZLQs9eieE", libSceNKWebKitLegacyUnknown_e9ZLQs9eieE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_eCcP4R3yhqE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eCcP4R3yhqE", libSceNKWebKitLegacyUnknown_eCcP4R3yhqE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_eFGLtTGFSzE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eFGLtTGFSzE", libSceNKWebKitLegacyUnknown_eFGLtTGFSzE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_eFOwwrcE3ks_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eFOwwrcE3ks", libSceNKWebKitLegacyUnknown_eFOwwrcE3ks_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_eFge2lVHxN4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eFge2lVHxN4", libSceNKWebKitLegacyUnknown_eFge2lVHxN4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_eKQ5_minus_Dfmgdc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eKQ5-Dfmgdc", libSceNKWebKitLegacyUnknown_eKQ5_minus_Dfmgdc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_eLHkTK2CtH8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eLHkTK2CtH8", libSceNKWebKitLegacyUnknown_eLHkTK2CtH8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_eMJMNjD3zSU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eMJMNjD3zSU", libSceNKWebKitLegacyUnknown_eMJMNjD3zSU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_eNjbJhrJ_plus_Gg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eNjbJhrJ+Gg", libSceNKWebKitLegacyUnknown_eNjbJhrJ_plus_Gg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_eTk_plus_2NucJ8k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eTk+2NucJ8k", libSceNKWebKitLegacyUnknown_eTk_plus_2NucJ8k_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_eU0DzhcCkrM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eU0DzhcCkrM", libSceNKWebKitLegacyUnknown_eU0DzhcCkrM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_eVMV4cDOBx0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eVMV4cDOBx0", libSceNKWebKitLegacyUnknown_eVMV4cDOBx0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_eVqH4H3UwCg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eVqH4H3UwCg", libSceNKWebKitLegacyUnknown_eVqH4H3UwCg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ebIt5wB486o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ebIt5wB486o", libSceNKWebKitLegacyUnknown_ebIt5wB486o_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ebUc7pZI1Cg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ebUc7pZI1Cg", libSceNKWebKitLegacyUnknown_ebUc7pZI1Cg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ecqOUdMuexk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ecqOUdMuexk", libSceNKWebKitLegacyUnknown_ecqOUdMuexk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_edZTNtnTPxk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("edZTNtnTPxk", libSceNKWebKitLegacyUnknown_edZTNtnTPxk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_eggC_minus_ROINpQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eggC-ROINpQ", libSceNKWebKitLegacyUnknown_eggC_minus_ROINpQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_eh1qV7hTFHc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eh1qV7hTFHc", libSceNKWebKitLegacyUnknown_eh1qV7hTFHc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ei7p_minus_kKZI4s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ei7p-kKZI4s", libSceNKWebKitLegacyUnknown_ei7p_minus_kKZI4s_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ejW3kZyq550_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ejW3kZyq550", libSceNKWebKitLegacyUnknown_ejW3kZyq550_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_el2VQZjPsB4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("el2VQZjPsB4", libSceNKWebKitLegacyUnknown_el2VQZjPsB4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_em_plus_OiNKBmXM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("em+OiNKBmXM", libSceNKWebKitLegacyUnknown_em_plus_OiNKBmXM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_em_minus_bg_plus_dEIGw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("em-bg+dEIGw", libSceNKWebKitLegacyUnknown_em_minus_bg_plus_dEIGw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_enKUAms1L14_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("enKUAms1L14", libSceNKWebKitLegacyUnknown_enKUAms1L14_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_enYlHQ6Y4vM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("enYlHQ6Y4vM", libSceNKWebKitLegacyUnknown_enYlHQ6Y4vM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ep4jllwrg_minus_Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ep4jllwrg-Q", libSceNKWebKitLegacyUnknown_ep4jllwrg_minus_Q_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_eqqTGKb9ge4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eqqTGKb9ge4", libSceNKWebKitLegacyUnknown_eqqTGKb9ge4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_eriWeAfd_minus_f8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eriWeAfd-f8", libSceNKWebKitLegacyUnknown_eriWeAfd_minus_f8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_etccDVR9oQc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("etccDVR9oQc", libSceNKWebKitLegacyUnknown_etccDVR9oQc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ex_minus_8kA3X5ZQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ex-8kA3X5ZQ", libSceNKWebKitLegacyUnknown_ex_minus_8kA3X5ZQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_exHtP0yFfCI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("exHtP0yFfCI", libSceNKWebKitLegacyUnknown_exHtP0yFfCI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_eyRMFoPEX_plus_8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eyRMFoPEX+8", libSceNKWebKitLegacyUnknown_eyRMFoPEX_plus_8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_eyczRhn1VpI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eyczRhn1VpI", libSceNKWebKitLegacyUnknown_eyczRhn1VpI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_f_plus_SLvBCIGJM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("f+SLvBCIGJM", libSceNKWebKitLegacyUnknown_f_plus_SLvBCIGJM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_f_plus_WgWFQQlAk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("f+WgWFQQlAk", libSceNKWebKitLegacyUnknown_f_plus_WgWFQQlAk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_f0DqjWri_plus_Rs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("f0DqjWri+Rs", libSceNKWebKitLegacyUnknown_f0DqjWri_plus_Rs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_f0boz4mowL0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("f0boz4mowL0", libSceNKWebKitLegacyUnknown_f0boz4mowL0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_f1I6Y18jKbk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("f1I6Y18jKbk", libSceNKWebKitLegacyUnknown_f1I6Y18jKbk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_f5unyVgtmMo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("f5unyVgtmMo", libSceNKWebKitLegacyUnknown_f5unyVgtmMo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_fAIbZgFxkAw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fAIbZgFxkAw", libSceNKWebKitLegacyUnknown_fAIbZgFxkAw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_fBAOyg5CjPk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fBAOyg5CjPk", libSceNKWebKitLegacyUnknown_fBAOyg5CjPk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_fDSQzivDRQs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fDSQzivDRQs", libSceNKWebKitLegacyUnknown_fDSQzivDRQs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_fJL1Jbevd7E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fJL1Jbevd7E", libSceNKWebKitLegacyUnknown_fJL1Jbevd7E_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_fKewW7GoCyM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fKewW7GoCyM", libSceNKWebKitLegacyUnknown_fKewW7GoCyM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_fOUbugIEVtw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fOUbugIEVtw", libSceNKWebKitLegacyUnknown_fOUbugIEVtw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_fOYZMvOOV1k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fOYZMvOOV1k", libSceNKWebKitLegacyUnknown_fOYZMvOOV1k_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_fOnE_plus__plus_USWAA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fOnE++USWAA", libSceNKWebKitLegacyUnknown_fOnE_plus__plus_USWAA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_fP3rUkRGQRs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fP3rUkRGQRs", libSceNKWebKitLegacyUnknown_fP3rUkRGQRs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_fRnqy7U_minus__minus_7c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fRnqy7U--7c", libSceNKWebKitLegacyUnknown_fRnqy7U_minus__minus_7c_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_fSFuf3CCfr0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fSFuf3CCfr0", libSceNKWebKitLegacyUnknown_fSFuf3CCfr0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_fSJY0qZksXA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fSJY0qZksXA", libSceNKWebKitLegacyUnknown_fSJY0qZksXA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_fWS_plus_J774W_minus_8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fWS+J774W-8", libSceNKWebKitLegacyUnknown_fWS_plus_J774W_minus_8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_fZP8WImnYPk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fZP8WImnYPk", libSceNKWebKitLegacyUnknown_fZP8WImnYPk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_fZXLBloYyW4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fZXLBloYyW4", libSceNKWebKitLegacyUnknown_fZXLBloYyW4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_faFn1OdjAEU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("faFn1OdjAEU", libSceNKWebKitLegacyUnknown_faFn1OdjAEU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_fbcChE1Aoj0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fbcChE1Aoj0", libSceNKWebKitLegacyUnknown_fbcChE1Aoj0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_feSywBTpZHk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("feSywBTpZHk", libSceNKWebKitLegacyUnknown_feSywBTpZHk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_fkKkBR8BrAM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fkKkBR8BrAM", libSceNKWebKitLegacyUnknown_fkKkBR8BrAM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_fp9jJns8XKk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fp9jJns8XKk", libSceNKWebKitLegacyUnknown_fp9jJns8XKk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_fsAxhc4e6Nc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fsAxhc4e6Nc", libSceNKWebKitLegacyUnknown_fsAxhc4e6Nc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_fxsKnwXGxTU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fxsKnwXGxTU", libSceNKWebKitLegacyUnknown_fxsKnwXGxTU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_g_plus_0IclokPhQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("g+0IclokPhQ", libSceNKWebKitLegacyUnknown_g_plus_0IclokPhQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_g_minus_YGvjkxxxI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("g-YGvjkxxxI", libSceNKWebKitLegacyUnknown_g_minus_YGvjkxxxI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_g0GJlFChT1A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("g0GJlFChT1A", libSceNKWebKitLegacyUnknown_g0GJlFChT1A_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_g1E3WhunWTM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("g1E3WhunWTM", libSceNKWebKitLegacyUnknown_g1E3WhunWTM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_g1uaNydmRiE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("g1uaNydmRiE", libSceNKWebKitLegacyUnknown_g1uaNydmRiE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_g2E1_minus_92pDbg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("g2E1-92pDbg", libSceNKWebKitLegacyUnknown_g2E1_minus_92pDbg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_g5n1MMQCGVA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("g5n1MMQCGVA", libSceNKWebKitLegacyUnknown_g5n1MMQCGVA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_g7Hvx_minus_ehBFQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("g7Hvx-ehBFQ", libSceNKWebKitLegacyUnknown_g7Hvx_minus_ehBFQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_gBnrzm5RFYo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gBnrzm5RFYo", libSceNKWebKitLegacyUnknown_gBnrzm5RFYo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_gIbQOmmIzww_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gIbQOmmIzww", libSceNKWebKitLegacyUnknown_gIbQOmmIzww_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_gLM4PHewJwA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gLM4PHewJwA", libSceNKWebKitLegacyUnknown_gLM4PHewJwA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_gMxgHWueHYc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gMxgHWueHYc", libSceNKWebKitLegacyUnknown_gMxgHWueHYc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_gOMMTICNZ5w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gOMMTICNZ5w", libSceNKWebKitLegacyUnknown_gOMMTICNZ5w_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_gOqThDYWBBU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gOqThDYWBBU", libSceNKWebKitLegacyUnknown_gOqThDYWBBU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_gQzR0P0bF4Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gQzR0P0bF4Y", libSceNKWebKitLegacyUnknown_gQzR0P0bF4Y_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_gRV9y5UZ7eE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gRV9y5UZ7eE", libSceNKWebKitLegacyUnknown_gRV9y5UZ7eE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_gT6fmEJqgZc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gT6fmEJqgZc", libSceNKWebKitLegacyUnknown_gT6fmEJqgZc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_gTO7zb4lVNI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gTO7zb4lVNI", libSceNKWebKitLegacyUnknown_gTO7zb4lVNI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_gUAJQaumS_plus_A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gUAJQaumS+A", libSceNKWebKitLegacyUnknown_gUAJQaumS_plus_A_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_gWevp6rEByo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gWevp6rEByo", libSceNKWebKitLegacyUnknown_gWevp6rEByo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_gXUoxM2WN8Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gXUoxM2WN8Q", libSceNKWebKitLegacyUnknown_gXUoxM2WN8Q_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_gXij3LJRnFA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gXij3LJRnFA", libSceNKWebKitLegacyUnknown_gXij3LJRnFA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_gXuYfkkAi4A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gXuYfkkAi4A", libSceNKWebKitLegacyUnknown_gXuYfkkAi4A_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_gY2jWNd2xEs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gY2jWNd2xEs", libSceNKWebKitLegacyUnknown_gY2jWNd2xEs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_gYJFBIIydKQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gYJFBIIydKQ", libSceNKWebKitLegacyUnknown_gYJFBIIydKQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_gjtdykMP3E0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gjtdykMP3E0", libSceNKWebKitLegacyUnknown_gjtdykMP3E0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_gm9wWQ83CiA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gm9wWQ83CiA", libSceNKWebKitLegacyUnknown_gm9wWQ83CiA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_gn9owvTklTg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gn9owvTklTg", libSceNKWebKitLegacyUnknown_gn9owvTklTg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_gpyl0AiklOE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gpyl0AiklOE", libSceNKWebKitLegacyUnknown_gpyl0AiklOE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_gt0iNtXwf_minus_E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gt0iNtXwf-E", libSceNKWebKitLegacyUnknown_gt0iNtXwf_minus_E_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_gtIpEDDn76I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gtIpEDDn76I", libSceNKWebKitLegacyUnknown_gtIpEDDn76I_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_gzF2sqsXebA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gzF2sqsXebA", libSceNKWebKitLegacyUnknown_gzF2sqsXebA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_h_minus_9nlM_minus_y_minus_es_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("h-9nlM-y-es", libSceNKWebKitLegacyUnknown_h_minus_9nlM_minus_y_minus_es_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_h033Ypm8Gnw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("h033Ypm8Gnw", libSceNKWebKitLegacyUnknown_h033Ypm8Gnw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_h1AGMerP6FY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("h1AGMerP6FY", libSceNKWebKitLegacyUnknown_h1AGMerP6FY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_h1H0lfkv_plus_r8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("h1H0lfkv+r8", libSceNKWebKitLegacyUnknown_h1H0lfkv_plus_r8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_h1Y6_plus_W0pbEU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("h1Y6+W0pbEU", libSceNKWebKitLegacyUnknown_h1Y6_plus_W0pbEU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_h3V_minus_eJQjgUo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("h3V-eJQjgUo", libSceNKWebKitLegacyUnknown_h3V_minus_eJQjgUo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_h5eLTrmb9g0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("h5eLTrmb9g0", libSceNKWebKitLegacyUnknown_h5eLTrmb9g0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_h7GP5Dqx6vU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("h7GP5Dqx6vU", libSceNKWebKitLegacyUnknown_h7GP5Dqx6vU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_h98n0NfD2sw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("h98n0NfD2sw", libSceNKWebKitLegacyUnknown_h98n0NfD2sw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_hCF6Jgsd5a8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hCF6Jgsd5a8", libSceNKWebKitLegacyUnknown_hCF6Jgsd5a8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_hCLmkViDUwQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hCLmkViDUwQ", libSceNKWebKitLegacyUnknown_hCLmkViDUwQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_hE4Ufn9mDPU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hE4Ufn9mDPU", libSceNKWebKitLegacyUnknown_hE4Ufn9mDPU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_hGHcnf8w9og_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hGHcnf8w9og", libSceNKWebKitLegacyUnknown_hGHcnf8w9og_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_hGfEVeMS6Ls_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hGfEVeMS6Ls", libSceNKWebKitLegacyUnknown_hGfEVeMS6Ls_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_hIw_minus_HVb2_minus_2g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hIw-HVb2-2g", libSceNKWebKitLegacyUnknown_hIw_minus_HVb2_minus_2g_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_hJCR02OuhWk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hJCR02OuhWk", libSceNKWebKitLegacyUnknown_hJCR02OuhWk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_hJQ0B3t2B7M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hJQ0B3t2B7M", libSceNKWebKitLegacyUnknown_hJQ0B3t2B7M_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_hJYQb6B5fyE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hJYQb6B5fyE", libSceNKWebKitLegacyUnknown_hJYQb6B5fyE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_hJwDGgzFpPI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hJwDGgzFpPI", libSceNKWebKitLegacyUnknown_hJwDGgzFpPI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_hKSUg0S_minus_yQ0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hKSUg0S-yQ0", libSceNKWebKitLegacyUnknown_hKSUg0S_minus_yQ0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_hKwJdBxEWPY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hKwJdBxEWPY", libSceNKWebKitLegacyUnknown_hKwJdBxEWPY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_hL_plus_TQCVUCKM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hL+TQCVUCKM", libSceNKWebKitLegacyUnknown_hL_plus_TQCVUCKM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_hLEQlRxP61c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hLEQlRxP61c", libSceNKWebKitLegacyUnknown_hLEQlRxP61c_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_hN20Q01A0zA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hN20Q01A0zA", libSceNKWebKitLegacyUnknown_hN20Q01A0zA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_hN6PS5MQn0U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hN6PS5MQn0U", libSceNKWebKitLegacyUnknown_hN6PS5MQn0U_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_hN9JhD71QI4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hN9JhD71QI4", libSceNKWebKitLegacyUnknown_hN9JhD71QI4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_hT3IF0_minus_rq68_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hT3IF0-rq68", libSceNKWebKitLegacyUnknown_hT3IF0_minus_rq68_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_hZRpuLDxEgw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hZRpuLDxEgw", libSceNKWebKitLegacyUnknown_hZRpuLDxEgw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ha_plus_LsDS43YA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ha+LsDS43YA", libSceNKWebKitLegacyUnknown_ha_plus_LsDS43YA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ha_minus__minus_9DAYPKE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ha--9DAYPKE", libSceNKWebKitLegacyUnknown_ha_minus__minus_9DAYPKE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_hbT3Z0Hd3rg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hbT3Z0Hd3rg", libSceNKWebKitLegacyUnknown_hbT3Z0Hd3rg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_hc_plus_m2tz17Wk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hc+m2tz17Wk", libSceNKWebKitLegacyUnknown_hc_plus_m2tz17Wk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_hdM_minus_MBguFoI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hdM-MBguFoI", libSceNKWebKitLegacyUnknown_hdM_minus_MBguFoI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_heuaiZIWVUI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("heuaiZIWVUI", libSceNKWebKitLegacyUnknown_heuaiZIWVUI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_hfG05rRUDak_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hfG05rRUDak", libSceNKWebKitLegacyUnknown_hfG05rRUDak_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_higl4mkfHJ4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("higl4mkfHJ4", libSceNKWebKitLegacyUnknown_higl4mkfHJ4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_hkBGH3N_minus_oi8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hkBGH3N-oi8", libSceNKWebKitLegacyUnknown_hkBGH3N_minus_oi8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_hkDKEOQqTr8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hkDKEOQqTr8", libSceNKWebKitLegacyUnknown_hkDKEOQqTr8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_hl3Bo4_minus_gnDc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hl3Bo4-gnDc", libSceNKWebKitLegacyUnknown_hl3Bo4_minus_gnDc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_hmLqFAw8q5Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hmLqFAw8q5Q", libSceNKWebKitLegacyUnknown_hmLqFAw8q5Q_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_hmpkWEqMGME_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hmpkWEqMGME", libSceNKWebKitLegacyUnknown_hmpkWEqMGME_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_htC03ZGwLRE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("htC03ZGwLRE", libSceNKWebKitLegacyUnknown_htC03ZGwLRE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_htfDiQ4Se9U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("htfDiQ4Se9U", libSceNKWebKitLegacyUnknown_htfDiQ4Se9U_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_huAFVySj7xk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("huAFVySj7xk", libSceNKWebKitLegacyUnknown_huAFVySj7xk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_hucTWmWOIJs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hucTWmWOIJs", libSceNKWebKitLegacyUnknown_hucTWmWOIJs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_hvch5hb_minus_tM0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hvch5hb-tM0", libSceNKWebKitLegacyUnknown_hvch5hb_minus_tM0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_hydr_plus_dle5x4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hydr+dle5x4", libSceNKWebKitLegacyUnknown_hydr_plus_dle5x4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_hzQL_minus_pMsVGU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hzQL-pMsVGU", libSceNKWebKitLegacyUnknown_hzQL_minus_pMsVGU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_hzSGJKJYwI4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hzSGJKJYwI4", libSceNKWebKitLegacyUnknown_hzSGJKJYwI4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_i_plus_In6Gi0Fwo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("i+In6Gi0Fwo", libSceNKWebKitLegacyUnknown_i_plus_In6Gi0Fwo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_i05rR6EBImo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("i05rR6EBImo", libSceNKWebKitLegacyUnknown_i05rR6EBImo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_i1JK_plus_VUlKWM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("i1JK+VUlKWM", libSceNKWebKitLegacyUnknown_i1JK_plus_VUlKWM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_i2jo27JK9ho_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("i2jo27JK9ho", libSceNKWebKitLegacyUnknown_i2jo27JK9ho_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_i35pMXdpi0U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("i35pMXdpi0U", libSceNKWebKitLegacyUnknown_i35pMXdpi0U_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_i3ETrbVSEV8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("i3ETrbVSEV8", libSceNKWebKitLegacyUnknown_i3ETrbVSEV8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_i3RlS3yopbc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("i3RlS3yopbc", libSceNKWebKitLegacyUnknown_i3RlS3yopbc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_i3aHaHZtiqE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("i3aHaHZtiqE", libSceNKWebKitLegacyUnknown_i3aHaHZtiqE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_i5Lqdyi9tqo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("i5Lqdyi9tqo", libSceNKWebKitLegacyUnknown_i5Lqdyi9tqo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_iAPk_minus_NMyhEE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iAPk-NMyhEE", libSceNKWebKitLegacyUnknown_iAPk_minus_NMyhEE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_iAnfNJv8WMM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iAnfNJv8WMM", libSceNKWebKitLegacyUnknown_iAnfNJv8WMM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_iDPs63X_minus_Cl8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iDPs63X-Cl8", libSceNKWebKitLegacyUnknown_iDPs63X_minus_Cl8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_iEIYS2CqT9g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iEIYS2CqT9g", libSceNKWebKitLegacyUnknown_iEIYS2CqT9g_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_iENy8SuPHL0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iENy8SuPHL0", libSceNKWebKitLegacyUnknown_iENy8SuPHL0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_iHKuL5BOd4g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iHKuL5BOd4g", libSceNKWebKitLegacyUnknown_iHKuL5BOd4g_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_iIy_minus_Tl_plus_Ctug_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iIy-Tl+Ctug", libSceNKWebKitLegacyUnknown_iIy_minus_Tl_plus_Ctug_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_iJ6wmI0tj0o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iJ6wmI0tj0o", libSceNKWebKitLegacyUnknown_iJ6wmI0tj0o_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_iKh5XAJ3Htw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iKh5XAJ3Htw", libSceNKWebKitLegacyUnknown_iKh5XAJ3Htw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_iPQjy3HrG38_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iPQjy3HrG38", libSceNKWebKitLegacyUnknown_iPQjy3HrG38_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_iPcGPUsuc9U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iPcGPUsuc9U", libSceNKWebKitLegacyUnknown_iPcGPUsuc9U_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_iS_minus_Vvo7MaQ4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iS-Vvo7MaQ4", libSceNKWebKitLegacyUnknown_iS_minus_Vvo7MaQ4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_iTaoxWIQyuY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iTaoxWIQyuY", libSceNKWebKitLegacyUnknown_iTaoxWIQyuY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_iUTIYD3h6IE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iUTIYD3h6IE", libSceNKWebKitLegacyUnknown_iUTIYD3h6IE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_iYXS3HPuYjs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iYXS3HPuYjs", libSceNKWebKitLegacyUnknown_iYXS3HPuYjs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_idkI_plus_fFFntA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("idkI+fFFntA", libSceNKWebKitLegacyUnknown_idkI_plus_fFFntA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ie3xVSGOmXs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ie3xVSGOmXs", libSceNKWebKitLegacyUnknown_ie3xVSGOmXs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ifT85lHYbyo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ifT85lHYbyo", libSceNKWebKitLegacyUnknown_ifT85lHYbyo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ihAxteheoME_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ihAxteheoME", libSceNKWebKitLegacyUnknown_ihAxteheoME_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_iiCJFOgCMk4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iiCJFOgCMk4", libSceNKWebKitLegacyUnknown_iiCJFOgCMk4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ikcO4yJFPy0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ikcO4yJFPy0", libSceNKWebKitLegacyUnknown_ikcO4yJFPy0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ilr_plus_TFplnv4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ilr+TFplnv4", libSceNKWebKitLegacyUnknown_ilr_plus_TFplnv4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_imHa3TLlTO8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("imHa3TLlTO8", libSceNKWebKitLegacyUnknown_imHa3TLlTO8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_imTc7jKwrL8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("imTc7jKwrL8", libSceNKWebKitLegacyUnknown_imTc7jKwrL8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_in63SKRkPMY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("in63SKRkPMY", libSceNKWebKitLegacyUnknown_in63SKRkPMY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_inmtE_plus_1X_plus_Q4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("inmtE+1X+Q4", libSceNKWebKitLegacyUnknown_inmtE_plus_1X_plus_Q4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_irHs_plus_9jhAtM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("irHs+9jhAtM", libSceNKWebKitLegacyUnknown_irHs_plus_9jhAtM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ischP2z62kA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ischP2z62kA", libSceNKWebKitLegacyUnknown_ischP2z62kA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_it_minus_sj4lhYhU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("it-sj4lhYhU", libSceNKWebKitLegacyUnknown_it_minus_sj4lhYhU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_iuvmKbSJPMo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iuvmKbSJPMo", libSceNKWebKitLegacyUnknown_iuvmKbSJPMo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_iuzPnkZ56VA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iuzPnkZ56VA", libSceNKWebKitLegacyUnknown_iuzPnkZ56VA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_iwIzwyIXewg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iwIzwyIXewg", libSceNKWebKitLegacyUnknown_iwIzwyIXewg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_iz_minus_vTGZcvzM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iz-vTGZcvzM", libSceNKWebKitLegacyUnknown_iz_minus_vTGZcvzM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_j_plus_DwM4iALVI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("j+DwM4iALVI", libSceNKWebKitLegacyUnknown_j_plus_DwM4iALVI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_j_minus_9x_minus_eqjHrA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("j-9x-eqjHrA", libSceNKWebKitLegacyUnknown_j_minus_9x_minus_eqjHrA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_j4kySXsCM5k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("j4kySXsCM5k", libSceNKWebKitLegacyUnknown_j4kySXsCM5k_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_j5Q5zC_plus_A3EM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("j5Q5zC+A3EM", libSceNKWebKitLegacyUnknown_j5Q5zC_plus_A3EM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_j64eAmSsLsw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("j64eAmSsLsw", libSceNKWebKitLegacyUnknown_j64eAmSsLsw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_j66aa9OsmyU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("j66aa9OsmyU", libSceNKWebKitLegacyUnknown_j66aa9OsmyU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_j74sHzT1ZAM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("j74sHzT1ZAM", libSceNKWebKitLegacyUnknown_j74sHzT1ZAM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_j88I7jHo5tU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("j88I7jHo5tU", libSceNKWebKitLegacyUnknown_j88I7jHo5tU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_j9kPTcevisQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("j9kPTcevisQ", libSceNKWebKitLegacyUnknown_j9kPTcevisQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_j9wQqnUZB9M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("j9wQqnUZB9M", libSceNKWebKitLegacyUnknown_j9wQqnUZB9M_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_jBGJot7XZDQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jBGJot7XZDQ", libSceNKWebKitLegacyUnknown_jBGJot7XZDQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_jBVoh5di2zk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jBVoh5di2zk", libSceNKWebKitLegacyUnknown_jBVoh5di2zk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_jBcOuEYwXwY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jBcOuEYwXwY", libSceNKWebKitLegacyUnknown_jBcOuEYwXwY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_jBtjPMotXo0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jBtjPMotXo0", libSceNKWebKitLegacyUnknown_jBtjPMotXo0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_jDBLjMNUZeg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jDBLjMNUZeg", libSceNKWebKitLegacyUnknown_jDBLjMNUZeg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_jDtLp261Kcs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jDtLp261Kcs", libSceNKWebKitLegacyUnknown_jDtLp261Kcs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_jFTeLww_plus_1Vs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jFTeLww+1Vs", libSceNKWebKitLegacyUnknown_jFTeLww_plus_1Vs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_jGAtApdaFc8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jGAtApdaFc8", libSceNKWebKitLegacyUnknown_jGAtApdaFc8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_jHEwkqLAYQQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jHEwkqLAYQQ", libSceNKWebKitLegacyUnknown_jHEwkqLAYQQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_jJ_minus_5qZRZKFo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jJ-5qZRZKFo", libSceNKWebKitLegacyUnknown_jJ_minus_5qZRZKFo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_jJLzd7jxXiM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jJLzd7jxXiM", libSceNKWebKitLegacyUnknown_jJLzd7jxXiM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_jKpVy5ttZN8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jKpVy5ttZN8", libSceNKWebKitLegacyUnknown_jKpVy5ttZN8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_jT1FV1SZsdQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jT1FV1SZsdQ", libSceNKWebKitLegacyUnknown_jT1FV1SZsdQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_jTXs7HM6z30_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jTXs7HM6z30", libSceNKWebKitLegacyUnknown_jTXs7HM6z30_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_jV_minus_g6Ihe3aI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jV-g6Ihe3aI", libSceNKWebKitLegacyUnknown_jV_minus_g6Ihe3aI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_jVj7jqD9mq0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jVj7jqD9mq0", libSceNKWebKitLegacyUnknown_jVj7jqD9mq0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_jXOWuBDaGRM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jXOWuBDaGRM", libSceNKWebKitLegacyUnknown_jXOWuBDaGRM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_jXznE6_plus_t4Mk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jXznE6+t4Mk", libSceNKWebKitLegacyUnknown_jXznE6_plus_t4Mk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_jYEGqsvP77k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jYEGqsvP77k", libSceNKWebKitLegacyUnknown_jYEGqsvP77k_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_jYc_minus_aAXESog_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jYc-aAXESog", libSceNKWebKitLegacyUnknown_jYc_minus_aAXESog_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_japr92PDRTM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("japr92PDRTM", libSceNKWebKitLegacyUnknown_japr92PDRTM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_jbjU4LIcU2Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jbjU4LIcU2Y", libSceNKWebKitLegacyUnknown_jbjU4LIcU2Y_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_jc7wDa3P_plus_CU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jc7wDa3P+CU", libSceNKWebKitLegacyUnknown_jc7wDa3P_plus_CU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_je5LZGQ1CMI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("je5LZGQ1CMI", libSceNKWebKitLegacyUnknown_je5LZGQ1CMI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_jgtWHChq7Rs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jgtWHChq7Rs", libSceNKWebKitLegacyUnknown_jgtWHChq7Rs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_jhYlRq9ZfZQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jhYlRq9ZfZQ", libSceNKWebKitLegacyUnknown_jhYlRq9ZfZQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_jkBwkJmmdbI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jkBwkJmmdbI", libSceNKWebKitLegacyUnknown_jkBwkJmmdbI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_jkrrIsrKdVg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jkrrIsrKdVg", libSceNKWebKitLegacyUnknown_jkrrIsrKdVg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_jlNozzKfEHI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jlNozzKfEHI", libSceNKWebKitLegacyUnknown_jlNozzKfEHI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_jnGTQJLI0S8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jnGTQJLI0S8", libSceNKWebKitLegacyUnknown_jnGTQJLI0S8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_jqnDcCBBLOY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jqnDcCBBLOY", libSceNKWebKitLegacyUnknown_jqnDcCBBLOY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ju_minus_OvY_minus_N6_plus_Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ju-OvY-N6+Q", libSceNKWebKitLegacyUnknown_ju_minus_OvY_minus_N6_plus_Q_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_jw22poRy3xE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jw22poRy3xE", libSceNKWebKitLegacyUnknown_jw22poRy3xE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_k0WHwWy4YXE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("k0WHwWy4YXE", libSceNKWebKitLegacyUnknown_k0WHwWy4YXE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_k4hOXIKXDWw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("k4hOXIKXDWw", libSceNKWebKitLegacyUnknown_k4hOXIKXDWw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_k67ADtJOaR8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("k67ADtJOaR8", libSceNKWebKitLegacyUnknown_k67ADtJOaR8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_k7STwdvqzi0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("k7STwdvqzi0", libSceNKWebKitLegacyUnknown_k7STwdvqzi0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_kBMwammS_minus_EY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kBMwammS-EY", libSceNKWebKitLegacyUnknown_kBMwammS_minus_EY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_kCWnbqC0RqA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kCWnbqC0RqA", libSceNKWebKitLegacyUnknown_kCWnbqC0RqA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_kDBfLsW0W5s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kDBfLsW0W5s", libSceNKWebKitLegacyUnknown_kDBfLsW0W5s_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_kFTwPJB2uP4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kFTwPJB2uP4", libSceNKWebKitLegacyUnknown_kFTwPJB2uP4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_kHLuEOVfAaA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kHLuEOVfAaA", libSceNKWebKitLegacyUnknown_kHLuEOVfAaA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_kIKAc29CJyE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kIKAc29CJyE", libSceNKWebKitLegacyUnknown_kIKAc29CJyE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_kJxS50jvGx0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kJxS50jvGx0", libSceNKWebKitLegacyUnknown_kJxS50jvGx0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_kM3VgFObOBU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kM3VgFObOBU", libSceNKWebKitLegacyUnknown_kM3VgFObOBU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_kMCk5HYXRhA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kMCk5HYXRhA", libSceNKWebKitLegacyUnknown_kMCk5HYXRhA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_kMfXlOLbJ9g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kMfXlOLbJ9g", libSceNKWebKitLegacyUnknown_kMfXlOLbJ9g_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_kNXDL29aL0E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kNXDL29aL0E", libSceNKWebKitLegacyUnknown_kNXDL29aL0E_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_kPSQIkWwKtM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kPSQIkWwKtM", libSceNKWebKitLegacyUnknown_kPSQIkWwKtM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_kQ6vHgHuVMo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kQ6vHgHuVMo", libSceNKWebKitLegacyUnknown_kQ6vHgHuVMo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_kRs_minus_ox4mJd0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kRs-ox4mJd0", libSceNKWebKitLegacyUnknown_kRs_minus_ox4mJd0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_kS2VUTkflj0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kS2VUTkflj0", libSceNKWebKitLegacyUnknown_kS2VUTkflj0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_kUJ01RD1JGs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kUJ01RD1JGs", libSceNKWebKitLegacyUnknown_kUJ01RD1JGs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_kUv2_minus_yV2vfw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kUv2-yV2vfw", libSceNKWebKitLegacyUnknown_kUv2_minus_yV2vfw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_kXoKeEoyfwo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kXoKeEoyfwo", libSceNKWebKitLegacyUnknown_kXoKeEoyfwo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_kYoZ_minus_ilL_plus_zk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kYoZ-ilL+zk", libSceNKWebKitLegacyUnknown_kYoZ_minus_ilL_plus_zk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_kZOsA97Ji0M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kZOsA97Ji0M", libSceNKWebKitLegacyUnknown_kZOsA97Ji0M_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_kZsCkTkbZgU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kZsCkTkbZgU", libSceNKWebKitLegacyUnknown_kZsCkTkbZgU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_kc26Da2_plus_ivQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kc26Da2+ivQ", libSceNKWebKitLegacyUnknown_kc26Da2_plus_ivQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_kh1MIaHhbmo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kh1MIaHhbmo", libSceNKWebKitLegacyUnknown_kh1MIaHhbmo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_kjB3piQnVh4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kjB3piQnVh4", libSceNKWebKitLegacyUnknown_kjB3piQnVh4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_kk6mGYu_minus_DUU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kk6mGYu-DUU", libSceNKWebKitLegacyUnknown_kk6mGYu_minus_DUU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_kkHYbPDQMK4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kkHYbPDQMK4", libSceNKWebKitLegacyUnknown_kkHYbPDQMK4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_kkb9W0RfPT0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kkb9W0RfPT0", libSceNKWebKitLegacyUnknown_kkb9W0RfPT0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_klcUCefeE9Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("klcUCefeE9Q", libSceNKWebKitLegacyUnknown_klcUCefeE9Q_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_kqK_minus_S56CL9s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kqK-S56CL9s", libSceNKWebKitLegacyUnknown_kqK_minus_S56CL9s_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_krVmAIa9W_minus_0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("krVmAIa9W-0", libSceNKWebKitLegacyUnknown_krVmAIa9W_minus_0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_krlgjuxfe2I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("krlgjuxfe2I", libSceNKWebKitLegacyUnknown_krlgjuxfe2I_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ktKMmXn1R7c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ktKMmXn1R7c", libSceNKWebKitLegacyUnknown_ktKMmXn1R7c_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_kxyhAR28Fi0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kxyhAR28Fi0", libSceNKWebKitLegacyUnknown_kxyhAR28Fi0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_l_minus_BM32tjzqY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("l-BM32tjzqY", libSceNKWebKitLegacyUnknown_l_minus_BM32tjzqY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_l_minus_HE9Ui7Jck_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("l-HE9Ui7Jck", libSceNKWebKitLegacyUnknown_l_minus_HE9Ui7Jck_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_l3EArnZr6_minus_8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("l3EArnZr6-8", libSceNKWebKitLegacyUnknown_l3EArnZr6_minus_8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_l5n05sKvMM8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("l5n05sKvMM8", libSceNKWebKitLegacyUnknown_l5n05sKvMM8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_l9uYEtKBIQA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("l9uYEtKBIQA", libSceNKWebKitLegacyUnknown_l9uYEtKBIQA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_lDi_plus_K6BUYUw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lDi+K6BUYUw", libSceNKWebKitLegacyUnknown_lDi_plus_K6BUYUw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_lE2O8vM7keo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lE2O8vM7keo", libSceNKWebKitLegacyUnknown_lE2O8vM7keo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_lEQRC5UQZDI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lEQRC5UQZDI", libSceNKWebKitLegacyUnknown_lEQRC5UQZDI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_lG3QAnJi3sk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lG3QAnJi3sk", libSceNKWebKitLegacyUnknown_lG3QAnJi3sk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_lH79sVvHpzo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lH79sVvHpzo", libSceNKWebKitLegacyUnknown_lH79sVvHpzo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_lH8Wr22Poz0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lH8Wr22Poz0", libSceNKWebKitLegacyUnknown_lH8Wr22Poz0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_lHCWCYQW5lc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lHCWCYQW5lc", libSceNKWebKitLegacyUnknown_lHCWCYQW5lc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_lHJpwV5i29M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lHJpwV5i29M", libSceNKWebKitLegacyUnknown_lHJpwV5i29M_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_lHQMAVDRdf8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lHQMAVDRdf8", libSceNKWebKitLegacyUnknown_lHQMAVDRdf8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_lLLYkMNAA4A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lLLYkMNAA4A", libSceNKWebKitLegacyUnknown_lLLYkMNAA4A_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_lNTTjqQXkf4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lNTTjqQXkf4", libSceNKWebKitLegacyUnknown_lNTTjqQXkf4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_lOKJd85Bu7U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lOKJd85Bu7U", libSceNKWebKitLegacyUnknown_lOKJd85Bu7U_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_lOuJRYKbSug_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lOuJRYKbSug", libSceNKWebKitLegacyUnknown_lOuJRYKbSug_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_lPf_minus_b912Gbg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lPf-b912Gbg", libSceNKWebKitLegacyUnknown_lPf_minus_b912Gbg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_lR7fWk_minus_OVI0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lR7fWk-OVI0", libSceNKWebKitLegacyUnknown_lR7fWk_minus_OVI0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_lV_plus_M4ace0Ts_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lV+M4ace0Ts", libSceNKWebKitLegacyUnknown_lV_plus_M4ace0Ts_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_lXesITh371Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lXesITh371Q", libSceNKWebKitLegacyUnknown_lXesITh371Q_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_lYNHtD7Ms3M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lYNHtD7Ms3M", libSceNKWebKitLegacyUnknown_lYNHtD7Ms3M_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_lZlazM1Ei_plus_k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lZlazM1Ei+k", libSceNKWebKitLegacyUnknown_lZlazM1Ei_plus_k_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_lb0c0UhEPYg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lb0c0UhEPYg", libSceNKWebKitLegacyUnknown_lb0c0UhEPYg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_lfP6VdrtlDk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lfP6VdrtlDk", libSceNKWebKitLegacyUnknown_lfP6VdrtlDk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ljYCJdPg5jU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ljYCJdPg5jU", libSceNKWebKitLegacyUnknown_ljYCJdPg5jU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ljdR544I6ho_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ljdR544I6ho", libSceNKWebKitLegacyUnknown_ljdR544I6ho_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_lnWey3kb00A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lnWey3kb00A", libSceNKWebKitLegacyUnknown_lnWey3kb00A_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_loRNMMI_plus_BV4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("loRNMMI+BV4", libSceNKWebKitLegacyUnknown_loRNMMI_plus_BV4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_lrAjHpnIZpU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lrAjHpnIZpU", libSceNKWebKitLegacyUnknown_lrAjHpnIZpU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ltGxpBPyaAI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ltGxpBPyaAI", libSceNKWebKitLegacyUnknown_ltGxpBPyaAI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_luFeFBNUTk4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("luFeFBNUTk4", libSceNKWebKitLegacyUnknown_luFeFBNUTk4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_luYDdZwGmC8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("luYDdZwGmC8", libSceNKWebKitLegacyUnknown_luYDdZwGmC8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_lvvY3mc5Vss_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lvvY3mc5Vss", libSceNKWebKitLegacyUnknown_lvvY3mc5Vss_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_lxH0PZ_plus_dW2E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lxH0PZ+dW2E", libSceNKWebKitLegacyUnknown_lxH0PZ_plus_dW2E_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_lzHk963BL7g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lzHk963BL7g", libSceNKWebKitLegacyUnknown_lzHk963BL7g_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_lzs6jNvh9qw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lzs6jNvh9qw", libSceNKWebKitLegacyUnknown_lzs6jNvh9qw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_m_minus_FWe3HamOc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("m-FWe3HamOc", libSceNKWebKitLegacyUnknown_m_minus_FWe3HamOc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_m1WvyprztKg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("m1WvyprztKg", libSceNKWebKitLegacyUnknown_m1WvyprztKg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_m2yZIur2btM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("m2yZIur2btM", libSceNKWebKitLegacyUnknown_m2yZIur2btM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_m3CVfyaeuNI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("m3CVfyaeuNI", libSceNKWebKitLegacyUnknown_m3CVfyaeuNI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_m6m0xWGahWw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("m6m0xWGahWw", libSceNKWebKitLegacyUnknown_m6m0xWGahWw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_m7UpEhONxMA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("m7UpEhONxMA", libSceNKWebKitLegacyUnknown_m7UpEhONxMA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_m9qXOH_plus_XWBM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("m9qXOH+XWBM", libSceNKWebKitLegacyUnknown_m9qXOH_plus_XWBM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_mBOR8lEifX0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mBOR8lEifX0", libSceNKWebKitLegacyUnknown_mBOR8lEifX0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_mBdPk9_plus_JusU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mBdPk9+JusU", libSceNKWebKitLegacyUnknown_mBdPk9_plus_JusU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_mBjDvzWpGVs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mBjDvzWpGVs", libSceNKWebKitLegacyUnknown_mBjDvzWpGVs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_mCztcpS1jGs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mCztcpS1jGs", libSceNKWebKitLegacyUnknown_mCztcpS1jGs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_mD6r3NshZyo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mD6r3NshZyo", libSceNKWebKitLegacyUnknown_mD6r3NshZyo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_mEXNRN7i8GA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mEXNRN7i8GA", libSceNKWebKitLegacyUnknown_mEXNRN7i8GA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_mFmCBCBPQPw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mFmCBCBPQPw", libSceNKWebKitLegacyUnknown_mFmCBCBPQPw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_mH6mtmF1430_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mH6mtmF1430", libSceNKWebKitLegacyUnknown_mH6mtmF1430_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_mJjAMxMoouI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mJjAMxMoouI", libSceNKWebKitLegacyUnknown_mJjAMxMoouI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_mNnRj_plus_T0Jl0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mNnRj+T0Jl0", libSceNKWebKitLegacyUnknown_mNnRj_plus_T0Jl0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_mQo0ovALpKM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mQo0ovALpKM", libSceNKWebKitLegacyUnknown_mQo0ovALpKM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_mWzuA_minus_LRFmE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mWzuA-LRFmE", libSceNKWebKitLegacyUnknown_mWzuA_minus_LRFmE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_mX_minus_WVA8pNsg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mX-WVA8pNsg", libSceNKWebKitLegacyUnknown_mX_minus_WVA8pNsg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_mYaWSJuvtg4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mYaWSJuvtg4", libSceNKWebKitLegacyUnknown_mYaWSJuvtg4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_mZKtksgqmiQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mZKtksgqmiQ", libSceNKWebKitLegacyUnknown_mZKtksgqmiQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_maq9mh6nNTE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("maq9mh6nNTE", libSceNKWebKitLegacyUnknown_maq9mh6nNTE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_mbJRq5SJww4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mbJRq5SJww4", libSceNKWebKitLegacyUnknown_mbJRq5SJww4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_mcTQq_plus_l8Ppo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mcTQq+l8Ppo", libSceNKWebKitLegacyUnknown_mcTQq_plus_l8Ppo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_mctaJ9po8Vk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mctaJ9po8Vk", libSceNKWebKitLegacyUnknown_mctaJ9po8Vk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_mdIPQKe4lRI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mdIPQKe4lRI", libSceNKWebKitLegacyUnknown_mdIPQKe4lRI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_meKfwBKCN9A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("meKfwBKCN9A", libSceNKWebKitLegacyUnknown_meKfwBKCN9A_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_mgLr7cAr0dM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mgLr7cAr0dM", libSceNKWebKitLegacyUnknown_mgLr7cAr0dM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_mh0yBFI4Hmk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mh0yBFI4Hmk", libSceNKWebKitLegacyUnknown_mh0yBFI4Hmk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_mhrZrdppmDc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mhrZrdppmDc", libSceNKWebKitLegacyUnknown_mhrZrdppmDc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_mi75GvD9uq0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mi75GvD9uq0", libSceNKWebKitLegacyUnknown_mi75GvD9uq0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_miT17KpoFN4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("miT17KpoFN4", libSceNKWebKitLegacyUnknown_miT17KpoFN4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_mmX_plus_v2z1Gss_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mmX+v2z1Gss", libSceNKWebKitLegacyUnknown_mmX_plus_v2z1Gss_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_mmgyb1Pe_minus_s0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mmgyb1Pe-s0", libSceNKWebKitLegacyUnknown_mmgyb1Pe_minus_s0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_muoLz7iEl4I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("muoLz7iEl4I", libSceNKWebKitLegacyUnknown_muoLz7iEl4I_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_mvwSEPRaNM8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mvwSEPRaNM8", libSceNKWebKitLegacyUnknown_mvwSEPRaNM8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_mxjhjb67uyM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mxjhjb67uyM", libSceNKWebKitLegacyUnknown_mxjhjb67uyM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_my5fVKR4wp0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("my5fVKR4wp0", libSceNKWebKitLegacyUnknown_my5fVKR4wp0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_myyiP0GpIeQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("myyiP0GpIeQ", libSceNKWebKitLegacyUnknown_myyiP0GpIeQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_n_minus_xkyAPf_minus_P8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("n-xkyAPf-P8", libSceNKWebKitLegacyUnknown_n_minus_xkyAPf_minus_P8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_n40jtA5wAls_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("n40jtA5wAls", libSceNKWebKitLegacyUnknown_n40jtA5wAls_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_n6LdZF4M7p4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("n6LdZF4M7p4", libSceNKWebKitLegacyUnknown_n6LdZF4M7p4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_n6MH17TR38U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("n6MH17TR38U", libSceNKWebKitLegacyUnknown_n6MH17TR38U_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_n7S7lOfl71U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("n7S7lOfl71U", libSceNKWebKitLegacyUnknown_n7S7lOfl71U_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_n9MVeGIJYyU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("n9MVeGIJYyU", libSceNKWebKitLegacyUnknown_n9MVeGIJYyU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_nCzcAMrlehk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nCzcAMrlehk", libSceNKWebKitLegacyUnknown_nCzcAMrlehk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_nDUS4Xc_minus_Twc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nDUS4Xc-Twc", libSceNKWebKitLegacyUnknown_nDUS4Xc_minus_Twc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_nHU0qnM6vgI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nHU0qnM6vgI", libSceNKWebKitLegacyUnknown_nHU0qnM6vgI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_nJG_minus_Y2BtOEU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nJG-Y2BtOEU", libSceNKWebKitLegacyUnknown_nJG_minus_Y2BtOEU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_nJVZjaCQ6oI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nJVZjaCQ6oI", libSceNKWebKitLegacyUnknown_nJVZjaCQ6oI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_nPKIj4r_minus_2xk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nPKIj4r-2xk", libSceNKWebKitLegacyUnknown_nPKIj4r_minus_2xk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_nPwXnPFEstQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nPwXnPFEstQ", libSceNKWebKitLegacyUnknown_nPwXnPFEstQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_nQDDHVj0B9k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nQDDHVj0B9k", libSceNKWebKitLegacyUnknown_nQDDHVj0B9k_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_nWvH5774ZvI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nWvH5774ZvI", libSceNKWebKitLegacyUnknown_nWvH5774ZvI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_nYA7nXRmwHg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nYA7nXRmwHg", libSceNKWebKitLegacyUnknown_nYA7nXRmwHg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_nYKfnhLGyO8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nYKfnhLGyO8", libSceNKWebKitLegacyUnknown_nYKfnhLGyO8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_nZqyD260j_plus_A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nZqyD260j+A", libSceNKWebKitLegacyUnknown_nZqyD260j_plus_A_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_nbIZtn6wv7A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nbIZtn6wv7A", libSceNKWebKitLegacyUnknown_nbIZtn6wv7A_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_nbrxmv70IpM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nbrxmv70IpM", libSceNKWebKitLegacyUnknown_nbrxmv70IpM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ncAUU4JtF60_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ncAUU4JtF60", libSceNKWebKitLegacyUnknown_ncAUU4JtF60_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_nfo6Q6hs514_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nfo6Q6hs514", libSceNKWebKitLegacyUnknown_nfo6Q6hs514_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_nfrFZQGkv_plus_4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nfrFZQGkv+4", libSceNKWebKitLegacyUnknown_nfrFZQGkv_plus_4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_nhTJWQnk2A8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nhTJWQnk2A8", libSceNKWebKitLegacyUnknown_nhTJWQnk2A8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_njrvRzhGwqk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("njrvRzhGwqk", libSceNKWebKitLegacyUnknown_njrvRzhGwqk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_nkSbKYK2gRg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nkSbKYK2gRg", libSceNKWebKitLegacyUnknown_nkSbKYK2gRg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_nl7jLNJI8Ns_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nl7jLNJI8Ns", libSceNKWebKitLegacyUnknown_nl7jLNJI8Ns_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_nlFQM4R_minus_Aco_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nlFQM4R-Aco", libSceNKWebKitLegacyUnknown_nlFQM4R_minus_Aco_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_nmGqNyrNQj0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nmGqNyrNQj0", libSceNKWebKitLegacyUnknown_nmGqNyrNQj0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_no0AiqphBIQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("no0AiqphBIQ", libSceNKWebKitLegacyUnknown_no0AiqphBIQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_npdBVCK80cs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("npdBVCK80cs", libSceNKWebKitLegacyUnknown_npdBVCK80cs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_nrhlqqa1Ryo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nrhlqqa1Ryo", libSceNKWebKitLegacyUnknown_nrhlqqa1Ryo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_nsXnVfbWLtw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nsXnVfbWLtw", libSceNKWebKitLegacyUnknown_nsXnVfbWLtw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ntLQVqJSH5o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ntLQVqJSH5o", libSceNKWebKitLegacyUnknown_ntLQVqJSH5o_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_nxh_minus_MTZt8Mk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nxh-MTZt8Mk", libSceNKWebKitLegacyUnknown_nxh_minus_MTZt8Mk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_nxus4jy2Qco_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nxus4jy2Qco", libSceNKWebKitLegacyUnknown_nxus4jy2Qco_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_nzb9F_plus_nv3pU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nzb9F+nv3pU", libSceNKWebKitLegacyUnknown_nzb9F_plus_nv3pU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_o_plus_XYqjgPwTk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("o+XYqjgPwTk", libSceNKWebKitLegacyUnknown_o_plus_XYqjgPwTk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_o_plus_cobhAWPDg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("o+cobhAWPDg", libSceNKWebKitLegacyUnknown_o_plus_cobhAWPDg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_o26ycLX9PNo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("o26ycLX9PNo", libSceNKWebKitLegacyUnknown_o26ycLX9PNo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_o4iqIIK4SZQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("o4iqIIK4SZQ", libSceNKWebKitLegacyUnknown_o4iqIIK4SZQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_o5dFu_plus_5lyYU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("o5dFu+5lyYU", libSceNKWebKitLegacyUnknown_o5dFu_plus_5lyYU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_o6J_plus_Gcx336w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("o6J+Gcx336w", libSceNKWebKitLegacyUnknown_o6J_plus_Gcx336w_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_oBrGvuc2Pz0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oBrGvuc2Pz0", libSceNKWebKitLegacyUnknown_oBrGvuc2Pz0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_oCFdaQHIyqE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oCFdaQHIyqE", libSceNKWebKitLegacyUnknown_oCFdaQHIyqE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_oCIMmU9nczQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oCIMmU9nczQ", libSceNKWebKitLegacyUnknown_oCIMmU9nczQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_oCTpafdlN_plus_I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oCTpafdlN+I", libSceNKWebKitLegacyUnknown_oCTpafdlN_plus_I_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_oCrllVH4OE0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oCrllVH4OE0", libSceNKWebKitLegacyUnknown_oCrllVH4OE0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_oDNgQLmL8Kk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oDNgQLmL8Kk", libSceNKWebKitLegacyUnknown_oDNgQLmL8Kk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_oE7gCvN6Ygs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oE7gCvN6Ygs", libSceNKWebKitLegacyUnknown_oE7gCvN6Ygs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_oEQsPQR8l1I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oEQsPQR8l1I", libSceNKWebKitLegacyUnknown_oEQsPQR8l1I_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_oHcsHlycFE8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oHcsHlycFE8", libSceNKWebKitLegacyUnknown_oHcsHlycFE8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_oHrhuLxf9GE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oHrhuLxf9GE", libSceNKWebKitLegacyUnknown_oHrhuLxf9GE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_oLlc6LrZIK0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oLlc6LrZIK0", libSceNKWebKitLegacyUnknown_oLlc6LrZIK0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_oOUV_minus_EwUiJc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oOUV-EwUiJc", libSceNKWebKitLegacyUnknown_oOUV_minus_EwUiJc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_oPkCHryPArQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oPkCHryPArQ", libSceNKWebKitLegacyUnknown_oPkCHryPArQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_oQcEW6MgrGw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oQcEW6MgrGw", libSceNKWebKitLegacyUnknown_oQcEW6MgrGw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_oSv3omVJrzI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oSv3omVJrzI", libSceNKWebKitLegacyUnknown_oSv3omVJrzI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_oVB19wLdwg0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oVB19wLdwg0", libSceNKWebKitLegacyUnknown_oVB19wLdwg0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_obXlrN5_plus_T6g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("obXlrN5+T6g", libSceNKWebKitLegacyUnknown_obXlrN5_plus_T6g_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ocHw_plus_wuy2eo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ocHw+wuy2eo", libSceNKWebKitLegacyUnknown_ocHw_plus_wuy2eo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_oeDzjPWu_minus_o8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oeDzjPWu-o8", libSceNKWebKitLegacyUnknown_oeDzjPWu_minus_o8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ofO4_plus_TUnwIw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ofO4+TUnwIw", libSceNKWebKitLegacyUnknown_ofO4_plus_TUnwIw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ogOi1AGEtYE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ogOi1AGEtYE", libSceNKWebKitLegacyUnknown_ogOi1AGEtYE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_olL3JJ0yPCc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("olL3JJ0yPCc", libSceNKWebKitLegacyUnknown_olL3JJ0yPCc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_opQB7KfEmog_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("opQB7KfEmog", libSceNKWebKitLegacyUnknown_opQB7KfEmog_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ouzzTKM5a4U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ouzzTKM5a4U", libSceNKWebKitLegacyUnknown_ouzzTKM5a4U_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ozBH1uNV_minus_CA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ozBH1uNV-CA", libSceNKWebKitLegacyUnknown_ozBH1uNV_minus_CA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_p0iin_plus_5pyxc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("p0iin+5pyxc", libSceNKWebKitLegacyUnknown_p0iin_plus_5pyxc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_p1MwPMovrqQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("p1MwPMovrqQ", libSceNKWebKitLegacyUnknown_p1MwPMovrqQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_p41XEqKt7Pk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("p41XEqKt7Pk", libSceNKWebKitLegacyUnknown_p41XEqKt7Pk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_p5u9FgEEzVg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("p5u9FgEEzVg", libSceNKWebKitLegacyUnknown_p5u9FgEEzVg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_p6QVJzwCl4A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("p6QVJzwCl4A", libSceNKWebKitLegacyUnknown_p6QVJzwCl4A_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_p6SYKSPrxy0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("p6SYKSPrxy0", libSceNKWebKitLegacyUnknown_p6SYKSPrxy0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_p7ZYQQM5Rq0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("p7ZYQQM5Rq0", libSceNKWebKitLegacyUnknown_p7ZYQQM5Rq0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_p98bClfIFGc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("p98bClfIFGc", libSceNKWebKitLegacyUnknown_p98bClfIFGc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_pCDG6X3_plus_8sY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pCDG6X3+8sY", libSceNKWebKitLegacyUnknown_pCDG6X3_plus_8sY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_pGMylP5wrIU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pGMylP5wrIU", libSceNKWebKitLegacyUnknown_pGMylP5wrIU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_pJEy0WY19JM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pJEy0WY19JM", libSceNKWebKitLegacyUnknown_pJEy0WY19JM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_pJKa7LpED8U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pJKa7LpED8U", libSceNKWebKitLegacyUnknown_pJKa7LpED8U_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_pNFRb6EjosU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pNFRb6EjosU", libSceNKWebKitLegacyUnknown_pNFRb6EjosU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_pNUMqmhQiR8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pNUMqmhQiR8", libSceNKWebKitLegacyUnknown_pNUMqmhQiR8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_pOzrilVe4IE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pOzrilVe4IE", libSceNKWebKitLegacyUnknown_pOzrilVe4IE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_pQ0Q4V_minus_i7MA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pQ0Q4V-i7MA", libSceNKWebKitLegacyUnknown_pQ0Q4V_minus_i7MA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_pQYlY0YQm3w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pQYlY0YQm3w", libSceNKWebKitLegacyUnknown_pQYlY0YQm3w_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_pRLVmpQe1b4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pRLVmpQe1b4", libSceNKWebKitLegacyUnknown_pRLVmpQe1b4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_pRpclGdCA9I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pRpclGdCA9I", libSceNKWebKitLegacyUnknown_pRpclGdCA9I_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_pSq7SObvxVg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pSq7SObvxVg", libSceNKWebKitLegacyUnknown_pSq7SObvxVg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_pSrfYqO6q2Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pSrfYqO6q2Y", libSceNKWebKitLegacyUnknown_pSrfYqO6q2Y_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_pUaVtOhugPw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pUaVtOhugPw", libSceNKWebKitLegacyUnknown_pUaVtOhugPw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_pWfq6iqEo0Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pWfq6iqEo0Q", libSceNKWebKitLegacyUnknown_pWfq6iqEo0Q_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_pWzdtw18an0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pWzdtw18an0", libSceNKWebKitLegacyUnknown_pWzdtw18an0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_pXnPhDouZC8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pXnPhDouZC8", libSceNKWebKitLegacyUnknown_pXnPhDouZC8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_pb0nCZ5k8Os_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pb0nCZ5k8Os", libSceNKWebKitLegacyUnknown_pb0nCZ5k8Os_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_pbPYIhZc_plus_9U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pbPYIhZc+9U", libSceNKWebKitLegacyUnknown_pbPYIhZc_plus_9U_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_pbiAyrIGjxo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pbiAyrIGjxo", libSceNKWebKitLegacyUnknown_pbiAyrIGjxo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_pg_minus_rfgBX5i0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pg-rfgBX5i0", libSceNKWebKitLegacyUnknown_pg_minus_rfgBX5i0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_pgTD0qw023s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pgTD0qw023s", libSceNKWebKitLegacyUnknown_pgTD0qw023s_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_pgY7Rg3HlJA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pgY7Rg3HlJA", libSceNKWebKitLegacyUnknown_pgY7Rg3HlJA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_pgneomvAf9A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pgneomvAf9A", libSceNKWebKitLegacyUnknown_pgneomvAf9A_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_phLqTXCRrKs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("phLqTXCRrKs", libSceNKWebKitLegacyUnknown_phLqTXCRrKs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_pjGOFX2e3MM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pjGOFX2e3MM", libSceNKWebKitLegacyUnknown_pjGOFX2e3MM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_plOum3e_plus_U_plus_Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("plOum3e+U+Y", libSceNKWebKitLegacyUnknown_plOum3e_plus_U_plus_Y_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_pqm3fr0Gwig_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pqm3fr0Gwig", libSceNKWebKitLegacyUnknown_pqm3fr0Gwig_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_prvA2U9aEOI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("prvA2U9aEOI", libSceNKWebKitLegacyUnknown_prvA2U9aEOI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ptTcX4k6zB4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ptTcX4k6zB4", libSceNKWebKitLegacyUnknown_ptTcX4k6zB4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_pxtarjzxY4o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pxtarjzxY4o", libSceNKWebKitLegacyUnknown_pxtarjzxY4o_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_q_plus_s0Lqw_minus_GCQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("q+s0Lqw-GCQ", libSceNKWebKitLegacyUnknown_q_plus_s0Lqw_minus_GCQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_q1vrENqA6Eg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("q1vrENqA6Eg", libSceNKWebKitLegacyUnknown_q1vrENqA6Eg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_q29R3lLE4nY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("q29R3lLE4nY", libSceNKWebKitLegacyUnknown_q29R3lLE4nY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_q4H1OsUcung_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("q4H1OsUcung", libSceNKWebKitLegacyUnknown_q4H1OsUcung_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_q6KNflHlOIA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("q6KNflHlOIA", libSceNKWebKitLegacyUnknown_q6KNflHlOIA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_q6PrWQHQRnM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("q6PrWQHQRnM", libSceNKWebKitLegacyUnknown_q6PrWQHQRnM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_qAKtgVDTrAM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qAKtgVDTrAM", libSceNKWebKitLegacyUnknown_qAKtgVDTrAM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_qB2_minus_9007vRI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qB2-9007vRI", libSceNKWebKitLegacyUnknown_qB2_minus_9007vRI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_qCcBSIApplE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qCcBSIApplE", libSceNKWebKitLegacyUnknown_qCcBSIApplE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_qEoBtYT8_minus_mE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qEoBtYT8-mE", libSceNKWebKitLegacyUnknown_qEoBtYT8_minus_mE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_qFG3gUOjf6A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qFG3gUOjf6A", libSceNKWebKitLegacyUnknown_qFG3gUOjf6A_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_qFYwlVP8fy8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qFYwlVP8fy8", libSceNKWebKitLegacyUnknown_qFYwlVP8fy8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_qGp5Hv7tsGs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qGp5Hv7tsGs", libSceNKWebKitLegacyUnknown_qGp5Hv7tsGs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_qHAmmjXXW6A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qHAmmjXXW6A", libSceNKWebKitLegacyUnknown_qHAmmjXXW6A_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_qINWb8ZDW9k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qINWb8ZDW9k", libSceNKWebKitLegacyUnknown_qINWb8ZDW9k_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_qIgSdMADtcQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qIgSdMADtcQ", libSceNKWebKitLegacyUnknown_qIgSdMADtcQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_qOmEpCDDDIY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qOmEpCDDDIY", libSceNKWebKitLegacyUnknown_qOmEpCDDDIY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_qOwk_minus_Xj1Qlw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qOwk-Xj1Qlw", libSceNKWebKitLegacyUnknown_qOwk_minus_Xj1Qlw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_qPvg3vvKVZc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qPvg3vvKVZc", libSceNKWebKitLegacyUnknown_qPvg3vvKVZc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_qVmEbYCnt6k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qVmEbYCnt6k", libSceNKWebKitLegacyUnknown_qVmEbYCnt6k_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_qYCSesOwYMo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qYCSesOwYMo", libSceNKWebKitLegacyUnknown_qYCSesOwYMo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_qc_minus_X7Y_plus_SL5o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qc-X7Y+SL5o", libSceNKWebKitLegacyUnknown_qc_minus_X7Y_plus_SL5o_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_qcbq6ZtAiL0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qcbq6ZtAiL0", libSceNKWebKitLegacyUnknown_qcbq6ZtAiL0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_qdb0LpnRm6M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qdb0LpnRm6M", libSceNKWebKitLegacyUnknown_qdb0LpnRm6M_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_qdoLpGEQ1XE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qdoLpGEQ1XE", libSceNKWebKitLegacyUnknown_qdoLpGEQ1XE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_qj0dNtgkDbw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qj0dNtgkDbw", libSceNKWebKitLegacyUnknown_qj0dNtgkDbw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_qlvV3qxuDNs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qlvV3qxuDNs", libSceNKWebKitLegacyUnknown_qlvV3qxuDNs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_qphY013lGno_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qphY013lGno", libSceNKWebKitLegacyUnknown_qphY013lGno_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_qpuf5izWYX4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qpuf5izWYX4", libSceNKWebKitLegacyUnknown_qpuf5izWYX4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_qqisiZ8UC0Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qqisiZ8UC0Y", libSceNKWebKitLegacyUnknown_qqisiZ8UC0Y_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_qrWtbADYadA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qrWtbADYadA", libSceNKWebKitLegacyUnknown_qrWtbADYadA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_qs5agwaZZh0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qs5agwaZZh0", libSceNKWebKitLegacyUnknown_qs5agwaZZh0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_qtqdVrcEY3E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qtqdVrcEY3E", libSceNKWebKitLegacyUnknown_qtqdVrcEY3E_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_qu7GUBjarBs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qu7GUBjarBs", libSceNKWebKitLegacyUnknown_qu7GUBjarBs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_quZqrOeI5IE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("quZqrOeI5IE", libSceNKWebKitLegacyUnknown_quZqrOeI5IE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_qvfwUY9cLaQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qvfwUY9cLaQ", libSceNKWebKitLegacyUnknown_qvfwUY9cLaQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_qxiDhrp8boY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qxiDhrp8boY", libSceNKWebKitLegacyUnknown_qxiDhrp8boY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_qyLe_minus_tXZ4VE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qyLe-tXZ4VE", libSceNKWebKitLegacyUnknown_qyLe_minus_tXZ4VE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_r086my47qVA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("r086my47qVA", libSceNKWebKitLegacyUnknown_r086my47qVA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_r0fVFU6ham8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("r0fVFU6ham8", libSceNKWebKitLegacyUnknown_r0fVFU6ham8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_r5iHlAhWyUA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("r5iHlAhWyUA", libSceNKWebKitLegacyUnknown_r5iHlAhWyUA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_r5ic7SNqMiQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("r5ic7SNqMiQ", libSceNKWebKitLegacyUnknown_r5ic7SNqMiQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_r9z2aGbF4hg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("r9z2aGbF4hg", libSceNKWebKitLegacyUnknown_r9z2aGbF4hg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_rBZ_plus_OjdFBAk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rBZ+OjdFBAk", libSceNKWebKitLegacyUnknown_rBZ_plus_OjdFBAk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_rC6DV8RL7u4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rC6DV8RL7u4", libSceNKWebKitLegacyUnknown_rC6DV8RL7u4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_rEMG2FORiIs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rEMG2FORiIs", libSceNKWebKitLegacyUnknown_rEMG2FORiIs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_rJTtAVw7H5I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rJTtAVw7H5I", libSceNKWebKitLegacyUnknown_rJTtAVw7H5I_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_rJcLupv6yz8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rJcLupv6yz8", libSceNKWebKitLegacyUnknown_rJcLupv6yz8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_rNLVCzbCJgE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rNLVCzbCJgE", libSceNKWebKitLegacyUnknown_rNLVCzbCJgE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_rNoQTDSkF0Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rNoQTDSkF0Y", libSceNKWebKitLegacyUnknown_rNoQTDSkF0Y_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_rONrD2xHVZk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rONrD2xHVZk", libSceNKWebKitLegacyUnknown_rONrD2xHVZk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_rPyRy5q6vXg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rPyRy5q6vXg", libSceNKWebKitLegacyUnknown_rPyRy5q6vXg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_rQr2nSz91OY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rQr2nSz91OY", libSceNKWebKitLegacyUnknown_rQr2nSz91OY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_rSKOJzOghVM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rSKOJzOghVM", libSceNKWebKitLegacyUnknown_rSKOJzOghVM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_rSjUG0S004I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rSjUG0S004I", libSceNKWebKitLegacyUnknown_rSjUG0S004I_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_rTZEisjyGZQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rTZEisjyGZQ", libSceNKWebKitLegacyUnknown_rTZEisjyGZQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_rVQZN6kv3Zk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rVQZN6kv3Zk", libSceNKWebKitLegacyUnknown_rVQZN6kv3Zk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_rWzPAzEcvi0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rWzPAzEcvi0", libSceNKWebKitLegacyUnknown_rWzPAzEcvi0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_rXOsqWISrB4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rXOsqWISrB4", libSceNKWebKitLegacyUnknown_rXOsqWISrB4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_rXbzVpqX6ro_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rXbzVpqX6ro", libSceNKWebKitLegacyUnknown_rXbzVpqX6ro_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ra_plus_kuj5vEl4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ra+kuj5vEl4", libSceNKWebKitLegacyUnknown_ra_plus_kuj5vEl4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ra_minus_vD4R5XxA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ra-vD4R5XxA", libSceNKWebKitLegacyUnknown_ra_minus_vD4R5XxA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_rbSZBjXBjGs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rbSZBjXBjGs", libSceNKWebKitLegacyUnknown_rbSZBjXBjGs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_rcYiqxMPEpM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rcYiqxMPEpM", libSceNKWebKitLegacyUnknown_rcYiqxMPEpM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_re4y32MvUFQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("re4y32MvUFQ", libSceNKWebKitLegacyUnknown_re4y32MvUFQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_rf_minus_6UO_minus_lrls_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rf-6UO-lrls", libSceNKWebKitLegacyUnknown_rf_minus_6UO_minus_lrls_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_rjDyMB27L_minus_U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rjDyMB27L-U", libSceNKWebKitLegacyUnknown_rjDyMB27L_minus_U_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_rk9Yk81l3Bc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rk9Yk81l3Bc", libSceNKWebKitLegacyUnknown_rk9Yk81l3Bc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_rkMAfteUvoc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rkMAfteUvoc", libSceNKWebKitLegacyUnknown_rkMAfteUvoc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_rkmHtq6GqNs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rkmHtq6GqNs", libSceNKWebKitLegacyUnknown_rkmHtq6GqNs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_rlH9KhEJp2c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rlH9KhEJp2c", libSceNKWebKitLegacyUnknown_rlH9KhEJp2c_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_rlMTyDizfms_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rlMTyDizfms", libSceNKWebKitLegacyUnknown_rlMTyDizfms_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_rlrP1MrtN3k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rlrP1MrtN3k", libSceNKWebKitLegacyUnknown_rlrP1MrtN3k_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_rlz_minus_6_plus_QTzIM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rlz-6+QTzIM", libSceNKWebKitLegacyUnknown_rlz_minus_6_plus_QTzIM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_rm_plus_OcISAwjc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rm+OcISAwjc", libSceNKWebKitLegacyUnknown_rm_plus_OcISAwjc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_rn8QYn9Yuh8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rn8QYn9Yuh8", libSceNKWebKitLegacyUnknown_rn8QYn9Yuh8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_rrnAgjO_minus_pv0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rrnAgjO-pv0", libSceNKWebKitLegacyUnknown_rrnAgjO_minus_pv0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_rsX_minus_wqqmCbw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rsX-wqqmCbw", libSceNKWebKitLegacyUnknown_rsX_minus_wqqmCbw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_rsdziSccAtU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rsdziSccAtU", libSceNKWebKitLegacyUnknown_rsdziSccAtU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_rwBYJNJtve4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rwBYJNJtve4", libSceNKWebKitLegacyUnknown_rwBYJNJtve4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_rwy_plus_lzkDNBc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rwy+lzkDNBc", libSceNKWebKitLegacyUnknown_rwy_plus_lzkDNBc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ryJEwSjeOCU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ryJEwSjeOCU", libSceNKWebKitLegacyUnknown_ryJEwSjeOCU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_s13MdrE2ZVA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("s13MdrE2ZVA", libSceNKWebKitLegacyUnknown_s13MdrE2ZVA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_s1W93bDgGXw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("s1W93bDgGXw", libSceNKWebKitLegacyUnknown_s1W93bDgGXw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_s3mNCN_minus_95Lk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("s3mNCN-95Lk", libSceNKWebKitLegacyUnknown_s3mNCN_minus_95Lk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_s5tkwwxWX8c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("s5tkwwxWX8c", libSceNKWebKitLegacyUnknown_s5tkwwxWX8c_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_s8wCTgpBNrQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("s8wCTgpBNrQ", libSceNKWebKitLegacyUnknown_s8wCTgpBNrQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_sCgF5uMB_minus_FI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sCgF5uMB-FI", libSceNKWebKitLegacyUnknown_sCgF5uMB_minus_FI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_sD9TzYmp_minus_VU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sD9TzYmp-VU", libSceNKWebKitLegacyUnknown_sD9TzYmp_minus_VU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_sE_plus_t4QVrkX0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sE+t4QVrkX0", libSceNKWebKitLegacyUnknown_sE_plus_t4QVrkX0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_sFd_minus_YS2a808_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sFd-YS2a808", libSceNKWebKitLegacyUnknown_sFd_minus_YS2a808_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_sG16FCVow8E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sG16FCVow8E", libSceNKWebKitLegacyUnknown_sG16FCVow8E_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_sGJzxO9xzDQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sGJzxO9xzDQ", libSceNKWebKitLegacyUnknown_sGJzxO9xzDQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_sGZVzPhOGyc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sGZVzPhOGyc", libSceNKWebKitLegacyUnknown_sGZVzPhOGyc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_sJR_minus_x5mI1i8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sJR-x5mI1i8", libSceNKWebKitLegacyUnknown_sJR_minus_x5mI1i8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_sJmwAgLsH6o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sJmwAgLsH6o", libSceNKWebKitLegacyUnknown_sJmwAgLsH6o_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_sKg_plus_Bx_plus_VSoM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sKg+Bx+VSoM", libSceNKWebKitLegacyUnknown_sKg_plus_Bx_plus_VSoM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_sMnTQ7ikLSc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sMnTQ7ikLSc", libSceNKWebKitLegacyUnknown_sMnTQ7ikLSc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_sNgjJZW2A7M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sNgjJZW2A7M", libSceNKWebKitLegacyUnknown_sNgjJZW2A7M_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_sNqGp2I_minus_m_plus_c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sNqGp2I-m+c", libSceNKWebKitLegacyUnknown_sNqGp2I_minus_m_plus_c_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_sPcruQNhydA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sPcruQNhydA", libSceNKWebKitLegacyUnknown_sPcruQNhydA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_sTFaycIFUKU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sTFaycIFUKU", libSceNKWebKitLegacyUnknown_sTFaycIFUKU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_sUVCMUIiDYg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sUVCMUIiDYg", libSceNKWebKitLegacyUnknown_sUVCMUIiDYg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_sXfFudQgKlA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sXfFudQgKlA", libSceNKWebKitLegacyUnknown_sXfFudQgKlA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_sbMQcXYiRY4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sbMQcXYiRY4", libSceNKWebKitLegacyUnknown_sbMQcXYiRY4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_sbXXIA7Khw4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sbXXIA7Khw4", libSceNKWebKitLegacyUnknown_sbXXIA7Khw4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_sdiDyE_minus_vZEc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sdiDyE-vZEc", libSceNKWebKitLegacyUnknown_sdiDyE_minus_vZEc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_sfb15YAkqP0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sfb15YAkqP0", libSceNKWebKitLegacyUnknown_sfb15YAkqP0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_sfbs6MLi_minus_vM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sfbs6MLi-vM", libSceNKWebKitLegacyUnknown_sfbs6MLi_minus_vM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_siWkeyN1Q9w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("siWkeyN1Q9w", libSceNKWebKitLegacyUnknown_siWkeyN1Q9w_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_sl6kUtmc2jQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sl6kUtmc2jQ", libSceNKWebKitLegacyUnknown_sl6kUtmc2jQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_soBUksJ6BJc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("soBUksJ6BJc", libSceNKWebKitLegacyUnknown_soBUksJ6BJc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_sptP0R_plus_70K8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sptP0R+70K8", libSceNKWebKitLegacyUnknown_sptP0R_plus_70K8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_sq0tL84dvR4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sq0tL84dvR4", libSceNKWebKitLegacyUnknown_sq0tL84dvR4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_sskXCk7XoHY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sskXCk7XoHY", libSceNKWebKitLegacyUnknown_sskXCk7XoHY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_suFjXqXcAxM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("suFjXqXcAxM", libSceNKWebKitLegacyUnknown_suFjXqXcAxM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_t_minus_19whstaJk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("t-19whstaJk", libSceNKWebKitLegacyUnknown_t_minus_19whstaJk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_t7JO426T0B8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("t7JO426T0B8", libSceNKWebKitLegacyUnknown_t7JO426T0B8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_t7ly31b0Ndc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("t7ly31b0Ndc", libSceNKWebKitLegacyUnknown_t7ly31b0Ndc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_t9OApWMdsWU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("t9OApWMdsWU", libSceNKWebKitLegacyUnknown_t9OApWMdsWU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_t9XUoJbebeo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("t9XUoJbebeo", libSceNKWebKitLegacyUnknown_t9XUoJbebeo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_t9anqIXZiQ0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("t9anqIXZiQ0", libSceNKWebKitLegacyUnknown_t9anqIXZiQ0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_tAJSGdhpxPg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tAJSGdhpxPg", libSceNKWebKitLegacyUnknown_tAJSGdhpxPg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_tDRu6NI8zIE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tDRu6NI8zIE", libSceNKWebKitLegacyUnknown_tDRu6NI8zIE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_tERtNxTopHQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tERtNxTopHQ", libSceNKWebKitLegacyUnknown_tERtNxTopHQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_tFWFxcN81k8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tFWFxcN81k8", libSceNKWebKitLegacyUnknown_tFWFxcN81k8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_tGKaqH2rxA8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tGKaqH2rxA8", libSceNKWebKitLegacyUnknown_tGKaqH2rxA8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_tHCoD1Tx_plus_ac_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tHCoD1Tx+ac", libSceNKWebKitLegacyUnknown_tHCoD1Tx_plus_ac_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_tI9hD6Dxa4I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tI9hD6Dxa4I", libSceNKWebKitLegacyUnknown_tI9hD6Dxa4I_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_tJ9NnDfCmms_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tJ9NnDfCmms", libSceNKWebKitLegacyUnknown_tJ9NnDfCmms_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_tJi9lnN2N7M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tJi9lnN2N7M", libSceNKWebKitLegacyUnknown_tJi9lnN2N7M_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_tKmhQVaQD7w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tKmhQVaQD7w", libSceNKWebKitLegacyUnknown_tKmhQVaQD7w_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_tMAxWmbzRZM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tMAxWmbzRZM", libSceNKWebKitLegacyUnknown_tMAxWmbzRZM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_tNJjozY_minus_ivY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tNJjozY-ivY", libSceNKWebKitLegacyUnknown_tNJjozY_minus_ivY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_tPxWWmILYcM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tPxWWmILYcM", libSceNKWebKitLegacyUnknown_tPxWWmILYcM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_tR6pYhfnTHs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tR6pYhfnTHs", libSceNKWebKitLegacyUnknown_tR6pYhfnTHs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_tS8_minus_IO1AbCM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tS8-IO1AbCM", libSceNKWebKitLegacyUnknown_tS8_minus_IO1AbCM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_tSNvjtWkIfQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tSNvjtWkIfQ", libSceNKWebKitLegacyUnknown_tSNvjtWkIfQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_tTXCDT7IfKE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tTXCDT7IfKE", libSceNKWebKitLegacyUnknown_tTXCDT7IfKE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_tVnfe7_plus_IZEk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tVnfe7+IZEk", libSceNKWebKitLegacyUnknown_tVnfe7_plus_IZEk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_tWES3w99BPs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tWES3w99BPs", libSceNKWebKitLegacyUnknown_tWES3w99BPs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_tWN91o4uKzw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tWN91o4uKzw", libSceNKWebKitLegacyUnknown_tWN91o4uKzw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_tXf8m1pD2a4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tXf8m1pD2a4", libSceNKWebKitLegacyUnknown_tXf8m1pD2a4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_tbs4tGxCa5E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tbs4tGxCa5E", libSceNKWebKitLegacyUnknown_tbs4tGxCa5E_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_tbwejyTSXUU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tbwejyTSXUU", libSceNKWebKitLegacyUnknown_tbwejyTSXUU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_tdT_minus_m7BcuWI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tdT-m7BcuWI", libSceNKWebKitLegacyUnknown_tdT_minus_m7BcuWI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_teIqLgy2D_plus_M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("teIqLgy2D+M", libSceNKWebKitLegacyUnknown_teIqLgy2D_plus_M_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_teMFfokLLkU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("teMFfokLLkU", libSceNKWebKitLegacyUnknown_teMFfokLLkU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_tgj75WoMzOk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tgj75WoMzOk", libSceNKWebKitLegacyUnknown_tgj75WoMzOk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_tgpbZU_minus_29tQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tgpbZU-29tQ", libSceNKWebKitLegacyUnknown_tgpbZU_minus_29tQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_tgu8Waf_plus_7lw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tgu8Waf+7lw", libSceNKWebKitLegacyUnknown_tgu8Waf_plus_7lw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_tjJ_minus_aT7ndxw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tjJ-aT7ndxw", libSceNKWebKitLegacyUnknown_tjJ_minus_aT7ndxw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_tk57Pd6sBUM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tk57Pd6sBUM", libSceNKWebKitLegacyUnknown_tk57Pd6sBUM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_toMfUd3jFmo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("toMfUd3jFmo", libSceNKWebKitLegacyUnknown_toMfUd3jFmo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_tqKiU7Aq5RM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tqKiU7Aq5RM", libSceNKWebKitLegacyUnknown_tqKiU7Aq5RM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_tvQBw2Po2aA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tvQBw2Po2aA", libSceNKWebKitLegacyUnknown_tvQBw2Po2aA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_twRfxl26QHM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("twRfxl26QHM", libSceNKWebKitLegacyUnknown_twRfxl26QHM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_twfQODVy4tM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("twfQODVy4tM", libSceNKWebKitLegacyUnknown_twfQODVy4tM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_txBwhP9PKYI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("txBwhP9PKYI", libSceNKWebKitLegacyUnknown_txBwhP9PKYI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_tygy6ny87Q0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tygy6ny87Q0", libSceNKWebKitLegacyUnknown_tygy6ny87Q0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_tz6Lq93L_plus_ck_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tz6Lq93L+ck", libSceNKWebKitLegacyUnknown_tz6Lq93L_plus_ck_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_tzMbgxjofRM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tzMbgxjofRM", libSceNKWebKitLegacyUnknown_tzMbgxjofRM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_tzUrPjnaJVM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tzUrPjnaJVM", libSceNKWebKitLegacyUnknown_tzUrPjnaJVM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_u_plus_NMS_minus_YShsI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("u+NMS-YShsI", libSceNKWebKitLegacyUnknown_u_plus_NMS_minus_YShsI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_u_plus_jJYuyhPyA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("u+jJYuyhPyA", libSceNKWebKitLegacyUnknown_u_plus_jJYuyhPyA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_u_minus_8eJHYqWpU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("u-8eJHYqWpU", libSceNKWebKitLegacyUnknown_u_minus_8eJHYqWpU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_u_minus_GlxOsA5GU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("u-GlxOsA5GU", libSceNKWebKitLegacyUnknown_u_minus_GlxOsA5GU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_u2gKuDWpTDY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("u2gKuDWpTDY", libSceNKWebKitLegacyUnknown_u2gKuDWpTDY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_u5SwcJ82lAU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("u5SwcJ82lAU", libSceNKWebKitLegacyUnknown_u5SwcJ82lAU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_u7d_minus_Shr0LfQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("u7d-Shr0LfQ", libSceNKWebKitLegacyUnknown_u7d_minus_Shr0LfQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_u8OCyPpV3NI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("u8OCyPpV3NI", libSceNKWebKitLegacyUnknown_u8OCyPpV3NI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_u8opZ3UBjFs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("u8opZ3UBjFs", libSceNKWebKitLegacyUnknown_u8opZ3UBjFs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_uARdCQX_minus__minus_zc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uARdCQX--zc", libSceNKWebKitLegacyUnknown_uARdCQX_minus__minus_zc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_uCZYLkqsAxA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uCZYLkqsAxA", libSceNKWebKitLegacyUnknown_uCZYLkqsAxA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_uFa_plus_zk_minus_qFos_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uFa+zk-qFos", libSceNKWebKitLegacyUnknown_uFa_plus_zk_minus_qFos_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_uI6fjh6uDF0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uI6fjh6uDF0", libSceNKWebKitLegacyUnknown_uI6fjh6uDF0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_uJz78qBVRxQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uJz78qBVRxQ", libSceNKWebKitLegacyUnknown_uJz78qBVRxQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_uNaCeoknjtQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uNaCeoknjtQ", libSceNKWebKitLegacyUnknown_uNaCeoknjtQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_uRAfWptGSjA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uRAfWptGSjA", libSceNKWebKitLegacyUnknown_uRAfWptGSjA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_uS1Uto3McwE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uS1Uto3McwE", libSceNKWebKitLegacyUnknown_uS1Uto3McwE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_uSuVZ1eLmt4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uSuVZ1eLmt4", libSceNKWebKitLegacyUnknown_uSuVZ1eLmt4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_uTRcii_minus_1Idc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uTRcii-1Idc", libSceNKWebKitLegacyUnknown_uTRcii_minus_1Idc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_uTRx3_plus_3gc_plus_k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uTRx3+3gc+k", libSceNKWebKitLegacyUnknown_uTRx3_plus_3gc_plus_k_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_uU4zmFmloQA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uU4zmFmloQA", libSceNKWebKitLegacyUnknown_uU4zmFmloQA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_uVeK_minus_dCqDDI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uVeK-dCqDDI", libSceNKWebKitLegacyUnknown_uVeK_minus_dCqDDI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_uYI_minus_Ut2eIzE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uYI-Ut2eIzE", libSceNKWebKitLegacyUnknown_uYI_minus_Ut2eIzE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_uZZDmi7MP0o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uZZDmi7MP0o", libSceNKWebKitLegacyUnknown_uZZDmi7MP0o_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_uat8HBPqBak_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uat8HBPqBak", libSceNKWebKitLegacyUnknown_uat8HBPqBak_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ucKljWzIjRE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ucKljWzIjRE", libSceNKWebKitLegacyUnknown_ucKljWzIjRE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ugBmqrDZeVU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ugBmqrDZeVU", libSceNKWebKitLegacyUnknown_ugBmqrDZeVU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_uh2EuCm2YCY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uh2EuCm2YCY", libSceNKWebKitLegacyUnknown_uh2EuCm2YCY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ui9fWiWye0o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ui9fWiWye0o", libSceNKWebKitLegacyUnknown_ui9fWiWye0o_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ujGbVNwbnsg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ujGbVNwbnsg", libSceNKWebKitLegacyUnknown_ujGbVNwbnsg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_umnzcAFHbII_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("umnzcAFHbII", libSceNKWebKitLegacyUnknown_umnzcAFHbII_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_un1SdiWKqFM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("un1SdiWKqFM", libSceNKWebKitLegacyUnknown_un1SdiWKqFM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_uoCC5iMYRRk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uoCC5iMYRRk", libSceNKWebKitLegacyUnknown_uoCC5iMYRRk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_uoxr3PU_plus_4as_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uoxr3PU+4as", libSceNKWebKitLegacyUnknown_uoxr3PU_plus_4as_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_urFiZZY7T8A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("urFiZZY7T8A", libSceNKWebKitLegacyUnknown_urFiZZY7T8A_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_v_plus_o2_minus_jDM_minus_NQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("v+o2-jDM-NQ", libSceNKWebKitLegacyUnknown_v_plus_o2_minus_jDM_minus_NQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_v_minus_1phlSHY_minus_4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("v-1phlSHY-4", libSceNKWebKitLegacyUnknown_v_minus_1phlSHY_minus_4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_v24X_plus_XNEZ10_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("v24X+XNEZ10", libSceNKWebKitLegacyUnknown_v24X_plus_XNEZ10_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_v3KR8jUiYis_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("v3KR8jUiYis", libSceNKWebKitLegacyUnknown_v3KR8jUiYis_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_v4T7KQ_minus_iRWk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("v4T7KQ-iRWk", libSceNKWebKitLegacyUnknown_v4T7KQ_minus_iRWk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_v4X5tkn3aEc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("v4X5tkn3aEc", libSceNKWebKitLegacyUnknown_v4X5tkn3aEc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_v4ovShGk46M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("v4ovShGk46M", libSceNKWebKitLegacyUnknown_v4ovShGk46M_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_v5Jv0hKmYiI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("v5Jv0hKmYiI", libSceNKWebKitLegacyUnknown_v5Jv0hKmYiI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_v7XXpvTVcS4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("v7XXpvTVcS4", libSceNKWebKitLegacyUnknown_v7XXpvTVcS4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_v7nsHgKZUw0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("v7nsHgKZUw0", libSceNKWebKitLegacyUnknown_v7nsHgKZUw0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_vEr0V2niEOs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vEr0V2niEOs", libSceNKWebKitLegacyUnknown_vEr0V2niEOs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_vGmSzNZQIJI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vGmSzNZQIJI", libSceNKWebKitLegacyUnknown_vGmSzNZQIJI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_vJusUgRbsfM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vJusUgRbsfM", libSceNKWebKitLegacyUnknown_vJusUgRbsfM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_vQah03QdJqE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vQah03QdJqE", libSceNKWebKitLegacyUnknown_vQah03QdJqE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_vQhkSQfb87Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vQhkSQfb87Y", libSceNKWebKitLegacyUnknown_vQhkSQfb87Y_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_vQlEe5xlWVU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vQlEe5xlWVU", libSceNKWebKitLegacyUnknown_vQlEe5xlWVU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_vTvTwYtpEeg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vTvTwYtpEeg", libSceNKWebKitLegacyUnknown_vTvTwYtpEeg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_vUbvfpTOyZw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vUbvfpTOyZw", libSceNKWebKitLegacyUnknown_vUbvfpTOyZw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_vVBwwOmK0I0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vVBwwOmK0I0", libSceNKWebKitLegacyUnknown_vVBwwOmK0I0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_vWBUbKWs53U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vWBUbKWs53U", libSceNKWebKitLegacyUnknown_vWBUbKWs53U_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_vaLPKYnyR1A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vaLPKYnyR1A", libSceNKWebKitLegacyUnknown_vaLPKYnyR1A_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_vahTGzCJaMQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vahTGzCJaMQ", libSceNKWebKitLegacyUnknown_vahTGzCJaMQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_vbOtZbSzsE8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vbOtZbSzsE8", libSceNKWebKitLegacyUnknown_vbOtZbSzsE8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_vdVczMe_minus_fhA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vdVczMe-fhA", libSceNKWebKitLegacyUnknown_vdVczMe_minus_fhA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_vhnwsUWgvuI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vhnwsUWgvuI", libSceNKWebKitLegacyUnknown_vhnwsUWgvuI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_vlGsIsU6PU0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vlGsIsU6PU0", libSceNKWebKitLegacyUnknown_vlGsIsU6PU0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_vmeEa2lMfgg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vmeEa2lMfgg", libSceNKWebKitLegacyUnknown_vmeEa2lMfgg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_vo44gbqDKr4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vo44gbqDKr4", libSceNKWebKitLegacyUnknown_vo44gbqDKr4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_vp9utKGSdLA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vp9utKGSdLA", libSceNKWebKitLegacyUnknown_vp9utKGSdLA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_vrcfgNgTsG0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vrcfgNgTsG0", libSceNKWebKitLegacyUnknown_vrcfgNgTsG0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_vsTIMSFJu8A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vsTIMSFJu8A", libSceNKWebKitLegacyUnknown_vsTIMSFJu8A_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_vsvqZ5etggk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vsvqZ5etggk", libSceNKWebKitLegacyUnknown_vsvqZ5etggk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_vu4W4iqtB8w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vu4W4iqtB8w", libSceNKWebKitLegacyUnknown_vu4W4iqtB8w_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_vvAH9_plus_4ZHz0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vvAH9+4ZHz0", libSceNKWebKitLegacyUnknown_vvAH9_plus_4ZHz0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_vwiXpS6cE1w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vwiXpS6cE1w", libSceNKWebKitLegacyUnknown_vwiXpS6cE1w_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_vzWCrH_plus_J_plus_NA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vzWCrH+J+NA", libSceNKWebKitLegacyUnknown_vzWCrH_plus_J_plus_NA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_w0wpHYTi6EA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("w0wpHYTi6EA", libSceNKWebKitLegacyUnknown_w0wpHYTi6EA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_w1K_plus_MDlGq0A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("w1K+MDlGq0A", libSceNKWebKitLegacyUnknown_w1K_plus_MDlGq0A_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_w2WJke4VKTI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("w2WJke4VKTI", libSceNKWebKitLegacyUnknown_w2WJke4VKTI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_w52SREE0dR4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("w52SREE0dR4", libSceNKWebKitLegacyUnknown_w52SREE0dR4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_w7mZl3yVB7Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("w7mZl3yVB7Q", libSceNKWebKitLegacyUnknown_w7mZl3yVB7Q_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_w8G_minus_27K4CKo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("w8G-27K4CKo", libSceNKWebKitLegacyUnknown_w8G_minus_27K4CKo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_w9ALlfS_plus__minus_1U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("w9ALlfS+-1U", libSceNKWebKitLegacyUnknown_w9ALlfS_plus__minus_1U_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_wA_minus_2odSyaxE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wA-2odSyaxE", libSceNKWebKitLegacyUnknown_wA_minus_2odSyaxE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_wEFMvcwAB_plus_4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wEFMvcwAB+4", libSceNKWebKitLegacyUnknown_wEFMvcwAB_plus_4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_wEoYa5LiVCs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wEoYa5LiVCs", libSceNKWebKitLegacyUnknown_wEoYa5LiVCs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_wI2MuSfoGmY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wI2MuSfoGmY", libSceNKWebKitLegacyUnknown_wI2MuSfoGmY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_wJGWP8GMugU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wJGWP8GMugU", libSceNKWebKitLegacyUnknown_wJGWP8GMugU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_wM3y9VvsxC8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wM3y9VvsxC8", libSceNKWebKitLegacyUnknown_wM3y9VvsxC8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_wREfYiBWM9I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wREfYiBWM9I", libSceNKWebKitLegacyUnknown_wREfYiBWM9I_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_wRflNM0P98U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wRflNM0P98U", libSceNKWebKitLegacyUnknown_wRflNM0P98U_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_wRmWjXuPRHc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wRmWjXuPRHc", libSceNKWebKitLegacyUnknown_wRmWjXuPRHc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_wShS3awSPes_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wShS3awSPes", libSceNKWebKitLegacyUnknown_wShS3awSPes_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_wT8R_minus_goU_minus_wo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wT8R-goU-wo", libSceNKWebKitLegacyUnknown_wT8R_minus_goU_minus_wo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_wUdJhLXHJ20_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wUdJhLXHJ20", libSceNKWebKitLegacyUnknown_wUdJhLXHJ20_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_wVqfIbX8_minus_9o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wVqfIbX8-9o", libSceNKWebKitLegacyUnknown_wVqfIbX8_minus_9o_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_wX3Q7fEGgig_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wX3Q7fEGgig", libSceNKWebKitLegacyUnknown_wX3Q7fEGgig_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_wXQ1M9E_minus_ogs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wXQ1M9E-ogs", libSceNKWebKitLegacyUnknown_wXQ1M9E_minus_ogs_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_wXV5Sv_plus_uG2I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wXV5Sv+uG2I", libSceNKWebKitLegacyUnknown_wXV5Sv_plus_uG2I_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_wXYqSpkCM0Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wXYqSpkCM0Q", libSceNKWebKitLegacyUnknown_wXYqSpkCM0Q_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_wZuzcZ6s3lI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wZuzcZ6s3lI", libSceNKWebKitLegacyUnknown_wZuzcZ6s3lI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_wadufVirZ2M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wadufVirZ2M", libSceNKWebKitLegacyUnknown_wadufVirZ2M_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_wcWXUiFSwIE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wcWXUiFSwIE", libSceNKWebKitLegacyUnknown_wcWXUiFSwIE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_weLsgM28tbk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("weLsgM28tbk", libSceNKWebKitLegacyUnknown_weLsgM28tbk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_wf813gVN0Pk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wf813gVN0Pk", libSceNKWebKitLegacyUnknown_wf813gVN0Pk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_wfYIRd1gBrQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wfYIRd1gBrQ", libSceNKWebKitLegacyUnknown_wfYIRd1gBrQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_wfr181TfXYA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wfr181TfXYA", libSceNKWebKitLegacyUnknown_wfr181TfXYA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_wiEINApongA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wiEINApongA", libSceNKWebKitLegacyUnknown_wiEINApongA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_wklLVioomR8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wklLVioomR8", libSceNKWebKitLegacyUnknown_wklLVioomR8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_wl1GA8QnYHg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wl1GA8QnYHg", libSceNKWebKitLegacyUnknown_wl1GA8QnYHg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_wpdqNpD4Oiw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wpdqNpD4Oiw", libSceNKWebKitLegacyUnknown_wpdqNpD4Oiw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ws3SV2Lco9Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ws3SV2Lco9Q", libSceNKWebKitLegacyUnknown_ws3SV2Lco9Q_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_wsuvi4O4rrU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wsuvi4O4rrU", libSceNKWebKitLegacyUnknown_wsuvi4O4rrU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_wtYQga8KPmc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wtYQga8KPmc", libSceNKWebKitLegacyUnknown_wtYQga8KPmc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_wuxc928fFWI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wuxc928fFWI", libSceNKWebKitLegacyUnknown_wuxc928fFWI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_wvnTRM83N8A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wvnTRM83N8A", libSceNKWebKitLegacyUnknown_wvnTRM83N8A_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_wvxn_plus_5DjD2E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wvxn+5DjD2E", libSceNKWebKitLegacyUnknown_wvxn_plus_5DjD2E_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_wyqfK2JMc3w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wyqfK2JMc3w", libSceNKWebKitLegacyUnknown_wyqfK2JMc3w_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_wzm2XBeo_minus_QA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wzm2XBeo-QA", libSceNKWebKitLegacyUnknown_wzm2XBeo_minus_QA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_x_minus_2E_minus_Ys4WR4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("x-2E-Ys4WR4", libSceNKWebKitLegacyUnknown_x_minus_2E_minus_Ys4WR4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_x1I5AZUlchI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("x1I5AZUlchI", libSceNKWebKitLegacyUnknown_x1I5AZUlchI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_x1rX1MnIGsY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("x1rX1MnIGsY", libSceNKWebKitLegacyUnknown_x1rX1MnIGsY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_x2tlaNw89TU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("x2tlaNw89TU", libSceNKWebKitLegacyUnknown_x2tlaNw89TU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_x9W3XZyylbQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("x9W3XZyylbQ", libSceNKWebKitLegacyUnknown_x9W3XZyylbQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_xCMuNG9KIgw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xCMuNG9KIgw", libSceNKWebKitLegacyUnknown_xCMuNG9KIgw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_xCkh_minus_S5yz3Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xCkh-S5yz3Q", libSceNKWebKitLegacyUnknown_xCkh_minus_S5yz3Q_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_xFMn_minus_zbvccU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xFMn-zbvccU", libSceNKWebKitLegacyUnknown_xFMn_minus_zbvccU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_xIy0W9HvBL4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xIy0W9HvBL4", libSceNKWebKitLegacyUnknown_xIy0W9HvBL4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_xJIr8LUoRF4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xJIr8LUoRF4", libSceNKWebKitLegacyUnknown_xJIr8LUoRF4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_xKjvZQc9mS0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xKjvZQc9mS0", libSceNKWebKitLegacyUnknown_xKjvZQc9mS0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_xKl8TEc8ex0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xKl8TEc8ex0", libSceNKWebKitLegacyUnknown_xKl8TEc8ex0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_xLNi34K9wx4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xLNi34K9wx4", libSceNKWebKitLegacyUnknown_xLNi34K9wx4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_xO9q1axBX6E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xO9q1axBX6E", libSceNKWebKitLegacyUnknown_xO9q1axBX6E_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_xP6BkeQUcgY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xP6BkeQUcgY", libSceNKWebKitLegacyUnknown_xP6BkeQUcgY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_xQCuxQjDykA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xQCuxQjDykA", libSceNKWebKitLegacyUnknown_xQCuxQjDykA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_xSzv_minus_6H17w4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xSzv-6H17w4", libSceNKWebKitLegacyUnknown_xSzv_minus_6H17w4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_xUnEBPqwAMA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xUnEBPqwAMA", libSceNKWebKitLegacyUnknown_xUnEBPqwAMA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_xaIq0CtQKoY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xaIq0CtQKoY", libSceNKWebKitLegacyUnknown_xaIq0CtQKoY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_xaJ_plus_90PDWq0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xaJ+90PDWq0", libSceNKWebKitLegacyUnknown_xaJ_plus_90PDWq0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_xaUiBXssnyI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xaUiBXssnyI", libSceNKWebKitLegacyUnknown_xaUiBXssnyI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_xdwXJaTNSdo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xdwXJaTNSdo", libSceNKWebKitLegacyUnknown_xdwXJaTNSdo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_xfIua_plus_p93JM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xfIua+p93JM", libSceNKWebKitLegacyUnknown_xfIua_plus_p93JM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_xfM0lTzZ2cg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xfM0lTzZ2cg", libSceNKWebKitLegacyUnknown_xfM0lTzZ2cg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_xih0DndiTn8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xih0DndiTn8", libSceNKWebKitLegacyUnknown_xih0DndiTn8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_xlMpv_minus_0dQqQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xlMpv-0dQqQ", libSceNKWebKitLegacyUnknown_xlMpv_minus_0dQqQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_xq6hhVsBYWQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xq6hhVsBYWQ", libSceNKWebKitLegacyUnknown_xq6hhVsBYWQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_xqbu_plus_3_minus_b_plus_oc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xqbu+3-b+oc", libSceNKWebKitLegacyUnknown_xqbu_plus_3_minus_b_plus_oc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_xvquTEbr1ro_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xvquTEbr1ro", libSceNKWebKitLegacyUnknown_xvquTEbr1ro_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_xvwBLvAw5rk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xvwBLvAw5rk", libSceNKWebKitLegacyUnknown_xvwBLvAw5rk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_xxCBvEF4QKA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xxCBvEF4QKA", libSceNKWebKitLegacyUnknown_xxCBvEF4QKA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_xxzYq2qOmmA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xxzYq2qOmmA", libSceNKWebKitLegacyUnknown_xxzYq2qOmmA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_y8YTG9tKkZU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("y8YTG9tKkZU", libSceNKWebKitLegacyUnknown_y8YTG9tKkZU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_yByyc7LWVyo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yByyc7LWVyo", libSceNKWebKitLegacyUnknown_yByyc7LWVyo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_yDcav8XDhNE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yDcav8XDhNE", libSceNKWebKitLegacyUnknown_yDcav8XDhNE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_yFESIdtULms_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yFESIdtULms", libSceNKWebKitLegacyUnknown_yFESIdtULms_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_yFVdc7AU9CE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yFVdc7AU9CE", libSceNKWebKitLegacyUnknown_yFVdc7AU9CE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_yFY_plus_qwyq4EU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yFY+qwyq4EU", libSceNKWebKitLegacyUnknown_yFY_plus_qwyq4EU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_yFpO_minus_JNMJhg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yFpO-JNMJhg", libSceNKWebKitLegacyUnknown_yFpO_minus_JNMJhg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_yH0QPebkOrI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yH0QPebkOrI", libSceNKWebKitLegacyUnknown_yH0QPebkOrI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_yLmhIcOD8ps_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yLmhIcOD8ps", libSceNKWebKitLegacyUnknown_yLmhIcOD8ps_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_yMs5663vXes_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yMs5663vXes", libSceNKWebKitLegacyUnknown_yMs5663vXes_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_yMsg1aIvVeQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yMsg1aIvVeQ", libSceNKWebKitLegacyUnknown_yMsg1aIvVeQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_yNo0nYzR_minus_2s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yNo0nYzR-2s", libSceNKWebKitLegacyUnknown_yNo0nYzR_minus_2s_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_yOg0rlUCw_minus_E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yOg0rlUCw-E", libSceNKWebKitLegacyUnknown_yOg0rlUCw_minus_E_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_yS7mdMnsD9w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yS7mdMnsD9w", libSceNKWebKitLegacyUnknown_yS7mdMnsD9w_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ySrVsGNCg5M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ySrVsGNCg5M", libSceNKWebKitLegacyUnknown_ySrVsGNCg5M_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_yTZX5enqmeg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yTZX5enqmeg", libSceNKWebKitLegacyUnknown_yTZX5enqmeg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_yU96LVMP6Ls_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yU96LVMP6Ls", libSceNKWebKitLegacyUnknown_yU96LVMP6Ls_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_yUSPR_minus_cbjTk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yUSPR-cbjTk", libSceNKWebKitLegacyUnknown_yUSPR_minus_cbjTk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_yUSeijS5jMg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yUSeijS5jMg", libSceNKWebKitLegacyUnknown_yUSeijS5jMg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_yVUXlSyV1wU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yVUXlSyV1wU", libSceNKWebKitLegacyUnknown_yVUXlSyV1wU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_yXn9vfYK9wc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yXn9vfYK9wc", libSceNKWebKitLegacyUnknown_yXn9vfYK9wc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_yZ_plus_xfcqaPFQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yZ+xfcqaPFQ", libSceNKWebKitLegacyUnknown_yZ_plus_xfcqaPFQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_yZAHahM6ssQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yZAHahM6ssQ", libSceNKWebKitLegacyUnknown_yZAHahM6ssQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ycTK_minus_Kln6O0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ycTK-Kln6O0", libSceNKWebKitLegacyUnknown_ycTK_minus_Kln6O0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ycjIR9LmD5g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ycjIR9LmD5g", libSceNKWebKitLegacyUnknown_ycjIR9LmD5g_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ydzVilv4a_plus_U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ydzVilv4a+U", libSceNKWebKitLegacyUnknown_ydzVilv4a_plus_U_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ye8ug5xQnCo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ye8ug5xQnCo", libSceNKWebKitLegacyUnknown_ye8ug5xQnCo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_yi7Wtl_plus_fVLE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yi7Wtl+fVLE", libSceNKWebKitLegacyUnknown_yi7Wtl_plus_fVLE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ykWsQEP_minus_SUQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ykWsQEP-SUQ", libSceNKWebKitLegacyUnknown_ykWsQEP_minus_SUQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ynOkla1p3Tg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ynOkla1p3Tg", libSceNKWebKitLegacyUnknown_ynOkla1p3Tg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_yo1eR3eeGFc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yo1eR3eeGFc", libSceNKWebKitLegacyUnknown_yo1eR3eeGFc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_yq_plus_USbNftkM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yq+USbNftkM", libSceNKWebKitLegacyUnknown_yq_plus_USbNftkM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_yrEqhN42Sdo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yrEqhN42Sdo", libSceNKWebKitLegacyUnknown_yrEqhN42Sdo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_yt3rhCWxg_minus_E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yt3rhCWxg-E", libSceNKWebKitLegacyUnknown_yt3rhCWxg_minus_E_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_yvD66FSFyNg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yvD66FSFyNg", libSceNKWebKitLegacyUnknown_yvD66FSFyNg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_yvK_plus_8QIuztw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yvK+8QIuztw", libSceNKWebKitLegacyUnknown_yvK_plus_8QIuztw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ywPrr9tliWE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ywPrr9tliWE", libSceNKWebKitLegacyUnknown_ywPrr9tliWE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_yxJfRazxV4Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yxJfRazxV4Y", libSceNKWebKitLegacyUnknown_yxJfRazxV4Y_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_yy4HvBpneq4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yy4HvBpneq4", libSceNKWebKitLegacyUnknown_yy4HvBpneq4_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_yyw_minus_EeUuvsI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yyw-EeUuvsI", libSceNKWebKitLegacyUnknown_yyw_minus_EeUuvsI_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_yyyKthMKUbg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yyyKthMKUbg", libSceNKWebKitLegacyUnknown_yyyKthMKUbg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_yzmRg_minus_FYuDY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yzmRg-FYuDY", libSceNKWebKitLegacyUnknown_yzmRg_minus_FYuDY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_z_plus_cswsLsRSE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("z+cswsLsRSE", libSceNKWebKitLegacyUnknown_z_plus_cswsLsRSE_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_z_plus_dacXqbPiw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("z+dacXqbPiw", libSceNKWebKitLegacyUnknown_z_plus_dacXqbPiw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_z_plus_rxFarLiwM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("z+rxFarLiwM", libSceNKWebKitLegacyUnknown_z_plus_rxFarLiwM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_z0h7iE7V9z0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("z0h7iE7V9z0", libSceNKWebKitLegacyUnknown_z0h7iE7V9z0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_z2VQDdlIm3s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("z2VQDdlIm3s", libSceNKWebKitLegacyUnknown_z2VQDdlIm3s_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_z5Gm6x3HnB0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("z5Gm6x3HnB0", libSceNKWebKitLegacyUnknown_z5Gm6x3HnB0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_z7Zy1jMxjyo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("z7Zy1jMxjyo", libSceNKWebKitLegacyUnknown_z7Zy1jMxjyo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_z9rAJ6lhtiM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("z9rAJ6lhtiM", libSceNKWebKitLegacyUnknown_z9rAJ6lhtiM_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_zCvvTlRfuq0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zCvvTlRfuq0", libSceNKWebKitLegacyUnknown_zCvvTlRfuq0_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_zKbg6elkzAk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zKbg6elkzAk", libSceNKWebKitLegacyUnknown_zKbg6elkzAk_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_zKbm12dz0po_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zKbm12dz0po", libSceNKWebKitLegacyUnknown_zKbm12dz0po_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_zMD3bA26OQY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zMD3bA26OQY", libSceNKWebKitLegacyUnknown_zMD3bA26OQY_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_zMbMGN1EK10_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zMbMGN1EK10", libSceNKWebKitLegacyUnknown_zMbMGN1EK10_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_zSDwbTp6598_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zSDwbTp6598", libSceNKWebKitLegacyUnknown_zSDwbTp6598_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_zTlwShy5eU8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zTlwShy5eU8", libSceNKWebKitLegacyUnknown_zTlwShy5eU8_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_zV05yXZmNKg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zV05yXZmNKg", libSceNKWebKitLegacyUnknown_zV05yXZmNKg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_zW6mUeF4XHg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zW6mUeF4XHg", libSceNKWebKitLegacyUnknown_zW6mUeF4XHg_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_zWByRCe8gvc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zWByRCe8gvc", libSceNKWebKitLegacyUnknown_zWByRCe8gvc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_zWxkwk8uSco_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zWxkwk8uSco", libSceNKWebKitLegacyUnknown_zWxkwk8uSco_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_zX9DrNdYROA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zX9DrNdYROA", libSceNKWebKitLegacyUnknown_zX9DrNdYROA_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_zX9Hg5va50Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zX9Hg5va50Y", libSceNKWebKitLegacyUnknown_zX9Hg5va50Y_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_zYqwC5u_plus_u8w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zYqwC5u+u8w", libSceNKWebKitLegacyUnknown_zYqwC5u_plus_u8w_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_zZHQ8k5tC40_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zZHQ8k5tC40", libSceNKWebKitLegacyUnknown_zZHQ8k5tC40_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_zZdK5_plus_6pGfo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zZdK5+6pGfo", libSceNKWebKitLegacyUnknown_zZdK5_plus_6pGfo_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_zkZ87olRiNU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zkZ87olRiNU", libSceNKWebKitLegacyUnknown_zkZ87olRiNU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_zm7DYNMbcEU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zm7DYNMbcEU", libSceNKWebKitLegacyUnknown_zm7DYNMbcEU_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_zn_minus_I1NzL_plus_rc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zn-I1NzL+rc", libSceNKWebKitLegacyUnknown_zn_minus_I1NzL_plus_rc_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_zp5pLVG32rw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zp5pLVG32rw", libSceNKWebKitLegacyUnknown_zp5pLVG32rw_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_zsbtwORWN3k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zsbtwORWN3k", libSceNKWebKitLegacyUnknown_zsbtwORWN3k_nid_no_patch); + +int APS5_VABI libSceNKWebKitLegacyUnknown_ztdtXYywksE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ztdtXYywksE", libSceNKWebKitLegacyUnknown_ztdtXYywksE_nid_no_patch); + + + int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal8Settings11getPropertyERKN3WTF6StringE() { NotImplemented_nid_no_patch(__func__); } @@ -36,10 +12103,6 @@ int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal11isUnderTestEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKPreferencesSetStandardFontFamily() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN7WebCore15JSDOMWindowBaseD1Ev() { NotImplemented_nid_no_patch(__func__); } @@ -68,10 +12131,6 @@ int APS5_VABI _ZN7WebCore4Node16addEventListenerERKN3WTF10AtomStringEONS1_3RefIN NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKPreferencesSetAutostartOriginPlugInSnapshottingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN7WebCore18TextureMapperLayer14paintRecursiveERKNS_25TextureMapperPaintOptionsE() { NotImplemented_nid_no_patch(__func__); } @@ -84,14 +12143,6 @@ int APS5_VABI _ZN7WebCore18HTMLMarqueeElement14setScrollDelayEj() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKPreferencesResetTestRunnerOverrides() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationSetAlwaysKeepAndReuseSwappedProcesses() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3JSC9Structure40addPropertyTransitionToExistingStructureEPS0_NS_12PropertyNameEjRi() { NotImplemented_nid_no_patch(__func__); } @@ -104,10 +12155,6 @@ int APS5_VABI _ZN7WebCore7Element26scrollIntoViewIfNotVisibleEb() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKPreferencesSetContentChangeObserverEnabled() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZNK3JSC18PropertyDescriptor12configurableEv() { NotImplemented_nid_no_patch(__func__); } @@ -120,10 +12167,6 @@ int APS5_VABI _ZN9Inspector18InjectedScriptHost7subtypeEPN3JSC14JSGlobalObjectEN NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZNK7WebCore24MatrixTransformOperation6matrixEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN7WebCore13HTTPHeaderMap3addERKN3WTF6StringES4_() { NotImplemented_nid_no_patch(__func__); } @@ -196,10 +12239,6 @@ int APS5_VABI _ZNK7WebCore11WindowProxy6windowEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF19addProcessPrivilegeENS_16ProcessPrivilegeE() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKPageLoadFile() { NotImplemented_nid_no_patch(__func__); } @@ -220,10 +12259,6 @@ int APS5_VABI _ZNK7WebCore4Page14renderTreeSizeEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKPreferencesSetCanvasUsesAcceleratedDrawing() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN9Inspector22HeapFrontendDispatcher13trackingStartEdRKN3WTF6StringE() { NotImplemented_nid_no_patch(__func__); } @@ -264,18 +12299,10 @@ int APS5_VABI _ZN3WTF6Thread5yieldEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKPreferencesGetCaptureVideoInUIProcessEnabled() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN7WebCore24DocumentMarkerController9addMarkerERKNS_11SimpleRangeENS_14DocumentMarker10MarkerTypeERKN3WTF7VariantIJNS6_6StringENS4_13DictationDataENS6_6RefPtrINS_4NodeENS6_13DumbPtrTraitsISB_EEEEEEE() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WTFSetLogChannelLevel() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN7WebCore20SVGPathStringBuilderC1Ev() { NotImplemented_nid_no_patch(__func__); } @@ -296,10 +12323,6 @@ int APS5_VABI _ZN3JSC4Heap20edenActivityCallbackEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKWebsitePoliciesSetAllowedAutoplayQuirks() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZNK7WebCore6Editor8canPasteEv() { NotImplemented_nid_no_patch(__func__); } @@ -312,10 +12335,6 @@ int APS5_VABI _ZN7WebCore18TextureMapperLayer18setFixedToViewportEb() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF5equalEPKNS_10StringImplES2_() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKBundleBackForwardListGetForwardListCount() { NotImplemented_nid_no_patch(__func__); } @@ -364,10 +12383,6 @@ int APS5_VABI _ZNK7WebCore14SecurityOrigin20isSameSchemeHostPortERKS0_() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKErrorCopyLocalizedDescription() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZNK7WebCore11MessagePort5derefEv() { NotImplemented_nid_no_patch(__func__); } @@ -376,14 +12391,6 @@ int APS5_VABI _ZNK7WebCore17MouseRelatedEvent1yEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN7WebCore9FloatRectC2ERKNS_7IntRectE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore15AffineTransform9translateERKNS_9FloatSizeE() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZNK3JSC18PropertyDescriptor6setterEv() { NotImplemented_nid_no_patch(__func__); } @@ -448,10 +12455,6 @@ int APS5_VABI _ZN7WebCore11MediaPlayer13addVideoTrackERNS_17VideoTrackPrivateE() NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZNK7WebCore10FloatPoint15matrixTransformERKNS_20TransformationMatrixE() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZThn16_N9Inspector22InspectorDebuggerAgent19evaluateOnCallFrameERN3WTF6StringERKS2_S5_PS4_PKbS8_S8_S8_S8_S8_RNS1_6RefPtrINS_8Protocol7Runtime12RemoteObjectENS1_13DumbPtrTraitsISC_EEEERNS1_8OptionalIbEERNSH_IiEE() { NotImplemented_nid_no_patch(__func__); } @@ -464,10 +12467,6 @@ int APS5_VABI _ZN9Inspector22RemoteInspectionTargetD2Ev() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZNK7WebCore5Color9lightenedEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent20setPauseOnAssertionsERN3WTF6StringEb() { NotImplemented_nid_no_patch(__func__); } @@ -488,10 +12487,6 @@ int APS5_VABI WKNotificationCopyDir() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZNK7WebCore9FloatRect8containsERKS0_() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN7WebCore20LegacySchemeRegistry33shouldTreatURLSchemeAsCORSEnabledERKN3WTF6StringE() { NotImplemented_nid_no_patch(__func__); } @@ -552,10 +12547,6 @@ int APS5_VABI _ZNK7WebCore6Widget25convertFromContainingViewERKNS_8IntPointE() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKPreferencesGetLocalFileContentSniffingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZNK7WebCore13HTTPHeaderMap12isolatedCopyEv() { NotImplemented_nid_no_patch(__func__); } @@ -572,10 +12563,6 @@ int APS5_VABI _ZN7WebCore8JSDOMURL9toWrappedERN3JSC2VMENS1_7JSValueE() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI JSObjectSetPrivate() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN7WebCore21ISOTrackEncryptionBoxC1Ev() { NotImplemented_nid_no_patch(__func__); } @@ -612,338 +12599,18 @@ int APS5_VABI _ZN7WebCore9FrameView11removeChildERNS_6WidgetE() { extern "C" { -int APS5_VABI JSCheckScriptSyntax() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSClassCreate() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSClassRelease() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSClassRetain() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI JSContextCreateBacktrace() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI JSContextGetGlobalContext() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSContextGetGlobalObject() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSContextGetGroup() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSContextGroupAddHeapFinalizer() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSContextGroupAddMarkingConstraint() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSContextGroupClearExecutionTimeLimit() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSContextGroupCreate() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSContextGroupRelease() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSContextGroupRemoveHeapFinalizer() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSContextGroupRetain() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSContextGroupSetExecutionTimeLimit() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSDisableGCTimer() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSEvaluateScript() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSGarbageCollect() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSGetMemoryUsageStatistics() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSGlobalContextCopyName() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSGlobalContextCreate() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSGlobalContextCreateInGroup() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSGlobalContextGetIncludesNativeCallStackWhenReportingExceptions() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSGlobalContextGetRemoteInspectionEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSGlobalContextRelease() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSGlobalContextRetain() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSGlobalContextSetIncludesNativeCallStackWhenReportingExceptions() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSGlobalContextSetName() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSGlobalContextSetRemoteInspectionEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSGlobalContextSetUnhandledRejectionCallback() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectCallAsConstructor() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectCallAsFunction() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectCopyPropertyNames() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectDeletePrivateProperty() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectDeletePropertyForKey() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectDeleteProperty() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectGetArrayBufferByteLength() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectGetArrayBufferBytesPtr() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectGetGlobalContext() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectGetPrivate() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectGetPrivateProperty() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectGetPropertyAtIndex() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectGetPropertyForKey() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectGetProperty() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectGetPrototype() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectGetProxyTarget() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectGetTypedArrayBuffer() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectGetTypedArrayByteLength() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectGetTypedArrayByteOffset() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectGetTypedArrayBytesPtr() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectGetTypedArrayLength() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectHasProperty() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectIsConstructor() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectIsFunction() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectMakeArrayBufferWithBytesNoCopy() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectMakeArray() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectMakeConstructor() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectMakeDate() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectMakeDeferredPromise() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectMakeError() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectMakeFunction() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectMakeFunctionWithCallback() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectMakeRegExp() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectMakeTypedArrayWithArrayBuffer() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectMakeTypedArrayWithArrayBufferAndOffset() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectMakeTypedArrayWithBytesNoCopy() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectMakeTypedArray() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectMake() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectSetPrivateProperty() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectSetPropertyAtIndex() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectSetPropertyForKey() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectSetProperty() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSObjectSetPrototype() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSPropertyNameAccumulatorAddName() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSPropertyNameArrayGetCount() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSPropertyNameArrayGetNameAtIndex() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSPropertyNameArrayRelease() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSPropertyNameArrayRetain() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI JSRemoteInspectorDisableAutoStart() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI JSRemoteInspectorGetInspectionEnabledByDefault() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI JSRemoteInspectorServerStart() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI JSRemoteInspectorSetInspectionEnabledByDefault() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI JSRemoteInspectorSetLogToSystemConsole() { NotImplemented_nid_no_patch(__func__); } @@ -956,190 +12623,14 @@ int APS5_VABI JSRemoteInspectorStart() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI JSReportExtraMemoryCost() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI JSRunLoop() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI JSScriptCreateFromString() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSScriptCreateReferencingImmortalASCIIText() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSScriptEvaluate() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSScriptRelease() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSScriptRetain() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI JSSetOptions() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI JSStringCreateWithCharactersNoCopy() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSSynchronousEdenCollectForDebugging() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSSynchronousGarbageCollectForDebugging() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSValueCreateJSONString() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSValueGetTypedArrayType() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSValueGetType() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSValueIsArray() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSValueIsBoolean() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSValueIsDate() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSValueIsEqual() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSValueIsInstanceOfConstructor() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSValueIsNull() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSValueIsNumber() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSValueIsObjectOfClass() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSValueIsObject() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSValueIsStrictEqual() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSValueIsString() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSValueIsSymbol() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSValueIsUndefined() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSValueMakeBoolean() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSValueMakeFromJSONString() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSValueMakeNull() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSValueMakeNumber() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSValueMakeSymbol() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSValueMakeUndefined() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSValueProtect() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSValueToBoolean() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSValueToNumber() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSValueToObject() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSValueToStringCopy() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSValueUnprotect() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSWeakCreate() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSWeakGetObject() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSWeakObjectMapGet() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSWeakObjectMapRemove() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSWeakObjectMapSet() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSWeakRelease() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI JSWeakRetain() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKAXObjectButtonState() { NotImplemented_nid_no_patch(__func__); } @@ -1164,10 +12655,6 @@ int APS5_VABI WKAXObjectFrame() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKAXObjectGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKAXObjectPage() { NotImplemented_nid_no_patch(__func__); } @@ -1212,38 +12699,6 @@ int APS5_VABI WKApplicationCacheManagerGetApplicationCacheOrigins() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKApplicationCacheManagerGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKArrayAppendItem() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKArrayCreateAdoptingValues() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKArrayCreate() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKArrayGetItemAtIndex() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKArrayGetSize() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKArrayGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKArrayRemoveItemAtIndex() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKAuthenticationChallengCopyRequestURL() { NotImplemented_nid_no_patch(__func__); } @@ -1264,10 +12719,6 @@ int APS5_VABI WKAuthenticationChallengeGetProtectionSpace() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKAuthenticationChallengeGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKAuthenticationChallengeIsForMainResource() { NotImplemented_nid_no_patch(__func__); } @@ -1280,10 +12731,6 @@ int APS5_VABI WKAuthenticationDecisionListenerCancel() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKAuthenticationDecisionListenerGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKAuthenticationDecisionListenerRejectProtectionSpaceAndContinue() { NotImplemented_nid_no_patch(__func__); } @@ -1328,10 +12775,6 @@ int APS5_VABI WKBackForwardListGetItemAtIndex() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKBackForwardListGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKBackForwardListItemCopyOriginalURL() { NotImplemented_nid_no_patch(__func__); } @@ -1344,22 +12787,6 @@ int APS5_VABI WKBackForwardListItemCopyURL() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKBackForwardListItemGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKBooleanCreate() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKBooleanGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKBooleanGetValue() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKBundleAddOriginAccessAllowListEntry() { NotImplemented_nid_no_patch(__func__); } @@ -1376,10 +12803,6 @@ int APS5_VABI WKBundleBackForwardListGetBackListCount() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKBundleBackForwardListGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKBundleBackForwardListItemCopyChildren() { NotImplemented_nid_no_patch(__func__); } @@ -1400,10 +12823,6 @@ int APS5_VABI WKBundleBackForwardListItemCopyURL() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKBundleBackForwardListItemGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKBundleBackForwardListItemHasCachedPageExpired() { NotImplemented_nid_no_patch(__func__); } @@ -1444,10 +12863,6 @@ int APS5_VABI WKBundleDOMWindowExtensionGetScriptWorld() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKBundleDOMWindowExtensionGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKBundleExtendClassesForParameterCoder() { NotImplemented_nid_no_patch(__func__); } @@ -1588,10 +13003,6 @@ int APS5_VABI WKBundleFrameGetScrollOffset() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKBundleFrameGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKBundleFrameGetVisibleContentBounds() { NotImplemented_nid_no_patch(__func__); } @@ -1644,10 +13055,6 @@ int APS5_VABI WKBundleGetJavaScriptObjectsCount() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKBundleGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKBundleHitTestResultCopyAbsoluteImageURL() { NotImplemented_nid_no_patch(__func__); } @@ -1708,10 +13115,6 @@ int APS5_VABI WKBundleHitTestResultGetTargetFrame() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKBundleHitTestResultGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKBundleHitTestResultIsDownloadableMedia() { NotImplemented_nid_no_patch(__func__); } @@ -1732,10 +13135,6 @@ int APS5_VABI WKBundleInspectorEvaluateScriptForTest() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKBundleInspectorGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKBundleInspectorSetPageProfilingEnabled() { NotImplemented_nid_no_patch(__func__); } @@ -1784,10 +13183,6 @@ int APS5_VABI WKBundleNavigationActionGetShouldTryAppLinks() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKBundleNavigationActionGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKBundleNodeHandleCopyDocumentFrame() { NotImplemented_nid_no_patch(__func__); } @@ -1864,10 +13259,6 @@ int APS5_VABI WKBundleNodeHandleGetRenderRect() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKBundleNodeHandleGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKBundleNodeHandleSetHTMLInputElementAutoFillAvailable() { NotImplemented_nid_no_patch(__func__); } @@ -2076,10 +13467,6 @@ int APS5_VABI WKBundlePageGetTextZoomFactor() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKBundlePageGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKBundlePageHasComposition() { NotImplemented_nid_no_patch(__func__); } @@ -2144,10 +13531,6 @@ int APS5_VABI WKBundlePageOverlayFractionFadedIn() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKBundlePageOverlayGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKBundlePageOverlaySetAccessibilityClient() { NotImplemented_nid_no_patch(__func__); } @@ -2344,10 +13727,6 @@ int APS5_VABI WKBundleRangeHandleGetBoundingRectInWindowCoordinates() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKBundleRangeHandleGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKBundleReleaseMemory() { NotImplemented_nid_no_patch(__func__); } @@ -2388,10 +13767,6 @@ int APS5_VABI WKBundleScriptWorldDisableOverrideBuiltinsBehavior() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKBundleScriptWorldGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKBundleScriptWorldMakeAllShadowRootsOpen() { NotImplemented_nid_no_patch(__func__); } @@ -2420,38 +13795,10 @@ int APS5_VABI WKBundleSetWebNotificationPermission() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKCertificateInfoCopyCertificateAtIndex() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKCertificateInfoCopyVerificationErrorDescription() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKCertificateInfoCreateWithCertficateChain() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKCertificateInfoGetCertificateChainSize() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKCertificateInfoGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKCertificateInfoGetVerificationError() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKClearMockMediaDevices() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKConnectionGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKConnectionPostMessage() { NotImplemented_nid_no_patch(__func__); } @@ -2484,178 +13831,6 @@ int APS5_VABI WKContextClearVisitedLinks() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKContextConfigurationAlwaysKeepAndReuseSwappedProcesses() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationCopyApplicationCacheDirectory() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationCopyCustomClassesForParameterCoder() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationCopyDiskCacheDirectory() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationCopyIndexedDBDatabaseDirectory() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationCopyInjectedBundlePath() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationCopyLocalStorageDirectory() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationCopyMediaKeysStorageDirectory() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationCopyNetworkProcessPath() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationCopyOverrideLanguages() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationCopyResourceLoadStatisticsDirectory() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationCopyWebProcessPath() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationCopyWebSQLDatabaseDirectory() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationCreateWithLegacyOptions() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationCreate() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationDiskCacheSizeOverride() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationFullySynchronousModeIsAllowedForTesting() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationGetUserId() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationIgnoreSynchronousMessagingTimeoutsForTesting() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationPrewarmsProcessesAutomatically() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationProcessSwapsOnNavigation() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationSetApplicationCacheDirectory() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationSetCustomClassesForParameterCoder() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationSetDiskCacheDirectory() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationSetDiskCacheSizeOverride() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationSetFullySynchronousModeIsAllowedForTesting() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationSetIgnoreSynchronousMessagingTimeoutsForTesting() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationSetIndexedDBDatabaseDirectory() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationSetInjectedBundlePath() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationSetLocalStorageDirectory() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationSetMediaKeysStorageDirectory() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationSetNetworkProcessPath() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationSetOverrideLanguages() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationSetPrewarmsProcessesAutomatically() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationSetProcessSwapsOnNavigation() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationSetResourceLoadStatisticsDirectory() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationSetShouldCaptureAudioInUIProcess() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationSetShouldConfigureJSCForTesting() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationSetUserId() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationSetUsesWebProcessCache() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationSetWebProcessPath() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationSetWebSQLDatabaseDirectory() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKContextConfigurationUsesWebProcessCache() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKContextCopyPlugInAutoStartOriginHashes() { NotImplemented_nid_no_patch(__func__); } @@ -2736,10 +13911,6 @@ int APS5_VABI WKContextGetStatistics() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKContextGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKContextGetUsesSingleWebProcess() { NotImplemented_nid_no_patch(__func__); } @@ -2784,10 +13955,6 @@ int APS5_VABI WKContextMenuItemGetTag() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKContextMenuItemGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKContextMenuItemGetType() { NotImplemented_nid_no_patch(__func__); } @@ -2992,10 +14159,6 @@ int APS5_VABI WKCookieManagerGetHostnamesWithCookies() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKCookieManagerGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKCookieManagerSetClient() { NotImplemented_nid_no_patch(__func__); } @@ -3012,74 +14175,6 @@ int APS5_VABI WKCookieManagerStopObservingCookieChanges() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKCredentialCopyUser() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKCredentialCreateWithCertificateInfo() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKCredentialCreate() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKCredentialGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKDataCreate() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKDataGetBytes() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKDataGetSize() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKDataGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKDictionaryCopyKeys() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKDictionaryCreate() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKDictionaryGetItemForKey() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKDictionaryGetSize() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKDictionaryGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKDictionarySetItem() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKDoubleCreate() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKDoubleGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKDoubleGetValue() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKDownloadCopyRequest() { NotImplemented_nid_no_patch(__func__); } @@ -3088,42 +14183,14 @@ int APS5_VABI WKDownloadGetOriginatingPage() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKDownloadGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKDownloadGetWasUserInitiated() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKErrorCopyDomain() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKErrorCopyFailingURL() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKErrorCopyWKErrorDomain() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKErrorGetErrorCode() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKErrorGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKFormSubmissionListenerContinue() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKFormSubmissionListenerGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKFrameCanProvideSource() { NotImplemented_nid_no_patch(__func__); } @@ -3180,10 +14247,6 @@ int APS5_VABI WKFrameGetResourceData() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKFrameGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKFrameGetWebArchive() { NotImplemented_nid_no_patch(__func__); } @@ -3192,18 +14255,10 @@ int APS5_VABI WKFrameHandleGetFrameID() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKFrameHandleGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKFrameInfoCreateFrameHandleRef() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKFrameInfoGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKFrameIsDisplayingMarkupDocument() { NotImplemented_nid_no_patch(__func__); } @@ -3224,10 +14279,6 @@ int APS5_VABI WKFramePolicyListenerDownload() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKFramePolicyListenerGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKFramePolicyListenerIgnore() { NotImplemented_nid_no_patch(__func__); } @@ -3252,10 +14303,6 @@ int APS5_VABI WKFrameStopLoading() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKGeolocationManagerGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKGeolocationManagerProviderDidChangePosition() { NotImplemented_nid_no_patch(__func__); } @@ -3280,38 +14327,10 @@ int APS5_VABI WKGeolocationPermissionRequestDeny() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKGeolocationPermissionRequestGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKGeolocationPositionCreate() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKGeolocationPositionCreate_b() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKGeolocationPositionCreate_c() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKGeolocationPositionGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKHTTPCookieStoreDeleteAllCookies() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKHTTPCookieStoreGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKHTTPCookieStoreSetCookieForHostname() { NotImplemented_nid_no_patch(__func__); } @@ -3352,10 +14371,6 @@ int APS5_VABI WKHitTestResultGetElementBoundingBox() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKHitTestResultGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKHitTestResultIsContentEditable() { NotImplemented_nid_no_patch(__func__); } @@ -3380,10 +14395,6 @@ int APS5_VABI WKIconDatabaseEnableDatabaseCleanup() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKIconDatabaseGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKIconDatabaseReleaseIconForURL() { NotImplemented_nid_no_patch(__func__); } @@ -3424,10 +14435,6 @@ int APS5_VABI WKImageGetSize() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKImageGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKImeEventGetInputLanguage() { NotImplemented_nid_no_patch(__func__); } @@ -3460,10 +14467,6 @@ int APS5_VABI WKInspectorGetPage() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKInspectorGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKInspectorHide() { NotImplemented_nid_no_patch(__func__); } @@ -3544,18 +14547,10 @@ int APS5_VABI WKKeyValueStorageManagerGetStorageDetailsByOrigin() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKKeyValueStorageManagerGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKKeyboardEventMake() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKMessageListenerGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKMessageListenerSendReply() { NotImplemented_nid_no_patch(__func__); } @@ -3564,18 +14559,6 @@ int APS5_VABI WKMouseEventMake() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKMutableArrayCreate() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKMutableDictionaryCreate() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKNavigationActionGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKNavigationActionShouldPerformDownload() { NotImplemented_nid_no_patch(__func__); } @@ -3596,22 +14579,10 @@ int APS5_VABI WKNavigationDataCopyURL() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKNavigationDataGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKNavigationGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKNavigationResponseCanShowMIMEType() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKNavigationResponseGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKNotificationCopyBody() { NotImplemented_nid_no_patch(__func__); } @@ -3640,14 +14611,6 @@ int APS5_VABI WKNotificationGetSecurityOrigin() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKNotificationGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKNotificationManagerGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKNotificationManagerProviderDidClickNotification() { NotImplemented_nid_no_patch(__func__); } @@ -3672,10 +14635,6 @@ int APS5_VABI WKNotificationPermissionRequestDeny() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKNotificationPermissionRequestGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKOpenPanelParametersCopyAcceptedFileExtensions() { NotImplemented_nid_no_patch(__func__); } @@ -3708,10 +14667,6 @@ int APS5_VABI WKOpenPanelParametersGetMediaCaptureType() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKOpenPanelParametersGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKOpenPanelResultListenerCancel() { NotImplemented_nid_no_patch(__func__); } @@ -3720,10 +14675,6 @@ int APS5_VABI WKOpenPanelResultListenerChooseFiles() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKOpenPanelResultListenerGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKPageAreScrollbarAnimationsSuppressed() { NotImplemented_nid_no_patch(__func__); } @@ -3780,70 +14731,6 @@ int APS5_VABI WKPageComputePagesForPrinting() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKPageConfigurationCreate() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPageConfigurationGetContext() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPageConfigurationGetPageGroup() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPageConfigurationGetPreferences() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPageConfigurationGetRelatedPage() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPageConfigurationGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPageConfigurationGetUserContentController() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPageConfigurationGetWebsiteDataStore() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPageConfigurationSetBackgroundCPULimit() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPageConfigurationSetContext() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPageConfigurationSetInitialCapitalizationEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPageConfigurationSetPageGroup() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPageConfigurationSetPreferences() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPageConfigurationSetRelatedPage() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPageConfigurationSetUserContentController() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPageConfigurationSetWebsiteDataStore() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKPageCopyActiveURL() { NotImplemented_nid_no_patch(__func__); } @@ -4072,10 +14959,6 @@ int APS5_VABI WKPageGetTextZoomFactor() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKPageGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKPageGoBack() { NotImplemented_nid_no_patch(__func__); } @@ -4088,42 +14971,6 @@ int APS5_VABI WKPageGoToBackForwardListItem() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKPageGroupAddUserScript() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPageGroupAddUserStyleSheet() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPageGroupCreateWithIdentifier() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPageGroupGetPreferences() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPageGroupGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPageGroupGetUserContentController() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPageGroupRemoveAllUserScripts() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPageGroupRemoveAllUserStyleSheets() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPageGroupSetPreferences() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKPageHandleImeEvent() { NotImplemented_nid_no_patch(__func__); } @@ -4296,10 +15143,6 @@ int APS5_VABI WKPageRequestStorageAccessConfirmResultListenerCall() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKPageRequestStorageAccessConfirmResultListenerGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKPageRestoreFromSessionState() { NotImplemented_nid_no_patch(__func__); } @@ -4332,26 +15175,14 @@ int APS5_VABI WKPageRunBeforeUnloadConfirmPanelResultListenerCall() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKPageRunBeforeUnloadConfirmPanelResultListenerGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKPageRunJavaScriptAlertResultListenerCall() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKPageRunJavaScriptAlertResultListenerGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKPageRunJavaScriptConfirmResultListenerCall() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKPageRunJavaScriptConfirmResultListenerGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKPageRunJavaScriptInMainFrame() { NotImplemented_nid_no_patch(__func__); } @@ -4360,10 +15191,6 @@ int APS5_VABI WKPageRunJavaScriptPromptResultListenerCall() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKPageRunJavaScriptPromptResultListenerGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKPageSelectContextMenuItem() { NotImplemented_nid_no_patch(__func__); } @@ -4656,26 +15483,10 @@ int APS5_VABI WKPluginInformationUpdatePastLastBlockedVersionIsKnownAvailableKey NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKPointCreate() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPointGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPointGetValue() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKPopupMenuItemCopyText() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKPopupMenuItemGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKPopupMenuItemIsEnabled() { NotImplemented_nid_no_patch(__func__); } @@ -4688,1590 +15499,26 @@ int APS5_VABI WKPopupMenuItemIsSeparator() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKPreferencesCopyCursiveFontFamily() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesCopyDefaultTextEncodingName() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesCopyFTPDirectoryTemplatePath() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesCopyFantasyFontFamily() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesCopyFixedFontFamily() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesCopyMediaContentTypesRequiringHardwareSupport() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesCopyPictographFontFamily() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesCopySansSerifFontFamily() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesCopySerifFontFamily() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesCopyStandardFontFamily() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesCreateCopy() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesCreateWithIdentifier() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesCreate() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesEnableAllExperimentalFeatures() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetAVFoundationEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetAVFoundationNSURLSessionEnabled() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKPreferencesGetAccelerated2DCanvasEnabled() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKPreferencesGetAcceleratedCompositingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetAcceleratedDrawingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetAggressiveTileRetentionEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetAllowCrossOriginSubresourcesToAskForCredentials() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetAllowMediaContentTypesRequiringHardwareSupportAsFallback() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetAllowsAirPlayForMediaPlayback() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetAllowsPictureInPictureMediaPlayback() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetAnimatedImageAsyncDecodingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetAntialiasedFontDilationEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetApplePayCapabilityDisclosureAllowed() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetApplePayEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetArtificialPluginInitializationDelayEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetAsynchronousPluginInitializationEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetAsynchronousPluginInitializationEnabledForAllPlugins() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetAsynchronousSpellCheckingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetAttachmentElementEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetAudioPlaybackRequiresUserGesture() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetAuthorAndUserStylesEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetAutostartOriginPlugInSnapshottingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetBackspaceKeyNavigationEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetBeaconAPIEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetCSSOMViewScrollingAPIEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetCanvasUsesAcceleratedDrawing() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetCaptureAudioInGPUProcessEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetCaptureAudioInUIProcessEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetCaptureVideoInGPUProcessEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetCaretBrowsingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetColorFilterEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetCompositingBordersVisible() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetCompositingRepaintCountersVisible() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetContentChangeObserverEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetCookieEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetCrossOriginResourcePolicyEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetCustomPasteboardDataEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetDNSPrefetchingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetDOMPasteAllowed() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetDOMTimersThrottlingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetDataTransferItemsEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetDatabasesEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetDefaultFixedFontSize() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetDefaultFontSize() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetDeveloperExtrasEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetDiagnosticLoggingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetDirectoryUploadEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetDownloadAttributeEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetEditableLinkBehavior() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetEnableInheritURIQueryComponent() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetEncodingDetectorEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetEncryptedMediaAPIEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetEnumeratingAllNetworkInterfacesEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetFetchAPIEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetFetchAPIKeepAliveEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetFileAccessFromFileURLsAllowed() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetForceFTPDirectoryListings() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetFrameFlatteningEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetFullScreenEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetGamepadsEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetHTTPEquivEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetHiddenPageCSSAnimationSuspensionEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetHiddenPageDOMTimerThrottlingAutoIncreases() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetHiddenPageDOMTimerThrottlingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetHighlightAPIEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetHixie76WebSocketProtocolEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetHyperlinkAuditingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetICECandidateFilteringEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetIgnoreViewportScalingConstraints() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetImageControlsEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetInactiveMediaCaptureSteamRepromptIntervalInMinutes() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetIncrementalRenderingSuppressionTimeout() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetInlineMediaPlaybackRequiresPlaysInlineAttribute() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetInteractiveFormValidationEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetIntersectionObserverEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetInvisibleMediaAutoplayPermitted() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetIsAccessibilityIsolatedTreeEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetIsSecureContextAttributeEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetJavaEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetJavaScriptCanAccessClipboard() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetJavaScriptCanOpenWindowsAutomatically() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetJavaScriptEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetJavaScriptMarkupEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetJavaScriptRuntimeFlags() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetKeygenElementEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetLargeImageAsyncDecodingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetLegacyEncryptedMediaAPIEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetLinkPreloadEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetLoadsImagesAutomatically() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetLoadsSiteIconsIgnoringImageLoadingPreference() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetLocalStorageEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetLogsPageMessagesToSystemConsoleEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetLongMousePressEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetMainContentUserGestureOverrideEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetMediaCapabilitiesEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetMediaCaptureRequiresSecureConnection() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetMediaControlsScaleWithPageZoom() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetMediaDevicesEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetMediaPlayable() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetMediaPlaybackAllowsInline() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetMediaPlaybackRequiresUserGesture() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetMediaPreloadingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetMediaSourceEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetMediaStreamEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetMediaUserGestureInheritsFromDocument() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetMenuItemElementEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetMetaRefreshEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetMinimumFontSize() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetMinimumZoomFontSize() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetMockCaptureDevicesEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetMockScrollbarsEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetNeedsSiteSpecificQuirks() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetNeedsStorageAccessFromFileURLsQuirk() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetNewBlockInsideInlineModelEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetNotificationsEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetOfflineWebApplicationCacheEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetPDFPluginEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetPageCacheEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetPageCacheSupportsPlugins() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetPageVisibilityBasedProcessSuppressionEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetPaginateDuringLayoutEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetPaintTimingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetPeerConnectionEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetPlugInSnapshottingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetPluginSandboxProfilesEnabledForAllPlugins() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetPluginsEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetPrimaryPlugInSnapshotDetectionEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetPrivateBrowsingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetProcessSwapOnNavigationEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetPunchOutWhiteBackgroundsInDarkMode() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKPreferencesGetQTKitEnabled() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKPreferencesGetReferrerPolicyAttributeEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetRemotePlaybackEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetRequestAnimationFrameEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetResourceTimingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetResourceUsageOverlayVisible() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetRestrictedHTTPResponseAccess() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetScrollingPerformanceLoggingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetSelectTrailingWhitespaceEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetServerTimingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetServiceControlsEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetShouldAllowUserInstalledFonts() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetShouldConvertPositionStyleOnCopy() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetShouldDisplayCaptions() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetShouldDisplaySubtitles() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetShouldDisplayTextDescriptions() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetShouldPrintBackgrounds() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetShouldRespectImageOrientation() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetShouldSuppressKeyboardInputDuringProvisionalNavigation() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetShouldUseServiceWorkerShortTimeout() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetShowsToolTipOverTruncatedText() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetShowsURLsInToolTipsEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetSmartInsertDeleteEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetSnapshotAllPlugIns() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetSourceBufferChangeTypeEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetSpatialNavigationEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetStorageAccessAPIEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetStorageBlockingPolicy() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetSubpixelAntialiasedLayerTextEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetSubpixelCSSOMElementMetricsEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetSuppressesIncrementalRendering() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetSyntheticEditingCommandsEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetTabsToLinks() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetTelephoneNumberParsingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetTextAreasAreResizable() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetTextAutosizingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetTextAutosizingUsesIdempotentMode() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetThreadedScrollingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetTiledScrollingIndicatorVisible() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetTopNavigationToDataURLsAllowed() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKPreferencesGetTypeID() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKPreferencesGetUniversalAccessFromFileURLsAllowed() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetUseGiantTiles() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetUserInterfaceDirectionPolicy() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetUserTimingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetVideoPlaybackRequiresUserGesture() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetViewGestureDebuggingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetVisibleDebugOverlayRegions() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetWebArchiveDebugModeEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetWebAudioEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetWebAuthenticationEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetWebGLEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetWebSQLDisabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetWebSecurityEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetWebShareEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesGetXSSAuditorEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesResetAllInternalDebugFeatures() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetAVFoundationEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetAVFoundationNSURLSessionEnabled() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKPreferencesSetAccelerated2DCanvasEnabled() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKPreferencesSetAcceleratedCompositingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetAcceleratedDrawingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetAggressiveTileRetentionEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetAllowCrossOriginSubresourcesToAskForCredentials() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetAllowMediaContentTypesRequiringHardwareSupportAsFallback() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetAllowsAirPlayForMediaPlayback() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetAllowsPictureInPictureMediaPlayback() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetAnimatedImageAsyncDecodingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetAntialiasedFontDilationEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetApplePayCapabilityDisclosureAllowed() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetApplePayEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetArtificialPluginInitializationDelayEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetAsynchronousPluginInitializationEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetAsynchronousPluginInitializationEnabledForAllPlugins() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetAsynchronousSpellCheckingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetAttachmentElementEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetAudioPlaybackRequiresUserGesture() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetAuthorAndUserStylesEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetBackspaceKeyNavigationEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetBeaconAPIEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetCSSOMViewScrollingAPIEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetCaptureAudioInGPUProcessEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetCaptureAudioInUIProcessEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetCaptureVideoInGPUProcessEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetCaptureVideoInUIProcessEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetCaretBrowsingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetColorFilterEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetCompositingBordersVisible() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetCompositingRepaintCountersVisible() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetCookieEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetCrossOriginResourcePolicyEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetCursiveFontFamily() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetCustomPasteboardDataEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetDNSPrefetchingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetDOMPasteAllowed() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetDOMTimersThrottlingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetDataTransferItemsEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetDatabasesEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetDefaultFixedFontSize() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetDefaultFontSize() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetDefaultTextEncodingName() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetDeveloperExtrasEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetDiagnosticLoggingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetDirectoryUploadEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetDownloadAttributeEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetEditableLinkBehavior() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetEnableInheritURIQueryComponent() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetEncodingDetectorEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetEncryptedMediaAPIEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetEnumeratingAllNetworkInterfacesEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetExperimentalFeatureForKey() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetFTPDirectoryTemplatePath() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetFantasyFontFamily() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetFetchAPIEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetFetchAPIKeepAliveEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetFileAccessFromFileURLsAllowed() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetFixedFontFamily() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetForceFTPDirectoryListings() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetFrameFlatteningEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetFullScreenEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetGamepadsEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetHTTPEquivEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetHiddenPageCSSAnimationSuspensionEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetHiddenPageDOMTimerThrottlingAutoIncreases() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetHiddenPageDOMTimerThrottlingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetHighlightAPIEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetHixie76WebSocketProtocolEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetHyperlinkAuditingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetICECandidateFilteringEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetIgnoreViewportScalingConstraints() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetImageControlsEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetInactiveMediaCaptureSteamRepromptIntervalInMinutes() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetIncrementalRenderingSuppressionTimeout() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetInlineMediaPlaybackRequiresPlaysInlineAttribute() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetInteractiveFormValidationEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetInternalDebugFeatureForKey() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetIntersectionObserverEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetInvisibleMediaAutoplayPermitted() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetIsAccessibilityIsolatedTreeEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetIsSecureContextAttributeEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetJavaEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetJavaScriptCanAccessClipboard() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetJavaScriptCanOpenWindowsAutomatically() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetJavaScriptEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetJavaScriptMarkupEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetJavaScriptRuntimeFlags() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetKeygenElementEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetLargeImageAsyncDecodingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetLegacyEncryptedMediaAPIEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetLinkPreloadEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetLoadsImagesAutomatically() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetLoadsSiteIconsIgnoringImageLoadingPreference() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetLocalFileContentSniffingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetLocalStorageEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetLogsPageMessagesToSystemConsoleEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetLongMousePressEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetMainContentUserGestureOverrideEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetMediaCapabilitiesEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetMediaCaptureRequiresSecureConnection() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetMediaContentTypesRequiringHardwareSupport() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetMediaControlsScaleWithPageZoom() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetMediaDevicesEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetMediaPlayable() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetMediaPlaybackAllowsInline() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetMediaPlaybackRequiresUserGesture() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetMediaPreloadingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetMediaSourceEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetMediaStreamEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetMediaUserGestureInheritsFromDocument() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetMenuItemElementEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetMetaRefreshEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetMinimumFontSize() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetMinimumZoomFontSize() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetMockCaptureDevicesEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetMockScrollbarsEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetNeedsSiteSpecificQuirks() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetNeedsStorageAccessFromFileURLsQuirk() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetNewBlockInsideInlineModelEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetNotificationsEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetOfflineWebApplicationCacheEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetPDFPluginEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetPageCacheEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetPageCacheSupportsPlugins() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetPageVisibilityBasedProcessSuppressionEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetPaginateDuringLayoutEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetPaintTimingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetPeerConnectionEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetPictographFontFamily() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetPlugInSnapshottingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetPluginSandboxProfilesEnabledForAllPlugins() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetPluginsEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetPrimaryPlugInSnapshotDetectionEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetPrivateBrowsingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetProcessSwapOnNavigationEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetPunchOutWhiteBackgroundsInDarkMode() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKPreferencesSetQTKitEnabled() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKPreferencesSetReferrerPolicyAttributeEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetRemotePlaybackEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetRequestAnimationFrameEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetResourceTimingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetResourceUsageOverlayVisible() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetRestrictedHTTPResponseAccess() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetSansSerifFontFamily() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetScrollingPerformanceLoggingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetSelectTrailingWhitespaceEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetSerifFontFamily() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetServerTimingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetServiceControlsEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetShouldAllowUserInstalledFonts() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetShouldConvertPositionStyleOnCopy() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetShouldDisplayCaptions() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetShouldDisplaySubtitles() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetShouldDisplayTextDescriptions() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetShouldPrintBackgrounds() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetShouldRespectImageOrientation() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetShouldSuppressKeyboardInputDuringProvisionalNavigation() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetShouldUseServiceWorkerShortTimeout() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetShowsToolTipOverTruncatedText() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetShowsURLsInToolTipsEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetSmartInsertDeleteEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetSnapshotAllPlugIns() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetSourceBufferChangeTypeEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetSpatialNavigationEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetStorageAccessAPIEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetStorageBlockingPolicy() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetSubpixelAntialiasedLayerTextEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetSubpixelCSSOMElementMetricsEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetSuppressesIncrementalRendering() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetSyntheticEditingCommandsEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetTabsToLinks() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetTelephoneNumberParsingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetTextAreasAreResizable() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetTextAutosizingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetTextAutosizingUsesIdempotentMode() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetThreadedScrollingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetTiledScrollingIndicatorVisible() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetTopNavigationToDataURLsAllowed() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetUniversalAccessFromFileURLsAllowed() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetUseGiantTiles() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetUserInterfaceDirectionPolicy() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetUserTimingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetVideoPlaybackRequiresUserGesture() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetViewGestureDebuggingEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetVisibleDebugOverlayRegions() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetWebArchiveDebugModeEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetWebAudioEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetWebAuthenticationEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetWebGLEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetWebSQLDisabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetWebSecurityEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetWebShareEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKPreferencesSetXSSAuditorEnabled() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKProtectionSpaceCopyCertificateInfo() { NotImplemented_nid_no_patch(__func__); } @@ -6304,30 +15551,10 @@ int APS5_VABI WKProtectionSpaceGetServerType() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKProtectionSpaceGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKRectCreate() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKRectGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKRectGetValue() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKRegistrableDomainCreate() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKRelease() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKRemoveMockMediaDevice() { NotImplemented_nid_no_patch(__func__); } @@ -6380,10 +15607,6 @@ int APS5_VABI WKRenderLayerGetRenderer() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKRenderLayerGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKRenderLayerIsClipped() { NotImplemented_nid_no_patch(__func__); } @@ -6432,10 +15655,6 @@ int APS5_VABI WKRenderObjectGetTextLength() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKRenderObjectGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKResetMockMediaDevices() { NotImplemented_nid_no_patch(__func__); } @@ -6452,14 +15671,6 @@ int APS5_VABI WKResourceCacheManagerGetCacheOrigins() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKResourceCacheManagerGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKRetain() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKRunLoopCallOnMainThread() { NotImplemented_nid_no_patch(__func__); } @@ -6476,42 +15687,6 @@ int APS5_VABI WKRunLoopStopMain() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKSecurityOriginCopyDatabaseIdentifier() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKSecurityOriginCopyHost() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKSecurityOriginCopyProtocol() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKSecurityOriginCopyToString() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKSecurityOriginCreate() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKSecurityOriginCreateFromDatabaseIdentifier() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKSecurityOriginCreateFromString() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKSecurityOriginGetPort() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKSecurityOriginGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKSendDisplayConfigurationChangedMessageForTesting() { NotImplemented_nid_no_patch(__func__); } @@ -6524,10 +15699,6 @@ int APS5_VABI WKSerializedScriptValueDeserialize() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKSerializedScriptValueGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKSessionStateCopyData() { NotImplemented_nid_no_patch(__func__); } @@ -6536,90 +15707,10 @@ int APS5_VABI WKSessionStateCreateFromData() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKSessionStateGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKSizeCreate() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKSizeGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKSizeGetValue() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKStringCopyJSString() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKStringCreateWithJSString() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKStringCreateWithUTF8CString() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKStringGetCharacters() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKStringGetLength() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKStringGetMaximumUTF8CStringSize() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKStringGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKStringGetUTF8CStringNonStrict() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKStringGetUTF8CString() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKStringIsEmpty() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKStringIsEqualToUTF8CStringIgnoringCase() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKStringIsEqualToUTF8CString() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKStringIsEqual() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKTextCheckerSetTestingMode() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKUInt64Create() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKUInt64GetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKUInt64GetValue() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKURLCopyHostName() { NotImplemented_nid_no_patch(__func__); } @@ -6636,110 +15727,14 @@ int APS5_VABI WKURLCopyScheme() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKURLCopyString() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKURLCreateWithBaseURL() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKURLCreateWithUTF8CString() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKURLGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKURLIsEqual() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKURLRequestCopyFirstPartyForCookies() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKURLRequestCopyHTTPMethod() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKURLRequestCopySettingHTTPBody() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKURLRequestCopyURL() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKURLRequestCreateWithWKURL() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKURLRequestGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKURLRequestSetDefaultTimeoutInterval() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKURLResponseCopyMIMEType() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKURLResponseCopySuggestedFilename() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKURLResponseCopyURL() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKURLResponseGetExpectedContentLength() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKURLResponseGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKURLResponseHTTPStatusCode() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKURLResponseIsAttachment() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKUserContentControllerAddUserContentFilter() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKUserContentControllerAddUserScript() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKUserContentControllerCopyUserScripts() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKUserContentControllerCreate() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKUserContentControllerGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKUserContentControllerRemoveAllUserContentFilters() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKUserContentControllerRemoveAllUserScripts() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKUserContentExtensionStoreCompile() { NotImplemented_nid_no_patch(__func__); } @@ -6748,46 +15743,10 @@ int APS5_VABI WKUserContentExtensionStoreCreate() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKUserContentExtensionStoreGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKUserContentExtensionStoreLookup() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKUserContentURLPatternCopyHost() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKUserContentURLPatternCopyScheme() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKUserContentURLPatternCreate() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKUserContentURLPatternGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKUserContentURLPatternIsValid() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKUserContentURLPatternMatchesSubdomains() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKUserContentURLPatternMatchesURL() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKUserMediaPermissionCheckGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKUserMediaPermissionCheckSetUserMediaAccessInfo() { NotImplemented_nid_no_patch(__func__); } @@ -6804,34 +15763,10 @@ int APS5_VABI WKUserMediaPermissionRequestDeny() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKUserMediaPermissionRequestGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKUserMediaPermissionRequestVideoDeviceUIDs() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKUserScriptCopySource() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKUserScriptCreateWithSource() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKUserScriptGetInjectionTime() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKUserScriptGetMainFrameOnly() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKUserScriptGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKViewAccessibilityFocusedObject() { NotImplemented_nid_no_patch(__func__); } @@ -6912,10 +15847,6 @@ int APS5_VABI WKViewWillExitFullScreen() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKViewportAttributesGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKWebsiteDataStoreClearAllDeviceOrientationPermissions() { NotImplemented_nid_no_patch(__func__); } @@ -6928,126 +15859,6 @@ int APS5_VABI WKWebsiteDataStoreClearBundleIdentifierInNetworkProcess() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKWebsiteDataStoreConfigurationCopyApplicationCacheDirectory() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsiteDataStoreConfigurationCopyCacheStorageDirectory() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsiteDataStoreConfigurationCopyCookieStorageFile() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsiteDataStoreConfigurationCopyIndexedDBDatabaseDirectory() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsiteDataStoreConfigurationCopyLocalStorageDirectory() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsiteDataStoreConfigurationCopyMediaKeysStorageDirectory() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsiteDataStoreConfigurationCopyNetworkCacheDirectory() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsiteDataStoreConfigurationCopyResourceLoadStatisticsDirectory() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsiteDataStoreConfigurationCopyServiceWorkerRegistrationDirectory() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsiteDataStoreConfigurationCopyWebSQLDatabaseDirectory() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsiteDataStoreConfigurationCreate() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsiteDataStoreConfigurationGetNetworkCacheSpeculativeValidationEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsiteDataStoreConfigurationGetPerOriginStorageQuota() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsiteDataStoreConfigurationGetStaleWhileRevalidateEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsiteDataStoreConfigurationGetTestingSessionEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsiteDataStoreConfigurationGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsiteDataStoreConfigurationSetApplicationCacheDirectory() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsiteDataStoreConfigurationSetCacheStorageDirectory() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsiteDataStoreConfigurationSetCookieStorageFile() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsiteDataStoreConfigurationSetIndexedDBDatabaseDirectory() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsiteDataStoreConfigurationSetLocalStorageDirectory() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsiteDataStoreConfigurationSetMediaKeysStorageDirectory() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsiteDataStoreConfigurationSetNetworkCacheDirectory() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsiteDataStoreConfigurationSetNetworkCacheSpeculativeValidationEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsiteDataStoreConfigurationSetPerOriginStorageQuota() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsiteDataStoreConfigurationSetResourceLoadStatisticsDirectory() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsiteDataStoreConfigurationSetServiceWorkerRegistrationDirectory() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsiteDataStoreConfigurationSetStaleWhileRevalidateEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsiteDataStoreConfigurationSetTestingSessionEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsiteDataStoreConfigurationSetWebSQLDatabaseDirectory() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKWebsiteDataStoreCreateNonPersistentDataStore() { NotImplemented_nid_no_patch(__func__); } @@ -7100,10 +15911,6 @@ int APS5_VABI WKWebsiteDataStoreGetResourceLoadStatisticsEnabled() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKWebsiteDataStoreGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI WKWebsiteDataStoreIsStatisticsEphemeral() { NotImplemented_nid_no_patch(__func__); } @@ -7364,178 +16171,6 @@ int APS5_VABI WKWebsiteDataStoreUpdateBundleIdentifierInNetworkProcess() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI WKWebsitePoliciesCopyCustomHeaderFields() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsitePoliciesCreate() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsitePoliciesGetAllowedAutoplayQuirks() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsitePoliciesGetAutoplayPolicy() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsitePoliciesGetContentBlockersEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsitePoliciesGetDataStore() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsitePoliciesGetPopUpPolicy() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsitePoliciesGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsitePoliciesSetAutoplayPolicy() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsitePoliciesSetContentBlockersEnabled() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsitePoliciesSetCustomHeaderFields() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsitePoliciesSetDataStore() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWebsitePoliciesSetPopUpPolicy() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WKWindowFeaturesGetTypeID() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WTFCrashWithSecurityImplication() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WTFCrash() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WTFGetBacktrace() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WTFInitializeLogChannelStatesFromString() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WTFIsDebuggerAttached() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WTFLogAlwaysAndCrash() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WTFLogAlways() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WTFLogChannelByName() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WTFLogVerbose() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WTFLogWithLevel() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WTFLog() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WTFPrintBacktrace() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WTFReportArgumentAssertionFailure() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WTFReportAssertionFailureWithMessage() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WTFReportAssertionFailure() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WTFReportBacktrace() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WTFReportError() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WTFReportFatalError() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WTFReportNotImplementedYet() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI WTFWillLogWithLevel() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _Z20WTFCrashWithInfoImpliPKcS0_im() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _Z20WTFCrashWithInfoImpliPKcS0_imm() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _Z20WTFCrashWithInfoImpliPKcS0_immmm() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _Z20WTFCrashWithInfoImpliPKcS0_immmmm() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _Z20WTFCrashWithInfoImpliPKcS0_immmmmm() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _Z20WTFCrashWithInfoImpliPKcS0_immmmmmm() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _Z20WTFCrashWithInfoImpliPKcS0_immm() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN13OpaqueJSClassD1Ev() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN13OpaqueJSClassD2Ev() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN14OpaqueJSString9tryCreateEON3WTF6StringE() { NotImplemented_nid_no_patch(__func__); } @@ -7544,14 +16179,6 @@ int APS5_VABI _ZN14OpaqueJSString9tryCreateERKN3WTF6StringE() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN14OpaqueJSStringD1Ev() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN14OpaqueJSStringD2Ev() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3JSC10ConfigFile14setProcessNameEPKc() { NotImplemented_nid_no_patch(__func__); } @@ -8428,10 +17055,6 @@ int APS5_VABI _ZN3JSC16SymbolTableEntry16freeFatEntrySlowEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3JSC16clearArrayMemsetEPdj() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3JSC16createRangeErrorEPNS_14JSGlobalObjectERKN3WTF6StringE() { NotImplemented_nid_no_patch(__func__); } @@ -8712,14 +17335,6 @@ int APS5_VABI _ZN3JSC18PropertyDescriptor9setSetterENS_7JSValueE() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3JSC18enableSuperSamplerEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3JSC18logTotalPhaseTimesEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3JSC19HeapSnapshotBuilder11analyzeNodeEPNS_6JSCellE() { NotImplemented_nid_no_patch(__func__); } @@ -8844,10 +17459,6 @@ int APS5_VABI _ZN3JSC19SourceProviderCacheD2Ev() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3JSC19disableSuperSamplerEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3JSC19iteratorForIterableEPNS_14JSGlobalObjectENS_7JSValueE() { NotImplemented_nid_no_patch(__func__); } @@ -8892,10 +17503,6 @@ int APS5_VABI _ZN3JSC20failNextNewCodeBlockEPNS_14JSGlobalObjectE() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3JSC20waitForVMDestructionEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3JSC21MarkedJSValueRefArrayC2EP15OpaqueJSContextj() { NotImplemented_nid_no_patch(__func__); } @@ -9052,10 +17659,6 @@ int APS5_VABI _ZN3JSC22optimizeNextInvocationEPNS_14JSGlobalObjectEPNS_9CallFram NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3JSC22printSuperSamplerStateEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3JSC23AbstractSamplingCounter4dumpEv() { NotImplemented_nid_no_patch(__func__); } @@ -9152,10 +17755,6 @@ int APS5_VABI _ZN3JSC25jsStringWithCacheSlowCaseERNS_2VMERN3WTF10StringImplE() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3JSC25numberOfOSRExitFuzzChecksEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3JSC26createIteratorResultObjectEPNS_14JSGlobalObjectENS_7JSValueEb() { NotImplemented_nid_no_patch(__func__); } @@ -9168,14 +17767,6 @@ int APS5_VABI _ZN3JSC26setCannotUseOSRExitFuzzingEPNS_14JSGlobalObjectEPNS_9Call NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3JSC27finalizeStatsAtEndOfTestingEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3JSC27numberOfExceptionFuzzChecksEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3JSC28getHashMapBucketKeyClassInfoEv() { NotImplemented_nid_no_patch(__func__); } @@ -9276,14 +17867,6 @@ int APS5_VABI _ZN3JSC2VMD2Ev() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3JSC30waitForAsynchronousDisassemblyEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3JSC31numberOfStaticOSRExitFuzzChecksEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3JSC32JSDestructibleObjectHeapCellTypeC1Ev() { NotImplemented_nid_no_patch(__func__); } @@ -9316,10 +17899,6 @@ int APS5_VABI _ZN3JSC35getSomeBaselineCodeBlockForFunctionENS_7JSValueE() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3JSC38numberOfExecutableAllocationFuzzChecksEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3JSC3DFG18getNumCompilationsEv() { NotImplemented_nid_no_patch(__func__); } @@ -10028,10 +18607,6 @@ int APS5_VABI _ZN3JSC9constructEPNS_14JSGlobalObjectENS_7JSValueERKNS_8CallDataE NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3PAL10systemBeepEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3PAL12CryptoDigest11computeHashEv() { NotImplemented_nid_no_patch(__func__); } @@ -10148,10 +18723,6 @@ int APS5_VABI _ZN3WTF10ParkingLot9unparkOneEPKv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF10StringImpl11reverseFindEDsj() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF10StringImpl17utf8ForCharactersEPKDsjNS_14ConversionModeE() { NotImplemented_nid_no_patch(__func__); } @@ -10160,30 +18731,6 @@ int APS5_VABI _ZN3WTF10StringImpl17utf8ForCharactersEPKhj() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF10StringImpl19characterStartingAtEj() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF10StringImpl19createUninitializedEjRPDs() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF10StringImpl19createUninitializedEjRPh() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF10StringImpl20create8BitIfPossibleEPKDsj() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF10StringImpl23convertToASCIILowercaseEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF10StringImpl23convertToASCIIUppercaseEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF10StringImpl28convertToLowercaseWithLocaleERKNS_10AtomStringE() { NotImplemented_nid_no_patch(__func__); } @@ -10212,14 +18759,6 @@ int APS5_VABI _ZN3WTF10StringImpl5adoptEONS_12StringBufferIhEE() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF10StringImpl6createEPKDsj() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF10StringImpl6createEPKhj() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF10StringImpl7destroyEPS0_() { NotImplemented_nid_no_patch(__func__); } @@ -10232,10 +18771,6 @@ int APS5_VABI _ZN3WTF10StringImpl7replaceEDsPKhj() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF10StringImpl9substringEjj() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF10StringView11SplitResult8Iterator17findNextSubstringEv() { NotImplemented_nid_no_patch(__func__); } @@ -10372,30 +18907,10 @@ int APS5_VABI _ZN3WTF10WorkerPoolD2Ev() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF10fastCallocEmm() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF10fastMallocEm() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF10fastStrDupEPKc() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF10hasElapsedERKNS_24TimeWithDynamicClockTypeE() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF10initializeEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF11CStringHash5equalERKNS_7CStringES3_() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF11LogArgumentIPKvE8toStringES2_() { NotImplemented_nid_no_patch(__func__); } @@ -10536,14 +19051,6 @@ int APS5_VABI _ZN3WTF11TimingScope11scopeDidEndEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF11fastReallocEPvm() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF11jsValueFreeEPv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF11portAllowedERKNS_3URLE() { NotImplemented_nid_no_patch(__func__); } @@ -10612,10 +19119,6 @@ int APS5_VABI _ZN3WTF13MetaAllocatorD2Ev() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF13MonotonicTime3nowEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF13ReadWriteLock10readUnlockEv() { NotImplemented_nid_no_patch(__func__); } @@ -10656,10 +19159,6 @@ int APS5_VABI _ZN3WTF13aboutBlankURLEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF13allPrivilegesEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF13dumpCharacterERNS_11PrintStreamEc() { NotImplemented_nid_no_patch(__func__); } @@ -10668,10 +19167,6 @@ int APS5_VABI _ZN3WTF13isMainRunLoopEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF13jsValueMallocEm() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF13normalizedNFCENS_10StringViewE() { NotImplemented_nid_no_patch(__func__); } @@ -10764,14 +19259,6 @@ int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEy() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF13tryFastCallocEmm() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF13tryFastMallocEm() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF14AtomStringImpl10addLiteralEPKcj() { NotImplemented_nid_no_patch(__func__); } @@ -10972,26 +19459,14 @@ int APS5_VABI _ZN3WTF14dupCloseOnExecEi() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF14fastMallocSizeEPKv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF14isVersion4UUIDENS_10StringViewE() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF14jsValueReallocEPvm() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF14setCloseOnExecEi() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF14tryFastReallocEPvm() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF15AtomStringTableD1Ev() { NotImplemented_nid_no_patch(__func__); } @@ -11084,10 +19559,6 @@ int APS5_VABI _ZN3WTF15ThreadConditionD2Ev() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF15fastAlignedFreeEPv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF15isWordTextBreakEP14UBreakIterator() { NotImplemented_nid_no_patch(__func__); } @@ -11112,18 +19583,6 @@ int APS5_VABI _ZN3WTF16codePointCompareERKNS_6StringES2_() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF16fastZeroedMallocEm() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF16tryJSValueMallocEm() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF17GregorianDateTime21setToCurrentLocalTimeEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF17GregorianDateTimeC1EdNS_15LocalTimeOffsetE() { NotImplemented_nid_no_patch(__func__); } @@ -11184,46 +19643,10 @@ int APS5_VABI _ZN3WTF17callOnMainRunLoopEONS_8FunctionIFvvEEE() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF17charactersToFloatEPKDsmPb() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF17charactersToFloatEPKDsmRm() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF17charactersToFloatEPKhmPb() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF17charactersToFloatEPKhmRm() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF17double_conversion23DoubleToStringConverter19EcmaScriptConverterEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF17double_conversion23StringToDoubleConverter13StringToFloatEPKcmPm() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF17double_conversion23StringToDoubleConverter13StringToFloatEPKtmPm() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF17double_conversion23StringToDoubleConverter14StringToDoubleEPKcmPm() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF17double_conversion23StringToDoubleConverter14StringToDoubleEPKtmPm() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF17fastAlignedMallocEmm() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF17languageDidChangeEv() { NotImplemented_nid_no_patch(__func__); } @@ -11280,26 +19703,6 @@ int APS5_VABI _ZN3WTF18ParallelHelperPoolD2Ev() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF18charactersToDoubleEPKDsmPb() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF18charactersToDoubleEPKhmPb() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF18constantTimeMemcmpEPKvS1_m() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF18fastEnableMiniModeEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF18fastMallocGoodSizeEm() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF19MetaAllocatorHandle6shrinkEm() { NotImplemented_nid_no_patch(__func__); } @@ -11324,18 +19727,10 @@ int APS5_VABI _ZN3WTF19ParallelEnvironmentC2EPFvPvEmi() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF19hasProcessPrivilegeENS_16ProcessPrivilegeE() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF19isCompilationThreadEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF19isFastMallocEnabledEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF19mimeTypeFromDataURLENS_10StringViewE() { NotImplemented_nid_no_patch(__func__); } @@ -11344,10 +19739,6 @@ int APS5_VABI _ZN3WTF19numGraphemeClustersENS_10StringViewE() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF19tryFastZeroedMallocEm() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF20ConcurrentPtrHashSet15deleteOldTablesEv() { NotImplemented_nid_no_patch(__func__); } @@ -11392,42 +19783,14 @@ int APS5_VABI _ZN3WTF20ParallelHelperClientD2Ev() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF20equalIgnoringNullityEPKDsmPNS_10StringImplE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF20equalIgnoringNullityEPNS_10StringImplES1_() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF20fastDisableScavengerEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF20fastMallocStatisticsEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF20initializeMainThreadEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF20protocolIsJavaScriptENS_10StringViewE() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF20resetAccumulatedLogsEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF20setProcessPrivilegesENS_9OptionSetINS_16ProcessPrivilegeEEE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF20tryFastAlignedMallocEmm() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF21MemoryPressureHandler12setPageCountEj() { NotImplemented_nid_no_patch(__func__); } @@ -11556,38 +19919,14 @@ int APS5_VABI _ZN3WTF22TextBreakIteratorCache9singletonEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF22equalIgnoringASCIICaseEPKNS_10StringImplES2_() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF22equalRespectingNullityENS_10StringViewES0_() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF22isMainThreadOrGCThreadEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF22numberOfProcessorCoresEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF22protocolIsInHTTPFamilyENS_10StringViewE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF22removeProcessPrivilegeENS_16ProcessPrivilegeE() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF23callOnMainThreadAndWaitEONS_8FunctionIFvvEEE() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF23fastCommitAlignedMemoryEPvm() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF24AutomaticThreadCondition4waitERNS_4LockE() { NotImplemented_nid_no_patch(__func__); } @@ -11620,14 +19959,6 @@ int APS5_VABI _ZN3WTF24AutomaticThreadConditionD2Ev() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF24TimeWithDynamicClockType3nowENS_9ClockTypeE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF24calculateLocalTimeOffsetEdNS_8TimeTypeE() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF24callOnMainRunLoopAndWaitEONS_8FunctionIFvvEEE() { NotImplemented_nid_no_patch(__func__); } @@ -11652,14 +19983,6 @@ int APS5_VABI _ZN3WTF25addLanguageChangeObserverEPvPFvS0_E() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF25fastDecommitAlignedMemoryEPvm() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF25fastMallocDumpMallocStatsEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF26getAndResetAccumulatedLogsEv() { NotImplemented_nid_no_patch(__func__); } @@ -11672,10 +19995,6 @@ int APS5_VABI _ZN3WTF27protocolHostAndPortAreEqualERKNS_3URLES2_() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF27releaseFastMallocFreeMemoryEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF28displayNameForLanguageLocaleERKNS_6StringE() { NotImplemented_nid_no_patch(__func__); } @@ -11692,14 +20011,6 @@ int APS5_VABI _ZN3WTF28removeLanguageChangeObserverEPv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF29cryptographicallyRandomValuesEPvm() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF29equalIgnoringASCIICaseNonNullEPKNS_10StringImplES2_() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF30numCodeUnitsInGraphemeClustersENS_10StringViewEj() { NotImplemented_nid_no_patch(__func__); } @@ -11732,10 +20043,6 @@ int APS5_VABI _ZN3WTF31equalIgnoringFragmentIdentifierERKNS_3URLES2_() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF31sixCharacterHashStringToIntegerEPKc() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF33indexOfBestMatchingLanguageInListERKNS_6StringERKNS_6VectorIS0_Lm0ENS_15CrashOnOverflowELm16ENS_10FastMallocEEERb() { NotImplemented_nid_no_patch(__func__); } @@ -11748,10 +20055,6 @@ int APS5_VABI _ZN3WTF37parseDateFromNullTerminatedCharactersEPKc() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF37parseDateFromNullTerminatedCharactersEPKcRb() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF3ICU12majorVersionEv() { NotImplemented_nid_no_patch(__func__); } @@ -11760,10 +20063,6 @@ int APS5_VABI _ZN3WTF3ICU12minorVersionEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF3URL10invalidateEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF3URL11setProtocolENS_10StringViewE() { NotImplemented_nid_no_patch(__func__); } @@ -11824,18 +20123,10 @@ int APS5_VABI _ZN3WTF40clearDefaultPortForProtocolMapForTestingEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF40parseES5DateFromNullTerminatedCharactersEPKcRb() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF40registerDefaultPortForProtocolForTestingEtRKNS_6StringE() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF40releaseFastMallocFreeMemoryForThisThreadEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF4Lock10unlockSlowEv() { NotImplemented_nid_no_patch(__func__); } @@ -11888,46 +20179,14 @@ int APS5_VABI _ZN3WTF5MutexD2Ev() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF5equalEPKNS_10StringImplEPKDsj() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF5equalEPKNS_10StringImplEPKh() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF5equalEPKNS_10StringImplEPKhj() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF5equalERKNS_10StringImplES2_() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF5sleepENS_7SecondsE() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF5sleepERKNS_24TimeWithDynamicClockTypeE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF6Config17permanentlyFreezeEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF6String13fromCodePointEi() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF6String24numberToStringFixedWidthEdj() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF6String26fromUTF8WithLatin1FallbackEPKhm() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF6String28numberToStringFixedPrecisionEdjNS_29TrailingZerosTruncatingPolicyE() { NotImplemented_nid_no_patch(__func__); } @@ -11944,74 +20203,6 @@ int APS5_VABI _ZN3WTF6String6numberEf() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF6String6numberEi() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF6String6numberEj() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF6String6numberEl() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF6String6numberEm() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF6String6numberEx() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF6String6numberEy() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF6String8fromUTF8EPKh() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF6String8fromUTF8EPKhm() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF6String8fromUTF8ERKNS_7CStringE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF6StringC1EPKDsj() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF6StringC1EPKcj() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF6StringC1EPKc() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF6StringC1EPKhj() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF6StringC2EPKDsj() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF6StringC2EPKc() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF6StringC2EPKcj() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF6StringC2EPKhj() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF6Thread13mayBeGCThreadEv() { NotImplemented_nid_no_patch(__func__); } @@ -12064,38 +20255,6 @@ int APS5_VABI _ZN3WTF6ThreadD2Ev() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF7CPUTime16forCurrentThreadEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF7CString11mutableDataEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF7CString16newUninitializedEmRPc() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF7CString4growEm() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF7CStringC1EPKcm() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF7CStringC1EPKc() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF7CStringC2EPKc() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF7CStringC2EPKcm() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF7RunLoop13dispatchAfterENS_7SecondsEONS_8FunctionIFvvEEE() { NotImplemented_nid_no_patch(__func__); } @@ -12152,14 +20311,6 @@ int APS5_VABI _ZN3WTF7RunLoop9TimerBaseD2Ev() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF7Unicode51calculateStringHashAndLengthFromUTF8MaskingTop8BitsEPKcS2_RjS3_() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF7ramSizeEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF8CollatorC1EPKcb() { NotImplemented_nid_no_patch(__func__); } @@ -12176,10 +20327,6 @@ int APS5_VABI _ZN3WTF8CollatorD2Ev() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF8Internal25parseDoubleFromLongStringEPKDsmRm() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF8JSONImpl10ObjectBase6removeERKNS_6StringE() { NotImplemented_nid_no_patch(__func__); } @@ -12312,10 +20459,6 @@ int APS5_VABI _ZN3WTF8JSONImpl9ArrayBaseD1Ev() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF8WallTime3nowEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF8WordLock10unlockSlowEv() { NotImplemented_nid_no_patch(__func__); } @@ -12328,18 +20471,6 @@ int APS5_VABI _ZN3WTF8dataFileEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF8dataLogFEPKcz() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF8fastFreeEPv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTF8pageSizeEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTF9BitVector11excludeSlowERKS0_() { NotImplemented_nid_no_patch(__func__); } @@ -12488,18 +20619,6 @@ int APS5_VABI _ZN3WTF9URLParser9serializeERKNS_6VectorINS_12KeyValuePairINS_6Str NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTF9dataLogFVEPKcP13__va_list_tag() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTFeqERKNS_7CStringEPKc() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN3WTFeqERKNS_7CStringES2_() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN3WTFlsERNS_10TextStreamENS_7SecondsE() { NotImplemented_nid_no_patch(__func__); } @@ -12508,10 +20627,6 @@ int APS5_VABI _ZN3WTFlsERNS_10TextStreamERKNS_3URLE() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3WTFltERKNS_7CStringES2_() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN6WebKit14WebProcessMainEiPPc() { NotImplemented_nid_no_patch(__func__); } @@ -12612,22 +20727,6 @@ int APS5_VABI _ZN7WebCore10FileHandleaSEOS0_() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN7WebCore10FloatPoint15narrowPrecisionEdd() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore10FloatPoint9normalizeEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore10FloatPointC1ERKNS_8IntPointE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore10FloatPointC2ERKNS_8IntPointE() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN7WebCore10ISOFullBoxC1ERKS0_() { NotImplemented_nid_no_patch(__func__); } @@ -12744,22 +20843,6 @@ int APS5_VABI _ZN7WebCore10JSNodeList9toWrappedERN3JSC2VMENS1_7JSValueE() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN7WebCore10LayoutRect5scaleEf() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore10LayoutRect5uniteERKS0_() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore10LayoutRectC1ERKNS_9FloatRectE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore10LayoutRectC2ERKNS_9FloatRectE() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN7WebCore10OriginLockD1Ev() { NotImplemented_nid_no_patch(__func__); } @@ -13944,14 +22027,6 @@ int APS5_VABI _ZN7WebCore11RenderTheme9singletonEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN7WebCore11RoundedRectC1ERKNS_10LayoutRectERKNS_10LayoutSizeES6_S6_S6_() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore11RoundedRectC2ERKNS_10LayoutRectERKNS_10LayoutSizeES6_S6_S6_() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN7WebCore11SimpleRangeC1EONS_13BoundaryPointES2_() { NotImplemented_nid_no_patch(__func__); } @@ -15680,10 +23755,6 @@ int APS5_VABI _ZN7WebCore14foldQuoteMarksERKN3WTF6StringE() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN7WebCore14roundedIntRectERKNS_9FloatRectE() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN7WebCore14stopResolveDNSEm() { NotImplemented_nid_no_patch(__func__); } @@ -15744,54 +23815,6 @@ int APS5_VABI _ZN7WebCore15ActiveDOMObjectD2Ev() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN7WebCore15AffineTransform12makeIdentityEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore15AffineTransform15scaleNonUniformEdd() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore15AffineTransform4skewEdd() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore15AffineTransform5flipXEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore15AffineTransform5flipYEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore15AffineTransform5scaleERKNS_9FloatSizeE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore15AffineTransform5scaleEd() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore15AffineTransform5shearEdd() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore15AffineTransform6rotateEd() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore15AffineTransform8multiplyERKS0_() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore15AffineTransform9translateERKNS_10FloatPointE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore15AffineTransform9translateEdd() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN7WebCore15AsyncFileStream11openForReadERKN3WTF6StringExx() { NotImplemented_nid_no_patch(__func__); } @@ -16624,14 +24647,6 @@ int APS5_VABI _ZN7WebCore16FileReaderLoaderC2ENS0_8ReadTypeEPNS_22FileReaderLoad NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN7WebCore16FloatRoundedRectC1ERKNS_9FloatRectERKNS0_5RadiiE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore16FloatRoundedRectC2ERKNS_9FloatRectERKNS0_5RadiiE() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN7WebCore16FontCascadeFonts23realizeFallbackRangesAtERKNS_22FontCascadeDescriptionEj() { NotImplemented_nid_no_patch(__func__); } @@ -19616,62 +27631,6 @@ int APS5_VABI _ZN7WebCore20ScrollingCoordinator45setForceSynchronousScrollLayerP NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN7WebCore20TransformationMatrix10makeAffineEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore20TransformationMatrix10rectToRectERKNS_9FloatRectES3_() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore20TransformationMatrix11translate3dEddd() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore20TransformationMatrix15scaleNonUniformEdd() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore20TransformationMatrix4skewEdd() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore20TransformationMatrix5flipXEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore20TransformationMatrix5flipYEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore20TransformationMatrix5scaleEd() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore20TransformationMatrix6rotateEd() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore20TransformationMatrix8multiplyERKS0_() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore20TransformationMatrix8rotate3dEddd() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore20TransformationMatrix9translateEdd() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore20TransformationMatrixC1ERKNS_15AffineTransformE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore20TransformationMatrixC2ERKNS_15AffineTransformE() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN7WebCore20UserGestureIndicator18currentUserGestureEv() { NotImplemented_nid_no_patch(__func__); } @@ -20560,10 +28519,6 @@ int APS5_VABI _ZN7WebCore21identifierToUSVStringERN3JSC14JSGlobalObjectERKNS0_10 NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN7WebCore21isBackForwardLoadTypeENS_13FrameLoadTypeE() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN7WebCore21mainThreadNormalWorldEv() { NotImplemented_nid_no_patch(__func__); } @@ -21908,10 +29863,6 @@ int APS5_VABI _ZN7WebCore27screenSupportsExtendedColorEPNS_6WidgetE() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN7WebCore27setPresentingApplicationPIDEi() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN7WebCore27withinTextUnitOfGranularityERKNS_15VisiblePositionENS_15TextGranularityENS_18SelectionDirectionE() { NotImplemented_nid_no_patch(__func__); } @@ -22236,10 +30187,6 @@ int APS5_VABI _ZN7WebCore30forwardForEachCallToBackingSetERNS_17JSDOMGlobalObjec NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN7WebCore30isStatusCodeCacheableByDefaultEi() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN7WebCore30makeRangeSelectingNodeContentsERNS_4NodeE() { NotImplemented_nid_no_patch(__func__); } @@ -22320,10 +30267,6 @@ int APS5_VABI _ZN7WebCore32isSimpleCrossOriginAccessRequestERKN3WTF6StringERKNS_ NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN7WebCore32isStatusCodePotentiallyCacheableEi() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN7WebCore32serializationForRenderTreeAsTextERKNS_5ColorE() { NotImplemented_nid_no_patch(__func__); } @@ -22404,10 +30347,6 @@ int APS5_VABI _ZN7WebCore36ISOProtectionSystemSpecificHeaderBoxD2Ev() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN7WebCore36largestRectWithAspectRatioInsideRectEfRKNS_9FloatRectE() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN7WebCore36parseCrossOriginResourcePolicyHeaderEN3WTF10StringViewE() { NotImplemented_nid_no_patch(__func__); } @@ -22480,10 +30419,6 @@ int APS5_VABI _ZN7WebCore37computeFreshnessLifetimeForHTTPFamilyERKNS_16Resource NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN7WebCore37smallestRectWithAspectRatioAroundRectEfRKNS_9FloatRectE() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN7WebCore38updateResponseHeadersAfterRevalidationERNS_16ResourceResponseERKS0_() { NotImplemented_nid_no_patch(__func__); } @@ -22496,10 +30431,6 @@ int APS5_VABI _ZN7WebCore40restrictMinimumScaleFactorToViewportSizeERNS_18Viewpo NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN7WebCore43initializeMaximumHTTPConnectionCountPerHostEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN7WebCore44computeMinimumScaleFactorForContentContainedERKNS_18ViewportAttributesERKNS_7IntSizeES5_() { NotImplemented_nid_no_patch(__func__); } @@ -23152,30 +31083,6 @@ int APS5_VABI _ZN7WebCore5Cairo11ShadowStateC2ERKNS_20GraphicsContextStateE() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN7WebCore5ColorC1EOS0_() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore5ColorC1ERKS0_() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore5ColorC2EOS0_() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore5ColorC2ERKS0_() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore5ColoraSEOS0_() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore5ColoraSERKS0_() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN7WebCore5Event9initEventERKN3WTF10AtomStringEbb() { NotImplemented_nid_no_patch(__func__); } @@ -24016,42 +31923,6 @@ int APS5_VABI _ZN7WebCore7Element9setPseudoERKN3WTF10AtomStringE() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN7WebCore7IntRect5scaleEf() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore7IntRect5uniteERKS0_() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore7IntRect9intersectERKS0_() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore7IntRectC1ERKNS_10LayoutRectE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore7IntRectC1ERKNS_9FloatRectE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore7IntRectC2ERKNS_10LayoutRectE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore7IntRectC2ERKNS_9FloatRectE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore7IntSizeC1ERKNS_9FloatSizeE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore7IntSizeC2ERKNS_9FloatSizeE() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN7WebCore7JSEvent9toWrappedERN3JSC2VMENS1_7JSValueE() { NotImplemented_nid_no_patch(__func__); } @@ -24440,14 +32311,6 @@ int APS5_VABI _ZN7WebCore8FormDataD2Ev() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN7WebCore8IntPointC1ERKNS_10FloatPointE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore8IntPointC2ERKNS_10FloatPointE() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN7WebCore8JSDOMURL14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE() { NotImplemented_nid_no_patch(__func__); } @@ -24692,10 +32555,6 @@ int APS5_VABI _ZN7WebCore8XMLNames4initEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN7WebCore8isReloadENS_13FrameLoadTypeE() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN7WebCore9AnimationC1Ev() { NotImplemented_nid_no_patch(__func__); } @@ -24796,26 +32655,6 @@ int APS5_VABI _ZN7WebCore9DragImageaSEOS0_() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN7WebCore9FloatRect5scaleEff() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore9FloatRect5uniteERKS0_() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore9FloatRect6extendERKNS_10FloatPointE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore9FloatRect9intersectERKS0_() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7WebCore9FloatRectC1ERKNS_7IntRectE() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN7WebCore9FontCache17inactiveFontCountEv() { NotImplemented_nid_no_patch(__func__); } @@ -25332,10 +33171,6 @@ int APS5_VABI _ZN7bmalloc12IsoTLSLayout3addEPNS_11IsoTLSEntryE() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN7bmalloc12cryptoRandomEPvm() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN7bmalloc13IsoSharedPage9tryCreateEv() { NotImplemented_nid_no_patch(__func__); } @@ -25408,58 +33243,10 @@ int APS5_VABI _ZN7bmalloc15IsoHeapImplBasenwEm() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN7bmalloc15availableMemoryEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7bmalloc16isActiveHeapKindENS_8HeapKindE() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN7bmalloc17getPerProcessDataEjPKcmm() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN7bmalloc19mapToActiveHeapKindENS_8HeapKindE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7bmalloc3api13freeOutOfLineEPvNS_8HeapKindE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7bmalloc3api14enableMiniModeEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7bmalloc3api15mallocOutOfLineEmNS_8HeapKindE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7bmalloc3api16disableScavengerEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7bmalloc3api21commitAlignedPhysicalEPvmNS_8HeapKindE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7bmalloc3api23decommitAlignedPhysicalEPvmNS_8HeapKindE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7bmalloc3api29tryLargeZeroedMemalignVirtualEmmNS_8HeapKindE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7bmalloc3api8scavengeEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN7bmalloc3api9isEnabledENS_8HeapKindE() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN7bmalloc5Cache25allocateSlowCaseNullCacheENS_8HeapKindEm() { NotImplemented_nid_no_patch(__func__); } @@ -25532,46 +33319,6 @@ int APS5_VABI _ZN7bmalloc9Scavenger8scheduleEm() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN8Gigacage10tryReallocENS_4KindEPvm() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN8Gigacage11alignedFreeENS_4KindEPv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN8Gigacage11mallocArrayENS_4KindEmm() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN8Gigacage14tryMallocArrayENS_4KindEmm() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN8Gigacage16freeVirtualPagesENS_4KindEPvm() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN8Gigacage16tryAlignedMallocENS_4KindEmm() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN8Gigacage29tryAllocateZeroedVirtualPagesENS_4KindEm() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN8Gigacage4freeENS_4KindEPv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN8Gigacage6mallocENS_4KindEm() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZN8Gigacage9tryMallocENS_4KindEm() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZN9Inspector13AgentRegistry13discardValuesEv() { NotImplemented_nid_no_patch(__func__); } @@ -29184,42 +36931,6 @@ int APS5_VABI _ZNK3WTF10AtomString23convertToASCIIUppercaseEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZNK3WTF10StringImpl10startsWithEDs() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK3WTF10StringImpl10startsWithEPKcj() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK3WTF10StringImpl11sizeInBytesEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK3WTF10StringImpl12hashSlowCaseEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK3WTF10StringImpl14concurrentHashEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK3WTF10StringImpl4utf8ENS_14ConversionModeE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK3WTF10StringImpl8endsWithEDs() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK3WTF10StringImpl8endsWithEPKcj() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK3WTF10StringView10startsWithEDs() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZNK3WTF10StringView16GraphemeClusters8IteratordeEv() { NotImplemented_nid_no_patch(__func__); } @@ -29228,34 +36939,6 @@ int APS5_VABI _ZNK3WTF10StringView16GraphemeClusters8IteratoreqERKS2_() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZNK3WTF10StringView23convertToASCIILowercaseEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK3WTF10StringView23convertToASCIIUppercaseEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK3WTF10StringView26getCharactersWithASCIICaseENS0_15CaseConvertTypeEPDs() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK3WTF10StringView26getCharactersWithASCIICaseENS0_15CaseConvertTypeEPh() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK3WTF10StringView4findES0_j() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK3WTF10StringView4utf8ENS_14ConversionModeE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK3WTF10StringView8endsWithEDs() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZNK3WTF11Persistence7Decoder28bufferIsLargeEnoughToContainEm() { NotImplemented_nid_no_patch(__func__); } @@ -29264,10 +36947,6 @@ int APS5_VABI _ZNK3WTF12ASCIILiteral4dumpERNS_11PrintStreamE() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZNK3WTF13MonotonicTime19approximateWallTimeEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZNK3WTF13MonotonicTime4dumpERNS_11PrintStreamE() { NotImplemented_nid_no_patch(__func__); } @@ -29296,78 +36975,18 @@ int APS5_VABI _ZNK3WTF19MetaAllocatorHandle4dumpERNS_11PrintStreamE() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZNK3WTF24TimeWithDynamicClockType13monotonicTimeEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK3WTF24TimeWithDynamicClockType16nowWithSameClockEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK3WTF24TimeWithDynamicClockType19approximateWallTimeEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK3WTF24TimeWithDynamicClockType24approximateMonotonicTimeEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZNK3WTF24TimeWithDynamicClockType4dumpERNS_11PrintStreamE() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZNK3WTF24TimeWithDynamicClockType8wallTimeEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK3WTF24TimeWithDynamicClockTypegeERKS0_() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK3WTF24TimeWithDynamicClockTypegtERKS0_() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK3WTF24TimeWithDynamicClockTypeleERKS0_() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK3WTF24TimeWithDynamicClockTypemiERKS0_() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK3WTF3URL10protocolIsENS_10StringViewE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK3WTF3URL11encodedUserEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZNK3WTF3URL11hostAndPortEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZNK3WTF3URL12isAboutBlankEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK3WTF3URL13isAboutSrcDocEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZNK3WTF3URL14fileSystemPathEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZNK3WTF3URL14isHierarchicalEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK3WTF3URL15encodedPasswordEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZNK3WTF3URL16isMatchingDomainENS_10StringViewE() { NotImplemented_nid_no_patch(__func__); } @@ -29376,18 +36995,10 @@ int APS5_VABI _ZNK3WTF3URL17lastPathComponentEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZNK3WTF3URL18fragmentIdentifierEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZNK3WTF3URL19protocolHostAndPortEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZNK3WTF3URL20protocolIsJavaScriptEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZNK3WTF3URL21truncatedForUseAsBaseEv() { NotImplemented_nid_no_patch(__func__); } @@ -29396,30 +37007,14 @@ int APS5_VABI _ZNK3WTF3URL24strippedForUseAsReferrerEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZNK3WTF3URL28queryWithLeadingQuestionMarkEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZNK3WTF3URL30stringCenterEllipsizedToLengthEj() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZNK3WTF3URL39fragmentIdentifierWithLeadingNumberSignEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZNK3WTF3URL4dumpERNS_11PrintStreamE() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZNK3WTF3URL4hostEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK3WTF3URL4pathEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZNK3WTF3URL4userEv() { NotImplemented_nid_no_patch(__func__); } @@ -29428,10 +37023,6 @@ int APS5_VABI _ZNK3WTF3URL8passwordEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZNK3WTF3URL8protocolEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZNK3WTF6Logger17LogSiteIdentifier8toStringEv() { NotImplemented_nid_no_patch(__func__); } @@ -29440,30 +37031,10 @@ int APS5_VABI _ZNK3WTF6String18simplifyWhiteSpaceEPFbDsE() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZNK3WTF6String19characterStartingAtEj() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK3WTF6String20substringSharingImplEjj() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK3WTF6String23convertToASCIILowercaseEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK3WTF6String23convertToASCIIUppercaseEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZNK3WTF6String25splitAllowingEmptyEntriesEDs() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZNK3WTF6String27isSafeToSendToAnotherThreadEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZNK3WTF6String28convertToLowercaseWithLocaleERKNS_10AtomStringE() { NotImplemented_nid_no_patch(__func__); } @@ -29484,26 +37055,14 @@ int APS5_VABI _ZNK3WTF6String31convertToUppercaseWithoutLocaleEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZNK3WTF6String4utf8ENS_14ConversionModeE() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZNK3WTF6String57convertToLowercaseWithoutLocaleStartingAtFailingIndex8BitEj() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZNK3WTF6String5asciiEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZNK3WTF6String5splitEDs() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZNK3WTF6String6latin1Ev() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZNK3WTF6String7toFloatEPb() { NotImplemented_nid_no_patch(__func__); } @@ -29520,14 +37079,6 @@ int APS5_VABI _ZNK3WTF6Thread4dumpERNS_11PrintStreamE() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZNK3WTF7CPUTime23percentageCPUUsageSinceERKS0_() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK3WTF7CString4hashEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZNK3WTF7RunLoop9TimerBase16secondsUntilFireEv() { NotImplemented_nid_no_patch(__func__); } @@ -29540,26 +37091,6 @@ int APS5_VABI _ZNK3WTF7Seconds4dumpERNS_11PrintStreamE() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZNK3WTF7SecondsmiENS_13MonotonicTimeE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK3WTF7SecondsmiENS_8WallTimeE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK3WTF7SecondsmiERKNS_24TimeWithDynamicClockTypeE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK3WTF7SecondsplENS_13MonotonicTimeE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK3WTF7SecondsplENS_8WallTimeE() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZNK3WTF8Collator11collateUTF8EPKcS2_() { NotImplemented_nid_no_patch(__func__); } @@ -29620,10 +37151,6 @@ int APS5_VABI _ZNK3WTF8JSONImpl9ArrayBase9writeJSONERNS_13StringBuilderE() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZNK3WTF8WallTime24approximateMonotonicTimeEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZNK3WTF8WallTime4dumpERNS_11PrintStreamE() { NotImplemented_nid_no_patch(__func__); } @@ -29772,14 +37299,6 @@ int APS5_VABI _ZNK7WebCore10FileHandlecvbEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZNK7WebCore10FloatPoint15matrixTransformERKNS_15AffineTransformE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK7WebCore10FloatPoint18constrainedBetweenERKS0_S2_() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZNK7WebCore10FontRanges16fontForCharacterEi() { NotImplemented_nid_no_patch(__func__); } @@ -29796,10 +37315,6 @@ int APS5_VABI _ZNK7WebCore10JSDocument7wrappedEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZNK7WebCore10LayoutRect8containsERKS0_() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZNK7WebCore10MouseEvent11fromElementEv() { NotImplemented_nid_no_patch(__func__); } @@ -30476,10 +37991,6 @@ int APS5_VABI _ZNK7WebCore11RenderVideo8videoBoxEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZNK7WebCore11RoundedRect8containsERKNS_10LayoutRectE() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZNK7WebCore11XPathResult10resultTypeEv() { NotImplemented_nid_no_patch(__func__); } @@ -31128,50 +38639,6 @@ int APS5_VABI _ZNK7WebCore15ActiveDOMObject30assertSuspendIfNeededWasCalledEv() NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZNK7WebCore15AffineTransform10isIdentityEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK7WebCore15AffineTransform22toTransformationMatrixEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK7WebCore15AffineTransform6xScaleEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK7WebCore15AffineTransform6yScaleEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK7WebCore15AffineTransform7mapQuadERKNS_9FloatQuadE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK7WebCore15AffineTransform7mapRectERKNS_7IntRectE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK7WebCore15AffineTransform7mapRectERKNS_9FloatRectE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK7WebCore15AffineTransform7mapSizeERKNS_7IntSizeE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK7WebCore15AffineTransform7mapSizeERKNS_9FloatSizeE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK7WebCore15AffineTransform8mapPointERKNS_10FloatPointE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK7WebCore15AffineTransform8mapPointERKNS_8IntPointE() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZNK7WebCore15AffineTransform9mapRegionERKNS_6RegionE() { NotImplemented_nid_no_patch(__func__); } @@ -32380,30 +39847,6 @@ int APS5_VABI _ZNK7WebCore20ScrollingCoordinator36coordinatesScrollingForOverflo NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZNK7WebCore20TransformationMatrix12isInvertibleEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK7WebCore20TransformationMatrix17toAffineTransformEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK7WebCore20TransformationMatrix7mapQuadERKNS_9FloatQuadE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK7WebCore20TransformationMatrix7mapRectERKNS_7IntRectE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK7WebCore20TransformationMatrix7mapRectERKNS_9FloatRectE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK7WebCore20TransformationMatrix8mapPointERKNS_10FloatPointE() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZNK7WebCore21BackForwardController12forwardCountEv() { NotImplemented_nid_no_patch(__func__); } @@ -33080,22 +40523,6 @@ int APS5_VABI _ZNK7WebCore4Text9wholeTextEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZNK7WebCore5Color14colorWithAlphaEf() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK7WebCore5Color8darkenedEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK7WebCore5Color9lightnessEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK7WebCore5Color9luminanceEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZNK7WebCore5Range10cloneRangeEv() { NotImplemented_nid_no_patch(__func__); } @@ -33440,18 +40867,6 @@ int APS5_VABI _ZNK7WebCore7Element9outerHTMLEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZNK7WebCore7IntRect10intersectsERKS0_() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK7WebCore7IntRect8containsERKS0_() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK7WebCore7IntSize18constrainedBetweenERKS0_S2_() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZNK7WebCore8DOMTimer24intervalClampedToMinimumEv() { NotImplemented_nid_no_patch(__func__); } @@ -33624,10 +41039,6 @@ int APS5_VABI _ZNK7WebCore8FormData9asBlobURLEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZNK7WebCore8IntPoint18constrainedBetweenERKS0_S2_() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZNK7WebCore8Location4hostEv() { NotImplemented_nid_no_patch(__func__); } @@ -33716,42 +41127,6 @@ int APS5_VABI _ZNK7WebCore9CookieJar7cookiesERNS_8DocumentERKN3WTF3URLE() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZNK7WebCore9FloatQuad11boundingBoxEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK7WebCore9FloatQuad12containsQuadERKS0_() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK7WebCore9FloatQuad13containsPointERKNS_10FloatPointE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK7WebCore9FloatQuad13isRectilinearEv() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK7WebCore9FloatRect10intersectsERKS0_() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK7WebCore9FloatRect21inclusivelyIntersectsERKS0_() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK7WebCore9FloatRect8containsERKNS_10FloatPointENS0_12ContainsModeE() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK7WebCore9FloatSize18constrainedBetweenERKS0_S2_() { - NotImplemented_nid_no_patch(__func__); -} - -int APS5_VABI _ZNK7WebCore9FloatSize6isZeroEv() { - NotImplemented_nid_no_patch(__func__); -} - int APS5_VABI _ZNK7WebCore9FrameTree10childCountEv() { NotImplemented_nid_no_patch(__func__); } diff --git a/core/libs/prx/libSceNKWebKit/include/Api.hpp b/core/libs/prx/libSceNKWebKit/include/Api.hpp index 0c5184f943..017fe05615 100644 --- a/core/libs/prx/libSceNKWebKit/include/Api.hpp +++ b/core/libs/prx/libSceNKWebKit/include/Api.hpp @@ -4,6 +4,7 @@ extern "C" { +int APS5_VABI WKErrorCopyLocalizedDescription(); int APS5_VABI _ZN9Inspector17ScriptDebugServer23removeBreakpointActionsEm(); int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal8Settings11getPropertyERKN3WTF6StringE(); int APS5_VABI _ZN9Inspector21InjectedScriptManagerdaEPv(); @@ -11,7 +12,6 @@ int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_8Timeline13TimelineEvent int APS5_VABI _ZN3JSC6JSLock12DropAllLocksC2ERNS_2VME(); int APS5_VABI _ZN3WTF15BinarySemaphore6signalEv(); int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal11isUnderTestEv(); -int APS5_VABI WKPreferencesSetStandardFontFamily(); int APS5_VABI _ZN7WebCore15JSDOMWindowBaseD1Ev(); int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent24continueUntilNextRunLoopERN3WTF6StringE(); int APS5_VABI _ZN7WebCore8Settings27setLoadsImagesAutomaticallyEb(); @@ -19,20 +19,15 @@ int APS5_VABI WKPreferencesGetApplicationChromeModeEnabled(); int APS5_VABI _ZN7WebCore18JSHTMLInputElementC2ERKS0_(); int APS5_VABI _ZN9Inspector21InspectorConsoleAgent5resetEv(); int APS5_VABI _ZN7WebCore4Node16addEventListenerERKN3WTF10AtomStringEONS1_3RefINS_13EventListenerENS1_13DumbPtrTraitsIS6_EEEERKNS_11EventTarget23AddEventListenerOptionsE(); -int APS5_VABI WKPreferencesSetAutostartOriginPlugInSnapshottingEnabled(); int APS5_VABI _ZN7WebCore18TextureMapperLayer14paintRecursiveERKNS_25TextureMapperPaintOptionsE(); int APS5_VABI _ZN7WebCore9GLContextnwEm(); int APS5_VABI _ZN7WebCore18HTMLMarqueeElement14setScrollDelayEj(); -int APS5_VABI WKPreferencesResetTestRunnerOverrides(); -int APS5_VABI WKContextConfigurationSetAlwaysKeepAndReuseSwappedProcesses(); int APS5_VABI _ZN3JSC9Structure40addPropertyTransitionToExistingStructureEPS0_NS_12PropertyNameEjRi(); int APS5_VABI _ZN7WebCore9GLContextD0Ev(); int APS5_VABI _ZN7WebCore7Element26scrollIntoViewIfNotVisibleEb(); -int APS5_VABI WKPreferencesSetContentChangeObserverEnabled(); int APS5_VABI _ZNK3JSC18PropertyDescriptor12configurableEv(); int APS5_VABI _ZN3JSC30int52AwareSpeculationFromValueENS_7JSValueE(); int APS5_VABI _ZN9Inspector18InjectedScriptHost7subtypeEPN3JSC14JSGlobalObjectENS1_7JSValueE(); -int APS5_VABI _ZNK7WebCore24MatrixTransformOperation6matrixEv(); int APS5_VABI _ZN7WebCore13HTTPHeaderMap3addERKN3WTF6StringES4_(); int APS5_VABI _ZNK3WTF3URL10protocolIsEPKc(); int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocalC2EPNS_19InspectorControllerEPNS_4PageESt10unique_ptrINS0_8SettingsESt14default_deleteIS6_EE(); @@ -51,13 +46,11 @@ int APS5_VABI _ZNK7WebCore8Document7fgColorEv(); int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal23stopProfilingJavaScriptEv(); int APS5_VABI WKWheelEventMake(); int APS5_VABI _ZNK7WebCore11WindowProxy6windowEv(); -int APS5_VABI _ZN3WTF19addProcessPrivilegeENS_16ProcessPrivilegeE(); int APS5_VABI WKPageLoadFile(); int APS5_VABI _ZN3JSC13JSSetIterator14finishCreationERNS_2VMEPNS_5JSSetENS_13IterationKindE(); int APS5_VABI _ZN3JSC21MarkedJSValueRefArrayC1EP15OpaqueJSContextj(); int APS5_VABI _ZN3WTF14FileSystemImpl15openAndLockFileERKNS_6StringENS0_12FileOpenModeENS_9OptionSetINS0_12FileLockModeEEE(); int APS5_VABI _ZNK7WebCore4Page14renderTreeSizeEv(); -int APS5_VABI WKPreferencesSetCanvasUsesAcceleratedDrawing(); int APS5_VABI _ZN9Inspector22HeapFrontendDispatcher13trackingStartEdRKN3WTF6StringE(); int APS5_VABI _ZN7WebCore11JSDOMWindow9setOpenerERN3JSC14JSGlobalObjectENS1_7JSValueE(); int APS5_VABI _ZN7WebCore17NowPlayingManagernaEm(); @@ -68,19 +61,15 @@ int APS5_VABI _ZNK7WebCore6Quirks47shouldAvoidScrollingWhenFocusedContentIsVisib int APS5_VABI _ZN7WebCore11DisplayList10DrawGlyphsD0Ev(); int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient29generatedMIMETypeForURLSchemeERKN3WTF6StringE(); int APS5_VABI _ZN3WTF6Thread5yieldEv(); -int APS5_VABI WKPreferencesGetCaptureVideoInUIProcessEnabled(); int APS5_VABI _ZN7WebCore24DocumentMarkerController9addMarkerERKNS_11SimpleRangeENS_14DocumentMarker10MarkerTypeERKN3WTF7VariantIJNS6_6StringENS4_13DictationDataENS6_6RefPtrINS_4NodeENS6_13DumbPtrTraitsISB_EEEEEEE(); -int APS5_VABI WTFSetLogChannelLevel(); int APS5_VABI _ZN7WebCore20SVGPathStringBuilderC1Ev(); int APS5_VABI _ZN7WebCore11DisplayList10StrokePathD0Ev(); int APS5_VABI _ZN7WebCore17PageConfigurationD2Ev(); int APS5_VABI _ZN7WebCore12DOMTokenList6toggleERKN3WTF10AtomStringENS1_8OptionalIbEE(); int APS5_VABI _ZN3JSC4Heap20edenActivityCallbackEv(); -int APS5_VABI WKWebsitePoliciesSetAllowedAutoplayQuirks(); int APS5_VABI _ZNK7WebCore6Editor8canPasteEv(); int APS5_VABI _ZN7WebCore15DatabaseManager9singletonEv(); int APS5_VABI _ZN7WebCore18TextureMapperLayer18setFixedToViewportEb(); -int APS5_VABI _ZN3WTF5equalEPKNS_10StringImplES2_(); int APS5_VABI WKBundleBackForwardListGetForwardListCount(); int APS5_VABI _ZN7WebCore28collectVaryingRequestHeadersEPNS_21NetworkStorageSessionERKNS_15ResourceRequestERKNS_16ResourceResponseE(); int APS5_VABI _ZN7WebCore19approximateAsRegionERKNS_11RoundedRectEj(); @@ -93,11 +82,8 @@ int APS5_VABI _ZN3WTF13StringBuilder12appendNumberEf(); int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient35dispatchDidClearWindowObjectInWorldERNS_15DOMWrapperWorldE(); int APS5_VABI WKDownloadCancel(); int APS5_VABI _ZNK7WebCore14SecurityOrigin20isSameSchemeHostPortERKS0_(); -int APS5_VABI WKErrorCopyLocalizedDescription(); int APS5_VABI _ZNK7WebCore11MessagePort5derefEv(); int APS5_VABI _ZNK7WebCore17MouseRelatedEvent1yEv(); -int APS5_VABI _ZN7WebCore9FloatRectC2ERKNS_7IntRectE(); -int APS5_VABI _ZN7WebCore15AffineTransform9translateERKNS_9FloatSizeE(); int APS5_VABI _ZNK3JSC18PropertyDescriptor6setterEv(); int APS5_VABI WKContextSetDownloadClient(); int APS5_VABI _ZN9Inspector23CanvasBackendDispatcher6createERNS_17BackendDispatcherEPNS_30CanvasBackendDispatcherHandlerE(); @@ -114,17 +100,14 @@ int APS5_VABI _ZNK7WebCore14DocumentLoader12mainResourceEv(); int APS5_VABI _ZN7WebCore8Document5closeEv(); int APS5_VABI _ZN7WebCore21markerTextForListItemEPNS_7ElementE(); int APS5_VABI _ZN7WebCore11MediaPlayer13addVideoTrackERNS_17VideoTrackPrivateE(); -int APS5_VABI _ZNK7WebCore10FloatPoint15matrixTransformERKNS_20TransformationMatrixE(); int APS5_VABI _ZThn16_N9Inspector22InspectorDebuggerAgent19evaluateOnCallFrameERN3WTF6StringERKS2_S5_PS4_PKbS8_S8_S8_S8_S8_RNS1_6RefPtrINS_8Protocol7Runtime12RemoteObjectENS1_13DumbPtrTraitsISC_EEEERNS1_8OptionalIbEERNSH_IiEE(); int APS5_VABI _ZNK7WebCore11CryptoKeyEC9exportRawEv(); int APS5_VABI _ZN9Inspector22RemoteInspectionTargetD2Ev(); -int APS5_VABI _ZNK7WebCore5Color9lightenedEv(); int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent20setPauseOnAssertionsERN3WTF6StringEb(); int APS5_VABI _ZN7WebCore14ResourceLoader5startEv(); int APS5_VABI _ZNK7WebCore27TranslateTransformOperation5cloneEv(); int APS5_VABI WKPageCanDelete(); int APS5_VABI WKNotificationCopyDir(); -int APS5_VABI _ZNK7WebCore9FloatRect8containsERKS0_(); int APS5_VABI _ZN7WebCore20LegacySchemeRegistry33shouldTreatURLSchemeAsCORSEnabledERKN3WTF6StringE(); int APS5_VABI _ZN7WebCore16MIMETypeRegistry12pdfMIMETypesEv(); int APS5_VABI WKUserContentExtensionStoreRemove(); @@ -140,12 +123,10 @@ int APS5_VABI _ZN7WebCore9FrameView24forceLayoutForPaginationERKNS_9FloatSizeES3 int APS5_VABI _ZN7WebCore11DisplayList11ClearShadowD1Ev(); int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient35dispatchDidChangeLocationWithinPageEv(); int APS5_VABI _ZNK7WebCore6Widget25convertFromContainingViewERKNS_8IntPointE(); -int APS5_VABI WKPreferencesGetLocalFileContentSniffingEnabled(); int APS5_VABI _ZNK7WebCore13HTTPHeaderMap12isolatedCopyEv(); int APS5_VABI _ZN7WebCore22DefaultFilterOperationD0Ev(); int APS5_VABI _ZN7WebCore4Page15setFooterHeightEi(); int APS5_VABI _ZN7WebCore8JSDOMURL9toWrappedERN3JSC2VMENS1_7JSValueE(); -int APS5_VABI JSObjectSetPrivate(); int APS5_VABI _ZN7WebCore21ISOTrackEncryptionBoxC1Ev(); int APS5_VABI _ZN7WebCore18PlatformTimeRangesnaEm(); int APS5_VABI _ZN3JSC9Integrity22auditCellMinimallySlowERNS_2VMEPNS_6JSCellE(); diff --git a/core/libs/prx/libSceNKWebKit/include/InventoryExports.hpp b/core/libs/prx/libSceNKWebKit/include/InventoryExports.hpp index 102d5de675..602bd5e8e3 100644 --- a/core/libs/prx/libSceNKWebKit/include/InventoryExports.hpp +++ b/core/libs/prx/libSceNKWebKit/include/InventoryExports.hpp @@ -4,145 +4,44 @@ extern "C" { -int APS5_VABI JSCheckScriptSyntax(); -int APS5_VABI JSClassCreate(); -int APS5_VABI JSClassRelease(); -int APS5_VABI JSClassRetain(); +int APS5_VABI WKURLRequestSetDefaultTimeoutInterval(); +int APS5_VABI WKErrorCopyDomain(); +int APS5_VABI WKErrorGetErrorCode(); +int APS5_VABI WKErrorCopyFailingURL(); +int APS5_VABI WKURLRequestCopyURL(); +int APS5_VABI WKURLRequestCopyFirstPartyForCookies(); +int APS5_VABI WKURLRequestCopyHTTPMethod(); +int APS5_VABI WKURLRequestCopySettingHTTPBody(); +int APS5_VABI WKURLResponseCopyURL(); +int APS5_VABI WKURLResponseCopyMIMEType(); +int APS5_VABI WKURLResponseHTTPStatusCode(); +int APS5_VABI WKURLResponseCopySuggestedFilename(); +int APS5_VABI WKURLResponseIsAttachment(); +int APS5_VABI WKURLResponseGetExpectedContentLength(); +int APS5_VABI WKSecurityOriginCopyProtocol(); +int APS5_VABI WKSecurityOriginCopyHost(); +int APS5_VABI WKSecurityOriginGetPort(); +int APS5_VABI WKSecurityOriginCopyToString(); +int APS5_VABI WKSecurityOriginCopyDatabaseIdentifier(); +int APS5_VABI WKSecurityOriginCreate(); +int APS5_VABI WKSecurityOriginCreateFromString(); +int APS5_VABI WKSecurityOriginCreateFromDatabaseIdentifier(); +int APS5_VABI WKUserContentURLPatternMatchesURL(); +int APS5_VABI WKURLRequestCreateWithWKURL(); int APS5_VABI JSContextCreateBacktrace(); -int APS5_VABI JSContextGetGlobalContext(); -int APS5_VABI JSContextGetGlobalObject(); -int APS5_VABI JSContextGetGroup(); -int APS5_VABI JSContextGroupAddHeapFinalizer(); -int APS5_VABI JSContextGroupAddMarkingConstraint(); -int APS5_VABI JSContextGroupClearExecutionTimeLimit(); -int APS5_VABI JSContextGroupCreate(); -int APS5_VABI JSContextGroupRelease(); -int APS5_VABI JSContextGroupRemoveHeapFinalizer(); -int APS5_VABI JSContextGroupRetain(); -int APS5_VABI JSContextGroupSetExecutionTimeLimit(); -int APS5_VABI JSDisableGCTimer(); -int APS5_VABI JSEvaluateScript(); -int APS5_VABI JSGarbageCollect(); -int APS5_VABI JSGetMemoryUsageStatistics(); -int APS5_VABI JSGlobalContextCopyName(); -int APS5_VABI JSGlobalContextCreate(); -int APS5_VABI JSGlobalContextCreateInGroup(); -int APS5_VABI JSGlobalContextGetIncludesNativeCallStackWhenReportingExceptions(); -int APS5_VABI JSGlobalContextGetRemoteInspectionEnabled(); -int APS5_VABI JSGlobalContextRelease(); -int APS5_VABI JSGlobalContextRetain(); -int APS5_VABI JSGlobalContextSetIncludesNativeCallStackWhenReportingExceptions(); -int APS5_VABI JSGlobalContextSetName(); -int APS5_VABI JSGlobalContextSetRemoteInspectionEnabled(); -int APS5_VABI JSGlobalContextSetUnhandledRejectionCallback(); -int APS5_VABI JSObjectCallAsConstructor(); -int APS5_VABI JSObjectCallAsFunction(); -int APS5_VABI JSObjectCopyPropertyNames(); -int APS5_VABI JSObjectDeletePrivateProperty(); -int APS5_VABI JSObjectDeletePropertyForKey(); -int APS5_VABI JSObjectDeleteProperty(); -int APS5_VABI JSObjectGetArrayBufferByteLength(); -int APS5_VABI JSObjectGetArrayBufferBytesPtr(); -int APS5_VABI JSObjectGetGlobalContext(); -int APS5_VABI JSObjectGetPrivate(); -int APS5_VABI JSObjectGetPrivateProperty(); -int APS5_VABI JSObjectGetPropertyAtIndex(); -int APS5_VABI JSObjectGetPropertyForKey(); -int APS5_VABI JSObjectGetProperty(); -int APS5_VABI JSObjectGetPrototype(); -int APS5_VABI JSObjectGetProxyTarget(); -int APS5_VABI JSObjectGetTypedArrayBuffer(); -int APS5_VABI JSObjectGetTypedArrayByteLength(); -int APS5_VABI JSObjectGetTypedArrayByteOffset(); -int APS5_VABI JSObjectGetTypedArrayBytesPtr(); -int APS5_VABI JSObjectGetTypedArrayLength(); -int APS5_VABI JSObjectHasProperty(); -int APS5_VABI JSObjectIsConstructor(); -int APS5_VABI JSObjectIsFunction(); -int APS5_VABI JSObjectMakeArrayBufferWithBytesNoCopy(); -int APS5_VABI JSObjectMakeArray(); -int APS5_VABI JSObjectMakeConstructor(); -int APS5_VABI JSObjectMakeDate(); -int APS5_VABI JSObjectMakeDeferredPromise(); -int APS5_VABI JSObjectMakeError(); -int APS5_VABI JSObjectMakeFunction(); -int APS5_VABI JSObjectMakeFunctionWithCallback(); -int APS5_VABI JSObjectMakeRegExp(); -int APS5_VABI JSObjectMakeTypedArrayWithArrayBuffer(); -int APS5_VABI JSObjectMakeTypedArrayWithArrayBufferAndOffset(); -int APS5_VABI JSObjectMakeTypedArrayWithBytesNoCopy(); -int APS5_VABI JSObjectMakeTypedArray(); -int APS5_VABI JSObjectMake(); -int APS5_VABI JSObjectSetPrivateProperty(); -int APS5_VABI JSObjectSetPropertyAtIndex(); -int APS5_VABI JSObjectSetPropertyForKey(); -int APS5_VABI JSObjectSetProperty(); -int APS5_VABI JSObjectSetPrototype(); -int APS5_VABI JSPropertyNameAccumulatorAddName(); -int APS5_VABI JSPropertyNameArrayGetCount(); -int APS5_VABI JSPropertyNameArrayGetNameAtIndex(); -int APS5_VABI JSPropertyNameArrayRelease(); -int APS5_VABI JSPropertyNameArrayRetain(); int APS5_VABI JSRemoteInspectorDisableAutoStart(); -int APS5_VABI JSRemoteInspectorGetInspectionEnabledByDefault(); int APS5_VABI JSRemoteInspectorServerStart(); -int APS5_VABI JSRemoteInspectorSetInspectionEnabledByDefault(); int APS5_VABI JSRemoteInspectorSetLogToSystemConsole(); int APS5_VABI JSRemoteInspectorSetParentProcessInformation(); int APS5_VABI JSRemoteInspectorStart(); -int APS5_VABI JSReportExtraMemoryCost(); int APS5_VABI JSRunLoop(); -int APS5_VABI JSScriptCreateFromString(); -int APS5_VABI JSScriptCreateReferencingImmortalASCIIText(); -int APS5_VABI JSScriptEvaluate(); -int APS5_VABI JSScriptRelease(); -int APS5_VABI JSScriptRetain(); int APS5_VABI JSSetOptions(); -int APS5_VABI JSStringCreateWithCharactersNoCopy(); -int APS5_VABI JSSynchronousEdenCollectForDebugging(); -int APS5_VABI JSSynchronousGarbageCollectForDebugging(); -int APS5_VABI JSValueCreateJSONString(); -int APS5_VABI JSValueGetTypedArrayType(); -int APS5_VABI JSValueGetType(); -int APS5_VABI JSValueIsArray(); -int APS5_VABI JSValueIsBoolean(); -int APS5_VABI JSValueIsDate(); -int APS5_VABI JSValueIsEqual(); -int APS5_VABI JSValueIsInstanceOfConstructor(); -int APS5_VABI JSValueIsNull(); -int APS5_VABI JSValueIsNumber(); -int APS5_VABI JSValueIsObjectOfClass(); -int APS5_VABI JSValueIsObject(); -int APS5_VABI JSValueIsStrictEqual(); -int APS5_VABI JSValueIsString(); -int APS5_VABI JSValueIsSymbol(); -int APS5_VABI JSValueIsUndefined(); -int APS5_VABI JSValueMakeBoolean(); -int APS5_VABI JSValueMakeFromJSONString(); -int APS5_VABI JSValueMakeNull(); -int APS5_VABI JSValueMakeNumber(); -int APS5_VABI JSValueMakeSymbol(); -int APS5_VABI JSValueMakeUndefined(); -int APS5_VABI JSValueProtect(); -int APS5_VABI JSValueToBoolean(); -int APS5_VABI JSValueToNumber(); -int APS5_VABI JSValueToObject(); -int APS5_VABI JSValueToStringCopy(); -int APS5_VABI JSValueUnprotect(); -int APS5_VABI JSWeakCreate(); -int APS5_VABI JSWeakGetObject(); -int APS5_VABI JSWeakObjectMapGet(); -int APS5_VABI JSWeakObjectMapRemove(); -int APS5_VABI JSWeakObjectMapSet(); -int APS5_VABI JSWeakRelease(); -int APS5_VABI JSWeakRetain(); int APS5_VABI WKAXObjectButtonState(); int APS5_VABI WKAXObjectCopyDescription(); int APS5_VABI WKAXObjectCopyHelpText(); int APS5_VABI WKAXObjectCopyTitle(); int APS5_VABI WKAXObjectCopyURL(); int APS5_VABI WKAXObjectFrame(); -int APS5_VABI WKAXObjectGetTypeID(); int APS5_VABI WKAXObjectPage(); int APS5_VABI WKAXObjectRole(); int APS5_VABI WKAccessibilityCanUseSecondaryAXThread(); @@ -154,24 +53,14 @@ int APS5_VABI WKAddMockMediaDevice(); int APS5_VABI WKApplicationCacheManagerDeleteAllEntries(); int APS5_VABI WKApplicationCacheManagerDeleteEntriesForOrigin(); int APS5_VABI WKApplicationCacheManagerGetApplicationCacheOrigins(); -int APS5_VABI WKApplicationCacheManagerGetTypeID(); -int APS5_VABI WKArrayAppendItem(); -int APS5_VABI WKArrayCreateAdoptingValues(); -int APS5_VABI WKArrayCreate(); -int APS5_VABI WKArrayGetItemAtIndex(); -int APS5_VABI WKArrayGetSize(); -int APS5_VABI WKArrayGetTypeID(); -int APS5_VABI WKArrayRemoveItemAtIndex(); int APS5_VABI WKAuthenticationChallengCopyRequestURL(); int APS5_VABI WKAuthenticationChallengeGetDecisionListener(); int APS5_VABI WKAuthenticationChallengeGetPreviousFailureCount(); int APS5_VABI WKAuthenticationChallengeGetProposedCredential(); int APS5_VABI WKAuthenticationChallengeGetProtectionSpace(); -int APS5_VABI WKAuthenticationChallengeGetTypeID(); int APS5_VABI WKAuthenticationChallengeIsForMainResource(); int APS5_VABI WKAuthenticationChallengeIsInMainFrame(); int APS5_VABI WKAuthenticationDecisionListenerCancel(); -int APS5_VABI WKAuthenticationDecisionListenerGetTypeID(); int APS5_VABI WKAuthenticationDecisionListenerRejectProtectionSpaceAndContinue(); int APS5_VABI WKAuthenticationDecisionListenerUseCredential(); int APS5_VABI WKBackForwardListClear(); @@ -183,25 +72,18 @@ int APS5_VABI WKBackForwardListGetCurrentItem(); int APS5_VABI WKBackForwardListGetForwardItem(); int APS5_VABI WKBackForwardListGetForwardListCount(); int APS5_VABI WKBackForwardListGetItemAtIndex(); -int APS5_VABI WKBackForwardListGetTypeID(); int APS5_VABI WKBackForwardListItemCopyOriginalURL(); int APS5_VABI WKBackForwardListItemCopyTitle(); int APS5_VABI WKBackForwardListItemCopyURL(); -int APS5_VABI WKBackForwardListItemGetTypeID(); -int APS5_VABI WKBooleanCreate(); -int APS5_VABI WKBooleanGetTypeID(); -int APS5_VABI WKBooleanGetValue(); int APS5_VABI WKBundleAddOriginAccessAllowListEntry(); int APS5_VABI WKBundleBackForwardListClear(); int APS5_VABI WKBundleBackForwardListCopyItemAtIndex(); int APS5_VABI WKBundleBackForwardListGetBackListCount(); -int APS5_VABI WKBundleBackForwardListGetTypeID(); int APS5_VABI WKBundleBackForwardListItemCopyChildren(); int APS5_VABI WKBundleBackForwardListItemCopyOriginalURL(); int APS5_VABI WKBundleBackForwardListItemCopyTarget(); int APS5_VABI WKBundleBackForwardListItemCopyTitle(); int APS5_VABI WKBundleBackForwardListItemCopyURL(); -int APS5_VABI WKBundleBackForwardListItemGetTypeID(); int APS5_VABI WKBundleBackForwardListItemHasCachedPageExpired(); int APS5_VABI WKBundleBackForwardListItemIsInBackForwardCache(); int APS5_VABI WKBundleBackForwardListItemIsSame(); @@ -212,7 +94,6 @@ int APS5_VABI WKBundleCreateWKDataFromUInt8Array(); int APS5_VABI WKBundleDOMWindowExtensionCreate(); int APS5_VABI WKBundleDOMWindowExtensionGetFrame(); int APS5_VABI WKBundleDOMWindowExtensionGetScriptWorld(); -int APS5_VABI WKBundleDOMWindowExtensionGetTypeID(); int APS5_VABI WKBundleExtendClassesForParameterCoder(); int APS5_VABI WKBundleFileHandleCreateWithPath(); int APS5_VABI WKBundleFrameAllowsFollowingLink(); @@ -248,7 +129,6 @@ int APS5_VABI WKBundleFrameGetPage(); int APS5_VABI WKBundleFrameGetParentFrame(); int APS5_VABI WKBundleFrameGetPendingUnloadCount(); int APS5_VABI WKBundleFrameGetScrollOffset(); -int APS5_VABI WKBundleFrameGetTypeID(); int APS5_VABI WKBundleFrameGetVisibleContentBounds(); int APS5_VABI WKBundleFrameGetVisibleContentBoundsExcludingScrollbars(); int APS5_VABI WKBundleFrameHandlesPageScaleGesture(); @@ -262,7 +142,6 @@ int APS5_VABI WKBundleGarbageCollectJavaScriptObjectsOnAlternateThreadForDebuggi int APS5_VABI WKBundleGarbageCollectJavaScriptObjects(); int APS5_VABI WKBundleGetApplicationConnection(); int APS5_VABI WKBundleGetJavaScriptObjectsCount(); -int APS5_VABI WKBundleGetTypeID(); int APS5_VABI WKBundleHitTestResultCopyAbsoluteImageURL(); int APS5_VABI WKBundleHitTestResultCopyAbsoluteLinkURL(); int APS5_VABI WKBundleHitTestResultCopyAbsoluteMediaURL(); @@ -278,13 +157,11 @@ int APS5_VABI WKBundleHitTestResultGetImageRect(); int APS5_VABI WKBundleHitTestResultGetIsSelected(); int APS5_VABI WKBundleHitTestResultGetMediaType(); int APS5_VABI WKBundleHitTestResultGetTargetFrame(); -int APS5_VABI WKBundleHitTestResultGetTypeID(); int APS5_VABI WKBundleHitTestResultIsDownloadableMedia(); int APS5_VABI WKBundleHitTestResultMediaHasAudio(); int APS5_VABI WKBundleHitTestResultMediaIsInFullscreen(); int APS5_VABI WKBundleInspectorClose(); int APS5_VABI WKBundleInspectorEvaluateScriptForTest(); -int APS5_VABI WKBundleInspectorGetTypeID(); int APS5_VABI WKBundleInspectorSetPageProfilingEnabled(); int APS5_VABI WKBundleInspectorShow(); int APS5_VABI WKBundleIsPageBoxVisible(); @@ -297,7 +174,6 @@ int APS5_VABI WKBundleNavigationActionGetEventMouseButton(); int APS5_VABI WKBundleNavigationActionGetNavigationType(); int APS5_VABI WKBundleNavigationActionGetShouldOpenExternalURLs(); int APS5_VABI WKBundleNavigationActionGetShouldTryAppLinks(); -int APS5_VABI WKBundleNavigationActionGetTypeID(); int APS5_VABI WKBundleNodeHandleCopyDocumentFrame(); int APS5_VABI WKBundleNodeHandleCopyDocument(); int APS5_VABI WKBundleNodeHandleCopyHTMLFrameElementContentFrame(); @@ -317,7 +193,6 @@ int APS5_VABI WKBundleNodeHandleGetHTMLInputElementLastAutoFillButtonType(); int APS5_VABI WKBundleNodeHandleGetHTMLInputElementLastChangeWasUserEdit(); int APS5_VABI WKBundleNodeHandleGetHTMLTextAreaElementLastChangeWasUserEdit(); int APS5_VABI WKBundleNodeHandleGetRenderRect(); -int APS5_VABI WKBundleNodeHandleGetTypeID(); int APS5_VABI WKBundleNodeHandleSetHTMLInputElementAutoFillAvailable(); int APS5_VABI WKBundleNodeHandleSetHTMLInputElementAutoFillButtonEnabledWithButtonType(); int APS5_VABI WKBundleNodeHandleSetHTMLInputElementAutoFillButtonEnabled(); @@ -370,7 +245,6 @@ int APS5_VABI WKBundlePageGetMainFrame(); int APS5_VABI WKBundlePageGetPageZoomFactor(); int APS5_VABI WKBundlePageGetRenderTreeSize(); int APS5_VABI WKBundlePageGetTextZoomFactor(); -int APS5_VABI WKBundlePageGetTypeID(); int APS5_VABI WKBundlePageHasComposition(); int APS5_VABI WKBundlePageHasLocalDataForURL(); int APS5_VABI WKBundlePageInsertNewlineInQuotedContent(); @@ -387,7 +261,6 @@ int APS5_VABI WKBundlePageNumberForElementById(); int APS5_VABI WKBundlePageOverlayClear(); int APS5_VABI WKBundlePageOverlayCreate(); int APS5_VABI WKBundlePageOverlayFractionFadedIn(); -int APS5_VABI WKBundlePageOverlayGetTypeID(); int APS5_VABI WKBundlePageOverlaySetAccessibilityClient(); int APS5_VABI WKBundlePageOverlaySetNeedsDisplay(); int APS5_VABI WKBundlePagePostMessageIgnoringFullySynchronousMode(); @@ -437,7 +310,6 @@ int APS5_VABI WKBundlePostSynchronousMessage(); int APS5_VABI WKBundleRangeHandleCopySnapshotWithOptions(); int APS5_VABI WKBundleRangeHandleCreate(); int APS5_VABI WKBundleRangeHandleGetBoundingRectInWindowCoordinates(); -int APS5_VABI WKBundleRangeHandleGetTypeID(); int APS5_VABI WKBundleReleaseMemory(); int APS5_VABI WKBundleRemoveAllWebNotificationPermissions(); int APS5_VABI WKBundleRemoveOriginAccessAllowListEntry(); @@ -448,7 +320,6 @@ int APS5_VABI WKBundleScriptWorldClearWrappers(); int APS5_VABI WKBundleScriptWorldCopyName(); int APS5_VABI WKBundleScriptWorldCreateWorld(); int APS5_VABI WKBundleScriptWorldDisableOverrideBuiltinsBehavior(); -int APS5_VABI WKBundleScriptWorldGetTypeID(); int APS5_VABI WKBundleScriptWorldMakeAllShadowRootsOpen(); int APS5_VABI WKBundleScriptWorldNormalWorld(); int APS5_VABI WKBundleSetClient(); @@ -456,14 +327,7 @@ int APS5_VABI WKBundleSetDatabaseQuota(); int APS5_VABI WKBundleSetServiceWorkerProxyCreationCallback(); int APS5_VABI WKBundleSetTabKeyCyclesThroughElements(); int APS5_VABI WKBundleSetWebNotificationPermission(); -int APS5_VABI WKCertificateInfoCopyCertificateAtIndex(); -int APS5_VABI WKCertificateInfoCopyVerificationErrorDescription(); -int APS5_VABI WKCertificateInfoCreateWithCertficateChain(); -int APS5_VABI WKCertificateInfoGetCertificateChainSize(); -int APS5_VABI WKCertificateInfoGetTypeID(); -int APS5_VABI WKCertificateInfoGetVerificationError(); int APS5_VABI WKClearMockMediaDevices(); -int APS5_VABI WKConnectionGetTypeID(); int APS5_VABI WKConnectionPostMessage(); int APS5_VABI WKConnectionSetConnectionClient(); int APS5_VABI WKContextAddSupportedPlugin(); @@ -472,49 +336,6 @@ int APS5_VABI WKContextAllowSpecificHTTPSCertificateForHost(); int APS5_VABI WKContextClearCurrentModifierStateForTesting(); int APS5_VABI WKContextClearSupportedPlugins(); int APS5_VABI WKContextClearVisitedLinks(); -int APS5_VABI WKContextConfigurationAlwaysKeepAndReuseSwappedProcesses(); -int APS5_VABI WKContextConfigurationCopyApplicationCacheDirectory(); -int APS5_VABI WKContextConfigurationCopyCustomClassesForParameterCoder(); -int APS5_VABI WKContextConfigurationCopyDiskCacheDirectory(); -int APS5_VABI WKContextConfigurationCopyIndexedDBDatabaseDirectory(); -int APS5_VABI WKContextConfigurationCopyInjectedBundlePath(); -int APS5_VABI WKContextConfigurationCopyLocalStorageDirectory(); -int APS5_VABI WKContextConfigurationCopyMediaKeysStorageDirectory(); -int APS5_VABI WKContextConfigurationCopyNetworkProcessPath(); -int APS5_VABI WKContextConfigurationCopyOverrideLanguages(); -int APS5_VABI WKContextConfigurationCopyResourceLoadStatisticsDirectory(); -int APS5_VABI WKContextConfigurationCopyWebProcessPath(); -int APS5_VABI WKContextConfigurationCopyWebSQLDatabaseDirectory(); -int APS5_VABI WKContextConfigurationCreateWithLegacyOptions(); -int APS5_VABI WKContextConfigurationCreate(); -int APS5_VABI WKContextConfigurationDiskCacheSizeOverride(); -int APS5_VABI WKContextConfigurationFullySynchronousModeIsAllowedForTesting(); -int APS5_VABI WKContextConfigurationGetUserId(); -int APS5_VABI WKContextConfigurationIgnoreSynchronousMessagingTimeoutsForTesting(); -int APS5_VABI WKContextConfigurationPrewarmsProcessesAutomatically(); -int APS5_VABI WKContextConfigurationProcessSwapsOnNavigation(); -int APS5_VABI WKContextConfigurationSetApplicationCacheDirectory(); -int APS5_VABI WKContextConfigurationSetCustomClassesForParameterCoder(); -int APS5_VABI WKContextConfigurationSetDiskCacheDirectory(); -int APS5_VABI WKContextConfigurationSetDiskCacheSizeOverride(); -int APS5_VABI WKContextConfigurationSetFullySynchronousModeIsAllowedForTesting(); -int APS5_VABI WKContextConfigurationSetIgnoreSynchronousMessagingTimeoutsForTesting(); -int APS5_VABI WKContextConfigurationSetIndexedDBDatabaseDirectory(); -int APS5_VABI WKContextConfigurationSetInjectedBundlePath(); -int APS5_VABI WKContextConfigurationSetLocalStorageDirectory(); -int APS5_VABI WKContextConfigurationSetMediaKeysStorageDirectory(); -int APS5_VABI WKContextConfigurationSetNetworkProcessPath(); -int APS5_VABI WKContextConfigurationSetOverrideLanguages(); -int APS5_VABI WKContextConfigurationSetPrewarmsProcessesAutomatically(); -int APS5_VABI WKContextConfigurationSetProcessSwapsOnNavigation(); -int APS5_VABI WKContextConfigurationSetResourceLoadStatisticsDirectory(); -int APS5_VABI WKContextConfigurationSetShouldCaptureAudioInUIProcess(); -int APS5_VABI WKContextConfigurationSetShouldConfigureJSCForTesting(); -int APS5_VABI WKContextConfigurationSetUserId(); -int APS5_VABI WKContextConfigurationSetUsesWebProcessCache(); -int APS5_VABI WKContextConfigurationSetWebProcessPath(); -int APS5_VABI WKContextConfigurationSetWebSQLDatabaseDirectory(); -int APS5_VABI WKContextConfigurationUsesWebProcessCache(); int APS5_VABI WKContextCopyPlugInAutoStartOriginHashes(); int APS5_VABI WKContextCreate(); int APS5_VABI WKContextCreateWithConfiguration(); @@ -535,7 +356,6 @@ int APS5_VABI WKContextGetNotificationManager(); int APS5_VABI WKContextGetResourceCacheManager(); int APS5_VABI WKContextGetStatisticsWithOptions(); int APS5_VABI WKContextGetStatistics(); -int APS5_VABI WKContextGetTypeID(); int APS5_VABI WKContextGetUsesSingleWebProcess(); int APS5_VABI WKContextGetWebsiteDataStore(); int APS5_VABI WKContextJavaScriptConfigurationFileEnabled(); @@ -547,7 +367,6 @@ int APS5_VABI WKContextMenuItemCreateAsSubmenu(); int APS5_VABI WKContextMenuItemGetChecked(); int APS5_VABI WKContextMenuItemGetEnabled(); int APS5_VABI WKContextMenuItemGetTag(); -int APS5_VABI WKContextMenuItemGetTypeID(); int APS5_VABI WKContextMenuItemGetType(); int APS5_VABI WKContextMenuItemGetUserData(); int APS5_VABI WKContextMenuItemSeparatorItem(); @@ -599,39 +418,14 @@ int APS5_VABI WKCookieManagerDeleteAllCookiesModifiedAfterDate(); int APS5_VABI WKCookieManagerDeleteCookiesForHostname(); int APS5_VABI WKCookieManagerGetHTTPCookieAcceptPolicy(); int APS5_VABI WKCookieManagerGetHostnamesWithCookies(); -int APS5_VABI WKCookieManagerGetTypeID(); int APS5_VABI WKCookieManagerSetClient(); int APS5_VABI WKCookieManagerSetHTTPCookieAcceptPolicy(); int APS5_VABI WKCookieManagerStartObservingCookieChanges(); int APS5_VABI WKCookieManagerStopObservingCookieChanges(); -int APS5_VABI WKCredentialCopyUser(); -int APS5_VABI WKCredentialCreateWithCertificateInfo(); -int APS5_VABI WKCredentialCreate(); -int APS5_VABI WKCredentialGetTypeID(); -int APS5_VABI WKDataCreate(); -int APS5_VABI WKDataGetBytes(); -int APS5_VABI WKDataGetSize(); -int APS5_VABI WKDataGetTypeID(); -int APS5_VABI WKDictionaryCopyKeys(); -int APS5_VABI WKDictionaryCreate(); -int APS5_VABI WKDictionaryGetItemForKey(); -int APS5_VABI WKDictionaryGetSize(); -int APS5_VABI WKDictionaryGetTypeID(); -int APS5_VABI WKDictionarySetItem(); -int APS5_VABI WKDoubleCreate(); -int APS5_VABI WKDoubleGetTypeID(); -int APS5_VABI WKDoubleGetValue(); int APS5_VABI WKDownloadCopyRequest(); int APS5_VABI WKDownloadGetOriginatingPage(); -int APS5_VABI WKDownloadGetTypeID(); int APS5_VABI WKDownloadGetWasUserInitiated(); -int APS5_VABI WKErrorCopyDomain(); -int APS5_VABI WKErrorCopyFailingURL(); -int APS5_VABI WKErrorCopyWKErrorDomain(); -int APS5_VABI WKErrorGetErrorCode(); -int APS5_VABI WKErrorGetTypeID(); int APS5_VABI WKFormSubmissionListenerContinue(); -int APS5_VABI WKFormSubmissionListenerGetTypeID(); int APS5_VABI WKFrameCanProvideSource(); int APS5_VABI WKFrameCanShowMIMEType(); int APS5_VABI WKFrameCopyMIMEType(); @@ -646,39 +440,27 @@ int APS5_VABI WKFrameGetFrameLoadState(); int APS5_VABI WKFrameGetMainResourceData(); int APS5_VABI WKFrameGetPage(); int APS5_VABI WKFrameGetResourceData(); -int APS5_VABI WKFrameGetTypeID(); int APS5_VABI WKFrameGetWebArchive(); int APS5_VABI WKFrameHandleGetFrameID(); -int APS5_VABI WKFrameHandleGetTypeID(); int APS5_VABI WKFrameInfoCreateFrameHandleRef(); -int APS5_VABI WKFrameInfoGetTypeID(); int APS5_VABI WKFrameIsDisplayingMarkupDocument(); int APS5_VABI WKFrameIsDisplayingStandaloneImageDocument(); int APS5_VABI WKFrameIsFrameSet(); int APS5_VABI WKFrameIsMainFrame(); int APS5_VABI WKFramePolicyListenerDownload(); -int APS5_VABI WKFramePolicyListenerGetTypeID(); int APS5_VABI WKFramePolicyListenerIgnore(); int APS5_VABI WKFramePolicyListenerUseInNewProcess(); int APS5_VABI WKFramePolicyListenerUseInNewProcessWithPolicies(); int APS5_VABI WKFramePolicyListenerUse(); int APS5_VABI WKFramePolicyListenerUseWithPolicies(); int APS5_VABI WKFrameStopLoading(); -int APS5_VABI WKGeolocationManagerGetTypeID(); int APS5_VABI WKGeolocationManagerProviderDidChangePosition(); int APS5_VABI WKGeolocationManagerProviderDidFailToDeterminePosition(); int APS5_VABI WKGeolocationManagerProviderDidFailToDeterminePositionWithErrorMessage(); int APS5_VABI WKGeolocationManagerSetProvider(); int APS5_VABI WKGeolocationPermissionRequestAllow(); int APS5_VABI WKGeolocationPermissionRequestDeny(); -int APS5_VABI WKGeolocationPermissionRequestGetTypeID(); -int APS5_VABI WKGeolocationPositionCreate(); -int APS5_VABI WKGeolocationPositionCreate_b(); -int APS5_VABI WKGeolocationPositionCreate_c(); -int APS5_VABI WKGeolocationPositionGetTypeID(); -int APS5_VABI WKGetTypeID(); int APS5_VABI WKHTTPCookieStoreDeleteAllCookies(); -int APS5_VABI WKHTTPCookieStoreGetTypeID(); int APS5_VABI WKHTTPCookieStoreSetCookieForHostname(); int APS5_VABI WKHTTPCookieStoreSetHTTPCookieAcceptPolicy(); int APS5_VABI WKHitTestResultCopyAbsoluteImageURL(); @@ -689,14 +471,12 @@ int APS5_VABI WKHitTestResultCopyLinkLabel(); int APS5_VABI WKHitTestResultCopyLinkTitle(); int APS5_VABI WKHitTestResultCopyLookupText(); int APS5_VABI WKHitTestResultGetElementBoundingBox(); -int APS5_VABI WKHitTestResultGetTypeID(); int APS5_VABI WKHitTestResultIsContentEditable(); int APS5_VABI WKIconDatabaseCheckIntegrityBeforeOpening(); int APS5_VABI WKIconDatabaseClose(); int APS5_VABI WKIconDatabaseCopyIconDataForPageURL(); int APS5_VABI WKIconDatabaseCopyIconURLForPageURL(); int APS5_VABI WKIconDatabaseEnableDatabaseCleanup(); -int APS5_VABI WKIconDatabaseGetTypeID(); int APS5_VABI WKIconDatabaseReleaseIconForURL(); int APS5_VABI WKIconDatabaseRemoveAllIcons(); int APS5_VABI WKIconDatabaseRetainIconForURL(); @@ -707,7 +487,6 @@ int APS5_VABI WKImageCreate(); int APS5_VABI WKImageCreateCairoSurface(); int APS5_VABI WKImageCreateFromCairoSurface(); int APS5_VABI WKImageGetSize(); -int APS5_VABI WKImageGetTypeID(); int APS5_VABI WKImeEventGetInputLanguage(); int APS5_VABI WKImeEventMake(); int APS5_VABI WKImeEventRelease(); @@ -716,7 +495,6 @@ int APS5_VABI WKInspectorClose(); int APS5_VABI WKInspectorConnect(); int APS5_VABI WKInspectorDetach(); int APS5_VABI WKInspectorGetPage(); -int APS5_VABI WKInspectorGetTypeID(); int APS5_VABI WKInspectorHide(); int APS5_VABI WKInspectorIsAttached(); int APS5_VABI WKInspectorIsConnected(); @@ -737,23 +515,15 @@ int APS5_VABI WKKeyValueStorageManagerGetKeyValueStorageOrigins(); int APS5_VABI WKKeyValueStorageManagerGetModificationTimeKey(); int APS5_VABI WKKeyValueStorageManagerGetOriginKey(); int APS5_VABI WKKeyValueStorageManagerGetStorageDetailsByOrigin(); -int APS5_VABI WKKeyValueStorageManagerGetTypeID(); int APS5_VABI WKKeyboardEventMake(); -int APS5_VABI WKMessageListenerGetTypeID(); int APS5_VABI WKMessageListenerSendReply(); int APS5_VABI WKMouseEventMake(); -int APS5_VABI WKMutableArrayCreate(); -int APS5_VABI WKMutableDictionaryCreate(); -int APS5_VABI WKNavigationActionGetTypeID(); int APS5_VABI WKNavigationActionShouldPerformDownload(); int APS5_VABI WKNavigationDataCopyNavigationDestinationURL(); int APS5_VABI WKNavigationDataCopyOriginalRequest(); int APS5_VABI WKNavigationDataCopyTitle(); int APS5_VABI WKNavigationDataCopyURL(); -int APS5_VABI WKNavigationDataGetTypeID(); -int APS5_VABI WKNavigationGetTypeID(); int APS5_VABI WKNavigationResponseCanShowMIMEType(); -int APS5_VABI WKNavigationResponseGetTypeID(); int APS5_VABI WKNotificationCopyBody(); int APS5_VABI WKNotificationCopyIconURL(); int APS5_VABI WKNotificationCopyLang(); @@ -761,15 +531,12 @@ int APS5_VABI WKNotificationCopyTag(); int APS5_VABI WKNotificationCopyTitle(); int APS5_VABI WKNotificationGetID(); int APS5_VABI WKNotificationGetSecurityOrigin(); -int APS5_VABI WKNotificationGetTypeID(); -int APS5_VABI WKNotificationManagerGetTypeID(); int APS5_VABI WKNotificationManagerProviderDidClickNotification(); int APS5_VABI WKNotificationManagerProviderDidCloseNotifications(); int APS5_VABI WKNotificationManagerProviderDidRemoveNotificationPolicies(); int APS5_VABI WKNotificationManagerProviderDidShowNotification(); int APS5_VABI WKNotificationManagerSetProvider(); int APS5_VABI WKNotificationPermissionRequestDeny(); -int APS5_VABI WKNotificationPermissionRequestGetTypeID(); int APS5_VABI WKOpenPanelParametersCopyAcceptedFileExtensions(); int APS5_VABI WKOpenPanelParametersCopyAcceptedMIMETypes(); int APS5_VABI WKOpenPanelParametersCopyAllowedMIMETypes(); @@ -778,10 +545,8 @@ int APS5_VABI WKOpenPanelParametersCopySelectedFileNames(); int APS5_VABI WKOpenPanelParametersGetAllowsDirectories(); int APS5_VABI WKOpenPanelParametersGetAllowsMultipleFiles(); int APS5_VABI WKOpenPanelParametersGetMediaCaptureType(); -int APS5_VABI WKOpenPanelParametersGetTypeID(); int APS5_VABI WKOpenPanelResultListenerCancel(); int APS5_VABI WKOpenPanelResultListenerChooseFiles(); -int APS5_VABI WKOpenPanelResultListenerGetTypeID(); int APS5_VABI WKPageAreScrollbarAnimationsSuppressed(); int APS5_VABI WKPageBackgroundExtendsBeyondPage(); int APS5_VABI WKPageBeginPrinting(); @@ -796,22 +561,6 @@ int APS5_VABI WKPageClearUserMediaState(); int APS5_VABI WKPageClearWheelEventTestMonitor(); int APS5_VABI WKPageClose(); int APS5_VABI WKPageComputePagesForPrinting(); -int APS5_VABI WKPageConfigurationCreate(); -int APS5_VABI WKPageConfigurationGetContext(); -int APS5_VABI WKPageConfigurationGetPageGroup(); -int APS5_VABI WKPageConfigurationGetPreferences(); -int APS5_VABI WKPageConfigurationGetRelatedPage(); -int APS5_VABI WKPageConfigurationGetTypeID(); -int APS5_VABI WKPageConfigurationGetUserContentController(); -int APS5_VABI WKPageConfigurationGetWebsiteDataStore(); -int APS5_VABI WKPageConfigurationSetBackgroundCPULimit(); -int APS5_VABI WKPageConfigurationSetContext(); -int APS5_VABI WKPageConfigurationSetInitialCapitalizationEnabled(); -int APS5_VABI WKPageConfigurationSetPageGroup(); -int APS5_VABI WKPageConfigurationSetPreferences(); -int APS5_VABI WKPageConfigurationSetRelatedPage(); -int APS5_VABI WKPageConfigurationSetUserContentController(); -int APS5_VABI WKPageConfigurationSetWebsiteDataStore(); int APS5_VABI WKPageCopyActiveURL(); int APS5_VABI WKPageCopyApplicationNameForUserAgent(); int APS5_VABI WKPageCopyCommittedURL(); @@ -869,19 +618,9 @@ int APS5_VABI WKPageGetSessionBackForwardListItemValueType(); int APS5_VABI WKPageGetSessionHistoryURLValueType(); int APS5_VABI WKPageGetSourceForFrame(); int APS5_VABI WKPageGetTextZoomFactor(); -int APS5_VABI WKPageGetTypeID(); int APS5_VABI WKPageGoBack(); int APS5_VABI WKPageGoForward(); int APS5_VABI WKPageGoToBackForwardListItem(); -int APS5_VABI WKPageGroupAddUserScript(); -int APS5_VABI WKPageGroupAddUserStyleSheet(); -int APS5_VABI WKPageGroupCreateWithIdentifier(); -int APS5_VABI WKPageGroupGetPreferences(); -int APS5_VABI WKPageGroupGetTypeID(); -int APS5_VABI WKPageGroupGetUserContentController(); -int APS5_VABI WKPageGroupRemoveAllUserScripts(); -int APS5_VABI WKPageGroupRemoveAllUserStyleSheets(); -int APS5_VABI WKPageGroupSetPreferences(); int APS5_VABI WKPageHandleImeEvent(); int APS5_VABI WKPageHandleKeyboardEvent(); int APS5_VABI WKPageHandleMouseEvent(); @@ -925,7 +664,6 @@ int APS5_VABI WKPageReload(); int APS5_VABI WKPageReloadWithoutContentBlockers(); int APS5_VABI WKPageRenderTreeExternalRepresentation(); int APS5_VABI WKPageRequestStorageAccessConfirmResultListenerCall(); -int APS5_VABI WKPageRequestStorageAccessConfirmResultListenerGetTypeID(); int APS5_VABI WKPageRestoreFromSessionState(); int APS5_VABI WKPageRestoreFromSessionStateWithoutNavigation(); int APS5_VABI WKPageResumeActiveDOMObjectsAndAnimations(); @@ -934,14 +672,10 @@ int APS5_VABI WKPageRubberBandsAtLeft(); int APS5_VABI WKPageRubberBandsAtRight(); int APS5_VABI WKPageRubberBandsAtTop(); int APS5_VABI WKPageRunBeforeUnloadConfirmPanelResultListenerCall(); -int APS5_VABI WKPageRunBeforeUnloadConfirmPanelResultListenerGetTypeID(); int APS5_VABI WKPageRunJavaScriptAlertResultListenerCall(); -int APS5_VABI WKPageRunJavaScriptAlertResultListenerGetTypeID(); int APS5_VABI WKPageRunJavaScriptConfirmResultListenerCall(); -int APS5_VABI WKPageRunJavaScriptConfirmResultListenerGetTypeID(); int APS5_VABI WKPageRunJavaScriptInMainFrame(); int APS5_VABI WKPageRunJavaScriptPromptResultListenerCall(); -int APS5_VABI WKPageRunJavaScriptPromptResultListenerGetTypeID(); int APS5_VABI WKPageSelectContextMenuItem(); int APS5_VABI WKPageSelectFindMatch(); int APS5_VABI WKPageSetAddsVisitedLinks(); @@ -1015,410 +749,15 @@ int APS5_VABI WKPluginInformationPathKey(); int APS5_VABI WKPluginInformationPluginURLKey(); int APS5_VABI WKPluginInformationPluginspageAttributeURLKey(); int APS5_VABI WKPluginInformationUpdatePastLastBlockedVersionIsKnownAvailableKey(); -int APS5_VABI WKPointCreate(); -int APS5_VABI WKPointGetTypeID(); -int APS5_VABI WKPointGetValue(); int APS5_VABI WKPopupMenuItemCopyText(); -int APS5_VABI WKPopupMenuItemGetTypeID(); int APS5_VABI WKPopupMenuItemIsEnabled(); int APS5_VABI WKPopupMenuItemIsItem(); int APS5_VABI WKPopupMenuItemIsSeparator(); -int APS5_VABI WKPreferencesCopyCursiveFontFamily(); -int APS5_VABI WKPreferencesCopyDefaultTextEncodingName(); -int APS5_VABI WKPreferencesCopyFTPDirectoryTemplatePath(); -int APS5_VABI WKPreferencesCopyFantasyFontFamily(); -int APS5_VABI WKPreferencesCopyFixedFontFamily(); -int APS5_VABI WKPreferencesCopyMediaContentTypesRequiringHardwareSupport(); -int APS5_VABI WKPreferencesCopyPictographFontFamily(); -int APS5_VABI WKPreferencesCopySansSerifFontFamily(); -int APS5_VABI WKPreferencesCopySerifFontFamily(); -int APS5_VABI WKPreferencesCopyStandardFontFamily(); -int APS5_VABI WKPreferencesCreateCopy(); -int APS5_VABI WKPreferencesCreateWithIdentifier(); -int APS5_VABI WKPreferencesCreate(); -int APS5_VABI WKPreferencesEnableAllExperimentalFeatures(); -int APS5_VABI WKPreferencesGetAVFoundationEnabled(); -int APS5_VABI WKPreferencesGetAVFoundationNSURLSessionEnabled(); int APS5_VABI WKPreferencesGetAccelerated2DCanvasEnabled(); -int APS5_VABI WKPreferencesGetAcceleratedCompositingEnabled(); -int APS5_VABI WKPreferencesGetAcceleratedDrawingEnabled(); -int APS5_VABI WKPreferencesGetAggressiveTileRetentionEnabled(); -int APS5_VABI WKPreferencesGetAllowCrossOriginSubresourcesToAskForCredentials(); -int APS5_VABI WKPreferencesGetAllowMediaContentTypesRequiringHardwareSupportAsFallback(); -int APS5_VABI WKPreferencesGetAllowsAirPlayForMediaPlayback(); -int APS5_VABI WKPreferencesGetAllowsPictureInPictureMediaPlayback(); -int APS5_VABI WKPreferencesGetAnimatedImageAsyncDecodingEnabled(); -int APS5_VABI WKPreferencesGetAntialiasedFontDilationEnabled(); -int APS5_VABI WKPreferencesGetApplePayCapabilityDisclosureAllowed(); -int APS5_VABI WKPreferencesGetApplePayEnabled(); -int APS5_VABI WKPreferencesGetArtificialPluginInitializationDelayEnabled(); -int APS5_VABI WKPreferencesGetAsynchronousPluginInitializationEnabled(); -int APS5_VABI WKPreferencesGetAsynchronousPluginInitializationEnabledForAllPlugins(); -int APS5_VABI WKPreferencesGetAsynchronousSpellCheckingEnabled(); -int APS5_VABI WKPreferencesGetAttachmentElementEnabled(); -int APS5_VABI WKPreferencesGetAudioPlaybackRequiresUserGesture(); -int APS5_VABI WKPreferencesGetAuthorAndUserStylesEnabled(); -int APS5_VABI WKPreferencesGetAutostartOriginPlugInSnapshottingEnabled(); -int APS5_VABI WKPreferencesGetBackspaceKeyNavigationEnabled(); -int APS5_VABI WKPreferencesGetBeaconAPIEnabled(); -int APS5_VABI WKPreferencesGetCSSOMViewScrollingAPIEnabled(); -int APS5_VABI WKPreferencesGetCanvasUsesAcceleratedDrawing(); -int APS5_VABI WKPreferencesGetCaptureAudioInGPUProcessEnabled(); -int APS5_VABI WKPreferencesGetCaptureAudioInUIProcessEnabled(); -int APS5_VABI WKPreferencesGetCaptureVideoInGPUProcessEnabled(); -int APS5_VABI WKPreferencesGetCaretBrowsingEnabled(); -int APS5_VABI WKPreferencesGetColorFilterEnabled(); -int APS5_VABI WKPreferencesGetCompositingBordersVisible(); -int APS5_VABI WKPreferencesGetCompositingRepaintCountersVisible(); -int APS5_VABI WKPreferencesGetContentChangeObserverEnabled(); -int APS5_VABI WKPreferencesGetCookieEnabled(); -int APS5_VABI WKPreferencesGetCrossOriginResourcePolicyEnabled(); -int APS5_VABI WKPreferencesGetCustomPasteboardDataEnabled(); -int APS5_VABI WKPreferencesGetDNSPrefetchingEnabled(); -int APS5_VABI WKPreferencesGetDOMPasteAllowed(); -int APS5_VABI WKPreferencesGetDOMTimersThrottlingEnabled(); -int APS5_VABI WKPreferencesGetDataTransferItemsEnabled(); -int APS5_VABI WKPreferencesGetDatabasesEnabled(); -int APS5_VABI WKPreferencesGetDefaultFixedFontSize(); -int APS5_VABI WKPreferencesGetDefaultFontSize(); -int APS5_VABI WKPreferencesGetDeveloperExtrasEnabled(); -int APS5_VABI WKPreferencesGetDiagnosticLoggingEnabled(); -int APS5_VABI WKPreferencesGetDirectoryUploadEnabled(); -int APS5_VABI WKPreferencesGetDownloadAttributeEnabled(); -int APS5_VABI WKPreferencesGetEditableLinkBehavior(); -int APS5_VABI WKPreferencesGetEnableInheritURIQueryComponent(); -int APS5_VABI WKPreferencesGetEncodingDetectorEnabled(); -int APS5_VABI WKPreferencesGetEncryptedMediaAPIEnabled(); -int APS5_VABI WKPreferencesGetEnumeratingAllNetworkInterfacesEnabled(); -int APS5_VABI WKPreferencesGetFetchAPIEnabled(); -int APS5_VABI WKPreferencesGetFetchAPIKeepAliveEnabled(); -int APS5_VABI WKPreferencesGetFileAccessFromFileURLsAllowed(); -int APS5_VABI WKPreferencesGetForceFTPDirectoryListings(); -int APS5_VABI WKPreferencesGetFrameFlatteningEnabled(); -int APS5_VABI WKPreferencesGetFullScreenEnabled(); -int APS5_VABI WKPreferencesGetGamepadsEnabled(); -int APS5_VABI WKPreferencesGetHTTPEquivEnabled(); -int APS5_VABI WKPreferencesGetHiddenPageCSSAnimationSuspensionEnabled(); -int APS5_VABI WKPreferencesGetHiddenPageDOMTimerThrottlingAutoIncreases(); -int APS5_VABI WKPreferencesGetHiddenPageDOMTimerThrottlingEnabled(); -int APS5_VABI WKPreferencesGetHighlightAPIEnabled(); -int APS5_VABI WKPreferencesGetHixie76WebSocketProtocolEnabled(); -int APS5_VABI WKPreferencesGetHyperlinkAuditingEnabled(); -int APS5_VABI WKPreferencesGetICECandidateFilteringEnabled(); -int APS5_VABI WKPreferencesGetIgnoreViewportScalingConstraints(); -int APS5_VABI WKPreferencesGetImageControlsEnabled(); -int APS5_VABI WKPreferencesGetInactiveMediaCaptureSteamRepromptIntervalInMinutes(); -int APS5_VABI WKPreferencesGetIncrementalRenderingSuppressionTimeout(); -int APS5_VABI WKPreferencesGetInlineMediaPlaybackRequiresPlaysInlineAttribute(); -int APS5_VABI WKPreferencesGetInteractiveFormValidationEnabled(); -int APS5_VABI WKPreferencesGetIntersectionObserverEnabled(); -int APS5_VABI WKPreferencesGetInvisibleMediaAutoplayPermitted(); -int APS5_VABI WKPreferencesGetIsAccessibilityIsolatedTreeEnabled(); -int APS5_VABI WKPreferencesGetIsSecureContextAttributeEnabled(); -int APS5_VABI WKPreferencesGetJavaEnabled(); -int APS5_VABI WKPreferencesGetJavaScriptCanAccessClipboard(); -int APS5_VABI WKPreferencesGetJavaScriptCanOpenWindowsAutomatically(); -int APS5_VABI WKPreferencesGetJavaScriptEnabled(); -int APS5_VABI WKPreferencesGetJavaScriptMarkupEnabled(); -int APS5_VABI WKPreferencesGetJavaScriptRuntimeFlags(); -int APS5_VABI WKPreferencesGetKeygenElementEnabled(); -int APS5_VABI WKPreferencesGetLargeImageAsyncDecodingEnabled(); -int APS5_VABI WKPreferencesGetLegacyEncryptedMediaAPIEnabled(); -int APS5_VABI WKPreferencesGetLinkPreloadEnabled(); -int APS5_VABI WKPreferencesGetLoadsImagesAutomatically(); -int APS5_VABI WKPreferencesGetLoadsSiteIconsIgnoringImageLoadingPreference(); -int APS5_VABI WKPreferencesGetLocalStorageEnabled(); -int APS5_VABI WKPreferencesGetLogsPageMessagesToSystemConsoleEnabled(); -int APS5_VABI WKPreferencesGetLongMousePressEnabled(); -int APS5_VABI WKPreferencesGetMainContentUserGestureOverrideEnabled(); -int APS5_VABI WKPreferencesGetMediaCapabilitiesEnabled(); -int APS5_VABI WKPreferencesGetMediaCaptureRequiresSecureConnection(); -int APS5_VABI WKPreferencesGetMediaControlsScaleWithPageZoom(); -int APS5_VABI WKPreferencesGetMediaDevicesEnabled(); -int APS5_VABI WKPreferencesGetMediaPlayable(); -int APS5_VABI WKPreferencesGetMediaPlaybackAllowsInline(); -int APS5_VABI WKPreferencesGetMediaPlaybackRequiresUserGesture(); -int APS5_VABI WKPreferencesGetMediaPreloadingEnabled(); -int APS5_VABI WKPreferencesGetMediaSourceEnabled(); -int APS5_VABI WKPreferencesGetMediaStreamEnabled(); -int APS5_VABI WKPreferencesGetMediaUserGestureInheritsFromDocument(); -int APS5_VABI WKPreferencesGetMenuItemElementEnabled(); -int APS5_VABI WKPreferencesGetMetaRefreshEnabled(); -int APS5_VABI WKPreferencesGetMinimumFontSize(); -int APS5_VABI WKPreferencesGetMinimumZoomFontSize(); -int APS5_VABI WKPreferencesGetMockCaptureDevicesEnabled(); -int APS5_VABI WKPreferencesGetMockScrollbarsEnabled(); -int APS5_VABI WKPreferencesGetNeedsSiteSpecificQuirks(); -int APS5_VABI WKPreferencesGetNeedsStorageAccessFromFileURLsQuirk(); -int APS5_VABI WKPreferencesGetNewBlockInsideInlineModelEnabled(); -int APS5_VABI WKPreferencesGetNotificationsEnabled(); -int APS5_VABI WKPreferencesGetOfflineWebApplicationCacheEnabled(); -int APS5_VABI WKPreferencesGetPDFPluginEnabled(); -int APS5_VABI WKPreferencesGetPageCacheEnabled(); -int APS5_VABI WKPreferencesGetPageCacheSupportsPlugins(); -int APS5_VABI WKPreferencesGetPageVisibilityBasedProcessSuppressionEnabled(); -int APS5_VABI WKPreferencesGetPaginateDuringLayoutEnabled(); -int APS5_VABI WKPreferencesGetPaintTimingEnabled(); -int APS5_VABI WKPreferencesGetPeerConnectionEnabled(); -int APS5_VABI WKPreferencesGetPlugInSnapshottingEnabled(); -int APS5_VABI WKPreferencesGetPluginSandboxProfilesEnabledForAllPlugins(); -int APS5_VABI WKPreferencesGetPluginsEnabled(); -int APS5_VABI WKPreferencesGetPrimaryPlugInSnapshotDetectionEnabled(); -int APS5_VABI WKPreferencesGetPrivateBrowsingEnabled(); -int APS5_VABI WKPreferencesGetProcessSwapOnNavigationEnabled(); -int APS5_VABI WKPreferencesGetPunchOutWhiteBackgroundsInDarkMode(); int APS5_VABI WKPreferencesGetQTKitEnabled(); -int APS5_VABI WKPreferencesGetReferrerPolicyAttributeEnabled(); -int APS5_VABI WKPreferencesGetRemotePlaybackEnabled(); -int APS5_VABI WKPreferencesGetRequestAnimationFrameEnabled(); -int APS5_VABI WKPreferencesGetResourceTimingEnabled(); -int APS5_VABI WKPreferencesGetResourceUsageOverlayVisible(); -int APS5_VABI WKPreferencesGetRestrictedHTTPResponseAccess(); -int APS5_VABI WKPreferencesGetScrollingPerformanceLoggingEnabled(); -int APS5_VABI WKPreferencesGetSelectTrailingWhitespaceEnabled(); -int APS5_VABI WKPreferencesGetServerTimingEnabled(); -int APS5_VABI WKPreferencesGetServiceControlsEnabled(); -int APS5_VABI WKPreferencesGetShouldAllowUserInstalledFonts(); -int APS5_VABI WKPreferencesGetShouldConvertPositionStyleOnCopy(); -int APS5_VABI WKPreferencesGetShouldDisplayCaptions(); -int APS5_VABI WKPreferencesGetShouldDisplaySubtitles(); -int APS5_VABI WKPreferencesGetShouldDisplayTextDescriptions(); -int APS5_VABI WKPreferencesGetShouldPrintBackgrounds(); -int APS5_VABI WKPreferencesGetShouldRespectImageOrientation(); -int APS5_VABI WKPreferencesGetShouldSuppressKeyboardInputDuringProvisionalNavigation(); -int APS5_VABI WKPreferencesGetShouldUseServiceWorkerShortTimeout(); -int APS5_VABI WKPreferencesGetShowsToolTipOverTruncatedText(); -int APS5_VABI WKPreferencesGetShowsURLsInToolTipsEnabled(); -int APS5_VABI WKPreferencesGetSmartInsertDeleteEnabled(); -int APS5_VABI WKPreferencesGetSnapshotAllPlugIns(); -int APS5_VABI WKPreferencesGetSourceBufferChangeTypeEnabled(); -int APS5_VABI WKPreferencesGetSpatialNavigationEnabled(); -int APS5_VABI WKPreferencesGetStorageAccessAPIEnabled(); -int APS5_VABI WKPreferencesGetStorageBlockingPolicy(); -int APS5_VABI WKPreferencesGetSubpixelAntialiasedLayerTextEnabled(); -int APS5_VABI WKPreferencesGetSubpixelCSSOMElementMetricsEnabled(); -int APS5_VABI WKPreferencesGetSuppressesIncrementalRendering(); -int APS5_VABI WKPreferencesGetSyntheticEditingCommandsEnabled(); -int APS5_VABI WKPreferencesGetTabsToLinks(); -int APS5_VABI WKPreferencesGetTelephoneNumberParsingEnabled(); -int APS5_VABI WKPreferencesGetTextAreasAreResizable(); -int APS5_VABI WKPreferencesGetTextAutosizingEnabled(); -int APS5_VABI WKPreferencesGetTextAutosizingUsesIdempotentMode(); -int APS5_VABI WKPreferencesGetThreadedScrollingEnabled(); -int APS5_VABI WKPreferencesGetTiledScrollingIndicatorVisible(); -int APS5_VABI WKPreferencesGetTopNavigationToDataURLsAllowed(); int APS5_VABI WKPreferencesGetTypeID(); -int APS5_VABI WKPreferencesGetUniversalAccessFromFileURLsAllowed(); -int APS5_VABI WKPreferencesGetUseGiantTiles(); -int APS5_VABI WKPreferencesGetUserInterfaceDirectionPolicy(); -int APS5_VABI WKPreferencesGetUserTimingEnabled(); -int APS5_VABI WKPreferencesGetVideoPlaybackRequiresUserGesture(); -int APS5_VABI WKPreferencesGetViewGestureDebuggingEnabled(); -int APS5_VABI WKPreferencesGetVisibleDebugOverlayRegions(); -int APS5_VABI WKPreferencesGetWebArchiveDebugModeEnabled(); -int APS5_VABI WKPreferencesGetWebAudioEnabled(); -int APS5_VABI WKPreferencesGetWebAuthenticationEnabled(); -int APS5_VABI WKPreferencesGetWebGLEnabled(); -int APS5_VABI WKPreferencesGetWebSQLDisabled(); -int APS5_VABI WKPreferencesGetWebSecurityEnabled(); -int APS5_VABI WKPreferencesGetWebShareEnabled(); -int APS5_VABI WKPreferencesGetXSSAuditorEnabled(); -int APS5_VABI WKPreferencesResetAllInternalDebugFeatures(); -int APS5_VABI WKPreferencesSetAVFoundationEnabled(); -int APS5_VABI WKPreferencesSetAVFoundationNSURLSessionEnabled(); int APS5_VABI WKPreferencesSetAccelerated2DCanvasEnabled(); -int APS5_VABI WKPreferencesSetAcceleratedCompositingEnabled(); -int APS5_VABI WKPreferencesSetAcceleratedDrawingEnabled(); -int APS5_VABI WKPreferencesSetAggressiveTileRetentionEnabled(); -int APS5_VABI WKPreferencesSetAllowCrossOriginSubresourcesToAskForCredentials(); -int APS5_VABI WKPreferencesSetAllowMediaContentTypesRequiringHardwareSupportAsFallback(); -int APS5_VABI WKPreferencesSetAllowsAirPlayForMediaPlayback(); -int APS5_VABI WKPreferencesSetAllowsPictureInPictureMediaPlayback(); -int APS5_VABI WKPreferencesSetAnimatedImageAsyncDecodingEnabled(); -int APS5_VABI WKPreferencesSetAntialiasedFontDilationEnabled(); -int APS5_VABI WKPreferencesSetApplePayCapabilityDisclosureAllowed(); -int APS5_VABI WKPreferencesSetApplePayEnabled(); -int APS5_VABI WKPreferencesSetArtificialPluginInitializationDelayEnabled(); -int APS5_VABI WKPreferencesSetAsynchronousPluginInitializationEnabled(); -int APS5_VABI WKPreferencesSetAsynchronousPluginInitializationEnabledForAllPlugins(); -int APS5_VABI WKPreferencesSetAsynchronousSpellCheckingEnabled(); -int APS5_VABI WKPreferencesSetAttachmentElementEnabled(); -int APS5_VABI WKPreferencesSetAudioPlaybackRequiresUserGesture(); -int APS5_VABI WKPreferencesSetAuthorAndUserStylesEnabled(); -int APS5_VABI WKPreferencesSetBackspaceKeyNavigationEnabled(); -int APS5_VABI WKPreferencesSetBeaconAPIEnabled(); -int APS5_VABI WKPreferencesSetCSSOMViewScrollingAPIEnabled(); -int APS5_VABI WKPreferencesSetCaptureAudioInGPUProcessEnabled(); -int APS5_VABI WKPreferencesSetCaptureAudioInUIProcessEnabled(); -int APS5_VABI WKPreferencesSetCaptureVideoInGPUProcessEnabled(); -int APS5_VABI WKPreferencesSetCaptureVideoInUIProcessEnabled(); -int APS5_VABI WKPreferencesSetCaretBrowsingEnabled(); -int APS5_VABI WKPreferencesSetColorFilterEnabled(); -int APS5_VABI WKPreferencesSetCompositingBordersVisible(); -int APS5_VABI WKPreferencesSetCompositingRepaintCountersVisible(); -int APS5_VABI WKPreferencesSetCookieEnabled(); -int APS5_VABI WKPreferencesSetCrossOriginResourcePolicyEnabled(); -int APS5_VABI WKPreferencesSetCursiveFontFamily(); -int APS5_VABI WKPreferencesSetCustomPasteboardDataEnabled(); -int APS5_VABI WKPreferencesSetDNSPrefetchingEnabled(); -int APS5_VABI WKPreferencesSetDOMPasteAllowed(); -int APS5_VABI WKPreferencesSetDOMTimersThrottlingEnabled(); -int APS5_VABI WKPreferencesSetDataTransferItemsEnabled(); -int APS5_VABI WKPreferencesSetDatabasesEnabled(); -int APS5_VABI WKPreferencesSetDefaultFixedFontSize(); -int APS5_VABI WKPreferencesSetDefaultFontSize(); -int APS5_VABI WKPreferencesSetDefaultTextEncodingName(); -int APS5_VABI WKPreferencesSetDeveloperExtrasEnabled(); -int APS5_VABI WKPreferencesSetDiagnosticLoggingEnabled(); -int APS5_VABI WKPreferencesSetDirectoryUploadEnabled(); -int APS5_VABI WKPreferencesSetDownloadAttributeEnabled(); -int APS5_VABI WKPreferencesSetEditableLinkBehavior(); -int APS5_VABI WKPreferencesSetEnableInheritURIQueryComponent(); -int APS5_VABI WKPreferencesSetEncodingDetectorEnabled(); -int APS5_VABI WKPreferencesSetEncryptedMediaAPIEnabled(); -int APS5_VABI WKPreferencesSetEnumeratingAllNetworkInterfacesEnabled(); -int APS5_VABI WKPreferencesSetExperimentalFeatureForKey(); -int APS5_VABI WKPreferencesSetFTPDirectoryTemplatePath(); -int APS5_VABI WKPreferencesSetFantasyFontFamily(); -int APS5_VABI WKPreferencesSetFetchAPIEnabled(); -int APS5_VABI WKPreferencesSetFetchAPIKeepAliveEnabled(); -int APS5_VABI WKPreferencesSetFileAccessFromFileURLsAllowed(); -int APS5_VABI WKPreferencesSetFixedFontFamily(); -int APS5_VABI WKPreferencesSetForceFTPDirectoryListings(); -int APS5_VABI WKPreferencesSetFrameFlatteningEnabled(); -int APS5_VABI WKPreferencesSetFullScreenEnabled(); -int APS5_VABI WKPreferencesSetGamepadsEnabled(); -int APS5_VABI WKPreferencesSetHTTPEquivEnabled(); -int APS5_VABI WKPreferencesSetHiddenPageCSSAnimationSuspensionEnabled(); -int APS5_VABI WKPreferencesSetHiddenPageDOMTimerThrottlingAutoIncreases(); -int APS5_VABI WKPreferencesSetHiddenPageDOMTimerThrottlingEnabled(); -int APS5_VABI WKPreferencesSetHighlightAPIEnabled(); -int APS5_VABI WKPreferencesSetHixie76WebSocketProtocolEnabled(); -int APS5_VABI WKPreferencesSetHyperlinkAuditingEnabled(); -int APS5_VABI WKPreferencesSetICECandidateFilteringEnabled(); -int APS5_VABI WKPreferencesSetIgnoreViewportScalingConstraints(); -int APS5_VABI WKPreferencesSetImageControlsEnabled(); -int APS5_VABI WKPreferencesSetInactiveMediaCaptureSteamRepromptIntervalInMinutes(); -int APS5_VABI WKPreferencesSetIncrementalRenderingSuppressionTimeout(); -int APS5_VABI WKPreferencesSetInlineMediaPlaybackRequiresPlaysInlineAttribute(); -int APS5_VABI WKPreferencesSetInteractiveFormValidationEnabled(); -int APS5_VABI WKPreferencesSetInternalDebugFeatureForKey(); -int APS5_VABI WKPreferencesSetIntersectionObserverEnabled(); -int APS5_VABI WKPreferencesSetInvisibleMediaAutoplayPermitted(); -int APS5_VABI WKPreferencesSetIsAccessibilityIsolatedTreeEnabled(); -int APS5_VABI WKPreferencesSetIsSecureContextAttributeEnabled(); -int APS5_VABI WKPreferencesSetJavaEnabled(); -int APS5_VABI WKPreferencesSetJavaScriptCanAccessClipboard(); -int APS5_VABI WKPreferencesSetJavaScriptCanOpenWindowsAutomatically(); -int APS5_VABI WKPreferencesSetJavaScriptEnabled(); -int APS5_VABI WKPreferencesSetJavaScriptMarkupEnabled(); -int APS5_VABI WKPreferencesSetJavaScriptRuntimeFlags(); -int APS5_VABI WKPreferencesSetKeygenElementEnabled(); -int APS5_VABI WKPreferencesSetLargeImageAsyncDecodingEnabled(); -int APS5_VABI WKPreferencesSetLegacyEncryptedMediaAPIEnabled(); -int APS5_VABI WKPreferencesSetLinkPreloadEnabled(); -int APS5_VABI WKPreferencesSetLoadsImagesAutomatically(); -int APS5_VABI WKPreferencesSetLoadsSiteIconsIgnoringImageLoadingPreference(); -int APS5_VABI WKPreferencesSetLocalFileContentSniffingEnabled(); -int APS5_VABI WKPreferencesSetLocalStorageEnabled(); -int APS5_VABI WKPreferencesSetLogsPageMessagesToSystemConsoleEnabled(); -int APS5_VABI WKPreferencesSetLongMousePressEnabled(); -int APS5_VABI WKPreferencesSetMainContentUserGestureOverrideEnabled(); -int APS5_VABI WKPreferencesSetMediaCapabilitiesEnabled(); -int APS5_VABI WKPreferencesSetMediaCaptureRequiresSecureConnection(); -int APS5_VABI WKPreferencesSetMediaContentTypesRequiringHardwareSupport(); -int APS5_VABI WKPreferencesSetMediaControlsScaleWithPageZoom(); -int APS5_VABI WKPreferencesSetMediaDevicesEnabled(); -int APS5_VABI WKPreferencesSetMediaPlayable(); -int APS5_VABI WKPreferencesSetMediaPlaybackAllowsInline(); -int APS5_VABI WKPreferencesSetMediaPlaybackRequiresUserGesture(); -int APS5_VABI WKPreferencesSetMediaPreloadingEnabled(); -int APS5_VABI WKPreferencesSetMediaSourceEnabled(); -int APS5_VABI WKPreferencesSetMediaStreamEnabled(); -int APS5_VABI WKPreferencesSetMediaUserGestureInheritsFromDocument(); -int APS5_VABI WKPreferencesSetMenuItemElementEnabled(); -int APS5_VABI WKPreferencesSetMetaRefreshEnabled(); -int APS5_VABI WKPreferencesSetMinimumFontSize(); -int APS5_VABI WKPreferencesSetMinimumZoomFontSize(); -int APS5_VABI WKPreferencesSetMockCaptureDevicesEnabled(); -int APS5_VABI WKPreferencesSetMockScrollbarsEnabled(); -int APS5_VABI WKPreferencesSetNeedsSiteSpecificQuirks(); -int APS5_VABI WKPreferencesSetNeedsStorageAccessFromFileURLsQuirk(); -int APS5_VABI WKPreferencesSetNewBlockInsideInlineModelEnabled(); -int APS5_VABI WKPreferencesSetNotificationsEnabled(); -int APS5_VABI WKPreferencesSetOfflineWebApplicationCacheEnabled(); -int APS5_VABI WKPreferencesSetPDFPluginEnabled(); -int APS5_VABI WKPreferencesSetPageCacheEnabled(); -int APS5_VABI WKPreferencesSetPageCacheSupportsPlugins(); -int APS5_VABI WKPreferencesSetPageVisibilityBasedProcessSuppressionEnabled(); -int APS5_VABI WKPreferencesSetPaginateDuringLayoutEnabled(); -int APS5_VABI WKPreferencesSetPaintTimingEnabled(); -int APS5_VABI WKPreferencesSetPeerConnectionEnabled(); -int APS5_VABI WKPreferencesSetPictographFontFamily(); -int APS5_VABI WKPreferencesSetPlugInSnapshottingEnabled(); -int APS5_VABI WKPreferencesSetPluginSandboxProfilesEnabledForAllPlugins(); -int APS5_VABI WKPreferencesSetPluginsEnabled(); -int APS5_VABI WKPreferencesSetPrimaryPlugInSnapshotDetectionEnabled(); -int APS5_VABI WKPreferencesSetPrivateBrowsingEnabled(); -int APS5_VABI WKPreferencesSetProcessSwapOnNavigationEnabled(); -int APS5_VABI WKPreferencesSetPunchOutWhiteBackgroundsInDarkMode(); int APS5_VABI WKPreferencesSetQTKitEnabled(); -int APS5_VABI WKPreferencesSetReferrerPolicyAttributeEnabled(); -int APS5_VABI WKPreferencesSetRemotePlaybackEnabled(); -int APS5_VABI WKPreferencesSetRequestAnimationFrameEnabled(); -int APS5_VABI WKPreferencesSetResourceTimingEnabled(); -int APS5_VABI WKPreferencesSetResourceUsageOverlayVisible(); -int APS5_VABI WKPreferencesSetRestrictedHTTPResponseAccess(); -int APS5_VABI WKPreferencesSetSansSerifFontFamily(); -int APS5_VABI WKPreferencesSetScrollingPerformanceLoggingEnabled(); -int APS5_VABI WKPreferencesSetSelectTrailingWhitespaceEnabled(); -int APS5_VABI WKPreferencesSetSerifFontFamily(); -int APS5_VABI WKPreferencesSetServerTimingEnabled(); -int APS5_VABI WKPreferencesSetServiceControlsEnabled(); -int APS5_VABI WKPreferencesSetShouldAllowUserInstalledFonts(); -int APS5_VABI WKPreferencesSetShouldConvertPositionStyleOnCopy(); -int APS5_VABI WKPreferencesSetShouldDisplayCaptions(); -int APS5_VABI WKPreferencesSetShouldDisplaySubtitles(); -int APS5_VABI WKPreferencesSetShouldDisplayTextDescriptions(); -int APS5_VABI WKPreferencesSetShouldPrintBackgrounds(); -int APS5_VABI WKPreferencesSetShouldRespectImageOrientation(); -int APS5_VABI WKPreferencesSetShouldSuppressKeyboardInputDuringProvisionalNavigation(); -int APS5_VABI WKPreferencesSetShouldUseServiceWorkerShortTimeout(); -int APS5_VABI WKPreferencesSetShowsToolTipOverTruncatedText(); -int APS5_VABI WKPreferencesSetShowsURLsInToolTipsEnabled(); -int APS5_VABI WKPreferencesSetSmartInsertDeleteEnabled(); -int APS5_VABI WKPreferencesSetSnapshotAllPlugIns(); -int APS5_VABI WKPreferencesSetSourceBufferChangeTypeEnabled(); -int APS5_VABI WKPreferencesSetSpatialNavigationEnabled(); -int APS5_VABI WKPreferencesSetStorageAccessAPIEnabled(); -int APS5_VABI WKPreferencesSetStorageBlockingPolicy(); -int APS5_VABI WKPreferencesSetSubpixelAntialiasedLayerTextEnabled(); -int APS5_VABI WKPreferencesSetSubpixelCSSOMElementMetricsEnabled(); -int APS5_VABI WKPreferencesSetSuppressesIncrementalRendering(); -int APS5_VABI WKPreferencesSetSyntheticEditingCommandsEnabled(); -int APS5_VABI WKPreferencesSetTabsToLinks(); -int APS5_VABI WKPreferencesSetTelephoneNumberParsingEnabled(); -int APS5_VABI WKPreferencesSetTextAreasAreResizable(); -int APS5_VABI WKPreferencesSetTextAutosizingEnabled(); -int APS5_VABI WKPreferencesSetTextAutosizingUsesIdempotentMode(); -int APS5_VABI WKPreferencesSetThreadedScrollingEnabled(); -int APS5_VABI WKPreferencesSetTiledScrollingIndicatorVisible(); -int APS5_VABI WKPreferencesSetTopNavigationToDataURLsAllowed(); -int APS5_VABI WKPreferencesSetUniversalAccessFromFileURLsAllowed(); -int APS5_VABI WKPreferencesSetUseGiantTiles(); -int APS5_VABI WKPreferencesSetUserInterfaceDirectionPolicy(); -int APS5_VABI WKPreferencesSetUserTimingEnabled(); -int APS5_VABI WKPreferencesSetVideoPlaybackRequiresUserGesture(); -int APS5_VABI WKPreferencesSetViewGestureDebuggingEnabled(); -int APS5_VABI WKPreferencesSetVisibleDebugOverlayRegions(); -int APS5_VABI WKPreferencesSetWebArchiveDebugModeEnabled(); -int APS5_VABI WKPreferencesSetWebAudioEnabled(); -int APS5_VABI WKPreferencesSetWebAuthenticationEnabled(); -int APS5_VABI WKPreferencesSetWebGLEnabled(); -int APS5_VABI WKPreferencesSetWebSQLDisabled(); -int APS5_VABI WKPreferencesSetWebSecurityEnabled(); -int APS5_VABI WKPreferencesSetWebShareEnabled(); -int APS5_VABI WKPreferencesSetXSSAuditorEnabled(); int APS5_VABI WKProtectionSpaceCopyCertificateInfo(); int APS5_VABI WKProtectionSpaceCopyHost(); int APS5_VABI WKProtectionSpaceCopyRealm(); @@ -1427,12 +766,7 @@ int APS5_VABI WKProtectionSpaceGetIsProxy(); int APS5_VABI WKProtectionSpaceGetPort(); int APS5_VABI WKProtectionSpaceGetReceivesCredentialSecurely(); int APS5_VABI WKProtectionSpaceGetServerType(); -int APS5_VABI WKProtectionSpaceGetTypeID(); -int APS5_VABI WKRectCreate(); -int APS5_VABI WKRectGetTypeID(); -int APS5_VABI WKRectGetValue(); int APS5_VABI WKRegistrableDomainCreate(); -int APS5_VABI WKRelease(); int APS5_VABI WKRemoveMockMediaDevice(); int APS5_VABI WKRenderLayerCopyElementID(); int APS5_VABI WKRenderLayerCopyElementTagName(); @@ -1446,7 +780,6 @@ int APS5_VABI WKRenderLayerGetNegativeZOrderList(); int APS5_VABI WKRenderLayerGetNormalFlowList(); int APS5_VABI WKRenderLayerGetPositiveZOrderList(); int APS5_VABI WKRenderLayerGetRenderer(); -int APS5_VABI WKRenderLayerGetTypeID(); int APS5_VABI WKRenderLayerIsClipped(); int APS5_VABI WKRenderLayerIsClipping(); int APS5_VABI WKRenderLayerIsReflection(); @@ -1459,106 +792,34 @@ int APS5_VABI WKRenderObjectGetChildren(); int APS5_VABI WKRenderObjectGetElementClassNames(); int APS5_VABI WKRenderObjectGetFrameRect(); int APS5_VABI WKRenderObjectGetTextLength(); -int APS5_VABI WKRenderObjectGetTypeID(); int APS5_VABI WKResetMockMediaDevices(); int APS5_VABI WKResourceCacheManagerClearCacheForAllOrigins(); int APS5_VABI WKResourceCacheManagerClearCacheForOrigin(); int APS5_VABI WKResourceCacheManagerGetCacheOrigins(); -int APS5_VABI WKResourceCacheManagerGetTypeID(); -int APS5_VABI WKRetain(); int APS5_VABI WKRunLoopCallOnMainThread(); int APS5_VABI WKRunLoopInitializeMain(); int APS5_VABI WKRunLoopRunMain(); int APS5_VABI WKRunLoopStopMain(); -int APS5_VABI WKSecurityOriginCopyDatabaseIdentifier(); -int APS5_VABI WKSecurityOriginCopyHost(); -int APS5_VABI WKSecurityOriginCopyProtocol(); -int APS5_VABI WKSecurityOriginCopyToString(); -int APS5_VABI WKSecurityOriginCreate(); -int APS5_VABI WKSecurityOriginCreateFromDatabaseIdentifier(); -int APS5_VABI WKSecurityOriginCreateFromString(); -int APS5_VABI WKSecurityOriginGetPort(); -int APS5_VABI WKSecurityOriginGetTypeID(); int APS5_VABI WKSendDisplayConfigurationChangedMessageForTesting(); int APS5_VABI WKSerializedScriptValueCreate(); int APS5_VABI WKSerializedScriptValueDeserialize(); -int APS5_VABI WKSerializedScriptValueGetTypeID(); int APS5_VABI WKSessionStateCopyData(); int APS5_VABI WKSessionStateCreateFromData(); -int APS5_VABI WKSessionStateGetTypeID(); -int APS5_VABI WKSizeCreate(); -int APS5_VABI WKSizeGetTypeID(); -int APS5_VABI WKSizeGetValue(); -int APS5_VABI WKStringCopyJSString(); -int APS5_VABI WKStringCreateWithJSString(); -int APS5_VABI WKStringCreateWithUTF8CString(); -int APS5_VABI WKStringGetCharacters(); -int APS5_VABI WKStringGetLength(); -int APS5_VABI WKStringGetMaximumUTF8CStringSize(); -int APS5_VABI WKStringGetTypeID(); -int APS5_VABI WKStringGetUTF8CStringNonStrict(); -int APS5_VABI WKStringGetUTF8CString(); -int APS5_VABI WKStringIsEmpty(); -int APS5_VABI WKStringIsEqualToUTF8CStringIgnoringCase(); -int APS5_VABI WKStringIsEqualToUTF8CString(); -int APS5_VABI WKStringIsEqual(); int APS5_VABI WKTextCheckerSetTestingMode(); -int APS5_VABI WKUInt64Create(); -int APS5_VABI WKUInt64GetTypeID(); -int APS5_VABI WKUInt64GetValue(); int APS5_VABI WKURLCopyHostName(); int APS5_VABI WKURLCopyLastPathComponent(); int APS5_VABI WKURLCopyPath(); int APS5_VABI WKURLCopyScheme(); -int APS5_VABI WKURLCopyString(); int APS5_VABI WKURLCreateWithBaseURL(); -int APS5_VABI WKURLCreateWithUTF8CString(); -int APS5_VABI WKURLGetTypeID(); int APS5_VABI WKURLIsEqual(); -int APS5_VABI WKURLRequestCopyFirstPartyForCookies(); -int APS5_VABI WKURLRequestCopyHTTPMethod(); -int APS5_VABI WKURLRequestCopySettingHTTPBody(); -int APS5_VABI WKURLRequestCopyURL(); -int APS5_VABI WKURLRequestCreateWithWKURL(); -int APS5_VABI WKURLRequestGetTypeID(); -int APS5_VABI WKURLRequestSetDefaultTimeoutInterval(); -int APS5_VABI WKURLResponseCopyMIMEType(); -int APS5_VABI WKURLResponseCopySuggestedFilename(); -int APS5_VABI WKURLResponseCopyURL(); -int APS5_VABI WKURLResponseGetExpectedContentLength(); -int APS5_VABI WKURLResponseGetTypeID(); -int APS5_VABI WKURLResponseHTTPStatusCode(); -int APS5_VABI WKURLResponseIsAttachment(); -int APS5_VABI WKUserContentControllerAddUserContentFilter(); -int APS5_VABI WKUserContentControllerAddUserScript(); -int APS5_VABI WKUserContentControllerCopyUserScripts(); -int APS5_VABI WKUserContentControllerCreate(); -int APS5_VABI WKUserContentControllerGetTypeID(); -int APS5_VABI WKUserContentControllerRemoveAllUserContentFilters(); -int APS5_VABI WKUserContentControllerRemoveAllUserScripts(); int APS5_VABI WKUserContentExtensionStoreCompile(); int APS5_VABI WKUserContentExtensionStoreCreate(); -int APS5_VABI WKUserContentExtensionStoreGetTypeID(); int APS5_VABI WKUserContentExtensionStoreLookup(); -int APS5_VABI WKUserContentURLPatternCopyHost(); -int APS5_VABI WKUserContentURLPatternCopyScheme(); -int APS5_VABI WKUserContentURLPatternCreate(); -int APS5_VABI WKUserContentURLPatternGetTypeID(); -int APS5_VABI WKUserContentURLPatternIsValid(); -int APS5_VABI WKUserContentURLPatternMatchesSubdomains(); -int APS5_VABI WKUserContentURLPatternMatchesURL(); -int APS5_VABI WKUserMediaPermissionCheckGetTypeID(); int APS5_VABI WKUserMediaPermissionCheckSetUserMediaAccessInfo(); int APS5_VABI WKUserMediaPermissionRequestAllow(); int APS5_VABI WKUserMediaPermissionRequestAudioDeviceUIDs(); int APS5_VABI WKUserMediaPermissionRequestDeny(); -int APS5_VABI WKUserMediaPermissionRequestGetTypeID(); int APS5_VABI WKUserMediaPermissionRequestVideoDeviceUIDs(); -int APS5_VABI WKUserScriptCopySource(); -int APS5_VABI WKUserScriptCreateWithSource(); -int APS5_VABI WKUserScriptGetInjectionTime(); -int APS5_VABI WKUserScriptGetMainFrameOnly(); -int APS5_VABI WKUserScriptGetTypeID(); int APS5_VABI WKViewAccessibilityFocusedObject(); int APS5_VABI WKViewAccessibilityHitTest(); int APS5_VABI WKViewAccessibilityRootObject(); @@ -1579,40 +840,9 @@ int APS5_VABI WKViewSetVisible(); int APS5_VABI WKViewValueChangedForPopupMenu(); int APS5_VABI WKViewWillEnterFullScreen(); int APS5_VABI WKViewWillExitFullScreen(); -int APS5_VABI WKViewportAttributesGetTypeID(); int APS5_VABI WKWebsiteDataStoreClearAllDeviceOrientationPermissions(); int APS5_VABI WKWebsiteDataStoreClearAppBoundSession(); int APS5_VABI WKWebsiteDataStoreClearBundleIdentifierInNetworkProcess(); -int APS5_VABI WKWebsiteDataStoreConfigurationCopyApplicationCacheDirectory(); -int APS5_VABI WKWebsiteDataStoreConfigurationCopyCacheStorageDirectory(); -int APS5_VABI WKWebsiteDataStoreConfigurationCopyCookieStorageFile(); -int APS5_VABI WKWebsiteDataStoreConfigurationCopyIndexedDBDatabaseDirectory(); -int APS5_VABI WKWebsiteDataStoreConfigurationCopyLocalStorageDirectory(); -int APS5_VABI WKWebsiteDataStoreConfigurationCopyMediaKeysStorageDirectory(); -int APS5_VABI WKWebsiteDataStoreConfigurationCopyNetworkCacheDirectory(); -int APS5_VABI WKWebsiteDataStoreConfigurationCopyResourceLoadStatisticsDirectory(); -int APS5_VABI WKWebsiteDataStoreConfigurationCopyServiceWorkerRegistrationDirectory(); -int APS5_VABI WKWebsiteDataStoreConfigurationCopyWebSQLDatabaseDirectory(); -int APS5_VABI WKWebsiteDataStoreConfigurationCreate(); -int APS5_VABI WKWebsiteDataStoreConfigurationGetNetworkCacheSpeculativeValidationEnabled(); -int APS5_VABI WKWebsiteDataStoreConfigurationGetPerOriginStorageQuota(); -int APS5_VABI WKWebsiteDataStoreConfigurationGetStaleWhileRevalidateEnabled(); -int APS5_VABI WKWebsiteDataStoreConfigurationGetTestingSessionEnabled(); -int APS5_VABI WKWebsiteDataStoreConfigurationGetTypeID(); -int APS5_VABI WKWebsiteDataStoreConfigurationSetApplicationCacheDirectory(); -int APS5_VABI WKWebsiteDataStoreConfigurationSetCacheStorageDirectory(); -int APS5_VABI WKWebsiteDataStoreConfigurationSetCookieStorageFile(); -int APS5_VABI WKWebsiteDataStoreConfigurationSetIndexedDBDatabaseDirectory(); -int APS5_VABI WKWebsiteDataStoreConfigurationSetLocalStorageDirectory(); -int APS5_VABI WKWebsiteDataStoreConfigurationSetMediaKeysStorageDirectory(); -int APS5_VABI WKWebsiteDataStoreConfigurationSetNetworkCacheDirectory(); -int APS5_VABI WKWebsiteDataStoreConfigurationSetNetworkCacheSpeculativeValidationEnabled(); -int APS5_VABI WKWebsiteDataStoreConfigurationSetPerOriginStorageQuota(); -int APS5_VABI WKWebsiteDataStoreConfigurationSetResourceLoadStatisticsDirectory(); -int APS5_VABI WKWebsiteDataStoreConfigurationSetServiceWorkerRegistrationDirectory(); -int APS5_VABI WKWebsiteDataStoreConfigurationSetStaleWhileRevalidateEnabled(); -int APS5_VABI WKWebsiteDataStoreConfigurationSetTestingSessionEnabled(); -int APS5_VABI WKWebsiteDataStoreConfigurationSetWebSQLDatabaseDirectory(); int APS5_VABI WKWebsiteDataStoreCreateNonPersistentDataStore(); int APS5_VABI WKWebsiteDataStoreCreateWithConfiguration(); int APS5_VABI WKWebsiteDataStoreDisableNetworkProxySettings(); @@ -1626,7 +856,6 @@ int APS5_VABI WKWebsiteDataStoreGetFetchCacheOrigins(); int APS5_VABI WKWebsiteDataStoreGetFetchCacheSizeForOrigin(); int APS5_VABI WKWebsiteDataStoreGetHTTPCookieStore(); int APS5_VABI WKWebsiteDataStoreGetResourceLoadStatisticsEnabled(); -int APS5_VABI WKWebsiteDataStoreGetTypeID(); int APS5_VABI WKWebsiteDataStoreIsStatisticsEphemeral(); int APS5_VABI WKWebsiteDataStoreIsStatisticsGrandfathered(); int APS5_VABI WKWebsiteDataStoreIsStatisticsHasHadUserInteraction(); @@ -1692,53 +921,8 @@ int APS5_VABI WKWebsiteDataStoreStatisticsProcessStatisticsAndDataRecords(); int APS5_VABI WKWebsiteDataStoreStatisticsResetToConsistentState(); int APS5_VABI WKWebsiteDataStoreStatisticsUpdateCookieBlocking(); int APS5_VABI WKWebsiteDataStoreUpdateBundleIdentifierInNetworkProcess(); -int APS5_VABI WKWebsitePoliciesCopyCustomHeaderFields(); -int APS5_VABI WKWebsitePoliciesCreate(); -int APS5_VABI WKWebsitePoliciesGetAllowedAutoplayQuirks(); -int APS5_VABI WKWebsitePoliciesGetAutoplayPolicy(); -int APS5_VABI WKWebsitePoliciesGetContentBlockersEnabled(); -int APS5_VABI WKWebsitePoliciesGetDataStore(); -int APS5_VABI WKWebsitePoliciesGetPopUpPolicy(); -int APS5_VABI WKWebsitePoliciesGetTypeID(); -int APS5_VABI WKWebsitePoliciesSetAutoplayPolicy(); -int APS5_VABI WKWebsitePoliciesSetContentBlockersEnabled(); -int APS5_VABI WKWebsitePoliciesSetCustomHeaderFields(); -int APS5_VABI WKWebsitePoliciesSetDataStore(); -int APS5_VABI WKWebsitePoliciesSetPopUpPolicy(); -int APS5_VABI WKWindowFeaturesGetTypeID(); -int APS5_VABI WTFCrashWithSecurityImplication(); -int APS5_VABI WTFCrash(); -int APS5_VABI WTFGetBacktrace(); -int APS5_VABI WTFInitializeLogChannelStatesFromString(); -int APS5_VABI WTFIsDebuggerAttached(); -int APS5_VABI WTFLogAlwaysAndCrash(); -int APS5_VABI WTFLogAlways(); -int APS5_VABI WTFLogChannelByName(); -int APS5_VABI WTFLogVerbose(); -int APS5_VABI WTFLogWithLevel(); -int APS5_VABI WTFLog(); -int APS5_VABI WTFPrintBacktrace(); -int APS5_VABI WTFReportArgumentAssertionFailure(); -int APS5_VABI WTFReportAssertionFailureWithMessage(); -int APS5_VABI WTFReportAssertionFailure(); -int APS5_VABI WTFReportBacktrace(); -int APS5_VABI WTFReportError(); -int APS5_VABI WTFReportFatalError(); -int APS5_VABI WTFReportNotImplementedYet(); -int APS5_VABI WTFWillLogWithLevel(); -int APS5_VABI _Z20WTFCrashWithInfoImpliPKcS0_im(); -int APS5_VABI _Z20WTFCrashWithInfoImpliPKcS0_imm(); -int APS5_VABI _Z20WTFCrashWithInfoImpliPKcS0_immmm(); -int APS5_VABI _Z20WTFCrashWithInfoImpliPKcS0_immmmm(); -int APS5_VABI _Z20WTFCrashWithInfoImpliPKcS0_immmmmm(); -int APS5_VABI _Z20WTFCrashWithInfoImpliPKcS0_immmmmmm(); -int APS5_VABI _Z20WTFCrashWithInfoImpliPKcS0_immm(); -int APS5_VABI _ZN13OpaqueJSClassD1Ev(); -int APS5_VABI _ZN13OpaqueJSClassD2Ev(); int APS5_VABI _ZN14OpaqueJSString9tryCreateEON3WTF6StringE(); int APS5_VABI _ZN14OpaqueJSString9tryCreateERKN3WTF6StringE(); -int APS5_VABI _ZN14OpaqueJSStringD1Ev(); -int APS5_VABI _ZN14OpaqueJSStringD2Ev(); int APS5_VABI _ZN3JSC10ConfigFile14setProcessNameEPKc(); int APS5_VABI _ZN3JSC10ConfigFile20setParentProcessNameEPKc(); int APS5_VABI _ZN3JSC10ConfigFile5parseEv(); @@ -1958,7 +1142,6 @@ int APS5_VABI _ZN3JSC16SamplingProfiler18reportTopFunctionsEv(); int APS5_VABI _ZN3JSC16SamplingProfiler39noticeCurrentThreadAsJSCExecutionThreadEv(); int APS5_VABI _ZN3JSC16SamplingProfiler5startEv(); int APS5_VABI _ZN3JSC16SymbolTableEntry16freeFatEntrySlowEv(); -int APS5_VABI _ZN3JSC16clearArrayMemsetEPdj(); int APS5_VABI _ZN3JSC16createRangeErrorEPNS_14JSGlobalObjectERKN3WTF6StringE(); int APS5_VABI _ZN3JSC16profiledEvaluateEPNS_14JSGlobalObjectENS_15ProfilingReasonERKNS_10SourceCodeENS_7JSValueERN3WTF8NakedPtrINS_9ExceptionEEE(); int APS5_VABI _ZN3JSC16setNeverOptimizeEPK15OpaqueJSContextPK13OpaqueJSValue(); @@ -2029,8 +1212,6 @@ int APS5_VABI _ZN3JSC18PropertyDescriptor15setConfigurableEb(); int APS5_VABI _ZN3JSC18PropertyDescriptor21setAccessorDescriptorEPNS_12GetterSetterEj(); int APS5_VABI _ZN3JSC18PropertyDescriptor9setGetterENS_7JSValueE(); int APS5_VABI _ZN3JSC18PropertyDescriptor9setSetterENS_7JSValueE(); -int APS5_VABI _ZN3JSC18enableSuperSamplerEv(); -int APS5_VABI _ZN3JSC18logTotalPhaseTimesEv(); int APS5_VABI _ZN3JSC19HeapSnapshotBuilder11analyzeNodeEPNS_6JSCellE(); int APS5_VABI _ZN3JSC19HeapSnapshotBuilder13buildSnapshotEv(); int APS5_VABI _ZN3JSC19HeapSnapshotBuilder15setLabelForCellEPNS_6JSCellERKN3WTF6StringE(); @@ -2062,7 +1243,6 @@ int APS5_VABI _ZN3JSC19InlineWatchpointSet7freeFatEv(); int APS5_VABI _ZN3JSC19SourceProviderCache5clearEv(); int APS5_VABI _ZN3JSC19SourceProviderCacheD1Ev(); int APS5_VABI _ZN3JSC19SourceProviderCacheD2Ev(); -int APS5_VABI _ZN3JSC19disableSuperSamplerEv(); int APS5_VABI _ZN3JSC19iteratorForIterableEPNS_14JSGlobalObjectENS_7JSValueE(); int APS5_VABI _ZN3JSC19iteratorForIterableEPNS_14JSGlobalObjectEPNS_8JSObjectENS_7JSValueE(); int APS5_VABI _ZN3JSC19numberOfDFGCompilesENS_7JSValueE(); @@ -2074,7 +1254,6 @@ int APS5_VABI _ZN3JSC20TypedArrayControllerD2Ev(); int APS5_VABI _ZN3JSC20createReferenceErrorEPNS_14JSGlobalObjectERKN3WTF6StringE(); int APS5_VABI _ZN3JSC20failNextNewCodeBlockEPK15OpaqueJSContext(); int APS5_VABI _ZN3JSC20failNextNewCodeBlockEPNS_14JSGlobalObjectE(); -int APS5_VABI _ZN3JSC20waitForVMDestructionEv(); int APS5_VABI _ZN3JSC21MarkedJSValueRefArrayC2EP15OpaqueJSContextj(); int APS5_VABI _ZN3JSC21MarkedJSValueRefArrayD1Ev(); int APS5_VABI _ZN3JSC21getInt8ArrayClassInfoEv(); @@ -2114,7 +1293,6 @@ int APS5_VABI _ZN3JSC22getUint8ArrayClassInfoEv(); int APS5_VABI _ZN3JSC22globalMemoryStatisticsEv(); int APS5_VABI _ZN3JSC22optimizeNextInvocationENS_7JSValueE(); int APS5_VABI _ZN3JSC22optimizeNextInvocationEPNS_14JSGlobalObjectEPNS_9CallFrameE(); -int APS5_VABI _ZN3JSC22printSuperSamplerStateEv(); int APS5_VABI _ZN3JSC23AbstractSamplingCounter4dumpEv(); int APS5_VABI _ZN3JSC23JSModuleNamespaceObjectC1ERNS_2VMEPNS_9StructureE(); int APS5_VABI _ZN3JSC23JSModuleNamespaceObjectC2ERNS_2VMEPNS_9StructureE(); @@ -2139,12 +1317,9 @@ int APS5_VABI _ZN3JSC24reportZappedCellAndCrashERNS_4HeapEPKNS_6JSCellE(); int APS5_VABI _ZN3JSC25JSSegmentedVariableObject12addVariablesEjNS_7JSValueE(); int APS5_VABI _ZN3JSC25JSSegmentedVariableObject17findVariableIndexEPv(); int APS5_VABI _ZN3JSC25jsStringWithCacheSlowCaseERNS_2VMERN3WTF10StringImplE(); -int APS5_VABI _ZN3JSC25numberOfOSRExitFuzzChecksEv(); int APS5_VABI _ZN3JSC26createIteratorResultObjectEPNS_14JSGlobalObjectENS_7JSValueEb(); int APS5_VABI _ZN3JSC26evaluateWithScopeExtensionEPNS_14JSGlobalObjectERKNS_10SourceCodeEPNS_8JSObjectERN3WTF8NakedPtrINS_9ExceptionEEE(); int APS5_VABI _ZN3JSC26setCannotUseOSRExitFuzzingEPNS_14JSGlobalObjectEPNS_9CallFrameE(); -int APS5_VABI _ZN3JSC27finalizeStatsAtEndOfTestingEv(); -int APS5_VABI _ZN3JSC27numberOfExceptionFuzzChecksEv(); int APS5_VABI _ZN3JSC28getHashMapBucketKeyClassInfoEv(); int APS5_VABI _ZN3JSC29constructArrayNegativeIndexedEPNS_14JSGlobalObjectEPNS_9StructureEPKNS_7JSValueEj(); int APS5_VABI _ZN3JSC29createNotEnoughArgumentsErrorEPNS_14JSGlobalObjectE(); @@ -2170,8 +1345,6 @@ int APS5_VABI _ZN3JSC2VM8whenIdleEON3WTF8FunctionIFvvEEE(); int APS5_VABI _ZN3JSC2VM9tryCreateENS_8HeapTypeEPN3WTF7RunLoopE(); int APS5_VABI _ZN3JSC2VMD1Ev(); int APS5_VABI _ZN3JSC2VMD2Ev(); -int APS5_VABI _ZN3JSC30waitForAsynchronousDisassemblyEv(); -int APS5_VABI _ZN3JSC31numberOfStaticOSRExitFuzzChecksEv(); int APS5_VABI _ZN3JSC32JSDestructibleObjectHeapCellTypeC1Ev(); int APS5_VABI _ZN3JSC32JSDestructibleObjectHeapCellTypeC2Ev(); int APS5_VABI _ZN3JSC32JSDestructibleObjectHeapCellTypeD0Ev(); @@ -2180,7 +1353,6 @@ int APS5_VABI _ZN3JSC32JSDestructibleObjectHeapCellTypeD2Ev(); int APS5_VABI _ZN3JSC32throwDOMAttributeGetterTypeErrorEPNS_14JSGlobalObjectERNS_10ThrowScopeEPKNS_9ClassInfoENS_12PropertyNameE(); int APS5_VABI _ZN3JSC33getHashMapBucketKeyValueClassInfoEv(); int APS5_VABI _ZN3JSC35getSomeBaselineCodeBlockForFunctionENS_7JSValueE(); -int APS5_VABI _ZN3JSC38numberOfExecutableAllocationFuzzChecksEv(); int APS5_VABI _ZN3JSC3DFG18getNumCompilationsEv(); int APS5_VABI _ZN3JSC41constructFunctionSkippingEvalEnabledCheckEPNS_14JSGlobalObjectERKNS_7ArgListERKNS_10IdentifierERKNS_12SourceOriginERKN3WTF6StringERKNSB_12TextPositionEiNS_24FunctionConstructionModeENS_7JSValueE(); int APS5_VABI _ZN3JSC41constructObjectFromPropertyDescriptorSlowEPNS_14JSGlobalObjectERKNS_18PropertyDescriptorE(); @@ -2358,7 +1530,6 @@ int APS5_VABI _ZN3JSC9Structure8isSealedERNS_2VME(); int APS5_VABI _ZN3JSC9StructureC1ERNS_2VMEPNS_14JSGlobalObjectENS_7JSValueERKNS_8TypeInfoEPKNS_9ClassInfoEhj(); int APS5_VABI _ZN3JSC9StructureC2ERNS_2VMEPNS_14JSGlobalObjectENS_7JSValueERKNS_8TypeInfoEPKNS_9ClassInfoEhj(); int APS5_VABI _ZN3JSC9constructEPNS_14JSGlobalObjectENS_7JSValueERKNS_8CallDataERKNS_7ArgListES2_(); -int APS5_VABI _ZN3PAL10systemBeepEv(); int APS5_VABI _ZN3PAL12CryptoDigest11computeHashEv(); int APS5_VABI _ZN3PAL12CryptoDigest8addBytesEPKvm(); int APS5_VABI _ZN3PAL12CryptoDigestD1Ev(); @@ -2388,15 +1559,8 @@ int APS5_VABI _ZN3WTF10ParkingLot13unparkOneImplEPKvRKNS_12ScopedLambdaIFlNS0_12 int APS5_VABI _ZN3WTF10ParkingLot21parkConditionallyImplEPKvRKNS_12ScopedLambdaIFbvEEERKNS3_IFvvEEERKNS_24TimeWithDynamicClockTypeE(); int APS5_VABI _ZN3WTF10ParkingLot9unparkAllEPKv(); int APS5_VABI _ZN3WTF10ParkingLot9unparkOneEPKv(); -int APS5_VABI _ZN3WTF10StringImpl11reverseFindEDsj(); int APS5_VABI _ZN3WTF10StringImpl17utf8ForCharactersEPKDsjNS_14ConversionModeE(); int APS5_VABI _ZN3WTF10StringImpl17utf8ForCharactersEPKhj(); -int APS5_VABI _ZN3WTF10StringImpl19characterStartingAtEj(); -int APS5_VABI _ZN3WTF10StringImpl19createUninitializedEjRPDs(); -int APS5_VABI _ZN3WTF10StringImpl19createUninitializedEjRPh(); -int APS5_VABI _ZN3WTF10StringImpl20create8BitIfPossibleEPKDsj(); -int APS5_VABI _ZN3WTF10StringImpl23convertToASCIILowercaseEv(); -int APS5_VABI _ZN3WTF10StringImpl23convertToASCIIUppercaseEv(); int APS5_VABI _ZN3WTF10StringImpl28convertToLowercaseWithLocaleERKNS_10AtomStringE(); int APS5_VABI _ZN3WTF10StringImpl28convertToUppercaseWithLocaleERKNS_10AtomStringE(); int APS5_VABI _ZN3WTF10StringImpl31convertToLowercaseWithoutLocaleEv(); @@ -2404,12 +1568,9 @@ int APS5_VABI _ZN3WTF10StringImpl31convertToUppercaseWithoutLocaleEv(); int APS5_VABI _ZN3WTF10StringImpl57convertToLowercaseWithoutLocaleStartingAtFailingIndex8BitEj(); int APS5_VABI _ZN3WTF10StringImpl5adoptEONS_12StringBufferIDsEE(); int APS5_VABI _ZN3WTF10StringImpl5adoptEONS_12StringBufferIhEE(); -int APS5_VABI _ZN3WTF10StringImpl6createEPKDsj(); -int APS5_VABI _ZN3WTF10StringImpl6createEPKhj(); int APS5_VABI _ZN3WTF10StringImpl7destroyEPS0_(); int APS5_VABI _ZN3WTF10StringImpl7replaceEDsDs(); int APS5_VABI _ZN3WTF10StringImpl7replaceEDsPKhj(); -int APS5_VABI _ZN3WTF10StringImpl9substringEjj(); int APS5_VABI _ZN3WTF10StringView11SplitResult8Iterator17findNextSubstringEv(); int APS5_VABI _ZN3WTF10StringView11SplitResult8IteratorppEv(); int APS5_VABI _ZN3WTF10StringView16GraphemeClusters8IteratorC1EOS2_(); @@ -2444,12 +1605,7 @@ int APS5_VABI _ZN3WTF10WorkerPoolC1ENS_12ASCIILiteralEjNS_7SecondsE(); int APS5_VABI _ZN3WTF10WorkerPoolC2ENS_12ASCIILiteralEjNS_7SecondsE(); int APS5_VABI _ZN3WTF10WorkerPoolD1Ev(); int APS5_VABI _ZN3WTF10WorkerPoolD2Ev(); -int APS5_VABI _ZN3WTF10fastCallocEmm(); -int APS5_VABI _ZN3WTF10fastMallocEm(); -int APS5_VABI _ZN3WTF10fastStrDupEPKc(); -int APS5_VABI _ZN3WTF10hasElapsedERKNS_24TimeWithDynamicClockTypeE(); int APS5_VABI _ZN3WTF10initializeEv(); -int APS5_VABI _ZN3WTF11CStringHash5equalERKNS_7CStringES3_(); int APS5_VABI _ZN3WTF11LogArgumentIPKvE8toStringES2_(); int APS5_VABI _ZN3WTF11OSAllocator18releaseDecommittedEPvm(); int APS5_VABI _ZN3WTF11OSAllocator23hintMemoryNotNeededSoonEPvm(); @@ -2485,8 +1641,6 @@ int APS5_VABI _ZN3WTF11ThreadGroup3addERKNS_14AbstractLockerERNS_6ThreadE(); int APS5_VABI _ZN3WTF11ThreadGroup3addERNS_6ThreadE(); int APS5_VABI _ZN3WTF11ThreadGroupD2Ev(); int APS5_VABI _ZN3WTF11TimingScope11scopeDidEndEv(); -int APS5_VABI _ZN3WTF11fastReallocEPvm(); -int APS5_VABI _ZN3WTF11jsValueFreeEPv(); int APS5_VABI _ZN3WTF11portAllowedERKNS_3URLE(); int APS5_VABI _ZN3WTF11setDataFileEPKc(); int APS5_VABI _ZN3WTF11setNonBlockEi(); @@ -2504,7 +1658,6 @@ int APS5_VABI _ZN3WTF13MetaAllocator8allocateERKNS_6LockerINS_4LockEEEm(); int APS5_VABI _ZN3WTF13MetaAllocatorC2ERNS_4LockEmm(); int APS5_VABI _ZN3WTF13MetaAllocatorD0Ev(); int APS5_VABI _ZN3WTF13MetaAllocatorD2Ev(); -int APS5_VABI _ZN3WTF13MonotonicTime3nowEv(); int APS5_VABI _ZN3WTF13ReadWriteLock10readUnlockEv(); int APS5_VABI _ZN3WTF13ReadWriteLock11writeUnlockEv(); int APS5_VABI _ZN3WTF13ReadWriteLock8readLockEv(); @@ -2515,10 +1668,8 @@ int APS5_VABI _ZN3WTF13StringBuilder16appendCharactersEPKDsj(); int APS5_VABI _ZN3WTF13StringBuilder16appendCharactersEPKhj(); int APS5_VABI _ZN3WTF13StringBuilder22appendQuotedJSONStringERKNS_6StringE(); int APS5_VABI _ZN3WTF13aboutBlankURLEv(); -int APS5_VABI _ZN3WTF13allPrivilegesEv(); int APS5_VABI _ZN3WTF13dumpCharacterERNS_11PrintStreamEc(); int APS5_VABI _ZN3WTF13isMainRunLoopEv(); -int APS5_VABI _ZN3WTF13jsValueMallocEm(); int APS5_VABI _ZN3WTF13normalizedNFCENS_10StringViewE(); int APS5_VABI _ZN3WTF13normalizedNFCERKNS_6StringE(); int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEN3JSC14TypedArrayModeE(); @@ -2542,8 +1693,6 @@ int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEs(); int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEt(); int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEx(); int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEy(); -int APS5_VABI _ZN3WTF13tryFastCallocEmm(); -int APS5_VABI _ZN3WTF13tryFastMallocEm(); int APS5_VABI _ZN3WTF14AtomStringImpl10addLiteralEPKcj(); int APS5_VABI _ZN3WTF14AtomStringImpl11addSlowCaseERNS_10StringImplE(); int APS5_VABI _ZN3WTF14AtomStringImpl11addSlowCaseERNS_15AtomStringTableERNS_10StringImplE(); @@ -2594,11 +1743,8 @@ int APS5_VABI _ZN3WTF14aboutSrcDocURLEv(); int APS5_VABI _ZN3WTF14createIteratorENS_10StringViewE(); int APS5_VABI _ZN3WTF14dataLogFStringEPKc(); int APS5_VABI _ZN3WTF14dupCloseOnExecEi(); -int APS5_VABI _ZN3WTF14fastMallocSizeEPKv(); int APS5_VABI _ZN3WTF14isVersion4UUIDENS_10StringViewE(); -int APS5_VABI _ZN3WTF14jsValueReallocEPvm(); int APS5_VABI _ZN3WTF14setCloseOnExecEi(); -int APS5_VABI _ZN3WTF14tryFastReallocEPvm(); int APS5_VABI _ZN3WTF15AtomStringTableD1Ev(); int APS5_VABI _ZN3WTF15AtomStringTableD2Ev(); int APS5_VABI _ZN3WTF15AutomaticThread11shouldSleepERKNS_14AbstractLockerE(); @@ -2622,16 +1768,12 @@ int APS5_VABI _ZN3WTF15ThreadCondition9broadcastEv(); int APS5_VABI _ZN3WTF15ThreadCondition9timedWaitERNS_5MutexENS_8WallTimeE(); int APS5_VABI _ZN3WTF15ThreadConditionD1Ev(); int APS5_VABI _ZN3WTF15ThreadConditionD2Ev(); -int APS5_VABI _ZN3WTF15fastAlignedFreeEPv(); int APS5_VABI _ZN3WTF15isWordTextBreakEP14UBreakIterator(); int APS5_VABI _ZN3WTF15memoryFootprintEv(); int APS5_VABI _ZN3WTF16addSignalHandlerENS_6SignalEONS_8FunctionIFNS_12SignalActionES0_RNS_7SigInfoERNS_17PlatformRegistersEEEE(); int APS5_VABI _ZN3WTF16callOnMainThreadEONS_8FunctionIFvvEEE(); int APS5_VABI _ZN3WTF16codePointCompareENS_10StringViewES0_(); int APS5_VABI _ZN3WTF16codePointCompareERKNS_6StringES2_(); -int APS5_VABI _ZN3WTF16fastZeroedMallocEm(); -int APS5_VABI _ZN3WTF16tryJSValueMallocEm(); -int APS5_VABI _ZN3WTF17GregorianDateTime21setToCurrentLocalTimeEv(); int APS5_VABI _ZN3WTF17GregorianDateTimeC1EdNS_15LocalTimeOffsetE(); int APS5_VABI _ZN3WTF17GregorianDateTimeC2EdNS_15LocalTimeOffsetE(); int APS5_VABI _ZN3WTF17PrivateSymbolImpl6createERNS_10StringImplE(); @@ -2647,16 +1789,15 @@ int APS5_VABI _ZN3WTF17StringPrintStreamD0Ev(); int APS5_VABI _ZN3WTF17StringPrintStreamD1Ev(); int APS5_VABI _ZN3WTF17StringPrintStreamD2Ev(); int APS5_VABI _ZN3WTF17callOnMainRunLoopEONS_8FunctionIFvvEEE(); -int APS5_VABI _ZN3WTF17charactersToFloatEPKDsmPb(); -int APS5_VABI _ZN3WTF17charactersToFloatEPKDsmRm(); -int APS5_VABI _ZN3WTF17charactersToFloatEPKhmPb(); -int APS5_VABI _ZN3WTF17charactersToFloatEPKhmRm(); +float APS5_VABI _ZN3WTF17charactersToFloatEPKDsmPb(const char16_t* data, std::size_t length, bool* ok); +float APS5_VABI _ZN3WTF17charactersToFloatEPKDsmRm(const char16_t* data, std::size_t length, std::size_t* parsedLength); +float APS5_VABI _ZN3WTF17charactersToFloatEPKhmPb(const unsigned char* data, std::size_t length, bool* ok); +float APS5_VABI _ZN3WTF17charactersToFloatEPKhmRm(const unsigned char* data, std::size_t length, std::size_t* parsedLength); int APS5_VABI _ZN3WTF17double_conversion23DoubleToStringConverter19EcmaScriptConverterEv(); -int APS5_VABI _ZN3WTF17double_conversion23StringToDoubleConverter13StringToFloatEPKcmPm(); -int APS5_VABI _ZN3WTF17double_conversion23StringToDoubleConverter13StringToFloatEPKtmPm(); -int APS5_VABI _ZN3WTF17double_conversion23StringToDoubleConverter14StringToDoubleEPKcmPm(); -int APS5_VABI _ZN3WTF17double_conversion23StringToDoubleConverter14StringToDoubleEPKtmPm(); -int APS5_VABI _ZN3WTF17fastAlignedMallocEmm(); +float APS5_VABI _ZN3WTF17double_conversion23StringToDoubleConverter13StringToFloatEPKcmPm(const char* buffer, std::size_t length, std::size_t* processedCharactersCount); +float APS5_VABI _ZN3WTF17double_conversion23StringToDoubleConverter13StringToFloatEPKtmPm(const std::uint16_t* buffer, std::size_t length, std::size_t* processedCharactersCount); +double APS5_VABI _ZN3WTF17double_conversion23StringToDoubleConverter14StringToDoubleEPKcmPm(const char* buffer, std::size_t length, std::size_t* processedCharactersCount); +double APS5_VABI _ZN3WTF17double_conversion23StringToDoubleConverter14StringToDoubleEPKtmPm(const std::uint16_t* buffer, std::size_t length, std::size_t* processedCharactersCount); int APS5_VABI _ZN3WTF17languageDidChangeEv(); int APS5_VABI _ZN3WTF17wordBreakIteratorENS_10StringViewE(); int APS5_VABI _ZN3WTF18ExternalStringImpl6createEPKDsjONS_8FunctionIFvPS0_PvjEEE(); @@ -2671,23 +1812,17 @@ int APS5_VABI _ZN3WTF18ParallelHelperPoolC1EONS_7CStringE(); int APS5_VABI _ZN3WTF18ParallelHelperPoolC2EONS_7CStringE(); int APS5_VABI _ZN3WTF18ParallelHelperPoolD1Ev(); int APS5_VABI _ZN3WTF18ParallelHelperPoolD2Ev(); -int APS5_VABI _ZN3WTF18charactersToDoubleEPKDsmPb(); -int APS5_VABI _ZN3WTF18charactersToDoubleEPKhmPb(); -int APS5_VABI _ZN3WTF18constantTimeMemcmpEPKvS1_m(); -int APS5_VABI _ZN3WTF18fastEnableMiniModeEv(); -int APS5_VABI _ZN3WTF18fastMallocGoodSizeEm(); +double APS5_VABI _ZN3WTF18charactersToDoubleEPKDsmPb(const char16_t* data, std::size_t length, bool* ok); +double APS5_VABI _ZN3WTF18charactersToDoubleEPKhmPb(const unsigned char* data, std::size_t length, bool* ok); int APS5_VABI _ZN3WTF19MetaAllocatorHandle6shrinkEm(); int APS5_VABI _ZN3WTF19MetaAllocatorHandleD1Ev(); int APS5_VABI _ZN3WTF19MetaAllocatorHandleD2Ev(); int APS5_VABI _ZN3WTF19ParallelEnvironment7executeEPv(); int APS5_VABI _ZN3WTF19ParallelEnvironmentC1EPFvPvEmi(); int APS5_VABI _ZN3WTF19ParallelEnvironmentC2EPFvPvEmi(); -int APS5_VABI _ZN3WTF19hasProcessPrivilegeENS_16ProcessPrivilegeE(); int APS5_VABI _ZN3WTF19isCompilationThreadEv(); -int APS5_VABI _ZN3WTF19isFastMallocEnabledEv(); int APS5_VABI _ZN3WTF19mimeTypeFromDataURLENS_10StringViewE(); int APS5_VABI _ZN3WTF19numGraphemeClustersENS_10StringViewE(); -int APS5_VABI _ZN3WTF19tryFastZeroedMallocEm(); int APS5_VABI _ZN3WTF20ConcurrentPtrHashSet15deleteOldTablesEv(); int APS5_VABI _ZN3WTF20ConcurrentPtrHashSet5clearEv(); int APS5_VABI _ZN3WTF20ConcurrentPtrHashSet7addSlowEPNS0_5TableEjjjPv(); @@ -2699,15 +1834,8 @@ int APS5_VABI _ZN3WTF20ParallelHelperClient13doSomeHelpingEv(); int APS5_VABI _ZN3WTF20ParallelHelperClient6finishEv(); int APS5_VABI _ZN3WTF20ParallelHelperClientD1Ev(); int APS5_VABI _ZN3WTF20ParallelHelperClientD2Ev(); -int APS5_VABI _ZN3WTF20equalIgnoringNullityEPKDsmPNS_10StringImplE(); -int APS5_VABI _ZN3WTF20equalIgnoringNullityEPNS_10StringImplES1_(); -int APS5_VABI _ZN3WTF20fastDisableScavengerEv(); -int APS5_VABI _ZN3WTF20fastMallocStatisticsEv(); int APS5_VABI _ZN3WTF20initializeMainThreadEv(); -int APS5_VABI _ZN3WTF20protocolIsJavaScriptENS_10StringViewE(); int APS5_VABI _ZN3WTF20resetAccumulatedLogsEv(); -int APS5_VABI _ZN3WTF20setProcessPrivilegesENS_9OptionSetINS_16ProcessPrivilegeEEE(); -int APS5_VABI _ZN3WTF20tryFastAlignedMallocEmm(); int APS5_VABI _ZN3WTF21MemoryPressureHandler12setPageCountEj(); int APS5_VABI _ZN3WTF21MemoryPressureHandler13releaseMemoryENS_8CriticalENS_11SynchronousE(); int APS5_VABI _ZN3WTF21MemoryPressureHandler24currentMemoryUsagePolicyEv(); @@ -2740,14 +1868,8 @@ int APS5_VABI _ZN3WTF22CrossThreadTaskHandlerD2Ev(); int APS5_VABI _ZN3WTF22FastBitVectorWordOwner10resizeSlowEm(); int APS5_VABI _ZN3WTF22FastBitVectorWordOwner13setEqualsSlowERKS0_(); int APS5_VABI _ZN3WTF22TextBreakIteratorCache9singletonEv(); -int APS5_VABI _ZN3WTF22equalIgnoringASCIICaseEPKNS_10StringImplES2_(); -int APS5_VABI _ZN3WTF22equalRespectingNullityENS_10StringViewES0_(); int APS5_VABI _ZN3WTF22isMainThreadOrGCThreadEv(); -int APS5_VABI _ZN3WTF22numberOfProcessorCoresEv(); -int APS5_VABI _ZN3WTF22protocolIsInHTTPFamilyENS_10StringViewE(); -int APS5_VABI _ZN3WTF22removeProcessPrivilegeENS_16ProcessPrivilegeE(); int APS5_VABI _ZN3WTF23callOnMainThreadAndWaitEONS_8FunctionIFvvEEE(); -int APS5_VABI _ZN3WTF23fastCommitAlignedMemoryEPvm(); int APS5_VABI _ZN3WTF24AutomaticThreadCondition4waitERNS_4LockE(); int APS5_VABI _ZN3WTF24AutomaticThreadCondition7waitForERNS_4LockENS_7SecondsE(); int APS5_VABI _ZN3WTF24AutomaticThreadCondition9notifyAllERKNS_14AbstractLockerE(); @@ -2756,26 +1878,19 @@ int APS5_VABI _ZN3WTF24AutomaticThreadConditionC1Ev(); int APS5_VABI _ZN3WTF24AutomaticThreadConditionC2Ev(); int APS5_VABI _ZN3WTF24AutomaticThreadConditionD1Ev(); int APS5_VABI _ZN3WTF24AutomaticThreadConditionD2Ev(); -int APS5_VABI _ZN3WTF24TimeWithDynamicClockType3nowENS_9ClockTypeE(); -int APS5_VABI _ZN3WTF24calculateLocalTimeOffsetEdNS_8TimeTypeE(); int APS5_VABI _ZN3WTF24callOnMainRunLoopAndWaitEONS_8FunctionIFvvEEE(); int APS5_VABI _ZN3WTF24currentTextBreakLocaleIDEv(); int APS5_VABI _ZN3WTF24isDefaultPortForProtocolEtNS_10StringViewE(); int APS5_VABI _ZN3WTF24normalizeLineEndingsToLFEONS_6VectorIhLm0ENS_15CrashOnOverflowELm16ENS_10FastMallocEEE(); int APS5_VABI _ZN3WTF25activateSignalHandlersForENS_6SignalE(); int APS5_VABI _ZN3WTF25addLanguageChangeObserverEPvPFvS0_E(); -int APS5_VABI _ZN3WTF25fastDecommitAlignedMemoryEPvm(); -int APS5_VABI _ZN3WTF25fastMallocDumpMallocStatsEv(); int APS5_VABI _ZN3WTF26getAndResetAccumulatedLogsEv(); int APS5_VABI _ZN3WTF26normalizeLineEndingsToCRLFEONS_6VectorIhLm0ENS_15CrashOnOverflowELm16ENS_10FastMallocEEE(); int APS5_VABI _ZN3WTF27protocolHostAndPortAreEqualERKNS_3URLES2_(); -int APS5_VABI _ZN3WTF27releaseFastMallocFreeMemoryEv(); int APS5_VABI _ZN3WTF28displayNameForLanguageLocaleERKNS_6StringE(); int APS5_VABI _ZN3WTF28encodeWithURLEscapeSequencesERKNS_6StringE(); int APS5_VABI _ZN3WTF28normalizeLineEndingsToNativeEONS_6VectorIhLm0ENS_15CrashOnOverflowELm16ENS_10FastMallocEEE(); int APS5_VABI _ZN3WTF28removeLanguageChangeObserverEPv(); -int APS5_VABI _ZN3WTF29cryptographicallyRandomValuesEPvm(); -int APS5_VABI _ZN3WTF29equalIgnoringASCIICaseNonNullEPKNS_10StringImplES2_(); int APS5_VABI _ZN3WTF30numCodeUnitsInGraphemeClustersENS_10StringViewEj(); int APS5_VABI _ZN3WTF30overrideUserPreferredLanguagesERKNS_6VectorINS_6StringELm0ENS_15CrashOnOverflowELm16ENS_10FastMallocEEE(); int APS5_VABI _ZN3WTF30userPreferredLanguagesOverrideEv(); @@ -2784,14 +1899,12 @@ int APS5_VABI _ZN3WTF31NonSharedCharacterBreakIteratorC2ENS_10StringViewE(); int APS5_VABI _ZN3WTF31NonSharedCharacterBreakIteratorD1Ev(); int APS5_VABI _ZN3WTF31NonSharedCharacterBreakIteratorD2Ev(); int APS5_VABI _ZN3WTF31equalIgnoringFragmentIdentifierERKNS_3URLES2_(); -int APS5_VABI _ZN3WTF31sixCharacterHashStringToIntegerEPKc(); int APS5_VABI _ZN3WTF33indexOfBestMatchingLanguageInListERKNS_6StringERKNS_6VectorIS0_Lm0ENS_15CrashOnOverflowELm16ENS_10FastMallocEEERb(); int APS5_VABI _ZN3WTF37canCurrentThreadAccessThreadLocalDataERNS_6ThreadE(); int APS5_VABI _ZN3WTF37parseDateFromNullTerminatedCharactersEPKc(); -int APS5_VABI _ZN3WTF37parseDateFromNullTerminatedCharactersEPKcRb(); +double APS5_VABI _ZN3WTF37parseDateFromNullTerminatedCharactersEPKcRb(const char* dateString, bool* isLocalTime); int APS5_VABI _ZN3WTF3ICU12majorVersionEv(); int APS5_VABI _ZN3WTF3ICU12minorVersionEv(); -int APS5_VABI _ZN3WTF3URL10invalidateEv(); int APS5_VABI _ZN3WTF3URL11setProtocolENS_10StringViewE(); int APS5_VABI _ZN3WTF3URL14setHostAndPortENS_10StringViewE(); int APS5_VABI _ZN3WTF3URL15hostIsIPAddressENS_10StringViewE(); @@ -2807,9 +1920,7 @@ int APS5_VABI _ZN3WTF3URL8setQueryENS_10StringViewE(); int APS5_VABI _ZN3WTF3URLC2ERKS0_RKNS_6StringEPKNS_15URLTextEncodingE(); int APS5_VABI _ZN3WTF3absERKNS_9MediaTimeE(); int APS5_VABI _ZN3WTF40clearDefaultPortForProtocolMapForTestingEv(); -int APS5_VABI _ZN3WTF40parseES5DateFromNullTerminatedCharactersEPKcRb(); int APS5_VABI _ZN3WTF40registerDefaultPortForProtocolForTestingEtRKNS_6StringE(); -int APS5_VABI _ZN3WTF40releaseFastMallocFreeMemoryForThisThreadEv(); int APS5_VABI _ZN3WTF4Lock10unlockSlowEv(); int APS5_VABI _ZN3WTF4Lock13safepointSlowEv(); int APS5_VABI _ZN3WTF4Lock8lockSlowEv(); @@ -2823,37 +1934,12 @@ int APS5_VABI _ZN3WTF5MutexC1Ev(); int APS5_VABI _ZN3WTF5MutexC2Ev(); int APS5_VABI _ZN3WTF5MutexD1Ev(); int APS5_VABI _ZN3WTF5MutexD2Ev(); -int APS5_VABI _ZN3WTF5equalEPKNS_10StringImplEPKDsj(); -int APS5_VABI _ZN3WTF5equalEPKNS_10StringImplEPKh(); -int APS5_VABI _ZN3WTF5equalEPKNS_10StringImplEPKhj(); -int APS5_VABI _ZN3WTF5equalERKNS_10StringImplES2_(); int APS5_VABI _ZN3WTF5sleepENS_7SecondsE(); -int APS5_VABI _ZN3WTF5sleepERKNS_24TimeWithDynamicClockTypeE(); -int APS5_VABI _ZN3WTF6Config17permanentlyFreezeEv(); -int APS5_VABI _ZN3WTF6String13fromCodePointEi(); int APS5_VABI _ZN3WTF6String24numberToStringFixedWidthEdj(); -int APS5_VABI _ZN3WTF6String26fromUTF8WithLatin1FallbackEPKhm(); int APS5_VABI _ZN3WTF6String28numberToStringFixedPrecisionEdjNS_29TrailingZerosTruncatingPolicyE(); int APS5_VABI _ZN3WTF6String28numberToStringFixedPrecisionEfjNS_29TrailingZerosTruncatingPolicyE(); int APS5_VABI _ZN3WTF6String6numberEd(); int APS5_VABI _ZN3WTF6String6numberEf(); -int APS5_VABI _ZN3WTF6String6numberEi(); -int APS5_VABI _ZN3WTF6String6numberEj(); -int APS5_VABI _ZN3WTF6String6numberEl(); -int APS5_VABI _ZN3WTF6String6numberEm(); -int APS5_VABI _ZN3WTF6String6numberEx(); -int APS5_VABI _ZN3WTF6String6numberEy(); -int APS5_VABI _ZN3WTF6String8fromUTF8EPKh(); -int APS5_VABI _ZN3WTF6String8fromUTF8EPKhm(); -int APS5_VABI _ZN3WTF6String8fromUTF8ERKNS_7CStringE(); -int APS5_VABI _ZN3WTF6StringC1EPKDsj(); -int APS5_VABI _ZN3WTF6StringC1EPKcj(); -int APS5_VABI _ZN3WTF6StringC1EPKc(); -int APS5_VABI _ZN3WTF6StringC1EPKhj(); -int APS5_VABI _ZN3WTF6StringC2EPKDsj(); -int APS5_VABI _ZN3WTF6StringC2EPKc(); -int APS5_VABI _ZN3WTF6StringC2EPKcj(); -int APS5_VABI _ZN3WTF6StringC2EPKhj(); int APS5_VABI _ZN3WTF6Thread13mayBeGCThreadEv(); int APS5_VABI _ZN3WTF6Thread14changePriorityEi(); int APS5_VABI _ZN3WTF6Thread16registerGCThreadENS_12GCThreadTypeE(); @@ -2867,14 +1953,6 @@ int APS5_VABI _ZN3WTF6Thread6detachEv(); int APS5_VABI _ZN3WTF6Thread6signalEi(); int APS5_VABI _ZN3WTF6ThreadD1Ev(); int APS5_VABI _ZN3WTF6ThreadD2Ev(); -int APS5_VABI _ZN3WTF7CPUTime16forCurrentThreadEv(); -int APS5_VABI _ZN3WTF7CString11mutableDataEv(); -int APS5_VABI _ZN3WTF7CString16newUninitializedEmRPc(); -int APS5_VABI _ZN3WTF7CString4growEm(); -int APS5_VABI _ZN3WTF7CStringC1EPKcm(); -int APS5_VABI _ZN3WTF7CStringC1EPKc(); -int APS5_VABI _ZN3WTF7CStringC2EPKc(); -int APS5_VABI _ZN3WTF7CStringC2EPKcm(); int APS5_VABI _ZN3WTF7RunLoop13dispatchAfterENS_7SecondsEONS_8FunctionIFvvEEE(); int APS5_VABI _ZN3WTF7RunLoop17setWakeUpCallbackEONS_8FunctionIFvvEEE(); int APS5_VABI _ZN3WTF7RunLoop38suspendFunctionDispatchForCurrentCycleEv(); @@ -2889,13 +1967,10 @@ int APS5_VABI _ZN3WTF7RunLoop9TimerBase5startENS_7SecondsEb(); int APS5_VABI _ZN3WTF7RunLoop9TimerBaseC2ERS0_(); int APS5_VABI _ZN3WTF7RunLoop9TimerBaseD1Ev(); int APS5_VABI _ZN3WTF7RunLoop9TimerBaseD2Ev(); -int APS5_VABI _ZN3WTF7Unicode51calculateStringHashAndLengthFromUTF8MaskingTop8BitsEPKcS2_RjS3_(); -int APS5_VABI _ZN3WTF7ramSizeEv(); int APS5_VABI _ZN3WTF8CollatorC1EPKcb(); int APS5_VABI _ZN3WTF8CollatorC2EPKcb(); int APS5_VABI _ZN3WTF8CollatorD1Ev(); int APS5_VABI _ZN3WTF8CollatorD2Ev(); -int APS5_VABI _ZN3WTF8Internal25parseDoubleFromLongStringEPKDsmRm(); int APS5_VABI _ZN3WTF8JSONImpl10ObjectBase6removeERKNS_6StringE(); int APS5_VABI _ZN3WTF8JSONImpl5Array6createEv(); int APS5_VABI _ZN3WTF8JSONImpl5Value4nullEv(); @@ -2929,13 +2004,9 @@ int APS5_VABI _ZN3WTF8JSONImpl9ArrayBaseC1Ev(); int APS5_VABI _ZN3WTF8JSONImpl9ArrayBaseC2Ev(); int APS5_VABI _ZN3WTF8JSONImpl9ArrayBaseD0Ev(); int APS5_VABI _ZN3WTF8JSONImpl9ArrayBaseD1Ev(); -int APS5_VABI _ZN3WTF8WallTime3nowEv(); int APS5_VABI _ZN3WTF8WordLock10unlockSlowEv(); int APS5_VABI _ZN3WTF8WordLock8lockSlowEv(); int APS5_VABI _ZN3WTF8dataFileEv(); -int APS5_VABI _ZN3WTF8dataLogFEPKcz(); -int APS5_VABI _ZN3WTF8fastFreeEPv(); -int APS5_VABI _ZN3WTF8pageSizeEv(); int APS5_VABI _ZN3WTF9BitVector11excludeSlowERKS0_(); int APS5_VABI _ZN3WTF9BitVector13OutOfLineBits6createEm(); int APS5_VABI _ZN3WTF9BitVector13OutOfLineBits7destroyEPS1_(); @@ -2973,12 +2044,8 @@ int APS5_VABI _ZN3WTF9URLParser14allValuesEqualERKNS_3URLES3_(); int APS5_VABI _ZN3WTF9URLParser19parseURLEncodedFormENS_10StringViewE(); int APS5_VABI _ZN3WTF9URLParser24internalValuesConsistentERKNS_3URLE(); int APS5_VABI _ZN3WTF9URLParser9serializeERKNS_6VectorINS_12KeyValuePairINS_6StringES3_EELm0ENS_15CrashOnOverflowELm16ENS_10FastMallocEEE(); -int APS5_VABI _ZN3WTF9dataLogFVEPKcP13__va_list_tag(); -int APS5_VABI _ZN3WTFeqERKNS_7CStringEPKc(); -int APS5_VABI _ZN3WTFeqERKNS_7CStringES2_(); int APS5_VABI _ZN3WTFlsERNS_10TextStreamENS_7SecondsE(); int APS5_VABI _ZN3WTFlsERNS_10TextStreamERKNS_3URLE(); -int APS5_VABI _ZN3WTFltERKNS_7CStringES2_(); int APS5_VABI _ZN6WebKit14WebProcessMainEiPPc(); int APS5_VABI _ZN6WebKit18NetworkProcessMainEiPPc(); int APS5_VABI _ZN7Nicosia6Buffer6createERKN7WebCore7IntSizeEj(); @@ -3004,10 +2071,6 @@ int APS5_VABI _ZN7WebCore10FileHandleC2Ev(); int APS5_VABI _ZN7WebCore10FileHandleD1Ev(); int APS5_VABI _ZN7WebCore10FileHandleD2Ev(); int APS5_VABI _ZN7WebCore10FileHandleaSEOS0_(); -int APS5_VABI _ZN7WebCore10FloatPoint15narrowPrecisionEdd(); -int APS5_VABI _ZN7WebCore10FloatPoint9normalizeEv(); -int APS5_VABI _ZN7WebCore10FloatPointC1ERKNS_8IntPointE(); -int APS5_VABI _ZN7WebCore10FloatPointC2ERKNS_8IntPointE(); int APS5_VABI _ZN7WebCore10ISOFullBoxC1ERKS0_(); int APS5_VABI _ZN7WebCore10ISOFullBoxC1Ev(); int APS5_VABI _ZN7WebCore10ISOFullBoxC2ERKS0_(); @@ -3037,10 +2100,6 @@ int APS5_VABI _ZN7WebCore10JSLocationD1Ev(); int APS5_VABI _ZN7WebCore10JSLocationD2Ev(); int APS5_VABI _ZN7WebCore10JSLocationaSERKS0_(); int APS5_VABI _ZN7WebCore10JSNodeList9toWrappedERN3JSC2VMENS1_7JSValueE(); -int APS5_VABI _ZN7WebCore10LayoutRect5scaleEf(); -int APS5_VABI _ZN7WebCore10LayoutRect5uniteERKS0_(); -int APS5_VABI _ZN7WebCore10LayoutRectC1ERKNS_9FloatRectE(); -int APS5_VABI _ZN7WebCore10LayoutRectC2ERKNS_9FloatRectE(); int APS5_VABI _ZN7WebCore10OriginLockD1Ev(); int APS5_VABI _ZN7WebCore10OriginLockD2Ev(); int APS5_VABI _ZN7WebCore10Pasteboard10readOriginEv(); @@ -3337,8 +2396,6 @@ int APS5_VABI _ZN7WebCore11RenderLayer21simulateFrequentPaintEv(); int APS5_VABI _ZN7WebCore11RenderStyleD1Ev(); int APS5_VABI _ZN7WebCore11RenderStyleD2Ev(); int APS5_VABI _ZN7WebCore11RenderTheme9singletonEv(); -int APS5_VABI _ZN7WebCore11RoundedRectC1ERKNS_10LayoutRectERKNS_10LayoutSizeES6_S6_S6_(); -int APS5_VABI _ZN7WebCore11RoundedRectC2ERKNS_10LayoutRectERKNS_10LayoutSizeES6_S6_S6_(); int APS5_VABI _ZN7WebCore11SimpleRangeC1EONS_13BoundaryPointES2_(); int APS5_VABI _ZN7WebCore11SimpleRangeC1ERKNS_13BoundaryPointES3_(); int APS5_VABI _ZN7WebCore11SimpleRangeC2EONS_13BoundaryPointES2_(); @@ -3771,7 +2828,6 @@ int APS5_VABI _ZN7WebCore14XMLHttpRequestD0Ev(); int APS5_VABI _ZN7WebCore14XMLHttpRequestD2Ev(); int APS5_VABI _ZN7WebCore14endOfParagraphERKNS_15VisiblePositionENS_27EditingBoundaryCrossingRuleE(); int APS5_VABI _ZN7WebCore14foldQuoteMarksERKN3WTF6StringE(); -int APS5_VABI _ZN7WebCore14roundedIntRectERKNS_9FloatRectE(); int APS5_VABI _ZN7WebCore14stopResolveDNSEm(); int APS5_VABI _ZN7WebCore14valueForLengthERKNS_6LengthENS_10LayoutUnitE(); int APS5_VABI _ZN7WebCore15ActiveDOMObject15suspendIfNeededEv(); @@ -3787,18 +2843,6 @@ int APS5_VABI _ZN7WebCore15ActiveDOMObjectC2ERNS_8DocumentE(); int APS5_VABI _ZN7WebCore15ActiveDOMObjectD0Ev(); int APS5_VABI _ZN7WebCore15ActiveDOMObjectD1Ev(); int APS5_VABI _ZN7WebCore15ActiveDOMObjectD2Ev(); -int APS5_VABI _ZN7WebCore15AffineTransform12makeIdentityEv(); -int APS5_VABI _ZN7WebCore15AffineTransform15scaleNonUniformEdd(); -int APS5_VABI _ZN7WebCore15AffineTransform4skewEdd(); -int APS5_VABI _ZN7WebCore15AffineTransform5flipXEv(); -int APS5_VABI _ZN7WebCore15AffineTransform5flipYEv(); -int APS5_VABI _ZN7WebCore15AffineTransform5scaleERKNS_9FloatSizeE(); -int APS5_VABI _ZN7WebCore15AffineTransform5scaleEd(); -int APS5_VABI _ZN7WebCore15AffineTransform5shearEdd(); -int APS5_VABI _ZN7WebCore15AffineTransform6rotateEd(); -int APS5_VABI _ZN7WebCore15AffineTransform8multiplyERKS0_(); -int APS5_VABI _ZN7WebCore15AffineTransform9translateERKNS_10FloatPointE(); -int APS5_VABI _ZN7WebCore15AffineTransform9translateEdd(); int APS5_VABI _ZN7WebCore15AsyncFileStream11openForReadERKN3WTF6StringExx(); int APS5_VABI _ZN7WebCore15AsyncFileStream5closeEv(); int APS5_VABI _ZN7WebCore15AsyncFileStream7performEON3WTF8FunctionIFNS2_IFvRNS_16FileStreamClientEEEERNS_10FileStreamEEEE(); @@ -4007,8 +3051,6 @@ int APS5_VABI _ZN7WebCore16FileReaderLoader5startEPNS_22ScriptExecutionContextER int APS5_VABI _ZN7WebCore16FileReaderLoader6cancelEv(); int APS5_VABI _ZN7WebCore16FileReaderLoaderC1ENS0_8ReadTypeEPNS_22FileReaderLoaderClientE(); int APS5_VABI _ZN7WebCore16FileReaderLoaderC2ENS0_8ReadTypeEPNS_22FileReaderLoaderClientE(); -int APS5_VABI _ZN7WebCore16FloatRoundedRectC1ERKNS_9FloatRectERKNS0_5RadiiE(); -int APS5_VABI _ZN7WebCore16FloatRoundedRectC2ERKNS_9FloatRectERKNS0_5RadiiE(); int APS5_VABI _ZN7WebCore16FontCascadeFonts23realizeFallbackRangesAtERKNS_22FontCascadeDescriptionEj(); int APS5_VABI _ZN7WebCore16FontCascadeFontsD1Ev(); int APS5_VABI _ZN7WebCore16FontCascadeFontsD2Ev(); @@ -4755,20 +3797,6 @@ int APS5_VABI _ZN7WebCore20SVGPathStringBuilderD1Ev(); int APS5_VABI _ZN7WebCore20SVGPathStringBuilderD2Ev(); int APS5_VABI _ZN7WebCore20ScrollingCoordinator13pageDestroyedEv(); int APS5_VABI _ZN7WebCore20ScrollingCoordinator45setForceSynchronousScrollLayerPositionUpdatesEb(); -int APS5_VABI _ZN7WebCore20TransformationMatrix10makeAffineEv(); -int APS5_VABI _ZN7WebCore20TransformationMatrix10rectToRectERKNS_9FloatRectES3_(); -int APS5_VABI _ZN7WebCore20TransformationMatrix11translate3dEddd(); -int APS5_VABI _ZN7WebCore20TransformationMatrix15scaleNonUniformEdd(); -int APS5_VABI _ZN7WebCore20TransformationMatrix4skewEdd(); -int APS5_VABI _ZN7WebCore20TransformationMatrix5flipXEv(); -int APS5_VABI _ZN7WebCore20TransformationMatrix5flipYEv(); -int APS5_VABI _ZN7WebCore20TransformationMatrix5scaleEd(); -int APS5_VABI _ZN7WebCore20TransformationMatrix6rotateEd(); -int APS5_VABI _ZN7WebCore20TransformationMatrix8multiplyERKS0_(); -int APS5_VABI _ZN7WebCore20TransformationMatrix8rotate3dEddd(); -int APS5_VABI _ZN7WebCore20TransformationMatrix9translateEdd(); -int APS5_VABI _ZN7WebCore20TransformationMatrixC1ERKNS_15AffineTransformE(); -int APS5_VABI _ZN7WebCore20TransformationMatrixC2ERKNS_15AffineTransformE(); int APS5_VABI _ZN7WebCore20UserGestureIndicator18currentUserGestureEv(); int APS5_VABI _ZN7WebCore20UserGestureIndicator29processingUserGestureForMediaEv(); int APS5_VABI _ZN7WebCore20UserGestureIndicatorD1Ev(); @@ -4991,7 +4019,6 @@ int APS5_VABI _ZN7WebCore21convertToIntegerClampImEET_RN3JSC14JSGlobalObjectENS2 int APS5_VABI _ZN7WebCore21convertToIntegerClampIsEET_RN3JSC14JSGlobalObjectENS2_7JSValueE(); int APS5_VABI _ZN7WebCore21convertToIntegerClampItEET_RN3JSC14JSGlobalObjectENS2_7JSValueE(); int APS5_VABI _ZN7WebCore21identifierToUSVStringERN3JSC14JSGlobalObjectERKNS0_10IdentifierE(); -int APS5_VABI _ZN7WebCore21isBackForwardLoadTypeENS_13FrameLoadTypeE(); int APS5_VABI _ZN7WebCore21mainThreadNormalWorldEv(); int APS5_VABI _ZN7WebCore21setPlatformStrategiesEPNS_18PlatformStrategiesE(); int APS5_VABI _ZN7WebCore22CanvasRenderingContext5derefEv(); @@ -5328,7 +4355,6 @@ int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager32setIsPlayingToAutomotive int APS5_VABI _ZN7WebCore27parseCacheControlDirectivesERKNS_13HTTPHeaderMapE(); int APS5_VABI _ZN7WebCore27parseHTMLNonNegativeIntegerEN3WTF10StringViewE(); int APS5_VABI _ZN7WebCore27screenSupportsExtendedColorEPNS_6WidgetE(); -int APS5_VABI _ZN7WebCore27setPresentingApplicationPIDEi(); int APS5_VABI _ZN7WebCore27withinTextUnitOfGranularityERKNS_15VisiblePositionENS_15TextGranularityENS_18SelectionDirectionE(); int APS5_VABI _ZN7WebCore28BackingStoreBackendCairoImplC1ERKNS_7IntSizeEf(); int APS5_VABI _ZN7WebCore28BackingStoreBackendCairoImplC2ERKNS_7IntSizeEf(); @@ -5410,7 +4436,6 @@ int APS5_VABI _ZN7WebCore30InvertLightnessFilterOperationD2Ev(); int APS5_VABI _ZN7WebCore30closestWordBoundaryForPositionERKNS_15VisiblePositionE(); int APS5_VABI _ZN7WebCore30forwardForEachCallToBackingMapERNS_17JSDOMGlobalObjectERN3JSC9CallFrameERNS2_8JSObjectE(); int APS5_VABI _ZN7WebCore30forwardForEachCallToBackingSetERNS_17JSDOMGlobalObjectERN3JSC9CallFrameERNS2_8JSObjectE(); -int APS5_VABI _ZN7WebCore30isStatusCodeCacheableByDefaultEi(); int APS5_VABI _ZN7WebCore30makeRangeSelectingNodeContentsERNS_4NodeE(); int APS5_VABI _ZN7WebCore30rejectPromiseWithThisTypeErrorERN3JSC14JSGlobalObjectEPKcS4_(); int APS5_VABI _ZN7WebCore30rejectPromiseWithThisTypeErrorERNS_15DeferredPromiseEPKcS3_(); @@ -5431,7 +4456,6 @@ int APS5_VABI _ZN7WebCore31rejectPromiseWithExceptionIfAnyERN3JSC14JSGlobalObjec int APS5_VABI _ZN7WebCore32WorkerThreadableWebSocketChannelC1ERNS_17WorkerGlobalScopeERNS_22WebSocketChannelClientERKN3WTF6StringERNS_14SocketProviderE(); int APS5_VABI _ZN7WebCore32WorkerThreadableWebSocketChannelC2ERNS_17WorkerGlobalScopeERNS_22WebSocketChannelClientERKN3WTF6StringERNS_14SocketProviderE(); int APS5_VABI _ZN7WebCore32isSimpleCrossOriginAccessRequestERKN3WTF6StringERKNS_13HTTPHeaderMapE(); -int APS5_VABI _ZN7WebCore32isStatusCodePotentiallyCacheableEi(); int APS5_VABI _ZN7WebCore32serializationForRenderTreeAsTextERKNS_5ColorE(); int APS5_VABI _ZN7WebCore32throwArgumentMustBeFunctionErrorERN3JSC14JSGlobalObjectERNS0_10ThrowScopeEjPKcS6_S6_(); int APS5_VABI _ZN7WebCore32useBlockedPlugInContextMenuTitleEv(); @@ -5452,7 +4476,6 @@ int APS5_VABI _ZN7WebCore36ISOProtectionSystemSpecificHeaderBoxC2Ev(); int APS5_VABI _ZN7WebCore36ISOProtectionSystemSpecificHeaderBoxD0Ev(); int APS5_VABI _ZN7WebCore36ISOProtectionSystemSpecificHeaderBoxD1Ev(); int APS5_VABI _ZN7WebCore36ISOProtectionSystemSpecificHeaderBoxD2Ev(); -int APS5_VABI _ZN7WebCore36largestRectWithAspectRatioInsideRectEfRKNS_9FloatRectE(); int APS5_VABI _ZN7WebCore36parseCrossOriginResourcePolicyHeaderEN3WTF10StringViewE(); int APS5_VABI _ZN7WebCore36registerMemoryReleaseNotifyCallbacksEv(); int APS5_VABI _ZN7WebCore36visiblePositionForPositionWithOffsetERKNS_15VisiblePositionEi(); @@ -5471,11 +4494,9 @@ int APS5_VABI _ZN7WebCore37CrossOriginAccessControlCheckDisablerD2Ev(); int APS5_VABI _ZN7WebCore37CrossOriginAccessControlCheckDisableraSERKS0_(); int APS5_VABI _ZN7WebCore37WidgetHierarchyUpdatesSuspensionScope11moveWidgetsEv(); int APS5_VABI _ZN7WebCore37computeFreshnessLifetimeForHTTPFamilyERKNS_16ResourceResponseEN3WTF8WallTimeE(); -int APS5_VABI _ZN7WebCore37smallestRectWithAspectRatioAroundRectEfRKNS_9FloatRectE(); int APS5_VABI _ZN7WebCore38updateResponseHeadersAfterRevalidationERNS_16ResourceResponseERKS0_(); int APS5_VABI _ZN7WebCore39cleanHTTPRequestHeadersForAccessControlERNS_15ResourceRequestEN3WTF9OptionSetINS_29HTTPHeadersToKeepFromCleaningEEE(); int APS5_VABI _ZN7WebCore40restrictMinimumScaleFactorToViewportSizeERNS_18ViewportAttributesENS_7IntSizeEf(); -int APS5_VABI _ZN7WebCore43initializeMaximumHTTPConnectionCountPerHostEv(); int APS5_VABI _ZN7WebCore44computeMinimumScaleFactorForContentContainedERKNS_18ViewportAttributesERKNS_7IntSizeES5_(); int APS5_VABI _ZN7WebCore46visibleImageElementsInRangeWithNonLoadedImagesERKNS_11SimpleRangeE(); int APS5_VABI _ZN7WebCore48closestEditablePositionInElementForAbsolutePointERKNS_7ElementERKNS_8IntPointE(); @@ -5639,12 +4660,6 @@ int APS5_VABI _ZN7WebCore4toJSERNS_14StringCallbackE(); int APS5_VABI _ZN7WebCore50restrictScaleFactorToInitialScaleIfNotUserScalableERNS_18ViewportAttributesE(); int APS5_VABI _ZN7WebCore5Cairo11ShadowStateC1ERKNS_20GraphicsContextStateE(); int APS5_VABI _ZN7WebCore5Cairo11ShadowStateC2ERKNS_20GraphicsContextStateE(); -int APS5_VABI _ZN7WebCore5ColorC1EOS0_(); -int APS5_VABI _ZN7WebCore5ColorC1ERKS0_(); -int APS5_VABI _ZN7WebCore5ColorC2EOS0_(); -int APS5_VABI _ZN7WebCore5ColorC2ERKS0_(); -int APS5_VABI _ZN7WebCore5ColoraSEOS0_(); -int APS5_VABI _ZN7WebCore5ColoraSERKS0_(); int APS5_VABI _ZN7WebCore5Event9initEventERKN3WTF10AtomStringEbb(); int APS5_VABI _ZN7WebCore5Image12supportsTypeERKN3WTF6StringE(); int APS5_VABI _ZN7WebCore5Image20loadPlatformResourceEPKc(); @@ -5855,15 +4870,6 @@ int APS5_VABI _ZN7WebCore7Element9innerTextEv(); int APS5_VABI _ZN7WebCore7Element9offsetTopEv(); int APS5_VABI _ZN7WebCore7Element9outerTextEv(); int APS5_VABI _ZN7WebCore7Element9setPseudoERKN3WTF10AtomStringE(); -int APS5_VABI _ZN7WebCore7IntRect5scaleEf(); -int APS5_VABI _ZN7WebCore7IntRect5uniteERKS0_(); -int APS5_VABI _ZN7WebCore7IntRect9intersectERKS0_(); -int APS5_VABI _ZN7WebCore7IntRectC1ERKNS_10LayoutRectE(); -int APS5_VABI _ZN7WebCore7IntRectC1ERKNS_9FloatRectE(); -int APS5_VABI _ZN7WebCore7IntRectC2ERKNS_10LayoutRectE(); -int APS5_VABI _ZN7WebCore7IntRectC2ERKNS_9FloatRectE(); -int APS5_VABI _ZN7WebCore7IntSizeC1ERKNS_9FloatSizeE(); -int APS5_VABI _ZN7WebCore7IntSizeC2ERKNS_9FloatSizeE(); int APS5_VABI _ZN7WebCore7JSEvent9toWrappedERN3JSC2VMENS1_7JSValueE(); int APS5_VABI _ZN7WebCore7JSRange14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE(); int APS5_VABI _ZN7WebCore7JSRange15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); @@ -5961,8 +4967,6 @@ int APS5_VABI _ZN7WebCore8FormData6createEPKvm(); int APS5_VABI _ZN7WebCore8FormData6createEv(); int APS5_VABI _ZN7WebCore8FormDataD1Ev(); int APS5_VABI _ZN7WebCore8FormDataD2Ev(); -int APS5_VABI _ZN7WebCore8IntPointC1ERKNS_10FloatPointE(); -int APS5_VABI _ZN7WebCore8IntPointC2ERKNS_10FloatPointE(); int APS5_VABI _ZN7WebCore8JSDOMURL14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE(); int APS5_VABI _ZN7WebCore8JSDOMURL15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); int APS5_VABI _ZN7WebCore8JSDOMURL15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE(); @@ -6024,7 +5028,6 @@ int APS5_VABI _ZN7WebCore8Settings42setHiddenPageCSSAnimationSuspensionEnabledEb int APS5_VABI _ZN7WebCore8Settings44setClientCoordinatesRelativeToLayoutViewportEb(); int APS5_VABI _ZN7WebCore8Settings44setHiddenPageDOMTimerThrottlingAutoIncreasesEb(); int APS5_VABI _ZN7WebCore8XMLNames4initEv(); -int APS5_VABI _ZN7WebCore8isReloadENS_13FrameLoadTypeE(); int APS5_VABI _ZN7WebCore9AnimationC1Ev(); int APS5_VABI _ZN7WebCore9AnimationC2Ev(); int APS5_VABI _ZN7WebCore9AnimationD1Ev(); @@ -6050,11 +5053,6 @@ int APS5_VABI _ZN7WebCore9DragImageC2Ev(); int APS5_VABI _ZN7WebCore9DragImageD1Ev(); int APS5_VABI _ZN7WebCore9DragImageD2Ev(); int APS5_VABI _ZN7WebCore9DragImageaSEOS0_(); -int APS5_VABI _ZN7WebCore9FloatRect5scaleEff(); -int APS5_VABI _ZN7WebCore9FloatRect5uniteERKS0_(); -int APS5_VABI _ZN7WebCore9FloatRect6extendERKNS_10FloatPointE(); -int APS5_VABI _ZN7WebCore9FloatRect9intersectERKS0_(); -int APS5_VABI _ZN7WebCore9FloatRectC1ERKNS_7IntRectE(); int APS5_VABI _ZN7WebCore9FontCache17inactiveFontCountEv(); int APS5_VABI _ZN7WebCore9FontCache19fontForPlatformDataERKNS_16FontPlatformDataE(); int APS5_VABI _ZN7WebCore9FontCache21purgeInactiveFontDataEj(); @@ -6184,7 +5182,6 @@ int APS5_VABI _ZN7bmalloc11IsoTLSEntrynaEm(); int APS5_VABI _ZN7bmalloc11IsoTLSEntrynwEmPv(); int APS5_VABI _ZN7bmalloc11IsoTLSEntrynwEm(); int APS5_VABI _ZN7bmalloc12IsoTLSLayout3addEPNS_11IsoTLSEntryE(); -int APS5_VABI _ZN7bmalloc12cryptoRandomEPvm(); int APS5_VABI _ZN7bmalloc13IsoSharedPage9tryCreateEv(); int APS5_VABI _ZN7bmalloc15IsoHeapImplBase11didDecommitEPvm(); int APS5_VABI _ZN7bmalloc15IsoHeapImplBase11scavengeNowEv(); @@ -6203,19 +5200,7 @@ int APS5_VABI _ZN7bmalloc15IsoHeapImplBasedlEPv(); int APS5_VABI _ZN7bmalloc15IsoHeapImplBasenaEmPv(); int APS5_VABI _ZN7bmalloc15IsoHeapImplBasenaEm(); int APS5_VABI _ZN7bmalloc15IsoHeapImplBasenwEm(); -int APS5_VABI _ZN7bmalloc15availableMemoryEv(); -int APS5_VABI _ZN7bmalloc16isActiveHeapKindENS_8HeapKindE(); int APS5_VABI _ZN7bmalloc17getPerProcessDataEjPKcmm(); -int APS5_VABI _ZN7bmalloc19mapToActiveHeapKindENS_8HeapKindE(); -int APS5_VABI _ZN7bmalloc3api13freeOutOfLineEPvNS_8HeapKindE(); -int APS5_VABI _ZN7bmalloc3api14enableMiniModeEv(); -int APS5_VABI _ZN7bmalloc3api15mallocOutOfLineEmNS_8HeapKindE(); -int APS5_VABI _ZN7bmalloc3api16disableScavengerEv(); -int APS5_VABI _ZN7bmalloc3api21commitAlignedPhysicalEPvmNS_8HeapKindE(); -int APS5_VABI _ZN7bmalloc3api23decommitAlignedPhysicalEPvmNS_8HeapKindE(); -int APS5_VABI _ZN7bmalloc3api29tryLargeZeroedMemalignVirtualEmmNS_8HeapKindE(); -int APS5_VABI _ZN7bmalloc3api8scavengeEv(); -int APS5_VABI _ZN7bmalloc3api9isEnabledENS_8HeapKindE(); int APS5_VABI _ZN7bmalloc5Cache25allocateSlowCaseNullCacheENS_8HeapKindEm(); int APS5_VABI _ZN7bmalloc5Cache25allocateSlowCaseNullCacheENS_8HeapKindEmm(); int APS5_VABI _ZN7bmalloc5Cache27deallocateSlowCaseNullCacheENS_8HeapKindEPv(); @@ -6234,16 +5219,6 @@ int APS5_VABI _ZN7bmalloc8FreeListD1Ev(); int APS5_VABI _ZN7bmalloc9Allocator12allocateImplEmmNS_13FailureActionE(); int APS5_VABI _ZN7bmalloc9Scavenger29scheduleIfUnderMemoryPressureEm(); int APS5_VABI _ZN7bmalloc9Scavenger8scheduleEm(); -int APS5_VABI _ZN8Gigacage10tryReallocENS_4KindEPvm(); -int APS5_VABI _ZN8Gigacage11alignedFreeENS_4KindEPv(); -int APS5_VABI _ZN8Gigacage11mallocArrayENS_4KindEmm(); -int APS5_VABI _ZN8Gigacage14tryMallocArrayENS_4KindEmm(); -int APS5_VABI _ZN8Gigacage16freeVirtualPagesENS_4KindEPvm(); -int APS5_VABI _ZN8Gigacage16tryAlignedMallocENS_4KindEmm(); -int APS5_VABI _ZN8Gigacage29tryAllocateZeroedVirtualPagesENS_4KindEm(); -int APS5_VABI _ZN8Gigacage4freeENS_4KindEPv(); -int APS5_VABI _ZN8Gigacage6mallocENS_4KindEm(); -int APS5_VABI _ZN8Gigacage9tryMallocENS_4KindEm(); int APS5_VABI _ZN9Inspector13AgentRegistry13discardValuesEv(); int APS5_VABI _ZN9Inspector13AgentRegistry27didCreateFrontendAndBackendEPNS_14FrontendRouterEPNS_17BackendDispatcherE(); int APS5_VABI _ZN9Inspector13AgentRegistry29willDestroyFrontendAndBackendENS_16DisconnectReasonE(); @@ -7147,27 +6122,10 @@ int APS5_VABI _ZNK3JSC9JSPromise6statusERNS_2VME(); int APS5_VABI _ZNK3JSC9JSPromise9isHandledERNS_2VME(); int APS5_VABI _ZNK3WTF10AtomString23convertToASCIILowercaseEv(); int APS5_VABI _ZNK3WTF10AtomString23convertToASCIIUppercaseEv(); -int APS5_VABI _ZNK3WTF10StringImpl10startsWithEDs(); -int APS5_VABI _ZNK3WTF10StringImpl10startsWithEPKcj(); -int APS5_VABI _ZNK3WTF10StringImpl11sizeInBytesEv(); -int APS5_VABI _ZNK3WTF10StringImpl12hashSlowCaseEv(); -int APS5_VABI _ZNK3WTF10StringImpl14concurrentHashEv(); -int APS5_VABI _ZNK3WTF10StringImpl4utf8ENS_14ConversionModeE(); -int APS5_VABI _ZNK3WTF10StringImpl8endsWithEDs(); -int APS5_VABI _ZNK3WTF10StringImpl8endsWithEPKcj(); -int APS5_VABI _ZNK3WTF10StringView10startsWithEDs(); int APS5_VABI _ZNK3WTF10StringView16GraphemeClusters8IteratordeEv(); int APS5_VABI _ZNK3WTF10StringView16GraphemeClusters8IteratoreqERKS2_(); -int APS5_VABI _ZNK3WTF10StringView23convertToASCIILowercaseEv(); -int APS5_VABI _ZNK3WTF10StringView23convertToASCIIUppercaseEv(); -int APS5_VABI _ZNK3WTF10StringView26getCharactersWithASCIICaseENS0_15CaseConvertTypeEPDs(); -int APS5_VABI _ZNK3WTF10StringView26getCharactersWithASCIICaseENS0_15CaseConvertTypeEPh(); -int APS5_VABI _ZNK3WTF10StringView4findES0_j(); -int APS5_VABI _ZNK3WTF10StringView4utf8ENS_14ConversionModeE(); -int APS5_VABI _ZNK3WTF10StringView8endsWithEDs(); int APS5_VABI _ZNK3WTF11Persistence7Decoder28bufferIsLargeEnoughToContainEm(); int APS5_VABI _ZNK3WTF12ASCIILiteral4dumpERNS_11PrintStreamE(); -int APS5_VABI _ZNK3WTF13MonotonicTime19approximateWallTimeEv(); int APS5_VABI _ZNK3WTF13MonotonicTime4dumpERNS_11PrintStreamE(); int APS5_VABI _ZNK3WTF13StringBuilder11reifyStringEv(); int APS5_VABI _ZNK3WTF14MediaTimeRange12toJSONStringEv(); @@ -7175,72 +6133,35 @@ int APS5_VABI _ZNK3WTF15AutomaticThread19hasUnderlyingThreadERKNS_14AbstractLock int APS5_VABI _ZNK3WTF15AutomaticThread4nameEv(); int APS5_VABI _ZNK3WTF17double_conversion23DoubleToStringConverter13ToExponentialEdiPNS0_13StringBuilderE(); int APS5_VABI _ZNK3WTF19MetaAllocatorHandle4dumpERNS_11PrintStreamE(); -int APS5_VABI _ZNK3WTF24TimeWithDynamicClockType13monotonicTimeEv(); -int APS5_VABI _ZNK3WTF24TimeWithDynamicClockType16nowWithSameClockEv(); -int APS5_VABI _ZNK3WTF24TimeWithDynamicClockType19approximateWallTimeEv(); -int APS5_VABI _ZNK3WTF24TimeWithDynamicClockType24approximateMonotonicTimeEv(); int APS5_VABI _ZNK3WTF24TimeWithDynamicClockType4dumpERNS_11PrintStreamE(); -int APS5_VABI _ZNK3WTF24TimeWithDynamicClockType8wallTimeEv(); -int APS5_VABI _ZNK3WTF24TimeWithDynamicClockTypegeERKS0_(); -int APS5_VABI _ZNK3WTF24TimeWithDynamicClockTypegtERKS0_(); -int APS5_VABI _ZNK3WTF24TimeWithDynamicClockTypeleERKS0_(); -int APS5_VABI _ZNK3WTF24TimeWithDynamicClockTypemiERKS0_(); -int APS5_VABI _ZNK3WTF3URL10protocolIsENS_10StringViewE(); -int APS5_VABI _ZNK3WTF3URL11encodedUserEv(); int APS5_VABI _ZNK3WTF3URL11hostAndPortEv(); -int APS5_VABI _ZNK3WTF3URL12isAboutBlankEv(); -int APS5_VABI _ZNK3WTF3URL13isAboutSrcDocEv(); int APS5_VABI _ZNK3WTF3URL14fileSystemPathEv(); -int APS5_VABI _ZNK3WTF3URL14isHierarchicalEv(); -int APS5_VABI _ZNK3WTF3URL15encodedPasswordEv(); int APS5_VABI _ZNK3WTF3URL16isMatchingDomainENS_10StringViewE(); int APS5_VABI _ZNK3WTF3URL17lastPathComponentEv(); -int APS5_VABI _ZNK3WTF3URL18fragmentIdentifierEv(); int APS5_VABI _ZNK3WTF3URL19protocolHostAndPortEv(); -int APS5_VABI _ZNK3WTF3URL20protocolIsJavaScriptEv(); int APS5_VABI _ZNK3WTF3URL21truncatedForUseAsBaseEv(); int APS5_VABI _ZNK3WTF3URL24strippedForUseAsReferrerEv(); -int APS5_VABI _ZNK3WTF3URL28queryWithLeadingQuestionMarkEv(); int APS5_VABI _ZNK3WTF3URL30stringCenterEllipsizedToLengthEj(); -int APS5_VABI _ZNK3WTF3URL39fragmentIdentifierWithLeadingNumberSignEv(); int APS5_VABI _ZNK3WTF3URL4dumpERNS_11PrintStreamE(); -int APS5_VABI _ZNK3WTF3URL4hostEv(); -int APS5_VABI _ZNK3WTF3URL4pathEv(); int APS5_VABI _ZNK3WTF3URL4userEv(); int APS5_VABI _ZNK3WTF3URL8passwordEv(); -int APS5_VABI _ZNK3WTF3URL8protocolEv(); int APS5_VABI _ZNK3WTF6Logger17LogSiteIdentifier8toStringEv(); int APS5_VABI _ZNK3WTF6String18simplifyWhiteSpaceEPFbDsE(); -int APS5_VABI _ZNK3WTF6String19characterStartingAtEj(); -int APS5_VABI _ZNK3WTF6String20substringSharingImplEjj(); -int APS5_VABI _ZNK3WTF6String23convertToASCIILowercaseEv(); -int APS5_VABI _ZNK3WTF6String23convertToASCIIUppercaseEv(); int APS5_VABI _ZNK3WTF6String25splitAllowingEmptyEntriesEDs(); -int APS5_VABI _ZNK3WTF6String27isSafeToSendToAnotherThreadEv(); int APS5_VABI _ZNK3WTF6String28convertToLowercaseWithLocaleERKNS_10AtomStringE(); int APS5_VABI _ZNK3WTF6String28convertToUppercaseWithLocaleERKNS_10AtomStringE(); int APS5_VABI _ZNK3WTF6String29charactersWithNullTerminationEv(); int APS5_VABI _ZNK3WTF6String31convertToLowercaseWithoutLocaleEv(); int APS5_VABI _ZNK3WTF6String31convertToUppercaseWithoutLocaleEv(); -int APS5_VABI _ZNK3WTF6String4utf8ENS_14ConversionModeE(); int APS5_VABI _ZNK3WTF6String57convertToLowercaseWithoutLocaleStartingAtFailingIndex8BitEj(); -int APS5_VABI _ZNK3WTF6String5asciiEv(); int APS5_VABI _ZNK3WTF6String5splitEDs(); -int APS5_VABI _ZNK3WTF6String6latin1Ev(); int APS5_VABI _ZNK3WTF6String7toFloatEPb(); int APS5_VABI _ZNK3WTF6String8foldCaseEv(); int APS5_VABI _ZNK3WTF6String8toDoubleEPb(); int APS5_VABI _ZNK3WTF6Thread4dumpERNS_11PrintStreamE(); -int APS5_VABI _ZNK3WTF7CPUTime23percentageCPUUsageSinceERKS0_(); -int APS5_VABI _ZNK3WTF7CString4hashEv(); int APS5_VABI _ZNK3WTF7RunLoop9TimerBase16secondsUntilFireEv(); int APS5_VABI _ZNK3WTF7RunLoop9TimerBase8isActiveEv(); int APS5_VABI _ZNK3WTF7Seconds4dumpERNS_11PrintStreamE(); -int APS5_VABI _ZNK3WTF7SecondsmiENS_13MonotonicTimeE(); -int APS5_VABI _ZNK3WTF7SecondsmiENS_8WallTimeE(); -int APS5_VABI _ZNK3WTF7SecondsmiERKNS_24TimeWithDynamicClockTypeE(); -int APS5_VABI _ZNK3WTF7SecondsplENS_13MonotonicTimeE(); -int APS5_VABI _ZNK3WTF7SecondsplENS_8WallTimeE(); int APS5_VABI _ZNK3WTF8Collator11collateUTF8EPKcS2_(); int APS5_VABI _ZNK3WTF8Collator7collateENS_10StringViewES1_(); int APS5_VABI _ZNK3WTF8JSONImpl10ObjectBase10memoryCostEv(); @@ -7256,7 +6177,6 @@ int APS5_VABI _ZNK3WTF8JSONImpl9ArrayBase10memoryCostEv(); int APS5_VABI _ZNK3WTF8JSONImpl9ArrayBase3getEm(); int APS5_VABI _ZNK3WTF8JSONImpl9ArrayBase5beginEv(); int APS5_VABI _ZNK3WTF8JSONImpl9ArrayBase9writeJSONERNS_13StringBuilderE(); -int APS5_VABI _ZNK3WTF8WallTime24approximateMonotonicTimeEv(); int APS5_VABI _ZNK3WTF8WallTime4dumpERNS_11PrintStreamE(); int APS5_VABI _ZNK3WTF9BitVector11isEmptySlowEv(); int APS5_VABI _ZNK3WTF9BitVector12bitCountSlowEv(); @@ -7294,13 +6214,10 @@ int APS5_VABI _ZNK3WTF9MediaTimengEv(); int APS5_VABI _ZNK3WTF9MediaTimentEv(); int APS5_VABI _ZNK3WTF9MediaTimeplERKS0_(); int APS5_VABI _ZNK7WebCore10FileHandlecvbEv(); -int APS5_VABI _ZNK7WebCore10FloatPoint15matrixTransformERKNS_15AffineTransformE(); -int APS5_VABI _ZNK7WebCore10FloatPoint18constrainedBetweenERKS0_S2_(); int APS5_VABI _ZNK7WebCore10FontRanges16fontForCharacterEi(); int APS5_VABI _ZNK7WebCore10FontRanges17fontForFirstRangeEv(); int APS5_VABI _ZNK7WebCore10FontRanges21glyphDataForCharacterEiNS_30ExternalResourceDownloadPolicyE(); int APS5_VABI _ZNK7WebCore10JSDocument7wrappedEv(); -int APS5_VABI _ZNK7WebCore10LayoutRect8containsERKS0_(); int APS5_VABI _ZNK7WebCore10MouseEvent11fromElementEv(); int APS5_VABI _ZNK7WebCore10MouseEvent9toElementEv(); int APS5_VABI _ZNK7WebCore10PluginData16supportsMimeTypeERKN3WTF6StringENS0_18AllowedPluginTypesE(); @@ -7470,7 +6387,6 @@ int APS5_VABI _ZNK7WebCore11RenderStyle15fontDescriptionEv(); int APS5_VABI _ZNK7WebCore11RenderStyle18computedLineHeightEv(); int APS5_VABI _ZNK7WebCore11RenderStyle26colorByApplyingColorFilterERKNS_5ColorE(); int APS5_VABI _ZNK7WebCore11RenderVideo8videoBoxEv(); -int APS5_VABI _ZNK7WebCore11RoundedRect8containsERKNS_10LayoutRectE(); int APS5_VABI _ZNK7WebCore11XPathResult10resultTypeEv(); int APS5_VABI _ZNK7WebCore11XPathResult11numberValueEv(); int APS5_VABI _ZNK7WebCore11XPathResult11stringValueEv(); @@ -7633,17 +6549,6 @@ int APS5_VABI _ZNK7WebCore15ActiveDOMObject18hasPendingActivityEv(); int APS5_VABI _ZNK7WebCore15ActiveDOMObject20isAllowedToRunScriptEv(); int APS5_VABI _ZNK7WebCore15ActiveDOMObject25virtualHasPendingActivityEv(); int APS5_VABI _ZNK7WebCore15ActiveDOMObject30assertSuspendIfNeededWasCalledEv(); -int APS5_VABI _ZNK7WebCore15AffineTransform10isIdentityEv(); -int APS5_VABI _ZNK7WebCore15AffineTransform22toTransformationMatrixEv(); -int APS5_VABI _ZNK7WebCore15AffineTransform6xScaleEv(); -int APS5_VABI _ZNK7WebCore15AffineTransform6yScaleEv(); -int APS5_VABI _ZNK7WebCore15AffineTransform7mapQuadERKNS_9FloatQuadE(); -int APS5_VABI _ZNK7WebCore15AffineTransform7mapRectERKNS_7IntRectE(); -int APS5_VABI _ZNK7WebCore15AffineTransform7mapRectERKNS_9FloatRectE(); -int APS5_VABI _ZNK7WebCore15AffineTransform7mapSizeERKNS_7IntSizeE(); -int APS5_VABI _ZNK7WebCore15AffineTransform7mapSizeERKNS_9FloatSizeE(); -int APS5_VABI _ZNK7WebCore15AffineTransform8mapPointERKNS_10FloatPointE(); -int APS5_VABI _ZNK7WebCore15AffineTransform8mapPointERKNS_8IntPointE(); int APS5_VABI _ZNK7WebCore15AffineTransform9mapRegionERKNS_6RegionE(); int APS5_VABI _ZNK7WebCore15CSSGroupingRule8cssRulesEv(); int APS5_VABI _ZNK7WebCore15CertificateInfo12isolatedCopyEv(); @@ -7946,12 +6851,6 @@ int APS5_VABI _ZNK7WebCore20ResourceResponseBase8lazyInitENS0_9InitLevelE(); int APS5_VABI _ZNK7WebCore20ResourceResponseBase8mimeTypeEv(); int APS5_VABI _ZNK7WebCore20ScrollingCoordinator25scrollableContainerNodeIDERKNS_12RenderObjectE(); int APS5_VABI _ZNK7WebCore20ScrollingCoordinator36coordinatesScrollingForOverflowLayerERKNS_11RenderLayerE(); -int APS5_VABI _ZNK7WebCore20TransformationMatrix12isInvertibleEv(); -int APS5_VABI _ZNK7WebCore20TransformationMatrix17toAffineTransformEv(); -int APS5_VABI _ZNK7WebCore20TransformationMatrix7mapQuadERKNS_9FloatQuadE(); -int APS5_VABI _ZNK7WebCore20TransformationMatrix7mapRectERKNS_7IntRectE(); -int APS5_VABI _ZNK7WebCore20TransformationMatrix7mapRectERKNS_9FloatRectE(); -int APS5_VABI _ZNK7WebCore20TransformationMatrix8mapPointERKNS_10FloatPointE(); int APS5_VABI _ZNK7WebCore21BackForwardController12forwardCountEv(); int APS5_VABI _ZNK7WebCore21BackForwardController18canGoBackOrForwardEi(); int APS5_VABI _ZNK7WebCore21BackForwardController9backCountEv(); @@ -8121,10 +7020,6 @@ int APS5_VABI _ZNK7WebCore4Page9selectionEv(); int APS5_VABI _ZNK7WebCore4Page9sessionIDEv(); int APS5_VABI _ZNK7WebCore4Path16fastBoundingRectEv(); int APS5_VABI _ZNK7WebCore4Text9wholeTextEv(); -int APS5_VABI _ZNK7WebCore5Color14colorWithAlphaEf(); -int APS5_VABI _ZNK7WebCore5Color8darkenedEv(); -int APS5_VABI _ZNK7WebCore5Color9lightnessEv(); -int APS5_VABI _ZNK7WebCore5Color9luminanceEv(); int APS5_VABI _ZNK7WebCore5Range10cloneRangeEv(); int APS5_VABI _ZNK7WebCore5Range11compareNodeERNS_4NodeE(); int APS5_VABI _ZNK7WebCore5Range12comparePointERNS_4NodeEj(); @@ -8211,9 +7106,6 @@ int APS5_VABI _ZNK7WebCore7Element20getIntegralAttributeERKNS_13QualifiedNameE() int APS5_VABI _ZNK7WebCore7Element28getUnsignedIntegralAttributeERKNS_13QualifiedNameE(); int APS5_VABI _ZNK7WebCore7Element9innerHTMLEv(); int APS5_VABI _ZNK7WebCore7Element9outerHTMLEv(); -int APS5_VABI _ZNK7WebCore7IntRect10intersectsERKS0_(); -int APS5_VABI _ZNK7WebCore7IntRect8containsERKS0_(); -int APS5_VABI _ZNK7WebCore7IntSize18constrainedBetweenERKS0_S2_(); int APS5_VABI _ZNK7WebCore8DOMTimer24intervalClampedToMinimumEv(); int APS5_VABI _ZNK7WebCore8Document10alinkColorEv(); int APS5_VABI _ZNK7WebCore8Document10compatModeEv(); @@ -8257,7 +7149,6 @@ int APS5_VABI _ZNK7WebCore8FormData13lengthInBytesEv(); int APS5_VABI _ZNK7WebCore8FormData14asSharedBufferEv(); int APS5_VABI _ZNK7WebCore8FormData7flattenEv(); int APS5_VABI _ZNK7WebCore8FormData9asBlobURLEv(); -int APS5_VABI _ZNK7WebCore8IntPoint18constrainedBetweenERKS0_S2_(); int APS5_VABI _ZNK7WebCore8Location4hostEv(); int APS5_VABI _ZNK7WebCore8Position10downstreamENS_27EditingBoundaryCrossingRuleE(); int APS5_VABI _ZNK7WebCore8Position13containerNodeEv(); @@ -8280,15 +7171,6 @@ int APS5_VABI _ZNK7WebCore9CookieJar13getRawCookiesERKNS_8DocumentERKN3WTF3URLER int APS5_VABI _ZNK7WebCore9CookieJar14cookiesEnabledERKNS_8DocumentE(); int APS5_VABI _ZNK7WebCore9CookieJar29cookieRequestHeaderFieldValueERNS_8DocumentERKN3WTF3URLE(); int APS5_VABI _ZNK7WebCore9CookieJar7cookiesERNS_8DocumentERKN3WTF3URLE(); -int APS5_VABI _ZNK7WebCore9FloatQuad11boundingBoxEv(); -int APS5_VABI _ZNK7WebCore9FloatQuad12containsQuadERKS0_(); -int APS5_VABI _ZNK7WebCore9FloatQuad13containsPointERKNS_10FloatPointE(); -int APS5_VABI _ZNK7WebCore9FloatQuad13isRectilinearEv(); -int APS5_VABI _ZNK7WebCore9FloatRect10intersectsERKS0_(); -int APS5_VABI _ZNK7WebCore9FloatRect21inclusivelyIntersectsERKS0_(); -int APS5_VABI _ZNK7WebCore9FloatRect8containsERKNS_10FloatPointENS0_12ContainsModeE(); -int APS5_VABI _ZNK7WebCore9FloatSize18constrainedBetweenERKS0_S2_(); -int APS5_VABI _ZNK7WebCore9FloatSize6isZeroEv(); int APS5_VABI _ZNK7WebCore9FrameTree10childCountEv(); int APS5_VABI _ZNK7WebCore9FrameTree11scopedChildEj(); int APS5_VABI _ZNK7WebCore9FrameTree12traverseNextENS_7CanWrapEPNS_7DidWrapE(); diff --git a/core/libs/prx/libSceNKWebKit/include/JscExports.hpp b/core/libs/prx/libSceNKWebKit/include/JscExports.hpp new file mode 100644 index 0000000000..625cb18b6f --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/include/JscExports.hpp @@ -0,0 +1,140 @@ +#pragma once + +#include "SceTypes.hpp" +#include "prx/libSceNKWebKit/src/JscApi.hpp" +#include +#include + +extern "C" { + +bool APS5_VABI JSCheckScriptSyntax(NKWebKit::JSContextRef ctx, NKWebKit::JSStringRef script, NKWebKit::JSStringRef sourceURL, int startingLineNumber, NKWebKit::JSValueRef* exception); +NKWebKit::JSClassRef APS5_VABI JSClassCreate(const NKWebKit::JSClassDefinition* definition); +void APS5_VABI JSClassRelease(NKWebKit::JSClassRef jsClass); +NKWebKit::JSClassRef APS5_VABI JSClassRetain(NKWebKit::JSClassRef jsClass); +NKWebKit::JSGlobalContextRef APS5_VABI JSContextGetGlobalContext(NKWebKit::JSContextRef ctx); +NKWebKit::JSObjectRef APS5_VABI JSContextGetGlobalObject(NKWebKit::JSContextRef ctx); +NKWebKit::JSContextGroupRef APS5_VABI JSContextGetGroup(NKWebKit::JSContextRef ctx); +void APS5_VABI JSContextGroupAddHeapFinalizer(NKWebKit::JSContextGroupRef group, NKWebKit::JSHeapFinalizer finalizer, void* userData); +void APS5_VABI JSContextGroupAddMarkingConstraint(NKWebKit::JSContextGroupRef group, NKWebKit::JSMarkingConstraint constraintFunction, void* userData); +void APS5_VABI JSContextGroupClearExecutionTimeLimit(NKWebKit::JSContextGroupRef group); +NKWebKit::JSContextGroupRef APS5_VABI JSContextGroupCreate(); +void APS5_VABI JSContextGroupRelease(NKWebKit::JSContextGroupRef group); +void APS5_VABI JSContextGroupRemoveHeapFinalizer(NKWebKit::JSContextGroupRef group, NKWebKit::JSHeapFinalizer finalizer, void* userData); +NKWebKit::JSContextGroupRef APS5_VABI JSContextGroupRetain(NKWebKit::JSContextGroupRef group); +void APS5_VABI JSContextGroupSetExecutionTimeLimit(NKWebKit::JSContextGroupRef group, double limit, NKWebKit::JSShouldTerminateCallback callback, void* callbackContext); +void APS5_VABI JSDisableGCTimer(); +NKWebKit::JSValueRef APS5_VABI JSEvaluateScript(NKWebKit::JSContextRef ctx, NKWebKit::JSStringRef script, NKWebKit::JSObjectRef thisObject, NKWebKit::JSStringRef sourceURL, int startingLineNumber, NKWebKit::JSValueRef* exception); +void APS5_VABI JSGarbageCollect(NKWebKit::JSContextRef ctx); +NKWebKit::JSObjectRef APS5_VABI JSGetMemoryUsageStatistics(NKWebKit::JSContextRef ctx); +NKWebKit::JSStringRef APS5_VABI JSGlobalContextCopyName(NKWebKit::JSGlobalContextRef ctx); +NKWebKit::JSGlobalContextRef APS5_VABI JSGlobalContextCreate(NKWebKit::JSClassRef globalObjectClass); +NKWebKit::JSGlobalContextRef APS5_VABI JSGlobalContextCreateInGroup(NKWebKit::JSContextGroupRef group, NKWebKit::JSClassRef globalObjectClass); +bool APS5_VABI JSGlobalContextGetIncludesNativeCallStackWhenReportingExceptions(NKWebKit::JSGlobalContextRef ctx); +bool APS5_VABI JSGlobalContextGetRemoteInspectionEnabled(NKWebKit::JSGlobalContextRef ctx); +void APS5_VABI JSGlobalContextRelease(NKWebKit::JSGlobalContextRef ctx); +NKWebKit::JSGlobalContextRef APS5_VABI JSGlobalContextRetain(NKWebKit::JSGlobalContextRef ctx); +void APS5_VABI JSGlobalContextSetIncludesNativeCallStackWhenReportingExceptions(NKWebKit::JSGlobalContextRef ctx, bool includesNativeCallStack); +void APS5_VABI JSGlobalContextSetName(NKWebKit::JSGlobalContextRef ctx, NKWebKit::JSStringRef name); +void APS5_VABI JSGlobalContextSetRemoteInspectionEnabled(NKWebKit::JSGlobalContextRef ctx, bool enabled); +void APS5_VABI JSGlobalContextSetUnhandledRejectionCallback(NKWebKit::JSGlobalContextRef ctx, NKWebKit::JSObjectRef function, NKWebKit::JSValueRef* exception); +NKWebKit::JSObjectRef APS5_VABI JSObjectCallAsConstructor(NKWebKit::JSContextRef ctx, NKWebKit::JSObjectRef object, std::size_t argumentCount, const NKWebKit::JSValueRef arguments[], NKWebKit::JSValueRef* exception); +NKWebKit::JSValueRef APS5_VABI JSObjectCallAsFunction(NKWebKit::JSContextRef ctx, NKWebKit::JSObjectRef object, NKWebKit::JSObjectRef thisObject, std::size_t argumentCount, const NKWebKit::JSValueRef arguments[], NKWebKit::JSValueRef* exception); +NKWebKit::JSPropertyNameArrayRef APS5_VABI JSObjectCopyPropertyNames(NKWebKit::JSContextRef ctx, NKWebKit::JSObjectRef object); +bool APS5_VABI JSObjectDeletePrivateProperty(NKWebKit::JSContextRef ctx, NKWebKit::JSObjectRef object, NKWebKit::JSStringRef propertyName); +bool APS5_VABI JSObjectDeleteProperty(NKWebKit::JSContextRef ctx, NKWebKit::JSObjectRef object, NKWebKit::JSStringRef propertyName, NKWebKit::JSValueRef* exception); +bool APS5_VABI JSObjectDeletePropertyForKey(NKWebKit::JSContextRef ctx, NKWebKit::JSObjectRef object, NKWebKit::JSValueRef propertyKey, NKWebKit::JSValueRef* exception); +std::size_t APS5_VABI JSObjectGetArrayBufferByteLength(NKWebKit::JSContextRef ctx, NKWebKit::JSObjectRef object, NKWebKit::JSValueRef* exception); +void* APS5_VABI JSObjectGetArrayBufferBytesPtr(NKWebKit::JSContextRef ctx, NKWebKit::JSObjectRef object, NKWebKit::JSValueRef* exception); +NKWebKit::JSGlobalContextRef APS5_VABI JSObjectGetGlobalContext(NKWebKit::JSObjectRef object); +void* APS5_VABI JSObjectGetPrivate(NKWebKit::JSObjectRef object); +NKWebKit::JSValueRef APS5_VABI JSObjectGetPrivateProperty(NKWebKit::JSContextRef ctx, NKWebKit::JSObjectRef object, NKWebKit::JSStringRef propertyName); +NKWebKit::JSValueRef APS5_VABI JSObjectGetProperty(NKWebKit::JSContextRef ctx, NKWebKit::JSObjectRef object, NKWebKit::JSStringRef propertyName, NKWebKit::JSValueRef* exception); +NKWebKit::JSValueRef APS5_VABI JSObjectGetPropertyAtIndex(NKWebKit::JSContextRef ctx, NKWebKit::JSObjectRef object, unsigned propertyIndex, NKWebKit::JSValueRef* exception); +NKWebKit::JSValueRef APS5_VABI JSObjectGetPropertyForKey(NKWebKit::JSContextRef ctx, NKWebKit::JSObjectRef object, NKWebKit::JSValueRef propertyKey, NKWebKit::JSValueRef* exception); +NKWebKit::JSValueRef APS5_VABI JSObjectGetPrototype(NKWebKit::JSContextRef ctx, NKWebKit::JSObjectRef object); +NKWebKit::JSObjectRef APS5_VABI JSObjectGetProxyTarget(NKWebKit::JSObjectRef object); +NKWebKit::JSObjectRef APS5_VABI JSObjectGetTypedArrayBuffer(NKWebKit::JSContextRef ctx, NKWebKit::JSObjectRef object, NKWebKit::JSValueRef* exception); +std::size_t APS5_VABI JSObjectGetTypedArrayByteLength(NKWebKit::JSContextRef ctx, NKWebKit::JSObjectRef object, NKWebKit::JSValueRef* exception); +std::size_t APS5_VABI JSObjectGetTypedArrayByteOffset(NKWebKit::JSContextRef ctx, NKWebKit::JSObjectRef object, NKWebKit::JSValueRef* exception); +void* APS5_VABI JSObjectGetTypedArrayBytesPtr(NKWebKit::JSContextRef ctx, NKWebKit::JSObjectRef object, NKWebKit::JSValueRef* exception); +std::size_t APS5_VABI JSObjectGetTypedArrayLength(NKWebKit::JSContextRef ctx, NKWebKit::JSObjectRef object, NKWebKit::JSValueRef* exception); +bool APS5_VABI JSObjectHasProperty(NKWebKit::JSContextRef ctx, NKWebKit::JSObjectRef object, NKWebKit::JSStringRef propertyName); +bool APS5_VABI JSObjectIsConstructor(NKWebKit::JSContextRef ctx, NKWebKit::JSObjectRef object); +bool APS5_VABI JSObjectIsFunction(NKWebKit::JSContextRef ctx, NKWebKit::JSObjectRef object); +NKWebKit::JSObjectRef APS5_VABI JSObjectMake(NKWebKit::JSContextRef ctx, NKWebKit::JSClassRef jsClass, void* data); +NKWebKit::JSObjectRef APS5_VABI JSObjectMakeArray(NKWebKit::JSContextRef ctx, std::size_t argumentCount, const NKWebKit::JSValueRef arguments[], NKWebKit::JSValueRef* exception); +NKWebKit::JSObjectRef APS5_VABI JSObjectMakeArrayBufferWithBytesNoCopy(NKWebKit::JSContextRef ctx, void* bytes, std::size_t byteLength, NKWebKit::JSTypedArrayBytesDeallocator bytesDeallocator, void* deallocatorContext, NKWebKit::JSValueRef* exception); +NKWebKit::JSObjectRef APS5_VABI JSObjectMakeConstructor(NKWebKit::JSContextRef ctx, NKWebKit::JSClassRef jsClass, NKWebKit::JSObjectCallAsConstructorCallback callAsConstructor); +NKWebKit::JSObjectRef APS5_VABI JSObjectMakeDate(NKWebKit::JSContextRef ctx, std::size_t argumentCount, const NKWebKit::JSValueRef arguments[], NKWebKit::JSValueRef* exception); +NKWebKit::JSObjectRef APS5_VABI JSObjectMakeDeferredPromise(NKWebKit::JSContextRef ctx, NKWebKit::JSObjectRef* resolve, NKWebKit::JSObjectRef* reject, NKWebKit::JSValueRef* exception); +NKWebKit::JSObjectRef APS5_VABI JSObjectMakeError(NKWebKit::JSContextRef ctx, std::size_t argumentCount, const NKWebKit::JSValueRef arguments[], NKWebKit::JSValueRef* exception); +NKWebKit::JSObjectRef APS5_VABI JSObjectMakeFunction(NKWebKit::JSContextRef ctx, NKWebKit::JSStringRef name, unsigned parameterCount, const NKWebKit::JSStringRef parameterNames[], NKWebKit::JSStringRef body, NKWebKit::JSStringRef sourceURL, int startingLineNumber, NKWebKit::JSValueRef* exception); +NKWebKit::JSObjectRef APS5_VABI JSObjectMakeFunctionWithCallback(NKWebKit::JSContextRef ctx, NKWebKit::JSStringRef name, NKWebKit::JSObjectCallAsFunctionCallback callAsFunction); +NKWebKit::JSObjectRef APS5_VABI JSObjectMakeRegExp(NKWebKit::JSContextRef ctx, std::size_t argumentCount, const NKWebKit::JSValueRef arguments[], NKWebKit::JSValueRef* exception); +NKWebKit::JSObjectRef APS5_VABI JSObjectMakeTypedArray(NKWebKit::JSContextRef ctx, NKWebKit::JSTypedArrayType arrayType, std::size_t length, NKWebKit::JSValueRef* exception); +NKWebKit::JSObjectRef APS5_VABI JSObjectMakeTypedArrayWithArrayBuffer(NKWebKit::JSContextRef ctx, NKWebKit::JSTypedArrayType arrayType, NKWebKit::JSObjectRef buffer, NKWebKit::JSValueRef* exception); +NKWebKit::JSObjectRef APS5_VABI JSObjectMakeTypedArrayWithArrayBufferAndOffset(NKWebKit::JSContextRef ctx, NKWebKit::JSTypedArrayType arrayType, NKWebKit::JSObjectRef buffer, std::size_t byteOffset, std::size_t length, NKWebKit::JSValueRef* exception); +NKWebKit::JSObjectRef APS5_VABI JSObjectMakeTypedArrayWithBytesNoCopy(NKWebKit::JSContextRef ctx, NKWebKit::JSTypedArrayType arrayType, void* bytes, std::size_t byteLength, NKWebKit::JSTypedArrayBytesDeallocator bytesDeallocator, void* deallocatorContext, NKWebKit::JSValueRef* exception); +bool APS5_VABI JSObjectSetPrivate(NKWebKit::JSObjectRef object, void* data); +bool APS5_VABI JSObjectSetPrivateProperty(NKWebKit::JSContextRef ctx, NKWebKit::JSObjectRef object, NKWebKit::JSStringRef propertyName, NKWebKit::JSValueRef value); +void APS5_VABI JSObjectSetProperty(NKWebKit::JSContextRef ctx, NKWebKit::JSObjectRef object, NKWebKit::JSStringRef propertyName, NKWebKit::JSValueRef value, NKWebKit::JSPropertyAttributes attributes, NKWebKit::JSValueRef* exception); +void APS5_VABI JSObjectSetPropertyAtIndex(NKWebKit::JSContextRef ctx, NKWebKit::JSObjectRef object, unsigned propertyIndex, NKWebKit::JSValueRef value, NKWebKit::JSValueRef* exception); +void APS5_VABI JSObjectSetPropertyForKey(NKWebKit::JSContextRef ctx, NKWebKit::JSObjectRef object, NKWebKit::JSValueRef propertyKey, NKWebKit::JSValueRef value, NKWebKit::JSPropertyAttributes attributes, NKWebKit::JSValueRef* exception); +void APS5_VABI JSObjectSetPrototype(NKWebKit::JSContextRef ctx, NKWebKit::JSObjectRef object, NKWebKit::JSValueRef value); +void APS5_VABI JSPropertyNameAccumulatorAddName(NKWebKit::JSPropertyNameAccumulatorRef accumulator, NKWebKit::JSStringRef propertyName); +std::size_t APS5_VABI JSPropertyNameArrayGetCount(NKWebKit::JSPropertyNameArrayRef array); +NKWebKit::JSStringRef APS5_VABI JSPropertyNameArrayGetNameAtIndex(NKWebKit::JSPropertyNameArrayRef array, std::size_t index); +void APS5_VABI JSPropertyNameArrayRelease(NKWebKit::JSPropertyNameArrayRef array); +NKWebKit::JSPropertyNameArrayRef APS5_VABI JSPropertyNameArrayRetain(NKWebKit::JSPropertyNameArrayRef array); +bool APS5_VABI JSRemoteInspectorGetInspectionEnabledByDefault(); +void APS5_VABI JSRemoteInspectorSetInspectionEnabledByDefault(bool enabledByDefault); +void APS5_VABI JSReportExtraMemoryCost(NKWebKit::JSContextRef ctx, std::size_t size); +NKWebKit::JSScriptRef APS5_VABI JSScriptCreateFromString(NKWebKit::JSContextGroupRef group, NKWebKit::JSStringRef url, int startingLineNumber, NKWebKit::JSStringRef source, NKWebKit::JSStringRef* errorMessage, int* errorLine); +NKWebKit::JSScriptRef APS5_VABI JSScriptCreateReferencingImmortalASCIIText(NKWebKit::JSContextGroupRef group, NKWebKit::JSStringRef url, int startingLineNumber, const char* source, std::size_t length, NKWebKit::JSStringRef* errorMessage, int* errorLine); +NKWebKit::JSValueRef APS5_VABI JSScriptEvaluate(NKWebKit::JSContextRef ctx, NKWebKit::JSScriptRef script, NKWebKit::JSValueRef thisValueRef, NKWebKit::JSValueRef* exception); +void APS5_VABI JSScriptRelease(NKWebKit::JSScriptRef script); +void APS5_VABI JSScriptRetain(NKWebKit::JSScriptRef script); +GuestJSString* APS5_VABI JSStringCreateWithCharactersNoCopy(const std::uint16_t* chars, std::size_t numChars); +void APS5_VABI JSSynchronousEdenCollectForDebugging(NKWebKit::JSContextRef ctx); +void APS5_VABI JSSynchronousGarbageCollectForDebugging(NKWebKit::JSContextRef ctx); +NKWebKit::JSStringRef APS5_VABI JSValueCreateJSONString(NKWebKit::JSContextRef ctx, NKWebKit::JSValueRef value, unsigned indent, NKWebKit::JSValueRef* exception); +NKWebKit::JSType APS5_VABI JSValueGetType(NKWebKit::JSContextRef ctx, NKWebKit::JSValueRef value); +NKWebKit::JSTypedArrayType APS5_VABI JSValueGetTypedArrayType(NKWebKit::JSContextRef ctx, NKWebKit::JSValueRef value, NKWebKit::JSValueRef* exception); +bool APS5_VABI JSValueIsArray(NKWebKit::JSContextRef ctx, NKWebKit::JSValueRef value); +bool APS5_VABI JSValueIsBoolean(NKWebKit::JSContextRef ctx, NKWebKit::JSValueRef value); +bool APS5_VABI JSValueIsDate(NKWebKit::JSContextRef ctx, NKWebKit::JSValueRef value); +bool APS5_VABI JSValueIsEqual(NKWebKit::JSContextRef ctx, NKWebKit::JSValueRef a, NKWebKit::JSValueRef b, NKWebKit::JSValueRef* exception); +bool APS5_VABI JSValueIsInstanceOfConstructor(NKWebKit::JSContextRef ctx, NKWebKit::JSValueRef value, NKWebKit::JSObjectRef constructor, NKWebKit::JSValueRef* exception); +bool APS5_VABI JSValueIsNull(NKWebKit::JSContextRef ctx, NKWebKit::JSValueRef value); +bool APS5_VABI JSValueIsNumber(NKWebKit::JSContextRef ctx, NKWebKit::JSValueRef value); +bool APS5_VABI JSValueIsObject(NKWebKit::JSContextRef ctx, NKWebKit::JSValueRef value); +bool APS5_VABI JSValueIsObjectOfClass(NKWebKit::JSContextRef ctx, NKWebKit::JSValueRef value, NKWebKit::JSClassRef jsClass); +bool APS5_VABI JSValueIsStrictEqual(NKWebKit::JSContextRef ctx, NKWebKit::JSValueRef a, NKWebKit::JSValueRef b); +bool APS5_VABI JSValueIsString(NKWebKit::JSContextRef ctx, NKWebKit::JSValueRef value); +bool APS5_VABI JSValueIsSymbol(NKWebKit::JSContextRef ctx, NKWebKit::JSValueRef value); +bool APS5_VABI JSValueIsUndefined(NKWebKit::JSContextRef ctx, NKWebKit::JSValueRef value); +NKWebKit::JSValueRef APS5_VABI JSValueMakeBoolean(NKWebKit::JSContextRef ctx, bool boolean); +NKWebKit::JSValueRef APS5_VABI JSValueMakeFromJSONString(NKWebKit::JSContextRef ctx, NKWebKit::JSStringRef string); +NKWebKit::JSValueRef APS5_VABI JSValueMakeNull(NKWebKit::JSContextRef ctx); +NKWebKit::JSValueRef APS5_VABI JSValueMakeNumber(NKWebKit::JSContextRef ctx, double number); +NKWebKit::JSValueRef APS5_VABI JSValueMakeSymbol(NKWebKit::JSContextRef ctx, NKWebKit::JSStringRef description); +NKWebKit::JSValueRef APS5_VABI JSValueMakeUndefined(NKWebKit::JSContextRef ctx); +void APS5_VABI JSValueProtect(NKWebKit::JSContextRef ctx, NKWebKit::JSValueRef value); +bool APS5_VABI JSValueToBoolean(NKWebKit::JSContextRef ctx, NKWebKit::JSValueRef value); +double APS5_VABI JSValueToNumber(NKWebKit::JSContextRef ctx, NKWebKit::JSValueRef value, NKWebKit::JSValueRef* exception); +NKWebKit::JSObjectRef APS5_VABI JSValueToObject(NKWebKit::JSContextRef ctx, NKWebKit::JSValueRef value, NKWebKit::JSValueRef* exception); +NKWebKit::JSStringRef APS5_VABI JSValueToStringCopy(NKWebKit::JSContextRef ctx, NKWebKit::JSValueRef value, NKWebKit::JSValueRef* exception); +void APS5_VABI JSValueUnprotect(NKWebKit::JSContextRef ctx, NKWebKit::JSValueRef value); +NKWebKit::JSWeakRef APS5_VABI JSWeakCreate(NKWebKit::JSContextGroupRef group, NKWebKit::JSObjectRef object); +NKWebKit::JSObjectRef APS5_VABI JSWeakGetObject(NKWebKit::JSWeakRef weak); +NKWebKit::JSObjectRef APS5_VABI JSWeakObjectMapGet(NKWebKit::JSContextRef ctx, NKWebKit::JSWeakObjectMapRef map, void* key); +bool APS5_VABI JSWeakObjectMapRemove(NKWebKit::JSContextRef ctx, NKWebKit::JSWeakObjectMapRef map, void* key); +void APS5_VABI JSWeakObjectMapSet(NKWebKit::JSContextRef ctx, NKWebKit::JSWeakObjectMapRef map, void* key, NKWebKit::JSObjectRef object); +void APS5_VABI JSWeakRelease(NKWebKit::JSWeakRef weak); +void APS5_VABI JSWeakRetain(NKWebKit::JSWeakRef weak); +void APS5_VABI _ZN13OpaqueJSClassD1Ev(NKWebKit::OpaqueJSClass* self); +void APS5_VABI _ZN13OpaqueJSClassD2Ev(NKWebKit::OpaqueJSClass* self); +void APS5_VABI _ZN14OpaqueJSStringD1Ev(GuestJSString* self); +void APS5_VABI _ZN14OpaqueJSStringD2Ev(GuestJSString* self); + +} diff --git a/core/libs/prx/libSceNKWebKit/include/LegacyExports.hpp b/core/libs/prx/libSceNKWebKit/include/LegacyExports.hpp new file mode 100644 index 0000000000..936070e268 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/include/LegacyExports.hpp @@ -0,0 +1,2401 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceNKWebKitLegacyUnknown__plus__plus_v_plus_KlCLFK8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__plus_3x15QTFgbE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__plus_GswMYdofqU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__plus_ql0c7n6O7g_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__plus_vYbN13ER6E_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__plus_yQL0OwuFF0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__plus_ywmZyVOmck_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__plus_z6_minus_FwD_plus_tTk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__plus_zB9xXLFJgU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_0sh4cUML6A_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_11_plus_UlGuM2c_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_1m9ME90DBs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_5bKeSMgJmo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_6ZCz5jKYD0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_6fHtBCBprM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_CsJzdsf8W8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_DHemZ_plus_GUvg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_Gl_minus_h_plus_vKl14_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_HXv2nr0jQY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_KAFm9ogxVU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_KN6FGZnxzs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_MlTHMZSyok_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_P2S5xXIrJA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_PMWKYwBckw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_Sfv5wYgPII_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_ULswyDImAE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_VR6wClvMLE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_VuMy2HRhOk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_ZgVWWKVFxM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_aFZ7KgGnP0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_bAOp4w2_plus_xU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_bw_minus_RAJILdQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_byOlo6AGuE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_cLkFY3gJ_minus_U_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_cSBibV9kcg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_cSnNI8Oe74_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_cn9shohjwo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_dpBUekyxiY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_gm8FTrfR3g_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_mU5FIJnEQw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_pnxCYYTHdA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_r0HgIg9s9o_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_rvO2El6asc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_t_plus_qNlMCAQU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_tMIMzDv13g_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_tpoeCMP1oE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_uGg2VIywqc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_uyhX_plus_nfLTw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown__minus_zBw8551Q0Q_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_0_minus_ZdVDOV_plus_Yc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_01GvW40Rco8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_01ujcXr_minus_BT8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_031dJi8CRG4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_05ISb1sxzE4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_08YRbeTpcSk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_08u5HmSZLWI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_09XYbBK4zOk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_0AVQjKBoUZQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_0Asl1MoAb7Y_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_0C2wShXZc8Q_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_0CXUHdlOyB0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_0D2KyH6te08_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_0FfP3qcsmAw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_0GGFzi4CsQg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_0H810BYRZk0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_0HG6ycBGyNs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_0JxNOxFh7mU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_0M5xxtd3KVs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_0Nda0t_minus_A_plus_8A_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_0PGKqY9wbgg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_0Pcj1zY3QX0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_0Vm5ZtZD8Zw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_0W5pY_plus_f2e8M_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_0ZS1wR9V5NA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_0ae0oDSPoAg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_0bKu3ZjjnMY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_0bkH4IQFtTc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_0hC6Uj6W6wU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_0j_plus_UOubWqvU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_0k9yhLp_plus_cHE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_0krKV0DRrAk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_0lDFiUba_minus_Qc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_0lgq0Nb5PZg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_0mgFAAcQ5oc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_0mhooUPTcOI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_0oR2Is0DWTQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_0qPkXg6hR0M_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_0twFo_plus_SpZ8M_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_0w6LRl9ZOGc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_10sQaMQxi70_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_14Zfc72Ykbc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_14pK67tlLag_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_15TtZHNz4Zg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_195DFuuHr6U_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_1M8YTpO_minus_JyM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_1P8wwHM7De8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_1QPJreBoNXY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_1QYet5c7akM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_1Wij5bpNZbk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_1a5hFKC5SdU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_1bCfZiqfPT4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_1cBDX0UvFXE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_1cqAxUdM5E4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_1g2ot19eUEk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_1hNKARbz3I4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_1hPemFIVUys_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_1kkTnF6SNog_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_1lC32Kty_plus_84_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_1nQ_plus_8zpQbns_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_1sqJ_plus_5rsEzs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_1w_plus_iLcjzd10_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_1wgLUOSOs9Q_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_2_plus_uRH9hvLWM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_2_minus_E7zx_plus_MSTE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_2_minus_Htz3Rhqy4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_20fktvybHIM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_21MSzOuqZi0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_22GfJEfmVVM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_22ngKDr3G28_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_23jQPF1C6aE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_27E4o5mMxTs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_2BlJ_minus_QwxMRo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_2D9yfogw5bs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_2DDULE_minus_MYmQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_2EVvhVabsJM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_2GdBuLgUeSI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_2LKVAt2Daw8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_2M0ZLmwaVd8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_2NThFFu5XdE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_2PX8AY1a0Eo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_2QhFHIOZPNM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_2R7sNgYqmi0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_2SYvas_minus_fF18_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_2U8P_plus_6Bcrd4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_2WqXdvWNwdY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_2YS0DtL8qSc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_2Yc8JPHyUSY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_2aBO17Mqrpw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_2awYqsMSHr0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_2bOKQcArI2k_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_2d1tYzrlpS8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_2dbm0DhmsPc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_2dnaEy8W7Q0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_2hEyEaCxl8A_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_2hoav7M2FjY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_2jdQQaVWuAw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_2kDZb3V0F5g_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_2m3K29qJSuM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_2mrmvVrTd_minus_w_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_2oCktOzZ86s_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_2vSWgtyiSPg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_2x24iCBAFo4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_2xwKcxPCnpA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_3_plus_XgrwoE_plus_KQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_3_minus_NJmGjTdGU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_30O8gNuBEx8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_34Ri_minus_I2zseI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_36GRau6llzM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_38zYSKmTGIc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_39_minus_glXtDPsE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_3AFe2ppI85A_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_3AsGIs7lx2w_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_3BNqOa83GtA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_3Dq2mSdXqgE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_3FiKO2eDhvU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_3H2suBucSJI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_3JhQ4Bntk_plus_o_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_3KCaG4gsj7k_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_3LK6wLO8kxY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_3MUAm69291I_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_3QDJXWo8JlM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_3WhL7xY5dHM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_3XR2IhSEjfM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_3YC2LF72_minus_f4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_3cu_plus_NjdfhSU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_3jEYk0EGAyY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_3ktOaECB77A_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_3lXEdk0z8pE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_3lXfROkmZXg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_3mzq2F6BGBE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_3qTwQ5MjCiU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_3qxE14ptOEo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_3vsGWl6l7LY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_3wiEzJG_plus_o5A_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_3wxAGOWA5rw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_3yRgYSwNWAE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4_plus_xG8NftNiY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4_minus_WCEZyXPog_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_40_plus_6pS1CK6w_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_408v7lhN4QU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_42u6gUWvUTg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_44vO54zyfwM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_45XFIt8UG6k_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_45z6WoZYP_minus_A_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_47lUe3tPqY0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_48xOTJNKul0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4A_minus_G9UeZp5k_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4AzDMjaSMI4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4Bvq8TB95oA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4DEzfatKlS0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4DYQZqufDdI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4EzrAohwbaI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4GlEjaWWXdo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4MLq_plus_nXcg1A_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4N5OJ0irX88_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4OP5qoYLgE0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4R5DWBzSrag_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4TS7CSj8s00_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4U9CKqxDyK8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4UFYk_minus_Rr_plus_EM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4WYxZvXzQow_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4XS2Wv8dC5Q_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4Y0OZ9CebmM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4bOt65l9CT8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4ejzo1EOtPM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4fymWXPdseo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4gDriHUPM_plus_k_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4hPLek5k2kQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4kECg3pDbnI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4kJcQKeuIOg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4kKYBQ3b5HQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4liiepBP0Ac_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4mtpkZh7myg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4n5s0cpDf9w_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4oRem_minus_AuOiA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4r_minus_B36POyF0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4rK4KSfYuW4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4t8oDmpFfGw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4v4AzFlXiQM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4x9f9f50VxA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4xLuLt_minus_6LXI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4yTdU9Hg_minus_Rw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_4zjydcbDOv4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_53XsM4QkTfc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_55PWVPMKRBQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_564_minus_xfiutdc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_58xOuBct8co_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_59Je3FKsDu4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_5BGpQ4IRBHA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_5BQsDP_minus_Id8g_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_5ESzBPcRI7U_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_5EU0WjubeF0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_5F9VIeQgPyU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_5GU52ZPB07s_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_5K0NVMGxk7E_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_5N0mvyPNqqo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_5NBTfOR8YYo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_5Q6JTf0hQvI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_5QF2sLtBPOU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_5RICSJuTYNs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_5S41GRIUTOQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_5XDBYQU1Fc0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_5Xbk73Dvu8E_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_5YGfwZHHFbw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_5Yyd2vDsUWg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_5ZZWCZQJF_plus_M_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_5cJ3RuOZuBs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_5j6_minus_WEttbuw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_5jpU6nIoG7s_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_5pbw5vA7vRQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_5rCCrgOuFtQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_5rINiSr7Wa8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_5rS_minus_6rO0R6g_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_5s4TinvE_plus_1c_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_5sNT63YuvME_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_5trdnX5Neq0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_5u_minus_OHNy_plus_7cc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_5udeImdKV88_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_5w_plus_Rr9_plus_LpNk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_5wtV7AmfJHM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_5zNKDCKx4bU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_5zyEbeBeTlE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_6_plus_57_plus_Sew7Gc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_61wgc_minus_NcB7U_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_64qh3Wh088M_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_64zPqAZVyN8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_655LHN8zlcI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_67xw5D1OJts_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_68a7dt2jTZo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_6964_minus_bbBA9Q_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_6CD9L46HBRQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_6FHQ2_minus_xTuPY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_6FzbW6sUGgo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_6G7dGMr3wtI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_6HZNd7nhoLo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_6OD_minus_q4DoVyE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_6OdqxwePEgA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_6Ra_plus_NbLw5iU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_6RxzKEvl31I_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_6TIkwWdSsy0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_6V_plus_as96kvy4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_6ZQ64IUQsOA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_6b1uHtKrbEo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_6cbxzqSLXVU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_6cxt2rJQec0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_6dHgysQUfVc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_6eXsoe6i_plus_w4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_6fwKnXym170_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_6glQ8kD_minus_GTc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_6hnjdHQRIjg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_6jXcZuxLnX4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_6kdiTAwx4_plus_A_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_6lxsEIodP9k_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_6m65wOWTyCI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_6oCPeed_plus_v4M_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_6oEykmqYVfk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_6oh0rtZZZE0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_6orDtmsPu64_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_6qJpqcBfN4U_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_6qe2QcAHHk8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_6vQp2stBq68_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_6xvl3JBzRek_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_6zcc4vyhfLQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_7_plus_d1LZxLTvk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_7_minus_Gdiep3RZg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_73XzI6MdHu4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_78Wi0rCCkdA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_79bfFTip_plus_p4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_7A_minus_lPhBoeXM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_7BEhz5YZqec_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_7GLcx3V_minus_PiI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_7Ht6FFZ6ziw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_7IB2cMpxifg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_7Muy2w1kJzc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_7OD_plus_b_plus_1FcDY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_7Rsq06tRYkc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_7SSGacw8bLM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_7T2NcREE1iw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_7TSQcd66UoE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_7X4NgwKIpj8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_7XRV7tj5XDo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_7Y_minus_NEXDwcdM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_7YMs1mf_minus_FgY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_7Yjm0aibBRo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_7YnPVddogS0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_7au5moeRlPU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_7gIdYyBzf4Y_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_7hRWTOqVQ9w_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_7khEIoGv2Q8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_7l3U5RmuZ60_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_7l44TDMrkeE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_7n0ehnQc0Gw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_7o36Jzkuwfs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_7pDRHhO7Hxw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_7r_minus_cRJ8ieEM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_7v4h8nXSHVw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_7xOeJ01pYMw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_7xewwX3b8DU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_81w0cOjyw3k_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_83TnXMiZhoI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_83fgB0siJ7k_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_84aS8IPKiZs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_87rZESXTlek_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_89XGwsfC4cs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8AgQaMFPjgk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8CKXZM9mjBk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8DpRIrt_plus_JH4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8E1w2JMg4VU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8FQEz_plus_Hqbyk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8IHHK_plus_8Ip_minus_Q_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8J3ctSNLYQg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8JA1CHE5IGw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8KXX2Cg3q5I_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8MNwOmGRJiQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8NZOKIOOCHQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8OJ8j1Uyunk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8ORxSr_plus_WMPQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8SvGrBTpEYM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8TfNVjoESl8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8U_minus_ovgOO1Ik_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8U1vo21oMoU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8bjgDkrRz_plus_Q_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8eupyb22g_plus_o_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8fFXTukOa9c_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8fZVMX4a2_plus_I_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8ff0Ui9A1Pc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8iEGAigWFrI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8ijDcsqEnnw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8jL9xlJREyA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8jeUVytNXpw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8kTpmAaPOaM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8lPvbU_plus_0nPo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8llaUJJ9iG0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8milg8QNAII_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8nlEm_minus_PUWjQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8qjW8fYssto_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8qyJEnqVsso_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8rkYT4LS3Lc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8sS3nubeVL4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8t9Vk74CkmU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8tq87pgLk_plus_8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8vdU3tjLqgE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8vlYNyAUFlU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_8z5gjWiHnvA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_9_plus_uzG6bu_minus_R8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_90S9Y9dYReA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_90tCdPotPR0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_91kCCWMU75A_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_97UFbB1wPXs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_9BQ3lAY5LZY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_9D1PY1C0XK4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_9GNi_plus_zOp9Qs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_9KpvLOwPxsw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_9LmCRDbA_minus_Oo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_9POEXdfKlMY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_9QBr0EuWoHA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_9XBBldjWb_plus_k_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_9YMojY3k_plus_IE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_9bHSd64WzB0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_9cwzuFnbszA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_9dulQPS5uJg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_9e61iN5WLxg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_9ej2hBD_plus_fc0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_9iSJPgI_plus_hoY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_9j6AQ2zpBw4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_9lfIaClBKHQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_9ltF1xBh8u0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_9o4lPDNBpLI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_9qI0dw2DSpQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_9r7PpojYy68_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_9vxj1CYn_plus_Fo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_9wbUJuYetY8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_9wn_minus_erEKew4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_9x5f0140e_minus_c_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_9xDz4aqfRec_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_9xN76g0Nw0g_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_A_plus_k81GS7Dzs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_A_plus_uMGgdfMa8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_A3vIdrdhcdk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_A4vEPN_minus_BQAw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_A5HsmsXdCnw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_A923XQeoiUY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_AExYkCj1R2Q_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_AFs8wZ7wnJQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_AG_minus_xi62BJTU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_AH8sEAQe3Ts_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_AMUIydtUy7w_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_AQBadyACkJc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_AQTcevtsafI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ARQuup8gtks_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ASH2Xwo63xM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_AUrZewA40Vo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Aa8cXoodZg4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_AamWGSiwlLs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Ac4nZvBPfYU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Ad9LVYzibBM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Aej69rTqBWI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Af6qMnbcSqI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_AfORewp_plus_ARE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_AfttByu5ALE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Aj4Ha7tFybU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_AkI8IiQHqkA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_AkqlD9D8CyI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_AlIvAQxkLX0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_AnIwPVeSiNg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_AnjvbLUFtro_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_AoJV7ZZ7qnY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ArMYOcHPmzs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_As3I17TV4BE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Atdux08uxSM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Au_plus_ni2kldkk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Au_minus_YQEODZBY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_AvQjbt0RSyo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_AwiR8FKViZ8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_AyIo9E7XKTU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_B_plus_GM09yeizA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_B7pGVW6pRjU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_B9lE08nMQWs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_BEK5iZulCwI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_BG0nGfpkivk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_BG5OCkaVjWg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_BH5Tfw8jd04_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_BLVwFfgGWes_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_BR_plus_IIG39U6E_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_BSe_minus_1Yjjpe8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_BTFHrRJO5DE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_BTWl0NaPmmY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_BV5sgWMa2to_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_BXgtCsp0EDU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_BXmuwIQiwZ0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_BcL6vGkrowk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_BcYfhsAI_minus_y0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Be1fGLBPbcs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Bg_plus_ekiciYNs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_BghkhNf6ax4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_BhD9cBcAGJk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_BjLA08Ot7N4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Bl5m20wA4HU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Bl6rAJiQGWI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_BlHxtSQOjXo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Bnhc4tdyQOE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_BoakLOKHTSo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_BpOvU_minus_QgYaE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_BqBkwvs0b5U_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_BqfBIchFGgY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_BrqxKujapGU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_BtHxQ6Pv6fk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_BulZV_plus_Yia3Q_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Bw_minus_QDxYd1jc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Bw3SBGdil8Q_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Bxm_plus_T4kzc1A_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Bz_plus__minus_KFhYkWQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_BzS42mcRG_minus_Q_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Bzj6EDufzVw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_C_plus_e8Hg4gjU0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_C49LgOV_minus_jPo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_C6ibH_minus_4Ydg0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_C9dKmTrHrxg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_CBQGMZDDQD4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_CBV1LMkpn1U_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_CBpZOt_minus_r2hU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_CBrj1sUFTZ0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_CC1FIVcHVpc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_CDWSy6_minus_98q8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_CE0O_minus_D1AG_plus_w_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_CFzLYUJTbUg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_CG2UUtwfu20_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_CHEGG9KvmR4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_CHF4vI44PXs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_CMBoQfBTRBY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_CMGXXKpT_plus_VA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_CPC0fBIeh_minus_c_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_CV4VWEe0QK8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Cbi5bE14zRk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Cc_minus__plus_O41_plus_qDY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_CfjSBS_plus_DW_minus_g_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_CflkoWdTwuA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_CiT0N4PeQU0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_CjDIf5btcyI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_CjRpsQTPLyQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_CmllLfpXY8A_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Cn1RbccDNP0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_CtogCIVTBsk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Ctw8TmmIXFs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_CuE2jWA_minus_RaY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_CwDNrs5xFWk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_CxCYeGea0gg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_D_minus_XrjSUAVYo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_D2JOQimv1is_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_D3lyiLzU0yM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_D4kJWO3rclA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_D5_minus_UlH_minus_hxT8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_D6D9QvimnPc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_D87MssF_plus_SDE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_DBwxPItsqE8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_DC6bLPb4VD8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_DFBZJzYu0MM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_DFjv_plus_LHtSFs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_DFpikNdC3w4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_DGHBlx7MdZU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_DHZFFMpeKrk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_DHrbwttBFig_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_DKdo2D2V5qc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_DKo3NJKlHGk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_DLs73j9k0q4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_DOHD6PjWmZ0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_DR11Ly2iWCo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_DS8NMQ0HIHo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_DT5Wcmk2vwQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_DU2LPrXa1_minus_k_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_DUwSS3OMOiw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_DXqOIg6G_plus_L4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_DZTGCw2Bpi4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Db2K8M0KqP8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Dbe23izGT8U_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_DeToQFef2dA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_DfF_minus_Hdld5XA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_DfafhdwOwXg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_DkQVriP9PA4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_DlPnDzttAtg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_DnQZHQhq8u4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_DoVa5dq8LBk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_DxUAcjpayC8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_E_plus_sOp_plus_H1I_plus_w_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_E0R5cfrGk7E_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_E36oE_minus_G5CNo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_E3yZgI3uyrE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_E4A0yvypFeA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_E50FRi5Pcs4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_E5TfXUcLDCE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_E5cL6Get_minus_QI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_E6TRIoaA9Wo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_E8mRcgwBtkM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_EBKSsPIuTIg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_EBOgtWMb7rk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_EBjFh2V6YIQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_EFcR_plus_ibkKM0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_EI7UwdLMv6I_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_EIKwAopGAgI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_EJJiV41CZgA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_EKRu5EFU6j0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_EKndqtwAA5M_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ENCKCkxW_plus_k0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ENi_minus__plus_3RjOHU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_EPSZnEudIso_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_EQV776115vk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ERUQawyiFiU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ETsJ_plus_wG6puw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_EVN0_plus_KhaDss_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_EYX18O31OWk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_EaK2AflMZhQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_EbihZup1hoA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_EfbN1PNbQ7w_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_EhU6GNY5CVw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Eota8FMl3bc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Er5QliqBi5c_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_EsNkhwlGnIg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_EuvdPRQiK7g_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Ex_plus_cnRETa4s_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Ex_minus_YbdUMRm4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_EyHDz7bL4q8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_EySRvVSytPw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_F00rJQ1aWWA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_F2A0G_minus_vIz0k_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_F2u7VJoHjSM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_F2uJJj9ieBQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_F4wrULqVMpE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_F6kf_plus_33gnwk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_F6pGveCt2Ho_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_F98laITjKEg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_FAeGfmN1Dio_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_FClr6_minus_hkMx4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_FFQ99YStuJU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_FGFb8rldXJ0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_FK_plus_8maQ3KE8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_FKzWNFUwhgw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_FLYJ02qgHI8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_FO2oM5nyfjQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_FPhiNyoXyrY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_FQqiBC8oep4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_FYhW0cFVkfU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_FaGbTl7GSKY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_FamucWKpUiI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_FbgsoB_minus_Gp0k_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Ff8YIEBYu24_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_FgU6G1oyHUk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Fh_minus_CX4ssmf8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_FhQR7Qc_minus_hZk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_FkqcX0GrERw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_FkyGnTaZnss_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Fl1VFB0eJHM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_FoIPs0G_plus_QqM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_FrH6fg5FSeI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_FtnH_plus_ny7aDw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Fuh2NwPuKyQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_FwLum2FjiBQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_FwZmL9nLii0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Fy3Br9HMIi8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_FyQIb3s4_minus_Ow_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_FyfQgbZli5w_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_G0VGrAWh0Iw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_G1RjxI6BFSg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_G1vXshIWBi8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_G30u3vZ0xGc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_G43WQVeW3Bo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_G4Og6jdimtI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_G7f58FAIqec_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_G8oXWyZcgHw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_G9Vx7CH6DII_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_GBrFO98kCU4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_GDA5UhZlpEQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_GDHqV2AO5dU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_GFn06UKhyHw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_GJZYj1sMy1U_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_GJeqgaC2mck_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_GMzhcYmBETc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_GPfIAuctD9U_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_GR_plus_f8ocq5VE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_GRVtsCkrnnA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_GRjtnoy4iHI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_GRyswm3by1E_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_GRzmXI6WftI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_GSQjbagr8F4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_GU4AF9Yrvzw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Gak6zrIRaWo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_GbaStDk1a24_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_GbxTmw_plus_P_minus_A4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Ggznek_plus_dXtg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_GiGIymC7UiI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_GiWN6uxe6TU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_GlIrjgdHfGc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_GmIN5ZvUPSM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_GnRsxVHRrro_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_GpML4e_minus_O11Q_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Gqz3wQ_minus_Cnec_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_GrLxGc23gQc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_GsZGs1DOSWo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Gt5F5_minus_pfTRw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_GtSIY8asgS8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_GuLJLDkyoYQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_GuYMrSZQWHE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_GvWrHi5LzyU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Gw5Vza07VAM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_GwkxP7923yc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Gxt5BB8ahXg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_GyQu9uZuDXQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_H_plus_BMUU6oC8s_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_H_plus_xN7NKoyu0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_H3pmc6s_minus_Yuw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_H4YH99UeGXY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_H5CkYadPsXQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_H8rNrDvHhVY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_H9CREnB62Lo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_H9dlkTGyCMc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_H9kEqtoTXGs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_H9vHkdES8OE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_HA2IEgsyebU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_HAfbPkozGjI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_HCqK45DPIyk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_HDnItyT5UOc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_HEo6yqMeXGc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_HFws8ku_minus__minus_Aw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_HHnnPwUh7oM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_HIXKlk5DVsw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_HJFP_plus_q84cmM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_HKg0cUj4hkU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_HME4a24OKUo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_HRCfQVxjVQ4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_HRFf_minus_IW_plus_9h4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_HT8ovS_minus_O_plus_qI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_HTpFP1m31J8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_HW0KT3iPct8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_HWOIqk8iU3c_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_HXFeUnyqnHE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_HXc9paDU7vM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_HYCMyLzgjyE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Ha8E_minus_qWvyWc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Hd7DOz4Bih8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Heb0_plus_T4zTGo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_HgPiXeD6iK8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_HhV2Og_minus_Q_plus_yA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_HjIpHPp6ZTU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_HvjZPtAnjuQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_HwzmV2hFl78_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_HzB_plus_FOawf44_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_I45yc4MY9nc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_I5UU_minus_OsptFI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_I5ysvI_minus_IIJw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_I9SizkX_plus_i5Y_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_IBWy9uGWcp8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_IE0xYGwycW0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_IEXEP8fmFr8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_IGd5X5j9_plus_Dc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_IK6MOOvNFqY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_IKfl43nS_plus_JM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_IQHXZTYq3X8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_IRLQrLWkA_minus_M_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_IRYhi2PKG9M_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ISssLJI2eC8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_IUY0ho_minus_22JE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_IVHQGH8yyB4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_IVjy5rAsRjI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Ifa0CArZ1Yg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_IiMePajfzUI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_IiTx9BwArWM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_IiafdfHa2bc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_IitctlDZLbw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_IknlaoECxqg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_IlMM_minus_ZmxY28_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_InrAKcZaX_minus_A_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_IoNVJKklWm0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_IqZuVex4Q7k_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Is_minus_YM6hO4hw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_IsauUl8mDDY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_IthJS_minus_ZcEV4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_IuGjnl4i730_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Iw5XW_minus_1wgr0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_IxIUdWwopT0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_J_plus_oVFGsb0Qg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_J0bGGwdIfhk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_J1qKTkCk00o_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_J2L1Rr_minus_IbE8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_J48l6n1RaV4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_J4FBpvaSdJA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_J4MWXF1kCdQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_J7UlpDGmVaI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_J7ZwIjC_minus_NF4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_J8US_plus_J_minus_vRnI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_J9u8UeS_plus_3ZU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_JAzqiBpYj_minus_0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_JCGNnROcK6w_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_JEC0lbbB2gU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_JEcmyPMu0mU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_JEwTPXFKpS4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_JML3Tj99IdM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_JMap_plus_RuWCso_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_JMpyFyWW4sQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_JQkp_plus_nemtRY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_JT4sPygD4nc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_JUjyOzXdCWc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_JV2k5nGxZS4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_JWTacfe3XYY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_JaFNOBMM5rA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_JbIQkQ1snOo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_JhuM8xmtn6E_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_JlbgPGsx3oU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_JmwlvppRWE4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Jo3nZh3qW_minus_E_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_JqkF17rNelU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Jr1tSCtuUiY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_JsCJTp_plus_PHMc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_JvOPWYEC8Ac_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_JzGiDlmIxsI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_K_plus_InrvOGqvo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_K67v9Ocojlk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_K7eIytThnzg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_KAtBjvAqdeM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_KMGUMPfAJo4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_KN6UJcgVrI8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_KQFqO8W4q0Y_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_KQSSDOhD9JQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_KbeBjjWXFiU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_KbrWG6wNosM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_KdodA4V3qgY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_KfCkq5bmAe8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_KfLzRLJd85c_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_KgQLdQ0w2r0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_KhNPclgFOIM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_KjDDu4tYcyk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_KjfjFCr_minus_FwY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_KjosapOEgbc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_KnQ5SdQ4FxU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Knnq2wiIFDE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_KpJXyTP7N7Y_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Ks3ryhyLfOE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Ksofj08b_plus_b8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Kt_plus_4DRHYz_plus_o_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_KtMM_minus_5WGMnQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_KwVnRtplhDU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_KyYcTJPssvU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_KzCSdPeqlt0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_L_minus_kFwFmRVQc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_L5fhPLk1uak_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_L8RmHugddLk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_LAXPlDvApHg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_LCinyLbasnU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_LDgc9wGxxEQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_LG9TwFMFa6w_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_LNuuQgbgxCE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_LPR1Xoax82w_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_LPXrs0psMG8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_LRDUvLHRY5A_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_LUARjf_minus_LuyQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_LUWh4Vaivfk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_LXSxok_minus_AfFY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_LYzR6YTZDAY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_LcpGxUvT5E0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Ldf7UpFfDEI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_LfZcWFkd3xg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_LfjVIt9q60k_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Lgn3VirnPms_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_LhVX0MoZqvQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Lie4WB59IKE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_LjoYwmMxdek_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Lkshkij4gp8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Ll7geN7OE0c_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_LmAqwKsb97g_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_LpI1Qlzmpco_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_LtA5aM_minus_3lbw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_LtXxp9OpEPI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_LuDSC7EdhME_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Lv_plus_HgpCH0l4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Lw4mW6vvqk0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_LwZikYLMqm8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Lxk6KBx9R2Y_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_M_plus_ElTgUSbuc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_M1CvsjqkJhs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_M1oyrqKQAK8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_M2qSGvpmhFQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_M4AQDDBAdoQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_M6QbxqVTnxQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_M6w_minus_7bUrYGE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_M704rXTcR0U_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_M7mvWG7IyPw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_M7o1DcnrzY4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_MFnPTtcUaaI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_MGUslo9y4pk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_MGsRyeabMac_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_MHKqp9DcHxg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_MHNehRu9aiA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_MHViGeMRIts_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_MJaz3ZdDGXM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_MM4H2zXQPNk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_MMbG34X_plus_eNs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_MQCz1XFMyMI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_MQaz32JQzWE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_MRWmhIY5G1A_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_MReN_minus_ksLzMA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_MSsDM4u1jQw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_MUfRnfkRncU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_MUyBSmwGR3w_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_MXD4s01fNmw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_MYnZJQWLNog_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_MaSYk4D3OgU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Maa_minus_feacM3k_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Mc_minus_9bwQuK6o_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_McPcQ_plus_8HesY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_MeAJyg5gq58_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_MeogIIr66Ew_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_MhMNLxT8xOU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_MiQralGSkeo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Mkr_plus_ZvMqMPE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_MlO_plus_RK1HoyI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_MmJGKpfVpZo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Mo4KJwvZPxc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_MpI2NyWcgaQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_MqLIXYTJPR8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_MsZr4Y9YsYU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_MxDsAIPWad4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_MzsdXuP_minus_TTs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_N0U6ySGTkHI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_N1rKdeTQ22s_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_N2ZPBAvQ4P4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_N61c8_plus_bAHYA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_N6Bb9tOzbOE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_N6Y0fJoacEU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_NBgXD4SrmfY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_NDFvu6iq9PE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_NDJ1JNuoSNI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_NDecA6TqMWI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_NFiMz6zysyI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_NGfsoXi2arU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_NH8C4UTIAG0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_NIq7Ht4pOnw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_NM2sfG425Ks_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_NMXJOYzVUWk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_NMtDf5GMwo0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_NO9mhkI0uzY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_NPVjik59zT0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_NRPEF7lw_plus_Lk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_NRwbrebG1RI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_NTV7JIcSG3s_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_NTY7MAqUV0k_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_NTuEbbLnmjw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_NUOb_plus_z3WQ5A_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_NUqwHobH5SY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_NVsPBrf4TV8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_NXKFbxr0xFI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_NXkvdp_minus_rsg8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_NZjxIjwuSuQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_NeBjCy2urKA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Nf_minus_OGV9Nx6I_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_NlCqp_minus_s1Btc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_NlXWVHo_plus_9lI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_NoAtTlpb3tg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_NsvNBGoyTLo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_NtBJpphF4R0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_NwfBp8_plus_IAFk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_NxHsvCeeBmE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_NyQ1zvjWDBQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_O172A7JvUxE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_O2BqIB6Lx44_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_O2MUM522wd4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_O3YLX2pzow4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_O7svMQwjr_plus_w_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_O81B1G4VdKw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_O95ij_plus_4uvh8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_OAWKIXxSRSc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_OD0u88wuP78_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_OEtF_minus_8T3cN8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_OGAnhdA1OMk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_OIypNkAP7ik_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_OJd0bIxwg0E_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_OLMJwrBsDng_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_OMAYDli_minus_mdA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_OMmHcRMQOAc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_OOGKeH9U85M_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_OQK15N2qqpc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ORRr3FoycIg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ORi3kf_plus_dya8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_OVFr_plus_OvcYRY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_OVR7jc8mpFQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_OWgBI2ZiSLg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Oa4DkE23caQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_OaBNSvmGtv4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ObWxi4aV0Fs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_OcXqr0lwnSc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_OgEd4N62_minus_dg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_OhGxI60LXPo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_OhnH8C16wZc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_OilqfSGtoCk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_On5Zzm0ftIc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_OnFvmA5G_plus_Y8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_OnOrY8PLUjs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Onj_plus_Mfcmrzg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Oo_minus_hIEH2WdI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_OpnuHE0j6kE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Oq_minus_KLpNjd1U_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_OqA30GvDJP0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Orf2rx4UpaQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_OvpZv1jKQtw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Oz5tpCZoK_plus_s_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_P0M0YeyW_plus_Lo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_P0uFWnN7IWs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_P2GaYQ7Y4lg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_P2SmsaHHQRM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_P4AZdmrG9iQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_P6Fc747iUjI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_PA_plus_PwQax14c_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_PA3hKfVqH00_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_PBzhGhm9efc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_PGttEJNabMo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_PHUWlwS59cM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_PHVPK9wRYjI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_PHs_minus_EtAF2zU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_PJSbVdbIOug_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_PJT6Jhs3y_plus_4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_PNF4BV_plus_QsUU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_PPOIHtgtkO8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_PQFF_plus_WEWARg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_PQS29ynWmeE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_PS2fWS_minus_1dEw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_PTdhkxtDUYg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_PVIoDan63h0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_PWFHeGMRnU8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_PX2JkQE8Fx8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_PexfHz4VoJM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_PfzhaLrZ1O8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_PhTR98wtFCg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_PpX1vzTqOIg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Pr_plus_3cKCW_minus_Vk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Ps0mzMxBXNI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_PtLL62KSqNE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Q_plus_85zvk4FB8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Q_minus_EqLnxcZMo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Q0DOEo6XxTI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Q0GjAmlMAzE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Q0v3WNMvbvk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Q1zMBRuiOZE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Q43Qwcd7W_minus_Q_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Q5SxpvFCi2s_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Q5kgx9_plus_xeQU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Q6J7DAtr0Fk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Q6f8EtTfC7E_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Q8CtPGQDhhI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Q8PbGtLOqaE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_QGlyLx75ZyU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_QILgXEZAVZQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_QKXk1l0g0fY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_QLcy5UgKqxU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_QN7bxzzZsYs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_QOSkS_plus_V5Me8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_QOwNdOdlkw0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_QP99f0_plus_e_plus_B4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_QQ_plus_5GjIApTM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_QSzdUqTrd_minus_s_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_QT3ve5whb04_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_QT9ArotZAcs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_QX6b_plus_NQ1NE8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_QZtLzqKvmi8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Qcs_minus_Q005CTs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_QdSnOK4Am1M_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_QeB_plus_bflf6s0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Qf91WH8Hta0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_QfcDJbA0V0E_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Qg_minus_b_minus_j8dTZY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Qhihnfy5GpY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_QjqsTDTTSis_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_QoBYcBsP0gs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_QpeSMH_minus_lx_plus_s_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Qq1NluKTwJA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_QrX8HQgwS84_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Qs1P8UBKBK4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_QsQXic2xPs4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_QxaNoUYvdls_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_QyvqJWoYgL0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_QzYuh6Ftszk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_QzySiql0nAE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_R_plus_IJy1KVaj0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_R_plus_m1LCvKL1o_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_R15hN8_minus_oipQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_R2ZQAobL0VM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_R7woYOzL7is_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_RB7voJMuUZs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_RDPTNEkwy7c_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_RERXvPDMdhg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_RFnMq7_minus_6lq8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_RHS7MAfFQpU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_RIVWLt7NdUQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_RIX1IKndFDA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_RKlOnSYZlt4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_RMv7LG_plus_0dtU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_RO4bVWqJOcs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_RPCuYciZiwQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_RQgG57FfUJ4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_RRGLE10_minus_qZM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_RRKdTtpdRzQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_RS4OaWn3Yaw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_RSPispNSqPY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_RU1SaHyqexQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_RUQkLQHBnr8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_RUenQ1WZQoA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_RW96fIbhPBA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_RWy5PmNFDLE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_RatFQeKvheU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_RfEoZpq_minus_3rU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_RgPLWdJJGBM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_RiIlTQtCn_minus_s_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_RidOPwWxJes_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_RjRflLHq_plus_zA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_RjmV_plus_cXDxkI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_RlE2mhkZ72U_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_RmbbHWTxhgM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Ro2ieAw9m3g_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_RohovwYkYO8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_RrcozTK0fHM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_RrrkSeBmV6U_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Rtn2Xw7gr0g_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_RwxEnlbCkug_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_RxLscALFA00_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_RxbpvVvQ20Q_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Rz5M5L_plus_9X9g_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_RzGLHpwR2_plus_k_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_S2ESgvbzvXI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_S6vKxYoIrBU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_S7ILo_plus_YCsOA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_S7kvkV6SznU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_S8NC57PFC7U_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_SAB_plus_QaBUXA8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_SB138NuKbpQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_SFB_plus__minus_ofqbik_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_SKvxLm9t0OM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_SMJ3ZI_plus_lcnU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_SMr0Ma_minus_uQt0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_SQR1u6Zuzk0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_SVIcrS84xVo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_SVzqxdTgx_minus_k_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_SbUkE4iXYM4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Sd9lCybeKgM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Sev444QPGAU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ShWGA1OTMoI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Sm3oDIlxp0o_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_So0jzJiWB_plus_I_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_SpuLBXsLhn0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_SqCGJaZoMJQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Ss7pQku6zPY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_T0_plus_lIzKYWj4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_T0oW10Z_minus_9Fw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_T2RMTQRTuYY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_T4w31LJSLNo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_T5OFqfz31ls_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_T8VkAKBOWl8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_T8ukb53jIwc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_TBoSLF0Ro9g_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_THYrKHts64I_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_THhPk_minus_FTXPk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_TI5Vxsw0xME_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_TInUPMGSSWE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_TLK1GcvZ8Bk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_TOYFo8wa2h8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_TRd7S9n3juU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_TU8QndXbCBg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_TUnX49erAaA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_TV0vBdSa6OU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_TWEfZQh62V8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_TWPUIv6uW_minus_g_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_TYP_plus_vYIYVpg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_TYVKHQWMtS4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_TZ5K24vde6w_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_TaswYPAvtOQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Te7DHp8Gy2Y_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_TeKuYOUHoKU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_TeYoK0Kka_minus_M_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ThNb0pZMjQ8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Ti67furXZ9o_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Tj09N7FCeV8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_TkScCUuSRfw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_TmjdoE3VDfU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Tn_minus_I7zTWVXs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Tn8l_plus_qMDk0c_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_TpQxwP5ZEOE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Tv4PMhvwfW0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_TvTj_plus_wvaKxU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_TvXo6CimTsk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Tw8Hf_plus_j_plus_mTA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_TwA2gtUXK7k_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_U_plus_o_plus_bGvUe24_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_U_minus_IFsK6ipPA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_U_minus_J5g5HlYgs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_U_minus_pDROUPL40_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_U1uukdMUipQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_U2yI_minus_GjuK2A_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_U4FJEJCKEUA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_U4J9hC7k_minus_iE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_U5zbMe_minus_5x_plus_4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_U6U8Yenax_plus_Q_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_U7QZzL5OgXM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_U7XbaR_plus_TNak_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_U7bM3T1ZwUg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_U7o_plus_A03Tkr4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_UBaDrYbn3JA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_UDhyoWgI8Uw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_UFpIkohgGKI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_UIPTgJxCeEs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_UJVOusdtHuU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_UQ989EpPn8A_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_UR1fvBzmIbU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_USh443unLZ0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_UTQPX7MYbAM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_UTrzzCUsH0w_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_UUGJ8eCwfNo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_UYQaSVs2HPc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_UYlpfXiijCM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_UZrHnfnijms_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_UaRW96_minus_F3t0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_UdKXYoeVDLc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_UeYiDCqHWuM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Ug_minus_13mhenfY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_UiIGhwPoY88_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_UkSUouA_minus_9nk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_UlrFGydwCGc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_UrRAqrfyFU0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Ut7Ri_minus_h_minus_0l0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_UuHE5QHmCgs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_UxiF1uDl7FU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_UzOOayOyogU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_V_minus_if5aVCwR0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_V1_plus_y6My2DTE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_V5NAmXVlwlQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_V6frA_plus_LevAI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_V7R_plus_CUqEAZw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_V9_minus_Tsgb8r3E_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_V95p6e6FXys_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_V9kLv_minus_tveB4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_V9t7N6GTEX4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_VALOmUGH78g_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_VANh7N2knZg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_VB1MYFFuaL4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_VB75ZVdylrU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_VDHk4HzzbhQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_VDf83PLBqk0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_VGX61DLo18s_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_VGcTl36kCDs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_VGsLj5rElVo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_VHBH_plus_p1IqKU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_VK_plus_BaGSZH_plus_c_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_VL6s6xtBiGQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_VMfdd6k7stI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_VN4sywtV7RE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_VOffDjveSnE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_VOk0yH4MyAc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_VQKfg6VE5sE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_VQV1bLZ7Zbc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_VR9vkpt_plus_2Iw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_VRWvCz180Rk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_VRjYxJUaGag_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_VWz_plus_QkA9f70_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_VXngsm4dulg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_VYbHr8Xemoc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_VYz4Rw2KU6E_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Va9rLemqS1c_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_VbIkV4JS3PE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Vbx1HlmSMf0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_VcdA7UkL3fo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_VhXAk2UQP5s_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_VhfrUFgM6bM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Viv12czuiVY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Vkhewx6tULs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_VpTB5N6G_minus_0o_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_VrmP11iLJ_minus_E_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_VyKZGaC_plus_ugc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_W_plus_aj8nyPyJE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_W_minus_1_minus_yJl_plus_8K8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_W0WNrK6rzeg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_W1jN4F8FOPs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_W2_plus_NxxjVm2I_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_W4xAZU6nKyg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_W4xH4Id8odI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_W9lYgVU32Ro_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_WEKtamcbO64_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_WFp9BrIB_minus_H4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_WGU_plus_pJ2JIrc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_WJSeWoz_minus_Ew0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_WLEmFxnh71I_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_WLdDxIWd3GE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_WMiHOVv7EKo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_WOtHs6_minus_3ft8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_WQK8hN6ZRh4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_WQN7AOxNX_minus_w_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_WRiVOEl8rIQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_WUa0o9AnJFg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_WUan2x6u318_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_WUqVrto4TxI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_WWBe8NYcfrs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_WbOJP2JWG_plus_o_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_WdgNKFD3V_plus_c_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Wfiq93CqG9A_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_WjTI2Z1q3FA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_WlG9NNIrcok_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_WmYrwvOzOuM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_WnOO_plus_2F_plus_y3c_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_WokVIWzuBos_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_WqqA2zraxGw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_WrVbuRtQ9CM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_WvZllaEpQmU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_WvrkJR4lSmU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_WwwFtuQcJaE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_WxLwWxd53kE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_WxXXVDHBAt4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_X0GioSb2T2c_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_X0k5NNO6f_minus_g_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_X9elh51SOlo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_X9hfd0RTsfc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_XAJVvSm_minus_llo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_XBFr1zrK8W0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_XITKbTGdwMo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_XLIYwMUXO4Y_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_XLvJTbeeirw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_XOiajqEw2so_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_XP9P8ExXwVY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_XPRyDKbZgSg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_XPl1UutZuKs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_XV_plus_i9UTTxVs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_XXEv4APk8Ec_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Xb8wCHkcTNE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_XbBoGslgGRA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_XdnNymUKO_plus_g_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Xf9SA7rm2Ew_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_XfzRS3gSO9U_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Xh5oMZsw3o8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_XhQ9AFaiQ4c_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Xk_plus_Fm_plus_YTF2c_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_XkvjXpuyzLs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_XlElXM6Ycvo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_XlLLnggzxAk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_XnCul31fdJ0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_XqLRjTothgA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_XrmqhAFeRW4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_XutqeVaOqec_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Xz1rPddzDVg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Y0Koxq4KEkg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Y2Jm_plus_RcExHE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Y3wceZOjVQk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Y6PHykAxGfg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_YBkEmv18woc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_YFxsVHTIE7U_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_YH_minus_MFaHAyyg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_YIhn_plus_OJcAXY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_YIoaVBTsw8c_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_YJ7r9QVu_plus_Us_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_YLSTCl2QgrM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_YMYZ_minus_NoyDe8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_YMfvOz7pfZU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_YPnEw0kxArM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_YQTUOMqlO_plus_I_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_YSJx5IKTaGI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_YSTUNjs1X_minus_Q_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_YX4eHKXZFzM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_YY6Y_plus_gccbSM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_YYtb1cztSt4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_YbjmTV_plus_ax8o_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Yc7MS15t82U_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Yc9WoO8O2TI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Ye8GdYv6eQg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_YeDBQJ9XxA8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_YfaTfjLOpSk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_YgE0K2soT1I_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_YiUqZpp24Qg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_YibE_minus_6u4Qrw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Yjwnz9edXs8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_YkFUQ5ae4TU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_YkdhyjfsYA8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Ynq1hrw2xlg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_YozFcQLcUS4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_YpbMa2dXQzM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Yvbm9A1hKWA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_YvwAxfqATTA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Yxafith2tNw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Z3gQsF6mZZg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Z70nLhrFrvE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Z7X7OGIvMqc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Z7svZeTUxpg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ZDMkZOif_plus_yo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ZFeVn7_plus_X36Y_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ZGc3yyMGbS0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ZGyS7rVVrR0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ZH6IIT7suc4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ZIyKMovAI5c_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ZJoMz_plus_o_minus_jAo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ZKUhHIwgLsQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ZKelftVx9w0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ZTD_minus_3MVA_minus_ko_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ZTzz2r6zLoc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ZVMhnReGqSA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ZWJCSrdfz0s_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ZXz01hGaKEc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ZYf8J3iAOqA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Zbr2ZBysIQ0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Zde1_plus_uvL7Tw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ZeMeznRWk0w_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ZewVaBb1pVQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Zex3reFRPzc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ZfQVzLJrgNY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Zh1KEFFP74E_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Zje1uXnfnaE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ZjoSrNK_minus_n_plus_o_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ZkBLOP3Jj9E_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_Zp8kdKB7kKE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ZsrAAP9d0cA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ZuT1KV1VR5o_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ZvCSTapahr4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_a_plus_km6hI3XmM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_a_minus_hR4VbQsMM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_a0Y_minus_FGkqKJs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_a0bksb5xlc8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_a3rhW_minus_q8XQs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_a4P5tSNq9yE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_a51bkE3Vyb8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_a6i347xqjMs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_a7GaTu06OJk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_a9Zs7NKm1wc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_aB8FRbUv4mo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_aF3wlbLTmwI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_aL0ECHyeRb0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_aNg0BriFqKg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_aP0X_minus_4W9Lgg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_aPLRiChMvvY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_aRBAciXgfug_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_aRKF3rRoH2o_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_aRfavhxkoIc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_aTGaTk6DHfw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_aWmkW6Qm_plus__plus_U_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_aY4BPn5zXHw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_adMZUdkLHqE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_aeoeNp7Ujl8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_aoAgc7_plus__minus_6Kc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_apjEBKUh_minus_CQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_arCP3jQ_plus_Jbo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_asSa1lvhVzs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_asubj27c4Vg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_aue91NktFx4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_av_minus_FCO70Ci8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_axN4ia12Iyo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ay86oU9E3EI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_b_plus__minus_zb6vnBYo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_b_minus_eohnstyik_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_b0Mj_minus_9dxn1k_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_b0TvwShFDFs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_b0ej_minus_WaBrzk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_b0sySzeuW1g_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_b24EsQw4Ge8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_b28S1_minus_fSTZQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_b3rDPNhttSI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_b4BU62VsgYA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_b8HJyPHX26I_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_b9bNwUpMY5w_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_bIAlhZGTsh0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_bIgO5XD4RxA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_bJ6HTP9OLhc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_bK7G4c3cHbY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_bKCBjuO0ktM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_bL1R7711ZNA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_bLm9B8rJJK0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_bLqZd5zFR0s_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_bMSWimwFcww_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_bMzSvkfgMEU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_bNeY0cKkjBM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_bQdate8ybz8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_bQvSyDp1Igo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_bRMpa4zkung_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_bU0llzXLpXo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_bUCul5MjZcQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_bWVxyOJYjZw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_bZYKXT_plus_p6Rw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_bdLj8YKhyTw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_bf9DmWEMjZg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_bfgzXZxYkpw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_bfunI2KsEys_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_bhAs4QggKkM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_bhbcVkPa6RI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_bk1XvWVITTc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_blgK3ktWIdw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_blx3VqDu8LY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_bqeYTznqCq0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_btecxUhKaBA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_bub7IttNbmw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_bwd0PkfdVqg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_c_plus_Y5l4iz_plus_lE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_c_plus_iQ_plus_GiUuC0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_c_minus_B36418E98_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_c_minus_a_plus_EQMdXpo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_c11C_minus_fn9vZg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_c2_minus_jXzNCn5M_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_c8QrOAdar0E_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_c9XbEhLwkjw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_cAxbLiUQcu0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_cC15lQACT2I_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_cC9KrTAFBuk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_cEDXATPf1ZE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_cFPSQe7KGBo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_cFi5bW1xv5A_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_cFsWvjIGSME_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_cG7spfNJ9o0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_cGa7C2V0mG8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_cJgFKARD73M_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_cLdg9UqH2bM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_cNrLnyzLDqg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_cOVqfTsm6i4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_cSkKJIJGV6k_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_cWhUEvN1sPM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_cWkAVHLzoMk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_cXxWzbWi9dE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_cYdqE_minus_4jp7o_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_cZJFK2VPA_plus_s_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_cbSw7XoHt_minus_k_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_cbnC1jsRLzI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ce_plus_00gaZAN0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_cgTvG0jp_plus_MY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_cgYcQIHDtlU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_chXuVQrRI94_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_clmZOokkqHA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_cot6LYWF_minus_Ow_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_cowaLyqYExA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_csI7RzcFXRE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_cvRjESxp7QM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_cvTYAEyd_plus_cs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_cxyAtDRWyvQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_czYtDOJxbwc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_cziLsQ2mp9k_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_d_plus_c5fq1tjZk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_d0DP2t5FZmY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_d0DUtS4NbvM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_d0bS5rA7fCk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_d88b2LEdd2Q_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_dFMHRcV7j2Y_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_dFZTklj4f8U_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_dFvQIOI_minus_g98_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_dGgPG3NxLOY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_dHEUIM99LTw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_dJGMa_plus_okDOg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_dJQV4HTNzuQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_dKu10FXNBC0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_dLRVhzwk4h4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_dPRTZh5BsuU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_dRNCLyDeAM8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_dSbNeGQsi_plus_k_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_dThMLuDxuM0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_dVw2spCtjmg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_dWbZ_minus_HBojqU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_dWih9qPFB38_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_dXdRdbl9xtU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_depsxzkj_minus_Dc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_df8bbmIdNIM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_dgY_plus_IAMNNNU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_dj3Gl1YYvJ8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_dlnCxzP9v24_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_dnvpRyqCZtA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_do8mXcIf7SA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_dqIP0RA9gtg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_dsY0Mmpb_plus_Mk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_dtnKsC6nivE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_duXH3bhyztI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_dwW65etqqMg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_e1_minus_41W6j0pA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_e1I_minus_WZknBEk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_e2VSkMBqCfY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_e371vKyHvfE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_e39S_plus_saPElI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_e3G2dB0myhM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_e52cFlZ1trI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_e70IJ6o4pR0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_e8Swq6_plus_iac4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_e9ZLQs9eieE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_eCcP4R3yhqE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_eFGLtTGFSzE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_eFOwwrcE3ks_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_eFge2lVHxN4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_eKQ5_minus_Dfmgdc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_eLHkTK2CtH8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_eMJMNjD3zSU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_eNjbJhrJ_plus_Gg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_eTk_plus_2NucJ8k_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_eU0DzhcCkrM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_eVMV4cDOBx0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_eVqH4H3UwCg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ebIt5wB486o_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ebUc7pZI1Cg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ecqOUdMuexk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_edZTNtnTPxk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_eggC_minus_ROINpQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_eh1qV7hTFHc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ei7p_minus_kKZI4s_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ejW3kZyq550_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_el2VQZjPsB4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_em_plus_OiNKBmXM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_em_minus_bg_plus_dEIGw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_enKUAms1L14_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_enYlHQ6Y4vM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ep4jllwrg_minus_Q_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_eqqTGKb9ge4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_eriWeAfd_minus_f8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_etccDVR9oQc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ex_minus_8kA3X5ZQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_exHtP0yFfCI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_eyRMFoPEX_plus_8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_eyczRhn1VpI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_f_plus_SLvBCIGJM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_f_plus_WgWFQQlAk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_f0DqjWri_plus_Rs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_f0boz4mowL0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_f1I6Y18jKbk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_f5unyVgtmMo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_fAIbZgFxkAw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_fBAOyg5CjPk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_fDSQzivDRQs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_fJL1Jbevd7E_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_fKewW7GoCyM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_fOUbugIEVtw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_fOYZMvOOV1k_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_fOnE_plus__plus_USWAA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_fP3rUkRGQRs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_fRnqy7U_minus__minus_7c_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_fSFuf3CCfr0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_fSJY0qZksXA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_fWS_plus_J774W_minus_8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_fZP8WImnYPk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_fZXLBloYyW4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_faFn1OdjAEU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_fbcChE1Aoj0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_feSywBTpZHk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_fkKkBR8BrAM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_fp9jJns8XKk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_fsAxhc4e6Nc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_fxsKnwXGxTU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_g_plus_0IclokPhQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_g_minus_YGvjkxxxI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_g0GJlFChT1A_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_g1E3WhunWTM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_g1uaNydmRiE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_g2E1_minus_92pDbg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_g5n1MMQCGVA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_g7Hvx_minus_ehBFQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_gBnrzm5RFYo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_gIbQOmmIzww_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_gLM4PHewJwA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_gMxgHWueHYc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_gOMMTICNZ5w_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_gOqThDYWBBU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_gQzR0P0bF4Y_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_gRV9y5UZ7eE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_gT6fmEJqgZc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_gTO7zb4lVNI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_gUAJQaumS_plus_A_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_gWevp6rEByo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_gXUoxM2WN8Q_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_gXij3LJRnFA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_gXuYfkkAi4A_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_gY2jWNd2xEs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_gYJFBIIydKQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_gjtdykMP3E0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_gm9wWQ83CiA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_gn9owvTklTg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_gpyl0AiklOE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_gt0iNtXwf_minus_E_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_gtIpEDDn76I_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_gzF2sqsXebA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_h_minus_9nlM_minus_y_minus_es_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_h033Ypm8Gnw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_h1AGMerP6FY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_h1H0lfkv_plus_r8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_h1Y6_plus_W0pbEU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_h3V_minus_eJQjgUo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_h5eLTrmb9g0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_h7GP5Dqx6vU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_h98n0NfD2sw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_hCF6Jgsd5a8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_hCLmkViDUwQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_hE4Ufn9mDPU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_hGHcnf8w9og_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_hGfEVeMS6Ls_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_hIw_minus_HVb2_minus_2g_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_hJCR02OuhWk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_hJQ0B3t2B7M_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_hJYQb6B5fyE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_hJwDGgzFpPI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_hKSUg0S_minus_yQ0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_hKwJdBxEWPY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_hL_plus_TQCVUCKM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_hLEQlRxP61c_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_hN20Q01A0zA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_hN6PS5MQn0U_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_hN9JhD71QI4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_hT3IF0_minus_rq68_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_hZRpuLDxEgw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ha_plus_LsDS43YA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ha_minus__minus_9DAYPKE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_hbT3Z0Hd3rg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_hc_plus_m2tz17Wk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_hdM_minus_MBguFoI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_heuaiZIWVUI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_hfG05rRUDak_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_higl4mkfHJ4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_hkBGH3N_minus_oi8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_hkDKEOQqTr8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_hl3Bo4_minus_gnDc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_hmLqFAw8q5Q_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_hmpkWEqMGME_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_htC03ZGwLRE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_htfDiQ4Se9U_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_huAFVySj7xk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_hucTWmWOIJs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_hvch5hb_minus_tM0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_hydr_plus_dle5x4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_hzQL_minus_pMsVGU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_hzSGJKJYwI4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_i_plus_In6Gi0Fwo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_i05rR6EBImo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_i1JK_plus_VUlKWM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_i2jo27JK9ho_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_i35pMXdpi0U_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_i3ETrbVSEV8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_i3RlS3yopbc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_i3aHaHZtiqE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_i5Lqdyi9tqo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_iAPk_minus_NMyhEE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_iAnfNJv8WMM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_iDPs63X_minus_Cl8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_iEIYS2CqT9g_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_iENy8SuPHL0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_iHKuL5BOd4g_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_iIy_minus_Tl_plus_Ctug_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_iJ6wmI0tj0o_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_iKh5XAJ3Htw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_iPQjy3HrG38_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_iPcGPUsuc9U_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_iS_minus_Vvo7MaQ4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_iTaoxWIQyuY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_iUTIYD3h6IE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_iYXS3HPuYjs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_idkI_plus_fFFntA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ie3xVSGOmXs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ifT85lHYbyo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ihAxteheoME_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_iiCJFOgCMk4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ikcO4yJFPy0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ilr_plus_TFplnv4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_imHa3TLlTO8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_imTc7jKwrL8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_in63SKRkPMY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_inmtE_plus_1X_plus_Q4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_irHs_plus_9jhAtM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ischP2z62kA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_it_minus_sj4lhYhU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_iuvmKbSJPMo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_iuzPnkZ56VA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_iwIzwyIXewg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_iz_minus_vTGZcvzM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_j_plus_DwM4iALVI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_j_minus_9x_minus_eqjHrA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_j4kySXsCM5k_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_j5Q5zC_plus_A3EM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_j64eAmSsLsw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_j66aa9OsmyU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_j74sHzT1ZAM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_j88I7jHo5tU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_j9kPTcevisQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_j9wQqnUZB9M_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_jBGJot7XZDQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_jBVoh5di2zk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_jBcOuEYwXwY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_jBtjPMotXo0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_jDBLjMNUZeg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_jDtLp261Kcs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_jFTeLww_plus_1Vs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_jGAtApdaFc8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_jHEwkqLAYQQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_jJ_minus_5qZRZKFo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_jJLzd7jxXiM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_jKpVy5ttZN8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_jT1FV1SZsdQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_jTXs7HM6z30_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_jV_minus_g6Ihe3aI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_jVj7jqD9mq0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_jXOWuBDaGRM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_jXznE6_plus_t4Mk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_jYEGqsvP77k_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_jYc_minus_aAXESog_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_japr92PDRTM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_jbjU4LIcU2Y_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_jc7wDa3P_plus_CU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_je5LZGQ1CMI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_jgtWHChq7Rs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_jhYlRq9ZfZQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_jkBwkJmmdbI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_jkrrIsrKdVg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_jlNozzKfEHI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_jnGTQJLI0S8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_jqnDcCBBLOY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ju_minus_OvY_minus_N6_plus_Q_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_jw22poRy3xE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_k0WHwWy4YXE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_k4hOXIKXDWw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_k67ADtJOaR8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_k7STwdvqzi0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_kBMwammS_minus_EY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_kCWnbqC0RqA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_kDBfLsW0W5s_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_kFTwPJB2uP4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_kHLuEOVfAaA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_kIKAc29CJyE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_kJxS50jvGx0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_kM3VgFObOBU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_kMCk5HYXRhA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_kMfXlOLbJ9g_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_kNXDL29aL0E_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_kPSQIkWwKtM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_kQ6vHgHuVMo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_kRs_minus_ox4mJd0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_kS2VUTkflj0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_kUJ01RD1JGs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_kUv2_minus_yV2vfw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_kXoKeEoyfwo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_kYoZ_minus_ilL_plus_zk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_kZOsA97Ji0M_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_kZsCkTkbZgU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_kc26Da2_plus_ivQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_kh1MIaHhbmo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_kjB3piQnVh4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_kk6mGYu_minus_DUU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_kkHYbPDQMK4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_kkb9W0RfPT0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_klcUCefeE9Q_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_kqK_minus_S56CL9s_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_krVmAIa9W_minus_0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_krlgjuxfe2I_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ktKMmXn1R7c_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_kxyhAR28Fi0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_l_minus_BM32tjzqY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_l_minus_HE9Ui7Jck_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_l3EArnZr6_minus_8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_l5n05sKvMM8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_l9uYEtKBIQA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_lDi_plus_K6BUYUw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_lE2O8vM7keo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_lEQRC5UQZDI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_lG3QAnJi3sk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_lH79sVvHpzo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_lH8Wr22Poz0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_lHCWCYQW5lc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_lHJpwV5i29M_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_lHQMAVDRdf8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_lLLYkMNAA4A_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_lNTTjqQXkf4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_lOKJd85Bu7U_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_lOuJRYKbSug_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_lPf_minus_b912Gbg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_lR7fWk_minus_OVI0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_lV_plus_M4ace0Ts_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_lXesITh371Q_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_lYNHtD7Ms3M_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_lZlazM1Ei_plus_k_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_lb0c0UhEPYg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_lfP6VdrtlDk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ljYCJdPg5jU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ljdR544I6ho_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_lnWey3kb00A_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_loRNMMI_plus_BV4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_lrAjHpnIZpU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ltGxpBPyaAI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_luFeFBNUTk4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_luYDdZwGmC8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_lvvY3mc5Vss_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_lxH0PZ_plus_dW2E_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_lzHk963BL7g_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_lzs6jNvh9qw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_m_minus_FWe3HamOc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_m1WvyprztKg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_m2yZIur2btM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_m3CVfyaeuNI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_m6m0xWGahWw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_m7UpEhONxMA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_m9qXOH_plus_XWBM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_mBOR8lEifX0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_mBdPk9_plus_JusU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_mBjDvzWpGVs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_mCztcpS1jGs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_mD6r3NshZyo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_mEXNRN7i8GA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_mFmCBCBPQPw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_mH6mtmF1430_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_mJjAMxMoouI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_mNnRj_plus_T0Jl0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_mQo0ovALpKM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_mWzuA_minus_LRFmE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_mX_minus_WVA8pNsg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_mYaWSJuvtg4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_mZKtksgqmiQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_maq9mh6nNTE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_mbJRq5SJww4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_mcTQq_plus_l8Ppo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_mctaJ9po8Vk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_mdIPQKe4lRI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_meKfwBKCN9A_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_mgLr7cAr0dM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_mh0yBFI4Hmk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_mhrZrdppmDc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_mi75GvD9uq0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_miT17KpoFN4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_mmX_plus_v2z1Gss_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_mmgyb1Pe_minus_s0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_muoLz7iEl4I_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_mvwSEPRaNM8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_mxjhjb67uyM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_my5fVKR4wp0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_myyiP0GpIeQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_n_minus_xkyAPf_minus_P8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_n40jtA5wAls_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_n6LdZF4M7p4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_n6MH17TR38U_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_n7S7lOfl71U_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_n9MVeGIJYyU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_nCzcAMrlehk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_nDUS4Xc_minus_Twc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_nHU0qnM6vgI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_nJG_minus_Y2BtOEU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_nJVZjaCQ6oI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_nPKIj4r_minus_2xk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_nPwXnPFEstQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_nQDDHVj0B9k_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_nWvH5774ZvI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_nYA7nXRmwHg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_nYKfnhLGyO8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_nZqyD260j_plus_A_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_nbIZtn6wv7A_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_nbrxmv70IpM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ncAUU4JtF60_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_nfo6Q6hs514_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_nfrFZQGkv_plus_4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_nhTJWQnk2A8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_njrvRzhGwqk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_nkSbKYK2gRg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_nl7jLNJI8Ns_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_nlFQM4R_minus_Aco_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_nmGqNyrNQj0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_no0AiqphBIQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_npdBVCK80cs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_nrhlqqa1Ryo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_nsXnVfbWLtw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ntLQVqJSH5o_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_nxh_minus_MTZt8Mk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_nxus4jy2Qco_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_nzb9F_plus_nv3pU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_o_plus_XYqjgPwTk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_o_plus_cobhAWPDg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_o26ycLX9PNo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_o4iqIIK4SZQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_o5dFu_plus_5lyYU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_o6J_plus_Gcx336w_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_oBrGvuc2Pz0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_oCFdaQHIyqE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_oCIMmU9nczQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_oCTpafdlN_plus_I_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_oCrllVH4OE0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_oDNgQLmL8Kk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_oE7gCvN6Ygs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_oEQsPQR8l1I_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_oHcsHlycFE8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_oHrhuLxf9GE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_oLlc6LrZIK0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_oOUV_minus_EwUiJc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_oPkCHryPArQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_oQcEW6MgrGw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_oSv3omVJrzI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_oVB19wLdwg0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_obXlrN5_plus_T6g_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ocHw_plus_wuy2eo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_oeDzjPWu_minus_o8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ofO4_plus_TUnwIw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ogOi1AGEtYE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_olL3JJ0yPCc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_opQB7KfEmog_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ouzzTKM5a4U_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ozBH1uNV_minus_CA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_p0iin_plus_5pyxc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_p1MwPMovrqQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_p41XEqKt7Pk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_p5u9FgEEzVg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_p6QVJzwCl4A_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_p6SYKSPrxy0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_p7ZYQQM5Rq0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_p98bClfIFGc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_pCDG6X3_plus_8sY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_pGMylP5wrIU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_pJEy0WY19JM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_pJKa7LpED8U_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_pNFRb6EjosU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_pNUMqmhQiR8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_pOzrilVe4IE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_pQ0Q4V_minus_i7MA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_pQYlY0YQm3w_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_pRLVmpQe1b4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_pRpclGdCA9I_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_pSq7SObvxVg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_pSrfYqO6q2Y_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_pUaVtOhugPw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_pWfq6iqEo0Q_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_pWzdtw18an0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_pXnPhDouZC8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_pb0nCZ5k8Os_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_pbPYIhZc_plus_9U_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_pbiAyrIGjxo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_pg_minus_rfgBX5i0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_pgTD0qw023s_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_pgY7Rg3HlJA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_pgneomvAf9A_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_phLqTXCRrKs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_pjGOFX2e3MM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_plOum3e_plus_U_plus_Y_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_pqm3fr0Gwig_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_prvA2U9aEOI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ptTcX4k6zB4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_pxtarjzxY4o_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_q_plus_s0Lqw_minus_GCQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_q1vrENqA6Eg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_q29R3lLE4nY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_q4H1OsUcung_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_q6KNflHlOIA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_q6PrWQHQRnM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_qAKtgVDTrAM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_qB2_minus_9007vRI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_qCcBSIApplE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_qEoBtYT8_minus_mE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_qFG3gUOjf6A_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_qFYwlVP8fy8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_qGp5Hv7tsGs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_qHAmmjXXW6A_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_qINWb8ZDW9k_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_qIgSdMADtcQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_qOmEpCDDDIY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_qOwk_minus_Xj1Qlw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_qPvg3vvKVZc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_qVmEbYCnt6k_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_qYCSesOwYMo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_qc_minus_X7Y_plus_SL5o_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_qcbq6ZtAiL0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_qdb0LpnRm6M_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_qdoLpGEQ1XE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_qj0dNtgkDbw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_qlvV3qxuDNs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_qphY013lGno_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_qpuf5izWYX4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_qqisiZ8UC0Y_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_qrWtbADYadA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_qs5agwaZZh0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_qtqdVrcEY3E_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_qu7GUBjarBs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_quZqrOeI5IE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_qvfwUY9cLaQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_qxiDhrp8boY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_qyLe_minus_tXZ4VE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_r086my47qVA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_r0fVFU6ham8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_r5iHlAhWyUA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_r5ic7SNqMiQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_r9z2aGbF4hg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_rBZ_plus_OjdFBAk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_rC6DV8RL7u4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_rEMG2FORiIs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_rJTtAVw7H5I_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_rJcLupv6yz8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_rNLVCzbCJgE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_rNoQTDSkF0Y_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_rONrD2xHVZk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_rPyRy5q6vXg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_rQr2nSz91OY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_rSKOJzOghVM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_rSjUG0S004I_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_rTZEisjyGZQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_rVQZN6kv3Zk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_rWzPAzEcvi0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_rXOsqWISrB4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_rXbzVpqX6ro_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ra_plus_kuj5vEl4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ra_minus_vD4R5XxA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_rbSZBjXBjGs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_rcYiqxMPEpM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_re4y32MvUFQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_rf_minus_6UO_minus_lrls_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_rjDyMB27L_minus_U_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_rk9Yk81l3Bc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_rkMAfteUvoc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_rkmHtq6GqNs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_rlH9KhEJp2c_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_rlMTyDizfms_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_rlrP1MrtN3k_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_rlz_minus_6_plus_QTzIM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_rm_plus_OcISAwjc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_rn8QYn9Yuh8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_rrnAgjO_minus_pv0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_rsX_minus_wqqmCbw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_rsdziSccAtU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_rwBYJNJtve4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_rwy_plus_lzkDNBc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ryJEwSjeOCU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_s13MdrE2ZVA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_s1W93bDgGXw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_s3mNCN_minus_95Lk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_s5tkwwxWX8c_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_s8wCTgpBNrQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_sCgF5uMB_minus_FI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_sD9TzYmp_minus_VU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_sE_plus_t4QVrkX0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_sFd_minus_YS2a808_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_sG16FCVow8E_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_sGJzxO9xzDQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_sGZVzPhOGyc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_sJR_minus_x5mI1i8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_sJmwAgLsH6o_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_sKg_plus_Bx_plus_VSoM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_sMnTQ7ikLSc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_sNgjJZW2A7M_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_sNqGp2I_minus_m_plus_c_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_sPcruQNhydA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_sTFaycIFUKU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_sUVCMUIiDYg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_sXfFudQgKlA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_sbMQcXYiRY4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_sbXXIA7Khw4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_sdiDyE_minus_vZEc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_sfb15YAkqP0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_sfbs6MLi_minus_vM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_siWkeyN1Q9w_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_sl6kUtmc2jQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_soBUksJ6BJc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_sptP0R_plus_70K8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_sq0tL84dvR4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_sskXCk7XoHY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_suFjXqXcAxM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_t_minus_19whstaJk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_t7JO426T0B8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_t7ly31b0Ndc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_t9OApWMdsWU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_t9XUoJbebeo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_t9anqIXZiQ0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_tAJSGdhpxPg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_tDRu6NI8zIE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_tERtNxTopHQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_tFWFxcN81k8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_tGKaqH2rxA8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_tHCoD1Tx_plus_ac_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_tI9hD6Dxa4I_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_tJ9NnDfCmms_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_tJi9lnN2N7M_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_tKmhQVaQD7w_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_tMAxWmbzRZM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_tNJjozY_minus_ivY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_tPxWWmILYcM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_tR6pYhfnTHs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_tS8_minus_IO1AbCM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_tSNvjtWkIfQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_tTXCDT7IfKE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_tVnfe7_plus_IZEk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_tWES3w99BPs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_tWN91o4uKzw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_tXf8m1pD2a4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_tbs4tGxCa5E_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_tbwejyTSXUU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_tdT_minus_m7BcuWI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_teIqLgy2D_plus_M_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_teMFfokLLkU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_tgj75WoMzOk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_tgpbZU_minus_29tQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_tgu8Waf_plus_7lw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_tjJ_minus_aT7ndxw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_tk57Pd6sBUM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_toMfUd3jFmo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_tqKiU7Aq5RM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_tvQBw2Po2aA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_twRfxl26QHM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_twfQODVy4tM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_txBwhP9PKYI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_tygy6ny87Q0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_tz6Lq93L_plus_ck_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_tzMbgxjofRM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_tzUrPjnaJVM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_u_plus_NMS_minus_YShsI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_u_plus_jJYuyhPyA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_u_minus_8eJHYqWpU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_u_minus_GlxOsA5GU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_u2gKuDWpTDY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_u5SwcJ82lAU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_u7d_minus_Shr0LfQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_u8OCyPpV3NI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_u8opZ3UBjFs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_uARdCQX_minus__minus_zc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_uCZYLkqsAxA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_uFa_plus_zk_minus_qFos_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_uI6fjh6uDF0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_uJz78qBVRxQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_uNaCeoknjtQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_uRAfWptGSjA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_uS1Uto3McwE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_uSuVZ1eLmt4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_uTRcii_minus_1Idc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_uTRx3_plus_3gc_plus_k_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_uU4zmFmloQA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_uVeK_minus_dCqDDI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_uYI_minus_Ut2eIzE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_uZZDmi7MP0o_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_uat8HBPqBak_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ucKljWzIjRE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ugBmqrDZeVU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_uh2EuCm2YCY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ui9fWiWye0o_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ujGbVNwbnsg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_umnzcAFHbII_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_un1SdiWKqFM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_uoCC5iMYRRk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_uoxr3PU_plus_4as_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_urFiZZY7T8A_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_v_plus_o2_minus_jDM_minus_NQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_v_minus_1phlSHY_minus_4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_v24X_plus_XNEZ10_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_v3KR8jUiYis_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_v4T7KQ_minus_iRWk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_v4X5tkn3aEc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_v4ovShGk46M_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_v5Jv0hKmYiI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_v7XXpvTVcS4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_v7nsHgKZUw0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_vEr0V2niEOs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_vGmSzNZQIJI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_vJusUgRbsfM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_vQah03QdJqE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_vQhkSQfb87Y_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_vQlEe5xlWVU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_vTvTwYtpEeg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_vUbvfpTOyZw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_vVBwwOmK0I0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_vWBUbKWs53U_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_vaLPKYnyR1A_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_vahTGzCJaMQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_vbOtZbSzsE8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_vdVczMe_minus_fhA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_vhnwsUWgvuI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_vlGsIsU6PU0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_vmeEa2lMfgg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_vo44gbqDKr4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_vp9utKGSdLA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_vrcfgNgTsG0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_vsTIMSFJu8A_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_vsvqZ5etggk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_vu4W4iqtB8w_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_vvAH9_plus_4ZHz0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_vwiXpS6cE1w_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_vzWCrH_plus_J_plus_NA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_w0wpHYTi6EA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_w1K_plus_MDlGq0A_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_w2WJke4VKTI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_w52SREE0dR4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_w7mZl3yVB7Q_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_w8G_minus_27K4CKo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_w9ALlfS_plus__minus_1U_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_wA_minus_2odSyaxE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_wEFMvcwAB_plus_4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_wEoYa5LiVCs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_wI2MuSfoGmY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_wJGWP8GMugU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_wM3y9VvsxC8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_wREfYiBWM9I_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_wRflNM0P98U_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_wRmWjXuPRHc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_wShS3awSPes_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_wT8R_minus_goU_minus_wo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_wUdJhLXHJ20_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_wVqfIbX8_minus_9o_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_wX3Q7fEGgig_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_wXQ1M9E_minus_ogs_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_wXV5Sv_plus_uG2I_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_wXYqSpkCM0Q_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_wZuzcZ6s3lI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_wadufVirZ2M_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_wcWXUiFSwIE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_weLsgM28tbk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_wf813gVN0Pk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_wfYIRd1gBrQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_wfr181TfXYA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_wiEINApongA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_wklLVioomR8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_wl1GA8QnYHg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_wpdqNpD4Oiw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ws3SV2Lco9Q_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_wsuvi4O4rrU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_wtYQga8KPmc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_wuxc928fFWI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_wvnTRM83N8A_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_wvxn_plus_5DjD2E_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_wyqfK2JMc3w_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_wzm2XBeo_minus_QA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_x_minus_2E_minus_Ys4WR4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_x1I5AZUlchI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_x1rX1MnIGsY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_x2tlaNw89TU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_x9W3XZyylbQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_xCMuNG9KIgw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_xCkh_minus_S5yz3Q_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_xFMn_minus_zbvccU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_xIy0W9HvBL4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_xJIr8LUoRF4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_xKjvZQc9mS0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_xKl8TEc8ex0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_xLNi34K9wx4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_xO9q1axBX6E_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_xP6BkeQUcgY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_xQCuxQjDykA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_xSzv_minus_6H17w4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_xUnEBPqwAMA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_xaIq0CtQKoY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_xaJ_plus_90PDWq0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_xaUiBXssnyI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_xdwXJaTNSdo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_xfIua_plus_p93JM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_xfM0lTzZ2cg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_xih0DndiTn8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_xlMpv_minus_0dQqQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_xq6hhVsBYWQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_xqbu_plus_3_minus_b_plus_oc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_xvquTEbr1ro_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_xvwBLvAw5rk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_xxCBvEF4QKA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_xxzYq2qOmmA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_y8YTG9tKkZU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_yByyc7LWVyo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_yDcav8XDhNE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_yFESIdtULms_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_yFVdc7AU9CE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_yFY_plus_qwyq4EU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_yFpO_minus_JNMJhg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_yH0QPebkOrI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_yLmhIcOD8ps_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_yMs5663vXes_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_yMsg1aIvVeQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_yNo0nYzR_minus_2s_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_yOg0rlUCw_minus_E_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_yS7mdMnsD9w_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ySrVsGNCg5M_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_yTZX5enqmeg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_yU96LVMP6Ls_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_yUSPR_minus_cbjTk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_yUSeijS5jMg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_yVUXlSyV1wU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_yXn9vfYK9wc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_yZ_plus_xfcqaPFQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_yZAHahM6ssQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ycTK_minus_Kln6O0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ycjIR9LmD5g_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ydzVilv4a_plus_U_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ye8ug5xQnCo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_yi7Wtl_plus_fVLE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ykWsQEP_minus_SUQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ynOkla1p3Tg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_yo1eR3eeGFc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_yq_plus_USbNftkM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_yrEqhN42Sdo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_yt3rhCWxg_minus_E_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_yvD66FSFyNg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_yvK_plus_8QIuztw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ywPrr9tliWE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_yxJfRazxV4Y_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_yy4HvBpneq4_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_yyw_minus_EeUuvsI_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_yyyKthMKUbg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_yzmRg_minus_FYuDY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_z_plus_cswsLsRSE_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_z_plus_dacXqbPiw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_z_plus_rxFarLiwM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_z0h7iE7V9z0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_z2VQDdlIm3s_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_z5Gm6x3HnB0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_z7Zy1jMxjyo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_z9rAJ6lhtiM_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_zCvvTlRfuq0_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_zKbg6elkzAk_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_zKbm12dz0po_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_zMD3bA26OQY_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_zMbMGN1EK10_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_zSDwbTp6598_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_zTlwShy5eU8_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_zV05yXZmNKg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_zW6mUeF4XHg_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_zWByRCe8gvc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_zWxkwk8uSco_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_zX9DrNdYROA_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_zX9Hg5va50Y_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_zYqwC5u_plus_u8w_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_zZHQ8k5tC40_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_zZdK5_plus_6pGfo_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_zkZ87olRiNU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_zm7DYNMbcEU_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_zn_minus_I1NzL_plus_rc_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_zp5pLVG32rw_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_zsbtwORWN3k_nid_no_patch(); +int APS5_VABI libSceNKWebKitLegacyUnknown_ztdtXYywksE_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceNKWebKit/include/WebCoreExports.hpp b/core/libs/prx/libSceNKWebKit/include/WebCoreExports.hpp new file mode 100644 index 0000000000..48cf75cbdd --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/include/WebCoreExports.hpp @@ -0,0 +1,122 @@ +#pragma once + +#include "SceTypes.hpp" +#include "prx/libSceNKWebKit/src/WebCoreTypes.hpp" +#include +#include + +extern "C" { + +WebCore::FloatPoint APS5_VABI _ZN7WebCore10FloatPoint15narrowPrecisionEdd(double x, double y); +void APS5_VABI _ZN7WebCore10FloatPoint9normalizeEv(WebCore::FloatPoint* self); +void APS5_VABI _ZN7WebCore10FloatPointC1ERKNS_8IntPointE(WebCore::FloatPoint* self, const WebCore::IntPoint& p); +void APS5_VABI _ZN7WebCore10FloatPointC2ERKNS_8IntPointE(WebCore::FloatPoint* self, const WebCore::IntPoint& p); +void APS5_VABI _ZN7WebCore10LayoutRect5scaleEf(WebCore::LayoutRect* self, float s); +void APS5_VABI _ZN7WebCore10LayoutRect5uniteERKS0_(WebCore::LayoutRect* self, const WebCore::LayoutRect& other); +void APS5_VABI _ZN7WebCore10LayoutRectC1ERKNS_9FloatRectE(WebCore::LayoutRect* self, const WebCore::FloatRect& r); +void APS5_VABI _ZN7WebCore10LayoutRectC2ERKNS_9FloatRectE(WebCore::LayoutRect* self, const WebCore::FloatRect& r); +void APS5_VABI _ZN7WebCore11RoundedRectC1ERKNS_10LayoutRectERKNS_10LayoutSizeES6_S6_S6_( WebCore::RoundedRect* self, const WebCore::LayoutRect& rect, const WebCore::LayoutSize& topLeft, const WebCore::LayoutSize& topRight, const WebCore::LayoutSize& bottomLeft, const WebCore::LayoutSize& bottomRight); +void APS5_VABI _ZN7WebCore11RoundedRectC2ERKNS_10LayoutRectERKNS_10LayoutSizeES6_S6_S6_( WebCore::RoundedRect* self, const WebCore::LayoutRect& rect, const WebCore::LayoutSize& topLeft, const WebCore::LayoutSize& topRight, const WebCore::LayoutSize& bottomLeft, const WebCore::LayoutSize& bottomRight); +WebCore::IntRect APS5_VABI _ZN7WebCore14roundedIntRectERKNS_9FloatRectE(const WebCore::FloatRect& rect); +void APS5_VABI _ZN7WebCore15AffineTransform12makeIdentityEv(WebCore::AffineTransform* self); +WebCore::AffineTransform& APS5_VABI _ZN7WebCore15AffineTransform15scaleNonUniformEdd( WebCore::AffineTransform* self, double sx, double sy); +WebCore::AffineTransform& APS5_VABI _ZN7WebCore15AffineTransform4skewEdd( WebCore::AffineTransform* self, double angleX, double angleY); +WebCore::AffineTransform& APS5_VABI _ZN7WebCore15AffineTransform5flipXEv(WebCore::AffineTransform* self); +WebCore::AffineTransform& APS5_VABI _ZN7WebCore15AffineTransform5flipYEv(WebCore::AffineTransform* self); +WebCore::AffineTransform& APS5_VABI _ZN7WebCore15AffineTransform5scaleERKNS_9FloatSizeE( WebCore::AffineTransform* self, const WebCore::FloatSize& s); +WebCore::AffineTransform& APS5_VABI _ZN7WebCore15AffineTransform5scaleEd(WebCore::AffineTransform* self, double s); +WebCore::AffineTransform& APS5_VABI _ZN7WebCore15AffineTransform5shearEdd( WebCore::AffineTransform* self, double sx, double sy); +WebCore::AffineTransform& APS5_VABI _ZN7WebCore15AffineTransform6rotateEd(WebCore::AffineTransform* self, double a); +WebCore::AffineTransform& APS5_VABI _ZN7WebCore15AffineTransform8multiplyERKS0_( WebCore::AffineTransform* self, const WebCore::AffineTransform& other); +WebCore::AffineTransform& APS5_VABI _ZN7WebCore15AffineTransform9translateERKNS_10FloatPointE( WebCore::AffineTransform* self, const WebCore::FloatPoint& p); +WebCore::AffineTransform& APS5_VABI _ZN7WebCore15AffineTransform9translateERKNS_9FloatSizeE( WebCore::AffineTransform* self, const WebCore::FloatSize& s); +WebCore::AffineTransform& APS5_VABI _ZN7WebCore15AffineTransform9translateEdd( WebCore::AffineTransform* self, double tx, double ty); +void APS5_VABI _ZN7WebCore16FloatRoundedRectC1ERKNS_9FloatRectERKNS0_5RadiiE( WebCore::FloatRoundedRect* self, const WebCore::FloatRect& rect, const WebCore::FloatRoundedRect::Radii& radii); +void APS5_VABI _ZN7WebCore16FloatRoundedRectC2ERKNS_9FloatRectERKNS0_5RadiiE( WebCore::FloatRoundedRect* self, const WebCore::FloatRect& rect, const WebCore::FloatRoundedRect::Radii& radii); +void APS5_VABI _ZN7WebCore20TransformationMatrix10makeAffineEv(WebCore::TransformationMatrix* self); +WebCore::TransformationMatrix APS5_VABI _ZN7WebCore20TransformationMatrix10rectToRectERKNS_9FloatRectES3_( const WebCore::FloatRect& from, const WebCore::FloatRect& to); +WebCore::TransformationMatrix& APS5_VABI _ZN7WebCore20TransformationMatrix11translate3dEddd( WebCore::TransformationMatrix* self, double tx, double ty, double tz); +WebCore::TransformationMatrix& APS5_VABI _ZN7WebCore20TransformationMatrix15scaleNonUniformEdd( WebCore::TransformationMatrix* self, double sx, double sy); +WebCore::TransformationMatrix& APS5_VABI _ZN7WebCore20TransformationMatrix4skewEdd( WebCore::TransformationMatrix* self, double sx, double sy); +WebCore::TransformationMatrix& APS5_VABI _ZN7WebCore20TransformationMatrix5flipXEv(WebCore::TransformationMatrix* self); +WebCore::TransformationMatrix& APS5_VABI _ZN7WebCore20TransformationMatrix5flipYEv(WebCore::TransformationMatrix* self); +WebCore::TransformationMatrix& APS5_VABI _ZN7WebCore20TransformationMatrix5scaleEd( WebCore::TransformationMatrix* self, double s); +WebCore::TransformationMatrix& APS5_VABI _ZN7WebCore20TransformationMatrix6rotateEd( WebCore::TransformationMatrix* self, double a); +WebCore::TransformationMatrix& APS5_VABI _ZN7WebCore20TransformationMatrix8multiplyERKS0_( WebCore::TransformationMatrix* self, const WebCore::TransformationMatrix& mat); +WebCore::TransformationMatrix& APS5_VABI _ZN7WebCore20TransformationMatrix8rotate3dEddd( WebCore::TransformationMatrix* self, double rx, double ry, double rz); +WebCore::TransformationMatrix& APS5_VABI _ZN7WebCore20TransformationMatrix9translateEdd( WebCore::TransformationMatrix* self, double tx, double ty); +void APS5_VABI _ZN7WebCore20TransformationMatrixC1ERKNS_15AffineTransformE( WebCore::TransformationMatrix* self, const WebCore::AffineTransform& t); +void APS5_VABI _ZN7WebCore20TransformationMatrixC2ERKNS_15AffineTransformE( WebCore::TransformationMatrix* self, const WebCore::AffineTransform& t); +void APS5_VABI _ZN7WebCore27setPresentingApplicationPIDEi(int pid); +bool APS5_VABI _ZN7WebCore30isStatusCodeCacheableByDefaultEi(int statusCode); +bool APS5_VABI _ZN7WebCore32isStatusCodePotentiallyCacheableEi(int statusCode); +WebCore::FloatRect APS5_VABI _ZN7WebCore36largestRectWithAspectRatioInsideRectEfRKNS_9FloatRectE( float aspectRatio, const WebCore::FloatRect& srcRect); +WebCore::FloatRect APS5_VABI _ZN7WebCore37smallestRectWithAspectRatioAroundRectEfRKNS_9FloatRectE( float aspectRatio, const WebCore::FloatRect& srcRect); +unsigned int APS5_VABI _ZN7WebCore43initializeMaximumHTTPConnectionCountPerHostEv(); +void APS5_VABI _ZN7WebCore5ColorC1EOS0_(WebCore::Color* self, WebCore::Color&& other); +void APS5_VABI _ZN7WebCore5ColorC1ERKS0_(WebCore::Color* self, const WebCore::Color& other); +void APS5_VABI _ZN7WebCore5ColorC2EOS0_(WebCore::Color* self, WebCore::Color&& other); +void APS5_VABI _ZN7WebCore5ColorC2ERKS0_(WebCore::Color* self, const WebCore::Color& other); +WebCore::Color& APS5_VABI _ZN7WebCore5ColoraSEOS0_(WebCore::Color* self, WebCore::Color&& other); +WebCore::Color& APS5_VABI _ZN7WebCore5ColoraSERKS0_(WebCore::Color* self, const WebCore::Color& other); +void APS5_VABI _ZN7WebCore7IntRect5scaleEf(WebCore::IntRect* self, float s); +void APS5_VABI _ZN7WebCore7IntRect5uniteERKS0_(WebCore::IntRect* self, const WebCore::IntRect& other); +void APS5_VABI _ZN7WebCore7IntRect9intersectERKS0_(WebCore::IntRect* self, const WebCore::IntRect& other); +void APS5_VABI _ZN7WebCore7IntRectC1ERKNS_10LayoutRectE(WebCore::IntRect* self, const WebCore::LayoutRect& r); +void APS5_VABI _ZN7WebCore7IntRectC1ERKNS_9FloatRectE(WebCore::IntRect* self, const WebCore::FloatRect& r); +void APS5_VABI _ZN7WebCore7IntRectC2ERKNS_10LayoutRectE(WebCore::IntRect* self, const WebCore::LayoutRect& r); +void APS5_VABI _ZN7WebCore7IntRectC2ERKNS_9FloatRectE(WebCore::IntRect* self, const WebCore::FloatRect& r); +void APS5_VABI _ZN7WebCore7IntSizeC1ERKNS_9FloatSizeE(WebCore::IntSize* self, const WebCore::FloatSize& s); +void APS5_VABI _ZN7WebCore7IntSizeC2ERKNS_9FloatSizeE(WebCore::IntSize* self, const WebCore::FloatSize& s); +void APS5_VABI _ZN7WebCore8IntPointC1ERKNS_10FloatPointE(WebCore::IntPoint* self, const WebCore::FloatPoint& p); +void APS5_VABI _ZN7WebCore8IntPointC2ERKNS_10FloatPointE(WebCore::IntPoint* self, const WebCore::FloatPoint& p); +void APS5_VABI _ZN7WebCore9FloatRect5scaleEff(WebCore::FloatRect* self, float sx, float sy); +void APS5_VABI _ZN7WebCore9FloatRect5uniteERKS0_(WebCore::FloatRect* self, const WebCore::FloatRect& other); +void APS5_VABI _ZN7WebCore9FloatRect6extendERKNS_10FloatPointE(WebCore::FloatRect* self, const WebCore::FloatPoint& p); +void APS5_VABI _ZN7WebCore9FloatRect9intersectERKS0_(WebCore::FloatRect* self, const WebCore::FloatRect& other); +void APS5_VABI _ZN7WebCore9FloatRectC1ERKNS_7IntRectE(WebCore::FloatRect* self, const WebCore::IntRect& r); +void APS5_VABI _ZN7WebCore9FloatRectC2ERKNS_7IntRectE(WebCore::FloatRect* self, const WebCore::IntRect& r); +WebCore::FloatPoint APS5_VABI _ZNK7WebCore10FloatPoint15matrixTransformERKNS_15AffineTransformE( const WebCore::FloatPoint* self, const WebCore::AffineTransform& t); +WebCore::FloatPoint APS5_VABI _ZNK7WebCore10FloatPoint15matrixTransformERKNS_20TransformationMatrixE( const WebCore::FloatPoint* self, const WebCore::TransformationMatrix& t); +WebCore::FloatPoint APS5_VABI _ZNK7WebCore10FloatPoint18constrainedBetweenERKS0_S2_( const WebCore::FloatPoint* self, const WebCore::FloatPoint& min, const WebCore::FloatPoint& max); +bool APS5_VABI _ZNK7WebCore10LayoutRect8containsERKS0_(const WebCore::LayoutRect* self, const WebCore::LayoutRect& other); +bool APS5_VABI _ZNK7WebCore11RoundedRect8containsERKNS_10LayoutRectE( const WebCore::RoundedRect* self, const WebCore::LayoutRect& other); +bool APS5_VABI _ZNK7WebCore15AffineTransform10isIdentityEv(const WebCore::AffineTransform* self); +WebCore::TransformationMatrix APS5_VABI _ZNK7WebCore15AffineTransform22toTransformationMatrixEv( const WebCore::AffineTransform* self); +double APS5_VABI _ZNK7WebCore15AffineTransform6xScaleEv(const WebCore::AffineTransform* self); +double APS5_VABI _ZNK7WebCore15AffineTransform6yScaleEv(const WebCore::AffineTransform* self); +WebCore::FloatQuad APS5_VABI _ZNK7WebCore15AffineTransform7mapQuadERKNS_9FloatQuadE( const WebCore::AffineTransform* self, const WebCore::FloatQuad& q); +WebCore::IntRect APS5_VABI _ZNK7WebCore15AffineTransform7mapRectERKNS_7IntRectE( const WebCore::AffineTransform* self, const WebCore::IntRect& r); +WebCore::FloatRect APS5_VABI _ZNK7WebCore15AffineTransform7mapRectERKNS_9FloatRectE( const WebCore::AffineTransform* self, const WebCore::FloatRect& rect); +WebCore::IntSize APS5_VABI _ZNK7WebCore15AffineTransform7mapSizeERKNS_7IntSizeE( const WebCore::AffineTransform* self, const WebCore::IntSize& size); +WebCore::FloatSize APS5_VABI _ZNK7WebCore15AffineTransform7mapSizeERKNS_9FloatSizeE( const WebCore::AffineTransform* self, const WebCore::FloatSize& size); +WebCore::FloatPoint APS5_VABI _ZNK7WebCore15AffineTransform8mapPointERKNS_10FloatPointE( const WebCore::AffineTransform* self, const WebCore::FloatPoint& point); +WebCore::IntPoint APS5_VABI _ZNK7WebCore15AffineTransform8mapPointERKNS_8IntPointE( const WebCore::AffineTransform* self, const WebCore::IntPoint& point); +bool APS5_VABI _ZNK7WebCore20TransformationMatrix12isInvertibleEv(const WebCore::TransformationMatrix* self); +WebCore::AffineTransform APS5_VABI _ZNK7WebCore20TransformationMatrix17toAffineTransformEv( const WebCore::TransformationMatrix* self); +WebCore::FloatQuad APS5_VABI _ZNK7WebCore20TransformationMatrix7mapQuadERKNS_9FloatQuadE( const WebCore::TransformationMatrix* self, const WebCore::FloatQuad& q); +WebCore::IntRect APS5_VABI _ZNK7WebCore20TransformationMatrix7mapRectERKNS_7IntRectE( const WebCore::TransformationMatrix* self, const WebCore::IntRect& r); +WebCore::FloatRect APS5_VABI _ZNK7WebCore20TransformationMatrix7mapRectERKNS_9FloatRectE( const WebCore::TransformationMatrix* self, const WebCore::FloatRect& r); +WebCore::FloatPoint APS5_VABI _ZNK7WebCore20TransformationMatrix8mapPointERKNS_10FloatPointE( const WebCore::TransformationMatrix* self, const WebCore::FloatPoint& p); +WebCore::TransformationMatrix APS5_VABI _ZNK7WebCore24MatrixTransformOperation6matrixEv( const WebCore::MatrixTransformOperation* self); +WebCore::Color APS5_VABI _ZNK7WebCore5Color14colorWithAlphaEf(const WebCore::Color* self, float alpha); +WebCore::Color APS5_VABI _ZNK7WebCore5Color8darkenedEv(const WebCore::Color* self); +WebCore::Color APS5_VABI _ZNK7WebCore5Color9lightenedEv(const WebCore::Color* self); +double APS5_VABI _ZNK7WebCore5Color9lightnessEv(const WebCore::Color* self); +double APS5_VABI _ZNK7WebCore5Color9luminanceEv(const WebCore::Color* self); +bool APS5_VABI _ZNK7WebCore7IntRect10intersectsERKS0_(const WebCore::IntRect* self, const WebCore::IntRect& other); +bool APS5_VABI _ZNK7WebCore7IntRect8containsERKS0_(const WebCore::IntRect* self, const WebCore::IntRect& other); +WebCore::IntSize APS5_VABI _ZNK7WebCore7IntSize18constrainedBetweenERKS0_S2_( const WebCore::IntSize* self, const WebCore::IntSize& min, const WebCore::IntSize& max); +WebCore::IntPoint APS5_VABI _ZNK7WebCore8IntPoint18constrainedBetweenERKS0_S2_( const WebCore::IntPoint* self, const WebCore::IntPoint& min, const WebCore::IntPoint& max); +WebCore::FloatRect APS5_VABI _ZNK7WebCore9FloatQuad11boundingBoxEv(const WebCore::FloatQuad* self); +bool APS5_VABI _ZNK7WebCore9FloatQuad12containsQuadERKS0_(const WebCore::FloatQuad* self, const WebCore::FloatQuad& other); +bool APS5_VABI _ZNK7WebCore9FloatQuad13containsPointERKNS_10FloatPointE(const WebCore::FloatQuad* self, const WebCore::FloatPoint& point); +bool APS5_VABI _ZNK7WebCore9FloatQuad13isRectilinearEv(const WebCore::FloatQuad* self); +bool APS5_VABI _ZNK7WebCore9FloatRect10intersectsERKS0_(const WebCore::FloatRect* self, const WebCore::FloatRect& other); +bool APS5_VABI _ZNK7WebCore9FloatRect21inclusivelyIntersectsERKS0_(const WebCore::FloatRect* self, const WebCore::FloatRect& other); +bool APS5_VABI _ZNK7WebCore9FloatRect8containsERKNS_10FloatPointENS0_12ContainsModeE( const WebCore::FloatRect* self, const WebCore::FloatPoint& point, std::uint32_t containsMode); +bool APS5_VABI _ZNK7WebCore9FloatRect8containsERKS0_(const WebCore::FloatRect* self, const WebCore::FloatRect& other); +WebCore::FloatSize APS5_VABI _ZNK7WebCore9FloatSize18constrainedBetweenERKS0_S2_( const WebCore::FloatSize* self, const WebCore::FloatSize& min, const WebCore::FloatSize& max); +bool APS5_VABI _ZNK7WebCore9FloatSize6isZeroEv(const WebCore::FloatSize* self); + +} diff --git a/core/libs/prx/libSceNKWebKit/include/WebKitConfigExports.hpp b/core/libs/prx/libSceNKWebKit/include/WebKitConfigExports.hpp new file mode 100644 index 0000000000..4750c0539d --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/include/WebKitConfigExports.hpp @@ -0,0 +1,135 @@ +#pragma once + +#include "SceTypes.hpp" +#include +#include + +extern "C" { + +bool APS5_VABI WKContextConfigurationAlwaysKeepAndReuseSwappedProcesses(const void* configuration); +const void* APS5_VABI WKContextConfigurationCopyApplicationCacheDirectory(const void* configuration); +const void* APS5_VABI WKContextConfigurationCopyCustomClassesForParameterCoder(const void* configuration); +const void* APS5_VABI WKContextConfigurationCopyDiskCacheDirectory(const void* configuration); +const void* APS5_VABI WKContextConfigurationCopyIndexedDBDatabaseDirectory(const void* configuration); +const void* APS5_VABI WKContextConfigurationCopyInjectedBundlePath(const void* configuration); +const void* APS5_VABI WKContextConfigurationCopyLocalStorageDirectory(const void* configuration); +const void* APS5_VABI WKContextConfigurationCopyMediaKeysStorageDirectory(const void* configuration); +const void* APS5_VABI WKContextConfigurationCopyNetworkProcessPath(const void* configuration); +const void* APS5_VABI WKContextConfigurationCopyOverrideLanguages(const void* configuration); +const void* APS5_VABI WKContextConfigurationCopyResourceLoadStatisticsDirectory(const void* configuration); +const void* APS5_VABI WKContextConfigurationCopyWebProcessPath(const void* configuration); +const void* APS5_VABI WKContextConfigurationCopyWebSQLDatabaseDirectory(const void* configuration); +const void* APS5_VABI WKContextConfigurationCreate(); +const void* APS5_VABI WKContextConfigurationCreateWithLegacyOptions(); +std::int64_t APS5_VABI WKContextConfigurationDiskCacheSizeOverride(const void* configuration); +bool APS5_VABI WKContextConfigurationFullySynchronousModeIsAllowedForTesting(const void* configuration); +std::int32_t APS5_VABI WKContextConfigurationGetUserId(const void* configuration); +bool APS5_VABI WKContextConfigurationIgnoreSynchronousMessagingTimeoutsForTesting(const void* configuration); +bool APS5_VABI WKContextConfigurationPrewarmsProcessesAutomatically(const void* configuration); +bool APS5_VABI WKContextConfigurationProcessSwapsOnNavigation(const void* configuration); +void APS5_VABI WKContextConfigurationSetAlwaysKeepAndReuseSwappedProcesses(const void* configuration, bool keepAndReuse); +void APS5_VABI WKContextConfigurationSetApplicationCacheDirectory(const void* configuration, const void* applicationCacheDirectory); +void APS5_VABI WKContextConfigurationSetCustomClassesForParameterCoder(const void* configuration, const void* classesForCoder); +void APS5_VABI WKContextConfigurationSetDiskCacheDirectory(const void* configuration, const void* diskCacheDirectory); +void APS5_VABI WKContextConfigurationSetDiskCacheSizeOverride(const void* configuration, std::int64_t size); +void APS5_VABI WKContextConfigurationSetFullySynchronousModeIsAllowedForTesting(const void* configuration, bool allowed); +void APS5_VABI WKContextConfigurationSetIgnoreSynchronousMessagingTimeoutsForTesting(const void* configuration, bool ignore); +void APS5_VABI WKContextConfigurationSetIndexedDBDatabaseDirectory(const void* configuration, const void* indexedDBDatabaseDirectory); +void APS5_VABI WKContextConfigurationSetInjectedBundlePath(const void* configuration, const void* injectedBundlePath); +void APS5_VABI WKContextConfigurationSetLocalStorageDirectory(const void* configuration, const void* localStorageDirectory); +void APS5_VABI WKContextConfigurationSetMediaKeysStorageDirectory(const void* configuration, const void* mediaKeysStorageDirectory); +void APS5_VABI WKContextConfigurationSetNetworkProcessPath(const void* configuration, const void* networkProcessPath); +void APS5_VABI WKContextConfigurationSetOverrideLanguages(const void* configuration, const void* overrideLanguages); +void APS5_VABI WKContextConfigurationSetPrewarmsProcessesAutomatically(const void* configuration, bool prewarms); +void APS5_VABI WKContextConfigurationSetProcessSwapsOnNavigation(const void* configuration, bool swaps); +void APS5_VABI WKContextConfigurationSetResourceLoadStatisticsDirectory(const void* configuration, const void* resourceLoadStatisticsDirectory); +void APS5_VABI WKContextConfigurationSetShouldCaptureAudioInUIProcess(const void* configuration, bool allowed); +void APS5_VABI WKContextConfigurationSetShouldConfigureJSCForTesting(const void* configuration, bool value); +void APS5_VABI WKContextConfigurationSetUserId(const void* configuration, std::int32_t userId); +void APS5_VABI WKContextConfigurationSetUsesWebProcessCache(const void* configuration, bool uses); +void APS5_VABI WKContextConfigurationSetWebProcessPath(const void* configuration, const void* webProcessPath); +void APS5_VABI WKContextConfigurationSetWebSQLDatabaseDirectory(const void* configuration, const void* webSQLDatabaseDirectory); +bool APS5_VABI WKContextConfigurationUsesWebProcessCache(const void* configuration); +const void* APS5_VABI WKCredentialCopyUser(const void* credential); +const void* APS5_VABI WKCredentialCreate(const void* username, const void* password, std::uint32_t persistence); +const void* APS5_VABI WKCredentialCreateWithCertificateInfo(const void* certificateInfo); +const void* APS5_VABI WKGeolocationPositionCreate( double timestamp, double latitude, double longitude, double accuracy); +const void* APS5_VABI WKGeolocationPositionCreate_b( double timestamp, double latitude, double longitude, double accuracy, bool providesAltitude, double altitude, bool providesAltitudeAccuracy, double altitudeAccuracy, bool providesHeading, double heading, bool providesSpeed, double speed); +const void* APS5_VABI WKGeolocationPositionCreate_c( double timestamp, double latitude, double longitude, double accuracy, bool providesAltitude, double altitude, bool providesAltitudeAccuracy, double altitudeAccuracy, bool providesHeading, double heading, bool providesSpeed, double speed, bool providesFloorLevel, double floorLevel); +const void* APS5_VABI WKPageConfigurationCreate(); +const void* APS5_VABI WKPageConfigurationGetContext(const void* configuration); +const void* APS5_VABI WKPageConfigurationGetPageGroup(const void* configuration); +const void* APS5_VABI WKPageConfigurationGetPreferences(const void* configuration); +const void* APS5_VABI WKPageConfigurationGetRelatedPage(const void* configuration); +const void* APS5_VABI WKPageConfigurationGetUserContentController(const void* configuration); +const void* APS5_VABI WKPageConfigurationGetWebsiteDataStore(const void* configuration); +void APS5_VABI WKPageConfigurationSetBackgroundCPULimit(const void* configuration, double cpuLimit); +void APS5_VABI WKPageConfigurationSetContext(const void* configuration, const void* context); +void APS5_VABI WKPageConfigurationSetInitialCapitalizationEnabled(const void* configuration, bool enabled); +void APS5_VABI WKPageConfigurationSetPageGroup(const void* configuration, const void* pageGroup); +void APS5_VABI WKPageConfigurationSetPreferences(const void* configuration, const void* preferences); +void APS5_VABI WKPageConfigurationSetRelatedPage(const void* configuration, const void* relatedPage); +void APS5_VABI WKPageConfigurationSetUserContentController(const void* configuration, const void* userContentController); +void APS5_VABI WKPageConfigurationSetWebsiteDataStore(const void* configuration, const void* websiteDataStore); +void APS5_VABI WKPageGroupAddUserScript( const void* pageGroup, const void* source, const void* baseURL, const void* allowedURLPatterns, const void* blockedURLPatterns, std::uint32_t injectedFrames, std::uint32_t injectionTime); +void APS5_VABI WKPageGroupAddUserStyleSheet( const void* pageGroup, const void* source, const void* baseURL, const void* allowedURLPatterns, const void* blockedURLPatterns, std::uint32_t injectedFrames); +const void* APS5_VABI WKPageGroupCreateWithIdentifier(const void* identifier); +const void* APS5_VABI WKPageGroupGetPreferences(const void* pageGroup); +const void* APS5_VABI WKPageGroupGetUserContentController(const void* pageGroup); +void APS5_VABI WKPageGroupRemoveAllUserScripts(const void* pageGroup); +void APS5_VABI WKPageGroupRemoveAllUserStyleSheets(const void* pageGroup); +void APS5_VABI WKPageGroupSetPreferences(const void* pageGroup, const void* preferences); +void APS5_VABI WKUserContentControllerAddUserContentFilter(const void* userContentController, const void* userContentFilter); +void APS5_VABI WKUserContentControllerAddUserScript(const void* userContentController, const void* userScript); +const void* APS5_VABI WKUserContentControllerCopyUserScripts(const void* userContentController); +const void* APS5_VABI WKUserContentControllerCreate(); +void APS5_VABI WKUserContentControllerRemoveAllUserContentFilters(const void* userContentController); +void APS5_VABI WKUserContentControllerRemoveAllUserScripts(const void* userContentController); +const void* APS5_VABI WKUserScriptCopySource(const void* userScript); +const void* APS5_VABI WKUserScriptCreateWithSource(const void* source, std::uint32_t injectionTime, bool forMainFrameOnly); +std::uint32_t APS5_VABI WKUserScriptGetInjectionTime(const void* userScript); +bool APS5_VABI WKUserScriptGetMainFrameOnly(const void* userScript); +const void* APS5_VABI WKWebsiteDataStoreConfigurationCopyApplicationCacheDirectory(const void* configuration); +const void* APS5_VABI WKWebsiteDataStoreConfigurationCopyCacheStorageDirectory(const void* configuration); +const void* APS5_VABI WKWebsiteDataStoreConfigurationCopyCookieStorageFile(const void* configuration); +const void* APS5_VABI WKWebsiteDataStoreConfigurationCopyIndexedDBDatabaseDirectory(const void* configuration); +const void* APS5_VABI WKWebsiteDataStoreConfigurationCopyLocalStorageDirectory(const void* configuration); +const void* APS5_VABI WKWebsiteDataStoreConfigurationCopyMediaKeysStorageDirectory(const void* configuration); +const void* APS5_VABI WKWebsiteDataStoreConfigurationCopyNetworkCacheDirectory(const void* configuration); +const void* APS5_VABI WKWebsiteDataStoreConfigurationCopyResourceLoadStatisticsDirectory(const void* configuration); +const void* APS5_VABI WKWebsiteDataStoreConfigurationCopyServiceWorkerRegistrationDirectory(const void* configuration); +const void* APS5_VABI WKWebsiteDataStoreConfigurationCopyWebSQLDatabaseDirectory(const void* configuration); +const void* APS5_VABI WKWebsiteDataStoreConfigurationCreate(); +bool APS5_VABI WKWebsiteDataStoreConfigurationGetNetworkCacheSpeculativeValidationEnabled(const void* configuration); +std::uint64_t APS5_VABI WKWebsiteDataStoreConfigurationGetPerOriginStorageQuota(const void* configuration); +bool APS5_VABI WKWebsiteDataStoreConfigurationGetStaleWhileRevalidateEnabled(const void* configuration); +bool APS5_VABI WKWebsiteDataStoreConfigurationGetTestingSessionEnabled(const void* configuration); +void APS5_VABI WKWebsiteDataStoreConfigurationSetApplicationCacheDirectory(const void* configuration, const void* directory); +void APS5_VABI WKWebsiteDataStoreConfigurationSetCacheStorageDirectory(const void* configuration, const void* directory); +void APS5_VABI WKWebsiteDataStoreConfigurationSetCookieStorageFile(const void* configuration, const void* cookieStorageFile); +void APS5_VABI WKWebsiteDataStoreConfigurationSetIndexedDBDatabaseDirectory(const void* configuration, const void* directory); +void APS5_VABI WKWebsiteDataStoreConfigurationSetLocalStorageDirectory(const void* configuration, const void* directory); +void APS5_VABI WKWebsiteDataStoreConfigurationSetMediaKeysStorageDirectory(const void* configuration, const void* directory); +void APS5_VABI WKWebsiteDataStoreConfigurationSetNetworkCacheDirectory(const void* configuration, const void* directory); +void APS5_VABI WKWebsiteDataStoreConfigurationSetNetworkCacheSpeculativeValidationEnabled(const void* configuration, bool enabled); +void APS5_VABI WKWebsiteDataStoreConfigurationSetPerOriginStorageQuota(const void* configuration, std::uint64_t quota); +void APS5_VABI WKWebsiteDataStoreConfigurationSetResourceLoadStatisticsDirectory(const void* configuration, const void* directory); +void APS5_VABI WKWebsiteDataStoreConfigurationSetServiceWorkerRegistrationDirectory(const void* configuration, const void* directory); +void APS5_VABI WKWebsiteDataStoreConfigurationSetStaleWhileRevalidateEnabled(const void* configuration, bool enabled); +void APS5_VABI WKWebsiteDataStoreConfigurationSetTestingSessionEnabled(const void* configuration, bool enabled); +void APS5_VABI WKWebsiteDataStoreConfigurationSetWebSQLDatabaseDirectory(const void* configuration, const void* directory); +const void* APS5_VABI WKWebsitePoliciesCopyCustomHeaderFields(const void* websitePolicies); +const void* APS5_VABI WKWebsitePoliciesCreate(); +std::uint32_t APS5_VABI WKWebsitePoliciesGetAllowedAutoplayQuirks(const void* websitePolicies); +std::uint32_t APS5_VABI WKWebsitePoliciesGetAutoplayPolicy(const void* websitePolicies); +bool APS5_VABI WKWebsitePoliciesGetContentBlockersEnabled(const void* websitePolicies); +const void* APS5_VABI WKWebsitePoliciesGetDataStore(const void* websitePolicies); +std::uint32_t APS5_VABI WKWebsitePoliciesGetPopUpPolicy(const void* websitePolicies); +void APS5_VABI WKWebsitePoliciesSetAllowedAutoplayQuirks(const void* websitePolicies, std::uint32_t allowedQuirks); +void APS5_VABI WKWebsitePoliciesSetAutoplayPolicy(const void* websitePolicies, std::uint32_t policy); +void APS5_VABI WKWebsitePoliciesSetContentBlockersEnabled(const void* websitePolicies, bool enabled); +void APS5_VABI WKWebsitePoliciesSetCustomHeaderFields(const void* websitePolicies, const void* customHeaderFields); +void APS5_VABI WKWebsitePoliciesSetDataStore(const void* websitePolicies, const void* websiteDataStore); +void APS5_VABI WKWebsitePoliciesSetPopUpPolicy(const void* websitePolicies, std::uint32_t policy); + +} diff --git a/core/libs/prx/libSceNKWebKit/include/WebKitValueExports.hpp b/core/libs/prx/libSceNKWebKit/include/WebKitValueExports.hpp new file mode 100644 index 0000000000..9721d392e9 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/include/WebKitValueExports.hpp @@ -0,0 +1,164 @@ +#pragma once + +#include "SceTypes.hpp" +#include "prx/libSceJsc/include/Api.hpp" +#include +#include + +namespace NKWebKit { +struct PointValue; +struct SizeValue; +struct RectValue; +} + +extern "C" { + +std::uint32_t APS5_VABI WKAXObjectGetTypeID(); +std::uint32_t APS5_VABI WKApplicationCacheManagerGetTypeID(); +void APS5_VABI WKArrayAppendItem(void* arrayRef, const void* itemRef); +const void* APS5_VABI WKArrayCreate(const void** values, std::size_t numberOfValues); +const void* APS5_VABI WKArrayCreateAdoptingValues(const void** values, std::size_t numberOfValues); +const void* APS5_VABI WKArrayGetItemAtIndex(const void* arrayRef, std::size_t index); +std::size_t APS5_VABI WKArrayGetSize(const void* arrayRef); +std::uint32_t APS5_VABI WKArrayGetTypeID(); +void APS5_VABI WKArrayRemoveItemAtIndex(void* arrayRef, std::size_t index); +std::uint32_t APS5_VABI WKAuthenticationChallengeGetTypeID(); +std::uint32_t APS5_VABI WKAuthenticationDecisionListenerGetTypeID(); +std::uint32_t APS5_VABI WKBackForwardListGetTypeID(); +std::uint32_t APS5_VABI WKBackForwardListItemGetTypeID(); +const void* APS5_VABI WKBooleanCreate(bool value); +std::uint32_t APS5_VABI WKBooleanGetTypeID(); +bool APS5_VABI WKBooleanGetValue(const void* booleanRef); +std::uint32_t APS5_VABI WKBundleBackForwardListGetTypeID(); +std::uint32_t APS5_VABI WKBundleBackForwardListItemGetTypeID(); +std::uint32_t APS5_VABI WKBundleDOMWindowExtensionGetTypeID(); +std::uint32_t APS5_VABI WKBundleFrameGetTypeID(); +std::uint32_t APS5_VABI WKBundleGetTypeID(); +std::uint32_t APS5_VABI WKBundleHitTestResultGetTypeID(); +std::uint32_t APS5_VABI WKBundleInspectorGetTypeID(); +std::uint32_t APS5_VABI WKBundleNavigationActionGetTypeID(); +std::uint32_t APS5_VABI WKBundleNodeHandleGetTypeID(); +std::uint32_t APS5_VABI WKBundlePageGetTypeID(); +std::uint32_t APS5_VABI WKBundlePageOverlayGetTypeID(); +std::uint32_t APS5_VABI WKBundleRangeHandleGetTypeID(); +std::uint32_t APS5_VABI WKBundleScriptWorldGetTypeID(); +const void* APS5_VABI WKCertificateInfoCopyCertificateAtIndex(const void* certificateInfoRef, std::size_t index); +const void* APS5_VABI WKCertificateInfoCopyVerificationErrorDescription(const void* certificateInfoRef); +const void* APS5_VABI WKCertificateInfoCreateWithCertficateChain(const void* certificateChainRef); +std::size_t APS5_VABI WKCertificateInfoGetCertificateChainSize(const void* certificateInfoRef); +std::uint32_t APS5_VABI WKCertificateInfoGetTypeID(); +int APS5_VABI WKCertificateInfoGetVerificationError(const void* certificateInfoRef); +std::uint32_t APS5_VABI WKConnectionGetTypeID(); +std::uint32_t APS5_VABI WKContextGetTypeID(); +std::uint32_t APS5_VABI WKContextMenuItemGetTypeID(); +std::uint32_t APS5_VABI WKCookieManagerGetTypeID(); +std::uint32_t APS5_VABI WKCredentialGetTypeID(); +const void* APS5_VABI WKDataCreate(const unsigned char* bytes, std::size_t size); +const unsigned char* APS5_VABI WKDataGetBytes(const void* dataRef); +std::size_t APS5_VABI WKDataGetSize(const void* dataRef); +std::uint32_t APS5_VABI WKDataGetTypeID(); +const void* APS5_VABI WKDictionaryCopyKeys(const void* dictionaryRef); +const void* APS5_VABI WKDictionaryCreate(const void** keys, const void** values, std::size_t numberOfValues); +const void* APS5_VABI WKDictionaryGetItemForKey(const void* dictionaryRef, const void* keyRef); +std::size_t APS5_VABI WKDictionaryGetSize(const void* dictionaryRef); +std::uint32_t APS5_VABI WKDictionaryGetTypeID(); +bool APS5_VABI WKDictionarySetItem(void* dictionaryRef, const void* keyRef, const void* itemRef); +const void* APS5_VABI WKDoubleCreate(double value); +std::uint32_t APS5_VABI WKDoubleGetTypeID(); +double APS5_VABI WKDoubleGetValue(const void* doubleRef); +std::uint32_t APS5_VABI WKDownloadGetTypeID(); +const void* APS5_VABI WKErrorCopyWKErrorDomain(); +std::uint32_t APS5_VABI WKErrorGetTypeID(); +std::uint32_t APS5_VABI WKFormSubmissionListenerGetTypeID(); +std::uint32_t APS5_VABI WKFrameGetTypeID(); +std::uint32_t APS5_VABI WKFrameHandleGetTypeID(); +std::uint32_t APS5_VABI WKFrameInfoGetTypeID(); +std::uint32_t APS5_VABI WKFramePolicyListenerGetTypeID(); +std::uint32_t APS5_VABI WKGeolocationManagerGetTypeID(); +std::uint32_t APS5_VABI WKGeolocationPermissionRequestGetTypeID(); +std::uint32_t APS5_VABI WKGeolocationPositionGetTypeID(); +std::uint32_t APS5_VABI WKGetTypeID(const void* object); +std::uint32_t APS5_VABI WKHTTPCookieStoreGetTypeID(); +std::uint32_t APS5_VABI WKHitTestResultGetTypeID(); +std::uint32_t APS5_VABI WKIconDatabaseGetTypeID(); +std::uint32_t APS5_VABI WKImageGetTypeID(); +std::uint32_t APS5_VABI WKInspectorGetTypeID(); +std::uint32_t APS5_VABI WKKeyValueStorageManagerGetTypeID(); +std::uint32_t APS5_VABI WKMessageListenerGetTypeID(); +void* APS5_VABI WKMutableArrayCreate(); +void* APS5_VABI WKMutableDictionaryCreate(); +std::uint32_t APS5_VABI WKNavigationActionGetTypeID(); +std::uint32_t APS5_VABI WKNavigationDataGetTypeID(); +std::uint32_t APS5_VABI WKNavigationGetTypeID(); +std::uint32_t APS5_VABI WKNavigationResponseGetTypeID(); +std::uint32_t APS5_VABI WKNotificationGetTypeID(); +std::uint32_t APS5_VABI WKNotificationManagerGetTypeID(); +std::uint32_t APS5_VABI WKNotificationPermissionRequestGetTypeID(); +std::uint32_t APS5_VABI WKOpenPanelParametersGetTypeID(); +std::uint32_t APS5_VABI WKOpenPanelResultListenerGetTypeID(); +std::uint32_t APS5_VABI WKPageConfigurationGetTypeID(); +std::uint32_t APS5_VABI WKPageGetTypeID(); +std::uint32_t APS5_VABI WKPageGroupGetTypeID(); +std::uint32_t APS5_VABI WKPageRequestStorageAccessConfirmResultListenerGetTypeID(); +std::uint32_t APS5_VABI WKPageRunBeforeUnloadConfirmPanelResultListenerGetTypeID(); +std::uint32_t APS5_VABI WKPageRunJavaScriptAlertResultListenerGetTypeID(); +std::uint32_t APS5_VABI WKPageRunJavaScriptConfirmResultListenerGetTypeID(); +std::uint32_t APS5_VABI WKPageRunJavaScriptPromptResultListenerGetTypeID(); +const void* APS5_VABI WKPointCreate(NKWebKit::PointValue point); +std::uint32_t APS5_VABI WKPointGetTypeID(); +NKWebKit::PointValue APS5_VABI WKPointGetValue(const void* pointRef); +std::uint32_t APS5_VABI WKPopupMenuItemGetTypeID(); +std::uint32_t APS5_VABI WKProtectionSpaceGetTypeID(); +const void* APS5_VABI WKRectCreate(NKWebKit::RectValue rect); +std::uint32_t APS5_VABI WKRectGetTypeID(); +NKWebKit::RectValue APS5_VABI WKRectGetValue(const void* rectRef); +void APS5_VABI WKRelease(const void* object); +void APS5_VABI WKRenderLayerGetTypeID(); +void APS5_VABI WKRenderObjectGetTypeID(); +std::uint32_t APS5_VABI WKResourceCacheManagerGetTypeID(); +const void* APS5_VABI WKRetain(const void* object); +std::uint32_t APS5_VABI WKSecurityOriginGetTypeID(); +std::uint32_t APS5_VABI WKSerializedScriptValueGetTypeID(); +std::uint32_t APS5_VABI WKSessionStateGetTypeID(); +const void* APS5_VABI WKSizeCreate(NKWebKit::SizeValue size); +std::uint32_t APS5_VABI WKSizeGetTypeID(); +NKWebKit::SizeValue APS5_VABI WKSizeGetValue(const void* sizeRef); +GuestJSString* APS5_VABI WKStringCopyJSString(const void* stringRef); +const void* APS5_VABI WKStringCreateWithJSString(GuestJSString* jsStringRef); +const void* APS5_VABI WKStringCreateWithUTF8CString(const char* string); +std::size_t APS5_VABI WKStringGetCharacters(const void* stringRef, unsigned short* buffer, std::size_t bufferLength); +std::size_t APS5_VABI WKStringGetLength(const void* stringRef); +std::size_t APS5_VABI WKStringGetMaximumUTF8CStringSize(const void* stringRef); +std::uint32_t APS5_VABI WKStringGetTypeID(); +std::size_t APS5_VABI WKStringGetUTF8CString(const void* stringRef, char* buffer, std::size_t bufferSize); +std::size_t APS5_VABI WKStringGetUTF8CStringNonStrict(const void* stringRef, char* buffer, std::size_t bufferSize); +bool APS5_VABI WKStringIsEmpty(const void* stringRef); +bool APS5_VABI WKStringIsEqual(const void* aRef, const void* bRef); +bool APS5_VABI WKStringIsEqualToUTF8CString(const void* aRef, const char* b); +bool APS5_VABI WKStringIsEqualToUTF8CStringIgnoringCase(const void* aRef, const char* b); +const void* APS5_VABI WKUInt64Create(std::uint64_t value); +std::uint32_t APS5_VABI WKUInt64GetTypeID(); +std::uint64_t APS5_VABI WKUInt64GetValue(const void* uint64Ref); +const void* APS5_VABI WKURLCopyString(const void* urlRef); +const void* APS5_VABI WKURLCreateWithUTF8CString(const char* string); +std::uint32_t APS5_VABI WKURLGetTypeID(); +std::uint32_t APS5_VABI WKURLRequestGetTypeID(); +std::uint32_t APS5_VABI WKURLResponseGetTypeID(); +std::uint32_t APS5_VABI WKUserContentControllerGetTypeID(); +std::uint32_t APS5_VABI WKUserContentExtensionStoreGetTypeID(); +const void* APS5_VABI WKUserContentURLPatternCopyHost(const void* urlPatternRef); +const void* APS5_VABI WKUserContentURLPatternCopyScheme(const void* urlPatternRef); +const void* APS5_VABI WKUserContentURLPatternCreate(const void* patternRef); +std::uint32_t APS5_VABI WKUserContentURLPatternGetTypeID(); +bool APS5_VABI WKUserContentURLPatternIsValid(const void* urlPatternRef); +bool APS5_VABI WKUserContentURLPatternMatchesSubdomains(const void* urlPatternRef); +std::uint32_t APS5_VABI WKUserMediaPermissionCheckGetTypeID(); +std::uint32_t APS5_VABI WKUserMediaPermissionRequestGetTypeID(); +std::uint32_t APS5_VABI WKUserScriptGetTypeID(); +std::uint32_t APS5_VABI WKViewportAttributesGetTypeID(); +std::uint32_t APS5_VABI WKWebsiteDataStoreConfigurationGetTypeID(); +std::uint32_t APS5_VABI WKWebsiteDataStoreGetTypeID(); +std::uint32_t APS5_VABI WKWebsitePoliciesGetTypeID(); +std::uint32_t APS5_VABI WKWindowFeaturesGetTypeID(); + +} diff --git a/core/libs/prx/libSceNKWebKit/include/WtfExports.hpp b/core/libs/prx/libSceNKWebKit/include/WtfExports.hpp new file mode 100644 index 0000000000..000dd5a287 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/include/WtfExports.hpp @@ -0,0 +1,240 @@ +#pragma once + +#include "SceTypes.hpp" +#include "prx/libSceNKWebKit/src/WtfStringAbi.hpp" +#include "prx/libSceNKWebKit/src/WtfTimeTypes.hpp" +#include "prx/libSceNKWebKit/src/WtfMemoryTypes.hpp" +#include +#include + +extern "C" { + +[[noreturn]] void APS5_VABI WTFCrash(); +[[noreturn]] void APS5_VABI WTFCrashWithSecurityImplication(); +void APS5_VABI WTFGetBacktrace(void** stack, int* size); +void APS5_VABI WTFInitializeLogChannelStatesFromString(void** channels, std::size_t count, const char* logLevel); +bool APS5_VABI WTFIsDebuggerAttached(); +void APS5_VABI WTFLog(void* channel, const char* format, ...); +void APS5_VABI WTFLogAlways(const char* format, ...); +[[noreturn]] void APS5_VABI WTFLogAlwaysAndCrash(const char* format, ...); +void* APS5_VABI WTFLogChannelByName(void** channels, std::size_t count, const char* name); +void APS5_VABI WTFLogVerbose(const char* file, int line, const char* function, void* channel, const char* format, ...); +void APS5_VABI WTFLogWithLevel(void* channel, std::uint32_t level, const char* format, ...); +void APS5_VABI WTFPrintBacktrace(void** stack, int size); +void APS5_VABI WTFReportArgumentAssertionFailure(const char* file, int line, const char* function, const char* argName, const char* assertion); +void APS5_VABI WTFReportAssertionFailure(const char* file, int line, const char* function, const char* assertion); +void APS5_VABI WTFReportAssertionFailureWithMessage(const char* file, int line, const char* function, const char* assertion, const char* format, ...); +void APS5_VABI WTFReportBacktrace(); +void APS5_VABI WTFReportError(const char* file, int line, const char* function, const char* format, ...); +void APS5_VABI WTFReportFatalError(const char* file, int line, const char* function, const char* format, ...); +void APS5_VABI WTFReportNotImplementedYet(const char* file, int line, const char* function); +void APS5_VABI WTFSetLogChannelLevel(void* channel, std::uint32_t level); +bool APS5_VABI WTFWillLogWithLevel(void* channel, std::uint32_t level); +[[noreturn]] void APS5_VABI _Z20WTFCrashWithInfoImpliPKcS0_im(int line, const char* file, const char* function, int counter, std::uint64_t reason); +[[noreturn]] void APS5_VABI _Z20WTFCrashWithInfoImpliPKcS0_imm(int line, const char* file, const char* function, int counter, std::uint64_t reason, std::uint64_t misc1); +[[noreturn]] void APS5_VABI _Z20WTFCrashWithInfoImpliPKcS0_immm(int line, const char* file, const char* function, int counter, std::uint64_t reason, std::uint64_t misc1, std::uint64_t misc2); +[[noreturn]] void APS5_VABI _Z20WTFCrashWithInfoImpliPKcS0_immmm(int line, const char* file, const char* function, int counter, std::uint64_t reason, std::uint64_t misc1, std::uint64_t misc2, std::uint64_t misc3); +[[noreturn]] void APS5_VABI _Z20WTFCrashWithInfoImpliPKcS0_immmmm(int line, const char* file, const char* function, int counter, std::uint64_t reason, std::uint64_t misc1, std::uint64_t misc2, std::uint64_t misc3, std::uint64_t misc4); +[[noreturn]] void APS5_VABI _Z20WTFCrashWithInfoImpliPKcS0_immmmmm(int line, const char* file, const char* function, int counter, std::uint64_t reason, std::uint64_t misc1, std::uint64_t misc2, std::uint64_t misc3, std::uint64_t misc4, std::uint64_t misc5); +[[noreturn]] void APS5_VABI _Z20WTFCrashWithInfoImpliPKcS0_immmmmmm(int line, const char* file, const char* function, int counter, std::uint64_t reason, std::uint64_t misc1, std::uint64_t misc2, std::uint64_t misc3, std::uint64_t misc4, std::uint64_t misc5, std::uint64_t misc6); +void APS5_VABI _ZN3JSC16clearArrayMemsetEPdj(double* base, unsigned int count); +void APS5_VABI _ZN3JSC18enableSuperSamplerEv(); +void APS5_VABI _ZN3JSC18logTotalPhaseTimesEv(); +void APS5_VABI _ZN3JSC19disableSuperSamplerEv(); +void APS5_VABI _ZN3JSC20waitForVMDestructionEv(); +void APS5_VABI _ZN3JSC22printSuperSamplerStateEv(); +unsigned int APS5_VABI _ZN3JSC25numberOfOSRExitFuzzChecksEv(); +void APS5_VABI _ZN3JSC27finalizeStatsAtEndOfTestingEv(); +unsigned int APS5_VABI _ZN3JSC27numberOfExceptionFuzzChecksEv(); +void APS5_VABI _ZN3JSC30waitForAsynchronousDisassemblyEv(); +unsigned int APS5_VABI _ZN3JSC31numberOfStaticOSRExitFuzzChecksEv(); +unsigned int APS5_VABI _ZN3JSC38numberOfExecutableAllocationFuzzChecksEv(); +void APS5_VABI _ZN3PAL10systemBeepEv(); +std::size_t APS5_VABI _ZN3WTF10StringImpl11reverseFindEDsj(const NKWebKit::WtfAbi::StringImpl* self, char16_t value, unsigned start); +std::int32_t APS5_VABI _ZN3WTF10StringImpl19characterStartingAtEj(const NKWebKit::WtfAbi::StringImpl* self, unsigned index); +NKWebKit::WtfAbi::String APS5_VABI _ZN3WTF10StringImpl19createUninitializedEjRPDs(unsigned length, char16_t*& data); +NKWebKit::WtfAbi::String APS5_VABI _ZN3WTF10StringImpl19createUninitializedEjRPh(unsigned length, unsigned char*& data); +NKWebKit::WtfAbi::String APS5_VABI _ZN3WTF10StringImpl20create8BitIfPossibleEPKDsj(const char16_t* data, unsigned length); +NKWebKit::WtfAbi::String APS5_VABI _ZN3WTF10StringImpl23convertToASCIILowercaseEv(const NKWebKit::WtfAbi::StringImpl* self); +NKWebKit::WtfAbi::String APS5_VABI _ZN3WTF10StringImpl23convertToASCIIUppercaseEv(const NKWebKit::WtfAbi::StringImpl* self); +NKWebKit::WtfAbi::String APS5_VABI _ZN3WTF10StringImpl6createEPKDsj(const char16_t* data, unsigned length); +NKWebKit::WtfAbi::String APS5_VABI _ZN3WTF10StringImpl6createEPKhj(const unsigned char* data, unsigned length); +NKWebKit::WtfAbi::String APS5_VABI _ZN3WTF10StringImpl9substringEjj(const NKWebKit::WtfAbi::StringImpl* self, unsigned start, unsigned length); +void* APS5_VABI _ZN3WTF10fastCallocEmm(std::size_t count, std::size_t size); +void* APS5_VABI _ZN3WTF10fastMallocEm(std::size_t size); +char* APS5_VABI _ZN3WTF10fastStrDupEPKc(const char* str); +bool APS5_VABI _ZN3WTF10hasElapsedERKNS_24TimeWithDynamicClockTypeE(const WTF::TimeWithDynamicClockType& time); +bool APS5_VABI _ZN3WTF11CStringHash5equalERKNS_7CStringES3_(const NKWebKit::WtfAbi::CString& a, const NKWebKit::WtfAbi::CString& b); +void* APS5_VABI _ZN3WTF11fastReallocEPvm(void* ptr, std::size_t size); +void APS5_VABI _ZN3WTF11jsValueFreeEPv(void* ptr); +WTF::MonotonicTime APS5_VABI _ZN3WTF13MonotonicTime3nowEv(); +NKWebKit::WtfAbi::ProcessPrivileges APS5_VABI _ZN3WTF13allPrivilegesEv(); +void* APS5_VABI _ZN3WTF13jsValueMallocEm(std::size_t size); +WTF::TryMallocReturnValue* APS5_VABI _ZN3WTF13tryFastCallocEmm(WTF::TryMallocReturnValue* result, std::size_t count, std::size_t size); +WTF::TryMallocReturnValue* APS5_VABI _ZN3WTF13tryFastMallocEm(WTF::TryMallocReturnValue* result, std::size_t size); +std::size_t APS5_VABI _ZN3WTF14fastMallocSizeEPKv(const void* ptr); +void* APS5_VABI _ZN3WTF14jsValueReallocEPvm(void* ptr, std::size_t size); +WTF::TryMallocReturnValue* APS5_VABI _ZN3WTF14tryFastReallocEPvm(WTF::TryMallocReturnValue* result, void* ptr, std::size_t size); +void APS5_VABI _ZN3WTF15fastAlignedFreeEPv(void* ptr); +void* APS5_VABI _ZN3WTF16fastZeroedMallocEm(std::size_t size); +void* APS5_VABI _ZN3WTF16tryJSValueMallocEm(std::size_t size); +void APS5_VABI _ZN3WTF17GregorianDateTime21setToCurrentLocalTimeEv(WTF::GregorianDateTime* self); +void* APS5_VABI _ZN3WTF17fastAlignedMallocEmm(std::size_t alignment, std::size_t size); +int APS5_VABI _ZN3WTF18constantTimeMemcmpEPKvS1_m(const void* voidA, const void* voidB, std::size_t length); +void APS5_VABI _ZN3WTF18fastEnableMiniModeEv(); +std::size_t APS5_VABI _ZN3WTF18fastMallocGoodSizeEm(std::size_t size); +void APS5_VABI _ZN3WTF19addProcessPrivilegeENS_16ProcessPrivilegeE(unsigned privilege); +bool APS5_VABI _ZN3WTF19hasProcessPrivilegeENS_16ProcessPrivilegeE(unsigned privilege); +bool APS5_VABI _ZN3WTF19isFastMallocEnabledEv(); +WTF::TryMallocReturnValue* APS5_VABI _ZN3WTF19tryFastZeroedMallocEm(WTF::TryMallocReturnValue* result, std::size_t size); +bool APS5_VABI _ZN3WTF20equalIgnoringNullityEPKDsmPNS_10StringImplE(const char16_t* data, std::size_t length, NKWebKit::WtfAbi::StringImpl* impl); +bool APS5_VABI _ZN3WTF20equalIgnoringNullityEPNS_10StringImplES1_(NKWebKit::WtfAbi::StringImpl* a, NKWebKit::WtfAbi::StringImpl* b); +void APS5_VABI _ZN3WTF20fastDisableScavengerEv(); +FastMallocStatistics APS5_VABI _ZN3WTF20fastMallocStatisticsEv(); +bool APS5_VABI _ZN3WTF20protocolIsJavaScriptENS_10StringViewE(NKWebKit::WtfAbi::StringView view); +void APS5_VABI _ZN3WTF20setProcessPrivilegesENS_9OptionSetINS_16ProcessPrivilegeEEE(NKWebKit::WtfAbi::ProcessPrivileges privileges); +void* APS5_VABI _ZN3WTF20tryFastAlignedMallocEmm(std::size_t alignment, std::size_t size); +bool APS5_VABI _ZN3WTF22equalIgnoringASCIICaseEPKNS_10StringImplES2_(const NKWebKit::WtfAbi::StringImpl* a, const NKWebKit::WtfAbi::StringImpl* b); +bool APS5_VABI _ZN3WTF22equalRespectingNullityENS_10StringViewES0_(NKWebKit::WtfAbi::StringView a, NKWebKit::WtfAbi::StringView b); +int APS5_VABI _ZN3WTF22numberOfProcessorCoresEv(); +bool APS5_VABI _ZN3WTF22protocolIsInHTTPFamilyENS_10StringViewE(NKWebKit::WtfAbi::StringView view); +void APS5_VABI _ZN3WTF22removeProcessPrivilegeENS_16ProcessPrivilegeE(unsigned privilege); +void APS5_VABI _ZN3WTF23fastCommitAlignedMemoryEPvm(void*, std::size_t); +WTF::TimeWithDynamicClockType APS5_VABI _ZN3WTF24TimeWithDynamicClockType3nowENS_9ClockTypeE(WTF::ClockType type); +WTF::LocalTimeOffset APS5_VABI _ZN3WTF24calculateLocalTimeOffsetEdNS_8TimeTypeE(double, WTF::TimeType); +void APS5_VABI _ZN3WTF25fastDecommitAlignedMemoryEPvm(void*, std::size_t); +void APS5_VABI _ZN3WTF25fastMallocDumpMallocStatsEv(); +void APS5_VABI _ZN3WTF27releaseFastMallocFreeMemoryEv(); +void APS5_VABI _ZN3WTF29cryptographicallyRandomValuesEPvm(void* buffer, std::size_t length); +bool APS5_VABI _ZN3WTF29equalIgnoringASCIICaseNonNullEPKNS_10StringImplES2_(const NKWebKit::WtfAbi::StringImpl* a, const NKWebKit::WtfAbi::StringImpl* b); +unsigned APS5_VABI _ZN3WTF31sixCharacterHashStringToIntegerEPKc(const char* data); +void APS5_VABI _ZN3WTF3URL10invalidateEv(NKWebKit::WtfAbi::URL* self); +double APS5_VABI _ZN3WTF40parseES5DateFromNullTerminatedCharactersEPKcRb(const char* dateString, bool& isLocalTime); +void APS5_VABI _ZN3WTF40releaseFastMallocFreeMemoryForThisThreadEv(); +bool APS5_VABI _ZN3WTF5equalEPKNS_10StringImplEPKDsj(const NKWebKit::WtfAbi::StringImpl* impl, const char16_t* data, unsigned length); +bool APS5_VABI _ZN3WTF5equalEPKNS_10StringImplEPKh(const NKWebKit::WtfAbi::StringImpl* impl, const unsigned char* data); +bool APS5_VABI _ZN3WTF5equalEPKNS_10StringImplEPKhj(const NKWebKit::WtfAbi::StringImpl* impl, const unsigned char* data, unsigned length); +bool APS5_VABI _ZN3WTF5equalEPKNS_10StringImplES2_(const NKWebKit::WtfAbi::StringImpl* a, const NKWebKit::WtfAbi::StringImpl* b); +bool APS5_VABI _ZN3WTF5equalERKNS_10StringImplES2_(const NKWebKit::WtfAbi::StringImpl& a, const NKWebKit::WtfAbi::StringImpl& b); +void APS5_VABI _ZN3WTF5sleepERKNS_24TimeWithDynamicClockTypeE(const WTF::TimeWithDynamicClockType& time); +void APS5_VABI _ZN3WTF6Config17permanentlyFreezeEv(); +NKWebKit::WtfAbi::String APS5_VABI _ZN3WTF6String13fromCodePointEi(std::int32_t cp); +NKWebKit::WtfAbi::String APS5_VABI _ZN3WTF6String26fromUTF8WithLatin1FallbackEPKhm(const unsigned char* data, std::size_t length); +NKWebKit::WtfAbi::String APS5_VABI _ZN3WTF6String6numberEi(int value); +NKWebKit::WtfAbi::String APS5_VABI _ZN3WTF6String6numberEj(unsigned value); +NKWebKit::WtfAbi::String APS5_VABI _ZN3WTF6String6numberEl(std::int64_t value); +NKWebKit::WtfAbi::String APS5_VABI _ZN3WTF6String6numberEm(std::uint64_t value); +NKWebKit::WtfAbi::String APS5_VABI _ZN3WTF6String6numberEx(long long value); +NKWebKit::WtfAbi::String APS5_VABI _ZN3WTF6String6numberEy(unsigned long long value); +NKWebKit::WtfAbi::String APS5_VABI _ZN3WTF6String8fromUTF8EPKh(const unsigned char* data); +NKWebKit::WtfAbi::String APS5_VABI _ZN3WTF6String8fromUTF8EPKhm(const unsigned char* data, std::size_t length); +NKWebKit::WtfAbi::String APS5_VABI _ZN3WTF6String8fromUTF8ERKNS_7CStringE(const NKWebKit::WtfAbi::CString& value); +void APS5_VABI _ZN3WTF6StringC1EPKDsj(NKWebKit::WtfAbi::String* self, const char16_t* data, unsigned length); +void APS5_VABI _ZN3WTF6StringC1EPKc(NKWebKit::WtfAbi::String* self, const char* data); +void APS5_VABI _ZN3WTF6StringC1EPKcj(NKWebKit::WtfAbi::String* self, const char* data, unsigned length); +void APS5_VABI _ZN3WTF6StringC1EPKhj(NKWebKit::WtfAbi::String* self, const unsigned char* data, unsigned length); +void APS5_VABI _ZN3WTF6StringC2EPKDsj(NKWebKit::WtfAbi::String* self, const char16_t* data, unsigned length); +void APS5_VABI _ZN3WTF6StringC2EPKc(NKWebKit::WtfAbi::String* self, const char* data); +void APS5_VABI _ZN3WTF6StringC2EPKcj(NKWebKit::WtfAbi::String* self, const char* data, unsigned length); +void APS5_VABI _ZN3WTF6StringC2EPKhj(NKWebKit::WtfAbi::String* self, const unsigned char* data, unsigned length); +WTF::Seconds APS5_VABI _ZN3WTF7CPUTime16forCurrentThreadEv(); +char* APS5_VABI _ZN3WTF7CString11mutableDataEv(NKWebKit::WtfAbi::CString* self); +NKWebKit::WtfAbi::CString APS5_VABI _ZN3WTF7CString16newUninitializedEmRPc(std::size_t length, char*& output); +void APS5_VABI _ZN3WTF7CString4growEm(NKWebKit::WtfAbi::CString* self, std::size_t length); +void APS5_VABI _ZN3WTF7CStringC1EPKc(NKWebKit::WtfAbi::CString* self, const char* data); +void APS5_VABI _ZN3WTF7CStringC1EPKcm(NKWebKit::WtfAbi::CString* self, const char* data, std::size_t length); +void APS5_VABI _ZN3WTF7CStringC2EPKc(NKWebKit::WtfAbi::CString* self, const char* data); +void APS5_VABI _ZN3WTF7CStringC2EPKcm(NKWebKit::WtfAbi::CString* self, const char* data, std::size_t length); +unsigned int APS5_VABI _ZN3WTF7Unicode51calculateStringHashAndLengthFromUTF8MaskingTop8BitsEPKcS2_RjS3_( const char* data, const char* dataEnd, unsigned int& dataLength, unsigned int& utf16Length); +std::uint64_t APS5_VABI _ZN3WTF7ramSizeEv(); +double APS5_VABI _ZN3WTF8Internal25parseDoubleFromLongStringEPKDsmRm( const char16_t* string, std::size_t length, std::size_t& parsedLength); +WTF::WallTime APS5_VABI _ZN3WTF8WallTime3nowEv(); +void APS5_VABI _ZN3WTF8dataLogFEPKcz(const char* format, ...); +void APS5_VABI _ZN3WTF8fastFreeEPv(void* ptr); +std::size_t APS5_VABI _ZN3WTF8pageSizeEv(); +void APS5_VABI _ZN3WTF9dataLogFVEPKcP13__va_list_tag(const char* format, void* argList); +bool APS5_VABI _ZN3WTFeqERKNS_7CStringEPKc(const NKWebKit::WtfAbi::CString& a, const char* b); +bool APS5_VABI _ZN3WTFeqERKNS_7CStringES2_(const NKWebKit::WtfAbi::CString& a, const NKWebKit::WtfAbi::CString& b); +bool APS5_VABI _ZN3WTFltERKNS_7CStringES2_(const NKWebKit::WtfAbi::CString& a, const NKWebKit::WtfAbi::CString& b); +bool APS5_VABI _ZN7WebCore21isBackForwardLoadTypeENS_13FrameLoadTypeE(std::uint8_t type); +bool APS5_VABI _ZN7WebCore8isReloadENS_13FrameLoadTypeE(std::uint8_t type); +void APS5_VABI _ZN7bmalloc12cryptoRandomEPvm(void* buffer, std::size_t size); +std::size_t APS5_VABI _ZN7bmalloc15availableMemoryEv(); +bool APS5_VABI _ZN7bmalloc16isActiveHeapKindENS_8HeapKindE(std::uint32_t kind); +std::uint32_t APS5_VABI _ZN7bmalloc19mapToActiveHeapKindENS_8HeapKindE(std::uint32_t); +void APS5_VABI _ZN7bmalloc3api13freeOutOfLineEPvNS_8HeapKindE(void* ptr, std::uint32_t); +void APS5_VABI _ZN7bmalloc3api14enableMiniModeEv(); +void* APS5_VABI _ZN7bmalloc3api15mallocOutOfLineEmNS_8HeapKindE(std::size_t size, std::uint32_t); +void APS5_VABI _ZN7bmalloc3api16disableScavengerEv(); +void APS5_VABI _ZN7bmalloc3api21commitAlignedPhysicalEPvmNS_8HeapKindE(void*, std::size_t, std::uint32_t); +void APS5_VABI _ZN7bmalloc3api23decommitAlignedPhysicalEPvmNS_8HeapKindE(void*, std::size_t, std::uint32_t); +void* APS5_VABI _ZN7bmalloc3api29tryLargeZeroedMemalignVirtualEmmNS_8HeapKindE(std::size_t alignment, std::size_t size, std::uint32_t); +void APS5_VABI _ZN7bmalloc3api8scavengeEv(); +bool APS5_VABI _ZN7bmalloc3api9isEnabledENS_8HeapKindE(std::uint32_t); +void* APS5_VABI _ZN8Gigacage10tryReallocENS_4KindEPvm(std::uint32_t, void* ptr, std::size_t size); +void APS5_VABI _ZN8Gigacage11alignedFreeENS_4KindEPv(std::uint32_t, void* ptr); +void* APS5_VABI _ZN8Gigacage11mallocArrayENS_4KindEmm(std::uint32_t, std::size_t count, std::size_t size); +void* APS5_VABI _ZN8Gigacage14tryMallocArrayENS_4KindEmm(std::uint32_t, std::size_t count, std::size_t size); +void APS5_VABI _ZN8Gigacage16freeVirtualPagesENS_4KindEPvm(std::uint32_t, void* ptr, std::size_t); +void* APS5_VABI _ZN8Gigacage16tryAlignedMallocENS_4KindEmm(std::uint32_t, std::size_t alignment, std::size_t size); +void* APS5_VABI _ZN8Gigacage29tryAllocateZeroedVirtualPagesENS_4KindEm(std::uint32_t, std::size_t size); +void APS5_VABI _ZN8Gigacage4freeENS_4KindEPv(std::uint32_t, void* ptr); +void* APS5_VABI _ZN8Gigacage6mallocENS_4KindEm(std::uint32_t, std::size_t size); +void* APS5_VABI _ZN8Gigacage9tryMallocENS_4KindEm(std::uint32_t, std::size_t size); +bool APS5_VABI _ZNK3WTF10StringImpl10startsWithEDs(const NKWebKit::WtfAbi::StringImpl* self, char16_t value); +bool APS5_VABI _ZNK3WTF10StringImpl10startsWithEPKcj(const NKWebKit::WtfAbi::StringImpl* self, const char* data, unsigned length); +std::size_t APS5_VABI _ZNK3WTF10StringImpl11sizeInBytesEv(const NKWebKit::WtfAbi::StringImpl* self); +unsigned APS5_VABI _ZNK3WTF10StringImpl12hashSlowCaseEv(const NKWebKit::WtfAbi::StringImpl* self); +unsigned APS5_VABI _ZNK3WTF10StringImpl14concurrentHashEv(const NKWebKit::WtfAbi::StringImpl* self); +NKWebKit::WtfAbi::CString APS5_VABI _ZNK3WTF10StringImpl4utf8ENS_14ConversionModeE(const NKWebKit::WtfAbi::StringImpl* self, unsigned mode); +bool APS5_VABI _ZNK3WTF10StringImpl8endsWithEDs(const NKWebKit::WtfAbi::StringImpl* self, char16_t value); +bool APS5_VABI _ZNK3WTF10StringImpl8endsWithEPKcj(const NKWebKit::WtfAbi::StringImpl* self, const char* data, unsigned length); +bool APS5_VABI _ZNK3WTF10StringView10startsWithEDs(const NKWebKit::WtfAbi::StringView* self, char16_t value); +NKWebKit::WtfAbi::String APS5_VABI _ZNK3WTF10StringView23convertToASCIILowercaseEv(const NKWebKit::WtfAbi::StringView* self); +NKWebKit::WtfAbi::String APS5_VABI _ZNK3WTF10StringView23convertToASCIIUppercaseEv(const NKWebKit::WtfAbi::StringView* self); +void APS5_VABI _ZNK3WTF10StringView26getCharactersWithASCIICaseENS0_15CaseConvertTypeEPDs(const NKWebKit::WtfAbi::StringView* self, unsigned type, char16_t* output); +void APS5_VABI _ZNK3WTF10StringView26getCharactersWithASCIICaseENS0_15CaseConvertTypeEPh(const NKWebKit::WtfAbi::StringView* self, unsigned type, unsigned char* output); +std::size_t APS5_VABI _ZNK3WTF10StringView4findES0_j(const NKWebKit::WtfAbi::StringView* self, NKWebKit::WtfAbi::StringView match, unsigned start); +NKWebKit::WtfAbi::CString APS5_VABI _ZNK3WTF10StringView4utf8ENS_14ConversionModeE(const NKWebKit::WtfAbi::StringView* self, unsigned mode); +bool APS5_VABI _ZNK3WTF10StringView8endsWithEDs(const NKWebKit::WtfAbi::StringView* self, char16_t value); +WTF::WallTime APS5_VABI _ZNK3WTF13MonotonicTime19approximateWallTimeEv(const WTF::MonotonicTime* self); +WTF::MonotonicTime APS5_VABI _ZNK3WTF24TimeWithDynamicClockType13monotonicTimeEv(const WTF::TimeWithDynamicClockType* self); +WTF::TimeWithDynamicClockType APS5_VABI _ZNK3WTF24TimeWithDynamicClockType16nowWithSameClockEv(const WTF::TimeWithDynamicClockType* self); +WTF::WallTime APS5_VABI _ZNK3WTF24TimeWithDynamicClockType19approximateWallTimeEv(const WTF::TimeWithDynamicClockType* self); +WTF::MonotonicTime APS5_VABI _ZNK3WTF24TimeWithDynamicClockType24approximateMonotonicTimeEv(const WTF::TimeWithDynamicClockType* self); +WTF::WallTime APS5_VABI _ZNK3WTF24TimeWithDynamicClockType8wallTimeEv(const WTF::TimeWithDynamicClockType* self); +bool APS5_VABI _ZNK3WTF24TimeWithDynamicClockTypegeERKS0_(const WTF::TimeWithDynamicClockType* self, const WTF::TimeWithDynamicClockType& other); +bool APS5_VABI _ZNK3WTF24TimeWithDynamicClockTypegtERKS0_(const WTF::TimeWithDynamicClockType* self, const WTF::TimeWithDynamicClockType& other); +bool APS5_VABI _ZNK3WTF24TimeWithDynamicClockTypeleERKS0_(const WTF::TimeWithDynamicClockType* self, const WTF::TimeWithDynamicClockType& other); +WTF::Seconds APS5_VABI _ZNK3WTF24TimeWithDynamicClockTypemiERKS0_(const WTF::TimeWithDynamicClockType* self, const WTF::TimeWithDynamicClockType& other); +bool APS5_VABI _ZNK3WTF3URL10protocolIsENS_10StringViewE(const NKWebKit::WtfAbi::URL* self, NKWebKit::WtfAbi::StringView protocol); +NKWebKit::WtfAbi::StringView APS5_VABI _ZNK3WTF3URL11encodedUserEv(const NKWebKit::WtfAbi::URL* self); +bool APS5_VABI _ZNK3WTF3URL12isAboutBlankEv(const NKWebKit::WtfAbi::URL* self); +bool APS5_VABI _ZNK3WTF3URL13isAboutSrcDocEv(const NKWebKit::WtfAbi::URL* self); +bool APS5_VABI _ZNK3WTF3URL14isHierarchicalEv(const NKWebKit::WtfAbi::URL* self); +NKWebKit::WtfAbi::StringView APS5_VABI _ZNK3WTF3URL15encodedPasswordEv(const NKWebKit::WtfAbi::URL* self); +NKWebKit::WtfAbi::StringView APS5_VABI _ZNK3WTF3URL18fragmentIdentifierEv(const NKWebKit::WtfAbi::URL* self); +bool APS5_VABI _ZNK3WTF3URL20protocolIsJavaScriptEv(const NKWebKit::WtfAbi::URL* self); +NKWebKit::WtfAbi::StringView APS5_VABI _ZNK3WTF3URL28queryWithLeadingQuestionMarkEv(const NKWebKit::WtfAbi::URL* self); +NKWebKit::WtfAbi::StringView APS5_VABI _ZNK3WTF3URL39fragmentIdentifierWithLeadingNumberSignEv(const NKWebKit::WtfAbi::URL* self); +NKWebKit::WtfAbi::StringView APS5_VABI _ZNK3WTF3URL4hostEv(const NKWebKit::WtfAbi::URL* self); +NKWebKit::WtfAbi::StringView APS5_VABI _ZNK3WTF3URL4pathEv(const NKWebKit::WtfAbi::URL* self); +NKWebKit::WtfAbi::StringView APS5_VABI _ZNK3WTF3URL8protocolEv(const NKWebKit::WtfAbi::URL* self); +std::int32_t APS5_VABI _ZNK3WTF6String19characterStartingAtEj(const NKWebKit::WtfAbi::String* self, unsigned index); +NKWebKit::WtfAbi::String APS5_VABI _ZNK3WTF6String20substringSharingImplEjj(const NKWebKit::WtfAbi::String* self, unsigned start, unsigned length); +NKWebKit::WtfAbi::String APS5_VABI _ZNK3WTF6String23convertToASCIILowercaseEv(const NKWebKit::WtfAbi::String* self); +NKWebKit::WtfAbi::String APS5_VABI _ZNK3WTF6String23convertToASCIIUppercaseEv(const NKWebKit::WtfAbi::String* self); +bool APS5_VABI _ZNK3WTF6String27isSafeToSendToAnotherThreadEv(const NKWebKit::WtfAbi::String* self); +NKWebKit::WtfAbi::CString APS5_VABI _ZNK3WTF6String4utf8ENS_14ConversionModeE(const NKWebKit::WtfAbi::String* self, unsigned mode); +NKWebKit::WtfAbi::CString APS5_VABI _ZNK3WTF6String5asciiEv(const NKWebKit::WtfAbi::String* self); +NKWebKit::WtfAbi::CString APS5_VABI _ZNK3WTF6String6latin1Ev(const NKWebKit::WtfAbi::String* self); +double APS5_VABI _ZNK3WTF7CPUTime23percentageCPUUsageSinceERKS0_(const WTF::CPUTime* self, const WTF::CPUTime& reference); +unsigned APS5_VABI _ZNK3WTF7CString4hashEv(const NKWebKit::WtfAbi::CString* self); +WTF::MonotonicTime APS5_VABI _ZNK3WTF7SecondsmiENS_13MonotonicTimeE(const WTF::Seconds* self, WTF::MonotonicTime other); +WTF::WallTime APS5_VABI _ZNK3WTF7SecondsmiENS_8WallTimeE(const WTF::Seconds* self, WTF::WallTime other); +WTF::TimeWithDynamicClockType APS5_VABI _ZNK3WTF7SecondsmiERKNS_24TimeWithDynamicClockTypeE(const WTF::Seconds* self, const WTF::TimeWithDynamicClockType& other); +WTF::MonotonicTime APS5_VABI _ZNK3WTF7SecondsplENS_13MonotonicTimeE(const WTF::Seconds* self, WTF::MonotonicTime other); +WTF::WallTime APS5_VABI _ZNK3WTF7SecondsplENS_8WallTimeE(const WTF::Seconds* self, WTF::WallTime other); +WTF::MonotonicTime APS5_VABI _ZNK3WTF8WallTime24approximateMonotonicTimeEv(const WTF::WallTime* self); + +} diff --git a/core/libs/prx/libSceNKWebKit/libSceNKWebKit.hpp b/core/libs/prx/libSceNKWebKit/libSceNKWebKit.hpp index 1a876aeb73..2f12efa557 100644 --- a/core/libs/prx/libSceNKWebKit/libSceNKWebKit.hpp +++ b/core/libs/prx/libSceNKWebKit/libSceNKWebKit.hpp @@ -1,4 +1,11 @@ #pragma once +#include "prx/libSceNKWebKit/include/LegacyExports.hpp" #include "prx/libSceNKWebKit/include/Api.hpp" #include "prx/libSceNKWebKit/include/InventoryExports.hpp" +#include "prx/libSceNKWebKit/include/JscExports.hpp" +#include "prx/libSceNKWebKit/include/WebCoreExports.hpp" +#include "prx/libSceNKWebKit/include/WebKitConfigExports.hpp" +#include "prx/libSceNKWebKit/include/WebKitValueExports.hpp" +#include "prx/libSceNKWebKit/include/WtfExports.hpp" +#include "prx/libSceNKWebKit/src/Preferences.hpp" diff --git a/core/libs/prx/libSceNKWebKit/src/Array.cpp b/core/libs/prx/libSceNKWebKit/src/Array.cpp new file mode 100644 index 0000000000..c7260bb381 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/Array.cpp @@ -0,0 +1,51 @@ +#include "prx/libSceNKWebKit/src/Types.hpp" +#include "prx/libSceNKWebKit/include/WebKitValueExports.hpp" + +extern "C" { +const void* APS5_VABI WKArrayCreate(const void** values, std::size_t numberOfValues) { + std::vector> elements; + elements.reserve(numberOfValues); + for (std::size_t i = 0; i < numberOfValues; ++i) { + elements.push_back(NKWebKit::Retained::Share(const_cast(NKWebKit::ToObject(values[i], __func__)))); + } + return NKWebKit::ToRef(NKWebKit::Make(std::move(elements))); +} + +const void* APS5_VABI WKArrayCreateAdoptingValues(const void** values, std::size_t numberOfValues) { + std::vector> elements; + elements.reserve(numberOfValues); + for (std::size_t i = 0; i < numberOfValues; ++i) { + elements.push_back(NKWebKit::Retained::Adopt(const_cast(NKWebKit::ToObject(values[i], __func__)))); + } + return NKWebKit::ToRef(NKWebKit::Make(std::move(elements))); +} + +void* APS5_VABI WKMutableArrayCreate() { + auto array = NKWebKit::Make(); + array->mutableArray = true; + return const_cast(NKWebKit::ToRef(std::move(array))); +} + +const void* APS5_VABI WKArrayGetItemAtIndex(const void* arrayRef, std::size_t index) { + const auto* array = NKWebKit::Cast(arrayRef, __func__); + if (index >= array->elements.size()) throw std::out_of_range(std::string(__func__) + ": index out of range"); + return array->elements[index].Get(); +} + +std::size_t APS5_VABI WKArrayGetSize(const void* arrayRef) { + const auto* array = NKWebKit::Cast(arrayRef, __func__); + return array->elements.size(); +} + +void APS5_VABI WKArrayAppendItem(void* arrayRef, const void* itemRef) { + auto* array = NKWebKit::Cast(arrayRef, __func__); + array->elements.push_back(NKWebKit::Retained::Share(const_cast(NKWebKit::ToObject(itemRef, __func__)))); +} + +void APS5_VABI WKArrayRemoveItemAtIndex(void* arrayRef, std::size_t index) { + auto* array = NKWebKit::Cast(arrayRef, __func__); + if (index >= array->elements.size()) throw std::out_of_range(std::string(__func__) + ": index out of range"); + array->elements.erase(array->elements.begin() + index); +} + +} diff --git a/core/libs/prx/libSceNKWebKit/src/Bmalloc.cpp b/core/libs/prx/libSceNKWebKit/src/Bmalloc.cpp new file mode 100644 index 0000000000..36743be430 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/Bmalloc.cpp @@ -0,0 +1,179 @@ +#include "prx/libc/include/general/VabiMacros.hpp" +#include "prx/libSceNKWebKit/include/WtfExports.hpp" + +#include +#include +#include +#include +#include +#include +#include + +namespace NKWebKit { + +struct AllocationHeader { + void* raw; + std::size_t size; +}; + +void* PlaceAllocation(std::size_t size, std::size_t alignment) { + if (alignment < alignof(std::max_align_t)) { + alignment = alignof(std::max_align_t); + } + if ((alignment & (alignment - 1)) != 0) { + return nullptr; + } + constexpr std::size_t overhead = sizeof(AllocationHeader); + if (alignment > std::numeric_limits::max() - overhead) { + return nullptr; + } + const std::size_t slack = alignment + overhead; + if (size > std::numeric_limits::max() - slack) { + return nullptr; + } + void* raw = std::malloc(size + slack); + if (!raw) { + return nullptr; + } + const std::uintptr_t rawAddr = reinterpret_cast(raw); + const std::uintptr_t payloadAddr = (rawAddr + overhead + alignment - 1) & ~(static_cast(alignment) - 1); + auto* header = reinterpret_cast(payloadAddr - overhead); + header->raw = raw; + header->size = size; + return reinterpret_cast(payloadAddr); +} + +void* Allocate(std::size_t size, std::size_t alignment = 16) { + void* ptr = PlaceAllocation(size, alignment); + if (!ptr) { + std::abort(); + } + return ptr; +} + +void* TryAllocate(std::size_t size, std::size_t alignment = 16) { + return PlaceAllocation(size, alignment); +} + +void Deallocate(void* ptr) { + if (!ptr) { + return; + } + auto* header = reinterpret_cast(reinterpret_cast(ptr) - sizeof(AllocationHeader)); + std::free(header->raw); +} + +std::size_t AllocationSize(const void* ptr) { + if (!ptr) { + return 0; + } + const auto* header = reinterpret_cast(reinterpret_cast(ptr) - sizeof(AllocationHeader)); + return header->size; +} + +void* Reallocate(void* ptr, std::size_t newSize, std::size_t alignment = 16) { + if (!ptr) { + return Allocate(newSize, alignment); + } + if (newSize == 0) { + Deallocate(ptr); + return nullptr; + } + void* newPtr = Allocate(newSize, alignment); + const std::size_t oldSize = AllocationSize(ptr); + std::memcpy(newPtr, ptr, std::min(oldSize, newSize)); + Deallocate(ptr); + return newPtr; +} + +void* TryReallocate(void* ptr, std::size_t newSize, std::size_t alignment = 16) { + if (!ptr) { + return TryAllocate(newSize, alignment); + } + if (newSize == 0) { + Deallocate(ptr); + return nullptr; + } + void* newPtr = TryAllocate(newSize, alignment); + if (!newPtr) { + return nullptr; + } + const std::size_t oldSize = AllocationSize(ptr); + std::memcpy(newPtr, ptr, std::min(oldSize, newSize)); + Deallocate(ptr); + return newPtr; +} + +void FillRandomBytes(void* buffer, std::size_t size) { + if (!buffer || size == 0) { + return; + } + std::random_device rd; + auto* dst = static_cast(buffer); + while (size >= sizeof(unsigned int)) { + const unsigned int val = rd(); + std::memcpy(dst, &val, sizeof(val)); + dst += sizeof(val); + size -= sizeof(val); + } + if (size > 0) { + const unsigned int val = rd(); + std::memcpy(dst, &val, size); + } +} + +} // namespace NKWebKit + +extern "C" { +void* APS5_VABI _ZN7bmalloc3api15mallocOutOfLineEmNS_8HeapKindE(std::size_t size, std::uint32_t) { + return NKWebKit::Allocate(size); +} + +void APS5_VABI _ZN7bmalloc3api13freeOutOfLineEPvNS_8HeapKindE(void* ptr, std::uint32_t) { + NKWebKit::Deallocate(ptr); +} + +void* APS5_VABI _ZN7bmalloc3api29tryLargeZeroedMemalignVirtualEmmNS_8HeapKindE(std::size_t alignment, std::size_t size, std::uint32_t) { + void* ptr = NKWebKit::TryAllocate(size, alignment); + if (ptr) { + std::memset(ptr, 0, size); + } + return ptr; +} + +void APS5_VABI _ZN7bmalloc3api8scavengeEv() { +} + +bool APS5_VABI _ZN7bmalloc3api9isEnabledENS_8HeapKindE(std::uint32_t) { + return true; +} + +void APS5_VABI _ZN7bmalloc3api21commitAlignedPhysicalEPvmNS_8HeapKindE(void*, std::size_t, std::uint32_t) { +} + +void APS5_VABI _ZN7bmalloc3api23decommitAlignedPhysicalEPvmNS_8HeapKindE(void*, std::size_t, std::uint32_t) { +} + +void APS5_VABI _ZN7bmalloc3api14enableMiniModeEv() { +} + +void APS5_VABI _ZN7bmalloc3api16disableScavengerEv() { +} + +std::size_t APS5_VABI _ZN7bmalloc15availableMemoryEv() { + return static_cast(16ULL * 1024ULL * 1024ULL * 1024ULL); +} + +void APS5_VABI _ZN7bmalloc12cryptoRandomEPvm(void* buffer, std::size_t size) { + NKWebKit::FillRandomBytes(buffer, size); +} + +bool APS5_VABI _ZN7bmalloc16isActiveHeapKindENS_8HeapKindE(std::uint32_t kind) { + return kind == 0; +} + +std::uint32_t APS5_VABI _ZN7bmalloc19mapToActiveHeapKindENS_8HeapKindE(std::uint32_t) { + return 0; +} + +} diff --git a/core/libs/prx/libSceNKWebKit/src/CertificateInfo.cpp b/core/libs/prx/libSceNKWebKit/src/CertificateInfo.cpp new file mode 100644 index 0000000000..7a61bcd9d8 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/CertificateInfo.cpp @@ -0,0 +1,25 @@ +#include "prx/libSceNKWebKit/src/Types.hpp" +#include "prx/libSceNKWebKit/include/WebKitValueExports.hpp" + +extern "C" { +const void* APS5_VABI WKCertificateInfoCreateWithCertficateChain(const void* certificateChainRef) { + return nullptr; +} + +int APS5_VABI WKCertificateInfoGetVerificationError(const void* certificateInfoRef) { + return 0; +} + +const void* APS5_VABI WKCertificateInfoCopyVerificationErrorDescription(const void* certificateInfoRef) { + return nullptr; +} + +std::size_t APS5_VABI WKCertificateInfoGetCertificateChainSize(const void* certificateInfoRef) { + return 0; +} + +const void* APS5_VABI WKCertificateInfoCopyCertificateAtIndex(const void* certificateInfoRef, std::size_t index) { + return nullptr; +} + +} diff --git a/core/libs/prx/libSceNKWebKit/src/Configuration.hpp b/core/libs/prx/libSceNKWebKit/src/Configuration.hpp new file mode 100644 index 0000000000..b447064e3b --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/Configuration.hpp @@ -0,0 +1,168 @@ +#pragma once + +#include "prx/libSceNKWebKit/src/Object.hpp" +#include "prx/libSceNKWebKit/src/Types.hpp" +#include +#include +#include +#include +#include + +namespace NKWebKit { + +class ProcessPool : public ObjectOf {}; +class Page : public ObjectOf {}; +class Preferences : public ObjectOf {}; +class WebsiteDataStore : public ObjectOf {}; +class ContentRuleList : public ObjectOf {}; + +inline std::optional OptionalString(const void* ref, const char* function) { + const auto* str = Cast(ref, function); + if (str->null) return std::nullopt; + return str->characters; +} + +inline const void* ToCopiedStringRef(const std::optional& value) { + return ToRef(Make(value.value_or(std::u16string()))); +} + +class ProcessPoolConfiguration final : public ObjectOf { +public: + std::optional injectedBundlePath; + std::optional webProcessPath; + std::optional networkProcessPath; + std::int32_t userId = -1; + bool fullySynchronousModeIsAllowedForTesting = false; + bool ignoreSynchronousMessagingTimeoutsForTesting = false; + std::optional processSwapsOnNavigationFromClient; + bool processSwapsOnNavigationFromExperimentalFeatures = false; + bool alwaysKeepAndReuseSwappedProcesses = false; + std::optional isAutomaticProcessWarmingEnabledByClient; + bool clientWouldBenefitFromAutomaticProcessPrewarming = false; + bool usesWebProcessCache = false; + bool shouldConfigureJSCForTesting = false; + std::vector overrideLanguages; +}; + +class PageConfiguration final : public ObjectOf { +public: + Retained context; + Retained pageGroup; + Retained userContentController; + Retained preferences; + Retained relatedPage; + Retained websiteDataStore; + bool initialCapitalizationEnabled = false; + double cpuLimit = 0.0; +}; + +class WebsiteDataStoreConfiguration final : public ObjectOf { +public: + std::optional applicationCacheDirectory; + std::optional networkCacheDirectory; + std::optional indexedDBDatabaseDirectory; + std::optional localStorageDirectory; + std::optional webSQLDatabaseDirectory; + std::optional cacheStorageDirectory; + std::optional mediaKeysStorageDirectory; + std::optional resourceLoadStatisticsDirectory; + std::optional serviceWorkerRegistrationDirectory; + std::optional cookieStorageFile; + std::uint64_t perOriginStorageQuota = 1000ULL * 1024ULL * 1024ULL; + bool networkCacheSpeculativeValidationEnabled = false; + bool testingSessionEnabled = false; + bool staleWhileRevalidateEnabled = true; +}; + +class WebsitePolicies final : public ObjectOf { +public: + bool contentBlockersEnabled = true; + std::uint32_t allowedAutoplayQuirks = 0; + std::uint32_t autoplayPolicy = 0; + std::uint32_t popUpPolicy = 0; + Retained websiteDataStore; +}; + +class UserScript final : public ObjectOf { +public: + UserScript(std::u16string source, std::uint32_t injectionTime, bool forMainFrameOnly) + : source(std::move(source)), injectionTime(injectionTime), forMainFrameOnly(forMainFrameOnly) {} + + std::u16string source; + std::uint32_t injectionTime = 0; + bool forMainFrameOnly = false; + std::string baseURL = "about:blank"; + std::vector allowedURLPatterns; + std::vector blockedURLPatterns; +}; + +class UserStyleSheet final : public ObjectOf { +public: + explicit UserStyleSheet(std::u16string source) : source(std::move(source)) {} + + std::u16string source; + bool forMainFrameOnly = false; + std::string baseURL = "about:blank"; + std::vector allowedURLPatterns; + std::vector blockedURLPatterns; +}; + +class UserContentController final : public ObjectOf { +public: + std::vector> userScripts; + std::vector> contentRuleLists; +}; + +class Credential final : public ObjectOf { +public: + Credential(std::u16string user, std::u16string password, std::uint32_t persistence) + : user(std::move(user)), password(std::move(password)), persistence(persistence) {} + + std::u16string user; + std::u16string password; + std::uint32_t persistence = 0; +}; + +class GeolocationPosition final : public ObjectOf { +public: + GeolocationPosition(double timestamp, double latitude, double longitude, double accuracy, + bool providesAltitude, double altitude, + bool providesAltitudeAccuracy, double altitudeAccuracy, + bool providesHeading, double heading, + bool providesSpeed, double speed, + bool providesFloorLevel, double floorLevel) + : timestamp(timestamp), latitude(latitude), longitude(longitude), accuracy(accuracy), + providesAltitude(providesAltitude), altitude(altitude), + providesAltitudeAccuracy(providesAltitudeAccuracy), altitudeAccuracy(altitudeAccuracy), + providesHeading(providesHeading), heading(heading), + providesSpeed(providesSpeed), speed(speed), + providesFloorLevel(providesFloorLevel), floorLevel(floorLevel) {} + + double timestamp = 0.0; + double latitude = 0.0; + double longitude = 0.0; + double accuracy = 0.0; + bool providesAltitude = false; + double altitude = 0.0; + bool providesAltitudeAccuracy = false; + double altitudeAccuracy = 0.0; + bool providesHeading = false; + double heading = 0.0; + bool providesSpeed = false; + double speed = 0.0; + bool providesFloorLevel = false; + double floorLevel = 0.0; +}; + +class PageGroup final : public ObjectOf { +public: + explicit PageGroup(std::u16string identifier) + : identifier(std::move(identifier)), userContentController(Make()) {} + + std::u16string identifier; + Retained preferences; + Retained userContentController; + std::vector> userStyleSheets; +}; + +} // namespace NKWebKit diff --git a/core/libs/prx/libSceNKWebKit/src/ContextConfiguration.cpp b/core/libs/prx/libSceNKWebKit/src/ContextConfiguration.cpp new file mode 100644 index 0000000000..dd9ea1145c --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/ContextConfiguration.cpp @@ -0,0 +1,219 @@ +#include "prx/libSceNKWebKit/src/Configuration.hpp" +#include "prx/libSceNKWebKit/include/WebKitConfigExports.hpp" + +extern "C" { +const void* APS5_VABI WKContextConfigurationCreate() { + return NKWebKit::ToRef(NKWebKit::Make()); +} + +const void* APS5_VABI WKContextConfigurationCreateWithLegacyOptions() { + return WKContextConfigurationCreate(); +} + +bool APS5_VABI WKContextConfigurationAlwaysKeepAndReuseSwappedProcesses(const void* configuration) { + return NKWebKit::Cast(configuration, __func__)->alwaysKeepAndReuseSwappedProcesses; +} + +void APS5_VABI WKContextConfigurationSetAlwaysKeepAndReuseSwappedProcesses(const void* configuration, bool keepAndReuse) { + NKWebKit::Cast(configuration, __func__)->alwaysKeepAndReuseSwappedProcesses = keepAndReuse; +} + +const void* APS5_VABI WKContextConfigurationCopyApplicationCacheDirectory(const void* configuration) { + NKWebKit::Cast(configuration, __func__); + return nullptr; +} + +void APS5_VABI WKContextConfigurationSetApplicationCacheDirectory(const void* configuration, const void* applicationCacheDirectory) { + NKWebKit::Cast(configuration, __func__); + NKWebKit::CastOrNull(applicationCacheDirectory, __func__); +} + +const void* APS5_VABI WKContextConfigurationCopyCustomClassesForParameterCoder(const void* configuration) { + NKWebKit::Cast(configuration, __func__); + return NKWebKit::ToRef(NKWebKit::Make()); +} + +void APS5_VABI WKContextConfigurationSetCustomClassesForParameterCoder(const void* configuration, const void* classesForCoder) { + NKWebKit::Cast(configuration, __func__); + NKWebKit::CastOrNull(classesForCoder, __func__); +} + +const void* APS5_VABI WKContextConfigurationCopyDiskCacheDirectory(const void* configuration) { + NKWebKit::Cast(configuration, __func__); + return nullptr; +} + +void APS5_VABI WKContextConfigurationSetDiskCacheDirectory(const void* configuration, const void* diskCacheDirectory) { + NKWebKit::Cast(configuration, __func__); + NKWebKit::CastOrNull(diskCacheDirectory, __func__); +} + +std::int64_t APS5_VABI WKContextConfigurationDiskCacheSizeOverride(const void* configuration) { + NKWebKit::Cast(configuration, __func__); + return 0; +} + +void APS5_VABI WKContextConfigurationSetDiskCacheSizeOverride(const void* configuration, std::int64_t size) { + NKWebKit::Cast(configuration, __func__); + (void)size; +} + +bool APS5_VABI WKContextConfigurationFullySynchronousModeIsAllowedForTesting(const void* configuration) { + return NKWebKit::Cast(configuration, __func__)->fullySynchronousModeIsAllowedForTesting; +} + +void APS5_VABI WKContextConfigurationSetFullySynchronousModeIsAllowedForTesting(const void* configuration, bool allowed) { + NKWebKit::Cast(configuration, __func__)->fullySynchronousModeIsAllowedForTesting = allowed; +} + +bool APS5_VABI WKContextConfigurationIgnoreSynchronousMessagingTimeoutsForTesting(const void* configuration) { + return NKWebKit::Cast(configuration, __func__)->ignoreSynchronousMessagingTimeoutsForTesting; +} + +void APS5_VABI WKContextConfigurationSetIgnoreSynchronousMessagingTimeoutsForTesting(const void* configuration, bool ignore) { + NKWebKit::Cast(configuration, __func__)->ignoreSynchronousMessagingTimeoutsForTesting = ignore; +} + +const void* APS5_VABI WKContextConfigurationCopyIndexedDBDatabaseDirectory(const void* configuration) { + NKWebKit::Cast(configuration, __func__); + return nullptr; +} + +void APS5_VABI WKContextConfigurationSetIndexedDBDatabaseDirectory(const void* configuration, const void* indexedDBDatabaseDirectory) { + NKWebKit::Cast(configuration, __func__); + NKWebKit::CastOrNull(indexedDBDatabaseDirectory, __func__); +} + +const void* APS5_VABI WKContextConfigurationCopyInjectedBundlePath(const void* configuration) { + return NKWebKit::ToCopiedStringRef(NKWebKit::Cast(configuration, __func__)->injectedBundlePath); +} + +void APS5_VABI WKContextConfigurationSetInjectedBundlePath(const void* configuration, const void* injectedBundlePath) { + NKWebKit::Cast(configuration, __func__)->injectedBundlePath = + NKWebKit::OptionalString(injectedBundlePath, __func__); +} + +const void* APS5_VABI WKContextConfigurationCopyLocalStorageDirectory(const void* configuration) { + NKWebKit::Cast(configuration, __func__); + return nullptr; +} + +void APS5_VABI WKContextConfigurationSetLocalStorageDirectory(const void* configuration, const void* localStorageDirectory) { + NKWebKit::Cast(configuration, __func__); + NKWebKit::CastOrNull(localStorageDirectory, __func__); +} + +const void* APS5_VABI WKContextConfigurationCopyMediaKeysStorageDirectory(const void* configuration) { + NKWebKit::Cast(configuration, __func__); + return nullptr; +} + +void APS5_VABI WKContextConfigurationSetMediaKeysStorageDirectory(const void* configuration, const void* mediaKeysStorageDirectory) { + NKWebKit::Cast(configuration, __func__); + NKWebKit::CastOrNull(mediaKeysStorageDirectory, __func__); +} + +const void* APS5_VABI WKContextConfigurationCopyNetworkProcessPath(const void* configuration) { + return NKWebKit::ToCopiedStringRef(NKWebKit::Cast(configuration, __func__)->networkProcessPath); +} + +void APS5_VABI WKContextConfigurationSetNetworkProcessPath(const void* configuration, const void* networkProcessPath) { + NKWebKit::Cast(configuration, __func__)->networkProcessPath = + NKWebKit::OptionalString(networkProcessPath, __func__); +} + +const void* APS5_VABI WKContextConfigurationCopyOverrideLanguages(const void* configuration) { + auto* pool = NKWebKit::Cast(configuration, __func__); + auto array = NKWebKit::Make(); + for (const auto& lang : pool->overrideLanguages) { + array->elements.push_back(NKWebKit::Make(lang)); + } + return NKWebKit::ToRef(array); +} + +void APS5_VABI WKContextConfigurationSetOverrideLanguages(const void* configuration, const void* overrideLanguages) { + auto* pool = NKWebKit::Cast(configuration, __func__); + pool->overrideLanguages.clear(); + if (!overrideLanguages) return; + const auto* array = NKWebKit::Cast(overrideLanguages, __func__); + for (const auto& element : array->elements) { + if (!element) continue; + if (element->Type() == NKWebKit::ObjectType::String) { + pool->overrideLanguages.push_back(static_cast(element.Get())->characters); + } + } +} + +bool APS5_VABI WKContextConfigurationPrewarmsProcessesAutomatically(const void* configuration) { + const auto* pool = NKWebKit::Cast(configuration, __func__); + return pool->isAutomaticProcessWarmingEnabledByClient.value_or(pool->clientWouldBenefitFromAutomaticProcessPrewarming); +} + +void APS5_VABI WKContextConfigurationSetPrewarmsProcessesAutomatically(const void* configuration, bool prewarms) { + NKWebKit::Cast(configuration, __func__)->isAutomaticProcessWarmingEnabledByClient = prewarms; +} + +bool APS5_VABI WKContextConfigurationProcessSwapsOnNavigation(const void* configuration) { + const auto* pool = NKWebKit::Cast(configuration, __func__); + return pool->processSwapsOnNavigationFromClient.value_or(pool->processSwapsOnNavigationFromExperimentalFeatures); +} + +void APS5_VABI WKContextConfigurationSetProcessSwapsOnNavigation(const void* configuration, bool swaps) { + NKWebKit::Cast(configuration, __func__)->processSwapsOnNavigationFromClient = swaps; +} + +const void* APS5_VABI WKContextConfigurationCopyResourceLoadStatisticsDirectory(const void* configuration) { + NKWebKit::Cast(configuration, __func__); + return nullptr; +} + +void APS5_VABI WKContextConfigurationSetResourceLoadStatisticsDirectory(const void* configuration, const void* resourceLoadStatisticsDirectory) { + NKWebKit::Cast(configuration, __func__); + NKWebKit::CastOrNull(resourceLoadStatisticsDirectory, __func__); +} + +void APS5_VABI WKContextConfigurationSetShouldCaptureAudioInUIProcess(const void* configuration, bool allowed) { + NKWebKit::Cast(configuration, __func__); + (void)allowed; +} + +void APS5_VABI WKContextConfigurationSetShouldConfigureJSCForTesting(const void* configuration, bool value) { + NKWebKit::Cast(configuration, __func__)->shouldConfigureJSCForTesting = value; +} + +std::int32_t APS5_VABI WKContextConfigurationGetUserId(const void* configuration) { + return NKWebKit::Cast(configuration, __func__)->userId; +} + +void APS5_VABI WKContextConfigurationSetUserId(const void* configuration, std::int32_t userId) { + NKWebKit::Cast(configuration, __func__)->userId = userId; +} + +bool APS5_VABI WKContextConfigurationUsesWebProcessCache(const void* configuration) { + return NKWebKit::Cast(configuration, __func__)->usesWebProcessCache; +} + +void APS5_VABI WKContextConfigurationSetUsesWebProcessCache(const void* configuration, bool uses) { + NKWebKit::Cast(configuration, __func__)->usesWebProcessCache = uses; +} + +const void* APS5_VABI WKContextConfigurationCopyWebProcessPath(const void* configuration) { + return NKWebKit::ToCopiedStringRef(NKWebKit::Cast(configuration, __func__)->webProcessPath); +} + +void APS5_VABI WKContextConfigurationSetWebProcessPath(const void* configuration, const void* webProcessPath) { + NKWebKit::Cast(configuration, __func__)->webProcessPath = + NKWebKit::OptionalString(webProcessPath, __func__); +} + +const void* APS5_VABI WKContextConfigurationCopyWebSQLDatabaseDirectory(const void* configuration) { + NKWebKit::Cast(configuration, __func__); + return nullptr; +} + +void APS5_VABI WKContextConfigurationSetWebSQLDatabaseDirectory(const void* configuration, const void* webSQLDatabaseDirectory) { + NKWebKit::Cast(configuration, __func__); + NKWebKit::CastOrNull(webSQLDatabaseDirectory, __func__); +} + +} diff --git a/core/libs/prx/libSceNKWebKit/src/Credential.cpp b/core/libs/prx/libSceNKWebKit/src/Credential.cpp new file mode 100644 index 0000000000..4620f04227 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/Credential.cpp @@ -0,0 +1,27 @@ +#include "prx/libSceNKWebKit/src/Configuration.hpp" +#include "prx/libSceNKWebKit/include/WebKitConfigExports.hpp" + +extern "C" { +const void* APS5_VABI WKCredentialCreate(const void* username, const void* password, std::uint32_t persistence) { + std::u16string userString; + std::u16string passwordString; + if (username) { + userString = NKWebKit::Cast(username, __func__)->characters; + } + if (password) { + passwordString = NKWebKit::Cast(password, __func__)->characters; + } + return NKWebKit::ToRef(NKWebKit::Make(std::move(userString), std::move(passwordString), persistence)); +} + +const void* APS5_VABI WKCredentialCreateWithCertificateInfo(const void* certificateInfo) { + (void)certificateInfo; + return nullptr; +} + +const void* APS5_VABI WKCredentialCopyUser(const void* credential) { + const auto* cred = NKWebKit::Cast(credential, __func__); + return NKWebKit::ToRef(NKWebKit::Make(cred->user)); +} + +} diff --git a/core/libs/prx/libSceNKWebKit/src/Data.cpp b/core/libs/prx/libSceNKWebKit/src/Data.cpp new file mode 100644 index 0000000000..f293adf0bf --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/Data.cpp @@ -0,0 +1,23 @@ +#include "prx/libSceNKWebKit/src/Types.hpp" +#include "prx/libSceNKWebKit/include/WebKitValueExports.hpp" + +extern "C" { +const void* APS5_VABI WKDataCreate(const unsigned char* bytes, std::size_t size) { + std::vector data; + if (bytes && size > 0) { + data.assign(bytes, bytes + size); + } + return NKWebKit::ToRef(NKWebKit::Make(std::move(data))); +} + +const unsigned char* APS5_VABI WKDataGetBytes(const void* dataRef) { + const auto* data = NKWebKit::Cast(dataRef, __func__); + return data->bytes.data(); +} + +std::size_t APS5_VABI WKDataGetSize(const void* dataRef) { + const auto* data = NKWebKit::Cast(dataRef, __func__); + return data->bytes.size(); +} + +} diff --git a/core/libs/prx/libSceNKWebKit/src/Dictionary.cpp b/core/libs/prx/libSceNKWebKit/src/Dictionary.cpp new file mode 100644 index 0000000000..50f025336b --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/Dictionary.cpp @@ -0,0 +1,50 @@ +#include "prx/libSceNKWebKit/src/Types.hpp" +#include "prx/libSceNKWebKit/include/WebKitValueExports.hpp" + +extern "C" { +const void* APS5_VABI WKDictionaryCreate(const void** keys, const void** values, std::size_t numberOfValues) { + std::map> entries; + for (std::size_t i = 0; i < numberOfValues; ++i) { + const auto* key = NKWebKit::Cast(keys[i], __func__); + entries.insert_or_assign(key->characters, NKWebKit::Retained::Share(const_cast(NKWebKit::ToObject(values[i], __func__)))); + } + return NKWebKit::ToRef(NKWebKit::Make(std::move(entries))); +} + +void* APS5_VABI WKMutableDictionaryCreate() { + auto dictionary = NKWebKit::Make(); + dictionary->mutableDictionary = true; + return const_cast(NKWebKit::ToRef(std::move(dictionary))); +} + +const void* APS5_VABI WKDictionaryGetItemForKey(const void* dictionaryRef, const void* keyRef) { + const auto* dictionary = NKWebKit::Cast(dictionaryRef, __func__); + const auto* key = NKWebKit::Cast(keyRef, __func__); + auto it = dictionary->entries.find(key->characters); + if (it == dictionary->entries.end()) return nullptr; + return it->second.Get(); +} + +std::size_t APS5_VABI WKDictionaryGetSize(const void* dictionaryRef) { + const auto* dictionary = NKWebKit::Cast(dictionaryRef, __func__); + return dictionary->entries.size(); +} + +const void* APS5_VABI WKDictionaryCopyKeys(const void* dictionaryRef) { + const auto* dictionary = NKWebKit::Cast(dictionaryRef, __func__); + std::vector> keys; + keys.reserve(dictionary->entries.size()); + for (const auto& [k, v] : dictionary->entries) { + keys.push_back(NKWebKit::Make(k)); + } + return NKWebKit::ToRef(NKWebKit::Make(std::move(keys))); +} + +bool APS5_VABI WKDictionarySetItem(void* dictionaryRef, const void* keyRef, const void* itemRef) { + auto* dictionary = NKWebKit::Cast(dictionaryRef, __func__); + const auto* key = NKWebKit::Cast(keyRef, __func__); + auto [it, inserted] = dictionary->entries.insert_or_assign(key->characters, NKWebKit::Retained::Share(const_cast(NKWebKit::ToObject(itemRef, __func__)))); + return inserted; +} + +} diff --git a/core/libs/prx/libSceNKWebKit/src/Error.cpp b/core/libs/prx/libSceNKWebKit/src/Error.cpp new file mode 100644 index 0000000000..f662a7b923 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/Error.cpp @@ -0,0 +1,9 @@ +#include "prx/libSceNKWebKit/src/Types.hpp" +#include "prx/libSceNKWebKit/include/WebKitValueExports.hpp" + +extern "C" { +const void* APS5_VABI WKErrorCopyWKErrorDomain() { + return NKWebKit::ToRef(NKWebKit::String::FromUtf8("WebKitErrorDomain")); +} + +} diff --git a/core/libs/prx/libSceNKWebKit/src/GeolocationPosition.cpp b/core/libs/prx/libSceNKWebKit/src/GeolocationPosition.cpp new file mode 100644 index 0000000000..e0b8349cbc --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/GeolocationPosition.cpp @@ -0,0 +1,47 @@ +#include "prx/libSceNKWebKit/src/Configuration.hpp" +#include "prx/libSceNKWebKit/include/WebKitConfigExports.hpp" + +extern "C" { +const void* APS5_VABI WKGeolocationPositionCreate_c( + double timestamp, double latitude, double longitude, double accuracy, + bool providesAltitude, double altitude, + bool providesAltitudeAccuracy, double altitudeAccuracy, + bool providesHeading, double heading, + bool providesSpeed, double speed, + bool providesFloorLevel, double floorLevel) { + return NKWebKit::ToRef(NKWebKit::Make( + timestamp, latitude, longitude, accuracy, + providesAltitude, altitude, + providesAltitudeAccuracy, altitudeAccuracy, + providesHeading, heading, + providesSpeed, speed, + providesFloorLevel, floorLevel)); +} + +const void* APS5_VABI WKGeolocationPositionCreate_b( + double timestamp, double latitude, double longitude, double accuracy, + bool providesAltitude, double altitude, + bool providesAltitudeAccuracy, double altitudeAccuracy, + bool providesHeading, double heading, + bool providesSpeed, double speed) { + return WKGeolocationPositionCreate_c( + timestamp, latitude, longitude, accuracy, + providesAltitude, altitude, + providesAltitudeAccuracy, altitudeAccuracy, + providesHeading, heading, + providesSpeed, speed, + false, 0.0); +} + +const void* APS5_VABI WKGeolocationPositionCreate( + double timestamp, double latitude, double longitude, double accuracy) { + return WKGeolocationPositionCreate_c( + timestamp, latitude, longitude, accuracy, + false, 0.0, + false, 0.0, + false, 0.0, + false, 0.0, + false, 0.0); +} + +} diff --git a/core/libs/prx/libSceNKWebKit/src/Geometry.cpp b/core/libs/prx/libSceNKWebKit/src/Geometry.cpp new file mode 100644 index 0000000000..432d078ef5 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/Geometry.cpp @@ -0,0 +1,29 @@ +#include "prx/libSceNKWebKit/src/Types.hpp" +#include "prx/libSceNKWebKit/include/WebKitValueExports.hpp" + +extern "C" { +const void* APS5_VABI WKPointCreate(NKWebKit::PointValue point) { + return NKWebKit::ToRef(NKWebKit::Make(point)); +} + +NKWebKit::PointValue APS5_VABI WKPointGetValue(const void* pointRef) { + return NKWebKit::Cast(pointRef, __func__)->value; +} + +const void* APS5_VABI WKSizeCreate(NKWebKit::SizeValue size) { + return NKWebKit::ToRef(NKWebKit::Make(size)); +} + +NKWebKit::SizeValue APS5_VABI WKSizeGetValue(const void* sizeRef) { + return NKWebKit::Cast(sizeRef, __func__)->value; +} + +const void* APS5_VABI WKRectCreate(NKWebKit::RectValue rect) { + return NKWebKit::ToRef(NKWebKit::Make(rect)); +} + +NKWebKit::RectValue APS5_VABI WKRectGetValue(const void* rectRef) { + return NKWebKit::Cast(rectRef, __func__)->value; +} + +} diff --git a/core/libs/prx/libSceNKWebKit/src/Gigacage.cpp b/core/libs/prx/libSceNKWebKit/src/Gigacage.cpp new file mode 100644 index 0000000000..ea48cabbd8 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/Gigacage.cpp @@ -0,0 +1,69 @@ +#include "prx/libc/include/general/VabiMacros.hpp" +#include "prx/libSceNKWebKit/include/WtfExports.hpp" + +#include +#include +#include +#include +#include + +namespace NKWebKit { +void* Allocate(std::size_t size, std::size_t alignment = 16); +void* TryAllocate(std::size_t size, std::size_t alignment = 16); +void* Reallocate(void* ptr, std::size_t newSize, std::size_t alignment = 16); +void* TryReallocate(void* ptr, std::size_t newSize, std::size_t alignment = 16); +void Deallocate(void* ptr); +} // namespace NKWebKit + +extern "C" { +void* APS5_VABI _ZN8Gigacage6mallocENS_4KindEm(std::uint32_t, std::size_t size) { + return NKWebKit::Allocate(size); +} + +void* APS5_VABI _ZN8Gigacage9tryMallocENS_4KindEm(std::uint32_t, std::size_t size) { + return NKWebKit::TryAllocate(size); +} + +void APS5_VABI _ZN8Gigacage4freeENS_4KindEPv(std::uint32_t, void* ptr) { + NKWebKit::Deallocate(ptr); +} + +void* APS5_VABI _ZN8Gigacage11mallocArrayENS_4KindEmm(std::uint32_t, std::size_t count, std::size_t size) { + if (count != 0 && size > std::numeric_limits::max() / count) { + std::abort(); + } + return NKWebKit::Allocate(count * size); +} + +void* APS5_VABI _ZN8Gigacage14tryMallocArrayENS_4KindEmm(std::uint32_t, std::size_t count, std::size_t size) { + if (count != 0 && size > std::numeric_limits::max() / count) { + return nullptr; + } + return NKWebKit::TryAllocate(count * size); +} + +void* APS5_VABI _ZN8Gigacage16tryAlignedMallocENS_4KindEmm(std::uint32_t, std::size_t alignment, std::size_t size) { + return NKWebKit::TryAllocate(size, alignment); +} + +void APS5_VABI _ZN8Gigacage11alignedFreeENS_4KindEPv(std::uint32_t, void* ptr) { + NKWebKit::Deallocate(ptr); +} + +void* APS5_VABI _ZN8Gigacage10tryReallocENS_4KindEPvm(std::uint32_t, void* ptr, std::size_t size) { + return NKWebKit::TryReallocate(ptr, size); +} + +void* APS5_VABI _ZN8Gigacage29tryAllocateZeroedVirtualPagesENS_4KindEm(std::uint32_t, std::size_t size) { + void* ptr = NKWebKit::TryAllocate(size, 4096); + if (ptr) { + std::memset(ptr, 0, size); + } + return ptr; +} + +void APS5_VABI _ZN8Gigacage16freeVirtualPagesENS_4KindEPvm(std::uint32_t, void* ptr, std::size_t) { + NKWebKit::Deallocate(ptr); +} + +} diff --git a/core/libs/prx/libSceNKWebKit/src/Jsc.hpp b/core/libs/prx/libSceNKWebKit/src/Jsc.hpp new file mode 100644 index 0000000000..d2975f8fd4 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/Jsc.hpp @@ -0,0 +1,239 @@ +#pragma once + +#include "prx/libSceNKWebKit/src/JscApi.hpp" +#include "../../../../../3rdparty/quickjs/quickjs.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace NKWebKit { + +struct StaticValueEntry { + std::string name; + JSObjectGetPropertyCallback getProperty = nullptr; + JSObjectSetPropertyCallback setProperty = nullptr; + JSPropertyAttributes attributes = kJSPropertyAttributeNone; + JSStringRef propertyNameRef = nullptr; +}; + +struct StaticFunctionEntry { + std::string name; + JSObjectCallAsFunctionCallback callAsFunction = nullptr; + JSPropertyAttributes attributes = kJSPropertyAttributeNone; +}; + +struct OpaqueJSClass { + std::atomic refCount{1}; + JSClassAttributes attributes = kJSClassAttributeNone; + std::string className; + OpaqueJSClass* parentClass = nullptr; + std::vector staticValues; + std::vector staticFunctions; + JSObjectInitializeCallback initialize = nullptr; + JSObjectFinalizeCallback finalize = nullptr; + JSObjectHasPropertyCallback hasProperty = nullptr; + JSObjectGetPropertyCallback getProperty = nullptr; + JSObjectSetPropertyCallback setProperty = nullptr; + JSObjectDeletePropertyCallback deleteProperty = nullptr; + JSObjectGetPropertyNamesCallback getPropertyNames = nullptr; + JSObjectCallAsFunctionCallback callAsFunction = nullptr; + JSObjectCallAsConstructorCallback callAsConstructor = nullptr; + JSObjectHasInstanceCallback hasInstance = nullptr; + JSObjectConvertToTypeCallback convertToType = nullptr; + std::unique_ptr prototypeClass; + + void DestroyInPlace(); + bool HasCallAsFunction() const; + bool HasCallAsConstructor() const; + bool HasConvertToType() const; + bool HasInstanceCallback() const; + const StaticValueEntry* FindStaticValue(const std::string& propName) const; + const StaticFunctionEntry* FindStaticFunction(const std::string& propName) const; +}; + +struct OpaqueJSValue { + OpaqueJSContextGroup* group = nullptr; + OpaqueJSContext* ctx = nullptr; + JSValue qval = JS_UNDEFINED; + JSValue qweak = JS_UNDEFINED; + void* objPtr = nullptr; + std::uint32_t protectCount = 0; + bool ephemeralPinned = false; + bool alive = true; + bool isObjectHandle = false; +}; + +struct PrivatePropertySlot { + OpaqueJSValue* handle = nullptr; + JSValue strongVal = JS_UNDEFINED; +}; + +struct CallbackObjectData { + OpaqueJSContextGroup* group = nullptr; + OpaqueJSContext* ctx = nullptr; + OpaqueJSValue* handle = nullptr; + OpaqueJSClass* jsClass = nullptr; + void* privateData = nullptr; + JSValue propStore = JS_UNDEFINED; + std::unordered_map privateProperties; + std::unordered_set dynamicEnumeratedNames; + JSObjectCallAsFunctionCallback directFunctionCallback = nullptr; + JSObjectCallAsConstructorCallback directConstructorCallback = nullptr; + bool isDirectFunction = false; + bool isDirectConstructor = false; + bool isGlobalInterceptor = false; + bool finalized = false; +}; + +struct OpaqueJSContextGroup { + std::atomic refCount{1}; + JSRuntime* rt = nullptr; + JSContext* utilityCtx = nullptr; + JSValue weakRefCtor = JS_UNDEFINED; + JSValue weakRefDerefFunc = JS_UNDEFINED; + JSClassID callbackObjectClassId = 0; + JSClassID callbackCallableClassId = 0; + JSAtom toStringTagAtom = JS_ATOM_NULL; + JSAtom toPrimitiveAtom = JS_ATOM_NULL; + JSAtom hasInstanceAtom = JS_ATOM_NULL; + OpaqueJSValue undefinedHandle{}; + OpaqueJSValue nullHandle{}; + OpaqueJSValue trueHandle{}; + OpaqueJSValue falseHandle{}; + std::vector contexts; + std::vector allHandles; + std::unordered_map objectHandles; + std::unordered_map callbackDataByPtr; + std::unordered_set activeCallbackPins; + std::vector weakRefs; + std::vector weakMaps; + std::vector> heapFinalizers; + std::vector> markingConstraints; + std::size_t extraMemorySize = 0; + bool hasTimeLimit = false; + double timeLimitSeconds = 0.0; + std::chrono::steady_clock::time_point deadline{}; + JSShouldTerminateCallback terminateCallback = nullptr; + void* terminateContext = nullptr; + OpaqueJSContext* activeContext = nullptr; + bool inGarbageCollect = false; + bool shuttingDown = false; + + OpaqueJSContextGroup(); + ~OpaqueJSContextGroup(); + + OpaqueJSContext* DefaultContext() const; + OpaqueJSValue* ToHandle(OpaqueJSContext* ctx, JSValue v); + OpaqueJSValue* BorrowHandle(OpaqueJSContext* ctx, JSValueConst v); + CallbackObjectData* FindCallbackData(const OpaqueJSValue* handle) const; + CallbackObjectData* FindCallbackDataByPtr(void* ptr) const; + void NotifyObjectFinalized(void* ptr, OpaqueJSValue* handle); + void CollectGarbage(); + void DrainMicrotasks(OpaqueJSContext* ctx); + void RefreshDeadline(); +}; + +struct OpaqueJSContext { + std::atomic refCount{1}; + OpaqueJSContextGroup* group = nullptr; + JSContext* qctx = nullptr; + OpaqueJSValue* globalObject = nullptr; + JSValue globalExoticInterceptor = JS_UNDEFINED; + std::unordered_map classPrototypes; + OpaqueJSValue* unhandledRejectionCallback = nullptr; + std::vector> pendingUnhandledRejections; + std::string name; + bool hasName = false; + bool remoteInspectionEnabled = true; + bool includesNativeCallStack = true; + + OpaqueJSContext(OpaqueJSContextGroup* grp, OpaqueJSClass* globalObjectClass); + ~OpaqueJSContext(); +}; + +struct OpaqueJSPropertyNameArray { + std::atomic refCount{1}; + std::vector names; + + ~OpaqueJSPropertyNameArray(); +}; + +struct OpaqueJSPropertyNameAccumulator { + std::vector names; + std::unordered_set seen; + + ~OpaqueJSPropertyNameAccumulator(); + void AddName(JSStringRef name); +}; + +struct OpaqueJSScript { + std::atomic refCount{1}; + OpaqueJSContextGroup* group = nullptr; + std::string url; + int startingLineNumber = 1; + std::string source; + + ~OpaqueJSScript(); +}; + +struct OpaqueJSWeak { + std::atomic refCount{1}; + OpaqueJSContextGroup* group = nullptr; + OpaqueJSValue* object = nullptr; +}; + +struct OpaqueJSWeakObjectMap { + OpaqueJSContextGroup* group = nullptr; + void* privateData = nullptr; + JSWeakMapDestroyedCallback destroyedCallback = nullptr; + std::unordered_map entries; + + ~OpaqueJSWeakObjectMap(); +}; + +struct CallbackPinScope { + OpaqueJSContextGroup* group = nullptr; + std::vector newlyPinned; + + explicit CallbackPinScope(OpaqueJSContextGroup* grp) : group(grp) {} + void Pin(const OpaqueJSValue* val) { + if (!group || !val) return; + auto* mutVal = const_cast(val); + if (group->activeCallbackPins.insert(mutVal).second) { + newlyPinned.push_back(mutVal); + } + } + ~CallbackPinScope() { + if (!group) return; + for (auto* val : newlyPinned) { + group->activeCallbackPins.erase(val); + } + } +}; + +std::string JsStringToUtf8(const GuestJSString* str); +GuestJSString* Utf8ToJsString(const std::string& utf8); +GuestJSString* JsValueToJsString(JSContext* qctx, JSValueConst val); +JSValue JsStringToJsValue(JSContext* qctx, const GuestJSString* str); +JSAtom JsStringToAtom(JSContext* qctx, const GuestJSString* str); +GuestJSString* AtomToJsString(JSContext* qctx, JSAtom atom); +std::string AtomToUtf8(JSContext* qctx, JSAtom atom); + +void CapturePendingException(OpaqueJSContext* ctx, JSValueRef* exception); +void SetExceptionValue(OpaqueJSContext* ctx, JSValueRef* exception, JSValue excVal); +void RegisterCallbackClasses(OpaqueJSContextGroup* group); +void RunClassInitialize(OpaqueJSContext* ctx, OpaqueJSValue* objHandle, OpaqueJSClass* jsClass); +void RunClassFinalize(CallbackObjectData* data); +OpaqueJSValue* GetOrCreateClassPrototype(OpaqueJSContext* ctx, OpaqueJSClass* jsClass); +OpaqueJSValue* MakeCallbackObject(OpaqueJSContext* ctx, OpaqueJSClass* jsClass, void* data); +bool IsObjectCallable(const OpaqueJSContext* ctx, OpaqueJSValue* object); + +} // namespace NKWebKit diff --git a/core/libs/prx/libSceNKWebKit/src/JscApi.hpp b/core/libs/prx/libSceNKWebKit/src/JscApi.hpp new file mode 100644 index 0000000000..77e2db18b1 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/JscApi.hpp @@ -0,0 +1,150 @@ +#pragma once + +#include "SceTypes.hpp" +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceJsc/include/Api.hpp" +#include +#include + +namespace NKWebKit { + +struct OpaqueJSContextGroup; +struct OpaqueJSContext; +struct OpaqueJSClass; +struct OpaqueJSValue; +struct OpaqueJSPropertyNameArray; +struct OpaqueJSPropertyNameAccumulator; +struct OpaqueJSScript; +struct OpaqueJSWeak; +struct OpaqueJSWeakObjectMap; + +using JSContextGroupRef = const OpaqueJSContextGroup*; +using JSContextRef = const OpaqueJSContext*; +using JSGlobalContextRef = OpaqueJSContext*; +using JSStringRef = GuestJSString*; +using JSClassRef = OpaqueJSClass*; +using JSPropertyNameArrayRef = OpaqueJSPropertyNameArray*; +using JSPropertyNameAccumulatorRef = OpaqueJSPropertyNameAccumulator*; +using JSValueRef = const OpaqueJSValue*; +using JSObjectRef = OpaqueJSValue*; +using JSScriptRef = OpaqueJSScript*; +using JSWeakRef = OpaqueJSWeak*; +using JSWeakObjectMapRef = OpaqueJSWeakObjectMap*; +using JSChar = std::uint16_t; + +enum JSType : int { + kJSTypeUndefined = 0, + kJSTypeNull = 1, + kJSTypeBoolean = 2, + kJSTypeNumber = 3, + kJSTypeString = 4, + kJSTypeObject = 5, + kJSTypeSymbol = 6, +}; + +enum JSTypedArrayType : int { + kJSTypedArrayTypeInt8Array = 0, + kJSTypedArrayTypeInt16Array = 1, + kJSTypedArrayTypeInt32Array = 2, + kJSTypedArrayTypeUint8Array = 3, + kJSTypedArrayTypeUint8ClampedArray = 4, + kJSTypedArrayTypeUint16Array = 5, + kJSTypedArrayTypeUint32Array = 6, + kJSTypedArrayTypeFloat32Array = 7, + kJSTypedArrayTypeFloat64Array = 8, + kJSTypedArrayTypeArrayBuffer = 9, + kJSTypedArrayTypeNone = 10, + kJSTypedArrayTypeBigInt64Array = 11, + kJSTypedArrayTypeBigUint64Array = 12, +}; + +enum : unsigned { + kJSPropertyAttributeNone = 0, + kJSPropertyAttributeReadOnly = 1 << 1, + kJSPropertyAttributeDontEnum = 1 << 2, + kJSPropertyAttributeDontDelete = 1 << 3, +}; +using JSPropertyAttributes = unsigned; + +enum : unsigned { + kJSClassAttributeNone = 0, + kJSClassAttributeNoAutomaticPrototype = 1 << 1, +}; +using JSClassAttributes = unsigned; + +using JSObjectInitializeCallback = void(APS5_VABI*)(JSContextRef ctx, JSObjectRef object); +using JSObjectFinalizeCallback = void(APS5_VABI*)(JSObjectRef object); +using JSObjectHasPropertyCallback = bool(APS5_VABI*)(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName); +using JSObjectGetPropertyCallback = JSValueRef(APS5_VABI*)(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef* exception); +using JSObjectSetPropertyCallback = bool(APS5_VABI*)(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef value, JSValueRef* exception); +using JSObjectDeletePropertyCallback = bool(APS5_VABI*)(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef* exception); +using JSObjectGetPropertyNamesCallback = void(APS5_VABI*)(JSContextRef ctx, JSObjectRef object, JSPropertyNameAccumulatorRef propertyNames); +using JSObjectCallAsFunctionCallback = JSValueRef(APS5_VABI*)(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, std::size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception); +using JSObjectCallAsConstructorCallback = JSObjectRef(APS5_VABI*)(JSContextRef ctx, JSObjectRef constructor, std::size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception); +using JSObjectHasInstanceCallback = bool(APS5_VABI*)(JSContextRef ctx, JSObjectRef constructor, JSValueRef possibleInstance, JSValueRef* exception); +using JSObjectConvertToTypeCallback = JSValueRef(APS5_VABI*)(JSContextRef ctx, JSObjectRef object, JSType type, JSValueRef* exception); +using JSTypedArrayBytesDeallocator = void(APS5_VABI*)(void* bytes, void* deallocatorContext); +using JSShouldTerminateCallback = bool(APS5_VABI*)(JSContextRef ctx, void* context); +using JSHeapFinalizer = void(APS5_VABI*)(JSContextGroupRef group, void* userData); +using JSWeakMapDestroyedCallback = void(APS5_VABI*)(OpaqueJSWeakObjectMap* map, void* data); + +struct JSMarker { + bool(APS5_VABI* IsMarked)(JSMarker*, JSObjectRef); + void(APS5_VABI* Mark)(JSMarker*, JSObjectRef); +}; +using JSMarkingConstraint = void(APS5_VABI*)(JSMarker* marker, void* userData); + +struct JSStaticValue { + const char* name; + JSObjectGetPropertyCallback getProperty; + JSObjectSetPropertyCallback setProperty; + JSPropertyAttributes attributes; +}; + +struct JSStaticFunction { + const char* name; + JSObjectCallAsFunctionCallback callAsFunction; + JSPropertyAttributes attributes; +}; + +struct JSClassDefinition { + int version; + JSClassAttributes attributes; + const char* className; + JSClassRef parentClass; + const JSStaticValue* staticValues; + const JSStaticFunction* staticFunctions; + JSObjectInitializeCallback initialize; + JSObjectFinalizeCallback finalize; + JSObjectHasPropertyCallback hasProperty; + JSObjectGetPropertyCallback getProperty; + JSObjectSetPropertyCallback setProperty; + JSObjectDeletePropertyCallback deleteProperty; + JSObjectGetPropertyNamesCallback getPropertyNames; + JSObjectCallAsFunctionCallback callAsFunction; + JSObjectCallAsConstructorCallback callAsConstructor; + JSObjectHasInstanceCallback hasInstance; + JSObjectConvertToTypeCallback convertToType; +}; + +inline constexpr JSClassDefinition kJSClassDefinitionEmpty = { + 0, + kJSClassAttributeNone, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, +}; + +} // namespace NKWebKit diff --git a/core/libs/prx/libSceNKWebKit/src/JscContext.cpp b/core/libs/prx/libSceNKWebKit/src/JscContext.cpp new file mode 100644 index 0000000000..aa6287285b --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/JscContext.cpp @@ -0,0 +1,1133 @@ +#include "Jsc.hpp" +#include "prx/libSceNKWebKit/include/JscExports.hpp" +#include +#include +#include +#include + +namespace NKWebKit { + +namespace { + +bool g_remoteInspectionEnabledByDefault = true; + +int InterruptHandler(JSRuntime* rt, void* opaque) { + auto* group = static_cast(opaque); + if (!group || !group->hasTimeLimit) return 0; + const auto now = std::chrono::steady_clock::now(); + if (now < group->deadline) return 0; + if (group->terminateCallback) { + OpaqueJSContext* ctx = group->activeContext ? group->activeContext : group->DefaultContext(); + if (!group->terminateCallback(ctx, group->terminateContext)) { + group->RefreshDeadline(); + return 0; + } + } + group->hasTimeLimit = false; + return 1; +} + +void PromiseRejectionTracker(JSContext* qctx, JSValueConst promise, JSValueConst reason, bool isHandled, void* opaque) { + (void)opaque; + auto* ctx = static_cast(JS_GetContextOpaque(qctx)); + if (!ctx) return; + if (!isHandled) { + ctx->pendingUnhandledRejections.emplace_back(JS_DupValue(qctx, promise), JS_DupValue(qctx, reason)); + } else { + for (auto it = ctx->pendingUnhandledRejections.begin(); it != ctx->pendingUnhandledRejections.end(); ++it) { + if (JS_IsStrictEqual(qctx, it->first, promise)) { + JS_FreeValue(qctx, it->first); + JS_FreeValue(qctx, it->second); + ctx->pendingUnhandledRejections.erase(it); + break; + } + } + } +} + +struct ActiveContextScope { + OpaqueJSContextGroup* group = nullptr; + OpaqueJSContext* previous = nullptr; + + ActiveContextScope(OpaqueJSContextGroup* grp, OpaqueJSContext* ctx) : group(grp) { + if (group) { + previous = group->activeContext; + group->activeContext = ctx; + } + } + ~ActiveContextScope() { + if (group) { + group->activeContext = previous; + } + } +}; + +struct ConstraintMarker : JSMarker { + OpaqueJSContextGroup* group = nullptr; + std::unordered_set* markedSet = nullptr; + bool changed = false; +}; + +bool APS5_VABI MarkerIsMarked(JSMarker* baseMarker, JSObjectRef object) { + auto* marker = static_cast(baseMarker); + if (!marker || !object || !object->alive) return false; + if (object->protectCount > 0) return true; + if (marker->group->activeCallbackPins.count(object) > 0) return true; + for (auto* ctx : marker->group->contexts) { + if (ctx && ctx->globalObject == object) return true; + } + return marker->markedSet && marker->markedSet->count(object) > 0; +} + +void APS5_VABI MarkerMark(JSMarker* baseMarker, JSObjectRef object) { + auto* marker = static_cast(baseMarker); + if (!marker || !object || !object->alive || !marker->markedSet) return; + if (marker->markedSet->insert(object).second) { + marker->changed = true; + } +} + +int ParseErrorLineFromStack(const std::string& stack, int fallbackLine) { + const auto colon2 = stack.rfind(':'); + if (colon2 == std::string::npos || colon2 == 0) return fallbackLine; + const auto colon1 = stack.rfind(':', colon2 - 1); + if (colon1 == std::string::npos || colon1 + 1 >= colon2) return fallbackLine; + int line = 0; + for (std::size_t i = colon1 + 1; i < colon2; ++i) { + if (stack[i] < '0' || stack[i] > '9') return fallbackLine; + line = line * 10 + (stack[i] - '0'); + } + return line > 0 ? line : fallbackLine; +} + +JSScriptRef CreateScriptInternal(OpaqueJSContextGroup* group, JSStringRef url, int startingLineNumber, const char* source, std::size_t length, JSStringRef* errorMessage, int* errorLine) { + if (!group) return nullptr; + const int clampedLine = startingLineNumber <= 0 ? 1 : startingLineNumber; + const std::string urlStr = url ? JsStringToUtf8(url) : std::string(); + std::string sourceCopy(source ? source : "", length); + JSContext* qctx = group->DefaultContext() ? group->DefaultContext()->qctx : group->utilityCtx; + JSEvalOptions options{}; + options.version = JS_EVAL_OPTIONS_VERSION; + options.eval_flags = JS_EVAL_TYPE_GLOBAL | JS_EVAL_FLAG_COMPILE_ONLY; + options.filename = urlStr.c_str(); + options.line_num = clampedLine; + JSValue compiled = JS_Eval2(qctx, sourceCopy.c_str(), sourceCopy.size(), &options); + if (JS_IsException(compiled)) { + JSValue exc = JS_GetException(qctx); + if (errorMessage) { + JSValue msgVal = JS_GetPropertyStr(qctx, exc, "message"); + if (JS_IsString(msgVal)) { + *errorMessage = JsValueToJsString(qctx, msgVal); + } else { + *errorMessage = JsValueToJsString(qctx, exc); + } + JS_FreeValue(qctx, msgVal); + } + if (errorLine) { + int parsedLine = clampedLine; + JSValue stackVal = JS_GetPropertyStr(qctx, exc, "stack"); + if (JS_IsString(stackVal)) { + const char* stackStr = JS_ToCString(qctx, stackVal); + if (stackStr) { + parsedLine = ParseErrorLineFromStack(stackStr, clampedLine); + JS_FreeCString(qctx, stackStr); + } + } + JS_FreeValue(qctx, stackVal); + *errorLine = parsedLine; + } + JS_FreeValue(qctx, exc); + return nullptr; + } + JS_FreeValue(qctx, compiled); + auto* script = new OpaqueJSScript(); + group->refCount.fetch_add(1, std::memory_order_relaxed); + script->group = group; + script->url = urlStr; + script->startingLineNumber = clampedLine; + script->source = std::move(sourceCopy); + return script; +} + +} // namespace + +std::string JsStringToUtf8(const GuestJSString* str) { + if (!str || str->nullString) return {}; + const std::size_t maxLen = JSStringGetMaximumUTF8CStringSize_nid_postfix(str); + if (maxLen == 0) return {}; + std::string buffer(maxLen, '\0'); + const std::size_t written = JSStringGetUTF8CString_nid_postfix(str, buffer.data(), buffer.size()); + if (written == 0) return {}; + buffer.resize(written - 1); + return buffer; +} + +GuestJSString* Utf8ToJsString(const std::string& utf8) { + return JSStringCreateWithUTF8CString_nid_postfix(utf8.c_str()); +} + +GuestJSString* JsValueToJsString(JSContext* qctx, JSValueConst val) { + JSValue strVal = JS_IsString(val) ? JS_DupValue(qctx, val) : JS_ToString(qctx, val); + if (JS_IsException(strVal)) return nullptr; + std::size_t len = 0; + const std::uint16_t* chars = JS_ToCStringLenUTF16(qctx, &len, strVal); + if (!chars) { + JS_FreeValue(qctx, strVal); + return nullptr; + } + GuestJSString* result = JSStringCreateWithCharacters_nid_postfix(chars, len); + JS_FreeCStringUTF16(qctx, chars); + JS_FreeValue(qctx, strVal); + return result; +} + +JSValue JsStringToJsValue(JSContext* qctx, const GuestJSString* str) { + if (!str || str->nullString) return JS_NewStringLen(qctx, "", 0); + const std::size_t len = JSStringGetLength_nid_postfix(str); + const std::uint16_t* chars = JSStringGetCharactersPtr_nid_postfix(str); + if (!chars || len == 0) return JS_NewStringLen(qctx, "", 0); + return JS_NewStringUTF16(qctx, chars, len); +} + +JSAtom JsStringToAtom(JSContext* qctx, const GuestJSString* str) { + JSValue val = JsStringToJsValue(qctx, str); + if (JS_IsException(val)) return JS_ATOM_NULL; + JSAtom atom = JS_ValueToAtom(qctx, val); + JS_FreeValue(qctx, val); + return atom; +} + +GuestJSString* AtomToJsString(JSContext* qctx, JSAtom atom) { + JSValue strVal = JS_AtomToString(qctx, atom); + if (JS_IsException(strVal)) return nullptr; + GuestJSString* res = JsValueToJsString(qctx, strVal); + JS_FreeValue(qctx, strVal); + return res; +} + +std::string AtomToUtf8(JSContext* qctx, JSAtom atom) { + std::size_t len = 0; + const char* cstr = JS_AtomToCStringLen(qctx, &len, atom); + if (!cstr) return {}; + std::string res(cstr, len); + JS_FreeCString(qctx, cstr); + return res; +} + +void CapturePendingException(OpaqueJSContext* ctx, JSValueRef* exception) { + if (!ctx || !ctx->qctx) return; + JSValue exc = JS_GetException(ctx->qctx); + if (JS_IsNull(exc) || JS_IsUndefined(exc)) { + JS_FreeValue(ctx->qctx, exc); + return; + } + if (JS_IsUncatchableError(exc)) { + JS_ClearUncatchableError(ctx->qctx, exc); + } + if (exception) { + *exception = ctx->group->ToHandle(ctx, exc); + } else { + JS_FreeValue(ctx->qctx, exc); + } +} + +void SetExceptionValue(OpaqueJSContext* ctx, JSValueRef* exception, JSValue excVal) { + if (!ctx || !ctx->qctx) return; + if (exception) { + *exception = ctx->group->ToHandle(ctx, excVal); + } else { + JS_FreeValue(ctx->qctx, excVal); + } +} + +OpaqueJSContextGroup::OpaqueJSContextGroup() { + rt = JS_NewRuntime(); + JS_SetRuntimeOpaque(rt, this); + JS_SetMaxStackSize(rt, 0); + JS_SetGCThreshold(rt, static_cast(-1)); + JS_SetInterruptHandler(rt, &InterruptHandler, this); + JS_SetHostPromiseRejectionTracker(rt, &PromiseRejectionTracker, this); + + utilityCtx = JS_NewContext(rt); + JSValue globalObj = JS_GetGlobalObject(utilityCtx); + weakRefCtor = JS_GetPropertyStr(utilityCtx, globalObj, "WeakRef"); + JSValue weakRefProto = JS_GetPropertyStr(utilityCtx, weakRefCtor, "prototype"); + weakRefDerefFunc = JS_GetPropertyStr(utilityCtx, weakRefProto, "deref"); + JSValue symbolCtor = JS_GetPropertyStr(utilityCtx, globalObj, "Symbol"); + JSValue toStringTagSym = JS_GetPropertyStr(utilityCtx, symbolCtor, "toStringTag"); + JSValue toPrimitiveSym = JS_GetPropertyStr(utilityCtx, symbolCtor, "toPrimitive"); + JSValue hasInstanceSym = JS_GetPropertyStr(utilityCtx, symbolCtor, "hasInstance"); + toStringTagAtom = JS_ValueToAtom(utilityCtx, toStringTagSym); + toPrimitiveAtom = JS_ValueToAtom(utilityCtx, toPrimitiveSym); + hasInstanceAtom = JS_ValueToAtom(utilityCtx, hasInstanceSym); + JS_FreeValue(utilityCtx, toStringTagSym); + JS_FreeValue(utilityCtx, toPrimitiveSym); + JS_FreeValue(utilityCtx, hasInstanceSym); + JS_FreeValue(utilityCtx, symbolCtor); + JS_FreeValue(utilityCtx, weakRefProto); + JS_FreeValue(utilityCtx, globalObj); + + undefinedHandle.group = this; + undefinedHandle.qval = JS_UNDEFINED; + nullHandle.group = this; + nullHandle.qval = JS_NULL; + trueHandle.group = this; + trueHandle.qval = JS_TRUE; + falseHandle.group = this; + falseHandle.qval = JS_FALSE; + + RegisterCallbackClasses(this); +} + +OpaqueJSContextGroup::~OpaqueJSContextGroup() { + shuttingDown = true; + for (auto* handle : allHandles) { + if (!handle) continue; + if (!JS_IsUndefined(handle->qweak)) { + JS_FreeValueRT(rt, handle->qweak); + handle->qweak = JS_UNDEFINED; + } + if (handle->ephemeralPinned) { + handle->ephemeralPinned = false; + JS_FreeValueRT(rt, handle->qval); + } + handle->alive = false; + } + for (auto& [ptr, data] : callbackDataByPtr) { + if (!data) continue; + RunClassFinalize(data); + if (!JS_IsUndefined(data->propStore)) { + JS_FreeValueRT(rt, data->propStore); + data->propStore = JS_UNDEFINED; + } + for (auto& [k, slot] : data->privateProperties) { + if (!JS_IsUndefined(slot.strongVal)) { + JS_FreeValueRT(rt, slot.strongVal); + slot.strongVal = JS_UNDEFINED; + } + } + data->privateProperties.clear(); + } + if (toStringTagAtom != JS_ATOM_NULL) JS_FreeAtomRT(rt, toStringTagAtom); + if (toPrimitiveAtom != JS_ATOM_NULL) JS_FreeAtomRT(rt, toPrimitiveAtom); + if (hasInstanceAtom != JS_ATOM_NULL) JS_FreeAtomRT(rt, hasInstanceAtom); + if (!JS_IsUndefined(weakRefDerefFunc)) JS_FreeValueRT(rt, weakRefDerefFunc); + if (!JS_IsUndefined(weakRefCtor)) JS_FreeValueRT(rt, weakRefCtor); + if (utilityCtx) { + JS_FreeContext(utilityCtx); + utilityCtx = nullptr; + } + if (rt) { + JS_FreeRuntime(rt); + rt = nullptr; + } + for (auto& [ptr, data] : callbackDataByPtr) { + delete data; + } + callbackDataByPtr.clear(); + for (auto* handle : allHandles) { + delete handle; + } + allHandles.clear(); +} + +OpaqueJSContext* OpaqueJSContextGroup::DefaultContext() const { + return contexts.empty() ? nullptr : contexts.front(); +} + +OpaqueJSValue* OpaqueJSContextGroup::ToHandle(OpaqueJSContext* ctx, JSValue v) { + const int tag = JS_VALUE_GET_NORM_TAG(v); + if (tag == JS_TAG_UNDEFINED) return &undefinedHandle; + if (tag == JS_TAG_NULL) return &nullHandle; + if (tag == JS_TAG_BOOL) return JS_VALUE_GET_BOOL(v) ? &trueHandle : &falseHandle; + if (tag == JS_TAG_OBJECT) { + void* ptr = JS_VALUE_GET_PTR(v); + auto it = objectHandles.find(ptr); + if (it != objectHandles.end() && it->second && it->second->alive) { + OpaqueJSValue* existing = it->second; + if (!existing->ephemeralPinned) { + existing->qval = v; + existing->ephemeralPinned = true; + } else { + JS_FreeValueRT(rt, v); + } + if (!existing->ctx && ctx) existing->ctx = ctx; + return existing; + } + auto* handle = new OpaqueJSValue(); + handle->group = this; + handle->ctx = ctx ? ctx : DefaultContext(); + handle->qval = v; + handle->objPtr = ptr; + handle->ephemeralPinned = true; + handle->alive = true; + handle->isObjectHandle = true; + if (!JS_IsUndefined(weakRefCtor) && utilityCtx) { + JSValueConst arg = v; + JSValue w = JS_CallConstructor(utilityCtx, weakRefCtor, 1, &arg); + if (!JS_IsException(w)) { + handle->qweak = w; + } else { + JS_FreeValue(utilityCtx, JS_GetException(utilityCtx)); + } + } + objectHandles[ptr] = handle; + allHandles.push_back(handle); + return handle; + } + auto* handle = new OpaqueJSValue(); + handle->group = this; + handle->ctx = ctx ? ctx : DefaultContext(); + handle->qval = v; + handle->ephemeralPinned = true; + handle->alive = true; + handle->isObjectHandle = false; + allHandles.push_back(handle); + return handle; +} + +OpaqueJSValue* OpaqueJSContextGroup::BorrowHandle(OpaqueJSContext* ctx, JSValueConst v) { + return ToHandle(ctx, JS_DupValueRT(rt, v)); +} + +CallbackObjectData* OpaqueJSContextGroup::FindCallbackData(const OpaqueJSValue* handle) const { + if (!handle || !handle->alive || !handle->isObjectHandle) return nullptr; + return FindCallbackDataByPtr(handle->objPtr); +} + +CallbackObjectData* OpaqueJSContextGroup::FindCallbackDataByPtr(void* ptr) const { + if (!ptr) return nullptr; + auto it = callbackDataByPtr.find(ptr); + return it != callbackDataByPtr.end() ? it->second : nullptr; +} + +void OpaqueJSContextGroup::NotifyObjectFinalized(void* ptr, OpaqueJSValue* handle) { + if (handle) { + handle->alive = false; + handle->ephemeralPinned = false; + handle->qval = JS_UNDEFINED; + if (!JS_IsUndefined(handle->qweak) && !shuttingDown) { + JS_FreeValueRT(rt, handle->qweak); + handle->qweak = JS_UNDEFINED; + } + for (auto* weak : weakRefs) { + if (weak && weak->object == handle) { + weak->object = nullptr; + } + } + for (auto* map : weakMaps) { + if (!map) continue; + for (auto it = map->entries.begin(); it != map->entries.end();) { + if (it->second == handle) { + it = map->entries.erase(it); + } else { + ++it; + } + } + } + for (auto* ctx : contexts) { + if (!ctx) continue; + for (auto it = ctx->classPrototypes.begin(); it != ctx->classPrototypes.end();) { + if (it->second == handle) { + it = ctx->classPrototypes.erase(it); + } else { + ++it; + } + } + } + } + if (ptr) { + objectHandles.erase(ptr); + } +} + +void OpaqueJSContextGroup::CollectGarbage() { + if (inGarbageCollect || shuttingDown) return; + inGarbageCollect = true; + + std::unordered_set constraintMarked; + if (!markingConstraints.empty()) { + ConstraintMarker marker{}; + marker.IsMarked = &MarkerIsMarked; + marker.Mark = &MarkerMark; + marker.group = this; + marker.markedSet = &constraintMarked; + do { + marker.changed = false; + const auto constraintsCopy = markingConstraints; + for (const auto& [fn, userData] : constraintsCopy) { + if (fn) fn(&marker, userData); + } + } while (marker.changed); + } + + std::vector candidates; + candidates.reserve(objectHandles.size()); + for (const auto& [ptr, handle] : objectHandles) { + if (!handle || !handle->alive || !handle->isObjectHandle || !handle->ephemeralPinned) continue; + if (handle->protectCount > 0) continue; + if (activeCallbackPins.count(handle) > 0) continue; + if (constraintMarked.count(handle) > 0) continue; + bool isGlobal = false; + for (auto* ctx : contexts) { + if (ctx && (ctx->globalObject == handle || ctx->unhandledRejectionCallback == handle)) { + isGlobal = true; + break; + } + } + if (isGlobal) continue; + candidates.push_back(handle); + } + + for (auto* handle : candidates) { + if (!handle->alive || !handle->ephemeralPinned) continue; + handle->ephemeralPinned = false; + JS_FreeValueRT(rt, handle->qval); + } + + JS_RunGC(rt); + + for (auto* handle : candidates) { + if (!handle->alive) continue; + if (JS_IsUndefined(handle->qweak)) { + NotifyObjectFinalized(handle->objPtr, handle); + continue; + } + JSValue derefVal = JS_Call(utilityCtx, weakRefDerefFunc, handle->qweak, 0, nullptr); + if (JS_IsException(derefVal) || JS_IsUndefined(derefVal)) { + if (JS_IsException(derefVal)) { + JS_FreeValue(utilityCtx, JS_GetException(utilityCtx)); + } + NotifyObjectFinalized(handle->objPtr, handle); + } else { + handle->qval = derefVal; + handle->ephemeralPinned = true; + } + } + + const auto finalizersCopy = heapFinalizers; + for (const auto& [fn, userData] : finalizersCopy) { + if (fn) fn(this, userData); + } + + inGarbageCollect = false; +} + +void OpaqueJSContextGroup::DrainMicrotasks(OpaqueJSContext* ctx) { + JSContext* jobCtx = nullptr; + while (JS_IsJobPending(rt)) { + if (JS_ExecutePendingJob(rt, &jobCtx) < 0) { + if (jobCtx) { + JS_FreeValue(jobCtx, JS_GetException(jobCtx)); + } + } + } + if (ctx && !ctx->pendingUnhandledRejections.empty()) { + auto rejections = std::move(ctx->pendingUnhandledRejections); + ctx->pendingUnhandledRejections.clear(); + for (auto& [promiseVal, reasonVal] : rejections) { + if (ctx->unhandledRejectionCallback && ctx->unhandledRejectionCallback->alive) { + JSValueConst args[2] = {promiseVal, reasonVal}; + JSValue res = JS_Call(ctx->qctx, ctx->unhandledRejectionCallback->qval, ctx->globalObject->qval, 2, args); + JS_FreeValue(ctx->qctx, res); + if (JS_HasException(ctx->qctx)) { + JS_FreeValue(ctx->qctx, JS_GetException(ctx->qctx)); + } + } + JS_FreeValue(ctx->qctx, promiseVal); + JS_FreeValue(ctx->qctx, reasonVal); + } + } +} + +void OpaqueJSContextGroup::RefreshDeadline() { + if (timeLimitSeconds <= 0.0) { + deadline = std::chrono::steady_clock::now(); + } else { + deadline = std::chrono::steady_clock::now() + std::chrono::duration_cast(std::chrono::duration(timeLimitSeconds)); + } +} + +OpaqueJSContext::OpaqueJSContext(OpaqueJSContextGroup* grp, OpaqueJSClass* globalObjectClass) + : group(grp), remoteInspectionEnabled(g_remoteInspectionEnabledByDefault) { + group->refCount.fetch_add(1, std::memory_order_relaxed); + qctx = JS_NewContext(group->rt); + JS_SetContextOpaque(qctx, this); + group->contexts.push_back(this); + + JSValue rawGlobal = JS_GetGlobalObject(qctx); + JSValue objCtor = JS_GetPropertyStr(qctx, rawGlobal, "Object"); + JSValue objProto = JS_GetPropertyStr(qctx, objCtor, "prototype"); + JS_FreeValue(qctx, objCtor); + JS_SetClassProto(qctx, group->callbackObjectClassId, JS_DupValue(qctx, objProto)); + JS_SetClassProto(qctx, group->callbackCallableClassId, objProto); + globalObject = group->ToHandle(this, rawGlobal); + + if (globalObjectClass) { + auto* data = new CallbackObjectData(); + data->group = group; + data->ctx = this; + data->handle = globalObject; + globalObjectClass->refCount.fetch_add(1, std::memory_order_relaxed); + data->jsClass = globalObjectClass; + data->propStore = JS_NewObjectProto(qctx, JS_NULL); + group->callbackDataByPtr[globalObject->objPtr] = data; + + globalExoticInterceptor = JS_NewObjectClass(qctx, group->callbackObjectClassId); + void* interceptorPtr = JS_VALUE_GET_PTR(globalExoticInterceptor); + auto* interceptorData = new CallbackObjectData(); + interceptorData->group = group; + interceptorData->ctx = this; + interceptorData->handle = globalObject; + globalObjectClass->refCount.fetch_add(1, std::memory_order_relaxed); + interceptorData->jsClass = globalObjectClass; + interceptorData->isGlobalInterceptor = true; + JS_SetOpaque(globalExoticInterceptor, interceptorData); + group->callbackDataByPtr[interceptorPtr] = interceptorData; + + OpaqueJSValue* classProto = GetOrCreateClassPrototype(this, globalObjectClass); + if (classProto && classProto->alive) { + JS_SetPrototype(qctx, globalExoticInterceptor, classProto->qval); + } + JS_SetPrototype(qctx, globalObject->qval, globalExoticInterceptor); + + RunClassInitialize(this, globalObject, globalObjectClass); + } +} + +OpaqueJSContext::~OpaqueJSContext() { + for (auto& [promiseVal, reasonVal] : pendingUnhandledRejections) { + JS_FreeValue(qctx, promiseVal); + JS_FreeValue(qctx, reasonVal); + } + pendingUnhandledRejections.clear(); + + if (globalObject) { + if (auto* data = group->FindCallbackData(globalObject)) { + RunClassFinalize(data); + } + } + if (!JS_IsUndefined(globalExoticInterceptor)) { + void* interceptorPtr = JS_VALUE_GET_PTR(globalExoticInterceptor); + if (auto* interceptorData = group->FindCallbackDataByPtr(interceptorPtr)) { + if (interceptorData->jsClass) { + if (interceptorData->jsClass->refCount.fetch_sub(1, std::memory_order_acq_rel) == 1) { + interceptorData->jsClass->DestroyInPlace(); + delete interceptorData->jsClass; + } + interceptorData->jsClass = nullptr; + } + interceptorData->finalized = true; + } + JS_FreeValue(qctx, globalExoticInterceptor); + globalExoticInterceptor = JS_UNDEFINED; + } + + auto it = std::find(group->contexts.begin(), group->contexts.end(), this); + if (it != group->contexts.end()) { + group->contexts.erase(it); + } + if (qctx) { + JS_FreeContext(qctx); + qctx = nullptr; + } + if (group->refCount.fetch_sub(1, std::memory_order_acq_rel) == 1) { + delete group; + } +} + +OpaqueJSPropertyNameArray::~OpaqueJSPropertyNameArray() { + for (auto* str : names) { + if (str) JSStringRelease_nid_postfix(str); + } +} + +OpaqueJSPropertyNameAccumulator::~OpaqueJSPropertyNameAccumulator() { + for (auto* str : names) { + if (str) JSStringRelease_nid_postfix(str); + } +} + +void OpaqueJSPropertyNameAccumulator::AddName(JSStringRef name) { + if (!name) return; + const std::string utf8 = JsStringToUtf8(name); + if (seen.insert(utf8).second) { + names.push_back(JSStringRetain_nid_postfix(name)); + } +} + +OpaqueJSScript::~OpaqueJSScript() { + if (group) { + if (group->refCount.fetch_sub(1, std::memory_order_acq_rel) == 1) { + delete group; + } + } +} + +OpaqueJSWeakObjectMap::~OpaqueJSWeakObjectMap() { + if (destroyedCallback) { + destroyedCallback(this, privateData); + } + if (group) { + auto it = std::find(group->weakMaps.begin(), group->weakMaps.end(), this); + if (it != group->weakMaps.end()) { + group->weakMaps.erase(it); + } + } +} + +} // namespace NKWebKit + +extern "C" { +using namespace NKWebKit; + +JSContextGroupRef APS5_VABI JSContextGroupCreate() { + return new OpaqueJSContextGroup(); +} + +JSContextGroupRef APS5_VABI JSContextGroupRetain(JSContextGroupRef group) { + if (!group) return nullptr; + const_cast(group)->refCount.fetch_add(1, std::memory_order_relaxed); + return group; +} + +void APS5_VABI JSContextGroupRelease(JSContextGroupRef group) { + if (!group) return; + auto* mutGroup = const_cast(group); + if (mutGroup->refCount.fetch_sub(1, std::memory_order_acq_rel) == 1) { + delete mutGroup; + } +} + +void APS5_VABI JSContextGroupSetExecutionTimeLimit(JSContextGroupRef group, double limit, JSShouldTerminateCallback callback, void* callbackContext) { + if (!group) return; + auto* mutGroup = const_cast(group); + mutGroup->timeLimitSeconds = limit; + mutGroup->terminateCallback = callback; + mutGroup->terminateContext = callbackContext; + mutGroup->hasTimeLimit = true; + mutGroup->RefreshDeadline(); +} + +void APS5_VABI JSContextGroupClearExecutionTimeLimit(JSContextGroupRef group) { + if (!group) return; + auto* mutGroup = const_cast(group); + mutGroup->hasTimeLimit = false; + mutGroup->terminateCallback = nullptr; + mutGroup->terminateContext = nullptr; +} + +void APS5_VABI JSContextGroupAddHeapFinalizer(JSContextGroupRef group, JSHeapFinalizer finalizer, void* userData) { + if (!group || !finalizer) return; + auto* mutGroup = const_cast(group); + const std::pair entry{finalizer, userData}; + if (std::find(mutGroup->heapFinalizers.begin(), mutGroup->heapFinalizers.end(), entry) == mutGroup->heapFinalizers.end()) { + mutGroup->heapFinalizers.push_back(entry); + } +} + +void APS5_VABI JSContextGroupRemoveHeapFinalizer(JSContextGroupRef group, JSHeapFinalizer finalizer, void* userData) { + if (!group || !finalizer) return; + auto* mutGroup = const_cast(group); + const std::pair entry{finalizer, userData}; + auto it = std::find(mutGroup->heapFinalizers.begin(), mutGroup->heapFinalizers.end(), entry); + if (it != mutGroup->heapFinalizers.end()) { + mutGroup->heapFinalizers.erase(it); + } +} + +void APS5_VABI JSContextGroupAddMarkingConstraint(JSContextGroupRef group, JSMarkingConstraint constraintFunction, void* userData) { + if (!group || !constraintFunction) return; + auto* mutGroup = const_cast(group); + mutGroup->markingConstraints.emplace_back(constraintFunction, userData); +} + +void APS5_VABI JSGarbageCollect(JSContextRef ctx) { + if (!ctx || !ctx->group) return; + ctx->group->CollectGarbage(); +} + +void APS5_VABI JSSynchronousGarbageCollectForDebugging(JSContextRef ctx) { + if (!ctx || !ctx->group) return; + ctx->group->CollectGarbage(); +} + +void APS5_VABI JSSynchronousEdenCollectForDebugging(JSContextRef ctx) { + if (!ctx || !ctx->group) return; + ctx->group->CollectGarbage(); +} + +void APS5_VABI JSReportExtraMemoryCost(JSContextRef ctx, std::size_t size) { + if (!ctx || !ctx->group) return; + ctx->group->extraMemorySize += size; +} + +void APS5_VABI JSDisableGCTimer() { +} + +JSObjectRef APS5_VABI JSGetMemoryUsageStatistics(JSContextRef ctx) { + if (!ctx || !ctx->group) return nullptr; + auto* mutCtx = const_cast(ctx); + OpaqueJSContextGroup* group = mutCtx->group; + JSMemoryUsage usage{}; + JS_ComputeMemoryUsage(group->rt, &usage); + + std::size_t protectedObjects = 0; + std::size_t protectedGlobals = 0; + std::unordered_map typeCounts; + + for (const auto& [ptr, handle] : group->objectHandles) { + if (!handle || !handle->alive) continue; + if (handle->protectCount > 0) { + ++protectedObjects; + } + std::string className = "Object"; + if (auto* cbData = group->FindCallbackData(handle)) { + if (cbData->jsClass && !cbData->jsClass->className.empty()) { + className = cbData->jsClass->className; + } + } else if (JS_IsArray(handle->qval)) { + className = "Array"; + } else if (JS_IsFunction(mutCtx->qctx, handle->qval)) { + className = "Function"; + } + ++typeCounts[className]; + } + for (auto* c : group->contexts) { + if (c && c->globalObject && c->globalObject->protectCount > 0) { + ++protectedGlobals; + } + } + + JSValue statsObj = JS_NewObject(mutCtx->qctx); + JS_DefinePropertyValueStr(mutCtx->qctx, statsObj, "heapSize", JS_NewFloat64(mutCtx->qctx, static_cast(usage.memory_used_size)), JS_PROP_C_W_E); + JS_DefinePropertyValueStr(mutCtx->qctx, statsObj, "heapCapacity", JS_NewFloat64(mutCtx->qctx, static_cast(usage.malloc_size)), JS_PROP_C_W_E); + JS_DefinePropertyValueStr(mutCtx->qctx, statsObj, "extraMemorySize", JS_NewFloat64(mutCtx->qctx, static_cast(group->extraMemorySize)), JS_PROP_C_W_E); + JS_DefinePropertyValueStr(mutCtx->qctx, statsObj, "objectCount", JS_NewFloat64(mutCtx->qctx, static_cast(usage.obj_count)), JS_PROP_C_W_E); + JS_DefinePropertyValueStr(mutCtx->qctx, statsObj, "protectedObjectCount", JS_NewFloat64(mutCtx->qctx, static_cast(protectedObjects)), JS_PROP_C_W_E); + JS_DefinePropertyValueStr(mutCtx->qctx, statsObj, "globalObjectCount", JS_NewFloat64(mutCtx->qctx, static_cast(group->contexts.size())), JS_PROP_C_W_E); + JS_DefinePropertyValueStr(mutCtx->qctx, statsObj, "protectedGlobalObjectCount", JS_NewFloat64(mutCtx->qctx, static_cast(protectedGlobals)), JS_PROP_C_W_E); + + JSValue typeCountsObj = JS_NewObject(mutCtx->qctx); + for (const auto& [typeName, count] : typeCounts) { + JS_DefinePropertyValueStr(mutCtx->qctx, typeCountsObj, typeName.c_str(), JS_NewFloat64(mutCtx->qctx, static_cast(count)), JS_PROP_C_W_E); + } + JS_DefinePropertyValueStr(mutCtx->qctx, statsObj, "objectTypeCounts", typeCountsObj, JS_PROP_C_W_E); + + return group->ToHandle(mutCtx, statsObj); +} + +JSGlobalContextRef APS5_VABI JSGlobalContextCreateInGroup(JSContextGroupRef group, JSClassRef globalObjectClass) { + OpaqueJSContextGroup* mutGroup = const_cast(group); + bool createdGroup = false; + if (!mutGroup) { + mutGroup = new OpaqueJSContextGroup(); + createdGroup = true; + } + auto* ctx = new OpaqueJSContext(mutGroup, globalObjectClass); + if (createdGroup) { + JSContextGroupRelease(mutGroup); + } + return ctx; +} + +JSGlobalContextRef APS5_VABI JSGlobalContextCreate(JSClassRef globalObjectClass) { + return JSGlobalContextCreateInGroup(nullptr, globalObjectClass); +} + +JSGlobalContextRef APS5_VABI JSGlobalContextRetain(JSGlobalContextRef ctx) { + if (!ctx) return nullptr; + ctx->refCount.fetch_add(1, std::memory_order_relaxed); + return ctx; +} + +void APS5_VABI JSGlobalContextRelease(JSGlobalContextRef ctx) { + if (!ctx) return; + if (ctx->refCount.fetch_sub(1, std::memory_order_acq_rel) == 1) { + delete ctx; + } +} + +JSObjectRef APS5_VABI JSContextGetGlobalObject(JSContextRef ctx) { + if (!ctx) return nullptr; + return ctx->globalObject; +} + +JSContextGroupRef APS5_VABI JSContextGetGroup(JSContextRef ctx) { + if (!ctx) return nullptr; + return ctx->group; +} + +JSGlobalContextRef APS5_VABI JSContextGetGlobalContext(JSContextRef ctx) { + if (!ctx) return nullptr; + return const_cast(ctx); +} + +JSStringRef APS5_VABI JSGlobalContextCopyName(JSGlobalContextRef ctx) { + if (!ctx || !ctx->hasName) return nullptr; + return Utf8ToJsString(ctx->name); +} + +void APS5_VABI JSGlobalContextSetName(JSGlobalContextRef ctx, JSStringRef name) { + if (!ctx) return; + if (name && !name->nullString) { + ctx->hasName = true; + ctx->name = JsStringToUtf8(name); + } else { + ctx->hasName = false; + ctx->name.clear(); + } +} + +bool APS5_VABI JSGlobalContextGetRemoteInspectionEnabled(JSGlobalContextRef ctx) { + if (!ctx) return false; + return ctx->remoteInspectionEnabled; +} + +void APS5_VABI JSGlobalContextSetRemoteInspectionEnabled(JSGlobalContextRef ctx, bool enabled) { + if (!ctx) return; + ctx->remoteInspectionEnabled = enabled; +} + +bool APS5_VABI JSGlobalContextGetIncludesNativeCallStackWhenReportingExceptions(JSGlobalContextRef ctx) { + if (!ctx) return false; + return ctx->includesNativeCallStack; +} + +void APS5_VABI JSGlobalContextSetIncludesNativeCallStackWhenReportingExceptions(JSGlobalContextRef ctx, bool includesNativeCallStack) { + if (!ctx) return; + ctx->includesNativeCallStack = includesNativeCallStack; +} + +void APS5_VABI JSGlobalContextSetUnhandledRejectionCallback(JSGlobalContextRef ctx, JSObjectRef function, JSValueRef* exception) { + if (!ctx) return; + if (!IsObjectCallable(ctx, function)) { + if (exception) { + JSValue err = JS_NewTypeError(ctx->qctx, "Unhandled rejection callback must be a function"); + *exception = ctx->group->ToHandle(ctx, err); + } + return; + } + ctx->unhandledRejectionCallback = function; +} + +bool APS5_VABI JSRemoteInspectorGetInspectionEnabledByDefault() { + return g_remoteInspectionEnabledByDefault; +} + +void APS5_VABI JSRemoteInspectorSetInspectionEnabledByDefault(bool enabledByDefault) { + g_remoteInspectionEnabledByDefault = enabledByDefault; +} + +JSValueRef APS5_VABI JSEvaluateScript(JSContextRef ctx, JSStringRef script, JSObjectRef thisObject, JSStringRef sourceURL, int startingLineNumber, JSValueRef* exception) { + if (!ctx || !script) return nullptr; + auto* mutCtx = const_cast(ctx); + ActiveContextScope activeScope(mutCtx->group, mutCtx); + if (mutCtx->group->hasTimeLimit) { + mutCtx->group->RefreshDeadline(); + } + + const std::string code = JsStringToUtf8(script); + const std::string url = sourceURL ? JsStringToUtf8(sourceURL) : std::string(); + const int clampedLine = startingLineNumber <= 0 ? 1 : startingLineNumber; + + JSEvalOptions options{}; + options.version = JS_EVAL_OPTIONS_VERSION; + options.eval_flags = JS_EVAL_TYPE_GLOBAL; + options.filename = url.c_str(); + options.line_num = clampedLine; + + JSValue result; + if (thisObject && thisObject->alive && thisObject != mutCtx->globalObject) { + result = JS_EvalThis2(mutCtx->qctx, thisObject->qval, code.c_str(), code.size(), &options); + } else { + result = JS_Eval2(mutCtx->qctx, code.c_str(), code.size(), &options); + } + + if (JS_IsException(result)) { + CapturePendingException(mutCtx, exception); + mutCtx->group->DrainMicrotasks(mutCtx); + return nullptr; + } + + OpaqueJSValue* resultHandle = mutCtx->group->ToHandle(mutCtx, result); + mutCtx->group->DrainMicrotasks(mutCtx); + return resultHandle; +} + +bool APS5_VABI JSCheckScriptSyntax(JSContextRef ctx, JSStringRef script, JSStringRef sourceURL, int startingLineNumber, JSValueRef* exception) { + if (!ctx || !script) return false; + auto* mutCtx = const_cast(ctx); + const std::string code = JsStringToUtf8(script); + const std::string url = sourceURL ? JsStringToUtf8(sourceURL) : std::string(); + const int clampedLine = startingLineNumber <= 0 ? 1 : startingLineNumber; + + JSEvalOptions options{}; + options.version = JS_EVAL_OPTIONS_VERSION; + options.eval_flags = JS_EVAL_TYPE_GLOBAL | JS_EVAL_FLAG_COMPILE_ONLY; + options.filename = url.c_str(); + options.line_num = clampedLine; + + JSValue compiled = JS_Eval2(mutCtx->qctx, code.c_str(), code.size(), &options); + if (JS_IsException(compiled)) { + CapturePendingException(mutCtx, exception); + return false; + } + JS_FreeValue(mutCtx->qctx, compiled); + return true; +} + +JSScriptRef APS5_VABI JSScriptCreateReferencingImmortalASCIIText(JSContextGroupRef group, JSStringRef url, int startingLineNumber, const char* source, std::size_t length, JSStringRef* errorMessage, int* errorLine) { + if (!group || (!source && length > 0)) return nullptr; + for (std::size_t i = 0; i < length; ++i) { + if (static_cast(source[i]) & 0x80u) { + return nullptr; + } + } + return CreateScriptInternal(const_cast(group), url, startingLineNumber, source, length, errorMessage, errorLine); +} + +JSScriptRef APS5_VABI JSScriptCreateFromString(JSContextGroupRef group, JSStringRef url, int startingLineNumber, JSStringRef source, JSStringRef* errorMessage, int* errorLine) { + if (!group || !source) return nullptr; + const std::string utf8 = JsStringToUtf8(source); + return CreateScriptInternal(const_cast(group), url, startingLineNumber, utf8.data(), utf8.size(), errorMessage, errorLine); +} + +JSValueRef APS5_VABI JSScriptEvaluate(JSContextRef ctx, JSScriptRef script, JSValueRef thisValueRef, JSValueRef* exception) { + if (!ctx || !script) return nullptr; + auto* mutCtx = const_cast(ctx); + if (script->group != mutCtx->group) return nullptr; + if (thisValueRef && (!thisValueRef->alive || !thisValueRef->isObjectHandle)) { + return nullptr; + } + + ActiveContextScope activeScope(mutCtx->group, mutCtx); + if (mutCtx->group->hasTimeLimit) { + mutCtx->group->RefreshDeadline(); + } + + JSEvalOptions options{}; + options.version = JS_EVAL_OPTIONS_VERSION; + options.eval_flags = JS_EVAL_TYPE_GLOBAL; + options.filename = script->url.c_str(); + options.line_num = script->startingLineNumber; + + JSValue result; + if (thisValueRef && thisValueRef != mutCtx->globalObject) { + result = JS_EvalThis2(mutCtx->qctx, thisValueRef->qval, script->source.c_str(), script->source.size(), &options); + } else { + result = JS_Eval2(mutCtx->qctx, script->source.c_str(), script->source.size(), &options); + } + + if (JS_IsException(result)) { + CapturePendingException(mutCtx, exception); + mutCtx->group->DrainMicrotasks(mutCtx); + return nullptr; + } + + OpaqueJSValue* resultHandle = mutCtx->group->ToHandle(mutCtx, result); + mutCtx->group->DrainMicrotasks(mutCtx); + return resultHandle; +} + +void APS5_VABI JSScriptRetain(JSScriptRef script) { + if (!script) return; + script->refCount.fetch_add(1, std::memory_order_relaxed); +} + +void APS5_VABI JSScriptRelease(JSScriptRef script) { + if (!script) return; + if (script->refCount.fetch_sub(1, std::memory_order_acq_rel) == 1) { + delete script; + } +} + +JSWeakRef APS5_VABI JSWeakCreate(JSContextGroupRef group, JSObjectRef object) { + if (!group || !object) return nullptr; + auto* mutGroup = const_cast(group); + auto* weak = new OpaqueJSWeak(); + weak->group = mutGroup; + weak->object = object->alive ? object : nullptr; + mutGroup->weakRefs.push_back(weak); + return weak; +} + +void APS5_VABI JSWeakRetain(JSWeakRef weak) { + if (!weak) return; + weak->refCount.fetch_add(1, std::memory_order_relaxed); +} + +void APS5_VABI JSWeakRelease(JSWeakRef weak) { + if (!weak) return; + if (weak->refCount.fetch_sub(1, std::memory_order_acq_rel) == 1) { + if (weak->group && !weak->group->shuttingDown) { + auto& vec = weak->group->weakRefs; + auto it = std::find(vec.begin(), vec.end(), weak); + if (it != vec.end()) { + vec.erase(it); + } + } + delete weak; + } +} + +JSObjectRef APS5_VABI JSWeakGetObject(JSWeakRef weak) { + if (!weak || !weak->object || !weak->object->alive) return nullptr; + return weak->object; +} + +void APS5_VABI JSWeakObjectMapSet(JSContextRef ctx, JSWeakObjectMapRef map, void* key, JSObjectRef object) { + if (!ctx || !map) return; + if (!object || !object->alive) { + map->entries.erase(key); + return; + } + map->entries[key] = object; +} + +JSObjectRef APS5_VABI JSWeakObjectMapGet(JSContextRef ctx, JSWeakObjectMapRef map, void* key) { + if (!ctx || !map) return nullptr; + auto it = map->entries.find(key); + if (it == map->entries.end()) return nullptr; + if (!it->second || !it->second->alive) { + map->entries.erase(it); + return nullptr; + } + return it->second; +} + +bool APS5_VABI JSWeakObjectMapRemove(JSContextRef ctx, JSWeakObjectMapRef map, void* key) { + if (!ctx || !map) return false; + auto it = map->entries.find(key); + if (it == map->entries.end()) return false; + const bool wasAlive = it->second && it->second->alive; + map->entries.erase(it); + return wasAlive; +} + +GuestJSString* APS5_VABI JSStringCreateWithCharactersNoCopy(const std::uint16_t* chars, std::size_t numChars) { + if (!chars && numChars > 0) { + throw std::invalid_argument("JSStringCreateWithCharactersNoCopy: null characters"); + } + if (!GuestJSStringValidLength(numChars)) { + throw std::length_error("JSStringCreateWithCharactersNoCopy: length above the string limit"); + } + auto string = std::make_unique(); + if (chars && numChars > 0) { + string->characters.assign(chars, chars + numChars); + } + string->characters.push_back(0); + return string.release(); +} + +void APS5_VABI _ZN14OpaqueJSStringD1Ev(GuestJSString* self) { + if (!self) return; + std::destroy_at(&self->characters); +} + +void APS5_VABI _ZN14OpaqueJSStringD2Ev(GuestJSString* self) { + if (!self) return; + std::destroy_at(&self->characters); +} + +} diff --git a/core/libs/prx/libSceNKWebKit/src/JscObject.cpp b/core/libs/prx/libSceNKWebKit/src/JscObject.cpp new file mode 100644 index 0000000000..73df9a3f57 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/JscObject.cpp @@ -0,0 +1,1925 @@ +#include "Jsc.hpp" +#include "prx/libSceNKWebKit/include/JscExports.hpp" +#include +#include +#include + +namespace NKWebKit { + +namespace { + +int ToQuickJsPropFlags(JSPropertyAttributes attributes) { + int flags = 0; + if (!(attributes & kJSPropertyAttributeReadOnly)) flags |= JS_PROP_WRITABLE; + if (!(attributes & kJSPropertyAttributeDontEnum)) flags |= JS_PROP_ENUMERABLE; + if (!(attributes & kJSPropertyAttributeDontDelete)) flags |= JS_PROP_CONFIGURABLE; + return flags; +} + +OpaqueJSValue* CoerceThisToObject(OpaqueJSContext* ctx, JSValueConst thisVal) { + if (JS_IsUndefined(thisVal) || JS_IsNull(thisVal)) { + return ctx->globalObject; + } + if (JS_IsObject(thisVal)) { + return ctx->group->BorrowHandle(ctx, thisVal); + } + JSValue boxed = JS_ToObject(ctx->qctx, thisVal); + if (JS_IsException(boxed)) { + JS_FreeValue(ctx->qctx, JS_GetException(ctx->qctx)); + return ctx->globalObject; + } + return ctx->group->ToHandle(ctx, boxed); +} + +JSValue ToPrimitiveClosure(JSContext* qctx, JSValueConst thisVal, int argc, JSValueConst* argv, int magic, void* opaque) { + (void)magic; + auto* data = static_cast(opaque); + if (!data || !data->ctx || !data->handle || !data->jsClass) return JS_UNDEFINED; + OpaqueJSContext* ctx = data->ctx; + JSType hint = kJSTypeNumber; + if (argc > 0 && JS_IsString(argv[0])) { + const char* hintStr = JS_ToCString(qctx, argv[0]); + if (hintStr) { + if (std::strcmp(hintStr, "string") == 0) { + hint = kJSTypeString; + } + JS_FreeCString(qctx, hintStr); + } + } + OpaqueJSValue* targetHandle = JS_IsObject(thisVal) ? ctx->group->BorrowHandle(ctx, thisVal) : data->handle; + CallbackPinScope pinScope(ctx->group); + pinScope.Pin(targetHandle); + for (OpaqueJSClass* cls = data->jsClass; cls; cls = cls->parentClass) { + if (cls->convertToType) { + JSValueRef exc = nullptr; + JSValueRef res = cls->convertToType(ctx, targetHandle, hint, &exc); + if (exc) { + return JS_Throw(qctx, JS_DupValue(qctx, exc->qval)); + } + if (res && res->alive) { + return JS_DupValue(qctx, res->qval); + } + } + } + return JS_UNDEFINED; +} + +JSValue HasInstanceClosure(JSContext* qctx, JSValueConst thisVal, int argc, JSValueConst* argv, int magic, void* opaque) { + (void)thisVal; + (void)magic; + auto* data = static_cast(opaque); + if (!data || !data->ctx || !data->handle || !data->jsClass) return JS_FALSE; + OpaqueJSContext* ctx = data->ctx; + JSValueConst candidateVal = argc > 0 ? argv[0] : JS_UNDEFINED; + OpaqueJSValue* candidateHandle = ctx->group->BorrowHandle(ctx, candidateVal); + CallbackPinScope pinScope(ctx->group); + pinScope.Pin(data->handle); + pinScope.Pin(candidateHandle); + for (OpaqueJSClass* cls = data->jsClass; cls; cls = cls->parentClass) { + if (cls->hasInstance) { + JSValueRef exc = nullptr; + const bool result = cls->hasInstance(ctx, data->handle, candidateHandle, &exc); + if (exc) { + return JS_Throw(qctx, JS_DupValue(qctx, exc->qval)); + } + return JS_NewBool(qctx, result); + } + } + return JS_FALSE; +} + +JSValue StaticFunctionClosure(JSContext* qctx, JSValueConst thisVal, int argc, JSValueConst* argv, int magic, void* opaque) { + (void)magic; + auto* fnPtr = reinterpret_cast(opaque); + auto* ctx = static_cast(JS_GetContextOpaque(qctx)); + if (!ctx || !fnPtr) return JS_UNDEFINED; + OpaqueJSValue* thisObj = CoerceThisToObject(ctx, thisVal); + std::vector args(static_cast(std::max(argc, 0))); + CallbackPinScope pinScope(ctx->group); + pinScope.Pin(thisObj); + for (int i = 0; i < argc; ++i) { + OpaqueJSValue* argHandle = ctx->group->BorrowHandle(ctx, argv[i]); + args[static_cast(i)] = argHandle; + pinScope.Pin(argHandle); + } + JSValueRef exc = nullptr; + JSValueRef res = fnPtr(ctx, thisObj, thisObj, args.size(), args.empty() ? nullptr : args.data(), &exc); + if (exc) { + return JS_Throw(qctx, JS_DupValue(qctx, exc->qval)); + } + if (!res || !res->alive) return JS_UNDEFINED; + return JS_DupValue(qctx, res->qval); +} + +JSValue CreateStaticFunctionObject(OpaqueJSContext* ctx, const StaticFunctionEntry& entry) { + JSValue fnObj = JS_NewCClosure( + ctx->qctx, + &StaticFunctionClosure, + entry.name.c_str(), + nullptr, + 0, + 0, + reinterpret_cast(entry.callAsFunction)); + return fnObj; +} + +int CallbackExoticGetOwnProperty(JSContext* qctx, JSPropertyDescriptor* desc, JSValueConst obj, JSAtom prop) { + auto* group = static_cast(JS_GetRuntimeOpaque(JS_GetRuntime(qctx))); + if (!group || group->shuttingDown) return 0; + CallbackObjectData* data = group->FindCallbackDataByPtr(JS_VALUE_GET_PTR(obj)); + if (!data || !data->ctx || !data->handle) return 0; + OpaqueJSContext* ctx = data->ctx; + OpaqueJSValue* targetHandle = data->handle; + + if (prop == group->toStringTagAtom) { + if (data->jsClass) { + for (OpaqueJSClass* cls = data->jsClass; cls; cls = cls->parentClass) { + if (!cls->className.empty()) { + if (desc) { + desc->flags = JS_PROP_CONFIGURABLE; + desc->value = JS_NewString(qctx, cls->className.c_str()); + desc->getter = JS_UNDEFINED; + desc->setter = JS_UNDEFINED; + } + return 1; + } + } + } + } else if (prop == group->toPrimitiveAtom) { + if (data->jsClass && data->jsClass->HasConvertToType()) { + if (desc) { + desc->flags = JS_PROP_CONFIGURABLE; + desc->value = JS_NewCClosure(qctx, &ToPrimitiveClosure, "[Symbol.toPrimitive]", nullptr, 1, 0, data); + desc->getter = JS_UNDEFINED; + desc->setter = JS_UNDEFINED; + } + return 1; + } + } else if (prop == group->hasInstanceAtom) { + if (data->jsClass && data->jsClass->HasInstanceCallback()) { + if (desc) { + desc->flags = JS_PROP_CONFIGURABLE; + desc->value = JS_NewCClosure(qctx, &HasInstanceClosure, "[Symbol.hasInstance]", nullptr, 1, 0, data); + desc->getter = JS_UNDEFINED; + desc->setter = JS_UNDEFINED; + } + return 1; + } + } + + JSValue atomVal = JS_AtomToValue(qctx, prop); + const bool isSymbol = JS_IsSymbol(atomVal); + JS_FreeValue(qctx, atomVal); + + if (!isSymbol && data->jsClass) { + const std::string propUtf8 = AtomToUtf8(qctx, prop); + JSStringRef propNameRef = nullptr; + auto getPropNameRef = [&]() -> JSStringRef { + if (!propNameRef) { + propNameRef = AtomToJsString(qctx, prop); + } + return propNameRef; + }; + + CallbackPinScope pinScope(group); + pinScope.Pin(targetHandle); + + for (OpaqueJSClass* cls = data->jsClass; cls; cls = cls->parentClass) { + if (cls->hasProperty) { + if (cls->hasProperty(ctx, targetHandle, getPropNameRef())) { + if (!desc) { + if (propNameRef) JSStringRelease_nid_postfix(propNameRef); + return 1; + } + for (OpaqueJSClass* getterCls = data->jsClass; getterCls; getterCls = getterCls->parentClass) { + if (getterCls->getProperty) { + JSValueRef exc = nullptr; + JSValueRef val = getterCls->getProperty(ctx, targetHandle, getPropNameRef(), &exc); + if (exc) { + if (propNameRef) JSStringRelease_nid_postfix(propNameRef); + JS_Throw(qctx, JS_DupValue(qctx, exc->qval)); + return -1; + } + if (val && val->alive) { + if (propNameRef) JSStringRelease_nid_postfix(propNameRef); + desc->flags = JS_PROP_WRITABLE | JS_PROP_ENUMERABLE; + desc->value = JS_DupValue(qctx, val->qval); + desc->getter = JS_UNDEFINED; + desc->setter = JS_UNDEFINED; + return 1; + } + } + } + if (propNameRef) JSStringRelease_nid_postfix(propNameRef); + JS_ThrowReferenceError(qctx, "hasProperty callback returned true for a property that doesn't exist."); + return -1; + } + } else if (cls->getProperty) { + JSValueRef exc = nullptr; + JSValueRef val = cls->getProperty(ctx, targetHandle, getPropNameRef(), &exc); + if (exc) { + if (propNameRef) JSStringRelease_nid_postfix(propNameRef); + JS_Throw(qctx, JS_DupValue(qctx, exc->qval)); + return -1; + } + if (val && val->alive) { + if (propNameRef) JSStringRelease_nid_postfix(propNameRef); + if (desc) { + desc->flags = JS_PROP_WRITABLE | JS_PROP_ENUMERABLE; + desc->value = JS_DupValue(qctx, val->qval); + desc->getter = JS_UNDEFINED; + desc->setter = JS_UNDEFINED; + } + return 1; + } + } + + if (const StaticValueEntry* sv = cls->FindStaticValue(propUtf8)) { + if (!desc) { + if (propNameRef) JSStringRelease_nid_postfix(propNameRef); + return 1; + } + for (OpaqueJSClass* svCls = cls; svCls; svCls = svCls->parentClass) { + if (const StaticValueEntry* entry = svCls->FindStaticValue(propUtf8)) { + if (entry->getProperty) { + JSValueRef exc = nullptr; + JSValueRef val = entry->getProperty(ctx, targetHandle, entry->propertyNameRef, &exc); + if (exc) { + if (propNameRef) JSStringRelease_nid_postfix(propNameRef); + JS_Throw(qctx, JS_DupValue(qctx, exc->qval)); + return -1; + } + if (val && val->alive) { + if (propNameRef) JSStringRelease_nid_postfix(propNameRef); + desc->flags = ToQuickJsPropFlags(sv->attributes); + desc->value = JS_DupValue(qctx, val->qval); + desc->getter = JS_UNDEFINED; + desc->setter = JS_UNDEFINED; + return 1; + } + } + } + } + } + + if (const StaticFunctionEntry* sf = cls->FindStaticFunction(propUtf8)) { + if (!desc) { + if (propNameRef) JSStringRelease_nid_postfix(propNameRef); + return 1; + } + if (!JS_IsUndefined(data->propStore)) { + const int ownRes = JS_GetOwnProperty(qctx, desc, data->propStore, prop); + if (ownRes != 0) { + if (propNameRef) JSStringRelease_nid_postfix(propNameRef); + return ownRes; + } + } + if (!sf->callAsFunction) { + if (propNameRef) JSStringRelease_nid_postfix(propNameRef); + JS_ThrowReferenceError(qctx, "Static function property defined with NULL callAsFunction callback."); + return -1; + } + JSValue fnObj = CreateStaticFunctionObject(ctx, *sf); + const int propFlags = ToQuickJsPropFlags(sf->attributes); + if (!JS_IsUndefined(data->propStore)) { + JS_DefinePropertyValue(qctx, data->propStore, prop, JS_DupValue(qctx, fnObj), propFlags | JS_PROP_HAS_VALUE | JS_PROP_HAS_WRITABLE | JS_PROP_HAS_ENUMERABLE | JS_PROP_HAS_CONFIGURABLE); + } + if (propNameRef) JSStringRelease_nid_postfix(propNameRef); + desc->flags = propFlags; + desc->value = fnObj; + desc->getter = JS_UNDEFINED; + desc->setter = JS_UNDEFINED; + return 1; + } + } + + if (propNameRef) JSStringRelease_nid_postfix(propNameRef); + + if (!JS_IsUndefined(data->propStore)) { + const int ownRes = JS_GetOwnProperty(qctx, desc, data->propStore, prop); + if (ownRes != 0) return ownRes; + } + + if (data->dynamicEnumeratedNames.count(propUtf8) > 0) { + if (desc) { + desc->flags = JS_PROP_C_W_E; + desc->value = JS_UNDEFINED; + desc->getter = JS_UNDEFINED; + desc->setter = JS_UNDEFINED; + } + return 1; + } + return 0; + } + + if (!JS_IsUndefined(data->propStore)) { + return JS_GetOwnProperty(qctx, desc, data->propStore, prop); + } + return 0; +} + +int CallbackExoticSetProperty(JSContext* qctx, JSValueConst obj, JSAtom prop, JSValueConst value, JSValueConst receiver, int flags) { + (void)receiver; + auto* group = static_cast(JS_GetRuntimeOpaque(JS_GetRuntime(qctx))); + if (!group || group->shuttingDown) return 0; + CallbackObjectData* data = group->FindCallbackDataByPtr(JS_VALUE_GET_PTR(obj)); + if (!data || !data->ctx || !data->handle) return 0; + OpaqueJSContext* ctx = data->ctx; + OpaqueJSValue* targetHandle = data->handle; + + JSValue atomVal = JS_AtomToValue(qctx, prop); + const bool isSymbol = JS_IsSymbol(atomVal); + JS_FreeValue(qctx, atomVal); + + if (!isSymbol && data->jsClass) { + const std::string propUtf8 = AtomToUtf8(qctx, prop); + JSStringRef propNameRef = nullptr; + auto getPropNameRef = [&]() -> JSStringRef { + if (!propNameRef) { + propNameRef = AtomToJsString(qctx, prop); + } + return propNameRef; + }; + OpaqueJSValue* valHandle = group->BorrowHandle(ctx, value); + CallbackPinScope pinScope(group); + pinScope.Pin(targetHandle); + pinScope.Pin(valHandle); + + for (OpaqueJSClass* cls = data->jsClass; cls; cls = cls->parentClass) { + if (cls->setProperty) { + JSValueRef exc = nullptr; + const bool handled = cls->setProperty(ctx, targetHandle, getPropNameRef(), valHandle, &exc); + if (exc) { + if (propNameRef) JSStringRelease_nid_postfix(propNameRef); + JS_Throw(qctx, JS_DupValue(qctx, exc->qval)); + return -1; + } + if (handled) { + if (propNameRef) JSStringRelease_nid_postfix(propNameRef); + return 1; + } + } + + if (const StaticValueEntry* sv = cls->FindStaticValue(propUtf8)) { + if (sv->attributes & kJSPropertyAttributeReadOnly) { + if (propNameRef) JSStringRelease_nid_postfix(propNameRef); + if (flags & JS_PROP_THROW) { + JS_ThrowTypeError(qctx, "Cannot assign to read only property"); + return -1; + } + return 0; + } + if (sv->setProperty) { + JSValueRef exc = nullptr; + const bool handled = sv->setProperty(ctx, targetHandle, sv->propertyNameRef, valHandle, &exc); + if (exc) { + if (propNameRef) JSStringRelease_nid_postfix(propNameRef); + JS_Throw(qctx, JS_DupValue(qctx, exc->qval)); + return -1; + } + if (handled) { + if (propNameRef) JSStringRelease_nid_postfix(propNameRef); + return 1; + } + } + } + + if (const StaticFunctionEntry* sf = cls->FindStaticFunction(propUtf8)) { + if (!JS_IsUndefined(data->propStore)) { + const int hasOwn = JS_GetOwnProperty(qctx, nullptr, data->propStore, prop); + if (hasOwn > 0) { + if (propNameRef) JSStringRelease_nid_postfix(propNameRef); + return JS_SetPropertyValue(qctx, data->propStore, JS_AtomToValue(qctx, prop), JS_DupValue(qctx, value), flags); + } + } + if (sf->attributes & kJSPropertyAttributeReadOnly) { + if (propNameRef) JSStringRelease_nid_postfix(propNameRef); + if (flags & JS_PROP_THROW) { + JS_ThrowTypeError(qctx, "Cannot assign to read only property"); + return -1; + } + return 0; + } + if (!JS_IsUndefined(data->propStore)) { + if (propNameRef) JSStringRelease_nid_postfix(propNameRef); + return JS_DefinePropertyValue(qctx, data->propStore, prop, JS_DupValue(qctx, value), JS_PROP_C_W_E | JS_PROP_HAS_VALUE | JS_PROP_HAS_WRITABLE | JS_PROP_HAS_ENUMERABLE | JS_PROP_HAS_CONFIGURABLE); + } + } + } + if (propNameRef) JSStringRelease_nid_postfix(propNameRef); + } + + if (data->isGlobalInterceptor) { + return JS_DefinePropertyValue(qctx, targetHandle->qval, prop, JS_DupValue(qctx, value), JS_PROP_C_W_E | JS_PROP_HAS_VALUE | JS_PROP_HAS_WRITABLE | JS_PROP_HAS_ENUMERABLE | JS_PROP_HAS_CONFIGURABLE); + } + + if (!JS_IsUndefined(data->propStore)) { + const int hasOwn = JS_GetOwnProperty(qctx, nullptr, data->propStore, prop); + if (hasOwn > 0) { + return JS_SetPropertyValue(qctx, data->propStore, JS_AtomToValue(qctx, prop), JS_DupValue(qctx, value), flags); + } + JSValue curProto = JS_GetPrototype(qctx, obj); + while (JS_IsObject(curProto)) { + JSPropertyDescriptor protoDesc{}; + const int protoHas = JS_GetOwnProperty(qctx, &protoDesc, curProto, prop); + if (protoHas < 0) { + JS_FreeValue(qctx, curProto); + return -1; + } + if (protoHas > 0) { + if (protoDesc.flags & JS_PROP_GETSET) { + JSValue setter = protoDesc.setter; + JS_FreeValue(qctx, protoDesc.getter); + JS_FreeValue(qctx, protoDesc.value); + JS_FreeValue(qctx, curProto); + if (JS_IsUndefined(setter)) { + JS_FreeValue(qctx, setter); + if (flags & JS_PROP_THROW) { + JS_ThrowTypeError(qctx, "Cannot set property which has only a getter"); + return -1; + } + return 0; + } + JSValueConst arg = value; + JSValue res = JS_Call(qctx, setter, targetHandle->qval, 1, &arg); + JS_FreeValue(qctx, setter); + if (JS_IsException(res)) return -1; + JS_FreeValue(qctx, res); + return 1; + } + const bool writable = (protoDesc.flags & JS_PROP_WRITABLE) != 0; + JS_FreeValue(qctx, protoDesc.getter); + JS_FreeValue(qctx, protoDesc.setter); + JS_FreeValue(qctx, protoDesc.value); + JS_FreeValue(qctx, curProto); + if (!writable) { + if (flags & JS_PROP_THROW) { + JS_ThrowTypeError(qctx, "Cannot assign to read only property"); + return -1; + } + return 0; + } + break; + } + JSValue nextProto = JS_GetPrototype(qctx, curProto); + JS_FreeValue(qctx, curProto); + curProto = nextProto; + } + JS_FreeValue(qctx, curProto); + return JS_SetPropertyValue(qctx, data->propStore, JS_AtomToValue(qctx, prop), JS_DupValue(qctx, value), flags); + } + return 0; +} + +int CallbackExoticDeleteProperty(JSContext* qctx, JSValueConst obj, JSAtom prop) { + auto* group = static_cast(JS_GetRuntimeOpaque(JS_GetRuntime(qctx))); + if (!group || group->shuttingDown) return 1; + CallbackObjectData* data = group->FindCallbackDataByPtr(JS_VALUE_GET_PTR(obj)); + if (!data || !data->ctx || !data->handle) return 1; + OpaqueJSContext* ctx = data->ctx; + OpaqueJSValue* targetHandle = data->handle; + + JSValue atomVal = JS_AtomToValue(qctx, prop); + const bool isSymbol = JS_IsSymbol(atomVal); + JS_FreeValue(qctx, atomVal); + + if (!isSymbol && data->jsClass) { + const std::string propUtf8 = AtomToUtf8(qctx, prop); + JSStringRef propNameRef = nullptr; + auto getPropNameRef = [&]() -> JSStringRef { + if (!propNameRef) { + propNameRef = AtomToJsString(qctx, prop); + } + return propNameRef; + }; + CallbackPinScope pinScope(group); + pinScope.Pin(targetHandle); + + for (OpaqueJSClass* cls = data->jsClass; cls; cls = cls->parentClass) { + if (cls->deleteProperty) { + JSValueRef exc = nullptr; + const bool deleted = cls->deleteProperty(ctx, targetHandle, getPropNameRef(), &exc); + if (exc) { + if (propNameRef) JSStringRelease_nid_postfix(propNameRef); + JS_Throw(qctx, JS_DupValue(qctx, exc->qval)); + return -1; + } + if (deleted) { + if (propNameRef) JSStringRelease_nid_postfix(propNameRef); + return 1; + } + } + if (const StaticValueEntry* sv = cls->FindStaticValue(propUtf8)) { + if (propNameRef) JSStringRelease_nid_postfix(propNameRef); + return (sv->attributes & kJSPropertyAttributeDontDelete) ? 0 : 1; + } + if (const StaticFunctionEntry* sf = cls->FindStaticFunction(propUtf8)) { + if (propNameRef) JSStringRelease_nid_postfix(propNameRef); + return (sf->attributes & kJSPropertyAttributeDontDelete) ? 0 : 1; + } + } + if (propNameRef) JSStringRelease_nid_postfix(propNameRef); + } + + if (!JS_IsUndefined(data->propStore)) { + return JS_DeleteProperty(qctx, data->propStore, prop, 0); + } + return 1; +} + +int CallbackExoticDefineOwnProperty(JSContext* qctx, JSValueConst thisObj, JSAtom prop, JSValueConst val, JSValueConst getter, JSValueConst setter, int flags) { + auto* group = static_cast(JS_GetRuntimeOpaque(JS_GetRuntime(qctx))); + if (!group || group->shuttingDown) return -1; + CallbackObjectData* data = group->FindCallbackDataByPtr(JS_VALUE_GET_PTR(thisObj)); + if (!data || JS_IsUndefined(data->propStore)) return -1; + return JS_DefineProperty(qctx, data->propStore, prop, val, getter, setter, flags); +} + +int CallbackExoticGetOwnPropertyNames(JSContext* qctx, JSPropertyEnum** ptab, std::uint32_t* plen, JSValueConst obj) { + *ptab = nullptr; + *plen = 0; + auto* group = static_cast(JS_GetRuntimeOpaque(JS_GetRuntime(qctx))); + if (!group || group->shuttingDown) return 0; + CallbackObjectData* data = group->FindCallbackDataByPtr(JS_VALUE_GET_PTR(obj)); + if (!data || !data->ctx || !data->handle) return 0; + OpaqueJSContext* ctx = data->ctx; + OpaqueJSValue* targetHandle = data->handle; + + OpaqueJSPropertyNameAccumulator acc; + CallbackPinScope pinScope(group); + pinScope.Pin(targetHandle); + + data->dynamicEnumeratedNames.clear(); + for (OpaqueJSClass* cls = data->jsClass; cls; cls = cls->parentClass) { + if (cls->getPropertyNames) { + cls->getPropertyNames(ctx, targetHandle, &acc); + } + for (const auto& sv : cls->staticValues) { + if (sv.getProperty && !(sv.attributes & kJSPropertyAttributeDontEnum)) { + acc.AddName(sv.propertyNameRef); + } + } + for (const auto& sf : cls->staticFunctions) { + if (!(sf.attributes & kJSPropertyAttributeDontEnum)) { + JSStringRef s = Utf8ToJsString(sf.name); + acc.AddName(s); + JSStringRelease_nid_postfix(s); + } + } + } + for (auto* nameRef : acc.names) { + data->dynamicEnumeratedNames.insert(JsStringToUtf8(nameRef)); + } + + std::vector collected; + std::unordered_set seenAtoms; + for (auto* nameRef : acc.names) { + JSAtom atom = JsStringToAtom(qctx, nameRef); + if (atom != JS_ATOM_NULL) { + if (seenAtoms.insert(atom).second) { + collected.push_back(JSPropertyEnum{true, atom}); + } else { + JS_FreeAtom(qctx, atom); + } + } + } + + if (!JS_IsUndefined(data->propStore)) { + JSPropertyEnum* storeTab = nullptr; + std::uint32_t storeLen = 0; + if (JS_GetOwnPropertyNames(qctx, &storeTab, &storeLen, data->propStore, JS_GPN_STRING_MASK | JS_GPN_SYMBOL_MASK | JS_GPN_SET_ENUM) == 0) { + for (std::uint32_t i = 0; i < storeLen; ++i) { + if (seenAtoms.insert(storeTab[i].atom).second) { + collected.push_back(JSPropertyEnum{storeTab[i].is_enumerable, JS_DupAtom(qctx, storeTab[i].atom)}); + } + } + JS_FreePropertyEnum(qctx, storeTab, storeLen); + } + } + + const auto count = static_cast(collected.size()); + auto* tab = static_cast(js_malloc(qctx, sizeof(JSPropertyEnum) * std::max(count, 1u))); + if (!tab) { + for (auto& item : collected) JS_FreeAtom(qctx, item.atom); + return -1; + } + for (std::uint32_t i = 0; i < count; ++i) { + tab[i] = collected[i]; + } + *ptab = tab; + *plen = count; + return 0; +} + +JSClassExoticMethods g_callbackExoticMethods = { + &CallbackExoticGetOwnProperty, + &CallbackExoticGetOwnPropertyNames, + &CallbackExoticDeleteProperty, + &CallbackExoticDefineOwnProperty, + nullptr, + nullptr, + &CallbackExoticSetProperty, +}; + +void CallbackClassFinalizer(JSRuntime* rt, JSValueConst val) { + auto* group = static_cast(JS_GetRuntimeOpaque(rt)); + if (!group || group->shuttingDown) return; + void* ptr = JS_VALUE_GET_PTR(val); + CallbackObjectData* data = group->FindCallbackDataByPtr(ptr); + if (!data) return; + OpaqueJSValue* handle = data->handle; + if (!data->isGlobalInterceptor) { + RunClassFinalize(data); + } + if (!JS_IsUndefined(data->propStore)) { + JS_FreeValueRT(rt, data->propStore); + data->propStore = JS_UNDEFINED; + } + for (auto& [k, slot] : data->privateProperties) { + if (!JS_IsUndefined(slot.strongVal)) { + JS_FreeValueRT(rt, slot.strongVal); + slot.strongVal = JS_UNDEFINED; + } + } + data->privateProperties.clear(); + group->callbackDataByPtr.erase(ptr); + if (!data->isGlobalInterceptor) { + group->NotifyObjectFinalized(ptr, handle); + } + delete data; +} + +void CallbackClassGcMark(JSRuntime* rt, JSValueConst val, JS_MarkFunc* markFunc) { + auto* group = static_cast(JS_GetRuntimeOpaque(rt)); + if (!group) return; + void* ptr = JS_VALUE_GET_PTR(val); + CallbackObjectData* data = group->FindCallbackDataByPtr(ptr); + if (!data) return; + if (!JS_IsUndefined(data->propStore)) { + JS_MarkValue(rt, data->propStore, markFunc); + } + for (const auto& [k, slot] : data->privateProperties) { + if (!JS_IsUndefined(slot.strongVal)) { + JS_MarkValue(rt, slot.strongVal, markFunc); + } + } + if (data->isGlobalInterceptor && data->handle) { + if (CallbackObjectData* globalData = group->FindCallbackData(data->handle)) { + if (!JS_IsUndefined(globalData->propStore)) { + JS_MarkValue(rt, globalData->propStore, markFunc); + } + for (const auto& [k, slot] : globalData->privateProperties) { + if (!JS_IsUndefined(slot.strongVal)) { + JS_MarkValue(rt, slot.strongVal, markFunc); + } + } + } + } +} + +JSValue CallbackClassCall(JSContext* qctx, JSValueConst funcObj, JSValueConst thisVal, int argc, JSValueConst* argv, int flags) { + auto* group = static_cast(JS_GetRuntimeOpaque(JS_GetRuntime(qctx))); + if (!group || group->shuttingDown) return JS_UNDEFINED; + CallbackObjectData* data = group->FindCallbackDataByPtr(JS_VALUE_GET_PTR(funcObj)); + if (!data || !data->ctx || !data->handle) return JS_UNDEFINED; + OpaqueJSContext* ctx = data->ctx; + OpaqueJSValue* funcHandle = data->handle; + + std::vector args(static_cast(std::max(argc, 0))); + CallbackPinScope pinScope(group); + pinScope.Pin(funcHandle); + for (int i = 0; i < argc; ++i) { + OpaqueJSValue* argHandle = group->BorrowHandle(ctx, argv[i]); + args[static_cast(i)] = argHandle; + pinScope.Pin(argHandle); + } + + if (flags & JS_CALL_FLAG_CONSTRUCTOR) { + if (data->isDirectConstructor) { + if (data->directConstructorCallback) { + JSValueRef exc = nullptr; + JSObjectRef res = data->directConstructorCallback(ctx, funcHandle, args.size(), args.empty() ? nullptr : args.data(), &exc); + if (exc) { + return JS_Throw(qctx, JS_DupValue(qctx, exc->qval)); + } + if (!res || !res->alive) return JS_UNDEFINED; + return JS_DupValue(qctx, res->qval); + } + OpaqueJSValue* instance = MakeCallbackObject(ctx, data->jsClass, nullptr); + if (!instance || !instance->alive) return JS_UNDEFINED; + return JS_DupValue(qctx, instance->qval); + } + for (OpaqueJSClass* cls = data->jsClass; cls; cls = cls->parentClass) { + if (cls->callAsConstructor) { + JSValueRef exc = nullptr; + JSObjectRef res = cls->callAsConstructor(ctx, funcHandle, args.size(), args.empty() ? nullptr : args.data(), &exc); + if (exc) { + return JS_Throw(qctx, JS_DupValue(qctx, exc->qval)); + } + if (!res || !res->alive) return JS_UNDEFINED; + return JS_DupValue(qctx, res->qval); + } + } + return JS_ThrowTypeError(qctx, "Object is not a constructor"); + } + + OpaqueJSValue* thisObj = CoerceThisToObject(ctx, thisVal); + pinScope.Pin(thisObj); + + if (data->isDirectFunction) { + if (!data->directFunctionCallback) return JS_UNDEFINED; + JSValueRef exc = nullptr; + JSValueRef res = data->directFunctionCallback(ctx, funcHandle, thisObj, args.size(), args.empty() ? nullptr : args.data(), &exc); + if (exc) { + return JS_Throw(qctx, JS_DupValue(qctx, exc->qval)); + } + if (!res || !res->alive) return JS_UNDEFINED; + return JS_DupValue(qctx, res->qval); + } + + for (OpaqueJSClass* cls = data->jsClass; cls; cls = cls->parentClass) { + if (cls->callAsFunction) { + JSValueRef exc = nullptr; + JSValueRef res = cls->callAsFunction(ctx, funcHandle, thisObj, args.size(), args.empty() ? nullptr : args.data(), &exc); + if (exc) { + return JS_Throw(qctx, JS_DupValue(qctx, exc->qval)); + } + if (!res || !res->alive) return JS_UNDEFINED; + return JS_DupValue(qctx, res->qval); + } + } + return JS_ThrowTypeError(qctx, "Object is not a function"); +} + +struct NoCopyBufferRecord { + JSTypedArrayBytesDeallocator deallocator = nullptr; + void* deallocatorContext = nullptr; + void* originalBytes = nullptr; +}; + +std::uint8_t g_emptyBufferByte = 0; + +void* ArrayBufferNoCopyRealloc(JSRuntime* rt, void* opaque, void* ptr, std::size_t size) { + (void)rt; + (void)ptr; + if (size == 0) { + auto* record = static_cast(opaque); + if (record) { + if (record->deallocator) { + record->deallocator(record->originalBytes, record->deallocatorContext); + } + delete record; + } + return nullptr; + } + return nullptr; +} + +bool ToQuickJsTypedArrayEnum(JSTypedArrayType type, JSTypedArrayEnum* outEnum, std::size_t* outElemSize) { + switch (type) { + case kJSTypedArrayTypeInt8Array: + *outEnum = JS_TYPED_ARRAY_INT8; + *outElemSize = 1; + return true; + case kJSTypedArrayTypeInt16Array: + *outEnum = JS_TYPED_ARRAY_INT16; + *outElemSize = 2; + return true; + case kJSTypedArrayTypeInt32Array: + *outEnum = JS_TYPED_ARRAY_INT32; + *outElemSize = 4; + return true; + case kJSTypedArrayTypeUint8Array: + *outEnum = JS_TYPED_ARRAY_UINT8; + *outElemSize = 1; + return true; + case kJSTypedArrayTypeUint8ClampedArray: + *outEnum = JS_TYPED_ARRAY_UINT8C; + *outElemSize = 1; + return true; + case kJSTypedArrayTypeUint16Array: + *outEnum = JS_TYPED_ARRAY_UINT16; + *outElemSize = 2; + return true; + case kJSTypedArrayTypeUint32Array: + *outEnum = JS_TYPED_ARRAY_UINT32; + *outElemSize = 4; + return true; + case kJSTypedArrayTypeFloat32Array: + *outEnum = JS_TYPED_ARRAY_FLOAT32; + *outElemSize = 4; + return true; + case kJSTypedArrayTypeFloat64Array: + *outEnum = JS_TYPED_ARRAY_FLOAT64; + *outElemSize = 8; + return true; + case kJSTypedArrayTypeBigInt64Array: + *outEnum = JS_TYPED_ARRAY_BIG_INT64; + *outElemSize = 8; + return true; + case kJSTypedArrayTypeBigUint64Array: + *outEnum = JS_TYPED_ARRAY_BIG_UINT64; + *outElemSize = 8; + return true; + default: + return false; + } +} + +} // namespace + +void OpaqueJSClass::DestroyInPlace() { + for (auto& sv : staticValues) { + if (sv.propertyNameRef) { + JSStringRelease_nid_postfix(sv.propertyNameRef); + sv.propertyNameRef = nullptr; + } + } + staticValues.clear(); + staticFunctions.clear(); + if (parentClass) { + if (parentClass->refCount.fetch_sub(1, std::memory_order_acq_rel) == 1) { + parentClass->DestroyInPlace(); + delete parentClass; + } + parentClass = nullptr; + } + if (prototypeClass) { + prototypeClass->DestroyInPlace(); + prototypeClass.reset(); + } +} + +bool OpaqueJSClass::HasCallAsFunction() const { + for (const OpaqueJSClass* cls = this; cls; cls = cls->parentClass) { + if (cls->callAsFunction) return true; + } + return false; +} + +bool OpaqueJSClass::HasCallAsConstructor() const { + for (const OpaqueJSClass* cls = this; cls; cls = cls->parentClass) { + if (cls->callAsConstructor) return true; + } + return false; +} + +bool OpaqueJSClass::HasConvertToType() const { + for (const OpaqueJSClass* cls = this; cls; cls = cls->parentClass) { + if (cls->convertToType) return true; + } + return false; +} + +bool OpaqueJSClass::HasInstanceCallback() const { + for (const OpaqueJSClass* cls = this; cls; cls = cls->parentClass) { + if (cls->hasInstance) return true; + } + return false; +} + +const StaticValueEntry* OpaqueJSClass::FindStaticValue(const std::string& propName) const { + for (const auto& entry : staticValues) { + if (entry.name == propName) return &entry; + } + return nullptr; +} + +const StaticFunctionEntry* OpaqueJSClass::FindStaticFunction(const std::string& propName) const { + for (const auto& entry : staticFunctions) { + if (entry.name == propName) return &entry; + } + return nullptr; +} + +void RegisterCallbackClasses(OpaqueJSContextGroup* group) { + JS_NewClassID(group->rt, &group->callbackObjectClassId); + JSClassDef objDef{}; + objDef.class_name = "JSCallbackObject"; + objDef.finalizer = &CallbackClassFinalizer; + objDef.gc_mark = &CallbackClassGcMark; + objDef.call = nullptr; + objDef.exotic = &g_callbackExoticMethods; + JS_NewClass(group->rt, group->callbackObjectClassId, &objDef); + + JS_NewClassID(group->rt, &group->callbackCallableClassId); + JSClassDef callDef{}; + callDef.class_name = "JSCallbackCallable"; + callDef.finalizer = &CallbackClassFinalizer; + callDef.gc_mark = &CallbackClassGcMark; + callDef.call = &CallbackClassCall; + callDef.exotic = &g_callbackExoticMethods; + JS_NewClass(group->rt, group->callbackCallableClassId, &callDef); +} + +void RunClassInitialize(OpaqueJSContext* ctx, OpaqueJSValue* objHandle, OpaqueJSClass* jsClass) { + if (!ctx || !objHandle || !jsClass) return; + std::vector initChain; + for (OpaqueJSClass* cls = jsClass; cls; cls = cls->parentClass) { + if (cls->initialize) { + initChain.push_back(cls->initialize); + } + } + CallbackPinScope pinScope(ctx->group); + pinScope.Pin(objHandle); + for (auto it = initChain.rbegin(); it != initChain.rend(); ++it) { + (*it)(ctx, objHandle); + } +} + +void RunClassFinalize(CallbackObjectData* data) { + if (!data || data->finalized) return; + data->finalized = true; + if (data->jsClass && data->handle) { + for (OpaqueJSClass* cls = data->jsClass; cls; cls = cls->parentClass) { + if (cls->finalize) { + cls->finalize(data->handle); + } + } + } + if (data->jsClass) { + if (data->jsClass->refCount.fetch_sub(1, std::memory_order_acq_rel) == 1) { + data->jsClass->DestroyInPlace(); + delete data->jsClass; + } + data->jsClass = nullptr; + } +} + +OpaqueJSValue* GetOrCreateClassPrototype(OpaqueJSContext* ctx, OpaqueJSClass* jsClass) { + if (!ctx || !jsClass) return nullptr; + if (jsClass->attributes & kJSClassAttributeNoAutomaticPrototype) { + return jsClass->parentClass ? GetOrCreateClassPrototype(ctx, jsClass->parentClass) : nullptr; + } + auto it = ctx->classPrototypes.find(jsClass); + if (it != ctx->classPrototypes.end() && it->second && it->second->alive) { + return it->second; + } + + OpaqueJSClass* protoCls = jsClass->prototypeClass.get(); + JSValue rawProto = JS_NewObjectClass(ctx->qctx, ctx->group->callbackObjectClassId); + void* ptr = JS_VALUE_GET_PTR(rawProto); + OpaqueJSValue* protoHandle = ctx->group->ToHandle(ctx, rawProto); + + auto* data = new CallbackObjectData(); + data->group = ctx->group; + data->ctx = ctx; + data->handle = protoHandle; + if (protoCls) { + protoCls->refCount.fetch_add(1, std::memory_order_relaxed); + data->jsClass = protoCls; + } + data->propStore = JS_NewObjectProto(ctx->qctx, JS_NULL); + JS_SetOpaque(protoHandle->qval, data); + ctx->group->callbackDataByPtr[ptr] = data; + + if (jsClass->parentClass) { + OpaqueJSValue* parentProto = GetOrCreateClassPrototype(ctx, jsClass->parentClass); + if (parentProto && parentProto->alive) { + JS_SetPrototype(ctx->qctx, protoHandle->qval, parentProto->qval); + } + } + + ctx->classPrototypes[jsClass] = protoHandle; + return protoHandle; +} + +OpaqueJSValue* MakeCallbackObject(OpaqueJSContext* ctx, OpaqueJSClass* jsClass, void* data) { + if (!ctx) return nullptr; + if (!jsClass) { + return ctx->group->ToHandle(ctx, JS_NewObject(ctx->qctx)); + } + + const bool callable = jsClass->HasCallAsFunction(); + const bool constructible = jsClass->HasCallAsConstructor(); + const JSClassID classId = (callable || constructible) ? ctx->group->callbackCallableClassId : ctx->group->callbackObjectClassId; + + JSValue rawObj = JS_NewObjectClass(ctx->qctx, classId); + if (constructible) { + JS_SetConstructorBit(ctx->qctx, rawObj, true); + } + void* ptr = JS_VALUE_GET_PTR(rawObj); + OpaqueJSValue* handle = ctx->group->ToHandle(ctx, rawObj); + + auto* cbData = new CallbackObjectData(); + cbData->group = ctx->group; + cbData->ctx = ctx; + cbData->handle = handle; + jsClass->refCount.fetch_add(1, std::memory_order_relaxed); + cbData->jsClass = jsClass; + cbData->privateData = data; + cbData->propStore = JS_NewObjectProto(ctx->qctx, JS_NULL); + JS_SetOpaque(handle->qval, cbData); + ctx->group->callbackDataByPtr[ptr] = cbData; + + OpaqueJSValue* proto = GetOrCreateClassPrototype(ctx, jsClass); + if (proto && proto->alive) { + JS_SetPrototype(ctx->qctx, handle->qval, proto->qval); + } + + RunClassInitialize(ctx, handle, jsClass); + return handle; +} + +bool IsObjectCallable(const OpaqueJSContext* ctx, OpaqueJSValue* object) { + if (!ctx || !object || !object->alive || !object->isObjectHandle) return false; + if (CallbackObjectData* cbData = ctx->group->FindCallbackData(object)) { + if (cbData->isDirectFunction) return true; + if (cbData->isDirectConstructor) return false; + return cbData->jsClass && cbData->jsClass->HasCallAsFunction(); + } + return JS_IsFunction(ctx->qctx, object->qval); +} + +} // namespace NKWebKit + +extern "C" { +using namespace NKWebKit; + +JSClassRef APS5_VABI JSClassCreate(const JSClassDefinition* definition) { + if (!definition || definition->version != 0) return nullptr; + auto* cls = new OpaqueJSClass(); + cls->attributes = definition->attributes; + if (definition->className) { + cls->className = definition->className; + } + if (definition->parentClass) { + definition->parentClass->refCount.fetch_add(1, std::memory_order_relaxed); + cls->parentClass = definition->parentClass; + } + if (definition->staticValues) { + for (const JSStaticValue* sv = definition->staticValues; sv->name != nullptr; ++sv) { + StaticValueEntry entry; + entry.name = sv->name; + entry.getProperty = sv->getProperty; + entry.setProperty = sv->setProperty; + entry.attributes = sv->attributes; + entry.propertyNameRef = Utf8ToJsString(entry.name); + cls->staticValues.push_back(std::move(entry)); + } + } + if (definition->staticFunctions) { + for (const JSStaticFunction* sf = definition->staticFunctions; sf->name != nullptr; ++sf) { + StaticFunctionEntry entry; + entry.name = sf->name; + entry.callAsFunction = sf->callAsFunction; + entry.attributes = sf->attributes; + cls->staticFunctions.push_back(std::move(entry)); + } + auto protoCls = std::make_unique(); + protoCls->className = cls->className; + protoCls->staticFunctions = cls->staticFunctions; + cls->prototypeClass = std::move(protoCls); + } + cls->initialize = definition->initialize; + cls->finalize = definition->finalize; + cls->hasProperty = definition->hasProperty; + cls->getProperty = definition->getProperty; + cls->setProperty = definition->setProperty; + cls->deleteProperty = definition->deleteProperty; + cls->getPropertyNames = definition->getPropertyNames; + cls->callAsFunction = definition->callAsFunction; + cls->callAsConstructor = definition->callAsConstructor; + cls->hasInstance = definition->hasInstance; + cls->convertToType = definition->convertToType; + return cls; +} + +JSClassRef APS5_VABI JSClassRetain(JSClassRef jsClass) { + if (!jsClass) return nullptr; + jsClass->refCount.fetch_add(1, std::memory_order_relaxed); + return jsClass; +} + +void APS5_VABI JSClassRelease(JSClassRef jsClass) { + if (!jsClass) return; + if (jsClass->refCount.fetch_sub(1, std::memory_order_acq_rel) == 1) { + jsClass->DestroyInPlace(); + delete jsClass; + } +} + +void APS5_VABI _ZN13OpaqueJSClassD1Ev(OpaqueJSClass* self) { + if (!self) return; + self->DestroyInPlace(); +} + +void APS5_VABI _ZN13OpaqueJSClassD2Ev(OpaqueJSClass* self) { + if (!self) return; + self->DestroyInPlace(); +} + +JSObjectRef APS5_VABI JSObjectMake(JSContextRef ctx, JSClassRef jsClass, void* data) { + if (!ctx) return nullptr; + return MakeCallbackObject(const_cast(ctx), jsClass, data); +} + +JSObjectRef APS5_VABI JSObjectMakeFunctionWithCallback(JSContextRef ctx, JSStringRef name, JSObjectCallAsFunctionCallback callAsFunction) { + if (!ctx) return nullptr; + auto* mutCtx = const_cast(ctx); + JSValue fnProto = JS_GetFunctionProto(mutCtx->qctx); + JSValue rawObj = JS_NewObjectProtoClass(mutCtx->qctx, fnProto, mutCtx->group->callbackCallableClassId); + JS_FreeValue(mutCtx->qctx, fnProto); + + void* ptr = JS_VALUE_GET_PTR(rawObj); + OpaqueJSValue* handle = mutCtx->group->ToHandle(mutCtx, rawObj); + + auto* cbData = new CallbackObjectData(); + cbData->group = mutCtx->group; + cbData->ctx = mutCtx; + cbData->handle = handle; + cbData->propStore = JS_NewObjectProto(mutCtx->qctx, JS_NULL); + cbData->directFunctionCallback = callAsFunction; + cbData->isDirectFunction = true; + JS_SetOpaque(handle->qval, cbData); + mutCtx->group->callbackDataByPtr[ptr] = cbData; + + const std::string fnName = name ? JsStringToUtf8(name) : std::string(); + JS_DefinePropertyValueStr(mutCtx->qctx, cbData->propStore, "name", JS_NewString(mutCtx->qctx, fnName.c_str()), JS_PROP_CONFIGURABLE); + JS_DefinePropertyValueStr(mutCtx->qctx, cbData->propStore, "length", JS_NewInt32(mutCtx->qctx, 0), JS_PROP_CONFIGURABLE); + return handle; +} + +JSObjectRef APS5_VABI JSObjectMakeConstructor(JSContextRef ctx, JSClassRef jsClass, JSObjectCallAsConstructorCallback callAsConstructor) { + if (!ctx) return nullptr; + auto* mutCtx = const_cast(ctx); + JSValue fnProto = JS_GetFunctionProto(mutCtx->qctx); + JSValue rawObj = JS_NewObjectProtoClass(mutCtx->qctx, fnProto, mutCtx->group->callbackCallableClassId); + JS_FreeValue(mutCtx->qctx, fnProto); + JS_SetConstructorBit(mutCtx->qctx, rawObj, true); + + void* ptr = JS_VALUE_GET_PTR(rawObj); + OpaqueJSValue* handle = mutCtx->group->ToHandle(mutCtx, rawObj); + + auto* cbData = new CallbackObjectData(); + cbData->group = mutCtx->group; + cbData->ctx = mutCtx; + cbData->handle = handle; + if (jsClass) { + JSClassRetain(jsClass); + cbData->jsClass = jsClass; + } + cbData->propStore = JS_NewObjectProto(mutCtx->qctx, JS_NULL); + cbData->directConstructorCallback = callAsConstructor; + cbData->isDirectConstructor = true; + JS_SetOpaque(handle->qval, cbData); + mutCtx->group->callbackDataByPtr[ptr] = cbData; + + OpaqueJSValue* classProto = jsClass ? GetOrCreateClassPrototype(mutCtx, jsClass) : nullptr; + JSValue ctorProto = (classProto && classProto->alive) ? JS_NewObjectProto(mutCtx->qctx, classProto->qval) : JS_NewObject(mutCtx->qctx); + JS_DefinePropertyValueStr(mutCtx->qctx, ctorProto, "constructor", JS_DupValue(mutCtx->qctx, handle->qval), JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE); + JS_DefinePropertyValueStr(mutCtx->qctx, cbData->propStore, "prototype", ctorProto, 0); + return handle; +} + +JSObjectRef APS5_VABI JSObjectMakeFunction(JSContextRef ctx, JSStringRef name, unsigned parameterCount, const JSStringRef parameterNames[], JSStringRef body, JSStringRef sourceURL, int startingLineNumber, JSValueRef* exception) { + if (!ctx || !body) return nullptr; + if (parameterCount > 0 && !parameterNames) return nullptr; + auto* mutCtx = const_cast(ctx); + + const std::string fnName = (name && !name->nullString) ? JsStringToUtf8(name) : "anonymous"; + std::ostringstream src; + src << "(function " << fnName << "("; + for (unsigned i = 0; i < parameterCount; ++i) { + if (!parameterNames[i]) return nullptr; + if (i > 0) src << ", "; + src << JsStringToUtf8(parameterNames[i]); + } + src << ") {\n" << JsStringToUtf8(body) << "\n})"; + + const std::string code = src.str(); + const std::string url = sourceURL ? JsStringToUtf8(sourceURL) : std::string(); + const int clampedLine = startingLineNumber <= 0 ? 1 : startingLineNumber; + + JSEvalOptions options{}; + options.version = JS_EVAL_OPTIONS_VERSION; + options.eval_flags = JS_EVAL_TYPE_GLOBAL; + options.filename = url.c_str(); + options.line_num = clampedLine; + + JSValue fnVal = JS_Eval2(mutCtx->qctx, code.c_str(), code.size(), &options); + if (JS_IsException(fnVal)) { + CapturePendingException(mutCtx, exception); + return nullptr; + } + return mutCtx->group->ToHandle(mutCtx, fnVal); +} + +JSObjectRef APS5_VABI JSObjectMakeArray(JSContextRef ctx, std::size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { + if (!ctx) return nullptr; + auto* mutCtx = const_cast(ctx); + JSValue arr = JS_NewArray(mutCtx->qctx); + if (JS_IsException(arr)) { + CapturePendingException(mutCtx, exception); + return nullptr; + } + for (std::size_t i = 0; i < argumentCount; ++i) { + JSValue elem = (arguments && arguments[i] && arguments[i]->alive) ? JS_DupValue(mutCtx->qctx, arguments[i]->qval) : JS_UNDEFINED; + if (JS_DefinePropertyValueUint32(mutCtx->qctx, arr, static_cast(i), elem, JS_PROP_C_W_E) < 0) { + JS_FreeValue(mutCtx->qctx, arr); + CapturePendingException(mutCtx, exception); + return nullptr; + } + } + return mutCtx->group->ToHandle(mutCtx, arr); +} + +JSObjectRef APS5_VABI JSObjectMakeDate(JSContextRef ctx, std::size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { + if (!ctx) return nullptr; + auto* mutCtx = const_cast(ctx); + JSValue dateCtor = JS_GetPropertyStr(mutCtx->qctx, mutCtx->globalObject->qval, "Date"); + std::vector args(argumentCount); + for (std::size_t i = 0; i < argumentCount; ++i) { + args[i] = (arguments && arguments[i] && arguments[i]->alive) ? arguments[i]->qval : JS_UNDEFINED; + } + JSValue dateObj = JS_CallConstructor(mutCtx->qctx, dateCtor, static_cast(argumentCount), args.empty() ? nullptr : args.data()); + JS_FreeValue(mutCtx->qctx, dateCtor); + if (JS_IsException(dateObj)) { + CapturePendingException(mutCtx, exception); + return nullptr; + } + return mutCtx->group->ToHandle(mutCtx, dateObj); +} + +JSObjectRef APS5_VABI JSObjectMakeError(JSContextRef ctx, std::size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { + if (!ctx) return nullptr; + auto* mutCtx = const_cast(ctx); + JSValue errCtor = JS_GetPropertyStr(mutCtx->qctx, mutCtx->globalObject->qval, "Error"); + std::vector args(argumentCount); + for (std::size_t i = 0; i < argumentCount; ++i) { + args[i] = (arguments && arguments[i] && arguments[i]->alive) ? arguments[i]->qval : JS_UNDEFINED; + } + JSValue errObj = JS_CallConstructor(mutCtx->qctx, errCtor, static_cast(argumentCount), args.empty() ? nullptr : args.data()); + JS_FreeValue(mutCtx->qctx, errCtor); + if (JS_IsException(errObj)) { + CapturePendingException(mutCtx, exception); + return nullptr; + } + return mutCtx->group->ToHandle(mutCtx, errObj); +} + +JSObjectRef APS5_VABI JSObjectMakeRegExp(JSContextRef ctx, std::size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { + if (!ctx) return nullptr; + auto* mutCtx = const_cast(ctx); + JSValue regExpCtor = JS_GetPropertyStr(mutCtx->qctx, mutCtx->globalObject->qval, "RegExp"); + std::vector args(argumentCount); + for (std::size_t i = 0; i < argumentCount; ++i) { + args[i] = (arguments && arguments[i] && arguments[i]->alive) ? arguments[i]->qval : JS_UNDEFINED; + } + JSValue regExpObj = JS_CallConstructor(mutCtx->qctx, regExpCtor, static_cast(argumentCount), args.empty() ? nullptr : args.data()); + JS_FreeValue(mutCtx->qctx, regExpCtor); + if (JS_IsException(regExpObj)) { + CapturePendingException(mutCtx, exception); + return nullptr; + } + return mutCtx->group->ToHandle(mutCtx, regExpObj); +} + +JSObjectRef APS5_VABI JSObjectMakeDeferredPromise(JSContextRef ctx, JSObjectRef* resolve, JSObjectRef* reject, JSValueRef* exception) { + if (!ctx) return nullptr; + auto* mutCtx = const_cast(ctx); + JSValue funcs[2] = {JS_UNDEFINED, JS_UNDEFINED}; + JSValue promise = JS_NewPromiseCapability(mutCtx->qctx, funcs); + if (JS_IsException(promise)) { + CapturePendingException(mutCtx, exception); + return nullptr; + } + if (resolve) { + *resolve = mutCtx->group->ToHandle(mutCtx, funcs[0]); + } else { + JS_FreeValue(mutCtx->qctx, funcs[0]); + } + if (reject) { + *reject = mutCtx->group->ToHandle(mutCtx, funcs[1]); + } else { + JS_FreeValue(mutCtx->qctx, funcs[1]); + } + return mutCtx->group->ToHandle(mutCtx, promise); +} + +JSValueRef APS5_VABI JSObjectGetPrototype(JSContextRef ctx, JSObjectRef object) { + if (!ctx || !object || !object->alive) return nullptr; + auto* mutCtx = const_cast(ctx); + if (object == mutCtx->globalObject && !JS_IsUndefined(mutCtx->globalExoticInterceptor)) { + JSValue proto = JS_GetPrototype(mutCtx->qctx, mutCtx->globalExoticInterceptor); + return mutCtx->group->ToHandle(mutCtx, proto); + } + JSValue proto = JS_GetPrototype(mutCtx->qctx, object->qval); + if (JS_IsException(proto)) { + JS_FreeValue(mutCtx->qctx, JS_GetException(mutCtx->qctx)); + return &mutCtx->group->nullHandle; + } + return mutCtx->group->ToHandle(mutCtx, proto); +} + +void APS5_VABI JSObjectSetPrototype(JSContextRef ctx, JSObjectRef object, JSValueRef value) { + if (!ctx || !object || !value || !object->alive || !value->alive) return; + auto* mutCtx = const_cast(ctx); + JSValueConst protoVal = value->isObjectHandle ? value->qval : JS_NULL; + JSValue target = (object == mutCtx->globalObject && !JS_IsUndefined(mutCtx->globalExoticInterceptor)) ? mutCtx->globalExoticInterceptor : object->qval; + if (JS_SetPrototype(mutCtx->qctx, target, protoVal) < 0) { + JS_FreeValue(mutCtx->qctx, JS_GetException(mutCtx->qctx)); + } +} + +bool APS5_VABI JSObjectHasProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName) { + if (!ctx || !object || !propertyName || !object->alive) return false; + auto* mutCtx = const_cast(ctx); + JSAtom atom = JsStringToAtom(mutCtx->qctx, propertyName); + if (atom == JS_ATOM_NULL) { + if (JS_HasException(mutCtx->qctx)) { + JS_FreeValue(mutCtx->qctx, JS_GetException(mutCtx->qctx)); + } + return false; + } + const int res = JS_HasProperty(mutCtx->qctx, object->qval, atom); + JS_FreeAtom(mutCtx->qctx, atom); + if (res < 0) { + JS_FreeValue(mutCtx->qctx, JS_GetException(mutCtx->qctx)); + return false; + } + return res != 0; +} + +JSValueRef APS5_VABI JSObjectGetProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef* exception) { + if (!ctx || !object || !propertyName || !object->alive) return nullptr; + auto* mutCtx = const_cast(ctx); + JSAtom atom = JsStringToAtom(mutCtx->qctx, propertyName); + if (atom == JS_ATOM_NULL) { + CapturePendingException(mutCtx, exception); + return nullptr; + } + JSValue val = JS_GetProperty(mutCtx->qctx, object->qval, atom); + JS_FreeAtom(mutCtx->qctx, atom); + if (JS_IsException(val)) { + CapturePendingException(mutCtx, exception); + return nullptr; + } + return mutCtx->group->ToHandle(mutCtx, val); +} + +void APS5_VABI JSObjectSetProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef value, JSPropertyAttributes attributes, JSValueRef* exception) { + if (!ctx || !object || !propertyName || !object->alive) return; + auto* mutCtx = const_cast(ctx); + JSAtom atom = JsStringToAtom(mutCtx->qctx, propertyName); + if (atom == JS_ATOM_NULL) { + CapturePendingException(mutCtx, exception); + return; + } + JSValue val = (value && value->alive) ? JS_DupValue(mutCtx->qctx, value->qval) : JS_UNDEFINED; + if (attributes != kJSPropertyAttributeNone) { + const int flags = ToQuickJsPropFlags(attributes) | JS_PROP_HAS_VALUE | JS_PROP_HAS_WRITABLE | JS_PROP_HAS_ENUMERABLE | JS_PROP_HAS_CONFIGURABLE | JS_PROP_THROW; + CallbackObjectData* cbData = mutCtx->group->FindCallbackData(object); + JSValue target = (cbData && !JS_IsUndefined(cbData->propStore) && object != mutCtx->globalObject) ? cbData->propStore : object->qval; + const int res = JS_DefinePropertyValue(mutCtx->qctx, target, atom, val, flags); + JS_FreeAtom(mutCtx->qctx, atom); + if (res < 0) { + CapturePendingException(mutCtx, exception); + } + return; + } + + JSValue propVal = JS_AtomToValue(mutCtx->qctx, atom); + JS_FreeAtom(mutCtx->qctx, atom); + const int res = JS_SetPropertyValue(mutCtx->qctx, object->qval, propVal, val, 0); + if (res < 0) { + CapturePendingException(mutCtx, exception); + } +} + +bool APS5_VABI JSObjectDeleteProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef* exception) { + if (!ctx || !object || !propertyName || !object->alive) return false; + auto* mutCtx = const_cast(ctx); + JSAtom atom = JsStringToAtom(mutCtx->qctx, propertyName); + if (atom == JS_ATOM_NULL) { + CapturePendingException(mutCtx, exception); + return false; + } + const int res = JS_DeleteProperty(mutCtx->qctx, object->qval, atom, 0); + JS_FreeAtom(mutCtx->qctx, atom); + if (res < 0) { + CapturePendingException(mutCtx, exception); + return false; + } + return res != 0; +} + +JSValueRef APS5_VABI JSObjectGetPropertyAtIndex(JSContextRef ctx, JSObjectRef object, unsigned propertyIndex, JSValueRef* exception) { + if (!ctx || !object || !object->alive) return nullptr; + auto* mutCtx = const_cast(ctx); + JSValue val = JS_GetPropertyUint32(mutCtx->qctx, object->qval, propertyIndex); + if (JS_IsException(val)) { + CapturePendingException(mutCtx, exception); + return nullptr; + } + return mutCtx->group->ToHandle(mutCtx, val); +} + +void APS5_VABI JSObjectSetPropertyAtIndex(JSContextRef ctx, JSObjectRef object, unsigned propertyIndex, JSValueRef value, JSValueRef* exception) { + if (!ctx || !object || !object->alive) return; + auto* mutCtx = const_cast(ctx); + JSValue val = (value && value->alive) ? JS_DupValue(mutCtx->qctx, value->qval) : JS_UNDEFINED; + const int res = JS_SetPropertyValue(mutCtx->qctx, object->qval, JS_NewUint32(mutCtx->qctx, propertyIndex), val, 0); + if (res < 0) { + CapturePendingException(mutCtx, exception); + } +} + +JSValueRef APS5_VABI JSObjectGetPropertyForKey(JSContextRef ctx, JSObjectRef object, JSValueRef propertyKey, JSValueRef* exception) { + if (!ctx || !object || !propertyKey || !object->alive || !propertyKey->alive) return nullptr; + auto* mutCtx = const_cast(ctx); + JSValue val = JS_GetPropertyValue(mutCtx->qctx, object->qval, JS_DupValue(mutCtx->qctx, propertyKey->qval)); + if (JS_IsException(val)) { + CapturePendingException(mutCtx, exception); + return nullptr; + } + return mutCtx->group->ToHandle(mutCtx, val); +} + +void APS5_VABI JSObjectSetPropertyForKey(JSContextRef ctx, JSObjectRef object, JSValueRef propertyKey, JSValueRef value, JSPropertyAttributes attributes, JSValueRef* exception) { + if (!ctx || !object || !propertyKey || !object->alive || !propertyKey->alive) return; + auto* mutCtx = const_cast(ctx); + JSAtom atom = JS_ValueToAtom(mutCtx->qctx, propertyKey->qval); + if (atom == JS_ATOM_NULL) { + CapturePendingException(mutCtx, exception); + return; + } + JSValue val = (value && value->alive) ? JS_DupValue(mutCtx->qctx, value->qval) : JS_UNDEFINED; + if (attributes != kJSPropertyAttributeNone) { + const int flags = ToQuickJsPropFlags(attributes) | JS_PROP_HAS_VALUE | JS_PROP_HAS_WRITABLE | JS_PROP_HAS_ENUMERABLE | JS_PROP_HAS_CONFIGURABLE | JS_PROP_THROW; + CallbackObjectData* cbData = mutCtx->group->FindCallbackData(object); + JSValue target = (cbData && !JS_IsUndefined(cbData->propStore) && object != mutCtx->globalObject) ? cbData->propStore : object->qval; + const int res = JS_DefinePropertyValue(mutCtx->qctx, target, atom, val, flags); + JS_FreeAtom(mutCtx->qctx, atom); + if (res < 0) { + CapturePendingException(mutCtx, exception); + } + return; + } + JSValue propVal = JS_AtomToValue(mutCtx->qctx, atom); + JS_FreeAtom(mutCtx->qctx, atom); + const int res = JS_SetPropertyValue(mutCtx->qctx, object->qval, propVal, val, 0); + if (res < 0) { + CapturePendingException(mutCtx, exception); + } +} + +bool APS5_VABI JSObjectDeletePropertyForKey(JSContextRef ctx, JSObjectRef object, JSValueRef propertyKey, JSValueRef* exception) { + if (!ctx || !object || !propertyKey || !object->alive || !propertyKey->alive) return false; + auto* mutCtx = const_cast(ctx); + JSAtom atom = JS_ValueToAtom(mutCtx->qctx, propertyKey->qval); + if (atom == JS_ATOM_NULL) { + CapturePendingException(mutCtx, exception); + return false; + } + const int res = JS_DeleteProperty(mutCtx->qctx, object->qval, atom, 0); + JS_FreeAtom(mutCtx->qctx, atom); + if (res < 0) { + CapturePendingException(mutCtx, exception); + return false; + } + return res != 0; +} + +void* APS5_VABI JSObjectGetPrivate(JSObjectRef object) { + if (!object || !object->alive || !object->group) return nullptr; + CallbackObjectData* data = object->group->FindCallbackData(object); + if (!data || (!data->jsClass && !data->isDirectConstructor)) return nullptr; + return data->privateData; +} + +bool APS5_VABI JSObjectSetPrivate(JSObjectRef object, void* data) { + if (!object || !object->alive || !object->group) return false; + CallbackObjectData* cbData = object->group->FindCallbackData(object); + if (!cbData || (!cbData->jsClass && !cbData->isDirectConstructor)) return false; + cbData->privateData = data; + return true; +} + +JSValueRef APS5_VABI JSObjectGetPrivateProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName) { + if (!ctx || !object || !propertyName || !object->alive) return nullptr; + CallbackObjectData* cbData = ctx->group->FindCallbackData(object); + if (!cbData || !cbData->jsClass) return nullptr; + const std::string key = JsStringToUtf8(propertyName); + auto it = cbData->privateProperties.find(key); + if (it == cbData->privateProperties.end() || !it->second.handle || !it->second.handle->alive) return nullptr; + return it->second.handle; +} + +bool APS5_VABI JSObjectSetPrivateProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef value) { + if (!ctx || !object || !propertyName || !object->alive) return false; + CallbackObjectData* cbData = ctx->group->FindCallbackData(object); + if (!cbData || !cbData->jsClass) return false; + const std::string key = JsStringToUtf8(propertyName); + auto existing = cbData->privateProperties.find(key); + if (existing != cbData->privateProperties.end()) { + if (!JS_IsUndefined(existing->second.strongVal)) { + JS_FreeValueRT(ctx->group->rt, existing->second.strongVal); + } + cbData->privateProperties.erase(existing); + } + if (value && value->alive) { + PrivatePropertySlot slot; + slot.handle = const_cast(value); + slot.strongVal = JS_DupValueRT(ctx->group->rt, value->qval); + cbData->privateProperties[key] = slot; + } + return true; +} + +bool APS5_VABI JSObjectDeletePrivateProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName) { + if (!ctx || !object || !propertyName || !object->alive) return false; + CallbackObjectData* cbData = ctx->group->FindCallbackData(object); + if (!cbData || !cbData->jsClass) return false; + const std::string key = JsStringToUtf8(propertyName); + auto existing = cbData->privateProperties.find(key); + if (existing != cbData->privateProperties.end()) { + if (!JS_IsUndefined(existing->second.strongVal)) { + JS_FreeValueRT(ctx->group->rt, existing->second.strongVal); + } + cbData->privateProperties.erase(existing); + } + return true; +} + +bool APS5_VABI JSObjectIsFunction(JSContextRef ctx, JSObjectRef object) { + return IsObjectCallable(ctx, object); +} + +JSValueRef APS5_VABI JSObjectCallAsFunction(JSContextRef ctx, JSObjectRef object, JSObjectRef thisObject, std::size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { + if (!ctx || !object || !object->alive) return nullptr; + if (!JSObjectIsFunction(ctx, object)) return nullptr; + auto* mutCtx = const_cast(ctx); + JSValueConst thisVal = (thisObject && thisObject->alive) ? thisObject->qval : mutCtx->globalObject->qval; + std::vector args(argumentCount); + for (std::size_t i = 0; i < argumentCount; ++i) { + args[i] = (arguments && arguments[i] && arguments[i]->alive) ? arguments[i]->qval : JS_UNDEFINED; + } + JSValue res = JS_Call(mutCtx->qctx, object->qval, thisVal, static_cast(argumentCount), args.empty() ? nullptr : args.data()); + if (JS_IsException(res)) { + CapturePendingException(mutCtx, exception); + mutCtx->group->DrainMicrotasks(mutCtx); + return nullptr; + } + OpaqueJSValue* handle = mutCtx->group->ToHandle(mutCtx, res); + mutCtx->group->DrainMicrotasks(mutCtx); + return handle; +} + +bool APS5_VABI JSObjectIsConstructor(JSContextRef ctx, JSObjectRef object) { + if (!ctx || !object || !object->alive || !object->isObjectHandle) return false; + if (CallbackObjectData* cbData = ctx->group->FindCallbackData(object)) { + if (cbData->isDirectConstructor) return true; + if (cbData->isDirectFunction) return false; + return cbData->jsClass && cbData->jsClass->HasCallAsConstructor(); + } + return JS_IsConstructor(ctx->qctx, object->qval); +} + +JSObjectRef APS5_VABI JSObjectCallAsConstructor(JSContextRef ctx, JSObjectRef object, std::size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { + if (!ctx || !object || !object->alive) return nullptr; + auto* mutCtx = const_cast(ctx); + std::vector args(argumentCount); + for (std::size_t i = 0; i < argumentCount; ++i) { + args[i] = (arguments && arguments[i] && arguments[i]->alive) ? arguments[i]->qval : JS_UNDEFINED; + } + JSValue res = JS_CallConstructor(mutCtx->qctx, object->qval, static_cast(argumentCount), args.empty() ? nullptr : args.data()); + if (JS_IsException(res)) { + CapturePendingException(mutCtx, exception); + mutCtx->group->DrainMicrotasks(mutCtx); + return nullptr; + } + OpaqueJSValue* handle = mutCtx->group->ToHandle(mutCtx, res); + mutCtx->group->DrainMicrotasks(mutCtx); + return handle; +} + +JSPropertyNameArrayRef APS5_VABI JSObjectCopyPropertyNames(JSContextRef ctx, JSObjectRef object) { + if (!ctx || !object || !object->alive) return nullptr; + auto* mutCtx = const_cast(ctx); + OpaqueJSPropertyNameAccumulator acc; + + JSValue cur = JS_DupValue(mutCtx->qctx, object->qval); + while (JS_IsObject(cur)) { + void* ptr = JS_VALUE_GET_PTR(cur); + if (CallbackObjectData* cbData = mutCtx->group->FindCallbackDataByPtr(ptr)) { + OpaqueJSValue* targetHandle = cbData->handle ? cbData->handle : object; + CallbackPinScope pinScope(mutCtx->group); + pinScope.Pin(targetHandle); + for (OpaqueJSClass* cls = cbData->jsClass; cls; cls = cls->parentClass) { + if (cls->getPropertyNames) { + cls->getPropertyNames(mutCtx, targetHandle, &acc); + } + for (const auto& sv : cls->staticValues) { + if (sv.getProperty && !(sv.attributes & kJSPropertyAttributeDontEnum)) { + acc.AddName(sv.propertyNameRef); + } + } + for (const auto& sf : cls->staticFunctions) { + if (!(sf.attributes & kJSPropertyAttributeDontEnum)) { + JSStringRef s = Utf8ToJsString(sf.name); + acc.AddName(s); + JSStringRelease_nid_postfix(s); + } + } + } + if (!JS_IsUndefined(cbData->propStore)) { + JSPropertyEnum* storeTab = nullptr; + std::uint32_t storeLen = 0; + if (JS_GetOwnPropertyNames(mutCtx->qctx, &storeTab, &storeLen, cbData->propStore, JS_GPN_STRING_MASK | JS_GPN_ENUM_ONLY) == 0) { + for (std::uint32_t i = 0; i < storeLen; ++i) { + JSStringRef s = AtomToJsString(mutCtx->qctx, storeTab[i].atom); + if (s) { + acc.AddName(s); + JSStringRelease_nid_postfix(s); + } + } + JS_FreePropertyEnum(mutCtx->qctx, storeTab, storeLen); + } + } + } else { + JSPropertyEnum* tab = nullptr; + std::uint32_t len = 0; + if (JS_GetOwnPropertyNames(mutCtx->qctx, &tab, &len, cur, JS_GPN_STRING_MASK | JS_GPN_ENUM_ONLY) == 0) { + for (std::uint32_t i = 0; i < len; ++i) { + JSStringRef s = AtomToJsString(mutCtx->qctx, tab[i].atom); + if (s) { + acc.AddName(s); + JSStringRelease_nid_postfix(s); + } + } + JS_FreePropertyEnum(mutCtx->qctx, tab, len); + } else if (JS_HasException(mutCtx->qctx)) { + JS_FreeValue(mutCtx->qctx, JS_GetException(mutCtx->qctx)); + } + } + JSValue next = JS_GetPrototype(mutCtx->qctx, cur); + JS_FreeValue(mutCtx->qctx, cur); + if (JS_IsException(next)) { + JS_FreeValue(mutCtx->qctx, JS_GetException(mutCtx->qctx)); + break; + } + cur = next; + } + JS_FreeValue(mutCtx->qctx, cur); + + auto* array = new OpaqueJSPropertyNameArray(); + array->names = std::move(acc.names); + acc.names.clear(); + return array; +} + +JSPropertyNameArrayRef APS5_VABI JSPropertyNameArrayRetain(JSPropertyNameArrayRef array) { + if (!array) return nullptr; + array->refCount.fetch_add(1, std::memory_order_relaxed); + return array; +} + +void APS5_VABI JSPropertyNameArrayRelease(JSPropertyNameArrayRef array) { + if (!array) return; + if (array->refCount.fetch_sub(1, std::memory_order_acq_rel) == 1) { + delete array; + } +} + +std::size_t APS5_VABI JSPropertyNameArrayGetCount(JSPropertyNameArrayRef array) { + if (!array) return 0; + return array->names.size(); +} + +JSStringRef APS5_VABI JSPropertyNameArrayGetNameAtIndex(JSPropertyNameArrayRef array, std::size_t index) { + if (!array || index >= array->names.size()) return nullptr; + return array->names[index]; +} + +void APS5_VABI JSPropertyNameAccumulatorAddName(JSPropertyNameAccumulatorRef accumulator, JSStringRef propertyName) { + if (!accumulator || !propertyName) return; + accumulator->AddName(propertyName); +} + +JSObjectRef APS5_VABI JSObjectGetProxyTarget(JSObjectRef object) { + if (!object || !object->alive || !object->isObjectHandle || !object->group) return nullptr; + if (!JS_IsProxy(object->qval)) return nullptr; + OpaqueJSContext* ctx = object->ctx ? object->ctx : object->group->DefaultContext(); + JSContext* qctx = ctx ? ctx->qctx : object->group->utilityCtx; + JSValue target = JS_GetProxyTarget(qctx, object->qval); + if (JS_IsException(target)) { + JS_FreeValue(qctx, JS_GetException(qctx)); + return nullptr; + } + return object->group->ToHandle(ctx, target); +} + +JSGlobalContextRef APS5_VABI JSObjectGetGlobalContext(JSObjectRef object) { + if (!object || !object->alive) return nullptr; + return object->ctx ? object->ctx : (object->group ? object->group->DefaultContext() : nullptr); +} + +JSObjectRef APS5_VABI JSObjectMakeArrayBufferWithBytesNoCopy(JSContextRef ctx, void* bytes, std::size_t byteLength, JSTypedArrayBytesDeallocator bytesDeallocator, void* deallocatorContext, JSValueRef* exception) { + if (!ctx) return nullptr; + auto* mutCtx = const_cast(ctx); + if (!bytes && byteLength > 0) { + SetExceptionValue(mutCtx, exception, JS_NewTypeError(mutCtx->qctx, "Bytes pointer is null but byte length is non-zero")); + return nullptr; + } + auto* record = new NoCopyBufferRecord{bytesDeallocator, deallocatorContext, bytes}; + std::uint8_t* rawBuf = bytes ? static_cast(bytes) : &g_emptyBufferByte; + JSValue abuf = JS_NewArrayBuffer(mutCtx->qctx, rawBuf, byteLength, 0, &ArrayBufferNoCopyRealloc, record, false); + if (JS_IsException(abuf)) { + delete record; + CapturePendingException(mutCtx, exception); + return nullptr; + } + return mutCtx->group->ToHandle(mutCtx, abuf); +} + +void* APS5_VABI JSObjectGetArrayBufferBytesPtr(JSContextRef ctx, JSObjectRef object, JSValueRef* exception) { + if (!ctx || !object || !object->alive || !JS_IsArrayBuffer(object->qval)) { + if (ctx) { + auto* mutCtx = const_cast(ctx); + SetExceptionValue(mutCtx, exception, JS_NewTypeError(mutCtx->qctx, "Argument is not an ArrayBuffer")); + } + return nullptr; + } + std::size_t size = 0; + std::uint8_t* ptr = JS_GetArrayBuffer(ctx->qctx, &size, object->qval); + if (JS_HasException(ctx->qctx)) { + CapturePendingException(const_cast(ctx), exception); + return nullptr; + } + if (ptr == &g_emptyBufferByte && size == 0) return nullptr; + return ptr; +} + +std::size_t APS5_VABI JSObjectGetArrayBufferByteLength(JSContextRef ctx, JSObjectRef object, JSValueRef* exception) { + if (!ctx || !object || !object->alive || !JS_IsArrayBuffer(object->qval)) { + if (ctx) { + auto* mutCtx = const_cast(ctx); + SetExceptionValue(mutCtx, exception, JS_NewTypeError(mutCtx->qctx, "Argument is not an ArrayBuffer")); + } + return 0; + } + std::size_t size = 0; + JS_GetArrayBuffer(ctx->qctx, &size, object->qval); + if (JS_HasException(ctx->qctx)) { + CapturePendingException(const_cast(ctx), exception); + return 0; + } + return size; +} + +JSObjectRef APS5_VABI JSObjectMakeTypedArray(JSContextRef ctx, JSTypedArrayType arrayType, std::size_t length, JSValueRef* exception) { + if (!ctx) return nullptr; + auto* mutCtx = const_cast(ctx); + JSTypedArrayEnum qtype{}; + std::size_t elemSize = 0; + if (!ToQuickJsTypedArrayEnum(arrayType, &qtype, &elemSize)) return nullptr; + JSValue lenVal = JS_NewUint64(mutCtx->qctx, length); + JSValueConst arg = lenVal; + JSValue ta = JS_NewTypedArray(mutCtx->qctx, 1, &arg, qtype); + JS_FreeValue(mutCtx->qctx, lenVal); + if (JS_IsException(ta)) { + CapturePendingException(mutCtx, exception); + return nullptr; + } + return mutCtx->group->ToHandle(mutCtx, ta); +} + +JSObjectRef APS5_VABI JSObjectMakeTypedArrayWithArrayBuffer(JSContextRef ctx, JSTypedArrayType arrayType, JSObjectRef buffer, JSValueRef* exception) { + if (!ctx) return nullptr; + auto* mutCtx = const_cast(ctx); + JSTypedArrayEnum qtype{}; + std::size_t elemSize = 0; + if (!ToQuickJsTypedArrayEnum(arrayType, &qtype, &elemSize)) return nullptr; + if (!buffer || !buffer->alive || !JS_IsArrayBuffer(buffer->qval)) { + SetExceptionValue(mutCtx, exception, JS_NewTypeError(mutCtx->qctx, "JSObjectMakeTypedArrayWithArrayBuffer expects buffer to be an Array Buffer object")); + return nullptr; + } + JSValueConst arg = buffer->qval; + JSValue ta = JS_NewTypedArray(mutCtx->qctx, 1, &arg, qtype); + if (JS_IsException(ta)) { + CapturePendingException(mutCtx, exception); + return nullptr; + } + return mutCtx->group->ToHandle(mutCtx, ta); +} + +JSObjectRef APS5_VABI JSObjectMakeTypedArrayWithArrayBufferAndOffset(JSContextRef ctx, JSTypedArrayType arrayType, JSObjectRef buffer, std::size_t byteOffset, std::size_t length, JSValueRef* exception) { + if (!ctx) return nullptr; + auto* mutCtx = const_cast(ctx); + JSTypedArrayEnum qtype{}; + std::size_t elemSize = 0; + if (!ToQuickJsTypedArrayEnum(arrayType, &qtype, &elemSize)) return nullptr; + if (!buffer || !buffer->alive || !JS_IsArrayBuffer(buffer->qval)) { + SetExceptionValue(mutCtx, exception, JS_NewTypeError(mutCtx->qctx, "JSObjectMakeTypedArrayWithArrayBufferAndOffset expects buffer to be an Array Buffer object")); + return nullptr; + } + JSValue offsetVal = JS_NewUint64(mutCtx->qctx, byteOffset); + JSValue lenVal = JS_NewUint64(mutCtx->qctx, length); + JSValueConst args[3] = {buffer->qval, offsetVal, lenVal}; + JSValue ta = JS_NewTypedArray(mutCtx->qctx, 3, args, qtype); + JS_FreeValue(mutCtx->qctx, offsetVal); + JS_FreeValue(mutCtx->qctx, lenVal); + if (JS_IsException(ta)) { + CapturePendingException(mutCtx, exception); + return nullptr; + } + return mutCtx->group->ToHandle(mutCtx, ta); +} + +JSObjectRef APS5_VABI JSObjectMakeTypedArrayWithBytesNoCopy(JSContextRef ctx, JSTypedArrayType arrayType, void* bytes, std::size_t byteLength, JSTypedArrayBytesDeallocator bytesDeallocator, void* deallocatorContext, JSValueRef* exception) { + if (!ctx) return nullptr; + JSTypedArrayEnum qtype{}; + std::size_t elemSize = 0; + if (!ToQuickJsTypedArrayEnum(arrayType, &qtype, &elemSize)) return nullptr; + JSValueRef localExc = nullptr; + JSObjectRef abuf = JSObjectMakeArrayBufferWithBytesNoCopy(ctx, bytes, byteLength, bytesDeallocator, deallocatorContext, &localExc); + if (!abuf) { + if (exception) *exception = localExc; + return nullptr; + } + return JSObjectMakeTypedArrayWithArrayBufferAndOffset(ctx, arrayType, abuf, 0, byteLength / elemSize, exception); +} + +void* APS5_VABI JSObjectGetTypedArrayBytesPtr(JSContextRef ctx, JSObjectRef object, JSValueRef* exception) { + if (!ctx || !object || !object->alive || JS_GetTypedArrayType(object->qval) < 0) return nullptr; + auto* mutCtx = const_cast(ctx); + std::size_t byteOffset = 0; + std::size_t byteLength = 0; + std::size_t bytesPerElem = 0; + JSValue abuf = JS_GetTypedArrayBuffer(mutCtx->qctx, object->qval, &byteOffset, &byteLength, &bytesPerElem); + if (JS_IsException(abuf)) { + CapturePendingException(mutCtx, exception); + return nullptr; + } + std::size_t bufSize = 0; + std::uint8_t* ptr = JS_GetArrayBuffer(mutCtx->qctx, &bufSize, abuf); + JS_FreeValue(mutCtx->qctx, abuf); + if (JS_HasException(mutCtx->qctx)) { + CapturePendingException(mutCtx, exception); + return nullptr; + } + if (ptr == &g_emptyBufferByte && bufSize == 0) return nullptr; + return ptr; +} + +std::size_t APS5_VABI JSObjectGetTypedArrayLength(JSContextRef ctx, JSObjectRef object, JSValueRef* exception) { + (void)exception; + if (!ctx || !object || !object->alive || JS_GetTypedArrayType(object->qval) < 0) return 0; + std::size_t byteOffset = 0; + std::size_t byteLength = 0; + std::size_t bytesPerElem = 0; + JSValue abuf = JS_GetTypedArrayBuffer(ctx->qctx, object->qval, &byteOffset, &byteLength, &bytesPerElem); + if (JS_IsException(abuf)) { + JS_FreeValue(ctx->qctx, JS_GetException(ctx->qctx)); + return 0; + } + JS_FreeValue(ctx->qctx, abuf); + return bytesPerElem > 0 ? (byteLength / bytesPerElem) : 0; +} + +std::size_t APS5_VABI JSObjectGetTypedArrayByteLength(JSContextRef ctx, JSObjectRef object, JSValueRef* exception) { + (void)exception; + if (!ctx || !object || !object->alive || JS_GetTypedArrayType(object->qval) < 0) return 0; + std::size_t byteOffset = 0; + std::size_t byteLength = 0; + std::size_t bytesPerElem = 0; + JSValue abuf = JS_GetTypedArrayBuffer(ctx->qctx, object->qval, &byteOffset, &byteLength, &bytesPerElem); + if (JS_IsException(abuf)) { + JS_FreeValue(ctx->qctx, JS_GetException(ctx->qctx)); + return 0; + } + JS_FreeValue(ctx->qctx, abuf); + return byteLength; +} + +std::size_t APS5_VABI JSObjectGetTypedArrayByteOffset(JSContextRef ctx, JSObjectRef object, JSValueRef* exception) { + (void)exception; + if (!ctx || !object || !object->alive || JS_GetTypedArrayType(object->qval) < 0) return 0; + std::size_t byteOffset = 0; + std::size_t byteLength = 0; + std::size_t bytesPerElem = 0; + JSValue abuf = JS_GetTypedArrayBuffer(ctx->qctx, object->qval, &byteOffset, &byteLength, &bytesPerElem); + if (JS_IsException(abuf)) { + JS_FreeValue(ctx->qctx, JS_GetException(ctx->qctx)); + return 0; + } + JS_FreeValue(ctx->qctx, abuf); + return byteOffset; +} + +JSObjectRef APS5_VABI JSObjectGetTypedArrayBuffer(JSContextRef ctx, JSObjectRef object, JSValueRef* exception) { + if (!ctx || !object || !object->alive || JS_GetTypedArrayType(object->qval) < 0) return nullptr; + auto* mutCtx = const_cast(ctx); + std::size_t byteOffset = 0; + std::size_t byteLength = 0; + std::size_t bytesPerElem = 0; + JSValue abuf = JS_GetTypedArrayBuffer(mutCtx->qctx, object->qval, &byteOffset, &byteLength, &bytesPerElem); + if (JS_IsException(abuf)) { + CapturePendingException(mutCtx, exception); + return nullptr; + } + return mutCtx->group->ToHandle(mutCtx, abuf); +} + +} diff --git a/core/libs/prx/libSceNKWebKit/src/JscValue.cpp b/core/libs/prx/libSceNKWebKit/src/JscValue.cpp new file mode 100644 index 0000000000..3b85019460 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/JscValue.cpp @@ -0,0 +1,286 @@ +#include "Jsc.hpp" +#include "prx/libSceNKWebKit/include/JscExports.hpp" +#include +#include +#include +#include + +extern "C" { +using namespace NKWebKit; + +JSType APS5_VABI JSValueGetType(JSContextRef ctx, JSValueRef value) { + (void)ctx; + if (!value || !value->alive) throw std::invalid_argument("JSValueGetType: null or released value"); + const int tag = JS_VALUE_GET_NORM_TAG(value->qval); + switch (tag) { + case JS_TAG_UNDEFINED: + return kJSTypeUndefined; + case JS_TAG_NULL: + return kJSTypeNull; + case JS_TAG_BOOL: + return kJSTypeBoolean; + case JS_TAG_INT: + case JS_TAG_FLOAT64: + return kJSTypeNumber; + case JS_TAG_STRING: + case JS_TAG_STRING_ROPE: + return kJSTypeString; + case JS_TAG_SYMBOL: + return kJSTypeSymbol; + case JS_TAG_OBJECT: + return kJSTypeObject; + default: + return kJSTypeUndefined; + } +} + +JSTypedArrayType APS5_VABI JSValueGetTypedArrayType(JSContextRef ctx, JSValueRef value, JSValueRef* exception) { + (void)exception; + if (!ctx || !value || !value->alive || !value->isObjectHandle) return kJSTypedArrayTypeNone; + if (JS_IsArrayBuffer(value->qval)) return kJSTypedArrayTypeArrayBuffer; + const int qtype = JS_GetTypedArrayType(value->qval); + switch (qtype) { + case JS_TYPED_ARRAY_INT8: + return kJSTypedArrayTypeInt8Array; + case JS_TYPED_ARRAY_INT16: + return kJSTypedArrayTypeInt16Array; + case JS_TYPED_ARRAY_INT32: + return kJSTypedArrayTypeInt32Array; + case JS_TYPED_ARRAY_UINT8: + return kJSTypedArrayTypeUint8Array; + case JS_TYPED_ARRAY_UINT8C: + return kJSTypedArrayTypeUint8ClampedArray; + case JS_TYPED_ARRAY_UINT16: + return kJSTypedArrayTypeUint16Array; + case JS_TYPED_ARRAY_UINT32: + return kJSTypedArrayTypeUint32Array; + case JS_TYPED_ARRAY_FLOAT32: + return kJSTypedArrayTypeFloat32Array; + case JS_TYPED_ARRAY_FLOAT64: + return kJSTypedArrayTypeFloat64Array; + case JS_TYPED_ARRAY_BIG_INT64: + return kJSTypedArrayTypeBigInt64Array; + case JS_TYPED_ARRAY_BIG_UINT64: + return kJSTypedArrayTypeBigUint64Array; + default: + return kJSTypedArrayTypeNone; + } +} + +bool APS5_VABI JSValueIsUndefined(JSContextRef ctx, JSValueRef value) { + return JSValueGetType(ctx, value) == kJSTypeUndefined; +} + +bool APS5_VABI JSValueIsNull(JSContextRef ctx, JSValueRef value) { + return JSValueGetType(ctx, value) == kJSTypeNull; +} + +bool APS5_VABI JSValueIsBoolean(JSContextRef ctx, JSValueRef value) { + return JSValueGetType(ctx, value) == kJSTypeBoolean; +} + +bool APS5_VABI JSValueIsNumber(JSContextRef ctx, JSValueRef value) { + return JSValueGetType(ctx, value) == kJSTypeNumber; +} + +bool APS5_VABI JSValueIsString(JSContextRef ctx, JSValueRef value) { + return JSValueGetType(ctx, value) == kJSTypeString; +} + +bool APS5_VABI JSValueIsSymbol(JSContextRef ctx, JSValueRef value) { + return JSValueGetType(ctx, value) == kJSTypeSymbol; +} + +bool APS5_VABI JSValueIsObject(JSContextRef ctx, JSValueRef value) { + return JSValueGetType(ctx, value) == kJSTypeObject; +} + +bool APS5_VABI JSValueIsObjectOfClass(JSContextRef ctx, JSValueRef value, JSClassRef jsClass) { + if (!ctx || !value || !jsClass || !value->alive || !value->isObjectHandle) return false; + CallbackObjectData* data = ctx->group->FindCallbackData(value); + if (!data) return false; + for (OpaqueJSClass* cls = data->jsClass; cls; cls = cls->parentClass) { + if (cls == jsClass) return true; + } + return false; +} + +bool APS5_VABI JSValueIsArray(JSContextRef ctx, JSValueRef value) { + if (!ctx || !value || !value->alive || !value->isObjectHandle) return false; + JSValue cur = JS_DupValue(ctx->qctx, value->qval); + while (JS_IsProxy(cur)) { + JSValue next = JS_GetProxyTarget(ctx->qctx, cur); + JS_FreeValue(ctx->qctx, cur); + if (JS_IsException(next)) { + JS_FreeValue(ctx->qctx, JS_GetException(ctx->qctx)); + return false; + } + cur = next; + } + const bool result = JS_IsArray(cur); + JS_FreeValue(ctx->qctx, cur); + return result; +} + +bool APS5_VABI JSValueIsDate(JSContextRef ctx, JSValueRef value) { + (void)ctx; + if (!value || !value->alive || !value->isObjectHandle) return false; + return JS_IsDate(value->qval); +} + +bool APS5_VABI JSValueIsEqual(JSContextRef ctx, JSValueRef a, JSValueRef b, JSValueRef* exception) { + if (!ctx || !a || !b || !a->alive || !b->alive) return false; + auto* mutCtx = const_cast(ctx); + const int res = JS_IsEqual(mutCtx->qctx, a->qval, b->qval); + if (res < 0) { + CapturePendingException(mutCtx, exception); + return false; + } + return res != 0; +} + +bool APS5_VABI JSValueIsStrictEqual(JSContextRef ctx, JSValueRef a, JSValueRef b) { + if (!a || !b || !a->alive || !b->alive) return false; + JSContext* qctx = ctx ? ctx->qctx : (a->ctx ? a->ctx->qctx : (a->group ? a->group->utilityCtx : nullptr)); + return JS_IsStrictEqual(qctx, a->qval, b->qval); +} + +bool APS5_VABI JSValueIsInstanceOfConstructor(JSContextRef ctx, JSValueRef value, JSObjectRef constructor, JSValueRef* exception) { + if (!ctx || !value || !constructor || !value->alive || !constructor->alive) return false; + auto* mutCtx = const_cast(ctx); + const int res = JS_IsInstanceOf(mutCtx->qctx, value->qval, constructor->qval); + if (res < 0) { + CapturePendingException(mutCtx, exception); + return false; + } + return res != 0; +} + +JSValueRef APS5_VABI JSValueMakeUndefined(JSContextRef ctx) { + if (!ctx || !ctx->group) return nullptr; + return &ctx->group->undefinedHandle; +} + +JSValueRef APS5_VABI JSValueMakeNull(JSContextRef ctx) { + if (!ctx || !ctx->group) return nullptr; + return &ctx->group->nullHandle; +} + +JSValueRef APS5_VABI JSValueMakeBoolean(JSContextRef ctx, bool boolean) { + if (!ctx || !ctx->group) return nullptr; + return boolean ? &ctx->group->trueHandle : &ctx->group->falseHandle; +} + +JSValueRef APS5_VABI JSValueMakeNumber(JSContextRef ctx, double number) { + if (!ctx || !ctx->group) return nullptr; + auto* mutCtx = const_cast(ctx); + const double clean = std::isnan(number) ? std::numeric_limits::quiet_NaN() : number; + return mutCtx->group->ToHandle(mutCtx, JS_NewFloat64(mutCtx->qctx, clean)); +} + +JSValueRef APS5_VABI JSValueMakeSymbol(JSContextRef ctx, JSStringRef description) { + if (!ctx || !ctx->group) return nullptr; + auto* mutCtx = const_cast(ctx); + JSValue sym; + if (!description) { + sym = JS_NewSymbol(mutCtx->qctx, nullptr, false); + } else { + const std::string desc = JsStringToUtf8(description); + sym = JS_NewSymbol(mutCtx->qctx, desc.c_str(), false); + } + if (JS_IsException(sym)) { + JS_FreeValue(mutCtx->qctx, JS_GetException(mutCtx->qctx)); + return nullptr; + } + return mutCtx->group->ToHandle(mutCtx, sym); +} + +JSValueRef APS5_VABI JSValueMakeFromJSONString(JSContextRef ctx, JSStringRef string) { + if (!ctx || !string) return nullptr; + auto* mutCtx = const_cast(ctx); + const std::string utf8 = JsStringToUtf8(string); + JSValue parsed = JS_ParseJSON(mutCtx->qctx, utf8.c_str(), utf8.size(), ""); + if (JS_IsException(parsed)) { + JS_FreeValue(mutCtx->qctx, JS_GetException(mutCtx->qctx)); + return nullptr; + } + return mutCtx->group->ToHandle(mutCtx, parsed); +} + +JSStringRef APS5_VABI JSValueCreateJSONString(JSContextRef ctx, JSValueRef value, unsigned indent, JSValueRef* exception) { + if (!ctx || !value || !value->alive) return nullptr; + auto* mutCtx = const_cast(ctx); + JSValue space = JS_NewInt32(mutCtx->qctx, static_cast(std::min(indent, 10u))); + JSValue strVal = JS_JSONStringify(mutCtx->qctx, value->qval, JS_UNDEFINED, space); + JS_FreeValue(mutCtx->qctx, space); + if (JS_IsException(strVal)) { + CapturePendingException(mutCtx, exception); + return nullptr; + } + if (JS_IsUndefined(strVal)) { + return nullptr; + } + GuestJSString* res = JsValueToJsString(mutCtx->qctx, strVal); + JS_FreeValue(mutCtx->qctx, strVal); + return res; +} + +bool APS5_VABI JSValueToBoolean(JSContextRef ctx, JSValueRef value) { + if (!ctx || !value || !value->alive) return false; + const int res = JS_ToBool(ctx->qctx, value->qval); + return res > 0; +} + +double APS5_VABI JSValueToNumber(JSContextRef ctx, JSValueRef value, JSValueRef* exception) { + if (!ctx || !value || !value->alive) return std::numeric_limits::quiet_NaN(); + auto* mutCtx = const_cast(ctx); + double num = std::numeric_limits::quiet_NaN(); + if (JS_ToFloat64(mutCtx->qctx, &num, value->qval) < 0) { + CapturePendingException(mutCtx, exception); + return std::numeric_limits::quiet_NaN(); + } + return num; +} + +JSStringRef APS5_VABI JSValueToStringCopy(JSContextRef ctx, JSValueRef value, JSValueRef* exception) { + if (!ctx || !value || !value->alive) return nullptr; + auto* mutCtx = const_cast(ctx); + JSValue strVal = JS_ToString(mutCtx->qctx, value->qval); + if (JS_IsException(strVal)) { + CapturePendingException(mutCtx, exception); + return nullptr; + } + GuestJSString* res = JsValueToJsString(mutCtx->qctx, strVal); + JS_FreeValue(mutCtx->qctx, strVal); + return res; +} + +JSObjectRef APS5_VABI JSValueToObject(JSContextRef ctx, JSValueRef value, JSValueRef* exception) { + if (!ctx || !value || !value->alive) return nullptr; + auto* mutCtx = const_cast(ctx); + if (value->isObjectHandle) { + return const_cast(value); + } + JSValue objVal = JS_ToObject(mutCtx->qctx, value->qval); + if (JS_IsException(objVal)) { + CapturePendingException(mutCtx, exception); + return nullptr; + } + return mutCtx->group->ToHandle(mutCtx, objVal); +} + +void APS5_VABI JSValueProtect(JSContextRef ctx, JSValueRef value) { + if (!ctx || !value) return; + auto* mutVal = const_cast(value); + ++mutVal->protectCount; +} + +void APS5_VABI JSValueUnprotect(JSContextRef ctx, JSValueRef value) { + if (!ctx || !value) return; + auto* mutVal = const_cast(value); + if (mutVal->protectCount > 0) { + --mutVal->protectCount; + } +} + +} diff --git a/core/libs/prx/libSceNKWebKit/src/Number.cpp b/core/libs/prx/libSceNKWebKit/src/Number.cpp new file mode 100644 index 0000000000..ae4b51aeba --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/Number.cpp @@ -0,0 +1,29 @@ +#include "prx/libSceNKWebKit/src/Types.hpp" +#include "prx/libSceNKWebKit/include/WebKitValueExports.hpp" + +extern "C" { +const void* APS5_VABI WKBooleanCreate(bool value) { + return NKWebKit::ToRef(NKWebKit::Make(value)); +} + +bool APS5_VABI WKBooleanGetValue(const void* booleanRef) { + return NKWebKit::Cast(booleanRef, __func__)->value; +} + +const void* APS5_VABI WKDoubleCreate(double value) { + return NKWebKit::ToRef(NKWebKit::Make(value)); +} + +double APS5_VABI WKDoubleGetValue(const void* doubleRef) { + return NKWebKit::Cast(doubleRef, __func__)->value; +} + +const void* APS5_VABI WKUInt64Create(std::uint64_t value) { + return NKWebKit::ToRef(NKWebKit::Make(value)); +} + +std::uint64_t APS5_VABI WKUInt64GetValue(const void* uint64Ref) { + return NKWebKit::Cast(uint64Ref, __func__)->value; +} + +} diff --git a/core/libs/prx/libSceNKWebKit/src/Object.cpp b/core/libs/prx/libSceNKWebKit/src/Object.cpp new file mode 100644 index 0000000000..ec906aa2b5 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/Object.cpp @@ -0,0 +1,17 @@ +#include "prx/libSceNKWebKit/src/Object.hpp" +#include "prx/libSceNKWebKit/include/WebKitValueExports.hpp" + +extern "C" { +std::uint32_t APS5_VABI WKGetTypeID(const void* object) { + return NKWebKit::TypeID(NKWebKit::ToObject(object, __func__)->Type()); +} + +const void* APS5_VABI WKRetain(const void* object) { + NKWebKit::ToObject(object, __func__)->Ref(); + return object; +} + +void APS5_VABI WKRelease(const void* object) { + NKWebKit::ToObject(object, __func__)->Deref(); +} +} diff --git a/core/libs/prx/libSceNKWebKit/src/Object.hpp b/core/libs/prx/libSceNKWebKit/src/Object.hpp new file mode 100644 index 0000000000..9765a97616 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/Object.hpp @@ -0,0 +1,239 @@ +#pragma once + +#include "prx/libc/include/General.hpp" +#include +#include +#include +#include +#include + +namespace NKWebKit { + +enum class ObjectType : std::uint32_t { + Null = 0, + Array, + AuthenticationChallenge, + AuthenticationDecisionListener, + CertificateInfo, + Connection, + ContextMenuItem, + Credential, + Data, + Dictionary, + Error, + FrameHandle, + Image, + PageHandle, + ProtectionSpace, + RenderLayer, + RenderObject, + ResourceLoadInfo, + SecurityOrigin, + SessionState, + SerializedScriptValue, + String, + URL, + URLRequest, + URLResponse, + UserContentURLPattern, + UserScript, + UserStyleSheet, + WebArchive, + WebArchiveResource, + Boolean, + Double, + UInt64, + Int64, + Point, + Size, + Rect, + ApplicationCacheManager, + Attachment, + AutomationSession, + BackForwardList, + BackForwardListItem, + CacheManager, + ColorPickerResultListener, + ContentRuleList, + ContentRuleListAction, + ContentRuleListStore, + ContentWorld, + ContextMenuListener, + CustomHeaderFields, + DataTask, + DebuggableInfo, + Download, + Feature, + FormSubmissionListener, + Frame, + FrameInfo, + FramePolicyListener, + FrameTreeNode, + FullScreenManager, + GeolocationManager, + GeolocationPermissionRequest, + HTTPCookieStore, + HitTestResult, + GeolocationPosition, + GrammarDetail, + IconDatabase, + Inspector, + InspectorConfiguration, + KeyValueStorageManager, + MediaCacheManager, + MessageListener, + Navigation, + NavigationAction, + NavigationData, + NavigationResponse, + Notification, + NotificationManager, + NotificationPermissionRequest, + OpenPanelParameters, + OpenPanelResultListener, + OriginDataManager, + Page, + PageConfiguration, + PageGroup, + ProcessPool, + ProcessPoolConfiguration, + PluginSiteDataManager, + Preferences, + RequestStorageAccessConfirmResultListener, + ResourceLoadStatisticsStore, + ResourceLoadStatisticsFirstParty, + ResourceLoadStatisticsThirdParty, + RunBeforeUnloadConfirmPanelResultListener, + RunJavaScriptAlertResultListener, + RunJavaScriptConfirmResultListener, + RunJavaScriptPromptResultListener, + SpeechRecognitionPermissionCallback, + TextChecker, + URLSchemeTask, + UserContentController, + UserInitiatedAction, + UserMediaPermissionCheck, + UserMediaPermissionRequest, + ViewportAttributes, + VisitedLinkStore, + WebResourceLoadStatisticsManager, + WebsiteDataRecord, + WebsiteDataStore, + WebsiteDataStoreConfiguration, + WebsitePolicies, + WindowFeatures, + MediaKeySystemPermissionCallback, + QueryPermissionResultCallback, + Bundle, + BundleBackForwardList, + BundleBackForwardListItem, + BundleCSSStyleDeclarationHandle, + BundleDOMWindowExtension, + BundleFrame, + BundleHitTestResult, + BundleInspector, + BundleNodeHandle, + BundlePage, + BundlePageBanner, + BundlePageOverlay, + BundleRangeHandle, + BundleScriptWorld, + EditCommandProxy, + ObjCObjectGraph, + View, + PopupMenuItem, + AccessibilityObject, +}; + +class Object { +public: + Object() = default; + Object(const Object&) = delete; + Object& operator=(const Object&) = delete; + virtual ~Object() = default; + virtual ObjectType Type() const = 0; + void Ref() const { references.fetch_add(1, std::memory_order_relaxed); } + void Deref() const { + if (references.fetch_sub(1, std::memory_order_acq_rel) == 1) delete this; + } + +private: + mutable std::atomic references{1}; +}; + +template +class ObjectOf : public Object { +public: + static constexpr ObjectType Kind = kind; + ObjectType Type() const override { return kind; } +}; + +template +class Retained { +public: + Retained() = default; + Retained(std::nullptr_t) {} + static Retained Adopt(T* object) { + Retained result; + result.object = object; + return result; + } + static Retained Share(T* object) { + if (object) object->Ref(); + return Adopt(object); + } + Retained(const Retained& other) : object(other.object) { + if (object) object->Ref(); + } + Retained(Retained&& other) noexcept : object(std::exchange(other.object, nullptr)) {} + template + Retained(Retained&& other) noexcept : object(other.Leak()) {} + Retained& operator=(Retained other) noexcept { + std::swap(object, other.object); + return *this; + } + ~Retained() { + if (object) object->Deref(); + } + T* Get() const { return object; } + T* operator->() const { return object; } + T& operator*() const { return *object; } + explicit operator bool() const { return object != nullptr; } + T* Leak() { return std::exchange(object, nullptr); } + +private: + T* object = nullptr; +}; + +template +Retained Make(Arguments&&... arguments) { + return Retained::Adopt(new T(std::forward(arguments)...)); +} + +inline const Object* ToObject(const void* ref, const char* function) { + if (!ref) throw std::invalid_argument(std::string(function) + ": null object reference"); + return static_cast(ref); +} + +template +T* Cast(const void* ref, const char* function) { + const auto* object = ToObject(ref, function); + if (object->Type() != T::Kind) throw std::invalid_argument(std::string(function) + ": object reference of another type"); + return const_cast(static_cast(object)); +} + +template +T* CastOrNull(const void* ref, const char* function) { + return ref ? Cast(ref, function) : nullptr; +} + +inline std::uint32_t TypeID(ObjectType type) { + return static_cast(type); +} + +template +const void* ToRef(Retained object) { + return static_cast(object.Leak()); +} + +} // namespace NKWebKit diff --git a/core/libs/prx/libSceNKWebKit/src/PageConfiguration.cpp b/core/libs/prx/libSceNKWebKit/src/PageConfiguration.cpp new file mode 100644 index 0000000000..5ceed12d19 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/PageConfiguration.cpp @@ -0,0 +1,83 @@ +#include "prx/libSceNKWebKit/src/Configuration.hpp" +#include "prx/libSceNKWebKit/include/WebKitConfigExports.hpp" + +extern "C" { +const void* APS5_VABI WKPageConfigurationCreate() { + return NKWebKit::ToRef(NKWebKit::Make()); +} + +const void* APS5_VABI WKPageConfigurationGetContext(const void* configuration) { + const auto* config = NKWebKit::Cast(configuration, __func__); + return static_cast(config->context.Get()); +} + +void APS5_VABI WKPageConfigurationSetContext(const void* configuration, const void* context) { + auto* config = NKWebKit::Cast(configuration, __func__); + config->context = NKWebKit::Retained::Share( + NKWebKit::CastOrNull(context, __func__)); +} + +const void* APS5_VABI WKPageConfigurationGetPageGroup(const void* configuration) { + const auto* config = NKWebKit::Cast(configuration, __func__); + return static_cast(config->pageGroup.Get()); +} + +void APS5_VABI WKPageConfigurationSetPageGroup(const void* configuration, const void* pageGroup) { + auto* config = NKWebKit::Cast(configuration, __func__); + config->pageGroup = NKWebKit::Retained::Share( + NKWebKit::CastOrNull(pageGroup, __func__)); +} + +const void* APS5_VABI WKPageConfigurationGetUserContentController(const void* configuration) { + const auto* config = NKWebKit::Cast(configuration, __func__); + return static_cast(config->userContentController.Get()); +} + +void APS5_VABI WKPageConfigurationSetUserContentController(const void* configuration, const void* userContentController) { + auto* config = NKWebKit::Cast(configuration, __func__); + config->userContentController = NKWebKit::Retained::Share( + NKWebKit::CastOrNull(userContentController, __func__)); +} + +const void* APS5_VABI WKPageConfigurationGetPreferences(const void* configuration) { + const auto* config = NKWebKit::Cast(configuration, __func__); + return static_cast(config->preferences.Get()); +} + +void APS5_VABI WKPageConfigurationSetPreferences(const void* configuration, const void* preferences) { + auto* config = NKWebKit::Cast(configuration, __func__); + config->preferences = NKWebKit::Retained::Share( + NKWebKit::CastOrNull(preferences, __func__)); +} + +const void* APS5_VABI WKPageConfigurationGetRelatedPage(const void* configuration) { + const auto* config = NKWebKit::Cast(configuration, __func__); + return static_cast(config->relatedPage.Get()); +} + +void APS5_VABI WKPageConfigurationSetRelatedPage(const void* configuration, const void* relatedPage) { + auto* config = NKWebKit::Cast(configuration, __func__); + config->relatedPage = NKWebKit::Retained::Share( + NKWebKit::CastOrNull(relatedPage, __func__)); +} + +const void* APS5_VABI WKPageConfigurationGetWebsiteDataStore(const void* configuration) { + const auto* config = NKWebKit::Cast(configuration, __func__); + return static_cast(config->websiteDataStore.Get()); +} + +void APS5_VABI WKPageConfigurationSetWebsiteDataStore(const void* configuration, const void* websiteDataStore) { + auto* config = NKWebKit::Cast(configuration, __func__); + config->websiteDataStore = NKWebKit::Retained::Share( + NKWebKit::CastOrNull(websiteDataStore, __func__)); +} + +void APS5_VABI WKPageConfigurationSetInitialCapitalizationEnabled(const void* configuration, bool enabled) { + NKWebKit::Cast(configuration, __func__)->initialCapitalizationEnabled = enabled; +} + +void APS5_VABI WKPageConfigurationSetBackgroundCPULimit(const void* configuration, double cpuLimit) { + NKWebKit::Cast(configuration, __func__)->cpuLimit = cpuLimit; +} + +} diff --git a/core/libs/prx/libSceNKWebKit/src/PageGroup.cpp b/core/libs/prx/libSceNKWebKit/src/PageGroup.cpp new file mode 100644 index 0000000000..e0421e801a --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/PageGroup.cpp @@ -0,0 +1,89 @@ +#include "prx/libSceNKWebKit/src/Configuration.hpp" +#include "prx/libSceNKWebKit/include/WebKitConfigExports.hpp" + +namespace { + +std::vector Patterns(const void* array, const char* function) { + std::vector result; + const auto* list = NKWebKit::CastOrNull(array, function); + if (!list) return result; + for (const auto& element : list->elements) { + const auto* string = NKWebKit::Cast(element.Get(), function); + result.push_back(string->characters); + } + return result; +} + +std::string BaseURL(const void* baseURL, const char* function) { + const auto* url = NKWebKit::CastOrNull(baseURL, function); + if (!url || url->text.empty()) return "about:blank"; + return url->text; +} + +} + +extern "C" { +const void* APS5_VABI WKPageGroupCreateWithIdentifier(const void* identifier) { + std::u16string idString; + if (identifier) { + idString = NKWebKit::Cast(identifier, __func__)->characters; + } + return NKWebKit::ToRef(NKWebKit::Make(std::move(idString))); +} + +void APS5_VABI WKPageGroupSetPreferences(const void* pageGroup, const void* preferences) { + auto* group = NKWebKit::Cast(pageGroup, __func__); + group->preferences = NKWebKit::Retained::Share( + NKWebKit::CastOrNull(preferences, __func__)); +} + +const void* APS5_VABI WKPageGroupGetPreferences(const void* pageGroup) { + const auto* group = NKWebKit::Cast(pageGroup, __func__); + return static_cast(group->preferences.Get()); +} + +const void* APS5_VABI WKPageGroupGetUserContentController(const void* pageGroup) { + const auto* group = NKWebKit::Cast(pageGroup, __func__); + return static_cast(group->userContentController.Get()); +} + +void APS5_VABI WKPageGroupAddUserStyleSheet( + const void* pageGroup, const void* source, const void* baseURL, + const void* allowedURLPatterns, const void* blockedURLPatterns, + std::uint32_t injectedFrames) { + auto* group = NKWebKit::Cast(pageGroup, __func__); + if (!source) return; + const auto* src = NKWebKit::Cast(source, __func__); + if (src->null || src->characters.empty()) return; + auto sheet = NKWebKit::Make(src->characters); + sheet->baseURL = BaseURL(baseURL, __func__); + sheet->allowedURLPatterns = Patterns(allowedURLPatterns, __func__); + sheet->blockedURLPatterns = Patterns(blockedURLPatterns, __func__); + sheet->forMainFrameOnly = injectedFrames == 1; + group->userStyleSheets.push_back(std::move(sheet)); +} + +void APS5_VABI WKPageGroupRemoveAllUserStyleSheets(const void* pageGroup) { + NKWebKit::Cast(pageGroup, __func__)->userStyleSheets.clear(); +} + +void APS5_VABI WKPageGroupAddUserScript( + const void* pageGroup, const void* source, const void* baseURL, + const void* allowedURLPatterns, const void* blockedURLPatterns, + std::uint32_t injectedFrames, std::uint32_t injectionTime) { + auto* group = NKWebKit::Cast(pageGroup, __func__); + if (!source) return; + const auto* src = NKWebKit::Cast(source, __func__); + if (src->null || src->characters.empty()) return; + auto script = NKWebKit::Make(src->characters, injectionTime, injectedFrames == 1); + script->baseURL = BaseURL(baseURL, __func__); + script->allowedURLPatterns = Patterns(allowedURLPatterns, __func__); + script->blockedURLPatterns = Patterns(blockedURLPatterns, __func__); + group->userContentController->userScripts.push_back(std::move(script)); +} + +void APS5_VABI WKPageGroupRemoveAllUserScripts(const void* pageGroup) { + NKWebKit::Cast(pageGroup, __func__)->userContentController->userScripts.clear(); +} + +} diff --git a/core/libs/prx/libSceNKWebKit/src/Preferences.cpp b/core/libs/prx/libSceNKWebKit/src/Preferences.cpp new file mode 100644 index 0000000000..8c5561292a --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/Preferences.cpp @@ -0,0 +1,2120 @@ +#include "prx/libSceNKWebKit/src/Preferences.hpp" +#include "prx/libSceNKWebKit/src/Types.hpp" +#include +#include +#include + +namespace NKWebKit { +namespace { + +enum class FeatureKind { None, Boolean, Testable, Internal, Unverified }; + +struct Definition { + Preferences::Value value; + FeatureKind feature; +}; + +const std::map>& Definitions() { + static const std::map> definitions{ + {u"AbortSignalAnyOperationEnabled", {false, FeatureKind::Testable}}, + {u"AcceleratedCompositingEnabled", {true, FeatureKind::Boolean}}, + {u"AcceleratedCompositingForFixedPositionEnabled", {false, FeatureKind::Boolean}}, + {u"AcceleratedDrawingEnabled", {true, FeatureKind::Internal}}, + {u"AccentColorEnabled", {false, FeatureKind::Testable}}, + {u"AccessHandleEnabled", {false, FeatureKind::Testable}}, + {u"AggressiveTileRetentionEnabled", {false, FeatureKind::Boolean}}, + {u"AllowContentSecurityPolicySourceStarToMatchAnyProtocol", {false, FeatureKind::Boolean}}, + {u"AllowCrossOriginSubresourcesToAskForCredentials", {false, FeatureKind::Boolean}}, + {u"AllowDisplayOfInsecureContent", {false, FeatureKind::Boolean}}, + {u"AllowFileAccessFromFileURLs", {false, FeatureKind::Boolean}}, + {u"AllowMediaContentTypesRequiringHardwareSupportAsFallback", {false, FeatureKind::Boolean}}, + {u"AllowMultiElementImplicitSubmission", {false, FeatureKind::Boolean}}, + {u"AllowRunningOfInsecureContent", {false, FeatureKind::Boolean}}, + {u"AllowSettingAnyXHRHeaderFromFileURLs", {false, FeatureKind::Boolean}}, + {u"AllowTopNavigationToDataURLs", {false, FeatureKind::Boolean}}, + {u"AllowUniversalAccessFromFileURLs", {false, FeatureKind::Boolean}}, + {u"AllowsInlineMediaPlayback", {true, FeatureKind::Boolean}}, + {u"AllowsInlineMediaPlaybackAfterFullscreen", {false, FeatureKind::Boolean}}, + {u"AllowsPictureInPictureMediaPlayback", {false, FeatureKind::Boolean}}, + {u"AnimatedImageAsyncDecodingEnabled", {true, FeatureKind::Boolean}}, + {u"AppBadgeEnabled", {false, FeatureKind::Internal}}, + {u"AppleMailPaginationQuirkEnabled", {false, FeatureKind::Boolean}}, + {u"AriaReflectionForElementReferencesEnabled", {true, FeatureKind::Testable}}, + {u"AspectRatioEnabled", {true, FeatureKind::Testable}}, + {u"AspectRatioOfImgFromWidthAndHeightEnabled", {true, FeatureKind::Testable}}, + {u"AsyncClipboardAPIEnabled", {false, FeatureKind::Testable}}, + {u"AsyncFrameScrollingEnabled", {true, FeatureKind::Internal}}, + {u"AsyncOverflowScrollingEnabled", {true, FeatureKind::Internal}}, + {u"AsynchronousSpellCheckingEnabled", {false, FeatureKind::Boolean}}, + {u"AudioControlsScaleWithPageZoom", {true, FeatureKind::Boolean}}, + {u"AudioDescriptionsEnabled", {false, FeatureKind::Testable}}, + {u"AuthorAndUserStylesEnabled", {true, FeatureKind::Boolean}}, + {u"AutomaticLiveResizeEnabled", {false, FeatureKind::Internal}}, + {u"BackspaceKeyNavigationEnabled", {true, FeatureKind::Boolean}}, + {u"BeaconAPIEnabled", {true, FeatureKind::Testable}}, + {u"BlobRegistryTopOriginPartitioningEnabled", {false, FeatureKind::Internal}}, + {u"BroadcastChannelEnabled", {true, FeatureKind::Testable}}, + {u"BroadcastChannelOriginPartitioningEnabled", {true, FeatureKind::Testable}}, + {u"CSS3DTransformInteroperabilityEnabled", {true, FeatureKind::Testable}}, + {u"CSSCascadeLayersEnabled", {true, FeatureKind::Testable}}, + {u"CSSColor4", {true, FeatureKind::Testable}}, + {u"CSSColorContrastEnabled", {false, FeatureKind::Testable}}, + {u"CSSColorMixEnabled", {true, FeatureKind::Testable}}, + {u"CSSContainIntrinsicSizeEnabled", {true, FeatureKind::Testable}}, + {u"CSSContainerQueriesEnabled", {true, FeatureKind::Testable}}, + {u"CSSContainmentEnabled", {true, FeatureKind::Testable}}, + {u"CSSContentVisibilityEnabled", {false, FeatureKind::Testable}}, + {u"CSSCounterStyleAtRuleImageSymbolsEnabled", {false, FeatureKind::Testable}}, + {u"CSSCounterStyleAtRulesEnabled", {true, FeatureKind::Testable}}, + {u"CSSCustomPropertiesAndValuesEnabled", {true, FeatureKind::Testable}}, + {u"CSSFontFaceSizeAdjustEnabled", {true, FeatureKind::Testable}}, + {u"CSSGradientInterpolationColorSpacesEnabled", {true, FeatureKind::Testable}}, + {u"CSSGradientPremultipliedAlphaInterpolationEnabled", {true, FeatureKind::Testable}}, + {u"CSSIndividualTransformPropertiesEnabled", {true, FeatureKind::Testable}}, + {u"CSSInputSecurityEnabled", {false, FeatureKind::Testable}}, + {u"CSSMarginTrimEnabled", {true, FeatureKind::Testable}}, + {u"CSSMotionPathEnabled", {true, FeatureKind::Testable}}, + {u"CSSNestingEnabled", {true, FeatureKind::Testable}}, + {u"CSSOMViewScrollingAPIEnabled", {false, FeatureKind::Testable}}, + {u"CSSOMViewSmoothScrollingEnabled", {false, FeatureKind::Testable}}, + {u"CSSRelativeColorSyntaxEnabled", {true, FeatureKind::Testable}}, + {u"CSSRhythmicSizingEnabled", {false, FeatureKind::Testable}}, + {u"CSSScrollAnchoringEnabled", {false, FeatureKind::Testable}}, + {u"CSSScrollbarColorEnabled", {false, FeatureKind::Testable}}, + {u"CSSScrollbarGutterEnabled", {false, FeatureKind::Testable}}, + {u"CSSScrollbarWidthEnabled", {false, FeatureKind::Testable}}, + {u"CSSTextAlignLastEnabled", {true, FeatureKind::Testable}}, + {u"CSSTextBoxTrimEnabled", {false, FeatureKind::Testable}}, + {u"CSSTextGroupAlignEnabled", {false, FeatureKind::Testable}}, + {u"CSSTextJustifyEnabled", {false, FeatureKind::Testable}}, + {u"CSSTextSpacingEnabled", {false, FeatureKind::Testable}}, + {u"CSSTextUnderlinePositionLeftRightEnabled", {false, FeatureKind::Internal}}, + {u"CSSTextWrapNewValuesEnabled", {false, FeatureKind::Testable}}, + {u"CSSTypedOMColorEnabled", {false, FeatureKind::Testable}}, + {u"CSSTypedOMEnabled", {true, FeatureKind::Testable}}, + {u"CSSWhiteSpaceLonghandsEnabled", {false, FeatureKind::Testable}}, + {u"CSSWordBreakAutoEnabled", {false, FeatureKind::Testable}}, + {u"CacheAPIEnabled", {true, FeatureKind::Boolean}}, + {u"CanvasColorSpaceEnabled", {false, FeatureKind::Testable}}, + {u"CanvasFiltersEnabled", {false, FeatureKind::Internal}}, + {u"CanvasUsesAcceleratedDrawing", {true, FeatureKind::Boolean}}, + {u"CaretBrowsingEnabled", {false, FeatureKind::Boolean}}, + {u"ClearSiteDataHTTPHeaderEnabled", {true, FeatureKind::Testable}}, + {u"ClientBadgeEnabled", {false, FeatureKind::Internal}}, + {u"ColorFilterEnabled", {false, FeatureKind::Boolean}}, + {u"CompositingBordersVisible", {false, FeatureKind::Internal}}, + {u"CompositingRepaintCountersVisible", {false, FeatureKind::Internal}}, + {u"CompressionStreamEnabled", {true, FeatureKind::Testable}}, + {u"ConstantPropertiesEnabled", {true, FeatureKind::Boolean}}, + {u"ConstructableStylesheetsEnabled", {true, FeatureKind::Testable}}, + {u"ContactPickerAPIEnabled", {false, FeatureKind::Testable}}, + {u"ContentDispositionAttachmentSandboxEnabled", {false, FeatureKind::Boolean}}, + {u"CookieConsentAPIEnabled", {false, FeatureKind::Internal}}, + {u"CookieEnabled", {true, FeatureKind::Boolean}}, + {u"CookieStoreAPIEnabled", {false, FeatureKind::Testable}}, + {u"CoreMathMLEnabled", {false, FeatureKind::Internal}}, + {u"CrossOriginEmbedderPolicyEnabled", {true, FeatureKind::Testable}}, + {u"CrossOriginOpenerPolicyEnabled", {true, FeatureKind::Testable}}, + {u"CursiveFontFamily", {Preferences::StringValue{u"Comic Sans MS"}, FeatureKind::None}}, + {u"CustomPasteboardDataEnabled", {false, FeatureKind::Boolean}}, + {u"DNSPrefetchingEnabled", {false, FeatureKind::Boolean}}, + {u"DOMPasteAccessRequestsEnabled", {false, FeatureKind::Internal}}, + {u"DOMPasteAllowed", {false, FeatureKind::Boolean}}, + {u"DOMTestingAPIsEnabled", {false, FeatureKind::Internal}}, + {u"DOMTimersThrottlingEnabled", {true, FeatureKind::Boolean}}, + {u"DataTransferItemsEnabled", {false, FeatureKind::Boolean}}, + {u"DatabasesEnabled", {true, FeatureKind::Boolean}}, + {u"DeclarativeShadowDOMEnabled", {true, FeatureKind::Testable}}, + {u"DeclarativeShadowDOMInDOMParserEnabled", {false, FeatureKind::Testable}}, + {u"DefaultARIAForCustomElementsEnabled", {true, FeatureKind::Testable}}, + {u"DefaultFixedFontSize", {double{13}, FeatureKind::None}}, + {u"DefaultFontSize", {double{16}, FeatureKind::None}}, + {u"DefaultTextEncodingName", {Preferences::StringValue{u"ISO-8859-1"}, FeatureKind::None}}, + {u"DeprecateRSAESPKCSWebCryptoEnabled", {true, FeatureKind::Testable}}, + {u"DeprecationReportingEnabled", {false, FeatureKind::Testable}}, + {u"DeveloperExtrasEnabled", {false, FeatureKind::Boolean}}, + {u"DeviceHeight", {std::uint32_t{0}, FeatureKind::None}}, + {u"DeviceWidth", {std::uint32_t{0}, FeatureKind::None}}, + {u"DiagnosticLoggingEnabled", {false, FeatureKind::Boolean}}, + {u"DialogElementEnabled", {true, FeatureKind::Testable}}, + {u"DirPseudoEnabled", {true, FeatureKind::Testable}}, + {u"DirectoryUploadEnabled", {false, FeatureKind::Boolean}}, + {u"DisabledAdaptationsMetaTagEnabled", {false, FeatureKind::Boolean}}, + {u"DisallowSyncXHRDuringPageDismissalEnabled", {true, FeatureKind::Testable}}, + {u"DisplayListDrawingEnabled", {false, FeatureKind::Internal}}, + {u"EditableLinkBehavior", {std::uint32_t{4}, FeatureKind::None}}, + {u"EmbedElementEnabled", {true, FeatureKind::Testable}}, + {u"EnableInheritURIQueryComponent", {false, FeatureKind::Boolean}}, + {u"EncryptedMediaAPIEnabled", {std::monostate{}, FeatureKind::Unverified}}, + {u"EnterKeyHintEnabled", {false, FeatureKind::Internal}}, + {u"EnumeratingAllNetworkInterfacesEnabled", {false, FeatureKind::Internal}}, + {u"EnumeratingVisibleNetworkInterfacesEnabled", {false, FeatureKind::Internal}}, + {u"EventHandlerDrivenSmoothKeyboardScrollingEnabled", {false, FeatureKind::Internal}}, + {u"ExtendedAudioDescriptionsEnabled", {false, FeatureKind::Testable}}, + {u"FTPDirectoryTemplatePath", {Preferences::StringValue{u""}, FeatureKind::None}}, + {u"FTPEnabled", {false, FeatureKind::Boolean}}, + {u"FantasyFontFamily", {Preferences::StringValue{u"Impact"}, FeatureKind::None}}, + {u"FetchAPIEnabled", {true, FeatureKind::Testable}}, + {u"FetchAPIKeepAliveEnabled", {true, FeatureKind::Testable}}, + {u"FetchMetadataEnabled", {true, FeatureKind::Testable}}, + {u"FetchPriorityEnabled", {false, FeatureKind::Testable}}, + {u"FileReaderAPIEnabled", {true, FeatureKind::Boolean}}, + {u"FileSystemAccessEnabled", {false, FeatureKind::Testable}}, + {u"FixedFontFamily", {Preferences::StringValue{u"Courier New"}, FeatureKind::None}}, + {u"FlexFormattingContextIntegrationEnabled", {false, FeatureKind::Internal}}, + {u"FocusVisibleEnabled", {true, FeatureKind::Testable}}, + {u"ForceCompositingMode", {false, FeatureKind::Boolean}}, + {u"ForceFTPDirectoryListings", {false, FeatureKind::Boolean}}, + {u"ForceWebGLUsesLowPower", {false, FeatureKind::Boolean}}, + {u"FormAssociatedCustomElementsEnabled", {true, FeatureKind::Testable}}, + {u"FrameFlatteningEnabled", {false, FeatureKind::Boolean}}, + {u"FullScreenEnabled", {false, FeatureKind::Boolean}}, + {u"FullscreenRequirementForScreenOrientationLockingEnabled", {true, FeatureKind::Boolean}}, + {u"GenericCueAPIEnabled", {true, FeatureKind::Testable}}, + {u"GoogleAntiFlickerOptimizationQuirkEnabled", {true, FeatureKind::Testable}}, + {u"HTTPEquivEnabled", {true, FeatureKind::Testable}}, + {u"HasPseudoClassEnabled", {true, FeatureKind::Testable}}, + {u"HiddenPageCSSAnimationSuspensionEnabled", {false, FeatureKind::Boolean}}, + {u"HiddenPageDOMTimerThrottlingAutoIncreases", {false, FeatureKind::Boolean}}, + {u"HiddenPageDOMTimerThrottlingEnabled", {false, FeatureKind::Boolean}}, + {u"HighlightAPIEnabled", {false, FeatureKind::Testable}}, + {u"HyperlinkAuditingEnabled", {true, FeatureKind::Boolean}}, + {u"ICECandidateFilteringEnabled", {true, FeatureKind::Internal}}, + {u"ImperativeSlotAPIEnabled", {true, FeatureKind::Testable}}, + {u"InactiveMediaCaptureSteamRepromptIntervalInMinutes", {double{10}, FeatureKind::None}}, + {u"IncompleteImageBorderEnabled", {false, FeatureKind::Boolean}}, + {u"IncrementalRenderingSuppressionTimeout", {double{5}, FeatureKind::None}}, + {u"IndexedDBAPIEnabled", {true, FeatureKind::Boolean}}, + {u"IndexedDBAPIExposeIndexedDBToWindowOrWorkerEnabled", {false, FeatureKind::Internal}}, + {u"InertAttributeEnabled", {true, FeatureKind::Testable}}, + {u"InlineFormattingContextIntegrationEnabled", {true, FeatureKind::Testable}}, + {u"InlineMediaPlaybackRequiresPlaysInlineAttribute", {false, FeatureKind::Boolean}}, + {u"InlinePredictionsEnabled", {false, FeatureKind::Boolean}}, + {u"InspectorAttachedHeight", {std::uint32_t{500}, FeatureKind::None}}, + {u"InspectorAttachedWidth", {std::uint32_t{750}, FeatureKind::None}}, + {u"InspectorAttachmentSide", {std::uint32_t{0}, FeatureKind::None}}, + {u"InspectorStartsAttached", {true, FeatureKind::Boolean}}, + {u"InspectorWindowFrame", {Preferences::StringValue{u""}, FeatureKind::None}}, + {u"InteractionRegionInlinePadding", {double{4}, FeatureKind::None}}, + {u"InteractionRegionMinimumCornerRadius", {double{8}, FeatureKind::None}}, + {u"InteractiveFormValidationEnabled", {true, FeatureKind::Boolean}}, + {u"IntersectionObserverEnabled", {true, FeatureKind::Testable}}, + {u"InvisibleAutoplayNotPermitted", {false, FeatureKind::Boolean}}, + {u"IsFirstPartyWebsiteDataRemovalDisabled", {false, FeatureKind::Boolean}}, + {u"IsFirstPartyWebsiteDataRemovalLiveOnTestingEnabled", {false, FeatureKind::Boolean}}, + {u"IsFirstPartyWebsiteDataRemovalReproTestingEnabled", {false, FeatureKind::Boolean}}, + {u"IsLoggedInAPIEnabled", {false, FeatureKind::Testable}}, + {u"IsSameSiteStrictEnforcementEnabled", {false, FeatureKind::Internal}}, + {u"IsThirdPartyCookieBlockingDisabled", {false, FeatureKind::Boolean}}, + {u"ItpDebugModeEnabled", {false, FeatureKind::Boolean}}, + {u"JavaScriptCanAccessClipboard", {false, FeatureKind::Boolean}}, + {u"JavaScriptCanOpenWindowsAutomatically", {true, FeatureKind::Boolean}}, + {u"JavaScriptEnabled", {true, FeatureKind::Testable}}, + {u"JavaScriptMarkupEnabled", {true, FeatureKind::Boolean}}, + {u"JavaScriptRuntimeFlags", {std::uint32_t{0}, FeatureKind::None}}, + {u"LargeImageAsyncDecodingEnabled", {true, FeatureKind::Boolean}}, + {u"LayoutFallbackWidth", {std::uint32_t{980}, FeatureKind::None}}, + {u"LayoutFormattingContextEnabled", {false, FeatureKind::Internal}}, + {u"LayoutViewportHeightExpansionFactor", {double{0}, FeatureKind::None}}, + {u"LazyIframeLoadingEnabled", {true, FeatureKind::Testable}}, + {u"LazyImageLoadingEnabled", {true, FeatureKind::Testable}}, + {u"LegacyLineLayoutVisualCoverageEnabled", {false, FeatureKind::Internal}}, + {u"LineHeightUnitsEnabled", {true, FeatureKind::Testable}}, + {u"LinkModulePreloadEnabled", {true, FeatureKind::Testable}}, + {u"LinkPreconnect", {false, FeatureKind::Boolean}}, + {u"LinkPreconnectEarlyHintsEnabled", {false, FeatureKind::Testable}}, + {u"LinkPrefetchEnabled", {false, FeatureKind::Testable}}, + {u"LinkPreloadEnabled", {true, FeatureKind::Boolean}}, + {u"LinkPreloadResponsiveImagesEnabled", {false, FeatureKind::Testable}}, + {u"LinkSanitizerEnabled", {false, FeatureKind::Internal}}, + {u"LiveRangeSelectionEnabled", {true, FeatureKind::Testable}}, + {u"LoadDeferringEnabled", {true, FeatureKind::Boolean}}, + {u"LoadsImagesAutomatically", {true, FeatureKind::Boolean}}, + {u"LocalFileContentSniffingEnabled", {false, FeatureKind::Internal}}, + {u"LocalStorageEnabled", {true, FeatureKind::Testable}}, + {u"LogsPageMessagesToSystemConsoleEnabled", {false, FeatureKind::Internal}}, + {u"LongRunningMediaCaptureStreamRepromptIntervalInHours", {double{24}, FeatureKind::None}}, + {u"LowPowerVideoAudioBufferSizeEnabled", {true, FeatureKind::Boolean}}, + {u"MainContentUserGestureOverrideEnabled", {false, FeatureKind::Boolean}}, + {u"MasonryEnabled", {false, FeatureKind::Testable}}, + {u"MasonryTrackAlignmentEnabled", {false, FeatureKind::Testable}}, + {u"MaxParseDuration", {double{-1}, FeatureKind::None}}, + {u"MediaAudioCodecIDsAllowedInLockdownMode", {Preferences::StringValue{u"aac ,zaac,qaac,caac,.mp3,mp4a"}, FeatureKind::None}}, + {u"MediaCapabilitiesEnabled", {true, FeatureKind::Boolean}}, + {u"MediaCapabilitiesExtensionsEnabled", {true, FeatureKind::Testable}}, + {u"MediaCaptionFormatTypesAllowedInLockdownMode", {Preferences::StringValue{u"c608,wvtt"}, FeatureKind::None}}, + {u"MediaCodecTypesAllowedInLockdownMode", {Preferences::StringValue{u"mp4a.40,avc1"}, FeatureKind::None}}, + {u"MediaContainerTypesAllowedInLockdownMode", {Preferences::StringValue{u"video/mp4,audio/mp4,video/x-m4v,audio/x-m4a,audio/mp3,application/x-mpegURL,application/vnd.apple.mpegURL,video/mp2t,video/iso.segment,audio/aac,audio/mpeg,audio/ac3,audio/eac3,video/mpeg2,text/vtt"}, FeatureKind::None}}, + {u"MediaContentTypesRequiringHardwareSupport", {Preferences::StringValue{u""}, FeatureKind::None}}, + {u"MediaControlsScaleWithPageZoom", {true, FeatureKind::Boolean}}, + {u"MediaDataLoadsAutomatically", {true, FeatureKind::Boolean}}, + {u"MediaEnabled", {true, FeatureKind::Boolean}}, + {u"MediaPlayable", {true, FeatureKind::Boolean}}, + {u"MediaPreferredFullscreenWidth", {double{960}, FeatureKind::None}}, + {u"MediaPreloadingEnabled", {false, FeatureKind::Boolean}}, + {u"MediaSourceEnabled", {std::monostate{}, FeatureKind::Boolean}}, + {u"MediaUserGestureInheritsFromDocument", {false, FeatureKind::Boolean}}, + {u"MediaVideoCodecIDsAllowedInLockdownMode", {Preferences::StringValue{u"avc1,zavc,qavc,cavc"}, FeatureKind::None}}, + {u"MenuItemElementEnabled", {false, FeatureKind::Boolean}}, + {u"MinimumFontSize", {double{0}, FeatureKind::None}}, + {u"MinimumLogicalFontSize", {double{9}, FeatureKind::None}}, + {u"MockCaptureDevicesPromptEnabled", {true, FeatureKind::Boolean}}, + {u"MockScrollbarsControllerEnabled", {false, FeatureKind::Boolean}}, + {u"MockScrollbarsEnabled", {false, FeatureKind::Boolean}}, + {u"MomentumScrollingAnimatorEnabled", {true, FeatureKind::Internal}}, + {u"NeedsAdobeFrameReloadingQuirk", {false, FeatureKind::Boolean}}, + {u"NeedsFrameNameFallbackToIdQuirk", {false, FeatureKind::Boolean}}, + {u"NeedsKeyboardEventDisambiguationQuirks", {false, FeatureKind::Boolean}}, + {u"NeedsSiteSpecificQuirks", {true, FeatureKind::Boolean}}, + {u"NeedsStorageAccessFromFileURLsQuirk", {true, FeatureKind::Boolean}}, + {u"OfflineWebApplicationCacheEnabled", {true, FeatureKind::Boolean}}, + {u"OverflowClipEnabled", {true, FeatureKind::Testable}}, + {u"OverscrollBehaviorEnabled", {true, FeatureKind::Testable}}, + {u"PageAtRuleSupportEnabled", {false, FeatureKind::Internal}}, + {u"PageVisibilityBasedProcessSuppressionEnabled", {true, FeatureKind::Internal}}, + {u"PaintTimingEnabled", {true, FeatureKind::Testable}}, + {u"PassiveTouchListenersAsDefaultOnDocument", {true, FeatureKind::Boolean}}, + {u"PassiveWheelListenersAsDefaultOnDocument", {true, FeatureKind::Boolean}}, + {u"PasswordEchoDuration", {double{2}, FeatureKind::None}}, + {u"PasswordEchoEnabled", {false, FeatureKind::Boolean}}, + {u"PerformanceNavigationTimingAPIEnabled", {true, FeatureKind::Testable}}, + {u"PerformanceResourceTimingSensitivePropertiesEnabled", {true, FeatureKind::Testable}}, + {u"PermissionsAPIEnabled", {false, FeatureKind::Testable}}, + {u"PictographFontFamily", {Preferences::StringValue{u"Times"}, FeatureKind::None}}, + {u"PitchCorrectionAlgorithm", {std::uint32_t{0}, FeatureKind::None}}, + {u"PlayStationMediaPlayerEnabled", {true, FeatureKind::Boolean}}, + {u"PluginsEnabled", {false, FeatureKind::Boolean}}, + {u"PopoverAttributeEnabled", {false, FeatureKind::Testable}}, + {u"PreferPageRenderingUpdatesNear60FPSEnabled", {true, FeatureKind::Boolean}}, + {u"PreferSandboxedMediaParsing", {true, FeatureKind::Internal}}, + {u"PrivateClickMeasurementDebugModeEnabled", {false, FeatureKind::Boolean}}, + {u"PrivateClickMeasurementEnabled", {true, FeatureKind::Boolean}}, + {u"PrivateClickMeasurementFraudPreventionEnabled", {false, FeatureKind::Testable}}, + {u"ProcessSwapOnCrossSiteNavigationEnabled", {false, FeatureKind::Testable}}, + {u"ProcessSwapOnCrossSiteWindowOpenEnabled", {false, FeatureKind::Internal}}, + {u"PunchOutWhiteBackgroundsInDarkMode", {false, FeatureKind::Boolean}}, + {u"ReadableByteStreamAPIEnabled", {false, FeatureKind::Testable}}, + {u"ReferrerPolicyAttributeEnabled", {true, FeatureKind::Testable}}, + {u"ReportingEnabled", {false, FeatureKind::Testable}}, + {u"RequestIdleCallbackEnabled", {false, FeatureKind::Internal}}, + {u"RequestSubmitEnabled", {true, FeatureKind::Testable}}, + {u"RequestVideoFrameCallbackEnabled", {false, FeatureKind::Testable}}, + {u"RequiresPageVisibilityToPlayAudio", {false, FeatureKind::Boolean}}, + {u"RequiresUserGestureForAudioPlayback", {false, FeatureKind::Boolean}}, + {u"RequiresUserGestureForMediaPlayback", {false, FeatureKind::Boolean}}, + {u"RequiresUserGestureForVideoPlayback", {false, FeatureKind::Boolean}}, + {u"RequiresUserGestureToLoadVideo", {false, FeatureKind::Boolean}}, + {u"ResizeObserverEnabled", {true, FeatureKind::Testable}}, + {u"ResourceLoadSchedulingEnabled", {true, FeatureKind::Internal}}, + {u"ResourceUsageOverlayVisible", {false, FeatureKind::Internal}}, + {u"RestrictedHTTPResponseAccess", {true, FeatureKind::Internal}}, + {u"SKAttributionEnabled", {true, FeatureKind::Boolean}}, + {u"SafeBrowsingEnabled", {true, FeatureKind::Boolean}}, + {u"SampledPageTopColorMaxDifference", {double{0}, FeatureKind::None}}, + {u"SampledPageTopColorMinHeight", {double{0}, FeatureKind::None}}, + {u"SansSerifFontFamily", {Preferences::StringValue{u"Helvetica"}, FeatureKind::None}}, + {u"ScreenOrientationAPIEnabled", {false, FeatureKind::Testable}}, + {u"ScreenOrientationLockingAPIEnabled", {false, FeatureKind::Testable}}, + {u"ScreenWakeLockAPIEnabled", {true, FeatureKind::Testable}}, + {u"ScrollAnimatorEnabled", {false, FeatureKind::Boolean}}, + {u"ScrollToTextFragmentEnabled", {true, FeatureKind::Testable}}, + {u"ScrollToTextFragmentIndicatorEnabled", {true, FeatureKind::Boolean}}, + {u"ScrollingPerformanceTestingEnabled", {false, FeatureKind::Internal}}, + {u"SecureContextChecksEnabled", {true, FeatureKind::Internal}}, + {u"SelectTrailingWhitespaceEnabled", {false, FeatureKind::Boolean}}, + {u"SelectionAPIForShadowDOMEnabled", {true, FeatureKind::Testable}}, + {u"SelectionFlippingEnabled", {true, FeatureKind::Boolean}}, + {u"SendMouseEventsToDisabledFormControlsEnabled", {false, FeatureKind::Testable}}, + {u"SerifFontFamily", {Preferences::StringValue{u"Times"}, FeatureKind::None}}, + {u"ServerTimingEnabled", {true, FeatureKind::Testable}}, + {u"ShapeDetection", {false, FeatureKind::Testable}}, + {u"SharedWorkerEnabled", {true, FeatureKind::Testable}}, + {u"ShouldAllowUserInstalledFonts", {true, FeatureKind::Boolean}}, + {u"ShouldConvertInvalidURLsToBlank", {true, FeatureKind::Boolean}}, + {u"ShouldConvertPositionStyleOnCopy", {false, FeatureKind::Boolean}}, + {u"ShouldDecidePolicyBeforeLoadingQuickLookPreview", {false, FeatureKind::Boolean}}, + {u"ShouldDeferAsynchronousScriptsUntilAfterDocumentLoadOrFirstPaint", {true, FeatureKind::Testable}}, + {u"ShouldDisplayCaptions", {false, FeatureKind::Boolean}}, + {u"ShouldDisplaySubtitles", {false, FeatureKind::Boolean}}, + {u"ShouldDisplayTextDescriptions", {false, FeatureKind::Boolean}}, + {u"ShouldDropNearSuspendedAssertionAfterDelay", {false, FeatureKind::Internal}}, + {u"ShouldIgnoreMetaViewport", {false, FeatureKind::Boolean}}, + {u"ShouldPrintBackgrounds", {false, FeatureKind::Boolean}}, + {u"ShouldRespectImageOrientation", {false, FeatureKind::Boolean}}, + {u"ShouldRestrictBaseURLSchemes", {false, FeatureKind::Boolean}}, + {u"ShouldSuppressTextInputFromEditingDuringProvisionalNavigation", {false, FeatureKind::Boolean}}, + {u"ShouldTakeNearSuspendedAssertions", {true, FeatureKind::Internal}}, + {u"ShouldUseServiceWorkerShortTimeout", {false, FeatureKind::Boolean}}, + {u"ShowMediaStatsContextMenuItemEnabled", {false, FeatureKind::Boolean}}, + {u"ShowModalDialogEnabled", {false, FeatureKind::Boolean}}, + {u"ShowsToolTipOverTruncatedText", {false, FeatureKind::Boolean}}, + {u"ShowsURLsInToolTipsEnabled", {false, FeatureKind::Boolean}}, + {u"ShrinksStandaloneImagesToFit", {true, FeatureKind::Boolean}}, + {u"SiteIsolationEnabled", {false, FeatureKind::Internal}}, + {u"SmartInsertDeleteEnabled", {true, FeatureKind::Boolean}}, + {u"SourceBufferChangeTypeEnabled", {std::monostate{}, FeatureKind::Unverified}}, + {u"SpatialNavigationEnabled", {false, FeatureKind::Boolean}}, + {u"SpeechRecognitionEnabled", {false, FeatureKind::Testable}}, + {u"SpeechSynthesisAPIEnabled", {true, FeatureKind::Boolean}}, + {u"SpringTimingFunctionEnabled", {false, FeatureKind::Internal}}, + {u"Standalone", {false, FeatureKind::Boolean}}, + {u"StandardFontFamily", {Preferences::StringValue{u"Times"}, FeatureKind::None}}, + {u"StorageAPIEnabled", {false, FeatureKind::Testable}}, + {u"StorageAPIEstimateEnabled", {false, FeatureKind::Testable}}, + {u"StorageAccessAPIEnabled", {true, FeatureKind::Testable}}, + {u"StorageBlockingPolicy", {std::uint32_t{1}, FeatureKind::None}}, + {u"StrictSecureDecodingForAllObjC", {true, FeatureKind::Internal}}, + {u"SubgridEnabled", {true, FeatureKind::Testable}}, + {u"SuppressesIncrementalRendering", {false, FeatureKind::Boolean}}, + {u"SyntheticEditingCommandsEnabled", {true, FeatureKind::Testable}}, + {u"SystemLayoutDirection", {std::uint32_t{0}, FeatureKind::None}}, + {u"TabsToLinks", {false, FeatureKind::Boolean}}, + {u"TelephoneNumberParsingEnabled", {false, FeatureKind::Boolean}}, + {u"TemporaryTileCohortRetentionEnabled", {true, FeatureKind::Boolean}}, + {u"TextAreasAreResizable", {true, FeatureKind::Boolean}}, + {u"TextInteractionEnabled", {true, FeatureKind::Boolean}}, + {u"ThirdPartyIframeRedirectBlockingEnabled", {true, FeatureKind::Testable}}, + {u"ThreadedScrollingEnabled", {true, FeatureKind::Boolean}}, + {u"TiledScrollingIndicatorVisible", {false, FeatureKind::Internal}}, + {u"TrackConfigurationEnabled", {false, FeatureKind::Testable}}, + {u"TransformStreamAPIEnabled", {true, FeatureKind::Testable}}, + {u"TreatsAnyTextCSSLinkAsStylesheet", {false, FeatureKind::Boolean}}, + {u"UndoManagerAPIEnabled", {false, FeatureKind::Internal}}, + {u"UnprefixedFullscreenAPIEnabled", {true, FeatureKind::Testable}}, + {u"UpgradeKnownHostsToHTTPSEnabled", {true, FeatureKind::Internal}}, + {u"UseGeneralDirectoryForStorage", {true, FeatureKind::Internal}}, + {u"UseGiantTiles", {false, FeatureKind::Boolean}}, + {u"UseImageDocumentForSubframePDF", {false, FeatureKind::Boolean}}, + {u"UseLegacyBackgroundSizeShorthandBehavior", {false, FeatureKind::Boolean}}, + {u"UsePreHTML5ParserQuirks", {false, FeatureKind::Boolean}}, + {u"UserActivationAPIEnabled", {true, FeatureKind::Testable}}, + {u"UserGesturePromisePropagationEnabled", {true, FeatureKind::Internal}}, + {u"UserInterfaceDirectionPolicy", {std::uint32_t{0}, FeatureKind::None}}, + {u"UsesBackForwardCache", {true, FeatureKind::Boolean}}, + {u"UsesEncodingDetector", {false, FeatureKind::Boolean}}, + {u"VerifyWindowOpenUserGestureFromUIProcess", {false, FeatureKind::Testable}}, + {u"VerticalFormControlsEnabled", {false, FeatureKind::Testable}}, + {u"VideoPresentationModeAPIEnabled", {true, FeatureKind::Boolean}}, + {u"VideoQualityIncludesDisplayCompositingEnabled", {false, FeatureKind::Boolean}}, + {u"ViewGestureDebuggingEnabled", {false, FeatureKind::Boolean}}, + {u"VisibleDebugOverlayRegions", {std::uint32_t{0}, FeatureKind::None}}, + {u"VisualViewportAPIEnabled", {true, FeatureKind::Testable}}, + {u"VisualViewportEnabled", {true, FeatureKind::Boolean}}, + {u"WantsBalancedSetDefersLoadingBehavior", {false, FeatureKind::Boolean}}, + {u"WebAPIStatisticsEnabled", {false, FeatureKind::Internal}}, + {u"WebAPIsInShadowRealmEnabled", {false, FeatureKind::Internal}}, + {u"WebAnimationsCompositeOperationsEnabled", {true, FeatureKind::Testable}}, + {u"WebAnimationsCustomEffectsEnabled", {false, FeatureKind::Testable}}, + {u"WebAnimationsCustomFrameRateEnabled", {false, FeatureKind::Testable}}, + {u"WebAnimationsIterationCompositeEnabled", {true, FeatureKind::Testable}}, + {u"WebAnimationsMutableTimelinesEnabled", {true, FeatureKind::Testable}}, + {u"WebCryptoSafeCurvesEnabled", {false, FeatureKind::Testable}}, + {u"WebGLDraftExtensionsEnabled", {false, FeatureKind::Internal}}, + {u"WebGLEnabled", {true, FeatureKind::Testable}}, + {u"WebGLTimerQueriesEnabled", {false, FeatureKind::Boolean}}, + {u"WebGPUEnabled", {false, FeatureKind::Internal}}, + {u"WebInspectorEngineeringSettingsAllowed", {false, FeatureKind::Internal}}, + {u"WebLocksAPIEnabled", {true, FeatureKind::Testable}}, + {u"WebMParserEnabled", {std::monostate{}, FeatureKind::Unverified}}, + {u"WebMusicPlayerEnabled", {false, FeatureKind::Boolean}}, + {u"WebRTCAudioLatencyAdaptationEnabled", {true, FeatureKind::Internal}}, + {u"WebSecurityEnabled", {true, FeatureKind::Boolean}}, + {u"WebShareEnabled", {false, FeatureKind::Boolean}}, + {u"WebShareFileAPIEnabled", {false, FeatureKind::Testable}}, + {u"WebSocketEnabled", {true, FeatureKind::Boolean}}, + {u"WheelEventGesturesBecomeNonBlocking", {true, FeatureKind::Testable}}, + {u"WindowFocusRestricted", {true, FeatureKind::Boolean}}, + {u"WirelessPlaybackTargetAPIEnabled", {true, FeatureKind::Boolean}}, + }; + return definitions; +} + +} + +Preferences::Preferences(StringValue identifier) : identifier(std::move(identifier)) { + values.emplace(u"ShouldRestrictBaseURLSchemes", true); + overriddenDefaults.emplace(u"PluginsEnabled", true); + overriddenDefaults.emplace(u"StorageBlockingPolicy", std::uint32_t{0}); +} + +Preferences::Preferences(const Preferences& other) : values(other.values), overriddenDefaults(other.overriddenDefaults) { + values.insert_or_assign(u"ShouldRestrictBaseURLSchemes", true); +} + +const Preferences::Value* Preferences::findValue(std::u16string_view key, std::size_t type) const { + if (const auto it = values.find(key); it != values.end() && it->second.index() == type) return &it->second; + if (const auto it = overriddenDefaults.find(key); it != overriddenDefaults.end() && it->second.index() == type) return &it->second; + const auto it = Definitions().find(key); + if (it == Definitions().end()) return nullptr; + if (std::holds_alternative(it->second.value)) + throw std::runtime_error("WKPreferences: proprietary PlayStation media-player build configuration is unknown"); + return &it->second.value; +} + +bool Preferences::GetBool(std::u16string_view key) const { + const auto* value = findValue(key, 1); + if (value) { + if (const auto* result = std::get_if(value)) return *result; + } + return false; +} + +std::uint32_t Preferences::GetUInt32(std::u16string_view key) const { + const auto* value = findValue(key, 2); + if (value) { + if (const auto* result = std::get_if(value)) return *result; + } + return 0; +} + +double Preferences::GetDouble(std::u16string_view key) const { + const auto* value = findValue(key, 3); + if (value) { + if (const auto* result = std::get_if(value)) return *result; + } + return 0; +} + +Preferences::StringValue Preferences::GetString(std::u16string_view key) const { + const auto* value = findValue(key, 4); + if (value) { + if (const auto* result = std::get_if(value)) return *result; + } + return std::nullopt; +} + +void Preferences::Set(std::u16string_view key, Value value) { + const Value* existing = nullptr; + if (const auto it = values.find(key); it != values.end() && it->second.index() == value.index()) + existing = &it->second; + if (!existing) { + if (const auto it = overriddenDefaults.find(key); it != overriddenDefaults.end() && it->second.index() == value.index()) + existing = &it->second; + } + if (!existing) { + if (const auto it = Definitions().find(key); it != Definitions().end()) { + if (it->second.value.index() == value.index()) existing = &it->second.value; + else if (std::holds_alternative(it->second.value)) { + values.insert_or_assign(std::u16string(key), std::move(value)); + return; + } + } + } + if (existing && *existing == value) return; + if (!existing && (value == Value(false) || value == Value(std::uint32_t{0}) + || value == Value(double{0}) || value == Value(StringValue{}))) return; + values.insert_or_assign(std::u16string(key), std::move(value)); +} + +void Preferences::SetFeature(std::u16string_view key, bool value) { + const auto it = Definitions().find(key); + if (it == Definitions().end() || it->second.feature == FeatureKind::None) return; + if (it->second.feature == FeatureKind::Unverified) + throw std::runtime_error("WKPreferences: media feature availability is unknown"); + Set(key, value); +} + +void Preferences::EnableAllExperimentalFeatures() { + for (const auto& [key, definition] : Definitions()) { + if (definition.feature == FeatureKind::Testable) Set(key, true); + } +} + +void Preferences::ResetAllInternalDebugFeatures() { + for (const auto& [key, definition] : Definitions()) { + if (definition.feature == FeatureKind::Internal) Set(key, definition.value); + } +} + +} // namespace NKWebKit + +namespace { + +NKWebKit::Preferences* PreferencesFromRef(const void* ref, const char* function) { + return NKWebKit::Cast(ref, function); +} + +NKWebKit::Preferences::StringValue StringFromRef(const void* ref, const char* function) { + const auto* string = NKWebKit::CastOrNull(ref, function); + if (!string || string->null) return std::nullopt; + return string->characters; +} + +std::uint32_t FontSize(double value) { + if (!std::isfinite(value) || value <= -1 || value >= double{std::numeric_limits::max()} + 1) + throw std::out_of_range("WKPreferences: font size cannot be represented by uint32_t"); + return static_cast(value); +} + +} + +extern "C" { +const void* APS5_VABI WKPreferencesCreate() { + return NKWebKit::ToRef(NKWebKit::Make()); +} + +const void* APS5_VABI WKPreferencesCreateWithIdentifier(const void* identifierRef) { + return NKWebKit::ToRef(NKWebKit::Make(StringFromRef(identifierRef, __func__))); +} + +const void* APS5_VABI WKPreferencesCreateCopy(const void* preferencesRef) { + return NKWebKit::ToRef(NKWebKit::Make(*PreferencesFromRef(preferencesRef, __func__))); +} + +void APS5_VABI WKPreferencesEnableAllExperimentalFeatures(const void* preferencesRef) { + PreferencesFromRef(preferencesRef, __func__)->EnableAllExperimentalFeatures(); +} + +void APS5_VABI WKPreferencesSetExperimentalFeatureForKey(const void* preferencesRef, bool value, const void* experimentalFeatureKey) { + auto* preferences = PreferencesFromRef(preferencesRef, __func__); + const auto key = StringFromRef(experimentalFeatureKey, __func__); + if (key) preferences->SetFeature(*key, value); +} + +void APS5_VABI WKPreferencesResetAllInternalDebugFeatures(const void* preferencesRef) { + PreferencesFromRef(preferencesRef, __func__)->ResetAllInternalDebugFeatures(); +} + +void APS5_VABI WKPreferencesSetInternalDebugFeatureForKey(const void* preferencesRef, bool value, const void* internalDebugFeatureKey) { + auto* preferences = PreferencesFromRef(preferencesRef, __func__); + const auto key = StringFromRef(internalDebugFeatureKey, __func__); + if (key) preferences->SetFeature(*key, value); +} + +void APS5_VABI WKPreferencesResetTestRunnerOverrides(const void* preferencesRef) { + PreferencesFromRef(preferencesRef, __func__); +} + +void APS5_VABI WKPreferencesSetJavaScriptEnabled(const void* preferencesRef, bool javaScriptEnabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"JavaScriptEnabled", javaScriptEnabled); +} + +bool APS5_VABI WKPreferencesGetJavaScriptEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"JavaScriptEnabled"); +} + +void APS5_VABI WKPreferencesSetJavaScriptMarkupEnabled(const void* preferencesRef, bool javaScriptMarkupEnabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"JavaScriptMarkupEnabled", javaScriptMarkupEnabled); +} + +bool APS5_VABI WKPreferencesGetJavaScriptMarkupEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"JavaScriptMarkupEnabled"); +} + +void APS5_VABI WKPreferencesSetLoadsImagesAutomatically(const void* preferencesRef, bool loadsImagesAutomatically) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"LoadsImagesAutomatically", loadsImagesAutomatically); +} + +bool APS5_VABI WKPreferencesGetLoadsImagesAutomatically(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"LoadsImagesAutomatically"); +} + +void APS5_VABI WKPreferencesSetOfflineWebApplicationCacheEnabled(const void* preferencesRef, bool offlineWebApplicationCacheEnabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"OfflineWebApplicationCacheEnabled", offlineWebApplicationCacheEnabled); +} + +bool APS5_VABI WKPreferencesGetOfflineWebApplicationCacheEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"OfflineWebApplicationCacheEnabled"); +} + +void APS5_VABI WKPreferencesSetLocalStorageEnabled(const void* preferencesRef, bool localStorageEnabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"LocalStorageEnabled", localStorageEnabled); +} + +bool APS5_VABI WKPreferencesGetLocalStorageEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"LocalStorageEnabled"); +} + +void APS5_VABI WKPreferencesSetDatabasesEnabled(const void* preferencesRef, bool databasesEnabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"DatabasesEnabled", databasesEnabled); +} + +bool APS5_VABI WKPreferencesGetDatabasesEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"DatabasesEnabled"); +} + +void APS5_VABI WKPreferencesSetFrameFlatteningEnabled(const void* preferencesRef, bool frameFlatteningEnabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"FrameFlatteningEnabled", frameFlatteningEnabled); +} + +bool APS5_VABI WKPreferencesGetFrameFlatteningEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"FrameFlatteningEnabled"); +} + +void APS5_VABI WKPreferencesSetPluginsEnabled(const void* preferencesRef, bool pluginsEnabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"PluginsEnabled", pluginsEnabled); +} + +bool APS5_VABI WKPreferencesGetPluginsEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"PluginsEnabled"); +} + +void APS5_VABI WKPreferencesSetJavaScriptCanOpenWindowsAutomatically(const void* preferencesRef, bool javaScriptCanOpenWindowsAutomatically) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"JavaScriptCanOpenWindowsAutomatically", javaScriptCanOpenWindowsAutomatically); +} + +bool APS5_VABI WKPreferencesGetJavaScriptCanOpenWindowsAutomatically(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"JavaScriptCanOpenWindowsAutomatically"); +} + +void APS5_VABI WKPreferencesSetHyperlinkAuditingEnabled(const void* preferencesRef, bool hyperlinkAuditingEnabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"HyperlinkAuditingEnabled", hyperlinkAuditingEnabled); +} + +bool APS5_VABI WKPreferencesGetHyperlinkAuditingEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"HyperlinkAuditingEnabled"); +} + +void APS5_VABI WKPreferencesSetStandardFontFamily(const void* preferencesRef, const void* family) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"StandardFontFamily", StringFromRef(family, __func__)); +} + +const void* APS5_VABI WKPreferencesCopyStandardFontFamily(const void* preferencesRef) { + return NKWebKit::ToRef(NKWebKit::Make(PreferencesFromRef(preferencesRef, __func__)->GetString(u"StandardFontFamily").value_or(std::u16string()))); +} + +void APS5_VABI WKPreferencesSetFixedFontFamily(const void* preferencesRef, const void* family) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"FixedFontFamily", StringFromRef(family, __func__)); +} + +const void* APS5_VABI WKPreferencesCopyFixedFontFamily(const void* preferencesRef) { + return NKWebKit::ToRef(NKWebKit::Make(PreferencesFromRef(preferencesRef, __func__)->GetString(u"FixedFontFamily").value_or(std::u16string()))); +} + +void APS5_VABI WKPreferencesSetSerifFontFamily(const void* preferencesRef, const void* family) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"SerifFontFamily", StringFromRef(family, __func__)); +} + +const void* APS5_VABI WKPreferencesCopySerifFontFamily(const void* preferencesRef) { + return NKWebKit::ToRef(NKWebKit::Make(PreferencesFromRef(preferencesRef, __func__)->GetString(u"SerifFontFamily").value_or(std::u16string()))); +} + +void APS5_VABI WKPreferencesSetSansSerifFontFamily(const void* preferencesRef, const void* family) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"SansSerifFontFamily", StringFromRef(family, __func__)); +} + +const void* APS5_VABI WKPreferencesCopySansSerifFontFamily(const void* preferencesRef) { + return NKWebKit::ToRef(NKWebKit::Make(PreferencesFromRef(preferencesRef, __func__)->GetString(u"SansSerifFontFamily").value_or(std::u16string()))); +} + +void APS5_VABI WKPreferencesSetCursiveFontFamily(const void* preferencesRef, const void* family) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"CursiveFontFamily", StringFromRef(family, __func__)); +} + +const void* APS5_VABI WKPreferencesCopyCursiveFontFamily(const void* preferencesRef) { + return NKWebKit::ToRef(NKWebKit::Make(PreferencesFromRef(preferencesRef, __func__)->GetString(u"CursiveFontFamily").value_or(std::u16string()))); +} + +void APS5_VABI WKPreferencesSetFantasyFontFamily(const void* preferencesRef, const void* family) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"FantasyFontFamily", StringFromRef(family, __func__)); +} + +const void* APS5_VABI WKPreferencesCopyFantasyFontFamily(const void* preferencesRef) { + return NKWebKit::ToRef(NKWebKit::Make(PreferencesFromRef(preferencesRef, __func__)->GetString(u"FantasyFontFamily").value_or(std::u16string()))); +} + +void APS5_VABI WKPreferencesSetPictographFontFamily(const void* preferencesRef, const void* family) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"PictographFontFamily", StringFromRef(family, __func__)); +} + +const void* APS5_VABI WKPreferencesCopyPictographFontFamily(const void* preferencesRef) { + return NKWebKit::ToRef(NKWebKit::Make(PreferencesFromRef(preferencesRef, __func__)->GetString(u"PictographFontFamily").value_or(std::u16string()))); +} + +void APS5_VABI WKPreferencesSetDefaultFontSize(const void* preferencesRef, std::uint32_t size) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"DefaultFontSize", static_cast(size)); +} + +std::uint32_t APS5_VABI WKPreferencesGetDefaultFontSize(const void* preferencesRef) { + return FontSize(PreferencesFromRef(preferencesRef, __func__)->GetDouble(u"DefaultFontSize")); +} + +void APS5_VABI WKPreferencesSetDefaultFixedFontSize(const void* preferencesRef, std::uint32_t size) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"DefaultFixedFontSize", static_cast(size)); +} + +std::uint32_t APS5_VABI WKPreferencesGetDefaultFixedFontSize(const void* preferencesRef) { + return FontSize(PreferencesFromRef(preferencesRef, __func__)->GetDouble(u"DefaultFixedFontSize")); +} + +void APS5_VABI WKPreferencesSetMinimumFontSize(const void* preferencesRef, std::uint32_t size) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"MinimumFontSize", static_cast(size)); +} + +std::uint32_t APS5_VABI WKPreferencesGetMinimumFontSize(const void* preferencesRef) { + return FontSize(PreferencesFromRef(preferencesRef, __func__)->GetDouble(u"MinimumFontSize")); +} + +void APS5_VABI WKPreferencesSetCookieEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"CookieEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetCookieEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"CookieEnabled"); +} + +void APS5_VABI WKPreferencesSetEditableLinkBehavior(const void* preferencesRef, WKEditableLinkBehavior wkBehavior) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"EditableLinkBehavior", static_cast(wkBehavior >= 0 && wkBehavior <= 4 ? wkBehavior : kWKEditableLinkBehaviorNeverLive)); +} + +WKEditableLinkBehavior APS5_VABI WKPreferencesGetEditableLinkBehavior(const void* preferencesRef) { + const auto value = PreferencesFromRef(preferencesRef, __func__)->GetUInt32(u"EditableLinkBehavior"); + return static_cast(value <= 4 ? value : 4); +} + +void APS5_VABI WKPreferencesSetDefaultTextEncodingName(const void* preferencesRef, const void* name) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"DefaultTextEncodingName", StringFromRef(name, __func__)); +} + +const void* APS5_VABI WKPreferencesCopyDefaultTextEncodingName(const void* preferencesRef) { + return NKWebKit::ToRef(NKWebKit::Make(PreferencesFromRef(preferencesRef, __func__)->GetString(u"DefaultTextEncodingName").value_or(std::u16string()))); +} + +void APS5_VABI WKPreferencesSetDeveloperExtrasEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"DeveloperExtrasEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetDeveloperExtrasEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"DeveloperExtrasEnabled"); +} + +void APS5_VABI WKPreferencesSetJavaScriptRuntimeFlags(const void* preferencesRef, std::uint32_t javaScriptRuntimeFlagSet) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"JavaScriptRuntimeFlags", static_cast(javaScriptRuntimeFlagSet)); +} + +std::uint32_t APS5_VABI WKPreferencesGetJavaScriptRuntimeFlags(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetUInt32(u"JavaScriptRuntimeFlags"); +} + +void APS5_VABI WKPreferencesSetTextAreasAreResizable(const void* preferencesRef, bool resizable) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"TextAreasAreResizable", resizable); +} + +bool APS5_VABI WKPreferencesGetTextAreasAreResizable(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"TextAreasAreResizable"); +} + +void APS5_VABI WKPreferencesSetSubpixelAntialiasedLayerTextEnabled(const void*, bool) { +} + +bool APS5_VABI WKPreferencesGetSubpixelAntialiasedLayerTextEnabled(const void*) { + return false; +} + +void APS5_VABI WKPreferencesSetAcceleratedDrawingEnabled(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"AcceleratedDrawingEnabled", flag); +} + +bool APS5_VABI WKPreferencesGetAcceleratedDrawingEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"AcceleratedDrawingEnabled"); +} + +void APS5_VABI WKPreferencesSetCanvasUsesAcceleratedDrawing(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"CanvasUsesAcceleratedDrawing", flag); +} + +bool APS5_VABI WKPreferencesGetCanvasUsesAcceleratedDrawing(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"CanvasUsesAcceleratedDrawing"); +} + +void APS5_VABI WKPreferencesSetAcceleratedCompositingEnabled(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"AcceleratedCompositingEnabled", flag); +} + +bool APS5_VABI WKPreferencesGetAcceleratedCompositingEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"AcceleratedCompositingEnabled"); +} + +void APS5_VABI WKPreferencesSetCompositingBordersVisible(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"CompositingBordersVisible", flag); +} + +bool APS5_VABI WKPreferencesGetCompositingBordersVisible(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"CompositingBordersVisible"); +} + +void APS5_VABI WKPreferencesSetCompositingRepaintCountersVisible(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"CompositingRepaintCountersVisible", flag); +} + +bool APS5_VABI WKPreferencesGetCompositingRepaintCountersVisible(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"CompositingRepaintCountersVisible"); +} + +void APS5_VABI WKPreferencesSetTiledScrollingIndicatorVisible(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"TiledScrollingIndicatorVisible", flag); +} + +bool APS5_VABI WKPreferencesGetTiledScrollingIndicatorVisible(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"TiledScrollingIndicatorVisible"); +} + +void APS5_VABI WKPreferencesSetWebGLEnabled(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"WebGLEnabled", flag); +} + +bool APS5_VABI WKPreferencesGetWebGLEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"WebGLEnabled"); +} + +void APS5_VABI WKPreferencesSetNeedsSiteSpecificQuirks(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"NeedsSiteSpecificQuirks", flag); +} + +bool APS5_VABI WKPreferencesGetNeedsSiteSpecificQuirks(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"NeedsSiteSpecificQuirks"); +} + +void APS5_VABI WKPreferencesSetForceFTPDirectoryListings(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"ForceFTPDirectoryListings", flag); +} + +bool APS5_VABI WKPreferencesGetForceFTPDirectoryListings(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"ForceFTPDirectoryListings"); +} + +void APS5_VABI WKPreferencesSetFTPDirectoryTemplatePath(const void* preferencesRef, const void* pathRef) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"FTPDirectoryTemplatePath", StringFromRef(pathRef, __func__)); +} + +const void* APS5_VABI WKPreferencesCopyFTPDirectoryTemplatePath(const void* preferencesRef) { + return NKWebKit::ToRef(NKWebKit::Make(PreferencesFromRef(preferencesRef, __func__)->GetString(u"FTPDirectoryTemplatePath").value_or(std::u16string()))); +} + +void APS5_VABI WKPreferencesSetTabsToLinks(const void* preferencesRef, bool tabsToLinks) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"TabsToLinks", tabsToLinks); +} + +bool APS5_VABI WKPreferencesGetTabsToLinks(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"TabsToLinks"); +} + +void APS5_VABI WKPreferencesSetDNSPrefetchingEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"DNSPrefetchingEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetDNSPrefetchingEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"DNSPrefetchingEnabled"); +} + +void APS5_VABI WKPreferencesSetAuthorAndUserStylesEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"AuthorAndUserStylesEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetAuthorAndUserStylesEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"AuthorAndUserStylesEnabled"); +} + +void APS5_VABI WKPreferencesSetShouldPrintBackgrounds(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"ShouldPrintBackgrounds", flag); +} + +bool APS5_VABI WKPreferencesGetShouldPrintBackgrounds(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"ShouldPrintBackgrounds"); +} + +void APS5_VABI WKPreferencesSetDOMTimersThrottlingEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"DOMTimersThrottlingEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetDOMTimersThrottlingEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"DOMTimersThrottlingEnabled"); +} + +void APS5_VABI WKPreferencesSetWebArchiveDebugModeEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"WebArchiveDebugModeEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetWebArchiveDebugModeEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"WebArchiveDebugModeEnabled"); +} + +void APS5_VABI WKPreferencesSetLocalFileContentSniffingEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"LocalFileContentSniffingEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetLocalFileContentSniffingEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"LocalFileContentSniffingEnabled"); +} + +void APS5_VABI WKPreferencesSetPageCacheEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"UsesBackForwardCache", enabled); +} + +bool APS5_VABI WKPreferencesGetPageCacheEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"UsesBackForwardCache"); +} + +void APS5_VABI WKPreferencesSetPageCacheSupportsPlugins(const void*, bool) { +} + +bool APS5_VABI WKPreferencesGetPageCacheSupportsPlugins(const void*) { + return false; +} + +void APS5_VABI WKPreferencesSetDOMPasteAllowed(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"DOMPasteAllowed", enabled); +} + +bool APS5_VABI WKPreferencesGetDOMPasteAllowed(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"DOMPasteAllowed"); +} + +void APS5_VABI WKPreferencesSetJavaScriptCanAccessClipboard(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"JavaScriptCanAccessClipboard", enabled); +} + +bool APS5_VABI WKPreferencesGetJavaScriptCanAccessClipboard(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"JavaScriptCanAccessClipboard"); +} + +void APS5_VABI WKPreferencesSetFullScreenEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"FullScreenEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetFullScreenEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"FullScreenEnabled"); +} + +void APS5_VABI WKPreferencesSetAsynchronousSpellCheckingEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"AsynchronousSpellCheckingEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetAsynchronousSpellCheckingEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"AsynchronousSpellCheckingEnabled"); +} + +void APS5_VABI WKPreferencesSetAVFoundationEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"AVFoundationEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetAVFoundationEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"AVFoundationEnabled"); +} + +void APS5_VABI WKPreferencesSetWebSecurityEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"WebSecurityEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetWebSecurityEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"WebSecurityEnabled"); +} + +void APS5_VABI WKPreferencesSetUniversalAccessFromFileURLsAllowed(const void* preferencesRef, bool allowed) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"AllowUniversalAccessFromFileURLs", allowed); +} + +bool APS5_VABI WKPreferencesGetUniversalAccessFromFileURLsAllowed(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"AllowUniversalAccessFromFileURLs"); +} + +void APS5_VABI WKPreferencesSetFileAccessFromFileURLsAllowed(const void* preferencesRef, bool allowed) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"AllowFileAccessFromFileURLs", allowed); +} + +bool APS5_VABI WKPreferencesGetFileAccessFromFileURLsAllowed(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"AllowFileAccessFromFileURLs"); +} + +void APS5_VABI WKPreferencesSetTopNavigationToDataURLsAllowed(const void* preferencesRef, bool allowed) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"AllowTopNavigationToDataURLs", allowed); +} + +bool APS5_VABI WKPreferencesGetTopNavigationToDataURLsAllowed(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"AllowTopNavigationToDataURLs"); +} + +void APS5_VABI WKPreferencesSetNeedsStorageAccessFromFileURLsQuirk(const void* preferencesRef, bool needsQuirk) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"NeedsStorageAccessFromFileURLsQuirk", needsQuirk); +} + +bool APS5_VABI WKPreferencesGetNeedsStorageAccessFromFileURLsQuirk(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"NeedsStorageAccessFromFileURLsQuirk"); +} + +void APS5_VABI WKPreferencesSetMediaPlaybackRequiresUserGesture(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"RequiresUserGestureForMediaPlayback", flag); +} + +bool APS5_VABI WKPreferencesGetMediaPlaybackRequiresUserGesture(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"RequiresUserGestureForMediaPlayback"); +} + +void APS5_VABI WKPreferencesSetVideoPlaybackRequiresUserGesture(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"RequiresUserGestureForVideoPlayback", flag); +} + +bool APS5_VABI WKPreferencesGetVideoPlaybackRequiresUserGesture(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"RequiresUserGestureForVideoPlayback"); +} + +void APS5_VABI WKPreferencesSetAudioPlaybackRequiresUserGesture(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"RequiresUserGestureForAudioPlayback", flag); +} + +bool APS5_VABI WKPreferencesGetAudioPlaybackRequiresUserGesture(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"RequiresUserGestureForAudioPlayback"); +} + +void APS5_VABI WKPreferencesSetMainContentUserGestureOverrideEnabled(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"MainContentUserGestureOverrideEnabled", flag); +} + +bool APS5_VABI WKPreferencesGetMainContentUserGestureOverrideEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"MainContentUserGestureOverrideEnabled"); +} + +void APS5_VABI WKPreferencesSetMediaPlaybackAllowsInline(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"AllowsInlineMediaPlayback", flag); +} + +bool APS5_VABI WKPreferencesGetMediaPlaybackAllowsInline(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"AllowsInlineMediaPlayback"); +} + +void APS5_VABI WKPreferencesSetInlineMediaPlaybackRequiresPlaysInlineAttribute(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"InlineMediaPlaybackRequiresPlaysInlineAttribute", flag); +} + +bool APS5_VABI WKPreferencesGetInlineMediaPlaybackRequiresPlaysInlineAttribute(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"InlineMediaPlaybackRequiresPlaysInlineAttribute"); +} + +void APS5_VABI WKPreferencesSetBeaconAPIEnabled(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"BeaconAPIEnabled", flag); +} + +bool APS5_VABI WKPreferencesGetBeaconAPIEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"BeaconAPIEnabled"); +} + +void APS5_VABI WKPreferencesSetDirectoryUploadEnabled(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"DirectoryUploadEnabled", flag); +} + +bool APS5_VABI WKPreferencesGetDirectoryUploadEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"DirectoryUploadEnabled"); +} + +void APS5_VABI WKPreferencesSetMediaControlsScaleWithPageZoom(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"MediaControlsScaleWithPageZoom", flag); +} + +bool APS5_VABI WKPreferencesGetMediaControlsScaleWithPageZoom(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"MediaControlsScaleWithPageZoom"); +} + +void APS5_VABI WKPreferencesSetWebAuthenticationEnabled(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"WebAuthenticationEnabled", flag); +} + +bool APS5_VABI WKPreferencesGetWebAuthenticationEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"WebAuthenticationEnabled"); +} + +void APS5_VABI WKPreferencesSetInvisibleMediaAutoplayPermitted(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"InvisibleAutoplayNotPermitted", !flag); +} + +bool APS5_VABI WKPreferencesGetInvisibleMediaAutoplayPermitted(const void* preferencesRef) { + return !PreferencesFromRef(preferencesRef, __func__)->GetBool(u"InvisibleAutoplayNotPermitted"); +} + +void APS5_VABI WKPreferencesSetShowsToolTipOverTruncatedText(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"ShowsToolTipOverTruncatedText", flag); +} + +bool APS5_VABI WKPreferencesGetShowsToolTipOverTruncatedText(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"ShowsToolTipOverTruncatedText"); +} + +void APS5_VABI WKPreferencesSetMockScrollbarsEnabled(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"MockScrollbarsEnabled", flag); +} + +bool APS5_VABI WKPreferencesGetMockScrollbarsEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"MockScrollbarsEnabled"); +} + +void APS5_VABI WKPreferencesSetAttachmentElementEnabled(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"AttachmentElementEnabled", flag); +} + +bool APS5_VABI WKPreferencesGetAttachmentElementEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"AttachmentElementEnabled"); +} + +void APS5_VABI WKPreferencesSetWebAudioEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"WebAudioEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetWebAudioEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"WebAudioEnabled"); +} + +void APS5_VABI WKPreferencesSetSuppressesIncrementalRendering(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"SuppressesIncrementalRendering", enabled); +} + +bool APS5_VABI WKPreferencesGetSuppressesIncrementalRendering(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"SuppressesIncrementalRendering"); +} + +void APS5_VABI WKPreferencesSetBackspaceKeyNavigationEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"BackspaceKeyNavigationEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetBackspaceKeyNavigationEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"BackspaceKeyNavigationEnabled"); +} + +void APS5_VABI WKPreferencesSetCaretBrowsingEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"CaretBrowsingEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetCaretBrowsingEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"CaretBrowsingEnabled"); +} + +void APS5_VABI WKPreferencesSetShouldDisplaySubtitles(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"ShouldDisplaySubtitles", enabled); +} + +bool APS5_VABI WKPreferencesGetShouldDisplaySubtitles(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"ShouldDisplaySubtitles"); +} + +void APS5_VABI WKPreferencesSetShouldDisplayCaptions(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"ShouldDisplayCaptions", enabled); +} + +bool APS5_VABI WKPreferencesGetShouldDisplayCaptions(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"ShouldDisplayCaptions"); +} + +void APS5_VABI WKPreferencesSetShouldDisplayTextDescriptions(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"ShouldDisplayTextDescriptions", enabled); +} + +bool APS5_VABI WKPreferencesGetShouldDisplayTextDescriptions(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"ShouldDisplayTextDescriptions"); +} + +void APS5_VABI WKPreferencesSetNotificationsEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"NotificationsEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetNotificationsEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"NotificationsEnabled"); +} + +void APS5_VABI WKPreferencesSetShouldRespectImageOrientation(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"ShouldRespectImageOrientation", enabled); +} + +bool APS5_VABI WKPreferencesGetShouldRespectImageOrientation(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"ShouldRespectImageOrientation"); +} + +void APS5_VABI WKPreferencesSetRequestAnimationFrameEnabled(const void*, bool) { +} + +bool APS5_VABI WKPreferencesGetRequestAnimationFrameEnabled(const void*) { + return true; +} + +void APS5_VABI WKPreferencesSetStorageBlockingPolicy(const void* preferencesRef, WKStorageBlockingPolicy policy) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"StorageBlockingPolicy", static_cast(policy >= 0 && policy <= 2 ? policy : kWKAllowAllStorage)); +} + +WKStorageBlockingPolicy APS5_VABI WKPreferencesGetStorageBlockingPolicy(const void* preferencesRef) { + const auto value = PreferencesFromRef(preferencesRef, __func__)->GetUInt32(u"StorageBlockingPolicy"); + return static_cast(value <= 2 ? value : 0); +} + +void APS5_VABI WKPreferencesSetDiagnosticLoggingEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"DiagnosticLoggingEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetDiagnosticLoggingEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"DiagnosticLoggingEnabled"); +} + +void APS5_VABI WKPreferencesSetAsynchronousPluginInitializationEnabled(const void*, bool) { +} + +bool APS5_VABI WKPreferencesGetAsynchronousPluginInitializationEnabled(const void*) { + return false; +} + +void APS5_VABI WKPreferencesSetAsynchronousPluginInitializationEnabledForAllPlugins(const void*, bool) { +} + +bool APS5_VABI WKPreferencesGetAsynchronousPluginInitializationEnabledForAllPlugins(const void*) { + return false; +} + +void APS5_VABI WKPreferencesSetArtificialPluginInitializationDelayEnabled(const void*, bool) { +} + +bool APS5_VABI WKPreferencesGetArtificialPluginInitializationDelayEnabled(const void*) { + return false; +} + +void APS5_VABI WKPreferencesSetInteractiveFormValidationEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"InteractiveFormValidationEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetInteractiveFormValidationEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"InteractiveFormValidationEnabled"); +} + +void APS5_VABI WKPreferencesSetScrollingPerformanceLoggingEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"ScrollingPerformanceTestingEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetScrollingPerformanceLoggingEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"ScrollingPerformanceTestingEnabled"); +} + +void APS5_VABI WKPreferencesSetPlugInSnapshottingEnabled(const void*, bool) { +} + +bool APS5_VABI WKPreferencesGetPlugInSnapshottingEnabled(const void*) { + return false; +} + +void APS5_VABI WKPreferencesSetPluginSandboxProfilesEnabledForAllPlugins(const void*, bool) { +} + +bool APS5_VABI WKPreferencesGetPluginSandboxProfilesEnabledForAllPlugins(const void*) { + return false; +} + +void APS5_VABI WKPreferencesSetSnapshotAllPlugIns(const void*, bool) { +} + +bool APS5_VABI WKPreferencesGetSnapshotAllPlugIns(const void*) { + return false; +} + +void APS5_VABI WKPreferencesSetAutostartOriginPlugInSnapshottingEnabled(const void*, bool) { +} + +bool APS5_VABI WKPreferencesGetAutostartOriginPlugInSnapshottingEnabled(const void*) { + return false; +} + +void APS5_VABI WKPreferencesSetPrimaryPlugInSnapshotDetectionEnabled(const void*, bool) { +} + +bool APS5_VABI WKPreferencesGetPrimaryPlugInSnapshotDetectionEnabled(const void*) { + return false; +} + +void APS5_VABI WKPreferencesSetPDFPluginEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"PDFPluginEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetPDFPluginEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"PDFPluginEnabled"); +} + +void APS5_VABI WKPreferencesSetEncodingDetectorEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"UsesEncodingDetector", enabled); +} + +bool APS5_VABI WKPreferencesGetEncodingDetectorEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"UsesEncodingDetector"); +} + +void APS5_VABI WKPreferencesSetTextAutosizingEnabled(const void* preferencesRef, bool textAutosizingEnabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"TextAutosizingEnabled", textAutosizingEnabled); +} + +bool APS5_VABI WKPreferencesGetTextAutosizingEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"TextAutosizingEnabled"); +} + +void APS5_VABI WKPreferencesSetTextAutosizingUsesIdempotentMode(const void* preferencesRef, bool textAutosizingUsesIdempotentModeEnabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"TextAutosizingUsesIdempotentMode", textAutosizingUsesIdempotentModeEnabled); +} + +bool APS5_VABI WKPreferencesGetTextAutosizingUsesIdempotentMode(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"TextAutosizingUsesIdempotentMode"); +} + +void APS5_VABI WKPreferencesSetAggressiveTileRetentionEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"AggressiveTileRetentionEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetAggressiveTileRetentionEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"AggressiveTileRetentionEnabled"); +} + +void APS5_VABI WKPreferencesSetLogsPageMessagesToSystemConsoleEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"LogsPageMessagesToSystemConsoleEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetLogsPageMessagesToSystemConsoleEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"LogsPageMessagesToSystemConsoleEnabled"); +} + +void APS5_VABI WKPreferencesSetPageVisibilityBasedProcessSuppressionEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"PageVisibilityBasedProcessSuppressionEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetPageVisibilityBasedProcessSuppressionEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"PageVisibilityBasedProcessSuppressionEnabled"); +} + +void APS5_VABI WKPreferencesSetSmartInsertDeleteEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"SmartInsertDeleteEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetSmartInsertDeleteEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"SmartInsertDeleteEnabled"); +} + +void APS5_VABI WKPreferencesSetSelectTrailingWhitespaceEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"SelectTrailingWhitespaceEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetSelectTrailingWhitespaceEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"SelectTrailingWhitespaceEnabled"); +} + +void APS5_VABI WKPreferencesSetShowsURLsInToolTipsEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"ShowsURLsInToolTipsEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetShowsURLsInToolTipsEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"ShowsURLsInToolTipsEnabled"); +} + +void APS5_VABI WKPreferencesSetHiddenPageDOMTimerThrottlingEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"HiddenPageDOMTimerThrottlingEnabled", enabled); +} + +void APS5_VABI WKPreferencesSetHiddenPageDOMTimerThrottlingAutoIncreases(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"HiddenPageDOMTimerThrottlingAutoIncreases", enabled); +} + +bool APS5_VABI WKPreferencesGetHiddenPageDOMTimerThrottlingEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"HiddenPageDOMTimerThrottlingEnabled"); +} + +bool APS5_VABI WKPreferencesGetHiddenPageDOMTimerThrottlingAutoIncreases(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"HiddenPageDOMTimerThrottlingAutoIncreases"); +} + +void APS5_VABI WKPreferencesSetHiddenPageCSSAnimationSuspensionEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"HiddenPageCSSAnimationSuspensionEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetHiddenPageCSSAnimationSuspensionEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"HiddenPageCSSAnimationSuspensionEnabled"); +} + +void APS5_VABI WKPreferencesSetIncrementalRenderingSuppressionTimeout(const void* preferencesRef, double timeout) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"IncrementalRenderingSuppressionTimeout", static_cast(timeout)); +} + +double APS5_VABI WKPreferencesGetIncrementalRenderingSuppressionTimeout(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetDouble(u"IncrementalRenderingSuppressionTimeout"); +} + +void APS5_VABI WKPreferencesSetThreadedScrollingEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"ThreadedScrollingEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetThreadedScrollingEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"ThreadedScrollingEnabled"); +} + +void APS5_VABI WKPreferencesSetContentChangeObserverEnabled(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"ContentChangeObserverEnabled", flag); +} + +bool APS5_VABI WKPreferencesGetContentChangeObserverEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"ContentChangeObserverEnabled"); +} + +void APS5_VABI WKPreferencesSetUseGiantTiles(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"UseGiantTiles", flag); +} + +bool APS5_VABI WKPreferencesGetUseGiantTiles(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"UseGiantTiles"); +} + +void APS5_VABI WKPreferencesSetMediaDevicesEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"MediaDevicesEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetMediaDevicesEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"MediaDevicesEnabled"); +} + +void APS5_VABI WKPreferencesSetMediaStreamEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"MediaStreamEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetMediaStreamEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"MediaStreamEnabled"); +} + +void APS5_VABI WKPreferencesSetPeerConnectionEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"PeerConnectionEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetPeerConnectionEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"PeerConnectionEnabled"); +} + +void APS5_VABI WKPreferencesSetSpatialNavigationEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"SpatialNavigationEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetSpatialNavigationEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"SpatialNavigationEnabled"); +} + +void APS5_VABI WKPreferencesSetMediaSourceEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"MediaSourceEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetMediaSourceEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"MediaSourceEnabled"); +} + +void APS5_VABI WKPreferencesSetSourceBufferChangeTypeEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"SourceBufferChangeTypeEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetSourceBufferChangeTypeEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"SourceBufferChangeTypeEnabled"); +} + +void APS5_VABI WKPreferencesSetViewGestureDebuggingEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"ViewGestureDebuggingEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetViewGestureDebuggingEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"ViewGestureDebuggingEnabled"); +} + +void APS5_VABI WKPreferencesSetShouldConvertPositionStyleOnCopy(const void* preferencesRef, bool convert) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"ShouldConvertPositionStyleOnCopy", convert); +} + +bool APS5_VABI WKPreferencesGetShouldConvertPositionStyleOnCopy(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"ShouldConvertPositionStyleOnCopy"); +} + +void APS5_VABI WKPreferencesSetTelephoneNumberParsingEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"TelephoneNumberParsingEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetTelephoneNumberParsingEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"TelephoneNumberParsingEnabled"); +} + +void APS5_VABI WKPreferencesSetEnableInheritURIQueryComponent(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"EnableInheritURIQueryComponent", enabled); +} + +bool APS5_VABI WKPreferencesGetEnableInheritURIQueryComponent(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"EnableInheritURIQueryComponent"); +} + +void APS5_VABI WKPreferencesSetServiceControlsEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"ServiceControlsEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetServiceControlsEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"ServiceControlsEnabled"); +} + +void APS5_VABI WKPreferencesSetImageControlsEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"ImageControlsEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetImageControlsEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"ImageControlsEnabled"); +} + +void APS5_VABI WKPreferencesSetGamepadsEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"GamepadsEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetGamepadsEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"GamepadsEnabled"); +} + +void APS5_VABI WKPreferencesSetHighlightAPIEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"HighlightAPIEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetHighlightAPIEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"HighlightAPIEnabled"); +} + +void APS5_VABI WKPreferencesSetMinimumZoomFontSize(const void* preferencesRef, double size) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"MinimumZoomFontSize", static_cast(size)); +} + +double APS5_VABI WKPreferencesGetMinimumZoomFontSize(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetDouble(u"MinimumZoomFontSize"); +} + +void APS5_VABI WKPreferencesSetVisibleDebugOverlayRegions(const void* preferencesRef, std::uint32_t visibleRegions) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"VisibleDebugOverlayRegions", static_cast(visibleRegions)); +} + +std::uint32_t APS5_VABI WKPreferencesGetVisibleDebugOverlayRegions(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetUInt32(u"VisibleDebugOverlayRegions"); +} + +void APS5_VABI WKPreferencesSetMetaRefreshEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"HTTPEquivEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetMetaRefreshEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"HTTPEquivEnabled"); +} + +void APS5_VABI WKPreferencesSetHTTPEquivEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"HTTPEquivEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetHTTPEquivEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"HTTPEquivEnabled"); +} + +void APS5_VABI WKPreferencesSetAllowsAirPlayForMediaPlayback(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"AllowsAirPlayForMediaPlayback", enabled); +} + +bool APS5_VABI WKPreferencesGetAllowsAirPlayForMediaPlayback(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"AllowsAirPlayForMediaPlayback"); +} + +void APS5_VABI WKPreferencesSetUserInterfaceDirectionPolicy(const void* preferencesRef, _WKUserInterfaceDirectionPolicy userInterfaceDirectionPolicy) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"UserInterfaceDirectionPolicy", static_cast(userInterfaceDirectionPolicy)); +} + +_WKUserInterfaceDirectionPolicy APS5_VABI WKPreferencesGetUserInterfaceDirectionPolicy(const void* preferencesRef) { + return static_cast<_WKUserInterfaceDirectionPolicy>(PreferencesFromRef(preferencesRef, __func__)->GetUInt32(u"UserInterfaceDirectionPolicy")); +} + +void APS5_VABI WKPreferencesSetResourceUsageOverlayVisible(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"ResourceUsageOverlayVisible", enabled); +} + +bool APS5_VABI WKPreferencesGetResourceUsageOverlayVisible(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"ResourceUsageOverlayVisible"); +} + +void APS5_VABI WKPreferencesSetMockCaptureDevicesEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"MockCaptureDevicesEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetMockCaptureDevicesEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"MockCaptureDevicesEnabled"); +} + +void APS5_VABI WKPreferencesSetICECandidateFilteringEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"ICECandidateFilteringEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetICECandidateFilteringEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"ICECandidateFilteringEnabled"); +} + +void APS5_VABI WKPreferencesSetEnumeratingAllNetworkInterfacesEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"EnumeratingAllNetworkInterfacesEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetEnumeratingAllNetworkInterfacesEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"EnumeratingAllNetworkInterfacesEnabled"); +} + +void APS5_VABI WKPreferencesSetMediaCaptureRequiresSecureConnection(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"MediaCaptureRequiresSecureConnection", enabled); +} + +bool APS5_VABI WKPreferencesGetMediaCaptureRequiresSecureConnection(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"MediaCaptureRequiresSecureConnection"); +} + +void APS5_VABI WKPreferencesSetInactiveMediaCaptureSteamRepromptIntervalInMinutes(const void* preferencesRef, double interval) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"InactiveMediaCaptureSteamRepromptIntervalInMinutes", static_cast(interval)); +} + +double APS5_VABI WKPreferencesGetInactiveMediaCaptureSteamRepromptIntervalInMinutes(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetDouble(u"InactiveMediaCaptureSteamRepromptIntervalInMinutes"); +} + +void APS5_VABI WKPreferencesSetDataTransferItemsEnabled(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"DataTransferItemsEnabled", flag); +} + +bool APS5_VABI WKPreferencesGetDataTransferItemsEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"DataTransferItemsEnabled"); +} + +void APS5_VABI WKPreferencesSetCustomPasteboardDataEnabled(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"CustomPasteboardDataEnabled", flag); +} + +bool APS5_VABI WKPreferencesGetCustomPasteboardDataEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"CustomPasteboardDataEnabled"); +} + +void APS5_VABI WKPreferencesSetWebShareEnabled(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"WebShareEnabled", flag); +} + +bool APS5_VABI WKPreferencesGetWebShareEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"WebShareEnabled"); +} + +void APS5_VABI WKPreferencesSetDownloadAttributeEnabled(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"DownloadAttributeEnabled", flag); +} + +bool APS5_VABI WKPreferencesGetDownloadAttributeEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"DownloadAttributeEnabled"); +} + +void APS5_VABI WKPreferencesSetIntersectionObserverEnabled(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"IntersectionObserverEnabled", flag); +} + +bool APS5_VABI WKPreferencesGetIntersectionObserverEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"IntersectionObserverEnabled"); +} + +void APS5_VABI WKPreferencesSetMenuItemElementEnabled(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"MenuItemElementEnabled", flag); +} + +bool APS5_VABI WKPreferencesGetMenuItemElementEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"MenuItemElementEnabled"); +} + +void APS5_VABI WKPreferencesSetPaintTimingEnabled(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"PaintTimingEnabled", flag); +} + +bool APS5_VABI WKPreferencesGetPaintTimingEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"PaintTimingEnabled"); +} + +void APS5_VABI WKPreferencesSetIsAccessibilityIsolatedTreeEnabled(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"IsAccessibilityIsolatedTreeEnabled", flag); +} + +bool APS5_VABI WKPreferencesGetIsAccessibilityIsolatedTreeEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"IsAccessibilityIsolatedTreeEnabled"); +} + +void APS5_VABI WKPreferencesSetFetchAPIKeepAliveEnabled(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"FetchAPIKeepAliveEnabled", flag); +} + +bool APS5_VABI WKPreferencesGetFetchAPIKeepAliveEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"FetchAPIKeepAliveEnabled"); +} + +void APS5_VABI WKPreferencesSetAllowsPictureInPictureMediaPlayback(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"AllowsPictureInPictureMediaPlayback", enabled); +} + +bool APS5_VABI WKPreferencesGetAllowsPictureInPictureMediaPlayback(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"AllowsPictureInPictureMediaPlayback"); +} + +bool APS5_VABI WKPreferencesGetApplePayEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"ApplePayEnabled"); +} + +void APS5_VABI WKPreferencesSetApplePayEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"ApplePayEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetApplePayCapabilityDisclosureAllowed(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"ApplePayCapabilityDisclosureAllowed"); +} + +void APS5_VABI WKPreferencesSetApplePayCapabilityDisclosureAllowed(const void* preferencesRef, bool allowed) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"ApplePayCapabilityDisclosureAllowed", allowed); +} + +void APS5_VABI WKPreferencesSetLinkPreloadEnabled(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"LinkPreloadEnabled", flag); +} + +bool APS5_VABI WKPreferencesGetLinkPreloadEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"LinkPreloadEnabled"); +} + +void APS5_VABI WKPreferencesSetMediaPreloadingEnabled(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"MediaPreloadingEnabled", flag); +} + +bool APS5_VABI WKPreferencesGetMediaPreloadingEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"MediaPreloadingEnabled"); +} + +void APS5_VABI WKPreferencesSetLargeImageAsyncDecodingEnabled(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"LargeImageAsyncDecodingEnabled", flag); +} + +bool APS5_VABI WKPreferencesGetLargeImageAsyncDecodingEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"LargeImageAsyncDecodingEnabled"); +} + +void APS5_VABI WKPreferencesSetAnimatedImageAsyncDecodingEnabled(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"AnimatedImageAsyncDecodingEnabled", flag); +} + +bool APS5_VABI WKPreferencesGetAnimatedImageAsyncDecodingEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"AnimatedImageAsyncDecodingEnabled"); +} + +void APS5_VABI WKPreferencesSetEncryptedMediaAPIEnabled(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"EncryptedMediaAPIEnabled", flag); +} + +bool APS5_VABI WKPreferencesGetEncryptedMediaAPIEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"EncryptedMediaAPIEnabled"); +} + +void APS5_VABI WKPreferencesSetShouldSuppressKeyboardInputDuringProvisionalNavigation(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"ShouldSuppressTextInputFromEditingDuringProvisionalNavigation", flag); +} + +bool APS5_VABI WKPreferencesGetShouldSuppressKeyboardInputDuringProvisionalNavigation(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"ShouldSuppressTextInputFromEditingDuringProvisionalNavigation"); +} + +void APS5_VABI WKPreferencesSetMediaUserGestureInheritsFromDocument(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"MediaUserGestureInheritsFromDocument", flag); +} + +bool APS5_VABI WKPreferencesGetMediaUserGestureInheritsFromDocument(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"MediaUserGestureInheritsFromDocument"); +} + +void APS5_VABI WKPreferencesSetMediaContentTypesRequiringHardwareSupport(const void* preferencesRef, const void* codecs) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"MediaContentTypesRequiringHardwareSupport", StringFromRef(codecs, __func__)); +} + +const void* APS5_VABI WKPreferencesCopyMediaContentTypesRequiringHardwareSupport(const void* preferencesRef) { + return NKWebKit::ToRef(NKWebKit::Make(PreferencesFromRef(preferencesRef, __func__)->GetString(u"MediaContentTypesRequiringHardwareSupport").value_or(std::u16string()))); +} + +bool APS5_VABI WKPreferencesGetLegacyEncryptedMediaAPIEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"LegacyEncryptedMediaAPIEnabled"); +} + +void APS5_VABI WKPreferencesSetLegacyEncryptedMediaAPIEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"LegacyEncryptedMediaAPIEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetAllowMediaContentTypesRequiringHardwareSupportAsFallback(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"AllowMediaContentTypesRequiringHardwareSupportAsFallback"); +} + +void APS5_VABI WKPreferencesSetAllowMediaContentTypesRequiringHardwareSupportAsFallback(const void* preferencesRef, bool allow) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"AllowMediaContentTypesRequiringHardwareSupportAsFallback", allow); +} + +void APS5_VABI WKPreferencesSetStorageAccessAPIEnabled(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"StorageAccessAPIEnabled", flag); +} + +bool APS5_VABI WKPreferencesGetStorageAccessAPIEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"StorageAccessAPIEnabled"); +} + +void APS5_VABI WKPreferencesSetSyntheticEditingCommandsEnabled(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"SyntheticEditingCommandsEnabled", flag); +} + +bool APS5_VABI WKPreferencesGetSyntheticEditingCommandsEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"SyntheticEditingCommandsEnabled"); +} + +void APS5_VABI WKPreferencesSetCSSOMViewScrollingAPIEnabled(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"CSSOMViewScrollingAPIEnabled", flag); +} + +bool APS5_VABI WKPreferencesGetCSSOMViewScrollingAPIEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"CSSOMViewScrollingAPIEnabled"); +} + +void APS5_VABI WKPreferencesSetShouldAllowUserInstalledFonts(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"ShouldAllowUserInstalledFonts", flag); +} + +bool APS5_VABI WKPreferencesGetShouldAllowUserInstalledFonts(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"ShouldAllowUserInstalledFonts"); +} + +void APS5_VABI WKPreferencesSetMediaCapabilitiesEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"MediaCapabilitiesEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetMediaCapabilitiesEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"MediaCapabilitiesEnabled"); +} + +void APS5_VABI WKPreferencesSetAllowCrossOriginSubresourcesToAskForCredentials(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"AllowCrossOriginSubresourcesToAskForCredentials", flag); +} + +bool APS5_VABI WKPreferencesGetAllowCrossOriginSubresourcesToAskForCredentials(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"AllowCrossOriginSubresourcesToAskForCredentials"); +} + +void APS5_VABI WKPreferencesSetRestrictedHTTPResponseAccess(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"RestrictedHTTPResponseAccess", flag); +} + +bool APS5_VABI WKPreferencesGetRestrictedHTTPResponseAccess(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"RestrictedHTTPResponseAccess"); +} + +void APS5_VABI WKPreferencesSetServerTimingEnabled(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"ServerTimingEnabled", flag); +} + +bool APS5_VABI WKPreferencesGetServerTimingEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"ServerTimingEnabled"); +} + +void APS5_VABI WKPreferencesSetColorFilterEnabled(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"ColorFilterEnabled", flag); +} + +bool APS5_VABI WKPreferencesGetColorFilterEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"ColorFilterEnabled"); +} + +void APS5_VABI WKPreferencesSetProcessSwapOnNavigationEnabled(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"ProcessSwapOnCrossSiteNavigationEnabled", flag); +} + +bool APS5_VABI WKPreferencesGetProcessSwapOnNavigationEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"ProcessSwapOnCrossSiteNavigationEnabled"); +} + +void APS5_VABI WKPreferencesSetPunchOutWhiteBackgroundsInDarkMode(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"PunchOutWhiteBackgroundsInDarkMode", flag); +} + +bool APS5_VABI WKPreferencesGetPunchOutWhiteBackgroundsInDarkMode(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"PunchOutWhiteBackgroundsInDarkMode"); +} + +void APS5_VABI WKPreferencesSetCaptureAudioInUIProcessEnabled(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"CaptureAudioInUIProcessEnabled", flag); +} + +bool APS5_VABI WKPreferencesGetCaptureAudioInUIProcessEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"CaptureAudioInUIProcessEnabled"); +} + +void APS5_VABI WKPreferencesSetCaptureAudioInGPUProcessEnabled(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"CaptureAudioInGPUProcessEnabled", flag); +} + +bool APS5_VABI WKPreferencesGetCaptureAudioInGPUProcessEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"CaptureAudioInGPUProcessEnabled"); +} + +void APS5_VABI WKPreferencesSetCaptureVideoInUIProcessEnabled(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"CaptureVideoInUIProcessEnabled", flag); +} + +bool APS5_VABI WKPreferencesGetCaptureVideoInUIProcessEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"CaptureVideoInUIProcessEnabled"); +} + +void APS5_VABI WKPreferencesSetCaptureVideoInGPUProcessEnabled(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"CaptureVideoInGPUProcessEnabled", flag); +} + +bool APS5_VABI WKPreferencesGetCaptureVideoInGPUProcessEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"CaptureVideoInGPUProcessEnabled"); +} + +void APS5_VABI WKPreferencesSetReferrerPolicyAttributeEnabled(const void* preferencesRef, bool flag) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"ReferrerPolicyAttributeEnabled", flag); +} + +bool APS5_VABI WKPreferencesGetReferrerPolicyAttributeEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"ReferrerPolicyAttributeEnabled"); +} + +bool APS5_VABI WKPreferencesGetRemotePlaybackEnabled(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"RemotePlaybackEnabled"); +} + +void APS5_VABI WKPreferencesSetRemotePlaybackEnabled(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"RemotePlaybackEnabled", enabled); +} + +bool APS5_VABI WKPreferencesGetShouldUseServiceWorkerShortTimeout(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"ShouldUseServiceWorkerShortTimeout"); +} + +void APS5_VABI WKPreferencesSetShouldUseServiceWorkerShortTimeout(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"ShouldUseServiceWorkerShortTimeout", enabled); +} + +void APS5_VABI WKPreferencesSetAVFoundationNSURLSessionEnabled(const void*, bool) { +} + +bool APS5_VABI WKPreferencesGetAVFoundationNSURLSessionEnabled(const void*) { + return true; +} + +void APS5_VABI WKPreferencesSetPrivateBrowsingEnabled(const void*, bool) { +} + +bool APS5_VABI WKPreferencesGetPrivateBrowsingEnabled(const void*) { + return false; +} + +void APS5_VABI WKPreferencesSetIgnoreViewportScalingConstraints(const void*, bool) { +} + +bool APS5_VABI WKPreferencesGetIgnoreViewportScalingConstraints(const void*) { + return false; +} + +void APS5_VABI WKPreferencesSetKeygenElementEnabled(const void*, bool) { +} + +bool APS5_VABI WKPreferencesGetKeygenElementEnabled(const void*) { + return false; +} + +void APS5_VABI WKPreferencesSetNewBlockInsideInlineModelEnabled(const void*, bool) { +} + +bool APS5_VABI WKPreferencesGetNewBlockInsideInlineModelEnabled(const void*) { + return false; +} + +void APS5_VABI WKPreferencesSetLongMousePressEnabled(const void*, bool) { +} + +bool APS5_VABI WKPreferencesGetLongMousePressEnabled(const void*) { + return false; +} + +void APS5_VABI WKPreferencesSetAntialiasedFontDilationEnabled(const void*, bool) { +} + +bool APS5_VABI WKPreferencesGetAntialiasedFontDilationEnabled(const void*) { + return false; +} + +void APS5_VABI WKPreferencesSetHixie76WebSocketProtocolEnabled(const void*, bool) { +} + +bool APS5_VABI WKPreferencesGetHixie76WebSocketProtocolEnabled(const void*) { + return false; +} + +void APS5_VABI WKPreferencesSetFetchAPIEnabled(const void*, bool) { +} + +bool APS5_VABI WKPreferencesGetFetchAPIEnabled(const void*) { + return true; +} + +void APS5_VABI WKPreferencesSetIsSecureContextAttributeEnabled(const void*, bool) { +} + +bool APS5_VABI WKPreferencesGetIsSecureContextAttributeEnabled(const void*) { + return true; +} + +void APS5_VABI WKPreferencesSetUserTimingEnabled(const void*, bool) { +} + +bool APS5_VABI WKPreferencesGetUserTimingEnabled(const void*) { + return true; +} + +void APS5_VABI WKPreferencesSetResourceTimingEnabled(const void*, bool) { +} + +bool APS5_VABI WKPreferencesGetResourceTimingEnabled(const void*) { + return true; +} + +void APS5_VABI WKPreferencesSetCrossOriginResourcePolicyEnabled(const void*, bool) { +} + +bool APS5_VABI WKPreferencesGetCrossOriginResourcePolicyEnabled(const void*) { + return true; +} + +void APS5_VABI WKPreferencesSetSubpixelCSSOMElementMetricsEnabled(const void*, bool) { +} + +bool APS5_VABI WKPreferencesGetSubpixelCSSOMElementMetricsEnabled(const void*) { + return false; +} + +void APS5_VABI WKPreferencesSetWebSQLDisabled(const void*, bool) { +} + +bool APS5_VABI WKPreferencesGetWebSQLDisabled(const void*) { + return true; +} + +void APS5_VABI WKPreferencesSetXSSAuditorEnabled(const void*, bool) { +} + +bool APS5_VABI WKPreferencesGetXSSAuditorEnabled(const void*) { + return false; +} + +void APS5_VABI WKPreferencesSetJavaEnabled(const void*, bool) { +} + +bool APS5_VABI WKPreferencesGetJavaEnabled(const void*) { + return false; +} + +void APS5_VABI WKPreferencesSetPaginateDuringLayoutEnabled(const void*, bool) { +} + +bool APS5_VABI WKPreferencesGetPaginateDuringLayoutEnabled(const void*) { + return false; +} + +void APS5_VABI WKPreferencesSetLoadsSiteIconsIgnoringImageLoadingPreference(const void*, bool) { +} + +bool APS5_VABI WKPreferencesGetLoadsSiteIconsIgnoringImageLoadingPreference(const void*) { + return false; +} + +void APS5_VABI WKPreferencesSetMediaPlayable(const void* preferencesRef, bool enabled) { + PreferencesFromRef(preferencesRef, __func__)->Set(u"MediaPlayable", enabled); +} + +bool APS5_VABI WKPreferencesGetMediaPlayable(const void* preferencesRef) { + return PreferencesFromRef(preferencesRef, __func__)->GetBool(u"MediaPlayable"); +} + +} diff --git a/core/libs/prx/libSceNKWebKit/src/Preferences.hpp b/core/libs/prx/libSceNKWebKit/src/Preferences.hpp new file mode 100644 index 0000000000..e9352ef83a --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/Preferences.hpp @@ -0,0 +1,458 @@ +#pragma once + +#include "prx/libSceNKWebKit/src/Object.hpp" +#include +#include +#include +#include +#include +#include + +namespace NKWebKit { + +class Preferences final : public ObjectOf { +public: + using StringValue = std::optional; + using Value = std::variant; + + explicit Preferences(StringValue identifier = std::nullopt); + Preferences(const Preferences& other); + bool GetBool(std::u16string_view key) const; + std::uint32_t GetUInt32(std::u16string_view key) const; + double GetDouble(std::u16string_view key) const; + StringValue GetString(std::u16string_view key) const; + void Set(std::u16string_view key, Value value); + void SetFeature(std::u16string_view key, bool value); + void EnableAllExperimentalFeatures(); + void ResetAllInternalDebugFeatures(); + +private: + const Value* findValue(std::u16string_view key, std::size_t type) const; + StringValue identifier; + std::map> values; + std::map> overriddenDefaults; +}; + +} // namespace NKWebKit + +enum WKEditableLinkBehavior { + kWKEditableLinkBehaviorDefault, + kWKEditableLinkBehaviorAlwaysLive, + kWKEditableLinkBehaviorOnlyLiveWithShiftKey, + kWKEditableLinkBehaviorLiveWhenNotFocused, + kWKEditableLinkBehaviorNeverLive +}; + +enum WKStorageBlockingPolicy { + kWKAllowAllStorage, + kWKBlockThirdPartyStorage, + kWKBlockAllStorage +}; + +enum _WKUserInterfaceDirectionPolicy { + kWKUserInterfaceDirectionPolicyContent, + kWKUserInterfaceDirectionPolicySystem +}; + +extern "C" { + +const void* APS5_VABI WKPreferencesCopyCursiveFontFamily(const void* preferencesRef); +const void* APS5_VABI WKPreferencesCopyDefaultTextEncodingName(const void* preferencesRef); +const void* APS5_VABI WKPreferencesCopyFTPDirectoryTemplatePath(const void* preferencesRef); +const void* APS5_VABI WKPreferencesCopyFantasyFontFamily(const void* preferencesRef); +const void* APS5_VABI WKPreferencesCopyFixedFontFamily(const void* preferencesRef); +const void* APS5_VABI WKPreferencesCopyMediaContentTypesRequiringHardwareSupport(const void* preferencesRef); +const void* APS5_VABI WKPreferencesCopyPictographFontFamily(const void* preferencesRef); +const void* APS5_VABI WKPreferencesCopySansSerifFontFamily(const void* preferencesRef); +const void* APS5_VABI WKPreferencesCopySerifFontFamily(const void* preferencesRef); +const void* APS5_VABI WKPreferencesCopyStandardFontFamily(const void* preferencesRef); +const void* APS5_VABI WKPreferencesCreate(); +const void* APS5_VABI WKPreferencesCreateCopy(const void* preferencesRef); +const void* APS5_VABI WKPreferencesCreateWithIdentifier(const void* identifierRef); +void APS5_VABI WKPreferencesEnableAllExperimentalFeatures(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetAVFoundationEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetAVFoundationNSURLSessionEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetAcceleratedCompositingEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetAcceleratedDrawingEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetAggressiveTileRetentionEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetAllowCrossOriginSubresourcesToAskForCredentials(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetAllowMediaContentTypesRequiringHardwareSupportAsFallback(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetAllowsAirPlayForMediaPlayback(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetAllowsPictureInPictureMediaPlayback(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetAnimatedImageAsyncDecodingEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetAntialiasedFontDilationEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetApplePayCapabilityDisclosureAllowed(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetApplePayEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetArtificialPluginInitializationDelayEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetAsynchronousPluginInitializationEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetAsynchronousPluginInitializationEnabledForAllPlugins(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetAsynchronousSpellCheckingEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetAttachmentElementEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetAudioPlaybackRequiresUserGesture(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetAuthorAndUserStylesEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetAutostartOriginPlugInSnapshottingEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetBackspaceKeyNavigationEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetBeaconAPIEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetCSSOMViewScrollingAPIEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetCanvasUsesAcceleratedDrawing(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetCaptureAudioInGPUProcessEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetCaptureAudioInUIProcessEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetCaptureVideoInGPUProcessEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetCaptureVideoInUIProcessEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetCaretBrowsingEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetColorFilterEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetCompositingBordersVisible(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetCompositingRepaintCountersVisible(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetContentChangeObserverEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetCookieEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetCrossOriginResourcePolicyEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetCustomPasteboardDataEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetDNSPrefetchingEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetDOMPasteAllowed(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetDOMTimersThrottlingEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetDataTransferItemsEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetDatabasesEnabled(const void* preferencesRef); +std::uint32_t APS5_VABI WKPreferencesGetDefaultFixedFontSize(const void* preferencesRef); +std::uint32_t APS5_VABI WKPreferencesGetDefaultFontSize(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetDeveloperExtrasEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetDiagnosticLoggingEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetDirectoryUploadEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetDownloadAttributeEnabled(const void* preferencesRef); +WKEditableLinkBehavior APS5_VABI WKPreferencesGetEditableLinkBehavior(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetEnableInheritURIQueryComponent(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetEncodingDetectorEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetEncryptedMediaAPIEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetEnumeratingAllNetworkInterfacesEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetFetchAPIEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetFetchAPIKeepAliveEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetFileAccessFromFileURLsAllowed(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetForceFTPDirectoryListings(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetFrameFlatteningEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetFullScreenEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetGamepadsEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetHTTPEquivEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetHiddenPageCSSAnimationSuspensionEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetHiddenPageDOMTimerThrottlingAutoIncreases(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetHiddenPageDOMTimerThrottlingEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetHighlightAPIEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetHixie76WebSocketProtocolEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetHyperlinkAuditingEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetICECandidateFilteringEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetIgnoreViewportScalingConstraints(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetImageControlsEnabled(const void* preferencesRef); +double APS5_VABI WKPreferencesGetInactiveMediaCaptureSteamRepromptIntervalInMinutes(const void* preferencesRef); +double APS5_VABI WKPreferencesGetIncrementalRenderingSuppressionTimeout(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetInlineMediaPlaybackRequiresPlaysInlineAttribute(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetInteractiveFormValidationEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetIntersectionObserverEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetInvisibleMediaAutoplayPermitted(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetIsAccessibilityIsolatedTreeEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetIsSecureContextAttributeEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetJavaEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetJavaScriptCanAccessClipboard(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetJavaScriptCanOpenWindowsAutomatically(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetJavaScriptEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetJavaScriptMarkupEnabled(const void* preferencesRef); +std::uint32_t APS5_VABI WKPreferencesGetJavaScriptRuntimeFlags(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetKeygenElementEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetLargeImageAsyncDecodingEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetLegacyEncryptedMediaAPIEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetLinkPreloadEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetLoadsImagesAutomatically(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetLoadsSiteIconsIgnoringImageLoadingPreference(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetLocalFileContentSniffingEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetLocalStorageEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetLogsPageMessagesToSystemConsoleEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetLongMousePressEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetMainContentUserGestureOverrideEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetMediaCapabilitiesEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetMediaCaptureRequiresSecureConnection(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetMediaControlsScaleWithPageZoom(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetMediaDevicesEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetMediaPlayable(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetMediaPlaybackAllowsInline(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetMediaPlaybackRequiresUserGesture(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetMediaPreloadingEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetMediaSourceEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetMediaStreamEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetMediaUserGestureInheritsFromDocument(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetMenuItemElementEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetMetaRefreshEnabled(const void* preferencesRef); +std::uint32_t APS5_VABI WKPreferencesGetMinimumFontSize(const void* preferencesRef); +double APS5_VABI WKPreferencesGetMinimumZoomFontSize(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetMockCaptureDevicesEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetMockScrollbarsEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetNeedsSiteSpecificQuirks(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetNeedsStorageAccessFromFileURLsQuirk(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetNewBlockInsideInlineModelEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetNotificationsEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetOfflineWebApplicationCacheEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetPDFPluginEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetPageCacheEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetPageCacheSupportsPlugins(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetPageVisibilityBasedProcessSuppressionEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetPaginateDuringLayoutEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetPaintTimingEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetPeerConnectionEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetPlugInSnapshottingEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetPluginSandboxProfilesEnabledForAllPlugins(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetPluginsEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetPrimaryPlugInSnapshotDetectionEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetPrivateBrowsingEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetProcessSwapOnNavigationEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetPunchOutWhiteBackgroundsInDarkMode(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetReferrerPolicyAttributeEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetRemotePlaybackEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetRequestAnimationFrameEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetResourceTimingEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetResourceUsageOverlayVisible(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetRestrictedHTTPResponseAccess(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetScrollingPerformanceLoggingEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetSelectTrailingWhitespaceEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetServerTimingEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetServiceControlsEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetShouldAllowUserInstalledFonts(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetShouldConvertPositionStyleOnCopy(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetShouldDisplayCaptions(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetShouldDisplaySubtitles(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetShouldDisplayTextDescriptions(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetShouldPrintBackgrounds(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetShouldRespectImageOrientation(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetShouldSuppressKeyboardInputDuringProvisionalNavigation(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetShouldUseServiceWorkerShortTimeout(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetShowsToolTipOverTruncatedText(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetShowsURLsInToolTipsEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetSmartInsertDeleteEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetSnapshotAllPlugIns(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetSourceBufferChangeTypeEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetSpatialNavigationEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetStorageAccessAPIEnabled(const void* preferencesRef); +WKStorageBlockingPolicy APS5_VABI WKPreferencesGetStorageBlockingPolicy(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetSubpixelAntialiasedLayerTextEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetSubpixelCSSOMElementMetricsEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetSuppressesIncrementalRendering(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetSyntheticEditingCommandsEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetTabsToLinks(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetTelephoneNumberParsingEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetTextAreasAreResizable(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetTextAutosizingEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetTextAutosizingUsesIdempotentMode(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetThreadedScrollingEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetTiledScrollingIndicatorVisible(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetTopNavigationToDataURLsAllowed(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetUniversalAccessFromFileURLsAllowed(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetUseGiantTiles(const void* preferencesRef); +_WKUserInterfaceDirectionPolicy APS5_VABI WKPreferencesGetUserInterfaceDirectionPolicy(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetUserTimingEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetVideoPlaybackRequiresUserGesture(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetViewGestureDebuggingEnabled(const void* preferencesRef); +std::uint32_t APS5_VABI WKPreferencesGetVisibleDebugOverlayRegions(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetWebArchiveDebugModeEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetWebAudioEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetWebAuthenticationEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetWebGLEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetWebSQLDisabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetWebSecurityEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetWebShareEnabled(const void* preferencesRef); +bool APS5_VABI WKPreferencesGetXSSAuditorEnabled(const void* preferencesRef); +void APS5_VABI WKPreferencesResetAllInternalDebugFeatures(const void* preferencesRef); +void APS5_VABI WKPreferencesResetTestRunnerOverrides(const void* preferencesRef); +void APS5_VABI WKPreferencesSetAVFoundationEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetAVFoundationNSURLSessionEnabled(const void* preferencesRef, bool value); +void APS5_VABI WKPreferencesSetAcceleratedCompositingEnabled(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetAcceleratedDrawingEnabled(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetAggressiveTileRetentionEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetAllowCrossOriginSubresourcesToAskForCredentials(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetAllowMediaContentTypesRequiringHardwareSupportAsFallback(const void* preferencesRef, bool allow); +void APS5_VABI WKPreferencesSetAllowsAirPlayForMediaPlayback(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetAllowsPictureInPictureMediaPlayback(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetAnimatedImageAsyncDecodingEnabled(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetAntialiasedFontDilationEnabled(const void* preferencesRef, bool value); +void APS5_VABI WKPreferencesSetApplePayCapabilityDisclosureAllowed(const void* preferencesRef, bool allowed); +void APS5_VABI WKPreferencesSetApplePayEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetArtificialPluginInitializationDelayEnabled(const void* preferencesRef, bool value); +void APS5_VABI WKPreferencesSetAsynchronousPluginInitializationEnabled(const void* preferencesRef, bool value); +void APS5_VABI WKPreferencesSetAsynchronousPluginInitializationEnabledForAllPlugins(const void* preferencesRef, bool value); +void APS5_VABI WKPreferencesSetAsynchronousSpellCheckingEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetAttachmentElementEnabled(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetAudioPlaybackRequiresUserGesture(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetAuthorAndUserStylesEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetAutostartOriginPlugInSnapshottingEnabled(const void* preferencesRef, bool value); +void APS5_VABI WKPreferencesSetBackspaceKeyNavigationEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetBeaconAPIEnabled(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetCSSOMViewScrollingAPIEnabled(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetCanvasUsesAcceleratedDrawing(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetCaptureAudioInGPUProcessEnabled(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetCaptureAudioInUIProcessEnabled(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetCaptureVideoInGPUProcessEnabled(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetCaptureVideoInUIProcessEnabled(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetCaretBrowsingEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetColorFilterEnabled(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetCompositingBordersVisible(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetCompositingRepaintCountersVisible(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetContentChangeObserverEnabled(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetCookieEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetCrossOriginResourcePolicyEnabled(const void* preferencesRef, bool value); +void APS5_VABI WKPreferencesSetCursiveFontFamily(const void* preferencesRef, const void* family); +void APS5_VABI WKPreferencesSetCustomPasteboardDataEnabled(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetDNSPrefetchingEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetDOMPasteAllowed(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetDOMTimersThrottlingEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetDataTransferItemsEnabled(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetDatabasesEnabled(const void* preferencesRef, bool databasesEnabled); +void APS5_VABI WKPreferencesSetDefaultFixedFontSize(const void* preferencesRef, std::uint32_t size); +void APS5_VABI WKPreferencesSetDefaultFontSize(const void* preferencesRef, std::uint32_t size); +void APS5_VABI WKPreferencesSetDefaultTextEncodingName(const void* preferencesRef, const void* name); +void APS5_VABI WKPreferencesSetDeveloperExtrasEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetDiagnosticLoggingEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetDirectoryUploadEnabled(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetDownloadAttributeEnabled(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetEditableLinkBehavior(const void* preferencesRef, WKEditableLinkBehavior wkBehavior); +void APS5_VABI WKPreferencesSetEnableInheritURIQueryComponent(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetEncodingDetectorEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetEncryptedMediaAPIEnabled(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetEnumeratingAllNetworkInterfacesEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetExperimentalFeatureForKey(const void* preferencesRef, bool value, const void* experimentalFeatureKey); +void APS5_VABI WKPreferencesSetFTPDirectoryTemplatePath(const void* preferencesRef, const void* pathRef); +void APS5_VABI WKPreferencesSetFantasyFontFamily(const void* preferencesRef, const void* family); +void APS5_VABI WKPreferencesSetFetchAPIEnabled(const void* preferencesRef, bool value); +void APS5_VABI WKPreferencesSetFetchAPIKeepAliveEnabled(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetFileAccessFromFileURLsAllowed(const void* preferencesRef, bool allowed); +void APS5_VABI WKPreferencesSetFixedFontFamily(const void* preferencesRef, const void* family); +void APS5_VABI WKPreferencesSetForceFTPDirectoryListings(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetFrameFlatteningEnabled(const void* preferencesRef, bool frameFlatteningEnabled); +void APS5_VABI WKPreferencesSetFullScreenEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetGamepadsEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetHTTPEquivEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetHiddenPageCSSAnimationSuspensionEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetHiddenPageDOMTimerThrottlingAutoIncreases(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetHiddenPageDOMTimerThrottlingEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetHighlightAPIEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetHixie76WebSocketProtocolEnabled(const void* preferencesRef, bool value); +void APS5_VABI WKPreferencesSetHyperlinkAuditingEnabled(const void* preferencesRef, bool hyperlinkAuditingEnabled); +void APS5_VABI WKPreferencesSetICECandidateFilteringEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetIgnoreViewportScalingConstraints(const void* preferencesRef, bool value); +void APS5_VABI WKPreferencesSetImageControlsEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetInactiveMediaCaptureSteamRepromptIntervalInMinutes(const void* preferencesRef, double interval); +void APS5_VABI WKPreferencesSetIncrementalRenderingSuppressionTimeout(const void* preferencesRef, double timeout); +void APS5_VABI WKPreferencesSetInlineMediaPlaybackRequiresPlaysInlineAttribute(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetInteractiveFormValidationEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetInternalDebugFeatureForKey(const void* preferencesRef, bool value, const void* internalDebugFeatureKey); +void APS5_VABI WKPreferencesSetIntersectionObserverEnabled(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetInvisibleMediaAutoplayPermitted(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetIsAccessibilityIsolatedTreeEnabled(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetIsSecureContextAttributeEnabled(const void* preferencesRef, bool value); +void APS5_VABI WKPreferencesSetJavaEnabled(const void* preferencesRef, bool value); +void APS5_VABI WKPreferencesSetJavaScriptCanAccessClipboard(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetJavaScriptCanOpenWindowsAutomatically(const void* preferencesRef, bool javaScriptCanOpenWindowsAutomatically); +void APS5_VABI WKPreferencesSetJavaScriptEnabled(const void* preferencesRef, bool javaScriptEnabled); +void APS5_VABI WKPreferencesSetJavaScriptMarkupEnabled(const void* preferencesRef, bool javaScriptMarkupEnabled); +void APS5_VABI WKPreferencesSetJavaScriptRuntimeFlags(const void* preferencesRef, std::uint32_t javaScriptRuntimeFlagSet); +void APS5_VABI WKPreferencesSetKeygenElementEnabled(const void* preferencesRef, bool value); +void APS5_VABI WKPreferencesSetLargeImageAsyncDecodingEnabled(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetLegacyEncryptedMediaAPIEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetLinkPreloadEnabled(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetLoadsImagesAutomatically(const void* preferencesRef, bool loadsImagesAutomatically); +void APS5_VABI WKPreferencesSetLoadsSiteIconsIgnoringImageLoadingPreference(const void* preferencesRef, bool value); +void APS5_VABI WKPreferencesSetLocalFileContentSniffingEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetLocalStorageEnabled(const void* preferencesRef, bool localStorageEnabled); +void APS5_VABI WKPreferencesSetLogsPageMessagesToSystemConsoleEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetLongMousePressEnabled(const void* preferencesRef, bool value); +void APS5_VABI WKPreferencesSetMainContentUserGestureOverrideEnabled(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetMediaCapabilitiesEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetMediaCaptureRequiresSecureConnection(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetMediaContentTypesRequiringHardwareSupport(const void* preferencesRef, const void* codecs); +void APS5_VABI WKPreferencesSetMediaControlsScaleWithPageZoom(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetMediaDevicesEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetMediaPlayable(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetMediaPlaybackAllowsInline(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetMediaPlaybackRequiresUserGesture(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetMediaPreloadingEnabled(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetMediaSourceEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetMediaStreamEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetMediaUserGestureInheritsFromDocument(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetMenuItemElementEnabled(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetMetaRefreshEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetMinimumFontSize(const void* preferencesRef, std::uint32_t size); +void APS5_VABI WKPreferencesSetMinimumZoomFontSize(const void* preferencesRef, double size); +void APS5_VABI WKPreferencesSetMockCaptureDevicesEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetMockScrollbarsEnabled(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetNeedsSiteSpecificQuirks(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetNeedsStorageAccessFromFileURLsQuirk(const void* preferencesRef, bool needsQuirk); +void APS5_VABI WKPreferencesSetNewBlockInsideInlineModelEnabled(const void* preferencesRef, bool value); +void APS5_VABI WKPreferencesSetNotificationsEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetOfflineWebApplicationCacheEnabled(const void* preferencesRef, bool offlineWebApplicationCacheEnabled); +void APS5_VABI WKPreferencesSetPDFPluginEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetPageCacheEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetPageCacheSupportsPlugins(const void* preferencesRef, bool value); +void APS5_VABI WKPreferencesSetPageVisibilityBasedProcessSuppressionEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetPaginateDuringLayoutEnabled(const void* preferencesRef, bool value); +void APS5_VABI WKPreferencesSetPaintTimingEnabled(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetPeerConnectionEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetPictographFontFamily(const void* preferencesRef, const void* family); +void APS5_VABI WKPreferencesSetPlugInSnapshottingEnabled(const void* preferencesRef, bool value); +void APS5_VABI WKPreferencesSetPluginSandboxProfilesEnabledForAllPlugins(const void* preferencesRef, bool value); +void APS5_VABI WKPreferencesSetPluginsEnabled(const void* preferencesRef, bool pluginsEnabled); +void APS5_VABI WKPreferencesSetPrimaryPlugInSnapshotDetectionEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetPrivateBrowsingEnabled(const void* preferencesRef, bool value); +void APS5_VABI WKPreferencesSetProcessSwapOnNavigationEnabled(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetPunchOutWhiteBackgroundsInDarkMode(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetReferrerPolicyAttributeEnabled(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetRemotePlaybackEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetRequestAnimationFrameEnabled(const void* preferencesRef, bool value); +void APS5_VABI WKPreferencesSetResourceTimingEnabled(const void* preferencesRef, bool value); +void APS5_VABI WKPreferencesSetResourceUsageOverlayVisible(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetRestrictedHTTPResponseAccess(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetSansSerifFontFamily(const void* preferencesRef, const void* family); +void APS5_VABI WKPreferencesSetScrollingPerformanceLoggingEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetSelectTrailingWhitespaceEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetSerifFontFamily(const void* preferencesRef, const void* family); +void APS5_VABI WKPreferencesSetServerTimingEnabled(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetServiceControlsEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetShouldAllowUserInstalledFonts(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetShouldConvertPositionStyleOnCopy(const void* preferencesRef, bool convert); +void APS5_VABI WKPreferencesSetShouldDisplayCaptions(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetShouldDisplaySubtitles(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetShouldDisplayTextDescriptions(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetShouldPrintBackgrounds(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetShouldRespectImageOrientation(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetShouldSuppressKeyboardInputDuringProvisionalNavigation(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetShouldUseServiceWorkerShortTimeout(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetShowsToolTipOverTruncatedText(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetShowsURLsInToolTipsEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetSmartInsertDeleteEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetSnapshotAllPlugIns(const void* preferencesRef, bool value); +void APS5_VABI WKPreferencesSetSourceBufferChangeTypeEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetSpatialNavigationEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetStandardFontFamily(const void* preferencesRef, const void* family); +void APS5_VABI WKPreferencesSetStorageAccessAPIEnabled(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetStorageBlockingPolicy(const void* preferencesRef, WKStorageBlockingPolicy policy); +void APS5_VABI WKPreferencesSetSubpixelAntialiasedLayerTextEnabled(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetSubpixelCSSOMElementMetricsEnabled(const void* preferencesRef, bool value); +void APS5_VABI WKPreferencesSetSuppressesIncrementalRendering(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetSyntheticEditingCommandsEnabled(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetTabsToLinks(const void* preferencesRef, bool tabsToLinks); +void APS5_VABI WKPreferencesSetTelephoneNumberParsingEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetTextAreasAreResizable(const void* preferencesRef, bool resizable); +void APS5_VABI WKPreferencesSetTextAutosizingEnabled(const void* preferencesRef, bool textAutosizingEnabled); +void APS5_VABI WKPreferencesSetTextAutosizingUsesIdempotentMode(const void* preferencesRef, bool textAutosizingUsesIdempotentModeEnabled); +void APS5_VABI WKPreferencesSetThreadedScrollingEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetTiledScrollingIndicatorVisible(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetTopNavigationToDataURLsAllowed(const void* preferencesRef, bool allowed); +void APS5_VABI WKPreferencesSetUniversalAccessFromFileURLsAllowed(const void* preferencesRef, bool allowed); +void APS5_VABI WKPreferencesSetUseGiantTiles(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetUserInterfaceDirectionPolicy(const void* preferencesRef, _WKUserInterfaceDirectionPolicy userInterfaceDirectionPolicy); +void APS5_VABI WKPreferencesSetUserTimingEnabled(const void* preferencesRef, bool value); +void APS5_VABI WKPreferencesSetVideoPlaybackRequiresUserGesture(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetViewGestureDebuggingEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetVisibleDebugOverlayRegions(const void* preferencesRef, std::uint32_t visibleRegions); +void APS5_VABI WKPreferencesSetWebArchiveDebugModeEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetWebAudioEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetWebAuthenticationEnabled(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetWebGLEnabled(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetWebSQLDisabled(const void* preferencesRef, bool value); +void APS5_VABI WKPreferencesSetWebSecurityEnabled(const void* preferencesRef, bool enabled); +void APS5_VABI WKPreferencesSetWebShareEnabled(const void* preferencesRef, bool flag); +void APS5_VABI WKPreferencesSetXSSAuditorEnabled(const void* preferencesRef, bool value); + +} diff --git a/core/libs/prx/libSceNKWebKit/src/PureJsc.cpp b/core/libs/prx/libSceNKWebKit/src/PureJsc.cpp new file mode 100644 index 0000000000..7f9c5f0128 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/PureJsc.cpp @@ -0,0 +1,67 @@ +#include "prx/libc/include/general/VabiMacros.hpp" +#include "prx/libSceNKWebKit/include/WtfExports.hpp" + +#include +#include +#include + +namespace { + +std::atomic g_superSamplerEnabled{false}; +std::atomic g_osrExitFuzzChecks{0}; +std::atomic g_staticOsrExitFuzzChecks{0}; +std::atomic g_exceptionFuzzChecks{0}; +std::atomic g_executableAllocationFuzzChecks{0}; + +} // namespace + +extern "C" { +void APS5_VABI _ZN3JSC16clearArrayMemsetEPdj(double* base, unsigned int count) { + const std::uint64_t pnanBits = 0x7FF8000000000000ULL; + double pnanValue; + std::memcpy(&pnanValue, &pnanBits, sizeof(double)); + for (unsigned int i = 0; i < count; ++i) { + base[i] = pnanValue; + } +} + +void APS5_VABI _ZN3JSC18enableSuperSamplerEv() { + g_superSamplerEnabled.store(true, std::memory_order_relaxed); +} + +void APS5_VABI _ZN3JSC19disableSuperSamplerEv() { + g_superSamplerEnabled.store(false, std::memory_order_relaxed); +} + +void APS5_VABI _ZN3JSC22printSuperSamplerStateEv() { +} + +unsigned int APS5_VABI _ZN3JSC25numberOfOSRExitFuzzChecksEv() { + return g_osrExitFuzzChecks.load(std::memory_order_relaxed); +} + +unsigned int APS5_VABI _ZN3JSC31numberOfStaticOSRExitFuzzChecksEv() { + return g_staticOsrExitFuzzChecks.load(std::memory_order_relaxed); +} + +unsigned int APS5_VABI _ZN3JSC27numberOfExceptionFuzzChecksEv() { + return g_exceptionFuzzChecks.load(std::memory_order_relaxed); +} + +unsigned int APS5_VABI _ZN3JSC38numberOfExecutableAllocationFuzzChecksEv() { + return g_executableAllocationFuzzChecks.load(std::memory_order_relaxed); +} + +void APS5_VABI _ZN3JSC27finalizeStatsAtEndOfTestingEv() { +} + +void APS5_VABI _ZN3JSC20waitForVMDestructionEv() { +} + +void APS5_VABI _ZN3JSC30waitForAsynchronousDisassemblyEv() { +} + +void APS5_VABI _ZN3JSC18logTotalPhaseTimesEv() { +} + +} diff --git a/core/libs/prx/libSceNKWebKit/src/PurePal.cpp b/core/libs/prx/libSceNKWebKit/src/PurePal.cpp new file mode 100644 index 0000000000..7fcecfe6d0 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/PurePal.cpp @@ -0,0 +1,15 @@ +#include "prx/libc/include/general/VabiMacros.hpp" +#include "prx/libSceNKWebKit/include/WtfExports.hpp" + +#ifdef _WIN32 +#include +#endif + +extern "C" { +void APS5_VABI _ZN3PAL10systemBeepEv() { +#ifdef _WIN32 + MessageBeep(static_cast(-1)); +#endif +} + +} diff --git a/core/libs/prx/libSceNKWebKit/src/PureWebCore.cpp b/core/libs/prx/libSceNKWebKit/src/PureWebCore.cpp new file mode 100644 index 0000000000..17f3535704 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/PureWebCore.cpp @@ -0,0 +1,100 @@ +#include "prx/libc/include/general/VabiMacros.hpp" +#include "prx/libSceNKWebKit/include/WebCoreExports.hpp" +#include "prx/libSceNKWebKit/src/WebCoreTypes.hpp" + +#include +#include + +namespace WebCore { + +} // namespace WebCore + +namespace { +int g_presentingApplicationPID = 0; +} // namespace + +extern "C" { +bool APS5_VABI _ZN7WebCore30isStatusCodeCacheableByDefaultEi(int statusCode) { + switch (statusCode) { + case 200: + case 203: + case 204: + case 206: + case 300: + case 301: + case 404: + case 405: + case 410: + case 414: + case 501: + return true; + default: + return false; + } +} + +bool APS5_VABI _ZN7WebCore32isStatusCodePotentiallyCacheableEi(int statusCode) { + switch (statusCode) { + case 201: + case 202: + case 205: + case 302: + case 303: + case 307: + case 403: + case 406: + case 415: + return true; + default: + return false; + } +} + +unsigned int APS5_VABI _ZN7WebCore43initializeMaximumHTTPConnectionCountPerHostEv() { + return 4; +} + +void APS5_VABI _ZN7WebCore27setPresentingApplicationPIDEi(int pid) { + g_presentingApplicationPID = pid; +} + +WebCore::FloatRect APS5_VABI _ZN7WebCore36largestRectWithAspectRatioInsideRectEfRKNS_9FloatRectE( + float aspectRatio, const WebCore::FloatRect& srcRect) { + WebCore::FloatRect destRect = srcRect; + if (aspectRatio > srcRect.size().aspectRatio()) { + float dy = destRect.width() / aspectRatio - destRect.height(); + destRect.inflateY(dy / 2.0f); + } else { + float dx = destRect.height() * aspectRatio - destRect.width(); + destRect.inflateX(dx / 2.0f); + } + return destRect; +} + +WebCore::FloatRect APS5_VABI _ZN7WebCore37smallestRectWithAspectRatioAroundRectEfRKNS_9FloatRectE( + float aspectRatio, const WebCore::FloatRect& srcRect) { + WebCore::FloatRect destRect = srcRect; + if (aspectRatio < srcRect.size().aspectRatio()) { + float dy = destRect.width() / aspectRatio - destRect.height(); + destRect.inflateY(dy / 2.0f); + } else { + float dx = destRect.height() * aspectRatio - destRect.width(); + destRect.inflateX(dx / 2.0f); + } + return destRect; +} + +WebCore::IntRect APS5_VABI _ZN7WebCore14roundedIntRectERKNS_9FloatRectE(const WebCore::FloatRect& rect) { + return WebCore::IntRect{ + WebCore::IntPoint{ + static_cast(std::round(rect.x())), + static_cast(std::round(rect.y())) + }, + WebCore::IntSize{ + static_cast(std::round(rect.width())), + static_cast(std::round(rect.height())) + } + }; +} + +} diff --git a/core/libs/prx/libSceNKWebKit/src/String.cpp b/core/libs/prx/libSceNKWebKit/src/String.cpp new file mode 100644 index 0000000000..1301eb3469 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/String.cpp @@ -0,0 +1,88 @@ +#include "prx/libSceNKWebKit/src/Types.hpp" +#include "prx/libSceNKWebKit/include/WebKitValueExports.hpp" +#include "prx/libSceJsc/include/Api.hpp" +#include +#include + +extern "C" { +const void* APS5_VABI WKStringCreateWithUTF8CString(const char* string) { + return NKWebKit::ToRef(NKWebKit::Make(NKWebKit::DecodeUtf8(string).value_or(std::u16string()))); +} + +bool APS5_VABI WKStringIsEmpty(const void* stringRef) { + const auto* string = NKWebKit::Cast(stringRef, __func__); + return string->characters.empty(); +} + +std::size_t APS5_VABI WKStringGetLength(const void* stringRef) { + const auto* string = NKWebKit::Cast(stringRef, __func__); + return string->characters.size(); +} + +std::size_t APS5_VABI WKStringGetCharacters(const void* stringRef, unsigned short* buffer, std::size_t bufferLength) { + const auto* string = NKWebKit::Cast(stringRef, __func__); + if (!buffer || bufferLength == 0) return 0; + const std::size_t count = std::min(string->characters.size(), bufferLength); + std::memcpy(buffer, string->characters.data(), count * sizeof(char16_t)); + return count; +} + +std::size_t APS5_VABI WKStringGetMaximumUTF8CStringSize(const void* stringRef) { + const auto* string = NKWebKit::Cast(stringRef, __func__); + return string->characters.size() * 3 + 1; +} + +std::size_t APS5_VABI WKStringGetUTF8CString(const void* stringRef, char* buffer, std::size_t bufferSize) { + const auto* string = NKWebKit::Cast(stringRef, __func__); + return NKWebKit::ConvertUtf16ToUtf8(string->characters, buffer, bufferSize, true); +} + +std::size_t APS5_VABI WKStringGetUTF8CStringNonStrict(const void* stringRef, char* buffer, std::size_t bufferSize) { + const auto* string = NKWebKit::Cast(stringRef, __func__); + return NKWebKit::ConvertUtf16ToUtf8(string->characters, buffer, bufferSize, false); +} + +bool APS5_VABI WKStringIsEqual(const void* aRef, const void* bRef) { + const auto* a = NKWebKit::Cast(aRef, __func__); + const auto* b = NKWebKit::Cast(bRef, __func__); + return a->characters == b->characters; +} + +bool APS5_VABI WKStringIsEqualToUTF8CString(const void* aRef, const char* b) { + const auto* a = NKWebKit::Cast(aRef, __func__); + if (!b) return a->characters.empty(); + const auto decoded = NKWebKit::DecodeUtf8(b); + if (!decoded.has_value()) return a->characters.empty(); + return a->characters == *decoded; +} + +bool APS5_VABI WKStringIsEqualToUTF8CStringIgnoringCase(const void* aRef, const char* b) { + const auto* a = NKWebKit::Cast(aRef, __func__); + if (!b) return a->characters.empty(); + const auto decoded = NKWebKit::DecodeUtf8(b); + if (!decoded.has_value()) return a->characters.empty(); + if (a->characters.size() != decoded->size()) return false; + for (std::size_t i = 0; i < a->characters.size(); ++i) { + char16_t ca = a->characters[i]; + char16_t cb = (*decoded)[i]; + if (ca >= 'A' && ca <= 'Z') ca += ('a' - 'A'); + if (cb >= 'A' && cb <= 'Z') cb += ('a' - 'A'); + if (ca != cb) return false; + } + return true; +} + +const void* APS5_VABI WKStringCreateWithJSString(GuestJSString* jsStringRef) { + if (!jsStringRef) return NKWebKit::ToRef(NKWebKit::Make()); + const auto* chars = JSStringGetCharactersPtr_nid_postfix(jsStringRef); + if (!chars) return NKWebKit::ToRef(NKWebKit::Make(std::u16string())); + return NKWebKit::ToRef(NKWebKit::Make(std::u16string(reinterpret_cast(chars), JSStringGetLength_nid_postfix(jsStringRef)))); +} + +GuestJSString* APS5_VABI WKStringCopyJSString(const void* stringRef) { + const auto* string = NKWebKit::Cast(stringRef, __func__); + if (string->null) return nullptr; + return JSStringCreateWithCharacters_nid_postfix(reinterpret_cast(string->characters.data()), string->characters.size()); +} + +} diff --git a/core/libs/prx/libSceNKWebKit/src/Text.cpp b/core/libs/prx/libSceNKWebKit/src/Text.cpp new file mode 100644 index 0000000000..6f01c9f812 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/Text.cpp @@ -0,0 +1,115 @@ +#include "prx/libSceNKWebKit/src/Types.hpp" +#include + +namespace NKWebKit { + +std::optional DecodeUtf8(const char* text, std::size_t length) { + if (!text) return std::nullopt; + std::u16string result; + result.reserve(length); + const auto* cursor = reinterpret_cast(text); + const auto* end = cursor + length; + while (cursor < end) { + std::uint32_t codepoint = *cursor++; + unsigned following = 0; + std::uint32_t minimum = 0; + if (codepoint < 0x80) { + } else if (codepoint >= 0xC2 && codepoint <= 0xDF) { + codepoint &= 0x1F; + following = 1; + minimum = 0x80; + } else if (codepoint >= 0xE0 && codepoint <= 0xEF) { + codepoint &= 0x0F; + following = 2; + minimum = 0x800; + } else if (codepoint >= 0xF0 && codepoint <= 0xF4) { + codepoint &= 0x07; + following = 3; + minimum = 0x10000; + } else return std::nullopt; + if (static_cast(end - cursor) < following) return std::nullopt; + for (; following > 0; --following) { + if ((*cursor & 0xC0) != 0x80) return std::nullopt; + codepoint = codepoint << 6 | (*cursor++ & 0x3F); + } + if (codepoint < minimum || codepoint > 0x10FFFF || (codepoint >= 0xD800 && codepoint <= 0xDFFF)) return std::nullopt; + if (codepoint > 0xFFFF) { + const auto supplementary = codepoint - 0x10000; + result.push_back(static_cast(0xD800 + (supplementary >> 10))); + result.push_back(static_cast(0xDC00 + (supplementary & 0x3FF))); + } else result.push_back(static_cast(codepoint)); + } + return result; +} + +std::optional DecodeUtf8(const char* text) { + if (!text) return std::nullopt; + return DecodeUtf8(text, std::strlen(text)); +} + +std::string EncodeUtf8(std::u16string_view text) { + std::string result; + result.reserve(text.size()); + for (std::size_t index = 0; index < text.size(); ++index) { + std::uint32_t codepoint = text[index]; + if (codepoint >= 0xD800 && codepoint <= 0xDBFF && index + 1 < text.size() && text[index + 1] >= 0xDC00 && text[index + 1] <= 0xDFFF) { + codepoint = 0x10000 + ((codepoint - 0xD800) << 10) + (text[++index] - 0xDC00); + } + if (codepoint < 0x80) result.push_back(static_cast(codepoint)); + else if (codepoint < 0x800) { + result.push_back(static_cast(0xC0 | codepoint >> 6)); + result.push_back(static_cast(0x80 | (codepoint & 0x3F))); + } else if (codepoint < 0x10000) { + result.push_back(static_cast(0xE0 | codepoint >> 12)); + result.push_back(static_cast(0x80 | (codepoint >> 6 & 0x3F))); + result.push_back(static_cast(0x80 | (codepoint & 0x3F))); + } else { + result.push_back(static_cast(0xF0 | codepoint >> 18)); + result.push_back(static_cast(0x80 | (codepoint >> 12 & 0x3F))); + result.push_back(static_cast(0x80 | (codepoint >> 6 & 0x3F))); + result.push_back(static_cast(0x80 | (codepoint & 0x3F))); + } + } + return result; +} + +std::size_t ConvertUtf16ToUtf8(std::u16string_view text, char* buffer, std::size_t bufferSize, bool strict) { + if (!buffer || bufferSize == 0) return 0; + char* target = buffer; + char* targetEnd = buffer + bufferSize - 1; + for (std::size_t index = 0; index < text.size(); ) { + std::uint32_t codepoint = text[index++]; + if (codepoint >= 0xD800 && codepoint <= 0xDBFF) { + if (index < text.size() && text[index] >= 0xDC00 && text[index] <= 0xDFFF) { + codepoint = 0x10000 + ((codepoint - 0xD800) << 10) + (text[index++] - 0xDC00); + } else { + if (strict) return 0; + codepoint = 0xFFFD; + } + } else if (codepoint >= 0xDC00 && codepoint <= 0xDFFF) { + if (strict) return 0; + codepoint = 0xFFFD; + } + std::size_t needed = (codepoint < 0x80) ? 1 : (codepoint < 0x800) ? 2 : (codepoint < 0x10000) ? 3 : 4; + if (static_cast(targetEnd - target) < needed) break; + if (needed == 1) { + *target++ = static_cast(codepoint); + } else if (needed == 2) { + *target++ = static_cast(0xC0 | (codepoint >> 6)); + *target++ = static_cast(0x80 | (codepoint & 0x3F)); + } else if (needed == 3) { + *target++ = static_cast(0xE0 | (codepoint >> 12)); + *target++ = static_cast(0x80 | ((codepoint >> 6) & 0x3F)); + *target++ = static_cast(0x80 | (codepoint & 0x3F)); + } else { + *target++ = static_cast(0xF0 | (codepoint >> 18)); + *target++ = static_cast(0x80 | ((codepoint >> 12) & 0x3F)); + *target++ = static_cast(0x80 | ((codepoint >> 6) & 0x3F)); + *target++ = static_cast(0x80 | (codepoint & 0x3F)); + } + } + *target++ = '\0'; + return static_cast(target - buffer); +} + +} // namespace NKWebKit diff --git a/core/libs/prx/libSceNKWebKit/src/TypeIds.cpp b/core/libs/prx/libSceNKWebKit/src/TypeIds.cpp new file mode 100644 index 0000000000..15ae844f65 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/TypeIds.cpp @@ -0,0 +1,365 @@ +#include "prx/libSceNKWebKit/src/Object.hpp" +#include "prx/libSceNKWebKit/include/WebKitValueExports.hpp" + +extern "C" { +std::uint32_t APS5_VABI WKAXObjectGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::AccessibilityObject); +} + +std::uint32_t APS5_VABI WKApplicationCacheManagerGetTypeID() { + return 0; +} + +std::uint32_t APS5_VABI WKArrayGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::Array); +} + +std::uint32_t APS5_VABI WKAuthenticationChallengeGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::AuthenticationChallenge); +} + +std::uint32_t APS5_VABI WKAuthenticationDecisionListenerGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::AuthenticationDecisionListener); +} + +std::uint32_t APS5_VABI WKBackForwardListGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::BackForwardList); +} + +std::uint32_t APS5_VABI WKBackForwardListItemGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::BackForwardListItem); +} + +std::uint32_t APS5_VABI WKBooleanGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::Boolean); +} + +std::uint32_t APS5_VABI WKBundleBackForwardListGetTypeID() { + return 0; +} + +std::uint32_t APS5_VABI WKBundleBackForwardListItemGetTypeID() { + return 0; +} + +std::uint32_t APS5_VABI WKBundleDOMWindowExtensionGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::BundleDOMWindowExtension); +} + +std::uint32_t APS5_VABI WKBundleFrameGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::BundleFrame); +} + +std::uint32_t APS5_VABI WKBundleGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::Bundle); +} + +std::uint32_t APS5_VABI WKBundleHitTestResultGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::BundleHitTestResult); +} + +std::uint32_t APS5_VABI WKBundleInspectorGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::BundleInspector); +} + +std::uint32_t APS5_VABI WKBundleNavigationActionGetTypeID() { + return 0; +} + +std::uint32_t APS5_VABI WKBundleNodeHandleGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::BundleNodeHandle); +} + +std::uint32_t APS5_VABI WKBundlePageGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::BundlePage); +} + +std::uint32_t APS5_VABI WKBundlePageOverlayGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::BundlePageOverlay); +} + +std::uint32_t APS5_VABI WKBundleRangeHandleGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::BundleRangeHandle); +} + +std::uint32_t APS5_VABI WKBundleScriptWorldGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::BundleScriptWorld); +} + +std::uint32_t APS5_VABI WKCertificateInfoGetTypeID() { + return 0; +} + +std::uint32_t APS5_VABI WKConnectionGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::Connection); +} + +std::uint32_t APS5_VABI WKContextGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::ProcessPool); +} + +std::uint32_t APS5_VABI WKContextMenuItemGetTypeID() { + return 0; +} + +std::uint32_t APS5_VABI WKCookieManagerGetTypeID() { + return 0; +} + +std::uint32_t APS5_VABI WKCredentialGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::Credential); +} + +std::uint32_t APS5_VABI WKDataGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::Data); +} + +std::uint32_t APS5_VABI WKDictionaryGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::Dictionary); +} + +std::uint32_t APS5_VABI WKDoubleGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::Double); +} + +std::uint32_t APS5_VABI WKDownloadGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::Download); +} + +std::uint32_t APS5_VABI WKErrorGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::Error); +} + +std::uint32_t APS5_VABI WKFormSubmissionListenerGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::FormSubmissionListener); +} + +std::uint32_t APS5_VABI WKFrameGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::Frame); +} + +std::uint32_t APS5_VABI WKFrameHandleGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::FrameHandle); +} + +std::uint32_t APS5_VABI WKFrameInfoGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::FrameInfo); +} + +std::uint32_t APS5_VABI WKFramePolicyListenerGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::FramePolicyListener); +} + +std::uint32_t APS5_VABI WKGeolocationManagerGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::GeolocationManager); +} + +std::uint32_t APS5_VABI WKGeolocationPermissionRequestGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::GeolocationPermissionRequest); +} + +std::uint32_t APS5_VABI WKGeolocationPositionGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::GeolocationPosition); +} + +std::uint32_t APS5_VABI WKHTTPCookieStoreGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::HTTPCookieStore); +} + +std::uint32_t APS5_VABI WKHitTestResultGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::HitTestResult); +} + +std::uint32_t APS5_VABI WKIconDatabaseGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::IconDatabase); +} + +std::uint32_t APS5_VABI WKImageGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::Image); +} + +std::uint32_t APS5_VABI WKInspectorGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::Inspector); +} + +std::uint32_t APS5_VABI WKKeyValueStorageManagerGetTypeID() { + return 0; +} + +std::uint32_t APS5_VABI WKMessageListenerGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::MessageListener); +} + +std::uint32_t APS5_VABI WKNavigationActionGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::NavigationAction); +} + +std::uint32_t APS5_VABI WKNavigationDataGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::NavigationData); +} + +std::uint32_t APS5_VABI WKNavigationGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::Navigation); +} + +std::uint32_t APS5_VABI WKNavigationResponseGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::NavigationResponse); +} + +std::uint32_t APS5_VABI WKNotificationGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::Notification); +} + +std::uint32_t APS5_VABI WKNotificationManagerGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::NotificationManager); +} + +std::uint32_t APS5_VABI WKNotificationPermissionRequestGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::NotificationPermissionRequest); +} + +std::uint32_t APS5_VABI WKOpenPanelParametersGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::OpenPanelParameters); +} + +std::uint32_t APS5_VABI WKOpenPanelResultListenerGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::OpenPanelResultListener); +} + +std::uint32_t APS5_VABI WKPageConfigurationGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::PageConfiguration); +} + +std::uint32_t APS5_VABI WKPageGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::Page); +} + +std::uint32_t APS5_VABI WKPageGroupGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::PageGroup); +} + +std::uint32_t APS5_VABI WKPageRequestStorageAccessConfirmResultListenerGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::RequestStorageAccessConfirmResultListener); +} + +std::uint32_t APS5_VABI WKPageRunBeforeUnloadConfirmPanelResultListenerGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::RunBeforeUnloadConfirmPanelResultListener); +} + +std::uint32_t APS5_VABI WKPageRunJavaScriptAlertResultListenerGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::RunJavaScriptAlertResultListener); +} + +std::uint32_t APS5_VABI WKPageRunJavaScriptConfirmResultListenerGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::RunJavaScriptConfirmResultListener); +} + +std::uint32_t APS5_VABI WKPageRunJavaScriptPromptResultListenerGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::RunJavaScriptPromptResultListener); +} + +std::uint32_t APS5_VABI WKPointGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::Point); +} + +std::uint32_t APS5_VABI WKPopupMenuItemGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::PopupMenuItem); +} + +std::uint32_t APS5_VABI WKProtectionSpaceGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::ProtectionSpace); +} + +std::uint32_t APS5_VABI WKRectGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::Rect); +} + +void APS5_VABI WKRenderLayerGetTypeID() {} + +void APS5_VABI WKRenderObjectGetTypeID() {} + +std::uint32_t APS5_VABI WKResourceCacheManagerGetTypeID() { + return 0; +} + +std::uint32_t APS5_VABI WKSecurityOriginGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::SecurityOrigin); +} + +std::uint32_t APS5_VABI WKSerializedScriptValueGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::SerializedScriptValue); +} + +std::uint32_t APS5_VABI WKSessionStateGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::SessionState); +} + +std::uint32_t APS5_VABI WKSizeGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::Size); +} + +std::uint32_t APS5_VABI WKStringGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::String); +} + +std::uint32_t APS5_VABI WKUInt64GetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::UInt64); +} + +std::uint32_t APS5_VABI WKURLGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::URL); +} + +std::uint32_t APS5_VABI WKURLRequestGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::URLRequest); +} + +std::uint32_t APS5_VABI WKURLResponseGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::URLResponse); +} + +std::uint32_t APS5_VABI WKUserContentControllerGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::UserContentController); +} + +std::uint32_t APS5_VABI WKUserContentExtensionStoreGetTypeID() { + return 0; +} + +std::uint32_t APS5_VABI WKUserContentURLPatternGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::UserContentURLPattern); +} + +std::uint32_t APS5_VABI WKUserMediaPermissionCheckGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::UserMediaPermissionCheck); +} + +std::uint32_t APS5_VABI WKUserMediaPermissionRequestGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::UserMediaPermissionRequest); +} + +std::uint32_t APS5_VABI WKUserScriptGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::UserScript); +} + +std::uint32_t APS5_VABI WKViewportAttributesGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::ViewportAttributes); +} + +std::uint32_t APS5_VABI WKWebsiteDataStoreConfigurationGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::WebsiteDataStoreConfiguration); +} + +std::uint32_t APS5_VABI WKWebsiteDataStoreGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::WebsiteDataStore); +} + +std::uint32_t APS5_VABI WKWebsitePoliciesGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::WebsitePolicies); +} + +std::uint32_t APS5_VABI WKWindowFeaturesGetTypeID() { + return NKWebKit::TypeID(NKWebKit::ObjectType::WindowFeatures); +} + +} diff --git a/core/libs/prx/libSceNKWebKit/src/Types.hpp b/core/libs/prx/libSceNKWebKit/src/Types.hpp new file mode 100644 index 0000000000..2fdb9cb2ac --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/Types.hpp @@ -0,0 +1,104 @@ +#pragma once + +#include "prx/libSceNKWebKit/src/Object.hpp" +#include +#include +#include +#include +#include +#include +#include + +namespace NKWebKit { + +std::optional DecodeUtf8(const char* text, std::size_t length); +std::optional DecodeUtf8(const char* text); +std::string EncodeUtf8(std::u16string_view text); +std::size_t ConvertUtf16ToUtf8(std::u16string_view text, char* buffer, std::size_t bufferSize, bool strict); + +class String final : public ObjectOf { +public: + String() : null(true) {} + explicit String(std::u16string text) : characters(std::move(text)) {} + explicit String(std::optional text) : characters(text.value_or(std::u16string())), null(!text.has_value()) {} + static Retained FromUtf8(const char* text) { return Make(DecodeUtf8(text)); } + std::string Utf8() const { return EncodeUtf8(characters); } + + std::u16string characters; + bool null = false; +}; + +class URL final : public ObjectOf { +public: + explicit URL(std::string text) : text(std::move(text)) {} + + std::string text; +}; + +class Array final : public ObjectOf { +public: + Array() = default; + explicit Array(std::vector> elements) : elements(std::move(elements)) {} + + std::vector> elements; + bool mutableArray = false; +}; + +class Dictionary final : public ObjectOf { +public: + Dictionary() = default; + explicit Dictionary(std::map> entries) : entries(std::move(entries)) {} + + std::map> entries; + bool mutableDictionary = false; +}; + +class Data final : public ObjectOf { +public: + explicit Data(std::vector bytes) : bytes(std::move(bytes)) {} + + std::vector bytes; +}; + +template +class Number final : public ObjectOf { +public: + explicit Number(Value value) : value(value) {} + + Value value; +}; + +using Boolean = Number; +using Double = Number; +using UInt64 = Number; +using Int64 = Number; + +struct PointValue { + double x; + double y; +}; + +struct SizeValue { + double width; + double height; +}; + +struct RectValue { + PointValue origin; + SizeValue size; +}; + +using Point = Number; +using Size = Number; +using Rect = Number; + +class UserContentURLPattern final : public ObjectOf { +public: + std::u16string scheme; + std::u16string host; + std::u16string path; + bool matchSubdomains = false; + bool valid = false; +}; + +} // namespace NKWebKit diff --git a/core/libs/prx/libSceNKWebKit/src/URL.cpp b/core/libs/prx/libSceNKWebKit/src/URL.cpp new file mode 100644 index 0000000000..b8ca959903 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/URL.cpp @@ -0,0 +1,15 @@ +#include "prx/libSceNKWebKit/src/Types.hpp" +#include "prx/libSceNKWebKit/include/WebKitValueExports.hpp" + +extern "C" { +const void* APS5_VABI WKURLCreateWithUTF8CString(const char* string) { + if (!string) return NKWebKit::ToRef(NKWebKit::Make("")); + return NKWebKit::ToRef(NKWebKit::Make(std::string(string))); +} + +const void* APS5_VABI WKURLCopyString(const void* urlRef) { + const auto* url = NKWebKit::Cast(urlRef, __func__); + return NKWebKit::ToRef(NKWebKit::Make(NKWebKit::DecodeUtf8(url->text.data(), url->text.size()).value_or(std::u16string()))); +} + +} diff --git a/core/libs/prx/libSceNKWebKit/src/UserContentController.cpp b/core/libs/prx/libSceNKWebKit/src/UserContentController.cpp new file mode 100644 index 0000000000..5477bcb8a1 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/UserContentController.cpp @@ -0,0 +1,38 @@ +#include "prx/libSceNKWebKit/src/Configuration.hpp" +#include "prx/libSceNKWebKit/include/WebKitConfigExports.hpp" + +extern "C" { +const void* APS5_VABI WKUserContentControllerCreate() { + return NKWebKit::ToRef(NKWebKit::Make()); +} + +const void* APS5_VABI WKUserContentControllerCopyUserScripts(const void* userContentController) { + const auto* controller = NKWebKit::Cast(userContentController, __func__); + auto array = NKWebKit::Make(); + for (const auto& script : controller->userScripts) { + array->elements.push_back(NKWebKit::Retained::Share(script.Get())); + } + return NKWebKit::ToRef(array); +} + +void APS5_VABI WKUserContentControllerAddUserScript(const void* userContentController, const void* userScript) { + auto* controller = NKWebKit::Cast(userContentController, __func__); + auto* script = NKWebKit::Cast(userScript, __func__); + controller->userScripts.push_back(NKWebKit::Retained::Share(script)); +} + +void APS5_VABI WKUserContentControllerRemoveAllUserScripts(const void* userContentController) { + NKWebKit::Cast(userContentController, __func__)->userScripts.clear(); +} + +void APS5_VABI WKUserContentControllerAddUserContentFilter(const void* userContentController, const void* userContentFilter) { + auto* controller = NKWebKit::Cast(userContentController, __func__); + auto* filter = NKWebKit::Cast(userContentFilter, __func__); + controller->contentRuleLists.push_back(NKWebKit::Retained::Share(filter)); +} + +void APS5_VABI WKUserContentControllerRemoveAllUserContentFilters(const void* userContentController) { + NKWebKit::Cast(userContentController, __func__)->contentRuleLists.clear(); +} + +} diff --git a/core/libs/prx/libSceNKWebKit/src/UserContentURLPattern.cpp b/core/libs/prx/libSceNKWebKit/src/UserContentURLPattern.cpp new file mode 100644 index 0000000000..e30ceb853e --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/UserContentURLPattern.cpp @@ -0,0 +1,64 @@ +#include "prx/libSceNKWebKit/src/Types.hpp" +#include "prx/libSceNKWebKit/include/WebKitValueExports.hpp" + +namespace { + +bool EqualLettersIgnoringASCIICase(std::u16string_view text, std::u16string_view lowercaseLetters) { + if (text.size() != lowercaseLetters.size()) return false; + for (std::size_t index = 0; index < text.size(); ++index) { + char16_t character = text[index]; + if (character >= u'A' && character <= u'Z') character = static_cast(character - u'A' + u'a'); + if (character != lowercaseLetters[index]) return false; + } + return true; +} + +NKWebKit::Retained Parse(std::u16string_view pattern) { + auto result = NKWebKit::Make(); + const auto schemeEnd = pattern.find(u"://"); + if (schemeEnd == std::u16string_view::npos) return result; + result->scheme = std::u16string(pattern.substr(0, schemeEnd)); + const bool fileScheme = EqualLettersIgnoringASCIICase(result->scheme, u"file"); + const auto hostStart = schemeEnd + 3; + if (!fileScheme && hostStart >= pattern.size()) return result; + const auto pathStart = pattern.find(u'/', hostStart); + if (pathStart == std::u16string_view::npos) return result; + result->host = std::u16string(pattern.substr(hostStart, pathStart - hostStart)); + if (result->host == u"*") { + result->host.clear(); + result->matchSubdomains = true; + } else if (result->host.starts_with(u"*.")) { + result->host.erase(0, 2); + result->matchSubdomains = true; + } else if (fileScheme && EqualLettersIgnoringASCIICase(result->host, u"localhost")) { + result->host.clear(); + } + if (result->host.find(u'*') != std::u16string::npos) return result; + result->path = std::u16string(pattern.substr(pathStart)); + result->valid = true; + return result; +} + +} // namespace + +extern "C" { +const void* APS5_VABI WKUserContentURLPatternCreate(const void* patternRef) { + return NKWebKit::ToRef(Parse(NKWebKit::Cast(patternRef, __func__)->characters)); +} + +const void* APS5_VABI WKUserContentURLPatternCopyScheme(const void* urlPatternRef) { + return NKWebKit::ToRef(NKWebKit::Make(NKWebKit::Cast(urlPatternRef, __func__)->scheme)); +} + +const void* APS5_VABI WKUserContentURLPatternCopyHost(const void* urlPatternRef) { + return NKWebKit::ToRef(NKWebKit::Make(NKWebKit::Cast(urlPatternRef, __func__)->host)); +} + +bool APS5_VABI WKUserContentURLPatternIsValid(const void* urlPatternRef) { + return NKWebKit::Cast(urlPatternRef, __func__)->valid; +} + +bool APS5_VABI WKUserContentURLPatternMatchesSubdomains(const void* urlPatternRef) { + return NKWebKit::Cast(urlPatternRef, __func__)->matchSubdomains; +} +} diff --git a/core/libs/prx/libSceNKWebKit/src/UserScript.cpp b/core/libs/prx/libSceNKWebKit/src/UserScript.cpp new file mode 100644 index 0000000000..aefe75504d --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/UserScript.cpp @@ -0,0 +1,26 @@ +#include "prx/libSceNKWebKit/src/Configuration.hpp" +#include "prx/libSceNKWebKit/include/WebKitConfigExports.hpp" + +extern "C" { +const void* APS5_VABI WKUserScriptCreateWithSource(const void* source, std::uint32_t injectionTime, bool forMainFrameOnly) { + std::u16string sourceString; + if (source) { + sourceString = NKWebKit::Cast(source, __func__)->characters; + } + return NKWebKit::ToRef(NKWebKit::Make(std::move(sourceString), injectionTime, forMainFrameOnly)); +} + +const void* APS5_VABI WKUserScriptCopySource(const void* userScript) { + const auto* script = NKWebKit::Cast(userScript, __func__); + return NKWebKit::ToRef(NKWebKit::Make(script->source)); +} + +std::uint32_t APS5_VABI WKUserScriptGetInjectionTime(const void* userScript) { + return NKWebKit::Cast(userScript, __func__)->injectionTime; +} + +bool APS5_VABI WKUserScriptGetMainFrameOnly(const void* userScript) { + return NKWebKit::Cast(userScript, __func__)->forMainFrameOnly; +} + +} diff --git a/core/libs/prx/libSceNKWebKit/src/WebCoreColor.cpp b/core/libs/prx/libSceNKWebKit/src/WebCoreColor.cpp new file mode 100644 index 0000000000..58148f1994 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/WebCoreColor.cpp @@ -0,0 +1,184 @@ +#include "prx/libc/include/General.hpp" +#include "prx/libSceNKWebKit/include/WebCoreExports.hpp" +#include "prx/libSceNKWebKit/src/WebCoreTypes.hpp" +#include +#include +#include +#include + +namespace WebCore { + +namespace { + +constexpr std::uint64_t kFlagsShift = 48; +constexpr std::uint64_t kColorSpaceShift = 56; +constexpr std::uint64_t kOutOfLineFlag = 1ULL << (kFlagsShift + 3); +constexpr std::uint64_t kValidFlag = 1ULL << (kFlagsShift + 2); +constexpr std::uint64_t kColorSpaceSRGB = 17ULL << kColorSpaceShift; + +bool IsOutOfLine(const Color& c) { + return (c.m_colorAndFlags & kOutOfLineFlag) != 0; +} + +std::uint8_t Red(const Color& c) { + return static_cast((c.m_colorAndFlags >> 24) & 0xFF); +} + +std::uint8_t Green(const Color& c) { + return static_cast((c.m_colorAndFlags >> 16) & 0xFF); +} + +std::uint8_t Blue(const Color& c) { + return static_cast((c.m_colorAndFlags >> 8) & 0xFF); +} + +std::uint8_t Alpha(const Color& c) { + return static_cast(c.m_colorAndFlags & 0xFF); +} + +Color MakeSRGBA(std::uint8_t r, std::uint8_t g, std::uint8_t b, std::uint8_t a, std::uint64_t extraFlags = 0) { + std::uint64_t packed = (static_cast(r) << 24) + | (static_cast(g) << 16) + | (static_cast(b) << 8) + | static_cast(a); + return Color{packed | kColorSpaceSRGB | kValidFlag | extraFlags}; +} + +} // namespace +} // namespace WebCore + +extern "C" { +void APS5_VABI _ZN7WebCore5ColorC1EOS0_(WebCore::Color* self, WebCore::Color&& other) { + if (WebCore::IsOutOfLine(other)) { + throw std::invalid_argument("OutOfLine Color unsupported"); + } + self->m_colorAndFlags = other.m_colorAndFlags; + other.m_colorAndFlags = 0; +} + +void APS5_VABI _ZN7WebCore5ColorC2EOS0_(WebCore::Color* self, WebCore::Color&& other) { + if (WebCore::IsOutOfLine(other)) { + throw std::invalid_argument("OutOfLine Color unsupported"); + } + self->m_colorAndFlags = other.m_colorAndFlags; + other.m_colorAndFlags = 0; +} + +void APS5_VABI _ZN7WebCore5ColorC1ERKS0_(WebCore::Color* self, const WebCore::Color& other) { + if (WebCore::IsOutOfLine(other)) { + throw std::invalid_argument("OutOfLine Color unsupported"); + } + self->m_colorAndFlags = other.m_colorAndFlags; +} + +void APS5_VABI _ZN7WebCore5ColorC2ERKS0_(WebCore::Color* self, const WebCore::Color& other) { + if (WebCore::IsOutOfLine(other)) { + throw std::invalid_argument("OutOfLine Color unsupported"); + } + self->m_colorAndFlags = other.m_colorAndFlags; +} + +WebCore::Color& APS5_VABI _ZN7WebCore5ColoraSEOS0_(WebCore::Color* self, WebCore::Color&& other) { + if (WebCore::IsOutOfLine(*self) || WebCore::IsOutOfLine(other)) { + throw std::invalid_argument("OutOfLine Color unsupported"); + } + self->m_colorAndFlags = other.m_colorAndFlags; + other.m_colorAndFlags = 0; + return *self; +} + +WebCore::Color& APS5_VABI _ZN7WebCore5ColoraSERKS0_(WebCore::Color* self, const WebCore::Color& other) { + if (WebCore::IsOutOfLine(*self) || WebCore::IsOutOfLine(other)) { + throw std::invalid_argument("OutOfLine Color unsupported"); + } + self->m_colorAndFlags = other.m_colorAndFlags; + return *self; +} + +WebCore::Color APS5_VABI _ZNK7WebCore5Color14colorWithAlphaEf(const WebCore::Color* self, float alpha) { + if (WebCore::IsOutOfLine(*self)) { + throw std::invalid_argument("OutOfLine Color unsupported"); + } + std::uint8_t a = static_cast(std::clamp(static_cast(std::lround(alpha * 255.0f)), 0l, 255l)); + std::uint64_t semanticFlag = self->m_colorAndFlags & (1ULL << WebCore::kFlagsShift); + return WebCore::MakeSRGBA(WebCore::Red(*self), WebCore::Green(*self), WebCore::Blue(*self), a, semanticFlag); +} + +WebCore::Color APS5_VABI _ZNK7WebCore5Color8darkenedEv(const WebCore::Color* self) { + if (WebCore::IsOutOfLine(*self)) { + throw std::invalid_argument("OutOfLine Color unsupported"); + } + std::uint8_t r = WebCore::Red(*self); + std::uint8_t g = WebCore::Green(*self); + std::uint8_t b = WebCore::Blue(*self); + std::uint8_t a = WebCore::Alpha(*self); + if (r == 255 && g == 255 && b == 255 && a == 255) { + return WebCore::MakeSRGBA(171, 171, 171, 255); + } + float rf = static_cast(r) / 255.0f; + float gf = static_cast(g) / 255.0f; + float bf = static_cast(b) / 255.0f; + float v = std::max({rf, gf, bf}); + float multiplier = (v > 0.0f) ? std::max(0.0f, (v - 0.33f) / v) : 0.0f; + std::uint8_t nr = static_cast(std::clamp(static_cast(std::lround(multiplier * rf * 255.0f)), 0l, 255l)); + std::uint8_t ng = static_cast(std::clamp(static_cast(std::lround(multiplier * gf * 255.0f)), 0l, 255l)); + std::uint8_t nb = static_cast(std::clamp(static_cast(std::lround(multiplier * bf * 255.0f)), 0l, 255l)); + return WebCore::MakeSRGBA(nr, ng, nb, a); +} + +WebCore::Color APS5_VABI _ZNK7WebCore5Color9lightenedEv(const WebCore::Color* self) { + if (WebCore::IsOutOfLine(*self)) { + throw std::invalid_argument("OutOfLine Color unsupported"); + } + std::uint8_t r = WebCore::Red(*self); + std::uint8_t g = WebCore::Green(*self); + std::uint8_t b = WebCore::Blue(*self); + std::uint8_t a = WebCore::Alpha(*self); + if (r == 0 && g == 0 && b == 0 && a == 255) { + return WebCore::MakeSRGBA(84, 84, 84, 255); + } + float rf = static_cast(r) / 255.0f; + float gf = static_cast(g) / 255.0f; + float bf = static_cast(b) / 255.0f; + float v = std::max({rf, gf, bf}); + if (v == 0.0f) { + return WebCore::MakeSRGBA(84, 84, 84, a); + } + float multiplier = std::min(1.0f, v + 0.33f) / v; + std::uint8_t nr = static_cast(std::clamp(static_cast(std::lround(multiplier * rf * 255.0f)), 0l, 255l)); + std::uint8_t ng = static_cast(std::clamp(static_cast(std::lround(multiplier * gf * 255.0f)), 0l, 255l)); + std::uint8_t nb = static_cast(std::clamp(static_cast(std::lround(multiplier * bf * 255.0f)), 0l, 255l)); + return WebCore::MakeSRGBA(nr, ng, nb, a); +} + +double APS5_VABI _ZNK7WebCore5Color9lightnessEv(const WebCore::Color* self) { + if (WebCore::IsOutOfLine(*self)) { + throw std::invalid_argument("OutOfLine Color unsupported"); + } + float rf = static_cast(WebCore::Red(*self)) / 255.0f; + float gf = static_cast(WebCore::Green(*self)) / 255.0f; + float bf = static_cast(WebCore::Blue(*self)) / 255.0f; + auto [minVal, maxVal] = std::minmax({rf, gf, bf}); + return 0.5 * static_cast(maxVal + minVal); +} + +double APS5_VABI _ZNK7WebCore5Color9luminanceEv(const WebCore::Color* self) { + if (WebCore::IsOutOfLine(*self)) { + throw std::invalid_argument("OutOfLine Color unsupported"); + } + float rf = static_cast(WebCore::Red(*self)) / 255.0f; + float gf = static_cast(WebCore::Green(*self)) / 255.0f; + float bf = static_cast(WebCore::Blue(*self)) / 255.0f; + auto toLinear = [](float c) -> float { + if (c <= 0.04045f) { + return std::max(c / 12.92f, 0.0f); + } + return std::pow((c + 0.055f) / 1.055f, 2.4f); + }; + float rLin = toLinear(rf); + float gLin = toLinear(gf); + float bLin = toLinear(bf); + return 0.21263900587151027f * rLin + 0.715168678767756f * gLin + 0.07219231536073371f * bLin; +} + +} diff --git a/core/libs/prx/libSceNKWebKit/src/WebCoreGeometry.cpp b/core/libs/prx/libSceNKWebKit/src/WebCoreGeometry.cpp new file mode 100644 index 0000000000..e8100eb27c --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/WebCoreGeometry.cpp @@ -0,0 +1,573 @@ +#include "prx/libc/include/General.hpp" +#include "prx/libSceNKWebKit/include/WebCoreExports.hpp" +#include "prx/libSceNKWebKit/src/WebCoreTypes.hpp" +#include +#include +#include +#include +#include + +namespace WebCore { + +namespace { + +int ClampToInteger(float value) { + if (value >= static_cast(std::numeric_limits::max())) { + return std::numeric_limits::max(); + } + if (!(value > static_cast(std::numeric_limits::min()))) { + return std::numeric_limits::min(); + } + return static_cast(value); +} + +int ClampToInteger(double value) { + if (value >= static_cast(std::numeric_limits::max())) { + return std::numeric_limits::max(); + } + if (!(value > static_cast(std::numeric_limits::min()))) { + return std::numeric_limits::min(); + } + return static_cast(value); +} + +bool AreEssentiallyEqual(float u, float v) { + if (u == v) { + return true; + } + float delta = std::abs(u - v); + float eps = std::numeric_limits::epsilon(); + auto safeDiv = [](float num, float den) { + if (std::abs(num) < std::abs(den) * std::numeric_limits::max()) { + return num / den; + } + return std::numeric_limits::max(); + }; + return safeDiv(delta, std::abs(u)) <= eps && safeDiv(delta, std::abs(v)) <= eps; +} + +bool IsPointInTriangle(const FloatPoint& p, const FloatPoint& t1, const FloatPoint& t2, const FloatPoint& t3) { + float v0x = t3.m_x - t1.m_x; + float v0y = t3.m_y - t1.m_y; + float v1x = t2.m_x - t1.m_x; + float v1y = t2.m_y - t1.m_y; + float v2x = p.m_x - t1.m_x; + float v2y = p.m_y - t1.m_y; + + float dot00 = v0x * v0x + v0y * v0y; + float dot01 = v0x * v1x + v0y * v1y; + float dot02 = v0x * v2x + v0y * v2y; + float dot11 = v1x * v1x + v1y * v1y; + float dot12 = v1x * v2x + v1y * v2y; + + float denom = dot00 * dot11 - dot01 * dot01; + if (denom == 0.0f) { + return false; + } + float invDenom = 1.0f / denom; + float u = (dot11 * dot02 - dot01 * dot12) * invDenom; + float v = (dot00 * dot12 - dot01 * dot02) * invDenom; + return (u >= 0.0f) && (v >= 0.0f) && (u + v <= 1.0f); +} + +bool EllipseContainsPoint(const FloatPoint& center, float rx, float ry, const FloatPoint& point) { + if (rx <= 0.0f || ry <= 0.0f) { + return false; + } + FloatPoint transformed{point.m_x - center.m_x, point.m_y - center.m_y}; + if (transformed.m_x < -rx || transformed.m_x > rx || transformed.m_y < -ry || transformed.m_y > ry) { + return false; + } + transformed.m_x *= ry; + transformed.m_y *= rx; + float radius = rx * ry; + if (std::abs(transformed.m_x) + std::abs(transformed.m_y) <= radius) { + return true; + } + return (transformed.m_x * transformed.m_x + transformed.m_y * transformed.m_y) <= (radius * radius); +} + +bool IsRoundedRectRenderable(const RoundedRect& rr) { + int w = rr.m_rect.m_size.m_width.m_value; + int h = rr.m_rect.m_size.m_height.m_value; + int tlw = rr.m_radii.m_topLeft.m_width.m_value; + int tlh = rr.m_radii.m_topLeft.m_height.m_value; + int trw = rr.m_radii.m_topRight.m_width.m_value; + int trh = rr.m_radii.m_topRight.m_height.m_value; + int blw = rr.m_radii.m_bottomLeft.m_width.m_value; + int blh = rr.m_radii.m_bottomLeft.m_height.m_value; + int brw = rr.m_radii.m_bottomRight.m_width.m_value; + int brh = rr.m_radii.m_bottomRight.m_height.m_value; + return tlw >= 0 && tlh >= 0 && blw >= 0 && blh >= 0 + && trw >= 0 && trh >= 0 && brw >= 0 && brh >= 0 + && (tlw + trw) <= w && (blw + brw) <= w + && (tlh + blh) <= h && (trh + brh) <= h; +} + +} // namespace +} // namespace WebCore + +extern "C" { +WebCore::FloatPoint APS5_VABI _ZN7WebCore10FloatPoint15narrowPrecisionEdd(double x, double y) { + return WebCore::FloatPoint{static_cast(x), static_cast(y)}; +} + +void APS5_VABI _ZN7WebCore10FloatPoint9normalizeEv(WebCore::FloatPoint* self) { + float length = std::hypot(self->m_x, self->m_y); + if (length != 0.0f) { + self->m_x /= length; + self->m_y /= length; + } +} + +void APS5_VABI _ZN7WebCore10FloatPointC1ERKNS_8IntPointE(WebCore::FloatPoint* self, const WebCore::IntPoint& p) { + self->m_x = static_cast(p.m_x); + self->m_y = static_cast(p.m_y); +} + +void APS5_VABI _ZN7WebCore10FloatPointC2ERKNS_8IntPointE(WebCore::FloatPoint* self, const WebCore::IntPoint& p) { + self->m_x = static_cast(p.m_x); + self->m_y = static_cast(p.m_y); +} + +WebCore::FloatPoint APS5_VABI _ZNK7WebCore10FloatPoint15matrixTransformERKNS_15AffineTransformE( + const WebCore::FloatPoint* self, const WebCore::AffineTransform& t) { + double x = static_cast(self->m_x); + double y = static_cast(self->m_y); + double newX = t.m_transform[0] * x + t.m_transform[2] * y + t.m_transform[4]; + double newY = t.m_transform[1] * x + t.m_transform[3] * y + t.m_transform[5]; + return WebCore::FloatPoint{static_cast(newX), static_cast(newY)}; +} + +WebCore::FloatPoint APS5_VABI _ZNK7WebCore10FloatPoint15matrixTransformERKNS_20TransformationMatrixE( + const WebCore::FloatPoint* self, const WebCore::TransformationMatrix& t) { + double x = static_cast(self->m_x); + double y = static_cast(self->m_y); + double resultX = t.m_matrix[3][0] + x * t.m_matrix[0][0] + y * t.m_matrix[1][0]; + double resultY = t.m_matrix[3][1] + x * t.m_matrix[0][1] + y * t.m_matrix[1][1]; + double w = t.m_matrix[3][3] + x * t.m_matrix[0][3] + y * t.m_matrix[1][3]; + if (w != 1.0 && w != 0.0) { + resultX /= w; + resultY /= w; + } + return WebCore::FloatPoint{static_cast(resultX), static_cast(resultY)}; +} + +WebCore::FloatPoint APS5_VABI _ZNK7WebCore10FloatPoint18constrainedBetweenERKS0_S2_( + const WebCore::FloatPoint* self, const WebCore::FloatPoint& min, const WebCore::FloatPoint& max) { + return WebCore::FloatPoint{ + std::max(min.m_x, std::min(max.m_x, self->m_x)), + std::max(min.m_y, std::min(max.m_y, self->m_y)) + }; +} + +WebCore::FloatSize APS5_VABI _ZNK7WebCore9FloatSize18constrainedBetweenERKS0_S2_( + const WebCore::FloatSize* self, const WebCore::FloatSize& min, const WebCore::FloatSize& max) { + return WebCore::FloatSize{ + std::max(min.m_width, std::min(max.m_width, self->m_width)), + std::max(min.m_height, std::min(max.m_height, self->m_height)) + }; +} + +bool APS5_VABI _ZNK7WebCore9FloatSize6isZeroEv(const WebCore::FloatSize* self) { + return self->m_width == 0.0f && self->m_height == 0.0f; +} + +void APS5_VABI _ZN7WebCore9FloatRect5scaleEff(WebCore::FloatRect* self, float sx, float sy) { + self->m_location.m_x *= sx; + self->m_location.m_y *= sy; + self->m_size.m_width *= sx; + self->m_size.m_height *= sy; +} + +void APS5_VABI _ZN7WebCore9FloatRect5uniteERKS0_(WebCore::FloatRect* self, const WebCore::FloatRect& other) { + if (other.m_size.m_width <= 0.0f || other.m_size.m_height <= 0.0f) { + return; + } + if (self->m_size.m_width <= 0.0f || self->m_size.m_height <= 0.0f) { + *self = other; + return; + } + float minX = std::min(self->m_location.m_x, other.m_location.m_x); + float minY = std::min(self->m_location.m_y, other.m_location.m_y); + float maxX = std::max(self->m_location.m_x + self->m_size.m_width, other.m_location.m_x + other.m_size.m_width); + float maxY = std::max(self->m_location.m_y + self->m_size.m_height, other.m_location.m_y + other.m_size.m_height); + self->m_location = {minX, minY}; + self->m_size = {maxX - minX, maxY - minY}; +} + +void APS5_VABI _ZN7WebCore9FloatRect6extendERKNS_10FloatPointE(WebCore::FloatRect* self, const WebCore::FloatPoint& p) { + float minX = std::min(self->m_location.m_x, p.m_x); + float minY = std::min(self->m_location.m_y, p.m_y); + float maxX = std::max(self->m_location.m_x + self->m_size.m_width, p.m_x); + float maxY = std::max(self->m_location.m_y + self->m_size.m_height, p.m_y); + self->m_location = {minX, minY}; + self->m_size = {maxX - minX, maxY - minY}; +} + +void APS5_VABI _ZN7WebCore9FloatRect9intersectERKS0_(WebCore::FloatRect* self, const WebCore::FloatRect& other) { + float l = std::max(self->m_location.m_x, other.m_location.m_x); + float t = std::max(self->m_location.m_y, other.m_location.m_y); + float r = std::min(self->m_location.m_x + self->m_size.m_width, other.m_location.m_x + other.m_size.m_width); + float b = std::min(self->m_location.m_y + self->m_size.m_height, other.m_location.m_y + other.m_size.m_height); + if (l >= r || t >= b) { + self->m_location = {0.0f, 0.0f}; + self->m_size = {0.0f, 0.0f}; + } else { + self->m_location = {l, t}; + self->m_size = {r - l, b - t}; + } +} + +void APS5_VABI _ZN7WebCore9FloatRectC1ERKNS_7IntRectE(WebCore::FloatRect* self, const WebCore::IntRect& r) { + self->m_location.m_x = static_cast(r.m_location.m_x); + self->m_location.m_y = static_cast(r.m_location.m_y); + self->m_size.m_width = static_cast(r.m_size.m_width); + self->m_size.m_height = static_cast(r.m_size.m_height); +} + +void APS5_VABI _ZN7WebCore9FloatRectC2ERKNS_7IntRectE(WebCore::FloatRect* self, const WebCore::IntRect& r) { + self->m_location.m_x = static_cast(r.m_location.m_x); + self->m_location.m_y = static_cast(r.m_location.m_y); + self->m_size.m_width = static_cast(r.m_size.m_width); + self->m_size.m_height = static_cast(r.m_size.m_height); +} + +bool APS5_VABI _ZNK7WebCore9FloatRect10intersectsERKS0_(const WebCore::FloatRect* self, const WebCore::FloatRect& other) { + return self->m_size.m_width > 0.0f && self->m_size.m_height > 0.0f + && other.m_size.m_width > 0.0f && other.m_size.m_height > 0.0f + && self->m_location.m_x < other.m_location.m_x + other.m_size.m_width + && other.m_location.m_x < self->m_location.m_x + self->m_size.m_width + && self->m_location.m_y < other.m_location.m_y + other.m_size.m_height + && other.m_location.m_y < self->m_location.m_y + self->m_size.m_height; +} + +bool APS5_VABI _ZNK7WebCore9FloatRect21inclusivelyIntersectsERKS0_(const WebCore::FloatRect* self, const WebCore::FloatRect& other) { + return self->m_size.m_width >= 0.0f && self->m_size.m_height >= 0.0f + && other.m_size.m_width >= 0.0f && other.m_size.m_height >= 0.0f + && self->m_location.m_x <= other.m_location.m_x + other.m_size.m_width + && other.m_location.m_x <= self->m_location.m_x + self->m_size.m_width + && self->m_location.m_y <= other.m_location.m_y + other.m_size.m_height + && other.m_location.m_y <= self->m_location.m_y + self->m_size.m_height; +} + +bool APS5_VABI _ZNK7WebCore9FloatRect8containsERKNS_10FloatPointENS0_12ContainsModeE( + const WebCore::FloatRect* self, const WebCore::FloatPoint& point, std::uint32_t containsMode) { + if (containsMode == 0) { + return point.m_x >= self->m_location.m_x + && point.m_x <= self->m_location.m_x + self->m_size.m_width + && point.m_y >= self->m_location.m_y + && point.m_y <= self->m_location.m_y + self->m_size.m_height; + } + return point.m_x > self->m_location.m_x + && point.m_x < self->m_location.m_x + self->m_size.m_width + && point.m_y > self->m_location.m_y + && point.m_y < self->m_location.m_y + self->m_size.m_height; +} + +bool APS5_VABI _ZNK7WebCore9FloatRect8containsERKS0_(const WebCore::FloatRect* self, const WebCore::FloatRect& other) { + return self->m_location.m_x <= other.m_location.m_x + && self->m_location.m_x + self->m_size.m_width >= other.m_location.m_x + other.m_size.m_width + && self->m_location.m_y <= other.m_location.m_y + && self->m_location.m_y + self->m_size.m_height >= other.m_location.m_y + other.m_size.m_height; +} + +WebCore::FloatRect APS5_VABI _ZNK7WebCore9FloatQuad11boundingBoxEv(const WebCore::FloatQuad* self) { + float left = std::min({self->m_p1.m_x, self->m_p2.m_x, self->m_p3.m_x, self->m_p4.m_x}); + float top = std::min({self->m_p1.m_y, self->m_p2.m_y, self->m_p3.m_y, self->m_p4.m_y}); + float right = std::max({self->m_p1.m_x, self->m_p2.m_x, self->m_p3.m_x, self->m_p4.m_x}); + float bottom = std::max({self->m_p1.m_y, self->m_p2.m_y, self->m_p3.m_y, self->m_p4.m_y}); + return WebCore::FloatRect{{left, top}, {right - left, bottom - top}}; +} + +bool APS5_VABI _ZNK7WebCore9FloatQuad12containsQuadERKS0_(const WebCore::FloatQuad* self, const WebCore::FloatQuad& other) { + auto containsPoint = [self](const WebCore::FloatPoint& p) { + return WebCore::IsPointInTriangle(p, self->m_p1, self->m_p2, self->m_p3) + || WebCore::IsPointInTriangle(p, self->m_p1, self->m_p3, self->m_p4); + }; + return containsPoint(other.m_p1) && containsPoint(other.m_p2) && containsPoint(other.m_p3) && containsPoint(other.m_p4); +} + +bool APS5_VABI _ZNK7WebCore9FloatQuad13containsPointERKNS_10FloatPointE(const WebCore::FloatQuad* self, const WebCore::FloatPoint& point) { + return WebCore::IsPointInTriangle(point, self->m_p1, self->m_p2, self->m_p3) + || WebCore::IsPointInTriangle(point, self->m_p1, self->m_p3, self->m_p4); +} + +bool APS5_VABI _ZNK7WebCore9FloatQuad13isRectilinearEv(const WebCore::FloatQuad* self) { + return (WebCore::AreEssentiallyEqual(self->m_p1.m_x, self->m_p2.m_x) + && WebCore::AreEssentiallyEqual(self->m_p2.m_y, self->m_p3.m_y) + && WebCore::AreEssentiallyEqual(self->m_p3.m_x, self->m_p4.m_x) + && WebCore::AreEssentiallyEqual(self->m_p4.m_y, self->m_p1.m_y)) + || (WebCore::AreEssentiallyEqual(self->m_p1.m_y, self->m_p2.m_y) + && WebCore::AreEssentiallyEqual(self->m_p2.m_x, self->m_p3.m_x) + && WebCore::AreEssentiallyEqual(self->m_p3.m_y, self->m_p4.m_y) + && WebCore::AreEssentiallyEqual(self->m_p4.m_x, self->m_p1.m_x)); +} + +void APS5_VABI _ZN7WebCore16FloatRoundedRectC1ERKNS_9FloatRectERKNS0_5RadiiE( + WebCore::FloatRoundedRect* self, const WebCore::FloatRect& rect, const WebCore::FloatRoundedRect::Radii& radii) { + self->m_rect = rect; + self->m_radii = radii; +} + +void APS5_VABI _ZN7WebCore16FloatRoundedRectC2ERKNS_9FloatRectERKNS0_5RadiiE( + WebCore::FloatRoundedRect* self, const WebCore::FloatRect& rect, const WebCore::FloatRoundedRect::Radii& radii) { + self->m_rect = rect; + self->m_radii = radii; +} + +void APS5_VABI _ZN7WebCore8IntPointC1ERKNS_10FloatPointE(WebCore::IntPoint* self, const WebCore::FloatPoint& p) { + self->m_x = WebCore::ClampToInteger(p.m_x); + self->m_y = WebCore::ClampToInteger(p.m_y); +} + +void APS5_VABI _ZN7WebCore8IntPointC2ERKNS_10FloatPointE(WebCore::IntPoint* self, const WebCore::FloatPoint& p) { + self->m_x = WebCore::ClampToInteger(p.m_x); + self->m_y = WebCore::ClampToInteger(p.m_y); +} + +WebCore::IntPoint APS5_VABI _ZNK7WebCore8IntPoint18constrainedBetweenERKS0_S2_( + const WebCore::IntPoint* self, const WebCore::IntPoint& min, const WebCore::IntPoint& max) { + return WebCore::IntPoint{ + std::max(min.m_x, std::min(max.m_x, self->m_x)), + std::max(min.m_y, std::min(max.m_y, self->m_y)) + }; +} + +void APS5_VABI _ZN7WebCore7IntSizeC1ERKNS_9FloatSizeE(WebCore::IntSize* self, const WebCore::FloatSize& s) { + self->m_width = WebCore::ClampToInteger(s.m_width); + self->m_height = WebCore::ClampToInteger(s.m_height); +} + +void APS5_VABI _ZN7WebCore7IntSizeC2ERKNS_9FloatSizeE(WebCore::IntSize* self, const WebCore::FloatSize& s) { + self->m_width = WebCore::ClampToInteger(s.m_width); + self->m_height = WebCore::ClampToInteger(s.m_height); +} + +WebCore::IntSize APS5_VABI _ZNK7WebCore7IntSize18constrainedBetweenERKS0_S2_( + const WebCore::IntSize* self, const WebCore::IntSize& min, const WebCore::IntSize& max) { + return WebCore::IntSize{ + std::max(min.m_width, std::min(max.m_width, self->m_width)), + std::max(min.m_height, std::min(max.m_height, self->m_height)) + }; +} + +void APS5_VABI _ZN7WebCore7IntRect5scaleEf(WebCore::IntRect* self, float s) { + self->m_location.m_x = static_cast(self->m_location.m_x * s); + self->m_location.m_y = static_cast(self->m_location.m_y * s); + self->m_size.m_width = static_cast(self->m_size.m_width * s); + self->m_size.m_height = static_cast(self->m_size.m_height * s); +} + +void APS5_VABI _ZN7WebCore7IntRect5uniteERKS0_(WebCore::IntRect* self, const WebCore::IntRect& other) { + if (other.m_size.m_width <= 0 || other.m_size.m_height <= 0) { + return; + } + if (self->m_size.m_width <= 0 || self->m_size.m_height <= 0) { + *self = other; + return; + } + int l = std::min(self->m_location.m_x, other.m_location.m_x); + int t = std::min(self->m_location.m_y, other.m_location.m_y); + int r = std::max(self->m_location.m_x + self->m_size.m_width, other.m_location.m_x + other.m_size.m_width); + int b = std::max(self->m_location.m_y + self->m_size.m_height, other.m_location.m_y + other.m_size.m_height); + self->m_location = {l, t}; + self->m_size = {r - l, b - t}; +} + +void APS5_VABI _ZN7WebCore7IntRect9intersectERKS0_(WebCore::IntRect* self, const WebCore::IntRect& other) { + int l = std::max(self->m_location.m_x, other.m_location.m_x); + int t = std::max(self->m_location.m_y, other.m_location.m_y); + int r = std::min(self->m_location.m_x + self->m_size.m_width, other.m_location.m_x + other.m_size.m_width); + int b = std::min(self->m_location.m_y + self->m_size.m_height, other.m_location.m_y + other.m_size.m_height); + if (l >= r || t >= b) { + self->m_location = {0, 0}; + self->m_size = {0, 0}; + } else { + self->m_location = {l, t}; + self->m_size = {r - l, b - t}; + } +} + +void APS5_VABI _ZN7WebCore7IntRectC1ERKNS_10LayoutRectE(WebCore::IntRect* self, const WebCore::LayoutRect& r) { + self->m_location.m_x = r.m_location.m_x.m_value / 64; + self->m_location.m_y = r.m_location.m_y.m_value / 64; + self->m_size.m_width = r.m_size.m_width.m_value / 64; + self->m_size.m_height = r.m_size.m_height.m_value / 64; +} + +void APS5_VABI _ZN7WebCore7IntRectC1ERKNS_9FloatRectE(WebCore::IntRect* self, const WebCore::FloatRect& r) { + self->m_location.m_x = WebCore::ClampToInteger(r.m_location.m_x); + self->m_location.m_y = WebCore::ClampToInteger(r.m_location.m_y); + self->m_size.m_width = WebCore::ClampToInteger(r.m_size.m_width); + self->m_size.m_height = WebCore::ClampToInteger(r.m_size.m_height); +} + +void APS5_VABI _ZN7WebCore7IntRectC2ERKNS_10LayoutRectE(WebCore::IntRect* self, const WebCore::LayoutRect& r) { + self->m_location.m_x = r.m_location.m_x.m_value / 64; + self->m_location.m_y = r.m_location.m_y.m_value / 64; + self->m_size.m_width = r.m_size.m_width.m_value / 64; + self->m_size.m_height = r.m_size.m_height.m_value / 64; +} + +void APS5_VABI _ZN7WebCore7IntRectC2ERKNS_9FloatRectE(WebCore::IntRect* self, const WebCore::FloatRect& r) { + self->m_location.m_x = WebCore::ClampToInteger(r.m_location.m_x); + self->m_location.m_y = WebCore::ClampToInteger(r.m_location.m_y); + self->m_size.m_width = WebCore::ClampToInteger(r.m_size.m_width); + self->m_size.m_height = WebCore::ClampToInteger(r.m_size.m_height); +} + +bool APS5_VABI _ZNK7WebCore7IntRect10intersectsERKS0_(const WebCore::IntRect* self, const WebCore::IntRect& other) { + return self->m_size.m_width > 0 && self->m_size.m_height > 0 + && other.m_size.m_width > 0 && other.m_size.m_height > 0 + && self->m_location.m_x < other.m_location.m_x + other.m_size.m_width + && other.m_location.m_x < self->m_location.m_x + self->m_size.m_width + && self->m_location.m_y < other.m_location.m_y + other.m_size.m_height + && other.m_location.m_y < self->m_location.m_y + self->m_size.m_height; +} + +bool APS5_VABI _ZNK7WebCore7IntRect8containsERKS0_(const WebCore::IntRect* self, const WebCore::IntRect& other) { + return self->m_location.m_x <= other.m_location.m_x + && self->m_location.m_x + self->m_size.m_width >= other.m_location.m_x + other.m_size.m_width + && self->m_location.m_y <= other.m_location.m_y + && self->m_location.m_y + self->m_size.m_height >= other.m_location.m_y + other.m_size.m_height; +} + +void APS5_VABI _ZN7WebCore10LayoutRect5scaleEf(WebCore::LayoutRect* self, float s) { + constexpr int minVal = std::numeric_limits::min() / 2; + constexpr int maxVal = std::numeric_limits::max() - 64 / 2; + if (self->m_location.m_x.m_value == minVal && self->m_location.m_y.m_value == minVal + && self->m_size.m_width.m_value == maxVal && self->m_size.m_height.m_value == maxVal) { + return; + } + self->m_location.m_x.m_value = WebCore::ClampToInteger(self->m_location.m_x.m_value * s); + self->m_location.m_y.m_value = WebCore::ClampToInteger(self->m_location.m_y.m_value * s); + self->m_size.m_width.m_value = WebCore::ClampToInteger(self->m_size.m_width.m_value * s); + self->m_size.m_height.m_value = WebCore::ClampToInteger(self->m_size.m_height.m_value * s); +} + +void APS5_VABI _ZN7WebCore10LayoutRect5uniteERKS0_(WebCore::LayoutRect* self, const WebCore::LayoutRect& other) { + if (other.m_size.m_width.m_value <= 0 || other.m_size.m_height.m_value <= 0) { + return; + } + if (self->m_size.m_width.m_value <= 0 || self->m_size.m_height.m_value <= 0) { + *self = other; + return; + } + int minX = std::min(self->m_location.m_x.m_value, other.m_location.m_x.m_value); + int minY = std::min(self->m_location.m_y.m_value, other.m_location.m_y.m_value); + int maxX = std::max(self->m_location.m_x.m_value + self->m_size.m_width.m_value, + other.m_location.m_x.m_value + other.m_size.m_width.m_value); + int maxY = std::max(self->m_location.m_y.m_value + self->m_size.m_height.m_value, + other.m_location.m_y.m_value + other.m_size.m_height.m_value); + self->m_location.m_x.m_value = minX; + self->m_location.m_y.m_value = minY; + self->m_size.m_width.m_value = maxX - minX; + self->m_size.m_height.m_value = maxY - minY; +} + +void APS5_VABI _ZN7WebCore10LayoutRectC1ERKNS_9FloatRectE(WebCore::LayoutRect* self, const WebCore::FloatRect& r) { + self->m_location.m_x.m_value = WebCore::ClampToInteger(r.m_location.m_x * 64.0f); + self->m_location.m_y.m_value = WebCore::ClampToInteger(r.m_location.m_y * 64.0f); + self->m_size.m_width.m_value = WebCore::ClampToInteger(r.m_size.m_width * 64.0f); + self->m_size.m_height.m_value = WebCore::ClampToInteger(r.m_size.m_height * 64.0f); +} + +void APS5_VABI _ZN7WebCore10LayoutRectC2ERKNS_9FloatRectE(WebCore::LayoutRect* self, const WebCore::FloatRect& r) { + self->m_location.m_x.m_value = WebCore::ClampToInteger(r.m_location.m_x * 64.0f); + self->m_location.m_y.m_value = WebCore::ClampToInteger(r.m_location.m_y * 64.0f); + self->m_size.m_width.m_value = WebCore::ClampToInteger(r.m_size.m_width * 64.0f); + self->m_size.m_height.m_value = WebCore::ClampToInteger(r.m_size.m_height * 64.0f); +} + +bool APS5_VABI _ZNK7WebCore10LayoutRect8containsERKS0_(const WebCore::LayoutRect* self, const WebCore::LayoutRect& other) { + return self->m_location.m_x.m_value <= other.m_location.m_x.m_value + && self->m_location.m_x.m_value + self->m_size.m_width.m_value >= other.m_location.m_x.m_value + other.m_size.m_width.m_value + && self->m_location.m_y.m_value <= other.m_location.m_y.m_value + && self->m_location.m_y.m_value + self->m_size.m_height.m_value >= other.m_location.m_y.m_value + other.m_size.m_height.m_value; +} + +void APS5_VABI _ZN7WebCore11RoundedRectC1ERKNS_10LayoutRectERKNS_10LayoutSizeES6_S6_S6_( + WebCore::RoundedRect* self, const WebCore::LayoutRect& rect, + const WebCore::LayoutSize& topLeft, const WebCore::LayoutSize& topRight, + const WebCore::LayoutSize& bottomLeft, const WebCore::LayoutSize& bottomRight) { + self->m_rect = rect; + self->m_radii.m_topLeft = topLeft; + self->m_radii.m_topRight = topRight; + self->m_radii.m_bottomLeft = bottomLeft; + self->m_radii.m_bottomRight = bottomRight; +} + +void APS5_VABI _ZN7WebCore11RoundedRectC2ERKNS_10LayoutRectERKNS_10LayoutSizeES6_S6_S6_( + WebCore::RoundedRect* self, const WebCore::LayoutRect& rect, + const WebCore::LayoutSize& topLeft, const WebCore::LayoutSize& topRight, + const WebCore::LayoutSize& bottomLeft, const WebCore::LayoutSize& bottomRight) { + self->m_rect = rect; + self->m_radii.m_topLeft = topLeft; + self->m_radii.m_topRight = topRight; + self->m_radii.m_bottomLeft = bottomLeft; + self->m_radii.m_bottomRight = bottomRight; +} + +bool APS5_VABI _ZNK7WebCore11RoundedRect8containsERKNS_10LayoutRectE( + const WebCore::RoundedRect* self, const WebCore::LayoutRect& other) { + bool rectContains = self->m_rect.m_location.m_x.m_value <= other.m_location.m_x.m_value + && self->m_rect.m_location.m_x.m_value + self->m_rect.m_size.m_width.m_value >= other.m_location.m_x.m_value + other.m_size.m_width.m_value + && self->m_rect.m_location.m_y.m_value <= other.m_location.m_y.m_value + && self->m_rect.m_location.m_y.m_value + self->m_rect.m_size.m_height.m_value >= other.m_location.m_y.m_value + other.m_size.m_height.m_value; + if (!rectContains || !WebCore::IsRoundedRectRenderable(*self)) { + return false; + } + float rx = static_cast(self->m_rect.m_location.m_x.m_value) / 64.0f; + float ry = static_cast(self->m_rect.m_location.m_y.m_value) / 64.0f; + float rw = static_cast(self->m_rect.m_size.m_width.m_value) / 64.0f; + float rh = static_cast(self->m_rect.m_size.m_height.m_value) / 64.0f; + float ox = static_cast(other.m_location.m_x.m_value) / 64.0f; + float oy = static_cast(other.m_location.m_y.m_value) / 64.0f; + float ow = static_cast(other.m_size.m_width.m_value) / 64.0f; + float oh = static_cast(other.m_size.m_height.m_value) / 64.0f; + + if (self->m_radii.m_topLeft.m_width.m_value > 0 && self->m_radii.m_topLeft.m_height.m_value > 0) { + float radW = static_cast(self->m_radii.m_topLeft.m_width.m_value) / 64.0f; + float radH = static_cast(self->m_radii.m_topLeft.m_height.m_value) / 64.0f; + WebCore::FloatPoint center{rx + radW, ry + radH}; + if (ox <= center.m_x && oy <= center.m_y) { + if (!WebCore::EllipseContainsPoint(center, radW, radH, WebCore::FloatPoint{ox, oy})) { + return false; + } + } + } + if (self->m_radii.m_topRight.m_width.m_value > 0 && self->m_radii.m_topRight.m_height.m_value > 0) { + float radW = static_cast(self->m_radii.m_topRight.m_width.m_value) / 64.0f; + float radH = static_cast(self->m_radii.m_topRight.m_height.m_value) / 64.0f; + WebCore::FloatPoint center{rx + rw - radW, ry + radH}; + if (ox + ow >= center.m_x && oy <= center.m_y) { + if (!WebCore::EllipseContainsPoint(center, radW, radH, WebCore::FloatPoint{ox + ow, oy})) { + return false; + } + } + } + if (self->m_radii.m_bottomLeft.m_width.m_value > 0 && self->m_radii.m_bottomLeft.m_height.m_value > 0) { + float radW = static_cast(self->m_radii.m_bottomLeft.m_width.m_value) / 64.0f; + float radH = static_cast(self->m_radii.m_bottomLeft.m_height.m_value) / 64.0f; + WebCore::FloatPoint center{rx + radW, ry + rh - radH}; + if (ox <= center.m_x && oy + oh >= center.m_y) { + if (!WebCore::EllipseContainsPoint(center, radW, radH, WebCore::FloatPoint{ox, oy + oh})) { + return false; + } + } + } + if (self->m_radii.m_bottomRight.m_width.m_value > 0 && self->m_radii.m_bottomRight.m_height.m_value > 0) { + float radW = static_cast(self->m_radii.m_bottomRight.m_width.m_value) / 64.0f; + float radH = static_cast(self->m_radii.m_bottomRight.m_height.m_value) / 64.0f; + WebCore::FloatPoint center{rx + rw - radW, ry + rh - radH}; + if (ox + ow >= center.m_x && oy + oh >= center.m_y) { + if (!WebCore::EllipseContainsPoint(center, radW, radH, WebCore::FloatPoint{ox + ow, oy + oh})) { + return false; + } + } + } + return true; +} + +} diff --git a/core/libs/prx/libSceNKWebKit/src/WebCoreTransform.cpp b/core/libs/prx/libSceNKWebKit/src/WebCoreTransform.cpp new file mode 100644 index 0000000000..2c342a8cf2 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/WebCoreTransform.cpp @@ -0,0 +1,660 @@ +#include "prx/libc/include/General.hpp" +#include "prx/libSceNKWebKit/include/WebCoreExports.hpp" +#include "prx/libSceNKWebKit/src/WebCoreTypes.hpp" +#include +#include +#include +#include +#include +#include + +namespace WebCore { + +namespace { + +constexpr double kPi = 3.14159265358979323846; +constexpr double kSmallNumber = 1.0e-8; + +inline double Deg2Rad(double d) { + return d * (kPi / 180.0); +} + +int ClampToInteger(float value) { + if (value >= static_cast(std::numeric_limits::max())) { + return std::numeric_limits::max(); + } + if (!(value > static_cast(std::numeric_limits::min()))) { + return std::numeric_limits::min(); + } + return static_cast(value); +} + +IntRect EnclosingIntRect(const FloatRect& rect) { + int x = ClampToInteger(std::floor(rect.m_location.m_x)); + int y = ClampToInteger(std::floor(rect.m_location.m_y)); + int maxX = ClampToInteger(std::ceil(rect.m_location.m_x + rect.m_size.m_width)); + int maxY = ClampToInteger(std::ceil(rect.m_location.m_y + rect.m_size.m_height)); + return IntRect{IntPoint{x, y}, IntSize{maxX - x, maxY - y}}; +} + +bool IsAffineIdentityOrTranslation(const AffineTransform& t) { + return t.m_transform[0] == 1.0 && t.m_transform[1] == 0.0 + && t.m_transform[2] == 0.0 && t.m_transform[3] == 1.0; +} + +enum class MatrixType : std::uint8_t { + IdentityOrTranslation, + Affine, + Other +}; + +MatrixType GetMatrixType(const TransformationMatrix& tm) { + if (tm.m_matrix[0][2] == 0.0 && tm.m_matrix[0][3] == 0.0 + && tm.m_matrix[1][2] == 0.0 && tm.m_matrix[1][3] == 0.0 + && tm.m_matrix[2][3] == 0.0 && tm.m_matrix[2][0] == 0.0 + && tm.m_matrix[2][1] == 0.0 && tm.m_matrix[2][2] == 1.0 + && tm.m_matrix[3][3] == 1.0) { + if (tm.m_matrix[0][1] == 0.0 && tm.m_matrix[1][0] == 0.0 + && tm.m_matrix[0][0] == 1.0 && tm.m_matrix[1][1] == 1.0) { + return MatrixType::IdentityOrTranslation; + } + if (tm.m_matrix[3][2] == 0.0) { + return MatrixType::Affine; + } + } + return MatrixType::Other; +} + +double Determinant2x2(double a, double b, double c, double d) { + return a * d - b * c; +} + +double Determinant3x3(double a1, double a2, double a3, + double b1, double b2, double b3, + double c1, double c2, double c3) { + return a1 * Determinant2x2(b2, b3, c2, c3) + - b1 * Determinant2x2(a2, a3, c2, c3) + + c1 * Determinant2x2(a2, a3, b2, b3); +} + +double Determinant4x4(const double m[4][4]) { + double a1 = m[0][0], b1 = m[0][1], c1 = m[0][2], d1 = m[0][3]; + double a2 = m[1][0], b2 = m[1][1], c2 = m[1][2], d2 = m[1][3]; + double a3 = m[2][0], b3 = m[2][1], c3 = m[2][2], d3 = m[2][3]; + double a4 = m[3][0], b4 = m[3][1], c4 = m[3][2], d4 = m[3][3]; + + return a1 * Determinant3x3(b2, b3, b4, c2, c3, c4, d2, d3, d4) + - b1 * Determinant3x3(a2, a3, a4, c2, c3, c4, d2, d3, d4) + + c1 * Determinant3x3(a2, a3, a4, b2, b3, b4, d2, d3, d4) + - d1 * Determinant3x3(a2, a3, a4, b2, b3, b4, c2, c3, c4); +} + +void MultVecMatrix2D(const TransformationMatrix& tm, double x, double y, double& dstX, double& dstY) { + dstX = tm.m_matrix[3][0] + x * tm.m_matrix[0][0] + y * tm.m_matrix[1][0]; + dstY = tm.m_matrix[3][1] + x * tm.m_matrix[0][1] + y * tm.m_matrix[1][1]; + double w = tm.m_matrix[3][3] + x * tm.m_matrix[0][3] + y * tm.m_matrix[1][3]; + if (w != 1.0 && w != 0.0) { + dstX /= w; + dstY /= w; + } +} + +FloatPoint InternalMapPoint(const TransformationMatrix& tm, const FloatPoint& p) { + double rx = 0.0; + double ry = 0.0; + MultVecMatrix2D(tm, static_cast(p.m_x), static_cast(p.m_y), rx, ry); + return FloatPoint{static_cast(rx), static_cast(ry)}; +} + +} // namespace +} // namespace WebCore + +extern "C" { +void APS5_VABI _ZN7WebCore15AffineTransform12makeIdentityEv(WebCore::AffineTransform* self) { + self->m_transform = {1.0, 0.0, 0.0, 1.0, 0.0, 0.0}; +} + +WebCore::AffineTransform& APS5_VABI _ZN7WebCore15AffineTransform15scaleNonUniformEdd( + WebCore::AffineTransform* self, double sx, double sy) { + self->m_transform[0] *= sx; + self->m_transform[1] *= sx; + self->m_transform[2] *= sy; + self->m_transform[3] *= sy; + return *self; +} + +WebCore::AffineTransform& APS5_VABI _ZN7WebCore15AffineTransform4skewEdd( + WebCore::AffineTransform* self, double angleX, double angleY) { + double sx = std::tan(WebCore::Deg2Rad(angleX)); + double sy = std::tan(WebCore::Deg2Rad(angleY)); + double a = self->m_transform[0]; + double b = self->m_transform[1]; + self->m_transform[0] += sy * self->m_transform[2]; + self->m_transform[1] += sy * self->m_transform[3]; + self->m_transform[2] += sx * a; + self->m_transform[3] += sx * b; + return *self; +} + +WebCore::AffineTransform& APS5_VABI _ZN7WebCore15AffineTransform5flipXEv(WebCore::AffineTransform* self) { + self->m_transform[0] = -self->m_transform[0]; + self->m_transform[1] = -self->m_transform[1]; + return *self; +} + +WebCore::AffineTransform& APS5_VABI _ZN7WebCore15AffineTransform5flipYEv(WebCore::AffineTransform* self) { + self->m_transform[2] = -self->m_transform[2]; + self->m_transform[3] = -self->m_transform[3]; + return *self; +} + +WebCore::AffineTransform& APS5_VABI _ZN7WebCore15AffineTransform5scaleERKNS_9FloatSizeE( + WebCore::AffineTransform* self, const WebCore::FloatSize& s) { + return _ZN7WebCore15AffineTransform15scaleNonUniformEdd(self, static_cast(s.m_width), static_cast(s.m_height)); +} + +WebCore::AffineTransform& APS5_VABI _ZN7WebCore15AffineTransform5scaleEd(WebCore::AffineTransform* self, double s) { + return _ZN7WebCore15AffineTransform15scaleNonUniformEdd(self, s, s); +} + +WebCore::AffineTransform& APS5_VABI _ZN7WebCore15AffineTransform5shearEdd( + WebCore::AffineTransform* self, double sx, double sy) { + double a = self->m_transform[0]; + double b = self->m_transform[1]; + self->m_transform[0] += sy * self->m_transform[2]; + self->m_transform[1] += sy * self->m_transform[3]; + self->m_transform[2] += sx * a; + self->m_transform[3] += sx * b; + return *self; +} + +WebCore::AffineTransform& APS5_VABI _ZN7WebCore15AffineTransform6rotateEd(WebCore::AffineTransform* self, double a) { + double rad = WebCore::Deg2Rad(a); + double cosAngle = std::cos(rad); + double sinAngle = std::sin(rad); + WebCore::AffineTransform rot; + rot.m_transform = {cosAngle, sinAngle, -sinAngle, cosAngle, 0.0, 0.0}; + return _ZN7WebCore15AffineTransform8multiplyERKS0_(self, rot); +} + +WebCore::AffineTransform& APS5_VABI _ZN7WebCore15AffineTransform8multiplyERKS0_( + WebCore::AffineTransform* self, const WebCore::AffineTransform& other) { + WebCore::AffineTransform trans; + trans.m_transform[0] = other.m_transform[0] * self->m_transform[0] + other.m_transform[1] * self->m_transform[2]; + trans.m_transform[1] = other.m_transform[0] * self->m_transform[1] + other.m_transform[1] * self->m_transform[3]; + trans.m_transform[2] = other.m_transform[2] * self->m_transform[0] + other.m_transform[3] * self->m_transform[2]; + trans.m_transform[3] = other.m_transform[2] * self->m_transform[1] + other.m_transform[3] * self->m_transform[3]; + trans.m_transform[4] = other.m_transform[4] * self->m_transform[0] + other.m_transform[5] * self->m_transform[2] + self->m_transform[4]; + trans.m_transform[5] = other.m_transform[4] * self->m_transform[1] + other.m_transform[5] * self->m_transform[3] + self->m_transform[5]; + self->m_transform = trans.m_transform; + return *self; +} + +WebCore::AffineTransform& APS5_VABI _ZN7WebCore15AffineTransform9translateERKNS_10FloatPointE( + WebCore::AffineTransform* self, const WebCore::FloatPoint& p) { + return _ZN7WebCore15AffineTransform9translateEdd(self, static_cast(p.m_x), static_cast(p.m_y)); +} + +WebCore::AffineTransform& APS5_VABI _ZN7WebCore15AffineTransform9translateERKNS_9FloatSizeE( + WebCore::AffineTransform* self, const WebCore::FloatSize& s) { + return _ZN7WebCore15AffineTransform9translateEdd(self, static_cast(s.m_width), static_cast(s.m_height)); +} + +WebCore::AffineTransform& APS5_VABI _ZN7WebCore15AffineTransform9translateEdd( + WebCore::AffineTransform* self, double tx, double ty) { + if (WebCore::IsAffineIdentityOrTranslation(*self)) { + self->m_transform[4] += tx; + self->m_transform[5] += ty; + return *self; + } + self->m_transform[4] += tx * self->m_transform[0] + ty * self->m_transform[2]; + self->m_transform[5] += tx * self->m_transform[1] + ty * self->m_transform[3]; + return *self; +} + +bool APS5_VABI _ZNK7WebCore15AffineTransform10isIdentityEv(const WebCore::AffineTransform* self) { + return self->m_transform[0] == 1.0 && self->m_transform[1] == 0.0 + && self->m_transform[2] == 0.0 && self->m_transform[3] == 1.0 + && self->m_transform[4] == 0.0 && self->m_transform[5] == 0.0; +} + +WebCore::TransformationMatrix APS5_VABI _ZNK7WebCore15AffineTransform22toTransformationMatrixEv( + const WebCore::AffineTransform* self) { + WebCore::TransformationMatrix result; + result.m_matrix[0][0] = self->m_transform[0]; + result.m_matrix[0][1] = self->m_transform[1]; + result.m_matrix[0][2] = 0.0; + result.m_matrix[0][3] = 0.0; + result.m_matrix[1][0] = self->m_transform[2]; + result.m_matrix[1][1] = self->m_transform[3]; + result.m_matrix[1][2] = 0.0; + result.m_matrix[1][3] = 0.0; + result.m_matrix[2][0] = 0.0; + result.m_matrix[2][1] = 0.0; + result.m_matrix[2][2] = 1.0; + result.m_matrix[2][3] = 0.0; + result.m_matrix[3][0] = self->m_transform[4]; + result.m_matrix[3][1] = self->m_transform[5]; + result.m_matrix[3][2] = 0.0; + result.m_matrix[3][3] = 1.0; + return result; +} + +double APS5_VABI _ZNK7WebCore15AffineTransform6xScaleEv(const WebCore::AffineTransform* self) { + return std::hypot(self->m_transform[0], self->m_transform[1]); +} + +double APS5_VABI _ZNK7WebCore15AffineTransform6yScaleEv(const WebCore::AffineTransform* self) { + return std::hypot(self->m_transform[2], self->m_transform[3]); +} + +WebCore::FloatQuad APS5_VABI _ZNK7WebCore15AffineTransform7mapQuadERKNS_9FloatQuadE( + const WebCore::AffineTransform* self, const WebCore::FloatQuad& q) { + if (WebCore::IsAffineIdentityOrTranslation(*self)) { + float tx = static_cast(self->m_transform[4]); + float ty = static_cast(self->m_transform[5]); + return WebCore::FloatQuad{ + WebCore::FloatPoint{q.m_p1.m_x + tx, q.m_p1.m_y + ty}, + WebCore::FloatPoint{q.m_p2.m_x + tx, q.m_p2.m_y + ty}, + WebCore::FloatPoint{q.m_p3.m_x + tx, q.m_p3.m_y + ty}, + WebCore::FloatPoint{q.m_p4.m_x + tx, q.m_p4.m_y + ty} + }; + } + return WebCore::FloatQuad{ + _ZNK7WebCore15AffineTransform8mapPointERKNS_10FloatPointE(self, q.m_p1), + _ZNK7WebCore15AffineTransform8mapPointERKNS_10FloatPointE(self, q.m_p2), + _ZNK7WebCore15AffineTransform8mapPointERKNS_10FloatPointE(self, q.m_p3), + _ZNK7WebCore15AffineTransform8mapPointERKNS_10FloatPointE(self, q.m_p4) + }; +} + +WebCore::IntRect APS5_VABI _ZNK7WebCore15AffineTransform7mapRectERKNS_7IntRectE( + const WebCore::AffineTransform* self, const WebCore::IntRect& r) { + WebCore::FloatRect fr{ + WebCore::FloatPoint{static_cast(r.m_location.m_x), static_cast(r.m_location.m_y)}, + WebCore::FloatSize{static_cast(r.m_size.m_width), static_cast(r.m_size.m_height)} + }; + WebCore::FloatRect mapped = _ZNK7WebCore15AffineTransform7mapRectERKNS_9FloatRectE(self, fr); + return WebCore::EnclosingIntRect(mapped); +} + +WebCore::FloatRect APS5_VABI _ZNK7WebCore15AffineTransform7mapRectERKNS_9FloatRectE( + const WebCore::AffineTransform* self, const WebCore::FloatRect& rect) { + if (WebCore::IsAffineIdentityOrTranslation(*self)) { + return WebCore::FloatRect{ + WebCore::FloatPoint{rect.m_location.m_x + static_cast(self->m_transform[4]), + rect.m_location.m_y + static_cast(self->m_transform[5])}, + rect.m_size + }; + } + WebCore::FloatPoint p1 = _ZNK7WebCore15AffineTransform8mapPointERKNS_10FloatPointE(self, rect.m_location); + WebCore::FloatPoint p2 = _ZNK7WebCore15AffineTransform8mapPointERKNS_10FloatPointE( + self, WebCore::FloatPoint{rect.m_location.m_x + rect.m_size.m_width, rect.m_location.m_y}); + WebCore::FloatPoint p3 = _ZNK7WebCore15AffineTransform8mapPointERKNS_10FloatPointE( + self, WebCore::FloatPoint{rect.m_location.m_x + rect.m_size.m_width, rect.m_location.m_y + rect.m_size.m_height}); + WebCore::FloatPoint p4 = _ZNK7WebCore15AffineTransform8mapPointERKNS_10FloatPointE( + self, WebCore::FloatPoint{rect.m_location.m_x, rect.m_location.m_y + rect.m_size.m_height}); + float left = std::min({p1.m_x, p2.m_x, p3.m_x, p4.m_x}); + float top = std::min({p1.m_y, p2.m_y, p3.m_y, p4.m_y}); + float right = std::max({p1.m_x, p2.m_x, p3.m_x, p4.m_x}); + float bottom = std::max({p1.m_y, p2.m_y, p3.m_y, p4.m_y}); + return WebCore::FloatRect{WebCore::FloatPoint{left, top}, WebCore::FloatSize{right - left, bottom - top}}; +} + +WebCore::IntSize APS5_VABI _ZNK7WebCore15AffineTransform7mapSizeERKNS_7IntSizeE( + const WebCore::AffineTransform* self, const WebCore::IntSize& size) { + double width2 = static_cast(size.m_width) * _ZNK7WebCore15AffineTransform6xScaleEv(self); + double height2 = static_cast(size.m_height) * _ZNK7WebCore15AffineTransform6yScaleEv(self); + return WebCore::IntSize{ + static_cast(std::lround(width2)), + static_cast(std::lround(height2)) + }; +} + +WebCore::FloatSize APS5_VABI _ZNK7WebCore15AffineTransform7mapSizeERKNS_9FloatSizeE( + const WebCore::AffineTransform* self, const WebCore::FloatSize& size) { + double width2 = static_cast(size.m_width) * _ZNK7WebCore15AffineTransform6xScaleEv(self); + double height2 = static_cast(size.m_height) * _ZNK7WebCore15AffineTransform6yScaleEv(self); + return WebCore::FloatSize{static_cast(width2), static_cast(height2)}; +} + +WebCore::FloatPoint APS5_VABI _ZNK7WebCore15AffineTransform8mapPointERKNS_10FloatPointE( + const WebCore::AffineTransform* self, const WebCore::FloatPoint& point) { + double x = static_cast(point.m_x); + double y = static_cast(point.m_y); + double x2 = self->m_transform[0] * x + self->m_transform[2] * y + self->m_transform[4]; + double y2 = self->m_transform[1] * x + self->m_transform[3] * y + self->m_transform[5]; + return WebCore::FloatPoint{static_cast(x2), static_cast(y2)}; +} + +WebCore::IntPoint APS5_VABI _ZNK7WebCore15AffineTransform8mapPointERKNS_8IntPointE( + const WebCore::AffineTransform* self, const WebCore::IntPoint& point) { + double x = static_cast(point.m_x); + double y = static_cast(point.m_y); + double x2 = self->m_transform[0] * x + self->m_transform[2] * y + self->m_transform[4]; + double y2 = self->m_transform[1] * x + self->m_transform[3] * y + self->m_transform[5]; + return WebCore::IntPoint{ + static_cast(std::lround(x2)), + static_cast(std::lround(y2)) + }; +} + +void APS5_VABI _ZN7WebCore20TransformationMatrix10makeAffineEv(WebCore::TransformationMatrix* self) { + self->m_matrix[0][2] = 0.0; + self->m_matrix[0][3] = 0.0; + self->m_matrix[1][2] = 0.0; + self->m_matrix[1][3] = 0.0; + self->m_matrix[2][0] = 0.0; + self->m_matrix[2][1] = 0.0; + self->m_matrix[2][2] = 1.0; + self->m_matrix[2][3] = 0.0; + self->m_matrix[3][2] = 0.0; + self->m_matrix[3][3] = 1.0; +} + +WebCore::TransformationMatrix APS5_VABI _ZN7WebCore20TransformationMatrix10rectToRectERKNS_9FloatRectES3_( + const WebCore::FloatRect& from, const WebCore::FloatRect& to) { + WebCore::TransformationMatrix result; + result.m_matrix[0][0] = static_cast(to.m_size.m_width / from.m_size.m_width); + result.m_matrix[0][1] = 0.0; + result.m_matrix[0][2] = 0.0; + result.m_matrix[0][3] = 0.0; + result.m_matrix[1][0] = 0.0; + result.m_matrix[1][1] = static_cast(to.m_size.m_height / from.m_size.m_height); + result.m_matrix[1][2] = 0.0; + result.m_matrix[1][3] = 0.0; + result.m_matrix[2][0] = 0.0; + result.m_matrix[2][1] = 0.0; + result.m_matrix[2][2] = 1.0; + result.m_matrix[2][3] = 0.0; + result.m_matrix[3][0] = static_cast(to.m_location.m_x - from.m_location.m_x); + result.m_matrix[3][1] = static_cast(to.m_location.m_y - from.m_location.m_y); + result.m_matrix[3][2] = 0.0; + result.m_matrix[3][3] = 1.0; + return result; +} + +WebCore::TransformationMatrix& APS5_VABI _ZN7WebCore20TransformationMatrix11translate3dEddd( + WebCore::TransformationMatrix* self, double tx, double ty, double tz) { + self->m_matrix[3][0] += tx * self->m_matrix[0][0] + ty * self->m_matrix[1][0] + tz * self->m_matrix[2][0]; + self->m_matrix[3][1] += tx * self->m_matrix[0][1] + ty * self->m_matrix[1][1] + tz * self->m_matrix[2][1]; + self->m_matrix[3][2] += tx * self->m_matrix[0][2] + ty * self->m_matrix[1][2] + tz * self->m_matrix[2][2]; + self->m_matrix[3][3] += tx * self->m_matrix[0][3] + ty * self->m_matrix[1][3] + tz * self->m_matrix[2][3]; + return *self; +} + +WebCore::TransformationMatrix& APS5_VABI _ZN7WebCore20TransformationMatrix15scaleNonUniformEdd( + WebCore::TransformationMatrix* self, double sx, double sy) { + self->m_matrix[0][0] *= sx; + self->m_matrix[0][1] *= sx; + self->m_matrix[0][2] *= sx; + self->m_matrix[0][3] *= sx; + + self->m_matrix[1][0] *= sy; + self->m_matrix[1][1] *= sy; + self->m_matrix[1][2] *= sy; + self->m_matrix[1][3] *= sy; + return *self; +} + +WebCore::TransformationMatrix& APS5_VABI _ZN7WebCore20TransformationMatrix4skewEdd( + WebCore::TransformationMatrix* self, double sx, double sy) { + double radX = WebCore::Deg2Rad(sx); + double radY = WebCore::Deg2Rad(sy); + WebCore::TransformationMatrix mat; + mat.m_matrix[0][1] = std::tan(radY); + mat.m_matrix[1][0] = std::tan(radX); + return _ZN7WebCore20TransformationMatrix8multiplyERKS0_(self, mat); +} + +WebCore::TransformationMatrix& APS5_VABI _ZN7WebCore20TransformationMatrix5flipXEv(WebCore::TransformationMatrix* self) { + return _ZN7WebCore20TransformationMatrix15scaleNonUniformEdd(self, -1.0, 1.0); +} + +WebCore::TransformationMatrix& APS5_VABI _ZN7WebCore20TransformationMatrix5flipYEv(WebCore::TransformationMatrix* self) { + return _ZN7WebCore20TransformationMatrix15scaleNonUniformEdd(self, 1.0, -1.0); +} + +WebCore::TransformationMatrix& APS5_VABI _ZN7WebCore20TransformationMatrix5scaleEd( + WebCore::TransformationMatrix* self, double s) { + return _ZN7WebCore20TransformationMatrix15scaleNonUniformEdd(self, s, s); +} + +WebCore::TransformationMatrix& APS5_VABI _ZN7WebCore20TransformationMatrix6rotateEd( + WebCore::TransformationMatrix* self, double a) { + return _ZN7WebCore20TransformationMatrix8rotate3dEddd(self, 0.0, 0.0, a); +} + +WebCore::TransformationMatrix& APS5_VABI _ZN7WebCore20TransformationMatrix8multiplyERKS0_( + WebCore::TransformationMatrix* self, const WebCore::TransformationMatrix& mat) { + double result[4][4]; + for (int i = 0; i < 4; ++i) { + for (int j = 0; j < 4; ++j) { + result[i][j] = mat.m_matrix[i][0] * self->m_matrix[0][j] + + mat.m_matrix[i][1] * self->m_matrix[1][j] + + mat.m_matrix[i][2] * self->m_matrix[2][j] + + mat.m_matrix[i][3] * self->m_matrix[3][j]; + } + } + for (int i = 0; i < 4; ++i) { + for (int j = 0; j < 4; ++j) { + self->m_matrix[i][j] = result[i][j]; + } + } + return *self; +} + +WebCore::TransformationMatrix& APS5_VABI _ZN7WebCore20TransformationMatrix8rotate3dEddd( + WebCore::TransformationMatrix* self, double rx, double ry, double rz) { + double radX = WebCore::Deg2Rad(rx); + double radY = WebCore::Deg2Rad(ry); + double radZ = WebCore::Deg2Rad(rz); + + WebCore::TransformationMatrix rmat; + double sinTheta = std::sin(radZ); + double cosTheta = std::cos(radZ); + rmat.m_matrix[0][0] = cosTheta; + rmat.m_matrix[0][1] = sinTheta; + rmat.m_matrix[1][0] = -sinTheta; + rmat.m_matrix[1][1] = cosTheta; + + WebCore::TransformationMatrix matY; + sinTheta = std::sin(radY); + cosTheta = std::cos(radY); + matY.m_matrix[0][0] = cosTheta; + matY.m_matrix[0][2] = -sinTheta; + matY.m_matrix[2][0] = sinTheta; + matY.m_matrix[2][2] = cosTheta; + _ZN7WebCore20TransformationMatrix8multiplyERKS0_(&rmat, matY); + + WebCore::TransformationMatrix matX; + sinTheta = std::sin(radX); + cosTheta = std::cos(radX); + matX.m_matrix[1][1] = cosTheta; + matX.m_matrix[1][2] = sinTheta; + matX.m_matrix[2][1] = -sinTheta; + matX.m_matrix[2][2] = cosTheta; + _ZN7WebCore20TransformationMatrix8multiplyERKS0_(&rmat, matX); + + return _ZN7WebCore20TransformationMatrix8multiplyERKS0_(self, rmat); +} + +WebCore::TransformationMatrix& APS5_VABI _ZN7WebCore20TransformationMatrix9translateEdd( + WebCore::TransformationMatrix* self, double tx, double ty) { + return _ZN7WebCore20TransformationMatrix11translate3dEddd(self, tx, ty, 0.0); +} + +void APS5_VABI _ZN7WebCore20TransformationMatrixC1ERKNS_15AffineTransformE( + WebCore::TransformationMatrix* self, const WebCore::AffineTransform& t) { + self->m_matrix[0][0] = t.m_transform[0]; + self->m_matrix[0][1] = t.m_transform[1]; + self->m_matrix[0][2] = 0.0; + self->m_matrix[0][3] = 0.0; + self->m_matrix[1][0] = t.m_transform[2]; + self->m_matrix[1][1] = t.m_transform[3]; + self->m_matrix[1][2] = 0.0; + self->m_matrix[1][3] = 0.0; + self->m_matrix[2][0] = 0.0; + self->m_matrix[2][1] = 0.0; + self->m_matrix[2][2] = 1.0; + self->m_matrix[2][3] = 0.0; + self->m_matrix[3][0] = t.m_transform[4]; + self->m_matrix[3][1] = t.m_transform[5]; + self->m_matrix[3][2] = 0.0; + self->m_matrix[3][3] = 1.0; +} + +void APS5_VABI _ZN7WebCore20TransformationMatrixC2ERKNS_15AffineTransformE( + WebCore::TransformationMatrix* self, const WebCore::AffineTransform& t) { + _ZN7WebCore20TransformationMatrixC1ERKNS_15AffineTransformE(self, t); +} + +bool APS5_VABI _ZNK7WebCore20TransformationMatrix12isInvertibleEv(const WebCore::TransformationMatrix* self) { + auto type = WebCore::GetMatrixType(*self); + if (type == WebCore::MatrixType::IdentityOrTranslation) { + return true; + } + double det = (type == WebCore::MatrixType::Affine) + ? (self->m_matrix[0][0] * self->m_matrix[1][1] - self->m_matrix[0][1] * self->m_matrix[1][0]) + : WebCore::Determinant4x4(self->m_matrix); + return std::abs(det) >= WebCore::kSmallNumber; +} + +WebCore::AffineTransform APS5_VABI _ZNK7WebCore20TransformationMatrix17toAffineTransformEv( + const WebCore::TransformationMatrix* self) { + WebCore::AffineTransform result; + result.m_transform[0] = self->m_matrix[0][0]; + result.m_transform[1] = self->m_matrix[0][1]; + result.m_transform[2] = self->m_matrix[1][0]; + result.m_transform[3] = self->m_matrix[1][1]; + result.m_transform[4] = self->m_matrix[3][0]; + result.m_transform[5] = self->m_matrix[3][1]; + return result; +} + +WebCore::FloatQuad APS5_VABI _ZNK7WebCore20TransformationMatrix7mapQuadERKNS_9FloatQuadE( + const WebCore::TransformationMatrix* self, const WebCore::FloatQuad& q) { + if (WebCore::GetMatrixType(*self) == WebCore::MatrixType::IdentityOrTranslation) { + float tx = static_cast(self->m_matrix[3][0]); + float ty = static_cast(self->m_matrix[3][1]); + return WebCore::FloatQuad{ + WebCore::FloatPoint{q.m_p1.m_x + tx, q.m_p1.m_y + ty}, + WebCore::FloatPoint{q.m_p2.m_x + tx, q.m_p2.m_y + ty}, + WebCore::FloatPoint{q.m_p3.m_x + tx, q.m_p3.m_y + ty}, + WebCore::FloatPoint{q.m_p4.m_x + tx, q.m_p4.m_y + ty} + }; + } + return WebCore::FloatQuad{ + WebCore::InternalMapPoint(*self, q.m_p1), + WebCore::InternalMapPoint(*self, q.m_p2), + WebCore::InternalMapPoint(*self, q.m_p3), + WebCore::InternalMapPoint(*self, q.m_p4) + }; +} + +WebCore::IntRect APS5_VABI _ZNK7WebCore20TransformationMatrix7mapRectERKNS_7IntRectE( + const WebCore::TransformationMatrix* self, const WebCore::IntRect& r) { + WebCore::FloatRect fr{ + WebCore::FloatPoint{static_cast(r.m_location.m_x), static_cast(r.m_location.m_y)}, + WebCore::FloatSize{static_cast(r.m_size.m_width), static_cast(r.m_size.m_height)} + }; + WebCore::FloatRect mapped = _ZNK7WebCore20TransformationMatrix7mapRectERKNS_9FloatRectE(self, fr); + return WebCore::EnclosingIntRect(mapped); +} + +WebCore::FloatRect APS5_VABI _ZNK7WebCore20TransformationMatrix7mapRectERKNS_9FloatRectE( + const WebCore::TransformationMatrix* self, const WebCore::FloatRect& r) { + auto type = WebCore::GetMatrixType(*self); + if (type == WebCore::MatrixType::IdentityOrTranslation) { + return WebCore::FloatRect{ + WebCore::FloatPoint{r.m_location.m_x + static_cast(self->m_matrix[3][0]), + r.m_location.m_y + static_cast(self->m_matrix[3][1])}, + r.m_size + }; + } + + float minX = r.m_location.m_x; + float minY = r.m_location.m_y; + float maxX = r.m_location.m_x + r.m_size.m_width; + float maxY = r.m_location.m_y + r.m_size.m_height; + + if (type == WebCore::MatrixType::Affine) { + double a = self->m_matrix[0][0]; + double b = self->m_matrix[0][1]; + double c = self->m_matrix[1][0]; + double d = self->m_matrix[1][1]; + + double minResultX = (a > 0.0) ? (a * minX) : (a * maxX); + double maxResultX = (a > 0.0) ? (a * maxX) : (a * minX); + double minResultY = (b > 0.0) ? (b * minX) : (b * maxX); + double maxResultY = (b > 0.0) ? (b * maxX) : (b * minX); + + if (c > 0.0) { + maxResultX += c * maxY; + minResultX += c * minY; + } else { + maxResultX += c * minY; + minResultX += c * maxY; + } + + if (d > 0.0) { + maxResultY += d * maxY; + minResultY += d * minY; + } else { + maxResultY += d * minY; + minResultY += d * maxY; + } + + return WebCore::FloatRect{ + WebCore::FloatPoint{static_cast(minResultX + self->m_matrix[3][0]), + static_cast(minResultY + self->m_matrix[3][1])}, + WebCore::FloatSize{static_cast(maxResultX - minResultX), + static_cast(maxResultY - minResultY)} + }; + } + + WebCore::FloatPoint p1 = WebCore::InternalMapPoint(*self, WebCore::FloatPoint{minX, minY}); + WebCore::FloatPoint p2 = WebCore::InternalMapPoint(*self, WebCore::FloatPoint{maxX, minY}); + WebCore::FloatPoint p3 = WebCore::InternalMapPoint(*self, WebCore::FloatPoint{maxX, maxY}); + WebCore::FloatPoint p4 = WebCore::InternalMapPoint(*self, WebCore::FloatPoint{minX, maxY}); + float left = std::min({p1.m_x, p2.m_x, p3.m_x, p4.m_x}); + float top = std::min({p1.m_y, p2.m_y, p3.m_y, p4.m_y}); + float right = std::max({p1.m_x, p2.m_x, p3.m_x, p4.m_x}); + float bottom = std::max({p1.m_y, p2.m_y, p3.m_y, p4.m_y}); + return WebCore::FloatRect{WebCore::FloatPoint{left, top}, WebCore::FloatSize{right - left, bottom - top}}; +} + +WebCore::FloatPoint APS5_VABI _ZNK7WebCore20TransformationMatrix8mapPointERKNS_10FloatPointE( + const WebCore::TransformationMatrix* self, const WebCore::FloatPoint& p) { + if (WebCore::GetMatrixType(*self) == WebCore::MatrixType::IdentityOrTranslation) { + return WebCore::FloatPoint{ + p.m_x + static_cast(self->m_matrix[3][0]), + p.m_y + static_cast(self->m_matrix[3][1]) + }; + } + return WebCore::InternalMapPoint(*self, p); +} + +WebCore::TransformationMatrix APS5_VABI _ZNK7WebCore24MatrixTransformOperation6matrixEv( + const WebCore::MatrixTransformOperation* self) { + WebCore::TransformationMatrix result; + result.m_matrix[0][0] = self->m_a; + result.m_matrix[0][1] = self->m_b; + result.m_matrix[0][2] = 0.0; + result.m_matrix[0][3] = 0.0; + result.m_matrix[1][0] = self->m_c; + result.m_matrix[1][1] = self->m_d; + result.m_matrix[1][2] = 0.0; + result.m_matrix[1][3] = 0.0; + result.m_matrix[2][0] = 0.0; + result.m_matrix[2][1] = 0.0; + result.m_matrix[2][2] = 1.0; + result.m_matrix[2][3] = 0.0; + result.m_matrix[3][0] = self->m_e; + result.m_matrix[3][1] = self->m_f; + result.m_matrix[3][2] = 0.0; + result.m_matrix[3][3] = 1.0; + return result; +} + +} diff --git a/core/libs/prx/libSceNKWebKit/src/WebCoreTypes.hpp b/core/libs/prx/libSceNKWebKit/src/WebCoreTypes.hpp new file mode 100644 index 0000000000..05c4193369 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/WebCoreTypes.hpp @@ -0,0 +1,156 @@ +#pragma once + +#include +#include +#include + +namespace WebCore { + +struct IntPoint { + int m_x{0}; + int m_y{0}; +}; + +struct IntSize { + int m_width{0}; + int m_height{0}; +}; + +struct IntRect { + IntPoint m_location; + IntSize m_size; +}; + +struct FloatPoint { + float m_x{0.0f}; + float m_y{0.0f}; +}; + +struct FloatSize { + float m_width{0.0f}; + float m_height{0.0f}; + + float aspectRatio() const { + return m_height != 0.0f ? (m_width / m_height) : 0.0f; + } +}; + +struct FloatRect { + FloatPoint m_location; + FloatSize m_size; + + float x() const { return m_location.m_x; } + float y() const { return m_location.m_y; } + float width() const { return m_size.m_width; } + float height() const { return m_size.m_height; } + FloatSize size() const { return m_size; } + + void inflateX(float dx) { + m_location.m_x -= dx; + m_size.m_width += dx + dx; + } + + void inflateY(float dy) { + m_location.m_y -= dy; + m_size.m_height += dy + dy; + } +}; + +struct FloatQuad { + FloatPoint m_p1; + FloatPoint m_p2; + FloatPoint m_p3; + FloatPoint m_p4; +}; + +struct FloatRoundedRect { + struct Radii { + FloatSize m_topLeft; + FloatSize m_topRight; + FloatSize m_bottomLeft; + FloatSize m_bottomRight; + }; + FloatRect m_rect; + Radii m_radii; +}; + +struct LayoutUnit { + int m_value{0}; +}; + +struct LayoutPoint { + LayoutUnit m_x; + LayoutUnit m_y; +}; + +struct LayoutSize { + LayoutUnit m_width; + LayoutUnit m_height; +}; + +struct LayoutRect { + LayoutPoint m_location; + LayoutSize m_size; +}; + +struct RoundedRect { + struct Radii { + LayoutSize m_topLeft; + LayoutSize m_topRight; + LayoutSize m_bottomLeft; + LayoutSize m_bottomRight; + }; + LayoutRect m_rect; + Radii m_radii; +}; + +struct AffineTransform { + std::array m_transform{1.0, 0.0, 0.0, 1.0, 0.0, 0.0}; +}; + +struct alignas(16) TransformationMatrix { + double m_matrix[4][4]{ + {1.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 1.0} + }; +}; + +struct MatrixTransformOperation { + void* m_vptr; + std::uint32_t m_refCount; + std::uint8_t m_type; + std::uint8_t m_pad[3]; + double m_a; + double m_b; + double m_c; + double m_d; + double m_e; + double m_f; +}; + +struct Color { + std::uint64_t m_colorAndFlags{0}; +}; + +static_assert(sizeof(IntPoint) == 8); +static_assert(sizeof(IntSize) == 8); +static_assert(sizeof(IntRect) == 16); +static_assert(sizeof(FloatPoint) == 8); +static_assert(sizeof(FloatSize) == 8); +static_assert(sizeof(FloatRect) == 16); +static_assert(sizeof(FloatQuad) == 32); +static_assert(sizeof(FloatRoundedRect) == 48); +static_assert(sizeof(LayoutUnit) == 4); +static_assert(sizeof(LayoutPoint) == 8); +static_assert(sizeof(LayoutSize) == 8); +static_assert(sizeof(LayoutRect) == 16); +static_assert(sizeof(RoundedRect) == 48); +static_assert(sizeof(AffineTransform) == 48); +static_assert(sizeof(TransformationMatrix) == 128); +static_assert(sizeof(MatrixTransformOperation) == 64); +static_assert(offsetof(MatrixTransformOperation, m_a) == 16); +static_assert(sizeof(Color) == 8); + +} // namespace WebCore diff --git a/core/libs/prx/libSceNKWebKit/src/WebsiteDataStoreConfiguration.cpp b/core/libs/prx/libSceNKWebKit/src/WebsiteDataStoreConfiguration.cpp new file mode 100644 index 0000000000..4daa6e0f6e --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/WebsiteDataStoreConfiguration.cpp @@ -0,0 +1,131 @@ +#include "prx/libSceNKWebKit/src/Configuration.hpp" +#include "prx/libSceNKWebKit/include/WebKitConfigExports.hpp" + +extern "C" { +const void* APS5_VABI WKWebsiteDataStoreConfigurationCreate() { + return NKWebKit::ToRef(NKWebKit::Make()); +} + +const void* APS5_VABI WKWebsiteDataStoreConfigurationCopyApplicationCacheDirectory(const void* configuration) { + return NKWebKit::ToCopiedStringRef(NKWebKit::Cast(configuration, __func__)->applicationCacheDirectory); +} + +void APS5_VABI WKWebsiteDataStoreConfigurationSetApplicationCacheDirectory(const void* configuration, const void* directory) { + NKWebKit::Cast(configuration, __func__)->applicationCacheDirectory = + NKWebKit::OptionalString(directory, __func__); +} + +const void* APS5_VABI WKWebsiteDataStoreConfigurationCopyNetworkCacheDirectory(const void* configuration) { + return NKWebKit::ToCopiedStringRef(NKWebKit::Cast(configuration, __func__)->networkCacheDirectory); +} + +void APS5_VABI WKWebsiteDataStoreConfigurationSetNetworkCacheDirectory(const void* configuration, const void* directory) { + NKWebKit::Cast(configuration, __func__)->networkCacheDirectory = + NKWebKit::OptionalString(directory, __func__); +} + +const void* APS5_VABI WKWebsiteDataStoreConfigurationCopyIndexedDBDatabaseDirectory(const void* configuration) { + return NKWebKit::ToCopiedStringRef(NKWebKit::Cast(configuration, __func__)->indexedDBDatabaseDirectory); +} + +void APS5_VABI WKWebsiteDataStoreConfigurationSetIndexedDBDatabaseDirectory(const void* configuration, const void* directory) { + NKWebKit::Cast(configuration, __func__)->indexedDBDatabaseDirectory = + NKWebKit::OptionalString(directory, __func__); +} + +const void* APS5_VABI WKWebsiteDataStoreConfigurationCopyLocalStorageDirectory(const void* configuration) { + return NKWebKit::ToCopiedStringRef(NKWebKit::Cast(configuration, __func__)->localStorageDirectory); +} + +void APS5_VABI WKWebsiteDataStoreConfigurationSetLocalStorageDirectory(const void* configuration, const void* directory) { + NKWebKit::Cast(configuration, __func__)->localStorageDirectory = + NKWebKit::OptionalString(directory, __func__); +} + +const void* APS5_VABI WKWebsiteDataStoreConfigurationCopyWebSQLDatabaseDirectory(const void* configuration) { + return NKWebKit::ToCopiedStringRef(NKWebKit::Cast(configuration, __func__)->webSQLDatabaseDirectory); +} + +void APS5_VABI WKWebsiteDataStoreConfigurationSetWebSQLDatabaseDirectory(const void* configuration, const void* directory) { + NKWebKit::Cast(configuration, __func__)->webSQLDatabaseDirectory = + NKWebKit::OptionalString(directory, __func__); +} + +const void* APS5_VABI WKWebsiteDataStoreConfigurationCopyCacheStorageDirectory(const void* configuration) { + return NKWebKit::ToCopiedStringRef(NKWebKit::Cast(configuration, __func__)->cacheStorageDirectory); +} + +void APS5_VABI WKWebsiteDataStoreConfigurationSetCacheStorageDirectory(const void* configuration, const void* directory) { + NKWebKit::Cast(configuration, __func__)->cacheStorageDirectory = + NKWebKit::OptionalString(directory, __func__); +} + +const void* APS5_VABI WKWebsiteDataStoreConfigurationCopyMediaKeysStorageDirectory(const void* configuration) { + return NKWebKit::ToCopiedStringRef(NKWebKit::Cast(configuration, __func__)->mediaKeysStorageDirectory); +} + +void APS5_VABI WKWebsiteDataStoreConfigurationSetMediaKeysStorageDirectory(const void* configuration, const void* directory) { + NKWebKit::Cast(configuration, __func__)->mediaKeysStorageDirectory = + NKWebKit::OptionalString(directory, __func__); +} + +const void* APS5_VABI WKWebsiteDataStoreConfigurationCopyResourceLoadStatisticsDirectory(const void* configuration) { + return NKWebKit::ToCopiedStringRef(NKWebKit::Cast(configuration, __func__)->resourceLoadStatisticsDirectory); +} + +void APS5_VABI WKWebsiteDataStoreConfigurationSetResourceLoadStatisticsDirectory(const void* configuration, const void* directory) { + NKWebKit::Cast(configuration, __func__)->resourceLoadStatisticsDirectory = + NKWebKit::OptionalString(directory, __func__); +} + +const void* APS5_VABI WKWebsiteDataStoreConfigurationCopyServiceWorkerRegistrationDirectory(const void* configuration) { + return NKWebKit::ToCopiedStringRef(NKWebKit::Cast(configuration, __func__)->serviceWorkerRegistrationDirectory); +} + +void APS5_VABI WKWebsiteDataStoreConfigurationSetServiceWorkerRegistrationDirectory(const void* configuration, const void* directory) { + NKWebKit::Cast(configuration, __func__)->serviceWorkerRegistrationDirectory = + NKWebKit::OptionalString(directory, __func__); +} + +const void* APS5_VABI WKWebsiteDataStoreConfigurationCopyCookieStorageFile(const void* configuration) { + return NKWebKit::ToCopiedStringRef(NKWebKit::Cast(configuration, __func__)->cookieStorageFile); +} + +void APS5_VABI WKWebsiteDataStoreConfigurationSetCookieStorageFile(const void* configuration, const void* cookieStorageFile) { + NKWebKit::Cast(configuration, __func__)->cookieStorageFile = + NKWebKit::OptionalString(cookieStorageFile, __func__); +} + +std::uint64_t APS5_VABI WKWebsiteDataStoreConfigurationGetPerOriginStorageQuota(const void* configuration) { + return NKWebKit::Cast(configuration, __func__)->perOriginStorageQuota; +} + +void APS5_VABI WKWebsiteDataStoreConfigurationSetPerOriginStorageQuota(const void* configuration, std::uint64_t quota) { + NKWebKit::Cast(configuration, __func__)->perOriginStorageQuota = quota; +} + +bool APS5_VABI WKWebsiteDataStoreConfigurationGetNetworkCacheSpeculativeValidationEnabled(const void* configuration) { + return NKWebKit::Cast(configuration, __func__)->networkCacheSpeculativeValidationEnabled; +} + +void APS5_VABI WKWebsiteDataStoreConfigurationSetNetworkCacheSpeculativeValidationEnabled(const void* configuration, bool enabled) { + NKWebKit::Cast(configuration, __func__)->networkCacheSpeculativeValidationEnabled = enabled; +} + +bool APS5_VABI WKWebsiteDataStoreConfigurationGetTestingSessionEnabled(const void* configuration) { + return NKWebKit::Cast(configuration, __func__)->testingSessionEnabled; +} + +void APS5_VABI WKWebsiteDataStoreConfigurationSetTestingSessionEnabled(const void* configuration, bool enabled) { + NKWebKit::Cast(configuration, __func__)->testingSessionEnabled = enabled; +} + +bool APS5_VABI WKWebsiteDataStoreConfigurationGetStaleWhileRevalidateEnabled(const void* configuration) { + return NKWebKit::Cast(configuration, __func__)->staleWhileRevalidateEnabled; +} + +void APS5_VABI WKWebsiteDataStoreConfigurationSetStaleWhileRevalidateEnabled(const void* configuration, bool enabled) { + NKWebKit::Cast(configuration, __func__)->staleWhileRevalidateEnabled = enabled; +} + +} diff --git a/core/libs/prx/libSceNKWebKit/src/WebsitePolicies.cpp b/core/libs/prx/libSceNKWebKit/src/WebsitePolicies.cpp new file mode 100644 index 0000000000..132273a9fe --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/WebsitePolicies.cpp @@ -0,0 +1,62 @@ +#include "prx/libSceNKWebKit/src/Configuration.hpp" +#include "prx/libSceNKWebKit/include/WebKitConfigExports.hpp" + +extern "C" { +const void* APS5_VABI WKWebsitePoliciesCreate() { + return NKWebKit::ToRef(NKWebKit::Make()); +} + +bool APS5_VABI WKWebsitePoliciesGetContentBlockersEnabled(const void* websitePolicies) { + return NKWebKit::Cast(websitePolicies, __func__)->contentBlockersEnabled; +} + +void APS5_VABI WKWebsitePoliciesSetContentBlockersEnabled(const void* websitePolicies, bool enabled) { + NKWebKit::Cast(websitePolicies, __func__)->contentBlockersEnabled = enabled; +} + +const void* APS5_VABI WKWebsitePoliciesCopyCustomHeaderFields(const void* websitePolicies) { + NKWebKit::Cast(websitePolicies, __func__); + return nullptr; +} + +void APS5_VABI WKWebsitePoliciesSetCustomHeaderFields(const void* websitePolicies, const void* customHeaderFields) { + NKWebKit::Cast(websitePolicies, __func__); + (void)customHeaderFields; +} + +std::uint32_t APS5_VABI WKWebsitePoliciesGetAllowedAutoplayQuirks(const void* websitePolicies) { + return NKWebKit::Cast(websitePolicies, __func__)->allowedAutoplayQuirks; +} + +void APS5_VABI WKWebsitePoliciesSetAllowedAutoplayQuirks(const void* websitePolicies, std::uint32_t allowedQuirks) { + NKWebKit::Cast(websitePolicies, __func__)->allowedAutoplayQuirks = allowedQuirks; +} + +std::uint32_t APS5_VABI WKWebsitePoliciesGetAutoplayPolicy(const void* websitePolicies) { + return NKWebKit::Cast(websitePolicies, __func__)->autoplayPolicy; +} + +void APS5_VABI WKWebsitePoliciesSetAutoplayPolicy(const void* websitePolicies, std::uint32_t policy) { + NKWebKit::Cast(websitePolicies, __func__)->autoplayPolicy = policy; +} + +std::uint32_t APS5_VABI WKWebsitePoliciesGetPopUpPolicy(const void* websitePolicies) { + return NKWebKit::Cast(websitePolicies, __func__)->popUpPolicy; +} + +void APS5_VABI WKWebsitePoliciesSetPopUpPolicy(const void* websitePolicies, std::uint32_t policy) { + NKWebKit::Cast(websitePolicies, __func__)->popUpPolicy = policy; +} + +const void* APS5_VABI WKWebsitePoliciesGetDataStore(const void* websitePolicies) { + const auto* policies = NKWebKit::Cast(websitePolicies, __func__); + return static_cast(policies->websiteDataStore.Get()); +} + +void APS5_VABI WKWebsitePoliciesSetDataStore(const void* websitePolicies, const void* websiteDataStore) { + auto* policies = NKWebKit::Cast(websitePolicies, __func__); + policies->websiteDataStore = NKWebKit::Retained::Share( + NKWebKit::CastOrNull(websiteDataStore, __func__)); +} + +} diff --git a/core/libs/prx/libSceNKWebKit/src/WtfAssert.cpp b/core/libs/prx/libSceNKWebKit/src/WtfAssert.cpp new file mode 100644 index 0000000000..2eda5c91bc --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/WtfAssert.cpp @@ -0,0 +1,350 @@ +#include "prx/libc/include/general/VabiMacros.hpp" +#include "prx/libSceNKWebKit/include/WtfExports.hpp" +#include "prx/libc/include/WindowsFormatting.hpp" + +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 +#include +#define StrCaseCmp _stricmp +#else +#define StrCaseCmp strcasecmp +#endif + +struct WTFLogChannel { + std::uint8_t state; + const char* name; + std::uint8_t level; + const char* subsystem; +}; + +extern "C" { +[[noreturn]] void APS5_VABI WTFCrash() { + std::fprintf(stderr, "WTFCrash\n"); + std::abort(); +} + +[[noreturn]] void APS5_VABI WTFCrashWithSecurityImplication() { + std::fprintf(stderr, "WTFCrashWithSecurityImplication\n"); + std::abort(); +} + +[[noreturn]] void APS5_VABI WTFLogAlwaysAndCrash(const char* format, ...) { + if (format) { +#ifdef _WIN32 + __builtin_sysv_va_list args; + __builtin_sysv_va_start(args, format); + LibcDetail::PrintWindows(format, args); + __builtin_sysv_va_end(args); +#else + std::va_list args; + va_start(args, format); + std::vfprintf(stderr, format, args); + va_end(args); +#endif + std::fprintf(stderr, "\n"); + } + std::abort(); +} + +[[noreturn]] void APS5_VABI _Z20WTFCrashWithInfoImpliPKcS0_im(int line, const char* file, const char* function, int counter, std::uint64_t reason) { + std::fprintf(stderr, "CRASH WITH INFO: %s:%d %s counter=%d reason=%llu\n", file ? file : "", line, function ? function : "", counter, static_cast(reason)); + std::abort(); +} + +[[noreturn]] void APS5_VABI _Z20WTFCrashWithInfoImpliPKcS0_imm(int line, const char* file, const char* function, int counter, std::uint64_t reason, std::uint64_t misc1) { + std::fprintf(stderr, "CRASH WITH INFO: %s:%d %s counter=%d reason=%llu misc1=%llu\n", file ? file : "", line, function ? function : "", counter, static_cast(reason), static_cast(misc1)); + std::abort(); +} + +[[noreturn]] void APS5_VABI _Z20WTFCrashWithInfoImpliPKcS0_immm(int line, const char* file, const char* function, int counter, std::uint64_t reason, std::uint64_t misc1, std::uint64_t misc2) { + std::fprintf(stderr, "CRASH WITH INFO: %s:%d %s counter=%d reason=%llu\n", file ? file : "", line, function ? function : "", counter, static_cast(reason)); + std::abort(); +} + +[[noreturn]] void APS5_VABI _Z20WTFCrashWithInfoImpliPKcS0_immmm(int line, const char* file, const char* function, int counter, std::uint64_t reason, std::uint64_t misc1, std::uint64_t misc2, std::uint64_t misc3) { + std::fprintf(stderr, "CRASH WITH INFO: %s:%d %s counter=%d reason=%llu\n", file ? file : "", line, function ? function : "", counter, static_cast(reason)); + std::abort(); +} + +[[noreturn]] void APS5_VABI _Z20WTFCrashWithInfoImpliPKcS0_immmmm(int line, const char* file, const char* function, int counter, std::uint64_t reason, std::uint64_t misc1, std::uint64_t misc2, std::uint64_t misc3, std::uint64_t misc4) { + std::fprintf(stderr, "CRASH WITH INFO: %s:%d %s counter=%d reason=%llu\n", file ? file : "", line, function ? function : "", counter, static_cast(reason)); + std::abort(); +} + +[[noreturn]] void APS5_VABI _Z20WTFCrashWithInfoImpliPKcS0_immmmmm(int line, const char* file, const char* function, int counter, std::uint64_t reason, std::uint64_t misc1, std::uint64_t misc2, std::uint64_t misc3, std::uint64_t misc4, std::uint64_t misc5) { + std::fprintf(stderr, "CRASH WITH INFO: %s:%d %s counter=%d reason=%llu\n", file ? file : "", line, function ? function : "", counter, static_cast(reason)); + std::abort(); +} + +[[noreturn]] void APS5_VABI _Z20WTFCrashWithInfoImpliPKcS0_immmmmmm(int line, const char* file, const char* function, int counter, std::uint64_t reason, std::uint64_t misc1, std::uint64_t misc2, std::uint64_t misc3, std::uint64_t misc4, std::uint64_t misc5, std::uint64_t misc6) { + std::fprintf(stderr, "CRASH WITH INFO: %s:%d %s counter=%d reason=%llu\n", file ? file : "", line, function ? function : "", counter, static_cast(reason)); + std::abort(); +} + +void APS5_VABI WTFReportAssertionFailure(const char* file, int line, const char* function, const char* assertion) { + if (assertion) { + std::fprintf(stderr, "ASSERTION FAILED: %s\n", assertion); + } else { + std::fprintf(stderr, "SHOULD NEVER BE REACHED\n"); + } + std::fprintf(stderr, "(%s:%d %s)\n", file ? file : "", line, function ? function : ""); +} + +void APS5_VABI WTFReportAssertionFailureWithMessage(const char* file, int line, const char* function, const char* assertion, const char* format, ...) { + std::fprintf(stderr, "ASSERTION FAILED: "); + if (format) { +#ifdef _WIN32 + __builtin_sysv_va_list args; + __builtin_sysv_va_start(args, format); + LibcDetail::PrintWindows(format, args); + __builtin_sysv_va_end(args); +#else + std::va_list args; + va_start(args, format); + std::vfprintf(stderr, format, args); + va_end(args); +#endif + } + std::fprintf(stderr, "\n%s\n(%s:%d %s)\n", assertion ? assertion : "", file ? file : "", line, function ? function : ""); +} + +void APS5_VABI WTFReportArgumentAssertionFailure(const char* file, int line, const char* function, const char* argName, const char* assertion) { + std::fprintf(stderr, "ARGUMENT BAD: %s, %s\n(%s:%d %s)\n", argName ? argName : "", assertion ? assertion : "", file ? file : "", line, function ? function : ""); +} + +void APS5_VABI WTFReportFatalError(const char* file, int line, const char* function, const char* format, ...) { + std::fprintf(stderr, "FATAL ERROR: "); + if (format) { +#ifdef _WIN32 + __builtin_sysv_va_list args; + __builtin_sysv_va_start(args, format); + LibcDetail::PrintWindows(format, args); + __builtin_sysv_va_end(args); +#else + std::va_list args; + va_start(args, format); + std::vfprintf(stderr, format, args); + va_end(args); +#endif + } + std::fprintf(stderr, "\n(%s:%d %s)\n", file ? file : "", line, function ? function : ""); +} + +void APS5_VABI WTFReportError(const char* file, int line, const char* function, const char* format, ...) { + std::fprintf(stderr, "ERROR: "); + if (format) { +#ifdef _WIN32 + __builtin_sysv_va_list args; + __builtin_sysv_va_start(args, format); + LibcDetail::PrintWindows(format, args); + __builtin_sysv_va_end(args); +#else + std::va_list args; + va_start(args, format); + std::vfprintf(stderr, format, args); + va_end(args); +#endif + } + std::fprintf(stderr, "\n(%s:%d %s)\n", file ? file : "", line, function ? function : ""); +} + +void APS5_VABI WTFReportNotImplementedYet(const char* file, int line, const char* function) { + std::fprintf(stderr, "NOT IMPLEMENTED YET\n(%s:%d %s)\n", file ? file : "", line, function ? function : ""); +} + +void APS5_VABI WTFLogAlways(const char* format, ...) { + if (!format) { + return; + } +#ifdef _WIN32 + __builtin_sysv_va_list args; + __builtin_sysv_va_start(args, format); + LibcDetail::PrintWindows(format, args); + __builtin_sysv_va_end(args); +#else + std::va_list args; + va_start(args, format); + std::vfprintf(stderr, format, args); + va_end(args); +#endif + std::fprintf(stderr, "\n"); +} + +void APS5_VABI WTFLog(void* channel, const char* format, ...) { + if (!channel || !format) { + return; + } + const auto* ch = static_cast(channel); + if (ch->state == 0) { + return; + } +#ifdef _WIN32 + __builtin_sysv_va_list args; + __builtin_sysv_va_start(args, format); + LibcDetail::PrintWindows(format, args); + __builtin_sysv_va_end(args); +#else + std::va_list args; + va_start(args, format); + std::vfprintf(stderr, format, args); + va_end(args); +#endif + std::fprintf(stderr, "\n"); +} + +void APS5_VABI WTFLogVerbose(const char* file, int line, const char* function, void* channel, const char* format, ...) { + if (!channel || !format) { + return; + } + const auto* ch = static_cast(channel); + if (ch->state == 0) { + return; + } +#ifdef _WIN32 + __builtin_sysv_va_list args; + __builtin_sysv_va_start(args, format); + LibcDetail::PrintWindows(format, args); + __builtin_sysv_va_end(args); +#else + std::va_list args; + va_start(args, format); + std::vfprintf(stderr, format, args); + va_end(args); +#endif + std::fprintf(stderr, "\n(%s:%d %s)\n", file ? file : "", line, function ? function : ""); +} + +void APS5_VABI WTFLogWithLevel(void* channel, std::uint32_t level, const char* format, ...) { + if (!channel || !format) { + return; + } + const auto* ch = static_cast(channel); + if (ch->state == 0 || ch->level < level) { + return; + } +#ifdef _WIN32 + __builtin_sysv_va_list args; + __builtin_sysv_va_start(args, format); + LibcDetail::PrintWindows(format, args); + __builtin_sysv_va_end(args); +#else + std::va_list args; + va_start(args, format); + std::vfprintf(stderr, format, args); + va_end(args); +#endif + std::fprintf(stderr, "\n"); +} + +void APS5_VABI WTFSetLogChannelLevel(void* channel, std::uint32_t level) { + if (channel) { + auto* ch = static_cast(channel); + ch->level = static_cast(level); + } +} + +bool APS5_VABI WTFWillLogWithLevel(void* channel, std::uint32_t level) { + if (!channel) { + return false; + } + const auto* ch = static_cast(channel); + return ch->state != 0 && ch->level >= level; +} + +void* APS5_VABI WTFLogChannelByName(void** channels, std::size_t count, const char* name) { + if (!channels || !name) { + return nullptr; + } + for (std::size_t i = 0; i < count; ++i) { + if (!channels[i]) { + continue; + } + auto* ch = static_cast(channels[i]); + if (ch->name && StrCaseCmp(ch->name, name) == 0) { + return ch; + } + } + return nullptr; +} + +void APS5_VABI WTFInitializeLogChannelStatesFromString(void** channels, std::size_t count, const char* logLevel) { + if (!channels || !logLevel) { + return; + } + for (std::size_t i = 0; i < count; ++i) { + if (!channels[i]) { + continue; + } + auto* ch = static_cast(channels[i]); + if (StrCaseCmp(logLevel, "all") == 0 || (ch->name && StrCaseCmp(logLevel, ch->name) == 0)) { + ch->state = 1; + } + } +} + +void APS5_VABI WTFGetBacktrace(void** stack, int* size) { + if (!stack || !size || *size <= 0) { + return; + } +#ifdef _WIN32 + *size = static_cast(CaptureStackBackTrace(0, static_cast(*size), stack, nullptr)); +#else + *size = 0; +#endif +} + +void APS5_VABI WTFPrintBacktrace(void** stack, int size) { + if (!stack || size <= 0) { + return; + } + for (int i = 0; i < size; ++i) { + std::fprintf(stderr, "%-3d %p\n", i, stack[i]); + } +} + +void APS5_VABI WTFReportBacktrace() { + void* frames[32]; + int size = 32; + WTFGetBacktrace(frames, &size); + WTFPrintBacktrace(frames, size); +} + +bool APS5_VABI WTFIsDebuggerAttached() { + return false; +} + +void APS5_VABI _ZN3WTF8dataLogFEPKcz(const char* format, ...) { + if (!format) { + return; + } +#ifdef _WIN32 + __builtin_sysv_va_list args; + __builtin_sysv_va_start(args, format); + LibcDetail::PrintWindows(format, args); + __builtin_sysv_va_end(args); +#else + std::va_list args; + va_start(args, format); + std::vfprintf(stderr, format, args); + va_end(args); +#endif +} + +void APS5_VABI _ZN3WTF9dataLogFVEPKcP13__va_list_tag(const char* format, void* argList) { + if (!format || !argList) { + return; + } +#ifdef _WIN32 + LibcDetail::PrintWindows(format, argList); +#else + std::vfprintf(stderr, format, *reinterpret_cast(argList)); +#endif +} + +} diff --git a/core/libs/prx/libSceNKWebKit/src/WtfMemory.cpp b/core/libs/prx/libSceNKWebKit/src/WtfMemory.cpp new file mode 100644 index 0000000000..c49ac2a26a --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/WtfMemory.cpp @@ -0,0 +1,158 @@ +#include "prx/libc/include/general/VabiMacros.hpp" +#include "prx/libSceNKWebKit/include/WtfExports.hpp" +#include "prx/libSceNKWebKit/src/WtfMemoryTypes.hpp" + +#include +#include +#include +#include +#include + +namespace NKWebKit { +void* Allocate(std::size_t size, std::size_t alignment = 16); +void* TryAllocate(std::size_t size, std::size_t alignment = 16); +void* Reallocate(void* ptr, std::size_t newSize, std::size_t alignment = 16); +void* TryReallocate(void* ptr, std::size_t newSize, std::size_t alignment = 16); +void Deallocate(void* ptr); +std::size_t AllocationSize(const void* ptr); +} // namespace NKWebKit + +extern "C" { +void* APS5_VABI _ZN3WTF10fastMallocEm(std::size_t size) { + return NKWebKit::Allocate(size); +} + +void APS5_VABI _ZN3WTF8fastFreeEPv(void* ptr) { + NKWebKit::Deallocate(ptr); +} + +void* APS5_VABI _ZN3WTF10fastCallocEmm(std::size_t count, std::size_t size) { + if (count != 0 && size > std::numeric_limits::max() / count) { + std::abort(); + } + const std::size_t total = count * size; + void* ptr = NKWebKit::Allocate(total); + std::memset(ptr, 0, total); + return ptr; +} + +void* APS5_VABI _ZN3WTF11fastReallocEPvm(void* ptr, std::size_t size) { + return NKWebKit::Reallocate(ptr, size); +} + +void* APS5_VABI _ZN3WTF16fastZeroedMallocEm(std::size_t size) { + void* ptr = NKWebKit::Allocate(size); + std::memset(ptr, 0, size); + return ptr; +} + +WTF::TryMallocReturnValue* APS5_VABI _ZN3WTF13tryFastMallocEm(WTF::TryMallocReturnValue* result, std::size_t size) { + result->data = NKWebKit::TryAllocate(size); + return result; +} + +WTF::TryMallocReturnValue* APS5_VABI _ZN3WTF19tryFastZeroedMallocEm(WTF::TryMallocReturnValue* result, std::size_t size) { + void* ptr = NKWebKit::TryAllocate(size); + if (ptr) { + std::memset(ptr, 0, size); + } + result->data = ptr; + return result; +} + +WTF::TryMallocReturnValue* APS5_VABI _ZN3WTF13tryFastCallocEmm(WTF::TryMallocReturnValue* result, std::size_t count, std::size_t size) { + if (count != 0 && size > std::numeric_limits::max() / count) { + result->data = nullptr; + return result; + } + const std::size_t total = count * size; + void* ptr = NKWebKit::TryAllocate(total); + if (ptr) { + std::memset(ptr, 0, total); + } + result->data = ptr; + return result; +} + +WTF::TryMallocReturnValue* APS5_VABI _ZN3WTF14tryFastReallocEPvm(WTF::TryMallocReturnValue* result, void* ptr, std::size_t size) { + result->data = NKWebKit::TryReallocate(ptr, size); + return result; +} + +void* APS5_VABI _ZN3WTF17fastAlignedMallocEmm(std::size_t alignment, std::size_t size) { + return NKWebKit::Allocate(size, alignment); +} + +void* APS5_VABI _ZN3WTF20tryFastAlignedMallocEmm(std::size_t alignment, std::size_t size) { + return NKWebKit::TryAllocate(size, alignment); +} + +void APS5_VABI _ZN3WTF15fastAlignedFreeEPv(void* ptr) { + NKWebKit::Deallocate(ptr); +} + +std::size_t APS5_VABI _ZN3WTF14fastMallocSizeEPKv(const void* ptr) { + return NKWebKit::AllocationSize(ptr); +} + +std::size_t APS5_VABI _ZN3WTF18fastMallocGoodSizeEm(std::size_t size) { + return size; +} + +void APS5_VABI _ZN3WTF27releaseFastMallocFreeMemoryEv() { +} + +void APS5_VABI _ZN3WTF40releaseFastMallocFreeMemoryForThisThreadEv() { +} + +char* APS5_VABI _ZN3WTF10fastStrDupEPKc(const char* str) { + if (!str) { + return nullptr; + } + const std::size_t len = std::strlen(str); + auto* dup = static_cast(NKWebKit::Allocate(len + 1)); + std::memcpy(dup, str, len + 1); + return dup; +} + +bool APS5_VABI _ZN3WTF19isFastMallocEnabledEv() { + return true; +} + +void APS5_VABI _ZN3WTF23fastCommitAlignedMemoryEPvm(void*, std::size_t) { +} + +void APS5_VABI _ZN3WTF25fastDecommitAlignedMemoryEPvm(void*, std::size_t) { +} + +void APS5_VABI _ZN3WTF18fastEnableMiniModeEv() { +} + +void APS5_VABI _ZN3WTF20fastDisableScavengerEv() { +} + +FastMallocStatistics APS5_VABI _ZN3WTF20fastMallocStatisticsEv() { + FastMallocStatistics stats{}; + return stats; +} + +void APS5_VABI _ZN3WTF25fastMallocDumpMallocStatsEv() { +} + +void* APS5_VABI _ZN3WTF13jsValueMallocEm(std::size_t size) { + return NKWebKit::Allocate(size); +} + +void* APS5_VABI _ZN3WTF16tryJSValueMallocEm(std::size_t size) { + return NKWebKit::TryAllocate(size); +} + +void APS5_VABI _ZN3WTF11jsValueFreeEPv(void* ptr) { + NKWebKit::Deallocate(ptr); +} + +void* APS5_VABI _ZN3WTF14jsValueReallocEPvm(void* ptr, std::size_t size) { + return NKWebKit::Reallocate(ptr, size); +} + +} diff --git a/core/libs/prx/libSceNKWebKit/src/WtfMemoryTypes.hpp b/core/libs/prx/libSceNKWebKit/src/WtfMemoryTypes.hpp new file mode 100644 index 0000000000..208695f345 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/WtfMemoryTypes.hpp @@ -0,0 +1,17 @@ +#pragma once + +#include + +struct FastMallocStatistics { + std::size_t reservedVMBytes; + std::size_t committedVMBytes; + std::size_t freeListBytes; +}; + +namespace WTF { +struct TryMallocReturnValue { + void* data; +}; +} // namespace WTF + +static_assert(sizeof(WTF::TryMallocReturnValue) == sizeof(void*)); diff --git a/core/libs/prx/libSceNKWebKit/src/WtfPrimitives.cpp b/core/libs/prx/libSceNKWebKit/src/WtfPrimitives.cpp new file mode 100644 index 0000000000..21fc02db16 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/WtfPrimitives.cpp @@ -0,0 +1,62 @@ +#include "prx/libc/include/general/VabiMacros.hpp" +#include "prx/libSceNKWebKit/include/WtfExports.hpp" +#include "WtfStringAbi.hpp" + +#include +#include + +namespace { + +using NKWebKit::WtfAbi::ProcessPrivileges; +unsigned g_processPrivileges = 0; + +} // namespace + +extern "C" { +ProcessPrivileges APS5_VABI _ZN3WTF13allPrivilegesEv() { + return {7}; +} + +void APS5_VABI _ZN3WTF20setProcessPrivilegesENS_9OptionSetINS_16ProcessPrivilegeEEE(ProcessPrivileges privileges) { + g_processPrivileges = privileges.storage; +} + +bool APS5_VABI _ZN3WTF19hasProcessPrivilegeENS_16ProcessPrivilegeE(unsigned privilege) { + return !!(g_processPrivileges & privilege); +} + +void APS5_VABI _ZN3WTF19addProcessPrivilegeENS_16ProcessPrivilegeE(unsigned privilege) { + g_processPrivileges |= privilege; +} + +void APS5_VABI _ZN3WTF22removeProcessPrivilegeENS_16ProcessPrivilegeE(unsigned privilege) { + g_processPrivileges &= ~privilege; +} + +unsigned APS5_VABI _ZN3WTF31sixCharacterHashStringToIntegerEPKc(const char* data) { + if (!data) throw std::invalid_argument("null WTF six-character hash"); + unsigned hash = 0; + for (unsigned i = 0; i < 6; ++i) { + unsigned c = static_cast(data[i]); + unsigned value; + if (c >= 'A' && c <= 'Z') value = c - 'A'; + else if (c >= 'a' && c <= 'z') value = c - 'a' + 26; + else if (c >= '0' && c <= '9') value = c - '0' + 52; + else throw std::invalid_argument("invalid WTF six-character hash"); + hash = hash * 62 + value; + } + if (data[6]) throw std::invalid_argument("WTF hash must contain six characters"); + return hash; +} + +bool APS5_VABI _ZN7WebCore21isBackForwardLoadTypeENS_13FrameLoadTypeE(std::uint8_t type) { + if (type > 9) throw std::invalid_argument("invalid WebCore frame load type"); + return type >= 1 && type <= 3; +} + +bool APS5_VABI _ZN7WebCore8isReloadENS_13FrameLoadTypeE(std::uint8_t type) { + if (type > 9) throw std::invalid_argument("invalid WebCore frame load type"); + return type == 4 || type == 8 || type == 9; +} + +} diff --git a/core/libs/prx/libSceNKWebKit/src/WtfString.cpp b/core/libs/prx/libSceNKWebKit/src/WtfString.cpp new file mode 100644 index 0000000000..72b70c7208 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/WtfString.cpp @@ -0,0 +1,1013 @@ +#include "prx/libc/include/general/VabiMacros.hpp" +#include "prx/libSceNKWebKit/include/WtfExports.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "WtfStringAbi.hpp" + +namespace { + +class StringHasher { +public: + static constexpr unsigned stringHashingStartValue = 0x9E3779B9U; + static constexpr unsigned maskHash = 0x00FFFFFFU; + + void addCharacter(std::uint16_t character) { + if (m_hasPendingCharacter) { + m_hasPendingCharacter = false; + addPair(m_pendingCharacter, character); + return; + } + m_pendingCharacter = character; + m_hasPendingCharacter = true; + } + + void addCharacters(std::uint16_t a, std::uint16_t b) { + if (m_hasPendingCharacter) { + m_hasPendingCharacter = false; + addPair(m_pendingCharacter, a); + m_pendingCharacter = b; + m_hasPendingCharacter = true; + return; + } + addPair(a, b); + } + + unsigned hashWithTop8BitsMasked() const { + return hash(true); + } + + unsigned hash(bool masked) const { + unsigned result = m_hash; + if (m_hasPendingCharacter) { + result += m_pendingCharacter; + result ^= result << 11; + result += result >> 17; + } + result ^= result << 3; + result += result >> 5; + result ^= result << 2; + result += result >> 15; + result ^= result << 10; + if (masked) result &= maskHash; + if (!result) { + return 0x00800000U; + } + return result; + } + +private: + void addPair(std::uint16_t first, std::uint16_t second) { + unsigned result = m_hash + first; + result = (result << 16) ^ ((static_cast(second) << 11) ^ result); + result += result >> 11; + m_hash = result; + } + + unsigned m_hash{stringHashingStartValue}; + std::uint16_t m_pendingCharacter{0}; + bool m_hasPendingCharacter{false}; +}; + +} // namespace + +extern "C" { +unsigned int APS5_VABI _ZN3WTF7Unicode51calculateStringHashAndLengthFromUTF8MaskingTop8BitsEPKcS2_RjS3_( + const char* data, const char* dataEnd, unsigned int& dataLength, unsigned int& utf16Length) { + if (!data || !dataEnd || reinterpret_cast(dataEnd) < reinterpret_cast(data)) + throw std::invalid_argument("invalid WTF UTF-8 hash range"); + StringHasher hasher; + utf16Length = 0; + const auto* cur = reinterpret_cast(data); + const auto* end = reinterpret_cast(dataEnd); + + while (cur < end) { + std::uint8_t lead = *cur++; + std::uint32_t cp = 0; + int extraBytes = 0; + + if (lead < 0x80) { + cp = lead; + } else if (lead >= 0xC2 && lead <= 0xDF) { + cp = lead & 0x1F; + extraBytes = 1; + } else if ((lead & 0xF0) == 0xE0) { + cp = lead & 0x0F; + extraBytes = 2; + } else if (lead >= 0xF0 && lead <= 0xF4) { + cp = lead & 0x07; + extraBytes = 3; + } else { + return 0; + } + + if (static_cast(end - cur) < static_cast(extraBytes)) { + return 0; + } + + for (int i = 0; i < extraBytes; ++i) { + std::uint8_t b = *cur++; + if ((b & 0xC0) != 0x80) { + return 0; + } + cp = (cp << 6) | (b & 0x3F); + } + + if ((extraBytes == 1 && cp < 0x80) || (extraBytes == 2 && cp < 0x800) || (extraBytes == 3 && cp < 0x10000)) return 0; + + if (cp <= 0xFFFF) { + if (cp >= 0xD800 && cp <= 0xDFFF) { + return 0; + } + hasher.addCharacter(static_cast(cp)); + utf16Length++; + } else if (cp <= 0x10FFFF) { + std::uint32_t sub = cp - 0x10000; + auto leadSurrogate = static_cast((sub >> 10) + 0xD800); + auto trailSurrogate = static_cast((sub & 0x3FF) + 0xDC00); + hasher.addCharacters(leadSurrogate, trailSurrogate); + utf16Length += 2; + } else { + return 0; + } + } + + dataLength = static_cast(reinterpret_cast(cur) - data); + return hasher.hashWithTop8BitsMasked(); +} + +double APS5_VABI _ZN3WTF8Internal25parseDoubleFromLongStringEPKDsmRm( + const char16_t* string, std::size_t length, std::size_t& parsedLength) { + std::vector buffer(length + 1); + for (std::size_t i = 0; i < length; ++i) { + char16_t ch = string[i]; + buffer[i] = (ch < 0x80) ? static_cast(ch) : 0; + } + buffer[length] = '\0'; + + char* endPtr = nullptr; + double val = std::strtod(buffer.data(), &endPtr); + parsedLength = static_cast(endPtr - buffer.data()); + return val; +} + +} + +namespace NKWebKit { +void* Allocate(std::size_t size, std::size_t alignment = 16); +void Deallocate(void* ptr); +} // namespace NKWebKit + +namespace NKWebKit::WtfAbi { + +void Release(StringImpl* impl) { + if (!impl) return; + if (impl->refCount != 2) { + impl->refCount -= 2; + return; + } + if (impl->hashAndFlags & 48 || (impl->hashAndFlags & 3) == 3) std::terminate(); + switch (impl->hashAndFlags & 3) { + case 1: + Deallocate(const_cast(impl->data)); + break; + case 2: + Release(*reinterpret_cast(reinterpret_cast(impl) + 24)); + break; + } + Deallocate(impl); +} + +void Release(CStringBuffer* buffer) { + if (buffer && !--buffer->refCount) Deallocate(buffer); +} + +} // namespace NKWebKit::WtfAbi + +namespace { + +using NKWebKit::WtfAbi::StringImpl; +using NKWebKit::WtfAbi::StringView; +using NKWebKit::WtfAbi::String; +using NKWebKit::WtfAbi::CString; +using NKWebKit::WtfAbi::CStringBuffer; + +constexpr unsigned MaxStringLength = 0x7FFFFFFF; +constexpr std::size_t NotFound = std::numeric_limits::max(); + +template T& Checked(T* value) { + if (!value) throw std::invalid_argument("null WTF object"); + return *value; +} + +void CheckBuffer(const void* value, std::size_t length) { + if (!value && length) throw std::invalid_argument("null WTF character buffer"); +} + +StringView View(const StringImpl* impl) { + if (!impl) return {nullptr, 0, true}; + return {impl->data, impl->length, !!(impl->hashAndFlags & 4)}; +} + +char16_t Unit(StringView view, unsigned index) { + CheckBuffer(view.data, view.length); + return view.is8Bit ? static_cast(view.data)[index] : static_cast(view.data)[index]; +} + +unsigned Hash(StringView view, bool masked = true) { + StringHasher hasher; + for (unsigned i = 0; i < view.length; ++i) hasher.addCharacter(Unit(view, i)); + return hasher.hash(masked); +} + +StringImpl* EmptyImpl() { + static const unsigned char empty[] = ""; + static StringImpl impl{1, 0, empty, (Hash({empty, 0, true}) << 8) | 28}; + impl.refCount += 2; + return &impl; +} + +StringImpl* Retain(StringImpl* impl) { + if (impl) impl->refCount += 2; + return impl; +} + +StringImpl* NewImpl(unsigned length, bool is8Bit, void*& characters) { + if (!length) { + characters = nullptr; + return EmptyImpl(); + } + const std::size_t width = is8Bit ? 1 : 2; + if (length > std::min(MaxStringLength, (0xFFFFFFFFULL - sizeof(StringImpl)) / width)) + throw std::length_error("WTF string exceeds maximum length"); + auto* storage = static_cast(NKWebKit::Allocate(std::max(sizeof(StringImpl), 20 + width * length))); + characters = storage + 20; + return new (storage) StringImpl{2, length, characters, is8Bit ? 4U : 0U}; +} + +StringImpl* CopyImpl(StringView view, bool narrow = false) { + if (!view.data || !view.length) return EmptyImpl(); + bool is8Bit = view.is8Bit; + if (narrow && !is8Bit) { + is8Bit = true; + for (unsigned i = 0; i < view.length; ++i) is8Bit &= Unit(view, i) <= 255; + } + void* data; + auto* impl = NewImpl(view.length, is8Bit, data); + for (unsigned i = 0; i < view.length; ++i) { + if (is8Bit) static_cast(data)[i] = static_cast(Unit(view, i)); + else static_cast(data)[i] = Unit(view, i); + } + return impl; +} + +char16_t AsciiCase(char16_t value, bool lower) { + if (lower && value >= 'A' && value <= 'Z') return value + 32; + if (!lower && value >= 'a' && value <= 'z') return value - 32; + return value; +} + +StringImpl* ConvertCase(StringView view, bool lower, StringImpl* original = nullptr) { + if (!view.data) return nullptr; + if (original) { + bool changed = false; + for (unsigned i = 0; i < view.length; ++i) changed |= AsciiCase(Unit(view, i), lower) != Unit(view, i); + if (!changed) return Retain(original); + } + void* data; + auto* impl = NewImpl(view.length, view.is8Bit, data); + for (unsigned i = 0; i < view.length; ++i) { + auto value = AsciiCase(Unit(view, i), lower); + if (view.is8Bit) static_cast(data)[i] = static_cast(value); + else static_cast(data)[i] = value; + } + return impl; +} + +bool EqualViews(StringView a, StringView b, bool ignoreCase = false) { + if (a.length != b.length) return false; + for (unsigned i = 0; i < a.length; ++i) { + auto x = Unit(a, i); + auto y = Unit(b, i); + if (ignoreCase) { x = AsciiCase(x, true); y = AsciiCase(y, true); } + if (x != y) return false; + } + return true; +} + +bool EqualImpls(const StringImpl* a, const StringImpl* b, bool ignoreCase = false) { + if (a == b) return true; + return a && b && EqualViews(View(a), View(b), ignoreCase); +} + +bool EqualBuffer(const StringImpl* impl, const void* buffer, unsigned length, bool is8Bit) { + if (!impl) return !buffer; + return buffer && EqualViews(View(impl), {buffer, length, is8Bit}); +} + +bool Affix(const StringImpl* impl, const char* buffer, unsigned length, bool suffix) { + auto view = View(&Checked(impl)); + if (length > view.length) return false; + CheckBuffer(buffer, length); + unsigned start = suffix ? view.length - length : 0; + for (unsigned i = 0; i < length; ++i) { + if (Unit(view, start + i) != static_cast(buffer[i])) return false; + } + return true; +} + +std::int32_t CharacterAt(StringView view, unsigned index) { + if (index >= view.length) throw std::out_of_range("WTF character index"); + auto first = Unit(view, index); + if (view.is8Bit || first < 0xD800 || first > 0xDFFF) return first; + if (first <= 0xDBFF && index + 1 < view.length) { + auto second = Unit(view, index + 1); + if (second >= 0xDC00 && second <= 0xDFFF) return 0x10000 + ((first - 0xD800) << 10) + second - 0xDC00; + } + return 0; +} + +CString NewCString(std::size_t length, char*& data) { + if (length > std::numeric_limits::max() - sizeof(CStringBuffer) - 1) + throw std::length_error("WTF CString allocation overflow"); + auto* buffer = new (NKWebKit::Allocate(sizeof(CStringBuffer) + length + 1)) CStringBuffer{1, length}; + data = reinterpret_cast(buffer + 1); + data[length] = 0; + return CString(buffer); +} + +const char* Bytes(const CString& value) { + return value.buffer ? reinterpret_cast(value.buffer + 1) : nullptr; +} + +CString CopyCString(const char* data, std::size_t length) { + if (!data) { + CheckBuffer(data, length); + return CString(); + } + char* output; + auto result = NewCString(length, output); + if (length) std::memcpy(output, data, length); + return result; +} + +String FromUTF8(const unsigned char* input, std::size_t length) { + if (length > MaxStringLength) throw std::length_error("WTF UTF-8 input too long"); + if (!input) return String(); + bool ascii = true; + for (std::size_t i = 0; i < length; ++i) ascii &= input[i] < 128; + if (ascii) return String(CopyImpl({input, static_cast(length), true})); + std::u16string output; + for (std::size_t i = 0; i < length;) { + unsigned first = input[i++]; + unsigned codePoint; + unsigned count; + unsigned minimum; + if (first < 128) { output.push_back(static_cast(first)); continue; } + if (first >= 0xC2 && first <= 0xDF) { codePoint = first & 31; count = 1; minimum = 0x80; } + else if (first >= 0xE0 && first <= 0xEF) { codePoint = first & 15; count = 2; minimum = 0x800; } + else if (first >= 0xF0 && first <= 0xF4) { codePoint = first & 7; count = 3; minimum = 0x10000; } + else return String(); + if (count > length - i) return String(); + for (unsigned j = 0; j < count; ++j) { + unsigned next = input[i++]; + if ((next & 0xC0) != 0x80) return String(); + codePoint = (codePoint << 6) | (next & 63); + } + if (codePoint < minimum || codePoint > 0x10FFFF || (codePoint >= 0xD800 && codePoint <= 0xDFFF)) return String(); + if (codePoint < 0x10000) output.push_back(static_cast(codePoint)); + else { + output.push_back(static_cast(0xD800 + ((codePoint - 0x10000) >> 10))); + output.push_back(static_cast(0xDC00 + ((codePoint - 0x10000) & 1023))); + } + } + return String(CopyImpl({output.data(), static_cast(output.size()), false})); +} + +CString ToUTF8(StringView view, unsigned mode) { + if (mode > 2 && !view.is8Bit) throw std::invalid_argument("invalid WTF UTF-8 conversion mode"); + std::string bytes; + for (unsigned i = 0; i < view.length; ++i) { + unsigned cp = Unit(view, i); + if (!view.is8Bit && cp >= 0xD800 && cp <= 0xDFFF) { + if (cp <= 0xDBFF && i + 1 < view.length && Unit(view, i + 1) >= 0xDC00 && Unit(view, i + 1) <= 0xDFFF) { + cp = 0x10000 + ((cp - 0xD800) << 10) + Unit(view, i + 1) - 0xDC00; + ++i; + } else if (mode == 1) throw std::invalid_argument("unpaired WTF UTF-16 surrogate"); + else if (mode == 2) cp = 0xFFFD; + } + if (cp < 0x80) bytes.push_back(static_cast(cp)); + else if (cp < 0x800) { + bytes.push_back(static_cast(0xC0 | (cp >> 6))); + bytes.push_back(static_cast(0x80 | (cp & 63))); + } else if (cp < 0x10000) { + bytes.push_back(static_cast(0xE0 | (cp >> 12))); + bytes.push_back(static_cast(0x80 | ((cp >> 6) & 63))); + bytes.push_back(static_cast(0x80 | (cp & 63))); + } else { + bytes.push_back(static_cast(0xF0 | (cp >> 18))); + bytes.push_back(static_cast(0x80 | ((cp >> 12) & 63))); + bytes.push_back(static_cast(0x80 | ((cp >> 6) & 63))); + bytes.push_back(static_cast(0x80 | (cp & 63))); + } + } + return CopyCString(bytes.data(), bytes.size()); +} + +String Substring(const StringImpl* original, unsigned start, unsigned length) { + const auto& impl = Checked(original); + if (start >= impl.length) return String(EmptyImpl()); + if (length >= impl.length - start) { + if (!start) return String(Retain(const_cast(original))); + length = impl.length - start; + } + const auto* data = static_cast(impl.data) + (impl.hashAndFlags & 4 ? start : 2ULL * start); + return String(CopyImpl({data, length, !!(impl.hashAndFlags & 4)})); +} + +String SharedSubstring(const String* string, unsigned start, unsigned length) { + const auto& value = Checked(string); + unsigned size = value.impl ? value.impl->length : 0; + start = std::min(start, size); + length = std::min(length, size - start); + if (!start && length == size) return String(Retain(value.impl)); + if (!length) return String(EmptyImpl()); + const auto& impl = Checked(value.impl); + bool is8Bit = impl.hashAndFlags & 4; + if (32 >= 20 + std::size_t(length) * (is8Bit ? 1 : 2)) return Substring(&impl, start, length); + auto* owner = value.impl; + if ((impl.hashAndFlags & 3) == 2) owner = *reinterpret_cast(reinterpret_cast(&impl) + 24); + auto* memory = static_cast(NKWebKit::Allocate(32)); + auto* result = new (memory) StringImpl{2, length, static_cast(impl.data) + std::size_t(start) * (is8Bit ? 1 : 2), (is8Bit ? 4U : 0U) | 2U}; + *reinterpret_cast(memory + 24) = Retain(owner); + return String(result); +} + +template String IntegerString(T value) { + char buffer[32]; + auto result = std::to_chars(buffer, buffer + sizeof(buffer), value); + if (result.ec != std::errc{}) throw std::runtime_error("WTF integer formatting failed"); + return String(CopyImpl({buffer, static_cast(result.ptr - buffer), true})); +} + +} // namespace + +extern "C" { +String APS5_VABI _ZN3WTF10StringImpl6createEPKDsj(const char16_t* data, unsigned length) { + return String(CopyImpl({data, length, false})); +} + +String APS5_VABI _ZN3WTF10StringImpl19createUninitializedEjRPDs(unsigned length, char16_t*& data) { + void* output; + auto* impl = NewImpl(length, false, output); + data = static_cast(output); + return String(impl); +} + +String APS5_VABI _ZN3WTF10StringImpl6createEPKhj(const unsigned char* data, unsigned length) { + return String(CopyImpl({data, length, true})); +} + +String APS5_VABI _ZN3WTF10StringImpl19createUninitializedEjRPh(unsigned length, unsigned char*& data) { + void* output; + auto* impl = NewImpl(length, true, output); + data = static_cast(output); + return String(impl); +} + +String APS5_VABI _ZN3WTF10StringImpl20create8BitIfPossibleEPKDsj(const char16_t* data, unsigned length) { + return String(CopyImpl({data, length, false}, true)); +} + +void APS5_VABI _ZN3WTF6StringC1EPKDsj(String* self, const char16_t* data, unsigned length) { + Checked(self); + Checked(self).impl = data ? CopyImpl({data, length, false}) : nullptr; +} + +void APS5_VABI _ZN3WTF6StringC2EPKDsj(String* self, const char16_t* data, unsigned length) { + Checked(self); + Checked(self).impl = data ? CopyImpl({data, length, false}) : nullptr; +} + +void APS5_VABI _ZN3WTF6StringC1EPKc(String* self, const char* data) { + Checked(self); + Checked(self).impl = data ? CopyImpl({data, static_cast(std::strlen(data)), true}) : nullptr; +} + +void APS5_VABI _ZN3WTF6StringC2EPKc(String* self, const char* data) { + Checked(self); + Checked(self).impl = data ? CopyImpl({data, static_cast(std::strlen(data)), true}) : nullptr; +} + +void APS5_VABI _ZN3WTF6StringC1EPKcj(String* self, const char* data, unsigned length) { + Checked(self); + Checked(self).impl = data ? CopyImpl({data, length, true}) : nullptr; +} + +void APS5_VABI _ZN3WTF6StringC2EPKcj(String* self, const char* data, unsigned length) { + Checked(self); + Checked(self).impl = data ? CopyImpl({data, length, true}) : nullptr; +} + +void APS5_VABI _ZN3WTF6StringC1EPKhj(String* self, const unsigned char* data, unsigned length) { + Checked(self); + Checked(self).impl = data ? CopyImpl({data, length, true}) : nullptr; +} + +void APS5_VABI _ZN3WTF6StringC2EPKhj(String* self, const unsigned char* data, unsigned length) { + Checked(self); + Checked(self).impl = data ? CopyImpl({data, length, true}) : nullptr; +} + +String APS5_VABI _ZN3WTF6String6numberEi(int value) { + return IntegerString(value); +} + +String APS5_VABI _ZN3WTF6String6numberEj(unsigned value) { + return IntegerString(value); +} + +String APS5_VABI _ZN3WTF6String6numberEl(std::int64_t value) { + return IntegerString(value); +} + +String APS5_VABI _ZN3WTF6String6numberEm(std::uint64_t value) { + return IntegerString(value); +} + +String APS5_VABI _ZN3WTF6String6numberEx(long long value) { + return IntegerString(value); +} + +String APS5_VABI _ZN3WTF6String6numberEy(unsigned long long value) { + return IntegerString(value); +} + +String APS5_VABI _ZN3WTF6String13fromCodePointEi(std::int32_t cp) { + if (cp < 0 || cp > 0x10FFFF) return String(); + char16_t data[2]; + unsigned length = 1; + if (cp <= 0xFFFF) data[0] = static_cast(cp); + else { data[0] = static_cast(0xD800 + ((cp - 0x10000) >> 10)); data[1] = static_cast(0xDC00 + ((cp - 0x10000) & 1023)); length = 2; } + return String(CopyImpl({data, length, false})); +} + +String APS5_VABI _ZN3WTF6String8fromUTF8EPKhm(const unsigned char* data, std::size_t length) { + return FromUTF8(data, length); +} + +String APS5_VABI _ZN3WTF6String8fromUTF8EPKh(const unsigned char* data) { + return FromUTF8(data, data ? std::strlen(reinterpret_cast(data)) : 0); +} + +String APS5_VABI _ZN3WTF6String8fromUTF8ERKNS_7CStringE(const CString& value) { + const char* data = Bytes(value); + return FromUTF8(reinterpret_cast(data), data ? std::strlen(data) : 0); +} + +String APS5_VABI _ZN3WTF6String26fromUTF8WithLatin1FallbackEPKhm(const unsigned char* data, std::size_t length) { + auto result = FromUTF8(data, length); + if (result.impl) return result; + return String(data ? CopyImpl({data, static_cast(length), true}) : nullptr); +} + +String APS5_VABI _ZN3WTF10StringImpl23convertToASCIILowercaseEv(const StringImpl* self) { + return String(ConvertCase(View(&Checked(self)), true, const_cast(self))); +} + +String APS5_VABI _ZN3WTF10StringImpl23convertToASCIIUppercaseEv(const StringImpl* self) { + return String(ConvertCase(View(&Checked(self)), false, const_cast(self))); +} + +CString APS5_VABI _ZNK3WTF10StringImpl4utf8ENS_14ConversionModeE(const StringImpl* self, unsigned mode) { + return ToUTF8(View(&Checked(self)), mode); +} + +String APS5_VABI _ZNK3WTF6String23convertToASCIILowercaseEv(const String* self) { + return String(ConvertCase(View(Checked(self).impl), true, Checked(self).impl)); +} + +String APS5_VABI _ZNK3WTF6String23convertToASCIIUppercaseEv(const String* self) { + return String(ConvertCase(View(Checked(self).impl), false, Checked(self).impl)); +} + +CString APS5_VABI _ZNK3WTF6String4utf8ENS_14ConversionModeE(const String* self, unsigned mode) { + return ToUTF8(View(Checked(self).impl), mode); +} + +String APS5_VABI _ZNK3WTF10StringView23convertToASCIILowercaseEv(const StringView* self) { + return String(ConvertCase(Checked(self), true)); +} + +String APS5_VABI _ZNK3WTF10StringView23convertToASCIIUppercaseEv(const StringView* self) { + return String(ConvertCase(Checked(self), false)); +} + +CString APS5_VABI _ZNK3WTF10StringView4utf8ENS_14ConversionModeE(const StringView* self, unsigned mode) { + return ToUTF8(Checked(self), mode); +} + +bool APS5_VABI _ZNK3WTF10StringImpl10startsWithEDs(const StringImpl* self, char16_t value) { + auto view = View(&Checked(self)); + return view.length && Unit(view, 0) == value; +} + +bool APS5_VABI _ZNK3WTF10StringImpl8endsWithEDs(const StringImpl* self, char16_t value) { + auto view = View(&Checked(self)); + return view.length && Unit(view, view.length - 1) == value; +} + +bool APS5_VABI _ZNK3WTF10StringView10startsWithEDs(const StringView* self, char16_t value) { + auto view = Checked(self); + return view.length && Unit(view, 0) == value; +} + +bool APS5_VABI _ZNK3WTF10StringView8endsWithEDs(const StringView* self, char16_t value) { + auto view = Checked(self); + return view.length && Unit(view, view.length - 1) == value; +} + +bool APS5_VABI _ZNK3WTF10StringImpl10startsWithEPKcj(const StringImpl* self, const char* data, unsigned length) { + return Affix(self, data, length, false); +} + +bool APS5_VABI _ZNK3WTF10StringImpl8endsWithEPKcj(const StringImpl* self, const char* data, unsigned length) { + return Affix(self, data, length, true); +} + +std::size_t APS5_VABI _ZNK3WTF10StringImpl11sizeInBytesEv(const StringImpl* self) { + const auto& impl = Checked(self); + return sizeof(StringImpl) + std::size_t(impl.length) * (impl.hashAndFlags & 4 ? 1 : 2); +} + +unsigned APS5_VABI _ZNK3WTF10StringImpl14concurrentHashEv(const StringImpl* self) { + return Hash(View(&Checked(self))); +} + +unsigned APS5_VABI _ZNK3WTF10StringImpl12hashSlowCaseEv(const StringImpl* self) { + auto& impl = Checked(self); + unsigned hash = Hash(View(&impl)); + impl.hashAndFlags = (impl.hashAndFlags & 255) | (hash << 8); + return hash; +} + +std::int32_t APS5_VABI _ZN3WTF10StringImpl19characterStartingAtEj(const StringImpl* self, unsigned index) { + return CharacterAt(View(&Checked(self)), index); +} + +std::int32_t APS5_VABI _ZNK3WTF6String19characterStartingAtEj(const String* self, unsigned index) { + auto view = View(Checked(self).impl); + return index < view.length ? CharacterAt(view, index) : 0; +} + +std::size_t APS5_VABI _ZN3WTF10StringImpl11reverseFindEDsj(const StringImpl* self, char16_t value, unsigned start) { + auto view = View(&Checked(self)); + if (!view.length) return NotFound; + std::size_t i = std::min(start, view.length - 1); + do { if (Unit(view, static_cast(i)) == value) return i; } while (i--); + return NotFound; +} + +String APS5_VABI _ZN3WTF10StringImpl9substringEjj(const StringImpl* self, unsigned start, unsigned length) { + return Substring(self, start, length); +} + +String APS5_VABI _ZNK3WTF6String20substringSharingImplEjj(const String* self, unsigned start, unsigned length) { + return SharedSubstring(self, start, length); +} + +bool APS5_VABI _ZNK3WTF6String27isSafeToSendToAnotherThreadEv(const String* self) { + const auto* impl = Checked(self).impl; + return !impl || !impl->length || (impl->refCount == 2 && !(impl->hashAndFlags & 16)); +} + +CString APS5_VABI _ZNK3WTF6String5asciiEv(const String* self) { + auto view = View(Checked(self).impl); + char* output; + auto result = NewCString(view.length, output); + for (unsigned i = 0; i < view.length; ++i) { + auto value = Unit(view, i); + output[i] = value && (value < 32 || value > 127) ? '?' : static_cast(value); + } + return result; +} + +CString APS5_VABI _ZNK3WTF6String6latin1Ev(const String* self) { + auto view = View(Checked(self).impl); + char* output; + auto result = NewCString(view.length, output); + for (unsigned i = 0; i < view.length; ++i) { + auto value = Unit(view, i); + output[i] = value > 255 ? '?' : static_cast(value); + } + return result; +} + +std::size_t APS5_VABI _ZNK3WTF10StringView4findES0_j(const StringView* self, StringView match, unsigned start) { + auto view = Checked(self); + if (start > view.length || match.length > view.length - start) return NotFound; + if (!match.length) return start; + for (unsigned i = start; i <= view.length - match.length; ++i) { + unsigned j = 0; + while (j < match.length && Unit(view, i + j) == Unit(match, j)) ++j; + if (j == match.length) return i; + } + return NotFound; +} + +void APS5_VABI _ZNK3WTF10StringView26getCharactersWithASCIICaseENS0_15CaseConvertTypeEPDs(const StringView* self, unsigned type, char16_t* output) { + auto view = Checked(self); + CheckBuffer(output, view.length); + for (unsigned i = 0; i < view.length; ++i) output[i] = static_cast(AsciiCase(Unit(view, i), type == 1)); +} + +void APS5_VABI _ZNK3WTF10StringView26getCharactersWithASCIICaseENS0_15CaseConvertTypeEPh(const StringView* self, unsigned type, unsigned char* output) { + auto view = Checked(self); + CheckBuffer(output, view.length); + if (!view.is8Bit) throw std::invalid_argument("cannot narrow WTF StringView case output"); + for (unsigned i = 0; i < view.length; ++i) output[i] = static_cast(AsciiCase(Unit(view, i), type == 1)); +} + +bool APS5_VABI _ZN3WTF22equalRespectingNullityENS_10StringViewES0_(StringView a, StringView b) { + if (a.data == b.data) return a.length == b.length; + if (!a.length && !b.length) return !a.data == !b.data; + return EqualViews(a, b); +} + +bool APS5_VABI _ZN3WTF5equalEPKNS_10StringImplES2_(const StringImpl* a, const StringImpl* b) { + return EqualImpls(a, b); +} + +bool APS5_VABI _ZN3WTF5equalERKNS_10StringImplES2_(const StringImpl& a, const StringImpl& b) { + return EqualImpls(&a, &b); +} + +bool APS5_VABI _ZN3WTF5equalEPKNS_10StringImplEPKDsj(const StringImpl* impl, const char16_t* data, unsigned length) { + return EqualBuffer(impl, data, length, false); +} + +bool APS5_VABI _ZN3WTF5equalEPKNS_10StringImplEPKhj(const StringImpl* impl, const unsigned char* data, unsigned length) { + return EqualBuffer(impl, data, length, true); +} + +bool APS5_VABI _ZN3WTF5equalEPKNS_10StringImplEPKh(const StringImpl* impl, const unsigned char* data) { + if (!impl || !data) return !impl && !data; + return EqualBuffer(impl, data, static_cast(std::strlen(reinterpret_cast(data))), true); +} + +bool APS5_VABI _ZN3WTF20equalIgnoringNullityEPNS_10StringImplES1_(StringImpl* a, StringImpl* b) { + return EqualViews(View(a), View(b)); +} + +bool APS5_VABI _ZN3WTF20equalIgnoringNullityEPKDsmPNS_10StringImplE(const char16_t* data, std::size_t length, StringImpl* impl) { + if (!impl) return !length; + if (length != impl->length) return false; + return EqualViews({data, static_cast(length), false}, View(impl)); +} + +bool APS5_VABI _ZN3WTF22equalIgnoringASCIICaseEPKNS_10StringImplES2_(const StringImpl* a, const StringImpl* b) { + return EqualImpls(a, b, true); +} + +bool APS5_VABI _ZN3WTF29equalIgnoringASCIICaseNonNullEPKNS_10StringImplES2_(const StringImpl* a, const StringImpl* b) { + Checked(a); + Checked(b); + return EqualImpls(a, b, true); +} + +void APS5_VABI _ZN3WTF7CStringC1EPKc(CString* self, const char* data) { + auto value = CopyCString(data, (data ? std::strlen(data) : 0)); + Checked(self).buffer = std::exchange(value.buffer, nullptr); +} + +void APS5_VABI _ZN3WTF7CStringC2EPKc(CString* self, const char* data) { + auto value = CopyCString(data, (data ? std::strlen(data) : 0)); + Checked(self).buffer = std::exchange(value.buffer, nullptr); +} + +void APS5_VABI _ZN3WTF7CStringC1EPKcm(CString* self, const char* data, std::size_t length) { + auto value = CopyCString(data, length); + Checked(self).buffer = std::exchange(value.buffer, nullptr); +} + +void APS5_VABI _ZN3WTF7CStringC2EPKcm(CString* self, const char* data, std::size_t length) { + auto value = CopyCString(data, length); + Checked(self).buffer = std::exchange(value.buffer, nullptr); +} + +CString APS5_VABI _ZN3WTF7CString16newUninitializedEmRPc(std::size_t length, char*& output) { + return NewCString(length, output); +} + +char* APS5_VABI _ZN3WTF7CString11mutableDataEv(CString* self) { + auto& value = Checked(self); + if (!value.buffer) return nullptr; + if (value.buffer->refCount != 1) { + auto copy = CopyCString(Bytes(value), value.buffer->length); + NKWebKit::WtfAbi::Release(value.buffer); + value.buffer = std::exchange(copy.buffer, nullptr); + } + return const_cast(Bytes(value)); +} + +void APS5_VABI _ZN3WTF7CString4growEm(CString* self, std::size_t length) { + auto& value = Checked(self); + if (!value.buffer || length <= value.buffer->length) throw std::invalid_argument("WTF CString must grow"); + char* output; + auto copy = NewCString(length, output); + std::memcpy(output, Bytes(value), value.buffer->length + 1); + NKWebKit::WtfAbi::Release(value.buffer); + value.buffer = std::exchange(copy.buffer, nullptr); +} + +unsigned APS5_VABI _ZNK3WTF7CString4hashEv(const CString* self) { + const char* data = Bytes(Checked(self)); + if (!data) return 0; + StringHasher hasher; + while (*data) hasher.addCharacter(static_cast(*data++)); + return hasher.hash(false); +} + +bool APS5_VABI _ZN3WTFeqERKNS_7CStringES2_(const CString& a, const CString& b) { + if (!a.buffer || !b.buffer) return !a.buffer && !b.buffer; + return a.buffer->length == b.buffer->length && !std::memcmp(Bytes(a), Bytes(b), a.buffer->length); +} + +bool APS5_VABI _ZN3WTFeqERKNS_7CStringEPKc(const CString& a, const char* b) { + if (!a.buffer || !b) return !a.buffer && !b; + return !std::strcmp(Bytes(a), b); +} + +bool APS5_VABI _ZN3WTFltERKNS_7CStringES2_(const CString& a, const CString& b) { + if (!a.buffer) return !!b.buffer; + return b.buffer && std::strcmp(Bytes(a), Bytes(b)) < 0; +} + +bool APS5_VABI _ZN3WTF11CStringHash5equalERKNS_7CStringES3_(const CString& a, const CString& b) { + auto* deleted = reinterpret_cast(static_cast(-1)); + if (a.buffer == deleted) return b.buffer == deleted; + if (b.buffer == deleted) return false; + if (!a.buffer || !b.buffer) return !a.buffer && !b.buffer; + return a.buffer->length == b.buffer->length && !std::memcmp(Bytes(a), Bytes(b), a.buffer->length); +} + +} + +namespace { + +using NKWebKit::WtfAbi::URL; + +StringView Slice(StringView view, unsigned start, unsigned length = MaxStringLength) { + if (start >= view.length) return {"", 0, true}; + length = std::min(length, view.length - start); + return {static_cast(view.data) + std::size_t(start) * (view.is8Bit ? 1 : 2), length, view.is8Bit}; +} + +unsigned HostStart(const URL& url) { + return url.passwordEnd == url.userStart ? url.passwordEnd : url.passwordEnd + 1; +} + +unsigned PathStart(const URL& url) { + unsigned start = url.hostEnd + ((url.bits >> 3) & 7); + auto view = View(url.impl); + if (start == (url.bits >> 6) + 1 && start < view.length && view.length - start > 1 && Unit(view, start) == '/' && Unit(view, start + 1) == '.') start += 2; + return start; +} + +bool URLProtocol(const URL& url, StringView protocol) { + if (!(url.bits & 1) || (url.bits >> 6) != protocol.length) return false; + auto view = View(url.impl); + for (unsigned i = 0; i < protocol.length; ++i) { + if (i >= view.length) throw std::out_of_range("invalid WTF URL scheme boundary"); + if ((Unit(view, i) | 32) != Unit(protocol, i)) return false; + } + return true; +} + +bool JavaScriptProtocol(StringView view) { + constexpr char protocol[] = "javascript"; + unsigned index = 0; + bool leading = true; + for (unsigned i = 0; i < view.length; ++i) { + auto value = Unit(view, i); + if (leading) { + if (value <= 32) continue; + leading = false; + } else if (value == '\t' || value == '\r' || value == '\n') continue; + if (index == 10) return value == ':'; + if ((value | 32) != protocol[index++]) return false; + } + return false; +} + +} // namespace + +extern "C" { +void APS5_VABI _ZN3WTF3URL10invalidateEv(URL* self) { + auto& url = Checked(self); + url.bits = 0; + url.userStart = 0; + url.userEnd = 0; + url.passwordEnd = 0; + url.hostEnd = 0; + url.pathAfterLastSlash = 0; + url.pathEnd = 0; + url.queryEnd = 0; +} + +StringView APS5_VABI _ZNK3WTF3URL8protocolEv(const URL* self) { + const auto& url = Checked(self); + return url.bits & 1 ? Slice(View(url.impl), 0, url.bits >> 6) : StringView{nullptr, 0, true}; +} + +StringView APS5_VABI _ZNK3WTF3URL4hostEv(const URL* self) { + const auto& url = Checked(self); + unsigned start = HostStart(url); + return url.bits & 1 ? Slice(View(url.impl), start, url.hostEnd - start) : StringView{nullptr, 0, true}; +} + +StringView APS5_VABI _ZNK3WTF3URL4pathEv(const URL* self) { + const auto& url = Checked(self); + if (!(url.bits & 1)) return {nullptr, 0, true}; + unsigned start = PathStart(url); + return Slice(View(url.impl), start, url.pathEnd - start); +} + +StringView APS5_VABI _ZNK3WTF3URL11encodedUserEv(const URL* self) { + const auto& url = Checked(self); + return Slice(View(url.impl), url.userStart, url.userEnd - url.userStart); +} + +StringView APS5_VABI _ZNK3WTF3URL15encodedPasswordEv(const URL* self) { + const auto& url = Checked(self); + return url.passwordEnd != url.userEnd ? Slice(View(url.impl), url.userEnd + 1, url.passwordEnd - url.userEnd - 1) : StringView{nullptr, 0, true}; +} + +StringView APS5_VABI _ZNK3WTF3URL18fragmentIdentifierEv(const URL* self) { + const auto& url = Checked(self); + auto view = View(url.impl); + return (url.bits & 1) && view.length > url.queryEnd ? Slice(view, url.queryEnd + 1) : StringView{nullptr, 0, true}; +} + +StringView APS5_VABI _ZNK3WTF3URL39fragmentIdentifierWithLeadingNumberSignEv(const URL* self) { + const auto& url = Checked(self); + auto view = View(url.impl); + return (url.bits & 1) && view.length > url.queryEnd ? Slice(view, url.queryEnd) : StringView{nullptr, 0, true}; +} + +StringView APS5_VABI _ZNK3WTF3URL28queryWithLeadingQuestionMarkEv(const URL* self) { + const auto& url = Checked(self); + return url.queryEnd > url.pathEnd ? Slice(View(url.impl), url.pathEnd, url.queryEnd - url.pathEnd) : StringView{nullptr, 0, true}; +} + +bool APS5_VABI _ZNK3WTF3URL10protocolIsENS_10StringViewE(const URL* self, StringView protocol) { + return URLProtocol(Checked(self), protocol); +} + +bool APS5_VABI _ZNK3WTF3URL14isHierarchicalEv(const URL* self) { + const auto& url = Checked(self); + if (!(url.bits & 1)) return false; + auto view = View(url.impl); + unsigned index = (url.bits >> 6) + 1; + return index < view.length && Unit(view, index) == '/'; +} + +bool APS5_VABI _ZNK3WTF3URL12isAboutBlankEv(const URL* self) { + const auto& url = Checked(self); + if (!URLProtocol(url, {"about", 5, true})) return false; + unsigned start = PathStart(url); + return EqualViews(Slice(View(url.impl), start, url.pathEnd - start), {"blank", 5, true}); +} + +bool APS5_VABI _ZNK3WTF3URL13isAboutSrcDocEv(const URL* self) { + const auto& url = Checked(self); + if (!URLProtocol(url, {"about", 5, true})) return false; + unsigned start = PathStart(url); + return EqualViews(Slice(View(url.impl), start, url.pathEnd - start), {"srcdoc", 6, true}); +} + +bool APS5_VABI _ZNK3WTF3URL20protocolIsJavaScriptEv(const URL* self) { + return JavaScriptProtocol(View(Checked(self).impl)); +} + +bool APS5_VABI _ZN3WTF20protocolIsJavaScriptENS_10StringViewE(StringView view) { + return JavaScriptProtocol(view); +} + +bool APS5_VABI _ZN3WTF22protocolIsInHTTPFamilyENS_10StringViewE(StringView view) { + if (view.length < 5) return false; + if ((Unit(view, 0) | 32) != 'h' || (Unit(view, 1) | 32) != 't' || (Unit(view, 2) | 32) != 't' || (Unit(view, 3) | 32) != 'p') return false; + return Unit(view, 4) == ':' || ((Unit(view, 4) | 32) == 's' && view.length >= 6 && Unit(view, 5) == ':'); +} + +} diff --git a/core/libs/prx/libSceNKWebKit/src/WtfStringAbi.hpp b/core/libs/prx/libSceNKWebKit/src/WtfStringAbi.hpp new file mode 100644 index 0000000000..1f4bdc17e6 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/WtfStringAbi.hpp @@ -0,0 +1,98 @@ +#pragma once + +#include +#include +#include +#include + +namespace NKWebKit::WtfAbi { + +struct StringImpl { + unsigned refCount; + unsigned length; + const void* data; + mutable unsigned hashAndFlags; +}; + +struct StringView { + const void* data; + unsigned length; + bool is8Bit; +}; + +struct URL { + StringImpl* impl; + unsigned bits; + unsigned userStart; + unsigned userEnd; + unsigned passwordEnd; + unsigned hostEnd; + unsigned pathAfterLastSlash; + unsigned pathEnd; + unsigned queryEnd; +}; + +static_assert(sizeof(URL) == 40); +static_assert(offsetof(URL, impl) == 0); +static_assert(offsetof(URL, bits) == 8); +static_assert(offsetof(URL, userStart) == 12); +static_assert(offsetof(URL, userEnd) == 16); +static_assert(offsetof(URL, passwordEnd) == 20); +static_assert(offsetof(URL, hostEnd) == 24); +static_assert(offsetof(URL, pathAfterLastSlash) == 28); +static_assert(offsetof(URL, pathEnd) == 32); +static_assert(offsetof(URL, queryEnd) == 36); + +struct CStringBuffer { + unsigned refCount; + std::size_t length; +}; + +void Release(StringImpl* impl); +void Release(CStringBuffer* buffer); + +struct String { + StringImpl* impl; + explicit String(StringImpl* value = nullptr) : impl(value) {} + String(const String& other) : impl(other.impl) { if (impl) impl->refCount += 2; } + String(String&& other) noexcept : impl(std::exchange(other.impl, nullptr)) {} + ~String() { Release(impl); } +}; + +struct CString { + CStringBuffer* buffer; + explicit CString(CStringBuffer* value = nullptr) : buffer(value) {} + CString(const CString& other) : buffer(other.buffer) { if (buffer) ++buffer->refCount; } + CString(CString&& other) noexcept : buffer(std::exchange(other.buffer, nullptr)) {} + ~CString() { Release(buffer); } +}; + +struct ProcessPrivileges { + unsigned storage; +}; + +static_assert(alignof(StringImpl) == 8); +static_assert(alignof(StringView) == 8); +static_assert(alignof(CStringBuffer) == 8); +static_assert(!std::is_trivially_destructible_v); +static_assert(!std::is_trivially_destructible_v); +static_assert(sizeof(StringImpl) == 24); +static_assert(offsetof(StringImpl, refCount) == 0); +static_assert(offsetof(StringImpl, length) == 4); +static_assert(offsetof(StringImpl, data) == 8); +static_assert(offsetof(StringImpl, hashAndFlags) == 16); +static_assert(sizeof(String) == 8); +static_assert(offsetof(String, impl) == 0); +static_assert(sizeof(StringView) == 16); +static_assert(offsetof(StringView, data) == 0); +static_assert(offsetof(StringView, length) == 8); +static_assert(offsetof(StringView, is8Bit) == 12); +static_assert(sizeof(CString) == 8); +static_assert(offsetof(CString, buffer) == 0); +static_assert(sizeof(CStringBuffer) == 16); +static_assert(offsetof(CStringBuffer, refCount) == 0); +static_assert(offsetof(CStringBuffer, length) == 8); +static_assert(sizeof(ProcessPrivileges) == 4); +static_assert(offsetof(ProcessPrivileges, storage) == 0); + +} // namespace NKWebKit::WtfAbi diff --git a/core/libs/prx/libSceNKWebKit/src/WtfSystem.cpp b/core/libs/prx/libSceNKWebKit/src/WtfSystem.cpp new file mode 100644 index 0000000000..c994a00334 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/WtfSystem.cpp @@ -0,0 +1,68 @@ +#include "prx/libc/include/general/VabiMacros.hpp" +#include "prx/libSceNKWebKit/include/WtfExports.hpp" +#include +#ifndef _WIN32 +#include +#endif + +#include +#include +#include + +#ifdef _WIN32 +#include +#endif + +namespace NKWebKit { +void FillRandomBytes(void* buffer, std::size_t bytes); +} // namespace NKWebKit + +namespace { +bool g_configPermanentlyFrozen = false; +} // namespace + +extern "C" { +int APS5_VABI _ZN3WTF22numberOfProcessorCoresEv() { + unsigned int count = std::thread::hardware_concurrency(); + if (count == 0) throw std::runtime_error("numberOfProcessorCores: the host reports no processor count"); + return static_cast(count); +} + +std::uint64_t APS5_VABI _ZN3WTF7ramSizeEv() { +#ifdef _WIN32 + MEMORYSTATUSEX status; + status.dwLength = sizeof(status); + if (GlobalMemoryStatusEx(&status)) { + return status.ullTotalPhys; + } +#else + const long pages = sysconf(_SC_PHYS_PAGES); + const long pageBytes = sysconf(_SC_PAGE_SIZE); + if (pages > 0 && pageBytes > 0) return static_cast(pages) * static_cast(pageBytes); +#endif + throw std::runtime_error("ramSize: the host reports no physical memory size"); +} + +void APS5_VABI _ZN3WTF29cryptographicallyRandomValuesEPvm(void* buffer, std::size_t length) { + NKWebKit::FillRandomBytes(buffer, length); +} + +std::size_t APS5_VABI _ZN3WTF8pageSizeEv() { + return 4096; +} + +void APS5_VABI _ZN3WTF6Config17permanentlyFreezeEv() { + g_configPermanentlyFrozen = true; +} + +int APS5_VABI _ZN3WTF18constantTimeMemcmpEPKvS1_m(const void* voidA, const void* voidB, std::size_t length) { + const auto* a = static_cast(voidA); + const auto* b = static_cast(voidB); + std::uint8_t result = 0; + for (std::size_t i = 0; i < length; ++i) { + result |= static_cast(a[i] ^ b[i]); + } + return result; +} + +} diff --git a/core/libs/prx/libSceNKWebKit/src/WtfTime.cpp b/core/libs/prx/libSceNKWebKit/src/WtfTime.cpp new file mode 100644 index 0000000000..35d00eb602 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/WtfTime.cpp @@ -0,0 +1,479 @@ +#include "prx/libc/include/general/VabiMacros.hpp" +#include "prx/libSceNKWebKit/include/WtfExports.hpp" +#include "prx/libSceNKWebKit/src/WtfTimeTypes.hpp" + +#include +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 +#include +#else +#include +#endif + +namespace WTF { + +static double currentWallTimeSeconds() { + auto now = std::chrono::system_clock::now(); + return std::chrono::duration(now.time_since_epoch()).count(); +} + +static double currentMonotonicTimeSeconds() { + auto now = std::chrono::steady_clock::now(); + return std::chrono::duration(now.time_since_epoch()).count(); +} + +static bool isLeapYear(int year) { + if (year % 4 != 0) { + return false; + } + if (year % 100 != 0) { + return true; + } + return (year % 400 == 0); +} + +static int dayInYear(int year, int month, int day) { + static const int firstDayOfMonth[2][12] = { + {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}, + {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335} + }; + bool leap = isLeapYear(year); + int m = (month >= 0 && month < 12) ? month : 0; + return firstDayOfMonth[leap ? 1 : 0][m] + day - 1; +} + +static double daysFrom1970ToYear(int year) { + const double yMinus1 = static_cast(year) - 1.0; + const double by4 = std::floor(yMinus1 / 4.0) - (1970 / 4); + const double by100 = std::floor(yMinus1 / 100.0) - (1970 / 100); + const double by400 = std::floor(yMinus1 / 400.0) - (1970 / 400); + return 365.0 * (year - 1970.0) + by4 - by100 + by400; +} + +static double ymdhmsToMilliseconds(int year, long mon, long day, long hour, long minute, long second, double milliseconds) { + static const int firstDayOfMonth[2][12] = { + {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}, + {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335} + }; + int mday = firstDayOfMonth[isLeapYear(year) ? 1 : 0][mon - 1]; + double ydays = daysFrom1970ToYear(year); + double dateMs = milliseconds + second * 1000.0 + minute * 60000.0 + hour * 3600000.0 + (mday + day - 1 + ydays) * 86400000.0; + if (dateMs < -8640000000000000.0 || dateMs > 8640000000000000.0) { + return std::numeric_limits::quiet_NaN(); + } + return dateMs; +} + +static const char* parseES5DatePortion(const char* currentPosition, int& year, long& month, long& day) { + char* postParse = nullptr; + year = static_cast(std::strtol(currentPosition, &postParse, 10)); + if (postParse == currentPosition) { + return nullptr; + } + if (*currentPosition == '-' && year == 0) { + return nullptr; + } + if (*postParse != '-') { + return postParse; + } + currentPosition = postParse + 1; + if (*currentPosition < '0' || *currentPosition > '9') { + return nullptr; + } + month = std::strtol(currentPosition, &postParse, 10); + if ((postParse - currentPosition) != 2) { + return nullptr; + } + if (*postParse != '-') { + return postParse; + } + currentPosition = postParse + 1; + if (*currentPosition < '0' || *currentPosition > '9') { + return nullptr; + } + day = std::strtol(currentPosition, &postParse, 10); + if ((postParse - currentPosition) != 2) { + return nullptr; + } + return postParse; +} + +static const char* parseES5TimePortion(const char* currentPosition, long& hours, long& minutes, long& seconds, double& milliseconds, bool& isLocalTime, long& timeZoneSeconds) { + isLocalTime = false; + char* postParse = nullptr; + if (*currentPosition < '0' || *currentPosition > '9') { + return nullptr; + } + hours = std::strtol(currentPosition, &postParse, 10); + if (*postParse != ':' || (postParse - currentPosition) != 2) { + return nullptr; + } + currentPosition = postParse + 1; + if (*currentPosition < '0' || *currentPosition > '9') { + return nullptr; + } + minutes = std::strtol(currentPosition, &postParse, 10); + if ((postParse - currentPosition) != 2) { + return nullptr; + } + currentPosition = postParse; + + if (*currentPosition == ':') { + ++currentPosition; + if (*currentPosition < '0' || *currentPosition > '9') { + return nullptr; + } + seconds = std::strtol(currentPosition, &postParse, 10); + if ((postParse - currentPosition) != 2) { + return nullptr; + } + if (*postParse == '.') { + currentPosition = postParse + 1; + if (*currentPosition < '0' || *currentPosition > '9') { + return nullptr; + } + long frac = std::strtol(currentPosition, &postParse, 10); + long numFracDigits = postParse - currentPosition; + milliseconds = frac * std::pow(10.0, static_cast(-numFracDigits + 3)); + } + currentPosition = postParse; + } + + if (*currentPosition == 'Z') { + return currentPosition + 1; + } + + bool tzNegative = false; + if (*currentPosition == '-') { + tzNegative = true; + } else if (*currentPosition == '+') { + tzNegative = false; + } else { + isLocalTime = true; + return currentPosition; + } + ++currentPosition; + + long tzHours = 0; + long tzHoursAbs = 0; + long tzMinutes = 0; + + if (*currentPosition < '0' || *currentPosition > '9') { + return nullptr; + } + tzHours = std::strtol(currentPosition, &postParse, 10); + if (*postParse != ':') { + if ((postParse - currentPosition) == 2) { + tzHoursAbs = std::labs(tzHours); + } else if ((postParse - currentPosition) == 4) { + tzHoursAbs = std::labs(tzHours); + tzMinutes = tzHoursAbs % 100; + tzHoursAbs = tzHoursAbs / 100; + } else { + return nullptr; + } + } else { + if ((postParse - currentPosition) != 2) { + return nullptr; + } + tzHoursAbs = std::labs(tzHours); + currentPosition = postParse + 1; + if (*currentPosition < '0' || *currentPosition > '9') { + return nullptr; + } + tzMinutes = std::strtol(currentPosition, &postParse, 10); + if ((postParse - currentPosition) != 2) { + return nullptr; + } + } + currentPosition = postParse; + if (tzHoursAbs > 24 || tzMinutes < 0 || tzMinutes > 59) { + return nullptr; + } + timeZoneSeconds = 60 * (tzMinutes + (60 * tzHoursAbs)); + if (tzNegative) { + timeZoneSeconds = -timeZoneSeconds; + } + return currentPosition; +} + +} // namespace WTF + +extern "C" { +WTF::MonotonicTime APS5_VABI _ZN3WTF13MonotonicTime3nowEv() { + return WTF::MonotonicTime{WTF::currentMonotonicTimeSeconds()}; +} + +WTF::WallTime APS5_VABI _ZN3WTF8WallTime3nowEv() { + return WTF::WallTime{WTF::currentWallTimeSeconds()}; +} + +WTF::WallTime APS5_VABI _ZNK3WTF13MonotonicTime19approximateWallTimeEv(const WTF::MonotonicTime* self) { + if (std::isinf(self->m_value)) { + return WTF::WallTime{self->m_value}; + } + return WTF::WallTime{self->m_value - WTF::currentMonotonicTimeSeconds() + WTF::currentWallTimeSeconds()}; +} + +WTF::MonotonicTime APS5_VABI _ZNK3WTF8WallTime24approximateMonotonicTimeEv(const WTF::WallTime* self) { + if (std::isinf(self->m_value)) { + return WTF::MonotonicTime{self->m_value}; + } + return WTF::MonotonicTime{self->m_value - WTF::currentWallTimeSeconds() + WTF::currentMonotonicTimeSeconds()}; +} + +WTF::TimeWithDynamicClockType APS5_VABI _ZN3WTF24TimeWithDynamicClockType3nowENS_9ClockTypeE(WTF::ClockType type) { + switch (type) { + case WTF::ClockType::Wall: + return WTF::TimeWithDynamicClockType{WTF::currentWallTimeSeconds(), WTF::ClockType::Wall}; + case WTF::ClockType::Monotonic: + return WTF::TimeWithDynamicClockType{WTF::currentMonotonicTimeSeconds(), WTF::ClockType::Monotonic}; + case WTF::ClockType::Approximate: + return WTF::TimeWithDynamicClockType{WTF::currentMonotonicTimeSeconds(), WTF::ClockType::Approximate}; + } + return WTF::TimeWithDynamicClockType{0.0, WTF::ClockType::Wall}; +} + +WTF::MonotonicTime APS5_VABI _ZNK3WTF24TimeWithDynamicClockType13monotonicTimeEv(const WTF::TimeWithDynamicClockType* self) { + return WTF::MonotonicTime{self->m_value}; +} + +WTF::WallTime APS5_VABI _ZNK3WTF24TimeWithDynamicClockType8wallTimeEv(const WTF::TimeWithDynamicClockType* self) { + return WTF::WallTime{self->m_value}; +} + +WTF::WallTime APS5_VABI _ZNK3WTF24TimeWithDynamicClockType19approximateWallTimeEv(const WTF::TimeWithDynamicClockType* self) { + if (self->m_type == WTF::ClockType::Wall) { + return WTF::WallTime{self->m_value}; + } + WTF::MonotonicTime mono{self->m_value}; + return _ZNK3WTF13MonotonicTime19approximateWallTimeEv(&mono); +} + +WTF::MonotonicTime APS5_VABI _ZNK3WTF24TimeWithDynamicClockType24approximateMonotonicTimeEv(const WTF::TimeWithDynamicClockType* self) { + if (self->m_type == WTF::ClockType::Monotonic || self->m_type == WTF::ClockType::Approximate) { + return WTF::MonotonicTime{self->m_value}; + } + WTF::WallTime wall{self->m_value}; + return _ZNK3WTF8WallTime24approximateMonotonicTimeEv(&wall); +} + +WTF::TimeWithDynamicClockType APS5_VABI _ZNK3WTF24TimeWithDynamicClockType16nowWithSameClockEv(const WTF::TimeWithDynamicClockType* self) { + return _ZN3WTF24TimeWithDynamicClockType3nowENS_9ClockTypeE(self->m_type); +} + +WTF::Seconds APS5_VABI _ZNK3WTF24TimeWithDynamicClockTypemiERKS0_(const WTF::TimeWithDynamicClockType* self, const WTF::TimeWithDynamicClockType& other) { + return WTF::Seconds{self->m_value - other.m_value}; +} + +bool APS5_VABI _ZNK3WTF24TimeWithDynamicClockTypegtERKS0_(const WTF::TimeWithDynamicClockType* self, const WTF::TimeWithDynamicClockType& other) { + return self->m_value > other.m_value; +} + +bool APS5_VABI _ZNK3WTF24TimeWithDynamicClockTypegeERKS0_(const WTF::TimeWithDynamicClockType* self, const WTF::TimeWithDynamicClockType& other) { + return self->m_value >= other.m_value; +} + +bool APS5_VABI _ZNK3WTF24TimeWithDynamicClockTypeleERKS0_(const WTF::TimeWithDynamicClockType* self, const WTF::TimeWithDynamicClockType& other) { + return self->m_value <= other.m_value; +} + +bool APS5_VABI _ZN3WTF10hasElapsedERKNS_24TimeWithDynamicClockTypeE(const WTF::TimeWithDynamicClockType& time) { + if (std::isinf(time.m_value)) { + return false; + } + WTF::TimeWithDynamicClockType now = _ZN3WTF24TimeWithDynamicClockType3nowENS_9ClockTypeE(time.m_type); + return time.m_value <= now.m_value; +} + +void APS5_VABI _ZN3WTF5sleepERKNS_24TimeWithDynamicClockTypeE(const WTF::TimeWithDynamicClockType& time) { + WTF::TimeWithDynamicClockType now = _ZN3WTF24TimeWithDynamicClockType3nowENS_9ClockTypeE(time.m_type); + double diff = time.m_value - now.m_value; + if (diff > 0.0) { + std::this_thread::sleep_for(std::chrono::duration(diff)); + } +} + +WTF::MonotonicTime APS5_VABI _ZNK3WTF7SecondsmiENS_13MonotonicTimeE(const WTF::Seconds* self, WTF::MonotonicTime other) { + return WTF::MonotonicTime{self->m_value - other.m_value}; +} + +WTF::WallTime APS5_VABI _ZNK3WTF7SecondsmiENS_8WallTimeE(const WTF::Seconds* self, WTF::WallTime other) { + return WTF::WallTime{self->m_value - other.m_value}; +} + +WTF::TimeWithDynamicClockType APS5_VABI _ZNK3WTF7SecondsmiERKNS_24TimeWithDynamicClockTypeE(const WTF::Seconds* self, const WTF::TimeWithDynamicClockType& other) { + return WTF::TimeWithDynamicClockType{self->m_value - other.m_value, other.m_type}; +} + +WTF::MonotonicTime APS5_VABI _ZNK3WTF7SecondsplENS_13MonotonicTimeE(const WTF::Seconds* self, WTF::MonotonicTime other) { + return WTF::MonotonicTime{self->m_value + other.m_value}; +} + +WTF::WallTime APS5_VABI _ZNK3WTF7SecondsplENS_8WallTimeE(const WTF::Seconds* self, WTF::WallTime other) { + return WTF::WallTime{self->m_value + other.m_value}; +} + +WTF::Seconds APS5_VABI _ZN3WTF7CPUTime16forCurrentThreadEv() { +#ifdef _WIN32 + FILETIME creationTime, exitTime, kernelTime, userTime; + if (GetThreadTimes(GetCurrentThread(), &creationTime, &exitTime, &kernelTime, &userTime)) { + ULARGE_INTEGER k, u; + k.LowPart = kernelTime.dwLowDateTime; + k.HighPart = kernelTime.dwHighDateTime; + u.LowPart = userTime.dwLowDateTime; + u.HighPart = userTime.dwHighDateTime; + double totalSec = static_cast(k.QuadPart + u.QuadPart) * 1e-7; + return WTF::Seconds{totalSec}; + } +#elif defined(CLOCK_THREAD_CPUTIME_ID) + struct timespec ts; + if (clock_gettime(CLOCK_THREAD_CPUTIME_ID, &ts) == 0) { + return WTF::Seconds{static_cast(ts.tv_sec) + static_cast(ts.tv_nsec) * 1e-9}; + } +#endif + return WTF::Seconds{0.0}; +} + +double APS5_VABI _ZNK3WTF7CPUTime23percentageCPUUsageSinceERKS0_(const WTF::CPUTime* self, const WTF::CPUTime& reference) { + double cpuUsageDelta = (self->systemTime.m_value + self->userTime.m_value) - (reference.systemTime.m_value + reference.userTime.m_value); + double cpuTimeDelta = self->cpuTime.m_value - reference.cpuTime.m_value; + if (cpuTimeDelta <= 0.0) { + return 0.0; + } + return cpuUsageDelta * 100.0 / cpuTimeDelta; +} + +void APS5_VABI _ZN3WTF17GregorianDateTime21setToCurrentLocalTimeEv(WTF::GregorianDateTime* self) { +#ifdef _WIN32 + SYSTEMTIME st; + GetLocalTime(&st); + TIME_ZONE_INFORMATION tzi; + DWORD tzId = GetTimeZoneInformation(&tzi); + LONG bias = 0; + if (tzId != TIME_ZONE_ID_INVALID) { + bias = tzi.Bias; + if (tzId == TIME_ZONE_ID_DAYLIGHT) { + bias += tzi.DaylightBias; + } else if (tzId == TIME_ZONE_ID_STANDARD || tzId == TIME_ZONE_ID_UNKNOWN) { + bias += tzi.StandardBias; + } + } + self->m_year = st.wYear; + self->m_month = st.wMonth - 1; + self->m_monthDay = st.wDay; + self->m_yearDay = WTF::dayInYear(self->m_year, self->m_month, self->m_monthDay); + self->m_weekDay = st.wDayOfWeek; + self->m_hour = st.wHour; + self->m_minute = st.wMinute; + self->m_second = st.wSecond; + self->m_utcOffsetInMinute = -bias; + self->m_isDST = (tzId == TIME_ZONE_ID_DAYLIGHT) ? 1 : 0; +#else + time_t raw = time(nullptr); + struct tm localTM; + localtime_r(&raw, &localTM); + self->m_year = localTM.tm_year + 1900; + self->m_month = localTM.tm_mon; + self->m_monthDay = localTM.tm_mday; + self->m_yearDay = localTM.tm_yday; + self->m_weekDay = localTM.tm_wday; + self->m_hour = localTM.tm_hour; + self->m_minute = localTM.tm_min; + self->m_second = localTM.tm_sec; + self->m_isDST = localTM.tm_isdst; +#if defined(HAVE_TM_GMTOFF) || defined(__GLIBC__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__) + self->m_utcOffsetInMinute = static_cast(localTM.tm_gmtoff / 60); +#else + self->m_utcOffsetInMinute = 0; +#endif +#endif +} + +WTF::LocalTimeOffset APS5_VABI _ZN3WTF24calculateLocalTimeOffsetEdNS_8TimeTypeE(double, WTF::TimeType) { +#ifdef _WIN32 + TIME_ZONE_INFORMATION tzi; + DWORD tzId = GetTimeZoneInformation(&tzi); + LONG bias = 0; + bool isDST = false; + if (tzId != TIME_ZONE_ID_INVALID) { + bias = tzi.Bias; + if (tzId == TIME_ZONE_ID_DAYLIGHT) { + bias += tzi.DaylightBias; + isDST = true; + } else if (tzId == TIME_ZONE_ID_STANDARD || tzId == TIME_ZONE_ID_UNKNOWN) { + bias += tzi.StandardBias; + } + } + return WTF::LocalTimeOffset{isDST, -static_cast(bias * 60 * 1000)}; +#else + time_t now = time(nullptr); + struct tm localTM; + localtime_r(&now, &localTM); +#if defined(HAVE_TM_GMTOFF) || defined(__GLIBC__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__) + return WTF::LocalTimeOffset{localTM.tm_isdst > 0, static_cast(localTM.tm_gmtoff * 1000)}; +#else + return WTF::LocalTimeOffset{localTM.tm_isdst > 0, 0}; +#endif +#endif +} + +double APS5_VABI _ZN3WTF40parseES5DateFromNullTerminatedCharactersEPKcRb(const char* dateString, bool& isLocalTime) { + isLocalTime = false; + static const long daysPerMonth[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; + int year = 0; + long month = 1; + long day = 1; + long hours = 0; + long minutes = 0; + long seconds = 0; + double milliseconds = 0.0; + long timeZoneSeconds = 0; + + const char* current = WTF::parseES5DatePortion(dateString, year, month, day); + if (!current) { + return std::numeric_limits::quiet_NaN(); + } + if (*current == 'T' || *current == 't' || *current == ' ') { + current = WTF::parseES5TimePortion(current + 1, hours, minutes, seconds, milliseconds, isLocalTime, timeZoneSeconds); + if (!current) { + return std::numeric_limits::quiet_NaN(); + } + } + if (*current != '\0') { + return std::numeric_limits::quiet_NaN(); + } + if (month < 1 || month > 12) { + return std::numeric_limits::quiet_NaN(); + } + if (day < 1 || day > daysPerMonth[month - 1]) { + return std::numeric_limits::quiet_NaN(); + } + if (month == 2 && day > 28 && !WTF::isLeapYear(year)) { + return std::numeric_limits::quiet_NaN(); + } + if (hours < 0 || hours > 24) { + return std::numeric_limits::quiet_NaN(); + } + if (hours == 24 && (minutes || seconds)) { + return std::numeric_limits::quiet_NaN(); + } + if (minutes < 0 || minutes > 59) { + return std::numeric_limits::quiet_NaN(); + } + if (seconds < 0 || seconds >= 61) { + return std::numeric_limits::quiet_NaN(); + } + if (seconds == 60) { + milliseconds = 0.0; + } + return WTF::ymdhmsToMilliseconds(year, month, day, hours, minutes, seconds, milliseconds) - (timeZoneSeconds * 1000.0); +} + +} diff --git a/core/libs/prx/libSceNKWebKit/src/WtfTimeTypes.hpp b/core/libs/prx/libSceNKWebKit/src/WtfTimeTypes.hpp new file mode 100644 index 0000000000..1dc2ab9b41 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/src/WtfTimeTypes.hpp @@ -0,0 +1,59 @@ +#pragma once + +#include + +namespace WTF { + +enum class ClockType : std::uint32_t { + Wall, + Monotonic, + Approximate, +}; + +enum class TimeType : std::uint32_t { + UTCTime, + LocalTime, +}; + +struct Seconds { + double m_value{0.0}; +}; + +struct MonotonicTime { + double m_value{0.0}; +}; + +struct WallTime { + double m_value{0.0}; +}; + +struct TimeWithDynamicClockType { + double m_value{0.0}; + ClockType m_type{ClockType::Wall}; +}; + +struct CPUTime { + MonotonicTime cpuTime; + Seconds userTime; + Seconds systemTime; +}; + +struct GregorianDateTime { + int m_year{0}; + int m_month{0}; + int m_yearDay{0}; + int m_monthDay{0}; + int m_weekDay{0}; + int m_hour{0}; + int m_minute{0}; + int m_second{0}; + int m_utcOffsetInMinute{0}; + int m_isDST{0}; +}; + +struct LocalTimeOffset { + bool isDST{false}; + int offset{0}; +}; + +} // namespace WTF diff --git a/core/libs/prx/libSceNKWebKit/tests/Base.cpp b/core/libs/prx/libSceNKWebKit/tests/Base.cpp new file mode 100644 index 0000000000..8d8c8043fc --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/tests/Base.cpp @@ -0,0 +1,379 @@ +#include "prx/libc/include/general/VabiMacros.hpp" +#include "prx/libSceNKWebKit/libSceNKWebKit.hpp" +#include "prx/libSceJsc/include/Api.hpp" +#include "prx/libSceNKWebKit/src/Types.hpp" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using WKPoint = NKWebKit::PointValue; +using WKSize = NKWebKit::SizeValue; +using WKRect = NKWebKit::RectValue; + +static void Check(bool value, int line) { + if (!value) { + std::fprintf(stderr, "libSceNKWebKit Base check failed at line %d\n", line); + std::abort(); + } +} +#define Require(value) Check((value), __LINE__) + +static void TestTypeIDs() { + Require(WKArrayGetTypeID() == 1); + Require(WKDataGetTypeID() == 8); + Require(WKDictionaryGetTypeID() == 9); + Require(WKErrorGetTypeID() == 10); + Require(WKSecurityOriginGetTypeID() == 18); + Require(WKStringGetTypeID() == 21); + Require(WKURLGetTypeID() == 22); + Require(WKURLRequestGetTypeID() == 23); + Require(WKURLResponseGetTypeID() == 24); + Require(WKUserContentURLPatternGetTypeID() == 25); + Require(WKBooleanGetTypeID() == 30); + Require(WKDoubleGetTypeID() == 31); + Require(WKUInt64GetTypeID() == 32); + Require(WKPointGetTypeID() == 34); + Require(WKSizeGetTypeID() == 35); + Require(WKRectGetTypeID() == 36); + Require(WKCertificateInfoGetTypeID() == 0); + Require(WKApplicationCacheManagerGetTypeID() == 0); + Require(WKBundleBackForwardListGetTypeID() == 0); + Require(WKContextMenuItemGetTypeID() == 0); + Require(WKUserContentExtensionStoreGetTypeID() == 0); + Require(WKAXObjectGetTypeID() == 132); + WKRenderLayerGetTypeID(); + WKRenderObjectGetTypeID(); +} + +static void TestRetainRelease() { + auto* s = WKStringCreateWithUTF8CString("hello"); + Require(WKGetTypeID(s) == WKStringGetTypeID()); + auto* retained = WKRetain(s); + Require(retained == s); + WKRelease(retained); + WKRelease(s); + + bool caught = false; + try { + WKRetain(nullptr); + } catch (const std::invalid_argument&) { + caught = true; + } + Require(caught); +} + +static void TestStrings() { + auto* s = WKStringCreateWithUTF8CString("Hello, World!"); + Require(!WKStringIsEmpty(s)); + Require(WKStringGetLength(s) == 13); + Require(WKStringGetMaximumUTF8CStringSize(s) == 13 * 3 + 1); + + unsigned short chars[16]; + std::size_t copied = WKStringGetCharacters(s, chars, 5); + Require(copied == 5); + Require(chars[0] == 'H' && chars[1] == 'e' && chars[2] == 'l' && chars[3] == 'l' && chars[4] == 'o'); + + char buf[32]; + std::size_t written = WKStringGetUTF8CString(s, buf, sizeof(buf)); + Require(written == 14); + Require(std::strcmp(buf, "Hello, World!") == 0); + + char smallBuf[6]; + std::size_t truncated = WKStringGetUTF8CString(s, smallBuf, sizeof(smallBuf)); + Require(truncated == 6); + Require(std::strcmp(smallBuf, "Hello") == 0); + + Require(WKStringGetUTF8CString(s, buf, 0) == 0); + + auto* s2 = WKStringCreateWithUTF8CString("hello, world!"); + Require(!WKStringIsEqual(s, s2)); + Require(WKStringIsEqualToUTF8CString(s, "Hello, World!")); + Require(!WKStringIsEqualToUTF8CString(s, "hello, world!")); + Require(WKStringIsEqualToUTF8CStringIgnoringCase(s, "hello, world!")); + + auto* emptyStr = WKStringCreateWithUTF8CString(""); + Require(WKStringIsEmpty(emptyStr)); + Require(WKStringGetLength(emptyStr) == 0); + Require(WKStringGetMaximumUTF8CStringSize(emptyStr) == 1); + buf[0] = 'X'; + Require(WKStringGetUTF8CString(emptyStr, buf, sizeof(buf)) == 1); + Require(buf[0] == '\0'); + + auto* nullStr = WKStringCreateWithUTF8CString(nullptr); + Require(WKStringIsEmpty(nullStr)); + Require(WKStringGetLength(nullStr) == 0); + + auto* jsStr = WKStringCopyJSString(s); + Require(jsStr != nullptr); + Require(JSStringGetLength_nid_postfix(jsStr) == 13); + auto* roundTrip = WKStringCreateWithJSString(jsStr); + Require(WKStringIsEqual(s, roundTrip)); + JSStringRelease_nid_postfix(jsStr); + WKRelease(roundTrip); + + auto* emptyJs = WKStringCopyJSString(nullStr); + Require(emptyJs != nullptr); + Require(JSStringGetLength_nid_postfix(emptyJs) == 0); + JSStringRelease_nid_postfix(emptyJs); + auto* invalidUtf8 = WKStringCreateWithUTF8CString("\xC3\x28"); + Require(WKStringIsEmpty(invalidUtf8)); + auto* invalidJs = WKStringCopyJSString(invalidUtf8); + Require(invalidJs != nullptr); + JSStringRelease_nid_postfix(invalidJs); + WKRelease(invalidUtf8); + auto* fromNullJs = WKStringCreateWithJSString(nullptr); + Require(WKStringIsEmpty(fromNullJs)); + Require(WKStringCopyJSString(fromNullJs) == nullptr); + WKRelease(fromNullJs); + auto* nullJs = JSStringCreateWithUTF8CString_nid_postfix(nullptr); + auto* fromNullJsString = WKStringCreateWithJSString(nullJs); + auto* fromNullJsCopy = WKStringCopyJSString(fromNullJsString); + Require(fromNullJsCopy != nullptr); + JSStringRelease_nid_postfix(fromNullJsCopy); + WKRelease(fromNullJsString); + JSStringRelease_nid_postfix(nullJs); + + WKRelease(s); + WKRelease(s2); + WKRelease(emptyStr); + WKRelease(nullStr); +} + +static void TestURL() { + auto* u = WKURLCreateWithUTF8CString("https://example.com/test?a=1#frag"); + Require(WKGetTypeID(u) == WKURLGetTypeID()); + auto* str = WKURLCopyString(u); + Require(WKStringIsEqualToUTF8CString(str, "https://example.com/test?a=1#frag")); + WKRelease(str); + WKRelease(u); +} + +static void TestArray() { + auto* s1 = WKStringCreateWithUTF8CString("one"); + auto* s2 = WKStringCreateWithUTF8CString("two"); + const void* items[] = { s1, s2 }; + auto* arr = WKArrayCreate(items, 2); + Require(WKGetTypeID(arr) == WKArrayGetTypeID()); + Require(WKArrayGetSize(arr) == 2); + Require(WKStringIsEqual(WKArrayGetItemAtIndex(arr, 0), s1)); + Require(WKStringIsEqual(WKArrayGetItemAtIndex(arr, 1), s2)); + + bool caught = false; + try { + WKArrayGetItemAtIndex(arr, 2); + } catch (const std::out_of_range&) { + caught = true; + } + Require(caught); + + auto* mutArr = WKMutableArrayCreate(); + Require(WKArrayGetSize(mutArr) == 0); + WKArrayAppendItem(mutArr, s1); + WKArrayAppendItem(mutArr, s2); + Require(WKArrayGetSize(mutArr) == 2); + WKArrayRemoveItemAtIndex(mutArr, 0); + Require(WKArrayGetSize(mutArr) == 1); + Require(WKStringIsEqual(WKArrayGetItemAtIndex(mutArr, 0), s2)); + + auto* adoptS = WKStringCreateWithUTF8CString("adopted"); + const void* adoptItems[] = { adoptS }; + auto* adoptArr = WKArrayCreateAdoptingValues(adoptItems, 1); + Require(WKArrayGetSize(adoptArr) == 1); + + WKRelease(adoptArr); + WKRelease(mutArr); + WKRelease(arr); + WKRelease(s1); + WKRelease(s2); +} + +static void TestDictionary() { + auto* k1 = WKStringCreateWithUTF8CString("key1"); + auto* k2 = WKStringCreateWithUTF8CString("key2"); + auto* v1 = WKStringCreateWithUTF8CString("val1"); + auto* v2 = WKStringCreateWithUTF8CString("val2"); + const void* keys[] = { k1, k2 }; + const void* vals[] = { v1, v2 }; + auto* dict = WKDictionaryCreate(keys, vals, 2); + Require(WKGetTypeID(dict) == WKDictionaryGetTypeID()); + Require(WKDictionaryGetSize(dict) == 2); + Require(WKStringIsEqual(WKDictionaryGetItemForKey(dict, k1), v1)); + Require(WKStringIsEqual(WKDictionaryGetItemForKey(dict, k2), v2)); + + auto* nonExistent = WKStringCreateWithUTF8CString("other"); + Require(WKDictionaryGetItemForKey(dict, nonExistent) == nullptr); + + auto* allKeys = WKDictionaryCopyKeys(dict); + Require(WKArrayGetSize(allKeys) == 2); + WKRelease(allKeys); + + auto* mutDict = WKMutableDictionaryCreate(); + Require(WKDictionarySetItem(mutDict, k1, v1) == true); + Require(WKDictionarySetItem(mutDict, k1, v2) == false); + Require(WKDictionaryGetSize(mutDict) == 1); + Require(WKStringIsEqual(WKDictionaryGetItemForKey(mutDict, k1), v2)); + + WKRelease(mutDict); + WKRelease(dict); + WKRelease(nonExistent); + WKRelease(k1); + WKRelease(k2); + WKRelease(v1); + WKRelease(v2); +} + +static void TestData() { + const unsigned char raw[] = { 0xDE, 0xAD, 0xBE, 0xEF }; + auto* d = WKDataCreate(raw, sizeof(raw)); + Require(WKGetTypeID(d) == WKDataGetTypeID()); + Require(WKDataGetSize(d) == 4); + Require(std::memcmp(WKDataGetBytes(d), raw, 4) == 0); + WKRelease(d); +} + +static void TestNumbers() { + auto* b = WKBooleanCreate(true); + Require(WKGetTypeID(b) == WKBooleanGetTypeID()); + Require(WKBooleanGetValue(b) == true); + WKRelease(b); + + auto* dbl = WKDoubleCreate(3.14159); + Require(WKGetTypeID(dbl) == WKDoubleGetTypeID()); + Require(WKDoubleGetValue(dbl) == 3.14159); + WKRelease(dbl); + + auto* u = WKUInt64Create(123456789012345ULL); + Require(WKGetTypeID(u) == WKUInt64GetTypeID()); + Require(WKUInt64GetValue(u) == 123456789012345ULL); + WKRelease(u); +} + +static void TestGeometry() { + WKPoint pt{ 10.5, 20.25 }; + auto* pObj = WKPointCreate(pt); + Require(WKGetTypeID(pObj) == WKPointGetTypeID()); + WKPoint pVal = WKPointGetValue(pObj); + Require(pVal.x == 10.5 && pVal.y == 20.25); + WKRelease(pObj); + + WKSize sz{ 100.0, 200.0 }; + auto* sObj = WKSizeCreate(sz); + Require(WKGetTypeID(sObj) == WKSizeGetTypeID()); + WKSize sVal = WKSizeGetValue(sObj); + Require(sVal.width == 100.0 && sVal.height == 200.0); + WKRelease(sObj); + + WKRect rc{ { 1.0, 2.0 }, { 30.0, 40.0 } }; + auto* rObj = WKRectCreate(rc); + Require(WKGetTypeID(rObj) == WKRectGetTypeID()); + WKRect rVal = WKRectGetValue(rObj); + Require(rVal.origin.x == 1.0 && rVal.origin.y == 2.0); + Require(rVal.size.width == 30.0 && rVal.size.height == 40.0); + WKRelease(rObj); +} + +static void TestUserContentURLPattern() { + auto* patStr = WKStringCreateWithUTF8CString("http://*.example.com/foo/*"); + auto* pat = WKUserContentURLPatternCreate(patStr); + Require(WKGetTypeID(pat) == WKUserContentURLPatternGetTypeID()); + Require(WKUserContentURLPatternIsValid(pat)); + Require(WKUserContentURLPatternMatchesSubdomains(pat)); + + auto* schemeStr = WKUserContentURLPatternCopyScheme(pat); + Require(WKStringIsEqualToUTF8CString(schemeStr, "http")); + WKRelease(schemeStr); + + auto* hostStr = WKUserContentURLPatternCopyHost(pat); + Require(WKStringIsEqualToUTF8CString(hostStr, "example.com")); + WKRelease(hostStr); + + auto* invalidPat = WKUserContentURLPatternCreate(WKStringCreateWithUTF8CString("not_a_valid_pattern")); + Require(!WKUserContentURLPatternIsValid(invalidPat)); + auto* invalidScheme = WKUserContentURLPatternCopyScheme(invalidPat); + Require(WKStringIsEmpty(invalidScheme)); + WKRelease(invalidScheme); + WKRelease(invalidPat); + + auto* missingHost = WKUserContentURLPatternCreate(WKStringCreateWithUTF8CString("http://")); + Require(!WKUserContentURLPatternIsValid(missingHost)); + auto* missingHostScheme = WKUserContentURLPatternCopyScheme(missingHost); + Require(WKStringIsEqualToUTF8CString(missingHostScheme, "http")); + WKRelease(missingHostScheme); + WKRelease(missingHost); + + auto* allHosts = WKUserContentURLPatternCreate(WKStringCreateWithUTF8CString("https://*/")); + Require(WKUserContentURLPatternIsValid(allHosts)); + Require(WKUserContentURLPatternMatchesSubdomains(allHosts)); + auto* allHostsHost = WKUserContentURLPatternCopyHost(allHosts); + Require(WKStringIsEmpty(allHostsHost)); + WKRelease(allHostsHost); + WKRelease(allHosts); + + auto* fileLocalhost = WKUserContentURLPatternCreate(WKStringCreateWithUTF8CString("FILE://LocalHost/x")); + Require(WKUserContentURLPatternIsValid(fileLocalhost)); + Require(!WKUserContentURLPatternMatchesSubdomains(fileLocalhost)); + auto* fileHost = WKUserContentURLPatternCopyHost(fileLocalhost); + Require(WKStringIsEmpty(fileHost)); + WKRelease(fileHost); + WKRelease(fileLocalhost); + + auto* fileNoHost = WKUserContentURLPatternCreate(WKStringCreateWithUTF8CString("file:///")); + Require(WKUserContentURLPatternIsValid(fileNoHost)); + WKRelease(fileNoHost); + + auto* innerStar = WKUserContentURLPatternCreate(WKStringCreateWithUTF8CString("http://a.*.com/")); + Require(!WKUserContentURLPatternIsValid(innerStar)); + auto* innerStarHost = WKUserContentURLPatternCopyHost(innerStar); + Require(WKStringIsEqualToUTF8CString(innerStarHost, "a.*.com")); + WKRelease(innerStarHost); + WKRelease(innerStar); + + WKRelease(pat); + WKRelease(patStr); +} + +static void TestURLRequestResponse() { + Require(WKURLRequestGetTypeID() == 23); + Require(WKURLResponseGetTypeID() == 24); +} + +static void TestError() { + Require(WKErrorGetTypeID() == 10); + auto* domain = WKErrorCopyWKErrorDomain(); + Require(WKStringIsEqualToUTF8CString(domain, "WebKitErrorDomain")); + WKRelease(domain); +} + +static void TestCertificateInfo() { + Require(WKCertificateInfoGetTypeID() == 0); + Require(WKCertificateInfoCreateWithCertficateChain(nullptr) == nullptr); + Require(WKCertificateInfoGetVerificationError(nullptr) == 0); + Require(WKCertificateInfoCopyVerificationErrorDescription(nullptr) == nullptr); + Require(WKCertificateInfoGetCertificateChainSize(nullptr) == 0); + Require(WKCertificateInfoCopyCertificateAtIndex(nullptr, 0) == nullptr); +} + +int main() { + TestTypeIDs(); + TestRetainRelease(); + TestStrings(); + TestURL(); + TestArray(); + TestDictionary(); + TestData(); + TestNumbers(); + TestGeometry(); + TestUserContentURLPattern(); + TestURLRequestResponse(); + TestError(); + TestCertificateInfo(); + std::printf("All libSceNKWebKit Base tests passed!\n"); + return 0; +} diff --git a/core/libs/prx/libSceNKWebKit/tests/Config.cpp b/core/libs/prx/libSceNKWebKit/tests/Config.cpp new file mode 100644 index 0000000000..d632923f29 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/tests/Config.cpp @@ -0,0 +1,417 @@ +#include "prx/libc/include/general/VabiMacros.hpp" +#include "prx/libSceNKWebKit/libSceNKWebKit.hpp" +#include "prx/libSceNKWebKit/src/Object.hpp" +#include "prx/libSceNKWebKit/src/Types.hpp" + +#include +#include +#include +#include +#include + +static void Check(bool value, int line) { + if (!value) { + std::fprintf(stderr, "check failed at line %d\n", line); + std::abort(); + } +} +#define Require(value) Check((value), __LINE__) + +extern "C" { +} + +static void TestContextConfiguration() { + const void* config = WKContextConfigurationCreate(); + Require(config != nullptr); + Require(WKGetTypeID(config) == static_cast(NKWebKit::ObjectType::ProcessPoolConfiguration)); + + Require(!WKContextConfigurationAlwaysKeepAndReuseSwappedProcesses(config)); + WKContextConfigurationSetAlwaysKeepAndReuseSwappedProcesses(config, true); + Require(WKContextConfigurationAlwaysKeepAndReuseSwappedProcesses(config)); + + Require(!WKContextConfigurationFullySynchronousModeIsAllowedForTesting(config)); + WKContextConfigurationSetFullySynchronousModeIsAllowedForTesting(config, true); + Require(WKContextConfigurationFullySynchronousModeIsAllowedForTesting(config)); + + Require(!WKContextConfigurationIgnoreSynchronousMessagingTimeoutsForTesting(config)); + WKContextConfigurationSetIgnoreSynchronousMessagingTimeoutsForTesting(config, true); + Require(WKContextConfigurationIgnoreSynchronousMessagingTimeoutsForTesting(config)); + + Require(!WKContextConfigurationPrewarmsProcessesAutomatically(config)); + WKContextConfigurationSetPrewarmsProcessesAutomatically(config, true); + Require(WKContextConfigurationPrewarmsProcessesAutomatically(config)); + + Require(!WKContextConfigurationProcessSwapsOnNavigation(config)); + WKContextConfigurationSetProcessSwapsOnNavigation(config, true); + Require(WKContextConfigurationProcessSwapsOnNavigation(config)); + + Require(!WKContextConfigurationUsesWebProcessCache(config)); + WKContextConfigurationSetUsesWebProcessCache(config, true); + Require(WKContextConfigurationUsesWebProcessCache(config)); + + Require(WKContextConfigurationGetUserId(config) == -1); + WKContextConfigurationSetUserId(config, 100); + Require(WKContextConfigurationGetUserId(config) == 100); + + Require(WKContextConfigurationDiskCacheSizeOverride(config) == 0); + WKContextConfigurationSetDiskCacheSizeOverride(config, 1024); + + Require(WKContextConfigurationCopyApplicationCacheDirectory(config) == nullptr); + Require(WKContextConfigurationCopyDiskCacheDirectory(config) == nullptr); + Require(WKContextConfigurationCopyIndexedDBDatabaseDirectory(config) == nullptr); + Require(WKContextConfigurationCopyLocalStorageDirectory(config) == nullptr); + Require(WKContextConfigurationCopyWebSQLDatabaseDirectory(config) == nullptr); + Require(WKContextConfigurationCopyMediaKeysStorageDirectory(config) == nullptr); + Require(WKContextConfigurationCopyResourceLoadStatisticsDirectory(config) == nullptr); + + WKContextConfigurationSetApplicationCacheDirectory(config, nullptr); + WKContextConfigurationSetDiskCacheDirectory(config, nullptr); + WKContextConfigurationSetIndexedDBDatabaseDirectory(config, nullptr); + WKContextConfigurationSetLocalStorageDirectory(config, nullptr); + WKContextConfigurationSetWebSQLDatabaseDirectory(config, nullptr); + WKContextConfigurationSetMediaKeysStorageDirectory(config, nullptr); + WKContextConfigurationSetResourceLoadStatisticsDirectory(config, nullptr); + WKContextConfigurationSetShouldCaptureAudioInUIProcess(config, true); + WKContextConfigurationSetShouldConfigureJSCForTesting(config, true); + + const void* classes = WKContextConfigurationCopyCustomClassesForParameterCoder(config); + Require(classes != nullptr); + Require(WKGetTypeID(classes) == static_cast(NKWebKit::ObjectType::Array)); + Require(static_cast(classes)->elements.empty()); + WKRelease(classes); + WKContextConfigurationSetCustomClassesForParameterCoder(config, nullptr); + + const void* langs = WKContextConfigurationCopyOverrideLanguages(config); + Require(langs != nullptr); + Require(static_cast(langs)->elements.empty()); + WKRelease(langs); + + auto langArray = NKWebKit::Make(); + langArray->elements.push_back(NKWebKit::String::FromUtf8("en-US")); + langArray->elements.push_back(NKWebKit::String::FromUtf8("ja-JP")); + WKContextConfigurationSetOverrideLanguages(config, NKWebKit::ToRef(langArray)); + + const void* copiedLangs = WKContextConfigurationCopyOverrideLanguages(config); + Require(copiedLangs != nullptr); + const auto* copiedArray = static_cast(copiedLangs); + Require(copiedArray->elements.size() == 2); + Require(static_cast(copiedArray->elements[0].Get())->Utf8() == "en-US"); + Require(static_cast(copiedArray->elements[1].Get())->Utf8() == "ja-JP"); + WKRelease(copiedLangs); + + const void* bundleStr = NKWebKit::ToRef(NKWebKit::String::FromUtf8("/app0/bundle.prx")); + WKContextConfigurationSetInjectedBundlePath(config, bundleStr); + const void* copiedBundle = WKContextConfigurationCopyInjectedBundlePath(config); + Require(copiedBundle != nullptr); + Require(static_cast(copiedBundle)->Utf8() == "/app0/bundle.prx"); + WKRelease(bundleStr); + WKRelease(copiedBundle); + + const void* webStr = NKWebKit::ToRef(NKWebKit::String::FromUtf8("/system/webprocess.elf")); + WKContextConfigurationSetWebProcessPath(config, webStr); + const void* copiedWeb = WKContextConfigurationCopyWebProcessPath(config); + Require(copiedWeb != nullptr); + Require(static_cast(copiedWeb)->Utf8() == "/system/webprocess.elf"); + WKRelease(webStr); + WKRelease(copiedWeb); + + const void* netStr = NKWebKit::ToRef(NKWebKit::String::FromUtf8("/system/netprocess.elf")); + WKContextConfigurationSetNetworkProcessPath(config, netStr); + const void* copiedNet = WKContextConfigurationCopyNetworkProcessPath(config); + Require(copiedNet != nullptr); + Require(static_cast(copiedNet)->Utf8() == "/system/netprocess.elf"); + WKRelease(netStr); + WKRelease(copiedNet); + + WKRelease(config); + + const void* legacyConfig = WKContextConfigurationCreateWithLegacyOptions(); + Require(legacyConfig != nullptr); + Require(WKGetTypeID(legacyConfig) == static_cast(NKWebKit::ObjectType::ProcessPoolConfiguration)); + WKRelease(legacyConfig); +} + +static void TestPageConfiguration() { + const void* config = WKPageConfigurationCreate(); + Require(config != nullptr); + Require(WKGetTypeID(config) == static_cast(NKWebKit::ObjectType::PageConfiguration)); + + Require(WKPageConfigurationGetContext(config) == nullptr); + Require(WKPageConfigurationGetPageGroup(config) == nullptr); + Require(WKPageConfigurationGetUserContentController(config) == nullptr); + Require(WKPageConfigurationGetPreferences(config) == nullptr); + Require(WKPageConfigurationGetRelatedPage(config) == nullptr); + Require(WKPageConfigurationGetWebsiteDataStore(config) == nullptr); + + const void* idStr = NKWebKit::ToRef(NKWebKit::String::FromUtf8("group1")); + const void* pageGroup = WKPageGroupCreateWithIdentifier(idStr); + WKRelease(idStr); + WKPageConfigurationSetPageGroup(config, pageGroup); + Require(WKPageConfigurationGetPageGroup(config) == pageGroup); + + const void* ucc = WKUserContentControllerCreate(); + WKPageConfigurationSetUserContentController(config, ucc); + Require(WKPageConfigurationGetUserContentController(config) == ucc); + + WKPageConfigurationSetInitialCapitalizationEnabled(config, true); + WKPageConfigurationSetBackgroundCPULimit(config, 0.75); + + WKRelease(ucc); + WKRelease(pageGroup); + WKRelease(config); +} + +static void TestWebsiteDataStoreConfiguration() { + const void* config = WKWebsiteDataStoreConfigurationCreate(); + Require(config != nullptr); + Require(WKGetTypeID(config) == static_cast(NKWebKit::ObjectType::WebsiteDataStoreConfiguration)); + + Require(WKWebsiteDataStoreConfigurationGetPerOriginStorageQuota(config) == 1000ULL * 1024ULL * 1024ULL); + WKWebsiteDataStoreConfigurationSetPerOriginStorageQuota(config, 2048); + Require(WKWebsiteDataStoreConfigurationGetPerOriginStorageQuota(config) == 2048); + + Require(!WKWebsiteDataStoreConfigurationGetNetworkCacheSpeculativeValidationEnabled(config)); + WKWebsiteDataStoreConfigurationSetNetworkCacheSpeculativeValidationEnabled(config, true); + Require(WKWebsiteDataStoreConfigurationGetNetworkCacheSpeculativeValidationEnabled(config)); + + Require(!WKWebsiteDataStoreConfigurationGetTestingSessionEnabled(config)); + WKWebsiteDataStoreConfigurationSetTestingSessionEnabled(config, true); + Require(WKWebsiteDataStoreConfigurationGetTestingSessionEnabled(config)); + + Require(WKWebsiteDataStoreConfigurationGetStaleWhileRevalidateEnabled(config)); + WKWebsiteDataStoreConfigurationSetStaleWhileRevalidateEnabled(config, false); + Require(!WKWebsiteDataStoreConfigurationGetStaleWhileRevalidateEnabled(config)); + + const void* pathStr = NKWebKit::ToRef(NKWebKit::String::FromUtf8("/data/cache")); + WKWebsiteDataStoreConfigurationSetApplicationCacheDirectory(config, pathStr); + const void* c1 = WKWebsiteDataStoreConfigurationCopyApplicationCacheDirectory(config); + Require(static_cast(c1)->Utf8() == "/data/cache"); + WKRelease(c1); + + WKWebsiteDataStoreConfigurationSetNetworkCacheDirectory(config, pathStr); + const void* c2 = WKWebsiteDataStoreConfigurationCopyNetworkCacheDirectory(config); + Require(static_cast(c2)->Utf8() == "/data/cache"); + WKRelease(c2); + + WKWebsiteDataStoreConfigurationSetIndexedDBDatabaseDirectory(config, pathStr); + const void* c3 = WKWebsiteDataStoreConfigurationCopyIndexedDBDatabaseDirectory(config); + Require(static_cast(c3)->Utf8() == "/data/cache"); + WKRelease(c3); + + WKWebsiteDataStoreConfigurationSetLocalStorageDirectory(config, pathStr); + const void* c4 = WKWebsiteDataStoreConfigurationCopyLocalStorageDirectory(config); + Require(static_cast(c4)->Utf8() == "/data/cache"); + WKRelease(c4); + + WKWebsiteDataStoreConfigurationSetWebSQLDatabaseDirectory(config, pathStr); + const void* c5 = WKWebsiteDataStoreConfigurationCopyWebSQLDatabaseDirectory(config); + Require(static_cast(c5)->Utf8() == "/data/cache"); + WKRelease(c5); + + WKWebsiteDataStoreConfigurationSetCacheStorageDirectory(config, pathStr); + const void* c6 = WKWebsiteDataStoreConfigurationCopyCacheStorageDirectory(config); + Require(static_cast(c6)->Utf8() == "/data/cache"); + WKRelease(c6); + + WKWebsiteDataStoreConfigurationSetMediaKeysStorageDirectory(config, pathStr); + const void* c7 = WKWebsiteDataStoreConfigurationCopyMediaKeysStorageDirectory(config); + Require(static_cast(c7)->Utf8() == "/data/cache"); + WKRelease(c7); + + WKWebsiteDataStoreConfigurationSetResourceLoadStatisticsDirectory(config, pathStr); + const void* c8 = WKWebsiteDataStoreConfigurationCopyResourceLoadStatisticsDirectory(config); + Require(static_cast(c8)->Utf8() == "/data/cache"); + WKRelease(c8); + + WKWebsiteDataStoreConfigurationSetServiceWorkerRegistrationDirectory(config, pathStr); + const void* c9 = WKWebsiteDataStoreConfigurationCopyServiceWorkerRegistrationDirectory(config); + Require(static_cast(c9)->Utf8() == "/data/cache"); + WKRelease(c9); + + WKWebsiteDataStoreConfigurationSetCookieStorageFile(config, pathStr); + const void* c10 = WKWebsiteDataStoreConfigurationCopyCookieStorageFile(config); + Require(static_cast(c10)->Utf8() == "/data/cache"); + WKRelease(c10); + + WKRelease(pathStr); + WKRelease(config); +} + +static void TestWebsitePolicies() { + const void* policies = WKWebsitePoliciesCreate(); + Require(policies != nullptr); + Require(WKGetTypeID(policies) == static_cast(NKWebKit::ObjectType::WebsitePolicies)); + + Require(WKWebsitePoliciesGetContentBlockersEnabled(policies)); + WKWebsitePoliciesSetContentBlockersEnabled(policies, false); + Require(!WKWebsitePoliciesGetContentBlockersEnabled(policies)); + + Require(WKWebsitePoliciesGetAllowedAutoplayQuirks(policies) == 0); + WKWebsitePoliciesSetAllowedAutoplayQuirks(policies, 7); + Require(WKWebsitePoliciesGetAllowedAutoplayQuirks(policies) == 7); + + Require(WKWebsitePoliciesGetAutoplayPolicy(policies) == 0); + WKWebsitePoliciesSetAutoplayPolicy(policies, 2); + Require(WKWebsitePoliciesGetAutoplayPolicy(policies) == 2); + + Require(WKWebsitePoliciesGetPopUpPolicy(policies) == 0); + WKWebsitePoliciesSetPopUpPolicy(policies, 1); + Require(WKWebsitePoliciesGetPopUpPolicy(policies) == 1); + + Require(WKWebsitePoliciesGetDataStore(policies) == nullptr); + Require(WKWebsitePoliciesCopyCustomHeaderFields(policies) == nullptr); + WKWebsitePoliciesSetCustomHeaderFields(policies, nullptr); + + WKRelease(policies); +} + +static void TestUserScript() { + const void* src = NKWebKit::ToRef(NKWebKit::String::FromUtf8("console.log('hi');")); + const void* script = WKUserScriptCreateWithSource(src, 1, true); + Require(script != nullptr); + Require(WKGetTypeID(script) == static_cast(NKWebKit::ObjectType::UserScript)); + + const void* copiedSrc = WKUserScriptCopySource(script); + Require(static_cast(copiedSrc)->Utf8() == "console.log('hi');"); + WKRelease(copiedSrc); + + Require(WKUserScriptGetInjectionTime(script) == 1); + Require(WKUserScriptGetMainFrameOnly(script) == true); + + WKRelease(src); + WKRelease(script); +} + +static void TestUserContentController() { + const void* ucc = WKUserContentControllerCreate(); + Require(ucc != nullptr); + Require(WKGetTypeID(ucc) == static_cast(NKWebKit::ObjectType::UserContentController)); + + const void* scripts = WKUserContentControllerCopyUserScripts(ucc); + Require(static_cast(scripts)->elements.empty()); + WKRelease(scripts); + + const void* src = NKWebKit::ToRef(NKWebKit::String::FromUtf8("script1")); + const void* s1 = WKUserScriptCreateWithSource(src, 0, false); + WKRelease(src); + WKUserContentControllerAddUserScript(ucc, s1); + + const void* scripts2 = WKUserContentControllerCopyUserScripts(ucc); + Require(static_cast(scripts2)->elements.size() == 1); + WKRelease(scripts2); + + WKUserContentControllerRemoveAllUserScripts(ucc); + const void* scripts3 = WKUserContentControllerCopyUserScripts(ucc); + Require(static_cast(scripts3)->elements.empty()); + WKRelease(scripts3); + + WKUserContentControllerRemoveAllUserContentFilters(ucc); + + WKRelease(s1); + WKRelease(ucc); +} + +static void TestCredential() { + const void* u = NKWebKit::ToRef(NKWebKit::String::FromUtf8("user1")); + const void* p = NKWebKit::ToRef(NKWebKit::String::FromUtf8("pass1")); + const void* cred = WKCredentialCreate(u, p, 2); + Require(cred != nullptr); + Require(WKGetTypeID(cred) == static_cast(NKWebKit::ObjectType::Credential)); + + const void* copiedU = WKCredentialCopyUser(cred); + Require(static_cast(copiedU)->Utf8() == "user1"); + WKRelease(copiedU); + + Require(WKCredentialCreateWithCertificateInfo(nullptr) == nullptr); + + WKRelease(u); + WKRelease(p); + WKRelease(cred); +} + +static void TestGeolocationPosition() { + const void* p1 = WKGeolocationPositionCreate(100.0, 35.68, 139.76, 5.0); + Require(p1 != nullptr); + Require(WKGetTypeID(p1) == static_cast(NKWebKit::ObjectType::GeolocationPosition)); + + const void* p2 = WKGeolocationPositionCreate_b(200.0, 35.68, 139.76, 5.0, true, 50.0, true, 2.0, true, 180.0, true, 10.0); + Require(p2 != nullptr); + Require(WKGetTypeID(p2) == static_cast(NKWebKit::ObjectType::GeolocationPosition)); + + const void* p3 = WKGeolocationPositionCreate_c(300.0, 35.68, 139.76, 5.0, true, 50.0, true, 2.0, true, 180.0, true, 10.0, true, 3.0); + Require(p3 != nullptr); + Require(WKGetTypeID(p3) == static_cast(NKWebKit::ObjectType::GeolocationPosition)); + + WKRelease(p1); + WKRelease(p2); + WKRelease(p3); +} + +static void TestPageGroup() { + const void* id = NKWebKit::ToRef(NKWebKit::String::FromUtf8("group_test")); + const void* group = WKPageGroupCreateWithIdentifier(id); + WKRelease(id); + Require(group != nullptr); + Require(WKGetTypeID(group) == static_cast(NKWebKit::ObjectType::PageGroup)); + + Require(WKPageGroupGetPreferences(group) == nullptr); + + const void* ucc = WKPageGroupGetUserContentController(group); + Require(ucc != nullptr); + Require(WKGetTypeID(ucc) == static_cast(NKWebKit::ObjectType::UserContentController)); + + const void* src = NKWebKit::ToRef(NKWebKit::String::FromUtf8("body { color: red; }")); + WKPageGroupAddUserStyleSheet(group, src, nullptr, nullptr, nullptr, 0); + WKPageGroupRemoveAllUserStyleSheets(group); + + const void* jssrc = NKWebKit::ToRef(NKWebKit::String::FromUtf8("var x = 1;")); + WKPageGroupAddUserScript(group, jssrc, nullptr, nullptr, nullptr, 0, 0); + WKPageGroupAddUserScript(group, jssrc, nullptr, nullptr, nullptr, 1, 0); + const void* scripts = WKUserContentControllerCopyUserScripts(ucc); + const auto* list = static_cast(scripts); + Require(list->elements.size() == 2); + Require(!WKUserScriptGetMainFrameOnly(list->elements[0].Get())); + Require(WKUserScriptGetMainFrameOnly(list->elements[1].Get())); + WKRelease(scripts); + + WKPageGroupRemoveAllUserScripts(group); + const void* scripts2 = WKUserContentControllerCopyUserScripts(ucc); + Require(static_cast(scripts2)->elements.empty()); + WKRelease(scripts2); + + WKRelease(src); + WKRelease(jssrc); + WKRelease(group); +} + +static void TestStringCopiesFollowWebKit() { + const void* config = WKContextConfigurationCreate(); + const void* unset = WKContextConfigurationCopyInjectedBundlePath(config); + Require(unset != nullptr); + Require(!static_cast(unset)->null); + Require(static_cast(unset)->characters.empty()); + WKRelease(unset); + bool threw = false; + try { + WKContextConfigurationSetInjectedBundlePath(config, nullptr); + } catch (const std::invalid_argument&) { + threw = true; + } + Require(threw); + WKRelease(config); +} + +int main() { + TestContextConfiguration(); + TestPageConfiguration(); + TestWebsiteDataStoreConfiguration(); + TestWebsitePolicies(); + TestUserScript(); + TestUserContentController(); + TestCredential(); + TestGeolocationPosition(); + TestPageGroup(); + TestStringCopiesFollowWebKit(); + std::puts("All config tests passed!"); + return 0; +} diff --git a/core/libs/prx/libSceNKWebKit/tests/Jsc.cpp b/core/libs/prx/libSceNKWebKit/tests/Jsc.cpp new file mode 100644 index 0000000000..aa2d65520c --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/tests/Jsc.cpp @@ -0,0 +1,807 @@ +#include "../src/Jsc.hpp" +#include "prx/libSceNKWebKit/libSceNKWebKit.hpp" +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceJsc/include/Api.hpp" +#include +#include +#include +#include +#include +#include +#include + +using namespace NKWebKit; + +namespace { + +void Require(bool condition) { + if (!condition) std::abort(); +} + +struct ScopedJsString { + JSStringRef ref = nullptr; + explicit ScopedJsString(const char* utf8) : ref(JSStringCreateWithUTF8CString_nid_postfix(utf8)) {} + explicit ScopedJsString(JSStringRef r) : ref(r) {} + ~ScopedJsString() { + if (ref) JSStringRelease_nid_postfix(ref); + } + operator JSStringRef() const { return ref; } +}; + +JSValueRef EvalUtf8(JSContextRef ctx, const char* code, JSValueRef* exception = nullptr) { + ScopedJsString script(code); + return JSEvaluateScript(ctx, script, nullptr, nullptr, 1, exception); +} + +struct ClassTestState { + std::vector initOrder; + std::vector finalizeOrder; + double staticVal = 10.0; + double dynamicVal = 77.0; + bool dynamicDeleted = false; + bool throwOnGet = false; + bool throwOnSet = false; +}; + +void APS5_VABI BaseInitCallback(JSContextRef ctx, JSObjectRef object) { + (void)ctx; + auto* state = static_cast(JSObjectGetPrivate(object)); + if (state) state->initOrder.push_back(1); +} + +void APS5_VABI BaseFinalizeCallback(JSObjectRef object) { + auto* state = static_cast(JSObjectGetPrivate(object)); + if (state) state->finalizeOrder.push_back(1); +} + +void APS5_VABI DerivedInitCallback(JSContextRef ctx, JSObjectRef object) { + (void)ctx; + auto* state = static_cast(JSObjectGetPrivate(object)); + if (state) state->initOrder.push_back(2); +} + +void APS5_VABI DerivedFinalizeCallback(JSObjectRef object) { + auto* state = static_cast(JSObjectGetPrivate(object)); + if (state) state->finalizeOrder.push_back(2); +} + +JSValueRef APS5_VABI StaticValueGetter(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef* exception) { + (void)propertyName; + (void)exception; + auto* state = static_cast(JSObjectGetPrivate(object)); + return JSValueMakeNumber(ctx, state ? state->staticVal : 0.0); +} + +bool APS5_VABI StaticValueSetter(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef value, JSValueRef* exception) { + (void)propertyName; + auto* state = static_cast(JSObjectGetPrivate(object)); + if (!state) return false; + state->staticVal = JSValueToNumber(ctx, value, exception); + return true; +} + +JSValueRef APS5_VABI StaticReadOnlyGetter(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef* exception) { + (void)object; + (void)propertyName; + (void)exception; + return JSValueMakeNumber(ctx, 999.0); +} + +JSValueRef APS5_VABI StaticMultiplyMethod(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, std::size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { + (void)function; + auto* state = static_cast(JSObjectGetPrivate(thisObject)); + const double factor = argumentCount > 0 ? JSValueToNumber(ctx, arguments[0], exception) : 1.0; + return JSValueMakeNumber(ctx, (state ? state->staticVal : 0.0) * factor); +} + +bool APS5_VABI DynamicHasProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName) { + (void)ctx; + auto* state = static_cast(JSObjectGetPrivate(object)); + if (!state || state->dynamicDeleted) return false; + return JSStringIsEqualToUTF8CString(propertyName, "dynProp") || JSStringIsEqualToUTF8CString(propertyName, "throwProp"); +} + +JSValueRef APS5_VABI DynamicGetProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef* exception) { + auto* state = static_cast(JSObjectGetPrivate(object)); + if (!state || state->dynamicDeleted) return nullptr; + if (JSStringIsEqualToUTF8CString(propertyName, "throwProp") || state->throwOnGet) { + ScopedJsString msg("getProperty error"); + JSValueRef arg = EvalUtf8(ctx, "'getProperty error'"); + *exception = JSObjectMakeError(ctx, 1, &arg, nullptr); + return nullptr; + } + if (JSStringIsEqualToUTF8CString(propertyName, "dynProp")) { + return JSValueMakeNumber(ctx, state->dynamicVal); + } + return nullptr; +} + +bool APS5_VABI DynamicSetProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef value, JSValueRef* exception) { + auto* state = static_cast(JSObjectGetPrivate(object)); + if (!state) return false; + if (state->throwOnSet) { + JSValueRef arg = EvalUtf8(ctx, "'setProperty error'"); + *exception = JSObjectMakeError(ctx, 1, &arg, nullptr); + return false; + } + if (JSStringIsEqualToUTF8CString(propertyName, "dynProp")) { + state->dynamicVal = JSValueToNumber(ctx, value, exception); + state->dynamicDeleted = false; + return true; + } + return false; +} + +bool APS5_VABI DynamicDeleteProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef* exception) { + (void)ctx; + (void)exception; + auto* state = static_cast(JSObjectGetPrivate(object)); + if (!state) return false; + if (JSStringIsEqualToUTF8CString(propertyName, "dynProp")) { + state->dynamicDeleted = true; + return true; + } + return false; +} + +void APS5_VABI DynamicGetPropertyNames(JSContextRef ctx, JSObjectRef object, JSPropertyNameAccumulatorRef propertyNames) { + (void)ctx; + auto* state = static_cast(JSObjectGetPrivate(object)); + if (state && !state->dynamicDeleted) { + ScopedJsString dynName("dynProp"); + JSPropertyNameAccumulatorAddName(propertyNames, dynName); + } + ScopedJsString extraName("enumeratedExtra"); + JSPropertyNameAccumulatorAddName(propertyNames, extraName); +} + +JSValueRef APS5_VABI ClassCallAsFunction(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, std::size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { + (void)thisObject; + auto* state = static_cast(JSObjectGetPrivate(function)); + double sum = state ? state->staticVal : 0.0; + for (std::size_t i = 0; i < argumentCount; ++i) { + sum += JSValueToNumber(ctx, arguments[i], exception); + } + return JSValueMakeNumber(ctx, sum); +} + +JSObjectRef APS5_VABI ClassCallAsConstructor(JSContextRef ctx, JSObjectRef constructor, std::size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { + (void)constructor; + JSObjectRef obj = JSObjectMake(ctx, nullptr, nullptr); + const double v = argumentCount > 0 ? JSValueToNumber(ctx, arguments[0], exception) : 0.0; + ScopedJsString prop("constructedVal"); + JSObjectSetProperty(ctx, obj, prop, JSValueMakeNumber(ctx, v), kJSPropertyAttributeNone, exception); + return obj; +} + +bool APS5_VABI ClassHasInstance(JSContextRef ctx, JSObjectRef constructor, JSValueRef possibleInstance, JSValueRef* exception) { + (void)constructor; + if (!JSValueIsObject(ctx, possibleInstance)) return false; + JSObjectRef obj = JSValueToObject(ctx, possibleInstance, exception); + ScopedJsString marker("customInstanceMarker"); + return JSObjectHasProperty(ctx, obj, marker); +} + +JSValueRef APS5_VABI ClassConvertToType(JSContextRef ctx, JSObjectRef object, JSType type, JSValueRef* exception) { + (void)exception; + auto* state = static_cast(JSObjectGetPrivate(object)); + if (type == kJSTypeString) { + return EvalUtf8(ctx, "'converted-string'"); + } + return JSValueMakeNumber(ctx, state ? state->staticVal + 5.0 : 5.0); +} + +JSValueRef APS5_VABI StandaloneCallbackFunction(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, std::size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { + Require(function != nullptr); + Require(thisObject != nullptr); + if (argumentCount == 1 && JSValueIsBoolean(ctx, arguments[0]) && !JSValueToBoolean(ctx, arguments[0])) { + JSValueRef msg = EvalUtf8(ctx, "'callback failure'"); + *exception = JSObjectMakeError(ctx, 1, &msg, nullptr); + return nullptr; + } + double prod = 1.0; + for (std::size_t i = 0; i < argumentCount; ++i) { + prod *= JSValueToNumber(ctx, arguments[i], exception); + } + return JSValueMakeNumber(ctx, prod); +} + +void APS5_VABI NoCopyDeallocator(void* bytes, void* deallocatorContext) { + auto* count = static_cast(deallocatorContext); + if (count) ++(*count); + std::free(bytes); +} + +void APS5_VABI HeapFinalizerCallback(JSContextGroupRef group, void* userData) { + (void)group; + auto* counter = static_cast(userData); + if (counter) ++(*counter); +} + +struct ConstraintState { + JSObjectRef parentObj = nullptr; + JSObjectRef childObj = nullptr; +}; + +void APS5_VABI MarkingConstraintCallback(JSMarker* marker, void* userData) { + auto* st = static_cast(userData); + if (!st || !marker) return; + if (st->parentObj && marker->IsMarked(marker, st->parentObj) && st->childObj) { + marker->Mark(marker, st->childObj); + } +} + +void APS5_VABI WeakMapDestroyed(OpaqueJSWeakObjectMap* map, void* data) { + (void)map; + auto* flag = static_cast(data); + if (flag) *flag = true; +} + +bool APS5_VABI ShouldTerminateWatchdog(JSContextRef ctx, void* context) { + Require(ctx != nullptr); + auto* calls = static_cast(context); + if (!calls) return true; + ++(*calls); + return *calls >= 2; +} + +JSValueRef APS5_VABI UnhandledRejectionHandler(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, std::size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { + (void)function; + (void)thisObject; + (void)exception; + if (argumentCount >= 2) { + ScopedJsString key("lastUnhandledReason"); + JSObjectSetProperty(ctx, JSContextGetGlobalObject(ctx), key, arguments[1], kJSPropertyAttributeNone, nullptr); + } + return JSValueMakeUndefined(ctx); +} + +void TestStringsAndOpaqueDestructors() { + const std::uint16_t units[] = {'H', 'i', '!'}; + GuestJSString* str = JSStringCreateWithCharactersNoCopy(units, 3); + Require(str != nullptr); + Require(JSStringGetLength_nid_postfix(str) == 3); + Require(JSStringIsEqualToUTF8CString(str, "Hi!")); + JSStringRelease_nid_postfix(str); + + GuestJSString* empty = JSStringCreateWithCharactersNoCopy(nullptr, 0); + Require(empty != nullptr); + Require(JSStringGetLength_nid_postfix(empty) == 0); + JSStringRelease_nid_postfix(empty); + + alignas(GuestJSString) unsigned char storage1[sizeof(GuestJSString)]; + auto* s1 = new (storage1) GuestJSString(); + s1->characters = {'a', 0}; + _ZN14OpaqueJSStringD1Ev(s1); + + alignas(GuestJSString) unsigned char storage2[sizeof(GuestJSString)]; + auto* s2 = new (storage2) GuestJSString(); + s2->characters = {'b', 0}; + _ZN14OpaqueJSStringD2Ev(s2); + + JSClassDefinition def = kJSClassDefinitionEmpty; + def.className = "InPlaceClass"; + JSClassRef c1 = JSClassCreate(&def); + _ZN13OpaqueJSClassD1Ev(c1); + operator delete(c1); + + JSClassRef c2 = JSClassCreate(&def); + _ZN13OpaqueJSClassD2Ev(c2); + operator delete(c2); +} + +void TestContextsAndScripts() { + Require(JSRemoteInspectorGetInspectionEnabledByDefault()); + JSRemoteInspectorSetInspectionEnabledByDefault(false); + Require(!JSRemoteInspectorGetInspectionEnabledByDefault()); + + JSContextGroupRef group = JSContextGroupCreate(); + Require(group != nullptr); + Require(JSContextGroupRetain(group) == group); + JSContextGroupRelease(group); + + JSGlobalContextRef ctx = JSGlobalContextCreateInGroup(group, nullptr); + Require(ctx != nullptr); + Require(JSContextGetGroup(ctx) == group); + Require(JSContextGetGlobalContext(ctx) == ctx); + Require(!JSGlobalContextGetRemoteInspectionEnabled(ctx)); + JSGlobalContextSetRemoteInspectionEnabled(ctx, true); + Require(JSGlobalContextGetRemoteInspectionEnabled(ctx)); + JSRemoteInspectorSetInspectionEnabledByDefault(true); + + Require(JSGlobalContextGetIncludesNativeCallStackWhenReportingExceptions(ctx)); + JSGlobalContextSetIncludesNativeCallStackWhenReportingExceptions(ctx, false); + Require(!JSGlobalContextGetIncludesNativeCallStackWhenReportingExceptions(ctx)); + + Require(JSGlobalContextCopyName(ctx) == nullptr); + ScopedJsString ctxName("MainPS5Context"); + JSGlobalContextSetName(ctx, ctxName); + JSStringRef copiedName = JSGlobalContextCopyName(ctx); + Require(copiedName != nullptr); + Require(JSStringIsEqualToUTF8CString(copiedName, "MainPS5Context")); + JSStringRelease_nid_postfix(copiedName); + JSGlobalContextSetName(ctx, nullptr); + Require(JSGlobalContextCopyName(ctx) == nullptr); + + ScopedJsString validSyntax("let a = 40 + 2;"); + JSValueRef exc = nullptr; + Require(JSCheckScriptSyntax(ctx, validSyntax, nullptr, 1, &exc)); + Require(exc == nullptr); + + ScopedJsString badSyntax("function ( {"); + Require(!JSCheckScriptSyntax(ctx, badSyntax, nullptr, 1, &exc)); + Require(exc != nullptr); + + const char* asciiSrc = "this.customMul * 3"; + JSStringRef errMsg = nullptr; + int errLine = 0; + ScopedJsString scriptUrl("test://ascii.js"); + JSScriptRef script = JSScriptCreateReferencingImmortalASCIIText(group, scriptUrl, 10, asciiSrc, std::strlen(asciiSrc), &errMsg, &errLine); + Require(script != nullptr); + Require(errMsg == nullptr); + JSScriptRetain(script); + JSScriptRelease(script); + + const char nonAsciiSrc[] = {'1', '+', '\x80', '\0'}; + Require(JSScriptCreateReferencingImmortalASCIIText(group, scriptUrl, 1, nonAsciiSrc, 3, nullptr, nullptr) == nullptr); + + const char* badScriptSrc = "\n\nlet x = ;"; + JSScriptRef badScript = JSScriptCreateReferencingImmortalASCIIText(group, scriptUrl, 10, badScriptSrc, std::strlen(badScriptSrc), &errMsg, &errLine); + Require(badScript == nullptr); + Require(errMsg != nullptr); + Require(errLine == 12); + JSStringRelease_nid_postfix(errMsg); + + JSObjectRef customThis = JSObjectMake(ctx, nullptr, nullptr); + ScopedJsString mulKey("customMul"); + JSObjectSetProperty(ctx, customThis, mulKey, JSValueMakeNumber(ctx, 14.0), kJSPropertyAttributeNone, nullptr); + exc = nullptr; + JSValueRef evalRes = JSScriptEvaluate(ctx, script, customThis, &exc); + Require(exc == nullptr); + Require(evalRes != nullptr); + Require(JSValueToNumber(ctx, evalRes, nullptr) == 42.0); + + ScopedJsString fromStrSrc("21 * 2"); + JSScriptRef strScript = JSScriptCreateFromString(group, scriptUrl, 1, fromStrSrc, nullptr, nullptr); + Require(strScript != nullptr); + JSValueRef strEvalRes = JSScriptEvaluate(ctx, strScript, nullptr, &exc); + Require(JSValueToNumber(ctx, strEvalRes, nullptr) == 42.0); + + JSGlobalContextRef otherGroupCtx = JSGlobalContextCreate(nullptr); + Require(JSScriptEvaluate(otherGroupCtx, strScript, nullptr, nullptr) == nullptr); + JSGlobalContextRelease(otherGroupCtx); + + JSScriptRelease(strScript); + JSScriptRelease(script); + JSGlobalContextRetain(ctx); + JSGlobalContextRelease(ctx); + JSGlobalContextRelease(ctx); + JSContextGroupRelease(group); +} + +void TestValuesAndObjects() { + JSGlobalContextRef ctx = JSGlobalContextCreate(nullptr); + JSValueRef undefVal = JSValueMakeUndefined(ctx); + JSValueRef nullVal = JSValueMakeNull(ctx); + JSValueRef trueVal = JSValueMakeBoolean(ctx, true); + JSValueRef falseVal = JSValueMakeBoolean(ctx, false); + JSValueRef numVal = JSValueMakeNumber(ctx, 123.5); + ScopedJsString symDesc("mySym"); + JSValueRef symVal = JSValueMakeSymbol(ctx, symDesc); + JSValueRef strVal = EvalUtf8(ctx, "'hello world'"); + + Require(JSValueGetType(ctx, undefVal) == kJSTypeUndefined && JSValueIsUndefined(ctx, undefVal)); + Require(JSValueGetType(ctx, nullVal) == kJSTypeNull && JSValueIsNull(ctx, nullVal)); + Require(JSValueGetType(ctx, trueVal) == kJSTypeBoolean && JSValueIsBoolean(ctx, trueVal) && JSValueToBoolean(ctx, trueVal)); + Require(JSValueGetType(ctx, falseVal) == kJSTypeBoolean && !JSValueToBoolean(ctx, falseVal)); + Require(JSValueGetType(ctx, numVal) == kJSTypeNumber && JSValueIsNumber(ctx, numVal) && JSValueToNumber(ctx, numVal, nullptr) == 123.5); + Require(JSValueGetType(ctx, symVal) == kJSTypeSymbol && JSValueIsSymbol(ctx, symVal)); + Require(JSValueGetType(ctx, strVal) == kJSTypeString && JSValueIsString(ctx, strVal)); + + JSValueRef looseNum = EvalUtf8(ctx, "'123.5'"); + Require(JSValueIsEqual(ctx, numVal, looseNum, nullptr)); + Require(!JSValueIsStrictEqual(ctx, numVal, looseNum)); + Require(JSValueIsStrictEqual(ctx, numVal, JSValueMakeNumber(ctx, 123.5))); + + ScopedJsString jsonInput("{\"a\":10,\"b\":[true,\"ok\"]}"); + JSValueRef parsedJson = JSValueMakeFromJSONString(ctx, jsonInput); + Require(parsedJson != nullptr && JSValueIsObject(ctx, parsedJson)); + ScopedJsString badJson("{bad"); + Require(JSValueMakeFromJSONString(ctx, badJson) == nullptr); + JSStringRef jsonOut = JSValueCreateJSONString(ctx, parsedJson, 0, nullptr); + Require(jsonOut != nullptr); + Require(JSStringIsEqualToUTF8CString(jsonOut, "{\"a\":10,\"b\":[true,\"ok\"]}")); + JSStringRelease_nid_postfix(jsonOut); + Require(JSValueCreateJSONString(ctx, undefVal, 0, nullptr) == nullptr); + + JSValueRef arrItems[2] = {JSValueMakeNumber(ctx, 10.0), JSValueMakeNumber(ctx, 20.0)}; + JSObjectRef arr = JSObjectMakeArray(ctx, 2, arrItems, nullptr); + Require(JSValueIsArray(ctx, arr)); + Require(JSValueToNumber(ctx, JSObjectGetPropertyAtIndex(ctx, arr, 1, nullptr), nullptr) == 20.0); + JSObjectSetPropertyAtIndex(ctx, arr, 2, JSValueMakeNumber(ctx, 30.0), nullptr); + Require(JSValueToNumber(ctx, JSObjectGetPropertyAtIndex(ctx, arr, 2, nullptr), nullptr) == 30.0); + + JSValueRef dateArg = JSValueMakeNumber(ctx, 1700000000000.0); + JSObjectRef dateObj = JSObjectMakeDate(ctx, 1, &dateArg, nullptr); + Require(JSValueIsDate(ctx, dateObj)); + + JSValueRef errArg = EvalUtf8(ctx, "'boom'"); + JSObjectRef errObj = JSObjectMakeError(ctx, 1, &errArg, nullptr); + ScopedJsString msgProp("message"); + JSStringRef errMsgStr = JSValueToStringCopy(ctx, JSObjectGetProperty(ctx, errObj, msgProp, nullptr), nullptr); + Require(JSStringIsEqualToUTF8CString(errMsgStr, "boom")); + JSStringRelease_nid_postfix(errMsgStr); + + JSValueRef rxArg = EvalUtf8(ctx, "'abc+'"); + JSObjectRef rxObj = JSObjectMakeRegExp(ctx, 1, &rxArg, nullptr); + Require(rxObj != nullptr); + + ScopedJsString fnName("addTwo"); + ScopedJsString p1("x"); + ScopedJsString p2("y"); + JSStringRef params[2] = {p1, p2}; + ScopedJsString fnBody("return x + y;"); + JSObjectRef jsFn = JSObjectMakeFunction(ctx, fnName, 2, params, fnBody, nullptr, 1, nullptr); + Require(jsFn != nullptr && JSObjectIsFunction(ctx, jsFn)); + JSValueRef callArgs[2] = {JSValueMakeNumber(ctx, 15.0), JSValueMakeNumber(ctx, 27.0)}; + JSValueRef callRes = JSObjectCallAsFunction(ctx, jsFn, nullptr, 2, callArgs, nullptr); + Require(JSValueToNumber(ctx, callRes, nullptr) == 42.0); + + ScopedJsString cbName("mulCb"); + JSObjectRef cbFn = JSObjectMakeFunctionWithCallback(ctx, cbName, &StandaloneCallbackFunction); + Require(JSObjectIsFunction(ctx, cbFn) && !JSObjectIsConstructor(ctx, cbFn)); + JSValueRef cbRes = JSObjectCallAsFunction(ctx, cbFn, nullptr, 2, callArgs, nullptr); + Require(JSValueToNumber(ctx, cbRes, nullptr) == 405.0); + JSValueRef failArg = JSValueMakeBoolean(ctx, false); + JSValueRef cbExc = nullptr; + Require(JSObjectCallAsFunction(ctx, cbFn, nullptr, 1, &failArg, &cbExc) == nullptr); + Require(cbExc != nullptr); + + JSObjectRef propObj = JSObjectMake(ctx, nullptr, nullptr); + ScopedJsString roKey("readOnlyKey"); + JSObjectSetProperty(ctx, propObj, roKey, JSValueMakeNumber(ctx, 55.0), kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete, nullptr); + JSObjectSetProperty(ctx, propObj, roKey, JSValueMakeNumber(ctx, 88.0), kJSPropertyAttributeNone, nullptr); + Require(JSValueToNumber(ctx, JSObjectGetProperty(ctx, propObj, roKey, nullptr), nullptr) == 55.0); + Require(!JSObjectDeleteProperty(ctx, propObj, roKey, nullptr)); + + JSObjectSetPropertyForKey(ctx, propObj, symVal, JSValueMakeNumber(ctx, 777.0), kJSPropertyAttributeNone, nullptr); + Require(JSValueToNumber(ctx, JSObjectGetPropertyForKey(ctx, propObj, symVal, nullptr), nullptr) == 777.0); + Require(JSObjectDeletePropertyForKey(ctx, propObj, symVal, nullptr)); + Require(JSValueIsUndefined(ctx, JSObjectGetPropertyForKey(ctx, propObj, symVal, nullptr))); + + JSObjectRef protoObj = JSObjectMake(ctx, nullptr, nullptr); + ScopedJsString inheritedKey("inheritedVal"); + JSObjectSetProperty(ctx, protoObj, inheritedKey, JSValueMakeNumber(ctx, 321.0), kJSPropertyAttributeNone, nullptr); + JSObjectSetPrototype(ctx, propObj, protoObj); + Require(JSValueIsStrictEqual(ctx, JSObjectGetPrototype(ctx, propObj), protoObj)); + Require(JSObjectHasProperty(ctx, propObj, inheritedKey)); + Require(JSValueToNumber(ctx, JSObjectGetProperty(ctx, propObj, inheritedKey, nullptr), nullptr) == 321.0); + + JSObjectRef proxyObj = JSValueToObject(ctx, EvalUtf8(ctx, "new Proxy({k: 9}, {})"), nullptr); + JSObjectRef proxyTarget = JSObjectGetProxyTarget(proxyObj); + Require(proxyTarget != nullptr); + ScopedJsString kProp("k"); + Require(JSValueToNumber(ctx, JSObjectGetProperty(ctx, proxyTarget, kProp, nullptr), nullptr) == 9.0); + Require(JSObjectGetGlobalContext(proxyTarget) == ctx); + + JSObjectRef resolveFn = nullptr; + JSObjectRef rejectFn = nullptr; + JSObjectRef promise = JSObjectMakeDeferredPromise(ctx, &resolveFn, &rejectFn, nullptr); + Require(promise != nullptr && resolveFn != nullptr && rejectFn != nullptr); + ScopedJsString promProp("testPromise"); + JSObjectSetProperty(ctx, JSContextGetGlobalObject(ctx), promProp, promise, kJSPropertyAttributeNone, nullptr); + EvalUtf8(ctx, "var resolvedOut = 0; testPromise.then(v => { resolvedOut = v + 1; });"); + JSValueRef resolveVal = JSValueMakeNumber(ctx, 41.0); + JSObjectCallAsFunction(ctx, resolveFn, nullptr, 1, &resolveVal, nullptr); + Require(JSValueToNumber(ctx, EvalUtf8(ctx, "resolvedOut"), nullptr) == 42.0); + + JSObjectRef rejHandler = JSObjectMakeFunctionWithCallback(ctx, nullptr, &UnhandledRejectionHandler); + JSGlobalContextSetUnhandledRejectionCallback(ctx, rejHandler, nullptr); + JSObjectRef rejResolve = nullptr; + JSObjectRef rejReject = nullptr; + JSObjectMakeDeferredPromise(ctx, &rejResolve, &rejReject, nullptr); + JSValueRef reasonVal = JSValueMakeNumber(ctx, 503.0); + JSObjectCallAsFunction(ctx, rejReject, nullptr, 1, &reasonVal, nullptr); + Require(JSValueToNumber(ctx, EvalUtf8(ctx, "lastUnhandledReason"), nullptr) == 503.0); + + JSGlobalContextRelease(ctx); +} + +void TestClassesAndCallbacks() { + JSGlobalContextRef ctx = JSGlobalContextCreate(nullptr); + + JSStaticValue baseStaticValues[] = { + {"staticVal", &StaticValueGetter, &StaticValueSetter, kJSPropertyAttributeDontDelete}, + {"readOnlyStatic", &StaticReadOnlyGetter, nullptr, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontEnum}, + {nullptr, nullptr, nullptr, 0}, + }; + JSStaticFunction baseStaticFunctions[] = { + {"multiply", &StaticMultiplyMethod, kJSPropertyAttributeNone}, + {nullptr, nullptr, 0}, + }; + + JSClassDefinition baseDef = kJSClassDefinitionEmpty; + baseDef.className = "BaseWidget"; + baseDef.staticValues = baseStaticValues; + baseDef.staticFunctions = baseStaticFunctions; + baseDef.initialize = &BaseInitCallback; + baseDef.finalize = &BaseFinalizeCallback; + JSClassRef baseClass = JSClassCreate(&baseDef); + Require(baseClass != nullptr); + Require(JSClassRetain(baseClass) == baseClass); + JSClassRelease(baseClass); + + JSClassDefinition derivedDef = kJSClassDefinitionEmpty; + derivedDef.className = "DerivedWidget"; + derivedDef.parentClass = baseClass; + derivedDef.initialize = &DerivedInitCallback; + derivedDef.finalize = &DerivedFinalizeCallback; + derivedDef.hasProperty = &DynamicHasProperty; + derivedDef.getProperty = &DynamicGetProperty; + derivedDef.setProperty = &DynamicSetProperty; + derivedDef.deleteProperty = &DynamicDeleteProperty; + derivedDef.getPropertyNames = &DynamicGetPropertyNames; + derivedDef.callAsFunction = &ClassCallAsFunction; + derivedDef.callAsConstructor = &ClassCallAsConstructor; + derivedDef.hasInstance = &ClassHasInstance; + derivedDef.convertToType = &ClassConvertToType; + JSClassRef derivedClass = JSClassCreate(&derivedDef); + Require(derivedClass != nullptr); + + ClassTestState state; + JSObjectRef widget = JSObjectMake(ctx, derivedClass, &state); + Require(widget != nullptr); + Require(JSObjectGetPrivate(widget) == &state); + Require(state.initOrder.size() == 2 && state.initOrder[0] == 1 && state.initOrder[1] == 2); + Require(JSValueIsObjectOfClass(ctx, widget, derivedClass)); + Require(JSValueIsObjectOfClass(ctx, widget, baseClass)); + + ScopedJsString privKey("secret"); + Require(JSObjectGetPrivateProperty(ctx, widget, privKey) == nullptr); + Require(JSObjectSetPrivateProperty(ctx, widget, privKey, JSValueMakeNumber(ctx, 1337.0))); + Require(JSValueToNumber(ctx, JSObjectGetPrivateProperty(ctx, widget, privKey), nullptr) == 1337.0); + Require(JSObjectDeletePrivateProperty(ctx, widget, privKey)); + Require(JSObjectGetPrivateProperty(ctx, widget, privKey) == nullptr); + + ScopedJsString widgetGlobal("widget"); + JSObjectSetProperty(ctx, JSContextGetGlobalObject(ctx), widgetGlobal, widget, kJSPropertyAttributeNone, nullptr); + + Require(JSValueToNumber(ctx, EvalUtf8(ctx, "widget.staticVal"), nullptr) == 10.0); + EvalUtf8(ctx, "widget.staticVal = 25;"); + Require(state.staticVal == 25.0); + Require(JSValueToNumber(ctx, EvalUtf8(ctx, "widget.multiply(3)"), nullptr) == 75.0); + EvalUtf8(ctx, "widget.readOnlyStatic = 0;"); + Require(JSValueToNumber(ctx, EvalUtf8(ctx, "widget.readOnlyStatic"), nullptr) == 999.0); + Require(!JSValueToBoolean(ctx, EvalUtf8(ctx, "delete widget.staticVal"))); + + Require(JSValueToBoolean(ctx, EvalUtf8(ctx, "'dynProp' in widget"))); + Require(JSValueToNumber(ctx, EvalUtf8(ctx, "widget.dynProp"), nullptr) == 77.0); + EvalUtf8(ctx, "widget.dynProp = 88;"); + Require(state.dynamicVal == 88.0); + Require(JSValueToBoolean(ctx, EvalUtf8(ctx, "delete widget.dynProp"))); + Require(!JSValueToBoolean(ctx, EvalUtf8(ctx, "'dynProp' in widget"))); + EvalUtf8(ctx, "widget.dynProp = 99;"); + Require(JSValueToBoolean(ctx, EvalUtf8(ctx, "'dynProp' in widget"))); + + JSValueRef getExc = nullptr; + ScopedJsString throwProp("throwProp"); + Require(JSObjectGetProperty(ctx, widget, throwProp, &getExc) == nullptr); + Require(getExc != nullptr); + + state.throwOnSet = true; + JSValueRef setExc = nullptr; + ScopedJsString dynProp("dynProp"); + JSObjectSetProperty(ctx, widget, dynProp, JSValueMakeNumber(ctx, 1.0), kJSPropertyAttributeNone, &setExc); + Require(setExc != nullptr); + state.throwOnSet = false; + + JSPropertyNameArrayRef propNames = JSObjectCopyPropertyNames(ctx, widget); + Require(propNames != nullptr); + Require(JSPropertyNameArrayRetain(propNames) == propNames); + JSPropertyNameArrayRelease(propNames); + const std::size_t nameCount = JSPropertyNameArrayGetCount(propNames); + bool sawStaticVal = false; + bool sawMultiply = false; + bool sawDynProp = false; + bool sawEnumeratedExtra = false; + bool sawReadOnlyStatic = false; + for (std::size_t i = 0; i < nameCount; ++i) { + JSStringRef name = JSPropertyNameArrayGetNameAtIndex(propNames, i); + if (JSStringIsEqualToUTF8CString(name, "staticVal")) sawStaticVal = true; + if (JSStringIsEqualToUTF8CString(name, "multiply")) sawMultiply = true; + if (JSStringIsEqualToUTF8CString(name, "dynProp")) sawDynProp = true; + if (JSStringIsEqualToUTF8CString(name, "enumeratedExtra")) sawEnumeratedExtra = true; + if (JSStringIsEqualToUTF8CString(name, "readOnlyStatic")) sawReadOnlyStatic = true; + } + Require(sawStaticVal && sawMultiply && sawDynProp && sawEnumeratedExtra && !sawReadOnlyStatic); + JSPropertyNameArrayRelease(propNames); + + Require(JSObjectIsFunction(ctx, widget) && JSObjectIsConstructor(ctx, widget)); + Require(JSValueToNumber(ctx, EvalUtf8(ctx, "widget(5, 10)"), nullptr) == 40.0); + Require(JSValueToNumber(ctx, EvalUtf8(ctx, "(new widget(123)).constructedVal"), nullptr) == 123.0); + Require(JSValueToBoolean(ctx, EvalUtf8(ctx, "({customInstanceMarker: 1}) instanceof widget"))); + Require(!JSValueToBoolean(ctx, EvalUtf8(ctx, "({}) instanceof widget"))); + Require(JSValueToNumber(ctx, EvalUtf8(ctx, "+widget"), nullptr) == 30.0); + JSStringRef toStr = JSValueToStringCopy(ctx, EvalUtf8(ctx, "`${widget}`"), nullptr); + Require(JSStringIsEqualToUTF8CString(toStr, "converted-string")); + JSStringRelease_nid_postfix(toStr); + + JSObjectRef ctorObj = JSObjectMakeConstructor(ctx, baseClass, nullptr); + Require(JSObjectIsConstructor(ctx, ctorObj) && !JSObjectIsFunction(ctx, ctorObj)); + JSObjectRef constructedBase = JSObjectCallAsConstructor(ctx, ctorObj, 0, nullptr, nullptr); + Require(JSValueIsObjectOfClass(ctx, constructedBase, baseClass)); + + JSClassDefinition noProtoDef = kJSClassDefinitionEmpty; + noProtoDef.attributes = kJSClassAttributeNoAutomaticPrototype; + noProtoDef.staticFunctions = baseStaticFunctions; + JSClassRef noProtoClass = JSClassCreate(&noProtoDef); + JSObjectRef npObj = JSObjectMake(ctx, noProtoClass, &state); + JSObjectRef plainObj = JSObjectMake(ctx, nullptr, nullptr); + Require(JSValueIsStrictEqual(ctx, JSObjectGetPrototype(ctx, npObj), JSObjectGetPrototype(ctx, plainObj))); + JSClassRelease(noProtoClass); + + JSObjectDeleteProperty(ctx, JSContextGetGlobalObject(ctx), widgetGlobal, nullptr); + JSGarbageCollect(ctx); + Require(state.finalizeOrder.size() == 2 && state.finalizeOrder[0] == 2 && state.finalizeOrder[1] == 1); + + JSClassRelease(derivedClass); + JSClassRelease(baseClass); + JSGlobalContextRelease(ctx); + + JSGlobalContextRef customGlobalCtx = JSGlobalContextCreate(baseClass = JSClassCreate(&baseDef)); + ClassTestState globalState; + globalState.staticVal = 50.0; + JSObjectSetPrivate(JSContextGetGlobalObject(customGlobalCtx), &globalState); + Require(JSValueToNumber(customGlobalCtx, EvalUtf8(customGlobalCtx, "multiply(2)"), nullptr) == 100.0); + JSGlobalContextRelease(customGlobalCtx); + JSClassRelease(baseClass); +} + +void TestTypedArraysAndArrayBuffers() { + JSGlobalContextRef ctx = JSGlobalContextCreate(nullptr); + + JSObjectRef u32Arr = JSObjectMakeTypedArray(ctx, kJSTypedArrayTypeUint32Array, 4, nullptr); + Require(u32Arr != nullptr); + Require(JSValueGetTypedArrayType(ctx, u32Arr, nullptr) == kJSTypedArrayTypeUint32Array); + Require(JSObjectGetTypedArrayLength(ctx, u32Arr, nullptr) == 4); + Require(JSObjectGetTypedArrayByteLength(ctx, u32Arr, nullptr) == 16); + Require(JSObjectGetTypedArrayByteOffset(ctx, u32Arr, nullptr) == 0); + auto* u32Ptr = static_cast(JSObjectGetTypedArrayBytesPtr(ctx, u32Arr, nullptr)); + Require(u32Ptr != nullptr); + u32Ptr[0] = 11; + u32Ptr[1] = 22; + u32Ptr[2] = 33; + u32Ptr[3] = 44; + Require(JSValueToNumber(ctx, JSObjectGetPropertyAtIndex(ctx, u32Arr, 2, nullptr), nullptr) == 33.0); + + JSObjectRef backingBuf = JSObjectGetTypedArrayBuffer(ctx, u32Arr, nullptr); + Require(backingBuf != nullptr); + Require(JSValueGetTypedArrayType(ctx, backingBuf, nullptr) == kJSTypedArrayTypeArrayBuffer); + Require(JSObjectGetArrayBufferBytesPtr(ctx, backingBuf, nullptr) == u32Ptr); + Require(JSObjectGetArrayBufferByteLength(ctx, backingBuf, nullptr) == 16); + + JSObjectRef subView = JSObjectMakeTypedArrayWithArrayBufferAndOffset(ctx, kJSTypedArrayTypeUint16Array, backingBuf, 4, 4, nullptr); + Require(subView != nullptr); + Require(JSObjectGetTypedArrayByteOffset(ctx, subView, nullptr) == 4); + Require(JSObjectGetTypedArrayLength(ctx, subView, nullptr) == 4); + Require(JSObjectGetTypedArrayByteLength(ctx, subView, nullptr) == 8); + Require(JSObjectGetTypedArrayBytesPtr(ctx, subView, nullptr) == u32Ptr); + + JSObjectRef fullView = JSObjectMakeTypedArrayWithArrayBuffer(ctx, kJSTypedArrayTypeUint8Array, backingBuf, nullptr); + Require(fullView != nullptr); + Require(JSObjectGetTypedArrayLength(ctx, fullView, nullptr) == 16); + + int deallocCount = 0; + auto* rawBytes = static_cast(std::malloc(sizeof(float) * 2)); + rawBytes[0] = 1.5f; + rawBytes[1] = -2.5f; + JSObjectRef noCopyTa = JSObjectMakeTypedArrayWithBytesNoCopy(ctx, kJSTypedArrayTypeFloat32Array, rawBytes, sizeof(float) * 2, &NoCopyDeallocator, &deallocCount, nullptr); + Require(noCopyTa != nullptr); + Require(JSObjectGetTypedArrayBytesPtr(ctx, noCopyTa, nullptr) == rawBytes); + Require(JSValueToNumber(ctx, JSObjectGetPropertyAtIndex(ctx, noCopyTa, 0, nullptr), nullptr) == 1.5); + Require(JSValueToNumber(ctx, JSObjectGetPropertyAtIndex(ctx, noCopyTa, 1, nullptr), nullptr) == -2.5); + + JSGarbageCollect(ctx); + Require(deallocCount == 1); + + JSGlobalContextRelease(ctx); +} + +void TestGcProtectWeakAndWatchdog() { + JSContextGroupRef group = JSContextGroupCreate(); + JSGlobalContextRef ctx = JSGlobalContextCreateInGroup(group, nullptr); + + int heapFinalizerCount = 0; + JSContextGroupAddHeapFinalizer(group, &HeapFinalizerCallback, &heapFinalizerCount); + JSReportExtraMemoryCost(ctx, 4096); + JSDisableGCTimer(); + + JSClassDefinition def = kJSClassDefinitionEmpty; + def.className = "TrackedObj"; + def.finalize = &BaseFinalizeCallback; + JSClassRef cls = JSClassCreate(&def); + + ClassTestState st1; + JSObjectRef obj1 = JSObjectMake(ctx, cls, &st1); + JSWeakRef weak1 = JSWeakCreate(group, obj1); + JSWeakRetain(weak1); + JSWeakRelease(weak1); + Require(JSWeakGetObject(weak1) == obj1); + + bool mapDestroyed = false; + auto* weakMap = new OpaqueJSWeakObjectMap(); + weakMap->group = const_cast(group); + weakMap->privateData = &mapDestroyed; + weakMap->destroyedCallback = &WeakMapDestroyed; + const_cast(group)->weakMaps.push_back(weakMap); + + int key1 = 1; + int key2 = 2; + JSWeakObjectMapSet(ctx, weakMap, &key1, obj1); + Require(JSWeakObjectMapGet(ctx, weakMap, &key1) == obj1); + JSWeakObjectMapSet(ctx, weakMap, &key2, obj1); + Require(JSWeakObjectMapRemove(ctx, weakMap, &key2)); + Require(!JSWeakObjectMapRemove(ctx, weakMap, &key2)); + + JSValueProtect(ctx, obj1); + JSGarbageCollect(ctx); + Require(heapFinalizerCount == 1); + Require(st1.finalizeOrder.empty()); + Require(JSWeakGetObject(weak1) == obj1); + Require(JSWeakObjectMapGet(ctx, weakMap, &key1) == obj1); + + ConstraintState cst; + ClassTestState st2; + cst.parentObj = obj1; + cst.childObj = JSObjectMake(ctx, cls, &st2); + JSContextGroupAddMarkingConstraint(group, &MarkingConstraintCallback, &cst); + + JSSynchronousEdenCollectForDebugging(ctx); + Require(st2.finalizeOrder.empty()); + + JSObjectRef stats = JSGetMemoryUsageStatistics(ctx); + Require(stats != nullptr); + ScopedJsString extraMemKey("extraMemorySize"); + Require(JSValueToNumber(ctx, JSObjectGetProperty(ctx, stats, extraMemKey, nullptr), nullptr) == 4096.0); + + JSValueUnprotect(ctx, obj1); + JSSynchronousGarbageCollectForDebugging(ctx); + Require(st1.finalizeOrder.size() == 1); + Require(st2.finalizeOrder.size() == 1); + Require(JSWeakGetObject(weak1) == nullptr); + Require(JSWeakObjectMapGet(ctx, weakMap, &key1) == nullptr); + + JSContextGroupRemoveHeapFinalizer(group, &HeapFinalizerCallback, &heapFinalizerCount); + const int beforeFinalizerCount = heapFinalizerCount; + JSGarbageCollect(ctx); + Require(heapFinalizerCount == beforeFinalizerCount); + + delete weakMap; + Require(mapDestroyed); + JSWeakRelease(weak1); + JSClassRelease(cls); + + int watchdogCalls = 0; + JSContextGroupSetExecutionTimeLimit(group, 0.001, &ShouldTerminateWatchdog, &watchdogCalls); + JSValueRef loopExc = nullptr; + JSValueRef loopRes = EvalUtf8(ctx, "while (true) {}", &loopExc); + Require(loopRes == nullptr); + Require(watchdogCalls == 2); + JSContextGroupClearExecutionTimeLimit(group); + Require(JSValueToNumber(ctx, EvalUtf8(ctx, "2 + 2"), nullptr) == 4.0); + + JSGlobalContextRelease(ctx); + JSContextGroupRelease(group); +} + +} // namespace + +int main() { + TestStringsAndOpaqueDestructors(); + TestContextsAndScripts(); + TestValuesAndObjects(); + TestClassesAndCallbacks(); + TestTypedArraysAndArrayBuffers(); + TestGcProtectWeakAndWatchdog(); + return 0; +} diff --git a/core/libs/prx/libSceNKWebKit/tests/Preferences.cpp b/core/libs/prx/libSceNKWebKit/tests/Preferences.cpp new file mode 100644 index 0000000000..03d0d4aa1b --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/tests/Preferences.cpp @@ -0,0 +1,570 @@ +#include "prx/libSceNKWebKit/src/Preferences.hpp" +#include "prx/libSceNKWebKit/libSceNKWebKit.hpp" +#include "prx/libSceNKWebKit/src/Types.hpp" +#include +#include +#include +#include +#include +#include +#include + +namespace { + +void Check(bool value, int line) { + if (!value) { + std::fprintf(stderr, "WKPreferences check failed at line %d\n", line); + std::abort(); + } +} + +#define Require(value) Check((value), __LINE__) + +template +void RequireThrows(TFunction function) { + bool threw = false; + try { + function(); + } catch (const TException&) { + threw = true; + } + Require(threw); +} + +NKWebKit::Retained Create() { + return NKWebKit::Retained::Adopt( + NKWebKit::Cast(WKPreferencesCreate(), __func__)); +} + +NKWebKit::Retained Copy(const void* preferences) { + return NKWebKit::Retained::Adopt( + NKWebKit::Cast(WKPreferencesCreateCopy(preferences), __func__)); +} + +NKWebKit::Retained StringCopy(const void* string) { + return NKWebKit::Retained::Adopt(NKWebKit::Cast(string, __func__)); +} + +struct BooleanCase { + const char* name; + void (APS5_VABI *set)(const void*, bool); + bool (APS5_VABI *get)(const void*); + bool initial; +}; + +const BooleanCase booleanCases[]{ + {"AVFoundationEnabled", WKPreferencesSetAVFoundationEnabled, WKPreferencesGetAVFoundationEnabled, false}, + {"AcceleratedCompositingEnabled", WKPreferencesSetAcceleratedCompositingEnabled, WKPreferencesGetAcceleratedCompositingEnabled, true}, + {"AcceleratedDrawingEnabled", WKPreferencesSetAcceleratedDrawingEnabled, WKPreferencesGetAcceleratedDrawingEnabled, true}, + {"AggressiveTileRetentionEnabled", WKPreferencesSetAggressiveTileRetentionEnabled, WKPreferencesGetAggressiveTileRetentionEnabled, false}, + {"AllowCrossOriginSubresourcesToAskForCredentials", WKPreferencesSetAllowCrossOriginSubresourcesToAskForCredentials, WKPreferencesGetAllowCrossOriginSubresourcesToAskForCredentials, false}, + {"AllowMediaContentTypesRequiringHardwareSupportAsFallback", WKPreferencesSetAllowMediaContentTypesRequiringHardwareSupportAsFallback, WKPreferencesGetAllowMediaContentTypesRequiringHardwareSupportAsFallback, false}, + {"AllowsAirPlayForMediaPlayback", WKPreferencesSetAllowsAirPlayForMediaPlayback, WKPreferencesGetAllowsAirPlayForMediaPlayback, false}, + {"AllowsPictureInPictureMediaPlayback", WKPreferencesSetAllowsPictureInPictureMediaPlayback, WKPreferencesGetAllowsPictureInPictureMediaPlayback, false}, + {"AnimatedImageAsyncDecodingEnabled", WKPreferencesSetAnimatedImageAsyncDecodingEnabled, WKPreferencesGetAnimatedImageAsyncDecodingEnabled, true}, + {"ApplePayCapabilityDisclosureAllowed", WKPreferencesSetApplePayCapabilityDisclosureAllowed, WKPreferencesGetApplePayCapabilityDisclosureAllowed, false}, + {"ApplePayEnabled", WKPreferencesSetApplePayEnabled, WKPreferencesGetApplePayEnabled, false}, + {"AsynchronousSpellCheckingEnabled", WKPreferencesSetAsynchronousSpellCheckingEnabled, WKPreferencesGetAsynchronousSpellCheckingEnabled, false}, + {"AttachmentElementEnabled", WKPreferencesSetAttachmentElementEnabled, WKPreferencesGetAttachmentElementEnabled, false}, + {"AudioPlaybackRequiresUserGesture", WKPreferencesSetAudioPlaybackRequiresUserGesture, WKPreferencesGetAudioPlaybackRequiresUserGesture, false}, + {"AuthorAndUserStylesEnabled", WKPreferencesSetAuthorAndUserStylesEnabled, WKPreferencesGetAuthorAndUserStylesEnabled, true}, + {"BackspaceKeyNavigationEnabled", WKPreferencesSetBackspaceKeyNavigationEnabled, WKPreferencesGetBackspaceKeyNavigationEnabled, true}, + {"BeaconAPIEnabled", WKPreferencesSetBeaconAPIEnabled, WKPreferencesGetBeaconAPIEnabled, true}, + {"CSSOMViewScrollingAPIEnabled", WKPreferencesSetCSSOMViewScrollingAPIEnabled, WKPreferencesGetCSSOMViewScrollingAPIEnabled, false}, + {"CanvasUsesAcceleratedDrawing", WKPreferencesSetCanvasUsesAcceleratedDrawing, WKPreferencesGetCanvasUsesAcceleratedDrawing, true}, + {"CaptureAudioInGPUProcessEnabled", WKPreferencesSetCaptureAudioInGPUProcessEnabled, WKPreferencesGetCaptureAudioInGPUProcessEnabled, false}, + {"CaptureAudioInUIProcessEnabled", WKPreferencesSetCaptureAudioInUIProcessEnabled, WKPreferencesGetCaptureAudioInUIProcessEnabled, false}, + {"CaptureVideoInGPUProcessEnabled", WKPreferencesSetCaptureVideoInGPUProcessEnabled, WKPreferencesGetCaptureVideoInGPUProcessEnabled, false}, + {"CaptureVideoInUIProcessEnabled", WKPreferencesSetCaptureVideoInUIProcessEnabled, WKPreferencesGetCaptureVideoInUIProcessEnabled, false}, + {"CaretBrowsingEnabled", WKPreferencesSetCaretBrowsingEnabled, WKPreferencesGetCaretBrowsingEnabled, false}, + {"ColorFilterEnabled", WKPreferencesSetColorFilterEnabled, WKPreferencesGetColorFilterEnabled, false}, + {"CompositingBordersVisible", WKPreferencesSetCompositingBordersVisible, WKPreferencesGetCompositingBordersVisible, false}, + {"CompositingRepaintCountersVisible", WKPreferencesSetCompositingRepaintCountersVisible, WKPreferencesGetCompositingRepaintCountersVisible, false}, + {"ContentChangeObserverEnabled", WKPreferencesSetContentChangeObserverEnabled, WKPreferencesGetContentChangeObserverEnabled, false}, + {"CookieEnabled", WKPreferencesSetCookieEnabled, WKPreferencesGetCookieEnabled, true}, + {"CustomPasteboardDataEnabled", WKPreferencesSetCustomPasteboardDataEnabled, WKPreferencesGetCustomPasteboardDataEnabled, false}, + {"DNSPrefetchingEnabled", WKPreferencesSetDNSPrefetchingEnabled, WKPreferencesGetDNSPrefetchingEnabled, false}, + {"DOMPasteAllowed", WKPreferencesSetDOMPasteAllowed, WKPreferencesGetDOMPasteAllowed, false}, + {"DOMTimersThrottlingEnabled", WKPreferencesSetDOMTimersThrottlingEnabled, WKPreferencesGetDOMTimersThrottlingEnabled, true}, + {"DataTransferItemsEnabled", WKPreferencesSetDataTransferItemsEnabled, WKPreferencesGetDataTransferItemsEnabled, false}, + {"DatabasesEnabled", WKPreferencesSetDatabasesEnabled, WKPreferencesGetDatabasesEnabled, true}, + {"DeveloperExtrasEnabled", WKPreferencesSetDeveloperExtrasEnabled, WKPreferencesGetDeveloperExtrasEnabled, false}, + {"DiagnosticLoggingEnabled", WKPreferencesSetDiagnosticLoggingEnabled, WKPreferencesGetDiagnosticLoggingEnabled, false}, + {"DirectoryUploadEnabled", WKPreferencesSetDirectoryUploadEnabled, WKPreferencesGetDirectoryUploadEnabled, false}, + {"DownloadAttributeEnabled", WKPreferencesSetDownloadAttributeEnabled, WKPreferencesGetDownloadAttributeEnabled, false}, + {"EnableInheritURIQueryComponent", WKPreferencesSetEnableInheritURIQueryComponent, WKPreferencesGetEnableInheritURIQueryComponent, false}, + {"EncodingDetectorEnabled", WKPreferencesSetEncodingDetectorEnabled, WKPreferencesGetEncodingDetectorEnabled, false}, + {"EnumeratingAllNetworkInterfacesEnabled", WKPreferencesSetEnumeratingAllNetworkInterfacesEnabled, WKPreferencesGetEnumeratingAllNetworkInterfacesEnabled, false}, + {"FetchAPIKeepAliveEnabled", WKPreferencesSetFetchAPIKeepAliveEnabled, WKPreferencesGetFetchAPIKeepAliveEnabled, true}, + {"FileAccessFromFileURLsAllowed", WKPreferencesSetFileAccessFromFileURLsAllowed, WKPreferencesGetFileAccessFromFileURLsAllowed, false}, + {"ForceFTPDirectoryListings", WKPreferencesSetForceFTPDirectoryListings, WKPreferencesGetForceFTPDirectoryListings, false}, + {"FrameFlatteningEnabled", WKPreferencesSetFrameFlatteningEnabled, WKPreferencesGetFrameFlatteningEnabled, false}, + {"FullScreenEnabled", WKPreferencesSetFullScreenEnabled, WKPreferencesGetFullScreenEnabled, false}, + {"GamepadsEnabled", WKPreferencesSetGamepadsEnabled, WKPreferencesGetGamepadsEnabled, false}, + {"HTTPEquivEnabled", WKPreferencesSetHTTPEquivEnabled, WKPreferencesGetHTTPEquivEnabled, true}, + {"HiddenPageCSSAnimationSuspensionEnabled", WKPreferencesSetHiddenPageCSSAnimationSuspensionEnabled, WKPreferencesGetHiddenPageCSSAnimationSuspensionEnabled, false}, + {"HiddenPageDOMTimerThrottlingAutoIncreases", WKPreferencesSetHiddenPageDOMTimerThrottlingAutoIncreases, WKPreferencesGetHiddenPageDOMTimerThrottlingAutoIncreases, false}, + {"HiddenPageDOMTimerThrottlingEnabled", WKPreferencesSetHiddenPageDOMTimerThrottlingEnabled, WKPreferencesGetHiddenPageDOMTimerThrottlingEnabled, false}, + {"HighlightAPIEnabled", WKPreferencesSetHighlightAPIEnabled, WKPreferencesGetHighlightAPIEnabled, false}, + {"HyperlinkAuditingEnabled", WKPreferencesSetHyperlinkAuditingEnabled, WKPreferencesGetHyperlinkAuditingEnabled, true}, + {"ICECandidateFilteringEnabled", WKPreferencesSetICECandidateFilteringEnabled, WKPreferencesGetICECandidateFilteringEnabled, true}, + {"ImageControlsEnabled", WKPreferencesSetImageControlsEnabled, WKPreferencesGetImageControlsEnabled, false}, + {"InlineMediaPlaybackRequiresPlaysInlineAttribute", WKPreferencesSetInlineMediaPlaybackRequiresPlaysInlineAttribute, WKPreferencesGetInlineMediaPlaybackRequiresPlaysInlineAttribute, false}, + {"InteractiveFormValidationEnabled", WKPreferencesSetInteractiveFormValidationEnabled, WKPreferencesGetInteractiveFormValidationEnabled, true}, + {"IntersectionObserverEnabled", WKPreferencesSetIntersectionObserverEnabled, WKPreferencesGetIntersectionObserverEnabled, true}, + {"InvisibleMediaAutoplayPermitted", WKPreferencesSetInvisibleMediaAutoplayPermitted, WKPreferencesGetInvisibleMediaAutoplayPermitted, true}, + {"IsAccessibilityIsolatedTreeEnabled", WKPreferencesSetIsAccessibilityIsolatedTreeEnabled, WKPreferencesGetIsAccessibilityIsolatedTreeEnabled, false}, + {"JavaScriptCanAccessClipboard", WKPreferencesSetJavaScriptCanAccessClipboard, WKPreferencesGetJavaScriptCanAccessClipboard, false}, + {"JavaScriptCanOpenWindowsAutomatically", WKPreferencesSetJavaScriptCanOpenWindowsAutomatically, WKPreferencesGetJavaScriptCanOpenWindowsAutomatically, true}, + {"JavaScriptEnabled", WKPreferencesSetJavaScriptEnabled, WKPreferencesGetJavaScriptEnabled, true}, + {"JavaScriptMarkupEnabled", WKPreferencesSetJavaScriptMarkupEnabled, WKPreferencesGetJavaScriptMarkupEnabled, true}, + {"LargeImageAsyncDecodingEnabled", WKPreferencesSetLargeImageAsyncDecodingEnabled, WKPreferencesGetLargeImageAsyncDecodingEnabled, true}, + {"LegacyEncryptedMediaAPIEnabled", WKPreferencesSetLegacyEncryptedMediaAPIEnabled, WKPreferencesGetLegacyEncryptedMediaAPIEnabled, false}, + {"LinkPreloadEnabled", WKPreferencesSetLinkPreloadEnabled, WKPreferencesGetLinkPreloadEnabled, true}, + {"LoadsImagesAutomatically", WKPreferencesSetLoadsImagesAutomatically, WKPreferencesGetLoadsImagesAutomatically, true}, + {"LocalFileContentSniffingEnabled", WKPreferencesSetLocalFileContentSniffingEnabled, WKPreferencesGetLocalFileContentSniffingEnabled, false}, + {"LocalStorageEnabled", WKPreferencesSetLocalStorageEnabled, WKPreferencesGetLocalStorageEnabled, true}, + {"LogsPageMessagesToSystemConsoleEnabled", WKPreferencesSetLogsPageMessagesToSystemConsoleEnabled, WKPreferencesGetLogsPageMessagesToSystemConsoleEnabled, false}, + {"MainContentUserGestureOverrideEnabled", WKPreferencesSetMainContentUserGestureOverrideEnabled, WKPreferencesGetMainContentUserGestureOverrideEnabled, false}, + {"MediaCapabilitiesEnabled", WKPreferencesSetMediaCapabilitiesEnabled, WKPreferencesGetMediaCapabilitiesEnabled, true}, + {"MediaCaptureRequiresSecureConnection", WKPreferencesSetMediaCaptureRequiresSecureConnection, WKPreferencesGetMediaCaptureRequiresSecureConnection, false}, + {"MediaControlsScaleWithPageZoom", WKPreferencesSetMediaControlsScaleWithPageZoom, WKPreferencesGetMediaControlsScaleWithPageZoom, true}, + {"MediaDevicesEnabled", WKPreferencesSetMediaDevicesEnabled, WKPreferencesGetMediaDevicesEnabled, false}, + {"MediaPlayable", WKPreferencesSetMediaPlayable, WKPreferencesGetMediaPlayable, true}, + {"MediaPlaybackAllowsInline", WKPreferencesSetMediaPlaybackAllowsInline, WKPreferencesGetMediaPlaybackAllowsInline, true}, + {"MediaPlaybackRequiresUserGesture", WKPreferencesSetMediaPlaybackRequiresUserGesture, WKPreferencesGetMediaPlaybackRequiresUserGesture, false}, + {"MediaPreloadingEnabled", WKPreferencesSetMediaPreloadingEnabled, WKPreferencesGetMediaPreloadingEnabled, false}, + {"MediaStreamEnabled", WKPreferencesSetMediaStreamEnabled, WKPreferencesGetMediaStreamEnabled, false}, + {"MediaUserGestureInheritsFromDocument", WKPreferencesSetMediaUserGestureInheritsFromDocument, WKPreferencesGetMediaUserGestureInheritsFromDocument, false}, + {"MenuItemElementEnabled", WKPreferencesSetMenuItemElementEnabled, WKPreferencesGetMenuItemElementEnabled, false}, + {"MetaRefreshEnabled", WKPreferencesSetMetaRefreshEnabled, WKPreferencesGetMetaRefreshEnabled, true}, + {"MockCaptureDevicesEnabled", WKPreferencesSetMockCaptureDevicesEnabled, WKPreferencesGetMockCaptureDevicesEnabled, false}, + {"MockScrollbarsEnabled", WKPreferencesSetMockScrollbarsEnabled, WKPreferencesGetMockScrollbarsEnabled, false}, + {"NeedsSiteSpecificQuirks", WKPreferencesSetNeedsSiteSpecificQuirks, WKPreferencesGetNeedsSiteSpecificQuirks, true}, + {"NeedsStorageAccessFromFileURLsQuirk", WKPreferencesSetNeedsStorageAccessFromFileURLsQuirk, WKPreferencesGetNeedsStorageAccessFromFileURLsQuirk, true}, + {"NotificationsEnabled", WKPreferencesSetNotificationsEnabled, WKPreferencesGetNotificationsEnabled, false}, + {"OfflineWebApplicationCacheEnabled", WKPreferencesSetOfflineWebApplicationCacheEnabled, WKPreferencesGetOfflineWebApplicationCacheEnabled, true}, + {"PDFPluginEnabled", WKPreferencesSetPDFPluginEnabled, WKPreferencesGetPDFPluginEnabled, false}, + {"PageCacheEnabled", WKPreferencesSetPageCacheEnabled, WKPreferencesGetPageCacheEnabled, true}, + {"PageVisibilityBasedProcessSuppressionEnabled", WKPreferencesSetPageVisibilityBasedProcessSuppressionEnabled, WKPreferencesGetPageVisibilityBasedProcessSuppressionEnabled, true}, + {"PaintTimingEnabled", WKPreferencesSetPaintTimingEnabled, WKPreferencesGetPaintTimingEnabled, true}, + {"PeerConnectionEnabled", WKPreferencesSetPeerConnectionEnabled, WKPreferencesGetPeerConnectionEnabled, false}, + {"PluginsEnabled", WKPreferencesSetPluginsEnabled, WKPreferencesGetPluginsEnabled, true}, + {"ProcessSwapOnNavigationEnabled", WKPreferencesSetProcessSwapOnNavigationEnabled, WKPreferencesGetProcessSwapOnNavigationEnabled, false}, + {"PunchOutWhiteBackgroundsInDarkMode", WKPreferencesSetPunchOutWhiteBackgroundsInDarkMode, WKPreferencesGetPunchOutWhiteBackgroundsInDarkMode, false}, + {"ReferrerPolicyAttributeEnabled", WKPreferencesSetReferrerPolicyAttributeEnabled, WKPreferencesGetReferrerPolicyAttributeEnabled, true}, + {"RemotePlaybackEnabled", WKPreferencesSetRemotePlaybackEnabled, WKPreferencesGetRemotePlaybackEnabled, false}, + {"ResourceUsageOverlayVisible", WKPreferencesSetResourceUsageOverlayVisible, WKPreferencesGetResourceUsageOverlayVisible, false}, + {"RestrictedHTTPResponseAccess", WKPreferencesSetRestrictedHTTPResponseAccess, WKPreferencesGetRestrictedHTTPResponseAccess, true}, + {"ScrollingPerformanceLoggingEnabled", WKPreferencesSetScrollingPerformanceLoggingEnabled, WKPreferencesGetScrollingPerformanceLoggingEnabled, false}, + {"SelectTrailingWhitespaceEnabled", WKPreferencesSetSelectTrailingWhitespaceEnabled, WKPreferencesGetSelectTrailingWhitespaceEnabled, false}, + {"ServerTimingEnabled", WKPreferencesSetServerTimingEnabled, WKPreferencesGetServerTimingEnabled, true}, + {"ServiceControlsEnabled", WKPreferencesSetServiceControlsEnabled, WKPreferencesGetServiceControlsEnabled, false}, + {"ShouldAllowUserInstalledFonts", WKPreferencesSetShouldAllowUserInstalledFonts, WKPreferencesGetShouldAllowUserInstalledFonts, true}, + {"ShouldConvertPositionStyleOnCopy", WKPreferencesSetShouldConvertPositionStyleOnCopy, WKPreferencesGetShouldConvertPositionStyleOnCopy, false}, + {"ShouldDisplayCaptions", WKPreferencesSetShouldDisplayCaptions, WKPreferencesGetShouldDisplayCaptions, false}, + {"ShouldDisplaySubtitles", WKPreferencesSetShouldDisplaySubtitles, WKPreferencesGetShouldDisplaySubtitles, false}, + {"ShouldDisplayTextDescriptions", WKPreferencesSetShouldDisplayTextDescriptions, WKPreferencesGetShouldDisplayTextDescriptions, false}, + {"ShouldPrintBackgrounds", WKPreferencesSetShouldPrintBackgrounds, WKPreferencesGetShouldPrintBackgrounds, false}, + {"ShouldRespectImageOrientation", WKPreferencesSetShouldRespectImageOrientation, WKPreferencesGetShouldRespectImageOrientation, false}, + {"ShouldSuppressKeyboardInputDuringProvisionalNavigation", WKPreferencesSetShouldSuppressKeyboardInputDuringProvisionalNavigation, WKPreferencesGetShouldSuppressKeyboardInputDuringProvisionalNavigation, false}, + {"ShouldUseServiceWorkerShortTimeout", WKPreferencesSetShouldUseServiceWorkerShortTimeout, WKPreferencesGetShouldUseServiceWorkerShortTimeout, false}, + {"ShowsToolTipOverTruncatedText", WKPreferencesSetShowsToolTipOverTruncatedText, WKPreferencesGetShowsToolTipOverTruncatedText, false}, + {"ShowsURLsInToolTipsEnabled", WKPreferencesSetShowsURLsInToolTipsEnabled, WKPreferencesGetShowsURLsInToolTipsEnabled, false}, + {"SmartInsertDeleteEnabled", WKPreferencesSetSmartInsertDeleteEnabled, WKPreferencesGetSmartInsertDeleteEnabled, true}, + {"SpatialNavigationEnabled", WKPreferencesSetSpatialNavigationEnabled, WKPreferencesGetSpatialNavigationEnabled, false}, + {"StorageAccessAPIEnabled", WKPreferencesSetStorageAccessAPIEnabled, WKPreferencesGetStorageAccessAPIEnabled, true}, + {"SuppressesIncrementalRendering", WKPreferencesSetSuppressesIncrementalRendering, WKPreferencesGetSuppressesIncrementalRendering, false}, + {"SyntheticEditingCommandsEnabled", WKPreferencesSetSyntheticEditingCommandsEnabled, WKPreferencesGetSyntheticEditingCommandsEnabled, true}, + {"TabsToLinks", WKPreferencesSetTabsToLinks, WKPreferencesGetTabsToLinks, false}, + {"TelephoneNumberParsingEnabled", WKPreferencesSetTelephoneNumberParsingEnabled, WKPreferencesGetTelephoneNumberParsingEnabled, false}, + {"TextAreasAreResizable", WKPreferencesSetTextAreasAreResizable, WKPreferencesGetTextAreasAreResizable, true}, + {"TextAutosizingEnabled", WKPreferencesSetTextAutosizingEnabled, WKPreferencesGetTextAutosizingEnabled, false}, + {"TextAutosizingUsesIdempotentMode", WKPreferencesSetTextAutosizingUsesIdempotentMode, WKPreferencesGetTextAutosizingUsesIdempotentMode, false}, + {"ThreadedScrollingEnabled", WKPreferencesSetThreadedScrollingEnabled, WKPreferencesGetThreadedScrollingEnabled, true}, + {"TiledScrollingIndicatorVisible", WKPreferencesSetTiledScrollingIndicatorVisible, WKPreferencesGetTiledScrollingIndicatorVisible, false}, + {"TopNavigationToDataURLsAllowed", WKPreferencesSetTopNavigationToDataURLsAllowed, WKPreferencesGetTopNavigationToDataURLsAllowed, false}, + {"UniversalAccessFromFileURLsAllowed", WKPreferencesSetUniversalAccessFromFileURLsAllowed, WKPreferencesGetUniversalAccessFromFileURLsAllowed, false}, + {"UseGiantTiles", WKPreferencesSetUseGiantTiles, WKPreferencesGetUseGiantTiles, false}, + {"VideoPlaybackRequiresUserGesture", WKPreferencesSetVideoPlaybackRequiresUserGesture, WKPreferencesGetVideoPlaybackRequiresUserGesture, false}, + {"ViewGestureDebuggingEnabled", WKPreferencesSetViewGestureDebuggingEnabled, WKPreferencesGetViewGestureDebuggingEnabled, false}, + {"WebArchiveDebugModeEnabled", WKPreferencesSetWebArchiveDebugModeEnabled, WKPreferencesGetWebArchiveDebugModeEnabled, false}, + {"WebAudioEnabled", WKPreferencesSetWebAudioEnabled, WKPreferencesGetWebAudioEnabled, false}, + {"WebAuthenticationEnabled", WKPreferencesSetWebAuthenticationEnabled, WKPreferencesGetWebAuthenticationEnabled, false}, + {"WebGLEnabled", WKPreferencesSetWebGLEnabled, WKPreferencesGetWebGLEnabled, true}, + {"WebSecurityEnabled", WKPreferencesSetWebSecurityEnabled, WKPreferencesGetWebSecurityEnabled, true}, + {"WebShareEnabled", WKPreferencesSetWebShareEnabled, WKPreferencesGetWebShareEnabled, false}, +}; + +void Booleans() { + for (const auto& entry : booleanCases) { + auto preferences = Create(); + if (entry.get(preferences.Get()) != entry.initial) { + std::fprintf(stderr, "Wrong default for %s\n", entry.name); + Require(false); + } + for (bool value : {false, true, false, true}) { + entry.set(preferences.Get(), value); + Require(entry.get(preferences.Get()) == value); + auto copy = Copy(preferences.Get()); + Require(entry.get(copy.Get()) == value); + entry.set(copy.Get(), !value); + Require(entry.get(copy.Get()) == !value); + Require(entry.get(preferences.Get()) == value); + } + RequireThrows([&] { entry.get(nullptr); }); + RequireThrows([&] { entry.set(nullptr, true); }); + } +} + +void Deprecated() { + WKPreferencesSetAVFoundationNSURLSessionEnabled(nullptr, true); + Require(WKPreferencesGetAVFoundationNSURLSessionEnabled(nullptr) == true); + WKPreferencesSetAVFoundationNSURLSessionEnabled(nullptr, false); + Require(WKPreferencesGetAVFoundationNSURLSessionEnabled(nullptr) == true); + WKPreferencesSetAntialiasedFontDilationEnabled(nullptr, true); + Require(WKPreferencesGetAntialiasedFontDilationEnabled(nullptr) == false); + WKPreferencesSetAntialiasedFontDilationEnabled(nullptr, false); + Require(WKPreferencesGetAntialiasedFontDilationEnabled(nullptr) == false); + WKPreferencesSetArtificialPluginInitializationDelayEnabled(nullptr, true); + Require(WKPreferencesGetArtificialPluginInitializationDelayEnabled(nullptr) == false); + WKPreferencesSetArtificialPluginInitializationDelayEnabled(nullptr, false); + Require(WKPreferencesGetArtificialPluginInitializationDelayEnabled(nullptr) == false); + WKPreferencesSetAsynchronousPluginInitializationEnabled(nullptr, true); + Require(WKPreferencesGetAsynchronousPluginInitializationEnabled(nullptr) == false); + WKPreferencesSetAsynchronousPluginInitializationEnabled(nullptr, false); + Require(WKPreferencesGetAsynchronousPluginInitializationEnabled(nullptr) == false); + WKPreferencesSetAsynchronousPluginInitializationEnabledForAllPlugins(nullptr, true); + Require(WKPreferencesGetAsynchronousPluginInitializationEnabledForAllPlugins(nullptr) == false); + WKPreferencesSetAsynchronousPluginInitializationEnabledForAllPlugins(nullptr, false); + Require(WKPreferencesGetAsynchronousPluginInitializationEnabledForAllPlugins(nullptr) == false); + WKPreferencesSetAutostartOriginPlugInSnapshottingEnabled(nullptr, true); + Require(WKPreferencesGetAutostartOriginPlugInSnapshottingEnabled(nullptr) == false); + WKPreferencesSetAutostartOriginPlugInSnapshottingEnabled(nullptr, false); + Require(WKPreferencesGetAutostartOriginPlugInSnapshottingEnabled(nullptr) == false); + WKPreferencesSetCrossOriginResourcePolicyEnabled(nullptr, true); + Require(WKPreferencesGetCrossOriginResourcePolicyEnabled(nullptr) == true); + WKPreferencesSetCrossOriginResourcePolicyEnabled(nullptr, false); + Require(WKPreferencesGetCrossOriginResourcePolicyEnabled(nullptr) == true); + WKPreferencesSetFetchAPIEnabled(nullptr, true); + Require(WKPreferencesGetFetchAPIEnabled(nullptr) == true); + WKPreferencesSetFetchAPIEnabled(nullptr, false); + Require(WKPreferencesGetFetchAPIEnabled(nullptr) == true); + WKPreferencesSetHixie76WebSocketProtocolEnabled(nullptr, true); + Require(WKPreferencesGetHixie76WebSocketProtocolEnabled(nullptr) == false); + WKPreferencesSetHixie76WebSocketProtocolEnabled(nullptr, false); + Require(WKPreferencesGetHixie76WebSocketProtocolEnabled(nullptr) == false); + WKPreferencesSetIgnoreViewportScalingConstraints(nullptr, true); + Require(WKPreferencesGetIgnoreViewportScalingConstraints(nullptr) == false); + WKPreferencesSetIgnoreViewportScalingConstraints(nullptr, false); + Require(WKPreferencesGetIgnoreViewportScalingConstraints(nullptr) == false); + WKPreferencesSetIsSecureContextAttributeEnabled(nullptr, true); + Require(WKPreferencesGetIsSecureContextAttributeEnabled(nullptr) == true); + WKPreferencesSetIsSecureContextAttributeEnabled(nullptr, false); + Require(WKPreferencesGetIsSecureContextAttributeEnabled(nullptr) == true); + WKPreferencesSetJavaEnabled(nullptr, true); + Require(WKPreferencesGetJavaEnabled(nullptr) == false); + WKPreferencesSetJavaEnabled(nullptr, false); + Require(WKPreferencesGetJavaEnabled(nullptr) == false); + WKPreferencesSetKeygenElementEnabled(nullptr, true); + Require(WKPreferencesGetKeygenElementEnabled(nullptr) == false); + WKPreferencesSetKeygenElementEnabled(nullptr, false); + Require(WKPreferencesGetKeygenElementEnabled(nullptr) == false); + WKPreferencesSetLoadsSiteIconsIgnoringImageLoadingPreference(nullptr, true); + Require(WKPreferencesGetLoadsSiteIconsIgnoringImageLoadingPreference(nullptr) == false); + WKPreferencesSetLoadsSiteIconsIgnoringImageLoadingPreference(nullptr, false); + Require(WKPreferencesGetLoadsSiteIconsIgnoringImageLoadingPreference(nullptr) == false); + WKPreferencesSetLongMousePressEnabled(nullptr, true); + Require(WKPreferencesGetLongMousePressEnabled(nullptr) == false); + WKPreferencesSetLongMousePressEnabled(nullptr, false); + Require(WKPreferencesGetLongMousePressEnabled(nullptr) == false); + WKPreferencesSetNewBlockInsideInlineModelEnabled(nullptr, true); + Require(WKPreferencesGetNewBlockInsideInlineModelEnabled(nullptr) == false); + WKPreferencesSetNewBlockInsideInlineModelEnabled(nullptr, false); + Require(WKPreferencesGetNewBlockInsideInlineModelEnabled(nullptr) == false); + WKPreferencesSetPageCacheSupportsPlugins(nullptr, true); + Require(WKPreferencesGetPageCacheSupportsPlugins(nullptr) == false); + WKPreferencesSetPageCacheSupportsPlugins(nullptr, false); + Require(WKPreferencesGetPageCacheSupportsPlugins(nullptr) == false); + WKPreferencesSetPaginateDuringLayoutEnabled(nullptr, true); + Require(WKPreferencesGetPaginateDuringLayoutEnabled(nullptr) == false); + WKPreferencesSetPaginateDuringLayoutEnabled(nullptr, false); + Require(WKPreferencesGetPaginateDuringLayoutEnabled(nullptr) == false); + WKPreferencesSetPlugInSnapshottingEnabled(nullptr, true); + Require(WKPreferencesGetPlugInSnapshottingEnabled(nullptr) == false); + WKPreferencesSetPlugInSnapshottingEnabled(nullptr, false); + Require(WKPreferencesGetPlugInSnapshottingEnabled(nullptr) == false); + WKPreferencesSetPluginSandboxProfilesEnabledForAllPlugins(nullptr, true); + Require(WKPreferencesGetPluginSandboxProfilesEnabledForAllPlugins(nullptr) == false); + WKPreferencesSetPluginSandboxProfilesEnabledForAllPlugins(nullptr, false); + Require(WKPreferencesGetPluginSandboxProfilesEnabledForAllPlugins(nullptr) == false); + WKPreferencesSetPrimaryPlugInSnapshotDetectionEnabled(nullptr, true); + Require(WKPreferencesGetPrimaryPlugInSnapshotDetectionEnabled(nullptr) == false); + WKPreferencesSetPrimaryPlugInSnapshotDetectionEnabled(nullptr, false); + Require(WKPreferencesGetPrimaryPlugInSnapshotDetectionEnabled(nullptr) == false); + WKPreferencesSetPrivateBrowsingEnabled(nullptr, true); + Require(WKPreferencesGetPrivateBrowsingEnabled(nullptr) == false); + WKPreferencesSetPrivateBrowsingEnabled(nullptr, false); + Require(WKPreferencesGetPrivateBrowsingEnabled(nullptr) == false); + WKPreferencesSetRequestAnimationFrameEnabled(nullptr, true); + Require(WKPreferencesGetRequestAnimationFrameEnabled(nullptr) == true); + WKPreferencesSetRequestAnimationFrameEnabled(nullptr, false); + Require(WKPreferencesGetRequestAnimationFrameEnabled(nullptr) == true); + WKPreferencesSetResourceTimingEnabled(nullptr, true); + Require(WKPreferencesGetResourceTimingEnabled(nullptr) == true); + WKPreferencesSetResourceTimingEnabled(nullptr, false); + Require(WKPreferencesGetResourceTimingEnabled(nullptr) == true); + WKPreferencesSetSnapshotAllPlugIns(nullptr, true); + Require(WKPreferencesGetSnapshotAllPlugIns(nullptr) == false); + WKPreferencesSetSnapshotAllPlugIns(nullptr, false); + Require(WKPreferencesGetSnapshotAllPlugIns(nullptr) == false); + WKPreferencesSetSubpixelAntialiasedLayerTextEnabled(nullptr, true); + Require(WKPreferencesGetSubpixelAntialiasedLayerTextEnabled(nullptr) == false); + WKPreferencesSetSubpixelAntialiasedLayerTextEnabled(nullptr, false); + Require(WKPreferencesGetSubpixelAntialiasedLayerTextEnabled(nullptr) == false); + WKPreferencesSetSubpixelCSSOMElementMetricsEnabled(nullptr, true); + Require(WKPreferencesGetSubpixelCSSOMElementMetricsEnabled(nullptr) == false); + WKPreferencesSetSubpixelCSSOMElementMetricsEnabled(nullptr, false); + Require(WKPreferencesGetSubpixelCSSOMElementMetricsEnabled(nullptr) == false); + WKPreferencesSetUserTimingEnabled(nullptr, true); + Require(WKPreferencesGetUserTimingEnabled(nullptr) == true); + WKPreferencesSetUserTimingEnabled(nullptr, false); + Require(WKPreferencesGetUserTimingEnabled(nullptr) == true); + WKPreferencesSetWebSQLDisabled(nullptr, true); + Require(WKPreferencesGetWebSQLDisabled(nullptr) == true); + WKPreferencesSetWebSQLDisabled(nullptr, false); + Require(WKPreferencesGetWebSQLDisabled(nullptr) == true); + WKPreferencesSetXSSAuditorEnabled(nullptr, true); + Require(WKPreferencesGetXSSAuditorEnabled(nullptr) == false); + WKPreferencesSetXSSAuditorEnabled(nullptr, false); + Require(WKPreferencesGetXSSAuditorEnabled(nullptr) == false); +} + +void Numeric() { + auto preferences = Create(); + Require(WKPreferencesGetDefaultFontSize(preferences.Get()) == 16); + Require(WKPreferencesGetDefaultFixedFontSize(preferences.Get()) == 13); + Require(WKPreferencesGetMinimumFontSize(preferences.Get()) == 0); + Require(WKPreferencesGetMinimumZoomFontSize(preferences.Get()) == 0); + Require(WKPreferencesGetIncrementalRenderingSuppressionTimeout(preferences.Get()) == 5); + Require(WKPreferencesGetInactiveMediaCaptureSteamRepromptIntervalInMinutes(preferences.Get()) == 10); + const auto largest = std::numeric_limits::max(); + for (auto value : {std::uint32_t{0}, std::uint32_t{1}, std::uint32_t{65537}, largest}) { + WKPreferencesSetDefaultFontSize(preferences.Get(), value); + WKPreferencesSetDefaultFixedFontSize(preferences.Get(), value); + WKPreferencesSetMinimumFontSize(preferences.Get(), value); + WKPreferencesSetJavaScriptRuntimeFlags(preferences.Get(), value); + WKPreferencesSetVisibleDebugOverlayRegions(preferences.Get(), value); + Require(WKPreferencesGetDefaultFontSize(preferences.Get()) == value); + Require(WKPreferencesGetDefaultFixedFontSize(preferences.Get()) == value); + Require(WKPreferencesGetMinimumFontSize(preferences.Get()) == value); + Require(WKPreferencesGetJavaScriptRuntimeFlags(preferences.Get()) == value); + Require(WKPreferencesGetVisibleDebugOverlayRegions(preferences.Get()) == value); + } + for (double value : {0.0, -0.0, -12.5, 0.125, 1e200, std::numeric_limits::infinity()}) { + WKPreferencesSetMinimumZoomFontSize(preferences.Get(), value); + WKPreferencesSetIncrementalRenderingSuppressionTimeout(preferences.Get(), value); + WKPreferencesSetInactiveMediaCaptureSteamRepromptIntervalInMinutes(preferences.Get(), value); + Require(WKPreferencesGetMinimumZoomFontSize(preferences.Get()) == value); + Require(WKPreferencesGetIncrementalRenderingSuppressionTimeout(preferences.Get()) == value); + Require(WKPreferencesGetInactiveMediaCaptureSteamRepromptIntervalInMinutes(preferences.Get()) == value); + auto copy = Copy(preferences.Get()); + Require(WKPreferencesGetIncrementalRenderingSuppressionTimeout(copy.Get()) == value); + } + WKPreferencesSetIncrementalRenderingSuppressionTimeout(preferences.Get(), std::numeric_limits::quiet_NaN()); + Require(std::isnan(WKPreferencesGetIncrementalRenderingSuppressionTimeout(preferences.Get()))); + Require(WKPreferencesGetEditableLinkBehavior(preferences.Get()) == kWKEditableLinkBehaviorNeverLive); + for (std::uint32_t value = 0; value <= 4; ++value) { + WKPreferencesSetEditableLinkBehavior(preferences.Get(), static_cast(value)); + Require(WKPreferencesGetEditableLinkBehavior(preferences.Get()) == value); + } + Require(WKPreferencesGetStorageBlockingPolicy(preferences.Get()) == kWKAllowAllStorage); + for (std::uint32_t value = 0; value <= 2; ++value) { + WKPreferencesSetStorageBlockingPolicy(preferences.Get(), static_cast(value)); + Require(WKPreferencesGetStorageBlockingPolicy(preferences.Get()) == value); + } + preferences->Set(u"DefaultFontSize", true); + Require(WKPreferencesGetDefaultFontSize(preferences.Get()) == 16); + preferences->Set(u"PluginsEnabled", std::uint32_t{7}); + Require(WKPreferencesGetPluginsEnabled(preferences.Get())); + preferences->Set(u"StorageBlockingPolicy", true); + Require(WKPreferencesGetStorageBlockingPolicy(preferences.Get()) == kWKAllowAllStorage); + auto typedCopy = Copy(preferences.Get()); + Require(WKPreferencesGetPluginsEnabled(typedCopy.Get())); + Require(WKPreferencesGetStorageBlockingPolicy(typedCopy.Get()) == kWKAllowAllStorage); + WKPreferencesSetEditableLinkBehavior(preferences.Get(), static_cast(255)); + Require(WKPreferencesGetEditableLinkBehavior(preferences.Get()) == kWKEditableLinkBehaviorNeverLive); + WKPreferencesSetStorageBlockingPolicy(preferences.Get(), static_cast(255)); + Require(WKPreferencesGetStorageBlockingPolicy(preferences.Get()) == kWKAllowAllStorage); + Require(WKPreferencesGetUserInterfaceDirectionPolicy(preferences.Get()) == kWKUserInterfaceDirectionPolicyContent); + WKPreferencesSetUserInterfaceDirectionPolicy(preferences.Get(), kWKUserInterfaceDirectionPolicySystem); + Require(WKPreferencesGetUserInterfaceDirectionPolicy(preferences.Get()) == kWKUserInterfaceDirectionPolicySystem); +} + +struct StringCase { + void (APS5_VABI *set)(const void*, const void*); + const void* (APS5_VABI *copy)(const void*); + const char16_t* initial; +}; + +const StringCase stringCases[]{ + {WKPreferencesSetCursiveFontFamily, WKPreferencesCopyCursiveFontFamily, u"Comic Sans MS"}, + {WKPreferencesSetDefaultTextEncodingName, WKPreferencesCopyDefaultTextEncodingName, u"ISO-8859-1"}, + {WKPreferencesSetFTPDirectoryTemplatePath, WKPreferencesCopyFTPDirectoryTemplatePath, u""}, + {WKPreferencesSetFantasyFontFamily, WKPreferencesCopyFantasyFontFamily, u"Impact"}, + {WKPreferencesSetFixedFontFamily, WKPreferencesCopyFixedFontFamily, u"Courier New"}, + {WKPreferencesSetMediaContentTypesRequiringHardwareSupport, WKPreferencesCopyMediaContentTypesRequiringHardwareSupport, u""}, + {WKPreferencesSetPictographFontFamily, WKPreferencesCopyPictographFontFamily, u"Times"}, + {WKPreferencesSetSansSerifFontFamily, WKPreferencesCopySansSerifFontFamily, u"Helvetica"}, + {WKPreferencesSetSerifFontFamily, WKPreferencesCopySerifFontFamily, u"Times"}, + {WKPreferencesSetStandardFontFamily, WKPreferencesCopyStandardFontFamily, u"Times"}, +}; + +void Strings() { + for (const auto& entry : stringCases) { + auto preferences = Create(); + auto initial = StringCopy(entry.copy(preferences.Get())); + Require(!initial->null && initial->characters == entry.initial); + for (std::u16string value : {std::u16string(), std::u16string(u"???\U0001f3ae"), std::u16string(u"a\0b", 3), std::u16string(1, char16_t{0xd800})}) { + auto string = NKWebKit::Make(value); + entry.set(preferences.Get(), string.Get()); + string->characters = u"changed after setting"; + auto first = StringCopy(entry.copy(preferences.Get())); + auto second = StringCopy(entry.copy(preferences.Get())); + Require(first.Get() != second.Get()); + Require(!first->null && first->characters == value); + Require(!second->null && second->characters == value); + auto copy = Copy(preferences.Get()); + entry.set(preferences.Get(), nullptr); + auto copied = StringCopy(entry.copy(copy.Get())); + Require(!copied->null && copied->characters == value); + auto nullValue = StringCopy(entry.copy(preferences.Get())); + Require(!nullValue->null && nullValue->characters.empty()); + Require(first->characters == value); + } + auto nullString = NKWebKit::Make(); + entry.set(preferences.Get(), nullString.Get()); + auto nullValue = StringCopy(entry.copy(preferences.Get())); + Require(!nullValue->null && nullValue->characters.empty()); + RequireThrows([&] { entry.copy(nullptr); }); + RequireThrows([&] { entry.set(nullptr, nullptr); }); + RequireThrows([&] { entry.set(preferences.Get(), preferences.Get()); }); + } +} + +void Features() { + auto preferences = Create(); + auto javascript = NKWebKit::Make(std::u16string(u"JavaScriptEnabled")); + WKPreferencesSetExperimentalFeatureForKey(preferences.Get(), false, javascript.Get()); + Require(!WKPreferencesGetJavaScriptEnabled(preferences.Get())); + WKPreferencesSetInternalDebugFeatureForKey(preferences.Get(), true, javascript.Get()); + Require(WKPreferencesGetJavaScriptEnabled(preferences.Get())); + auto disabled = NKWebKit::Make(std::u16string(u"WebAudioEnabled")); + WKPreferencesSetWebAudioEnabled(preferences.Get(), true); + WKPreferencesSetExperimentalFeatureForKey(preferences.Get(), false, disabled.Get()); + Require(WKPreferencesGetWebAudioEnabled(preferences.Get())); + for (const auto& key : {std::u16string(), std::u16string(u"UnknownPreference"), std::u16string(u"javascriptEnabled"), std::u16string(u"DefaultFontSize")}) { + auto string = NKWebKit::Make(key); + WKPreferencesSetInternalDebugFeatureForKey(preferences.Get(), false, string.Get()); + WKPreferencesSetExperimentalFeatureForKey(preferences.Get(), true, string.Get()); + } + Require(WKPreferencesGetDefaultFontSize(preferences.Get()) == 16); + Require(WKPreferencesGetJavaScriptEnabled(preferences.Get())); + WKPreferencesSetInternalDebugFeatureForKey(preferences.Get(), false, nullptr); + WKPreferencesSetExperimentalFeatureForKey(preferences.Get(), true, nullptr); + WKPreferencesSetStorageAccessAPIEnabled(preferences.Get(), false); + WKPreferencesSetHighlightAPIEnabled(preferences.Get(), false); + WKPreferencesSetAcceleratedDrawingEnabled(preferences.Get(), false); + WKPreferencesSetCompositingBordersVisible(preferences.Get(), true); + WKPreferencesSetFullScreenEnabled(preferences.Get(), true); + WKPreferencesSetDefaultFontSize(preferences.Get(), 23); + WKPreferencesEnableAllExperimentalFeatures(preferences.Get()); + Require(WKPreferencesGetStorageAccessAPIEnabled(preferences.Get())); + Require(WKPreferencesGetHighlightAPIEnabled(preferences.Get())); + Require(!WKPreferencesGetAcceleratedDrawingEnabled(preferences.Get())); + Require(WKPreferencesGetFullScreenEnabled(preferences.Get())); + Require(WKPreferencesGetDefaultFontSize(preferences.Get()) == 23); + WKPreferencesResetAllInternalDebugFeatures(preferences.Get()); + Require(WKPreferencesGetAcceleratedDrawingEnabled(preferences.Get())); + Require(!WKPreferencesGetCompositingBordersVisible(preferences.Get())); + Require(WKPreferencesGetHighlightAPIEnabled(preferences.Get())); + Require(WKPreferencesGetFullScreenEnabled(preferences.Get())); + WKPreferencesSetJavaScriptEnabled(preferences.Get(), false); + WKPreferencesResetTestRunnerOverrides(preferences.Get()); + Require(!WKPreferencesGetJavaScriptEnabled(preferences.Get())); + Require(WKPreferencesGetDefaultFontSize(preferences.Get()) == 23); + WKPreferencesSetMetaRefreshEnabled(preferences.Get(), false); + Require(!WKPreferencesGetHTTPEquivEnabled(preferences.Get())); + WKPreferencesSetHTTPEquivEnabled(preferences.Get(), true); + Require(WKPreferencesGetMetaRefreshEnabled(preferences.Get())); + WKPreferencesSetInvisibleMediaAutoplayPermitted(preferences.Get(), false); + Require(preferences->GetBool(u"InvisibleAutoplayNotPermitted")); + auto original = Create(); + Require(WKPreferencesGetJavaScriptEnabled(original.Get())); + Require(WKPreferencesGetDefaultFontSize(original.Get()) == 16); + RequireThrows([] { WKPreferencesEnableAllExperimentalFeatures(nullptr); }); + RequireThrows([] { WKPreferencesResetAllInternalDebugFeatures(nullptr); }); + RequireThrows([] { WKPreferencesResetTestRunnerOverrides(nullptr); }); + RequireThrows([&] { WKPreferencesSetExperimentalFeatureForKey(preferences.Get(), true, preferences.Get()); }); +} + +void CreationAndUnknownDefaults() { + auto identifier = NKWebKit::Make(std::u16string(u"shared identifier")); + auto first = NKWebKit::Retained::Adopt(NKWebKit::Cast( + WKPreferencesCreateWithIdentifier(identifier.Get()), __func__)); + auto second = NKWebKit::Retained::Adopt(NKWebKit::Cast( + WKPreferencesCreateWithIdentifier(identifier.Get()), __func__)); + WKPreferencesSetJavaScriptEnabled(first.Get(), false); + Require(WKPreferencesGetJavaScriptEnabled(second.Get())); + Require(first->Type() == NKWebKit::ObjectType::Preferences); + auto anonymous = NKWebKit::Retained::Adopt(NKWebKit::Cast( + WKPreferencesCreateWithIdentifier(nullptr), __func__)); + Require(WKPreferencesGetJavaScriptEnabled(anonymous.Get())); + Require(first->GetBool(u"ShouldRestrictBaseURLSchemes")); + first->Set(u"ShouldRestrictBaseURLSchemes", false); + auto copy = Copy(first.Get()); + Require(copy->GetBool(u"ShouldRestrictBaseURLSchemes")); + RequireThrows([] { WKPreferencesCreateCopy(nullptr); }); + RequireThrows([&] { WKPreferencesCreateWithIdentifier(first.Get()); }); + RequireThrows([&] { WKPreferencesGetJavaScriptEnabled(identifier.Get()); }); + RequireThrows([&] { WKPreferencesGetMediaSourceEnabled(second.Get()); }); + WKPreferencesSetMediaSourceEnabled(second.Get(), false); + Require(!WKPreferencesGetMediaSourceEnabled(second.Get())); + WKPreferencesSetMediaSourceEnabled(second.Get(), true); + Require(WKPreferencesGetMediaSourceEnabled(second.Get())); + auto copyMediaSourceEnabled = Copy(second.Get()); + Require(WKPreferencesGetMediaSourceEnabled(copyMediaSourceEnabled.Get())); + RequireThrows([&] { WKPreferencesGetEncryptedMediaAPIEnabled(second.Get()); }); + WKPreferencesSetEncryptedMediaAPIEnabled(second.Get(), false); + Require(!WKPreferencesGetEncryptedMediaAPIEnabled(second.Get())); + WKPreferencesSetEncryptedMediaAPIEnabled(second.Get(), true); + Require(WKPreferencesGetEncryptedMediaAPIEnabled(second.Get())); + auto copyEncryptedMediaAPIEnabled = Copy(second.Get()); + Require(WKPreferencesGetEncryptedMediaAPIEnabled(copyEncryptedMediaAPIEnabled.Get())); + RequireThrows([&] { WKPreferencesGetSourceBufferChangeTypeEnabled(second.Get()); }); + WKPreferencesSetSourceBufferChangeTypeEnabled(second.Get(), false); + Require(!WKPreferencesGetSourceBufferChangeTypeEnabled(second.Get())); + WKPreferencesSetSourceBufferChangeTypeEnabled(second.Get(), true); + Require(WKPreferencesGetSourceBufferChangeTypeEnabled(second.Get())); + auto copySourceBufferChangeTypeEnabled = Copy(second.Get()); + Require(WKPreferencesGetSourceBufferChangeTypeEnabled(copySourceBufferChangeTypeEnabled.Get())); + auto sourceKey = NKWebKit::Make(std::u16string(u"SourceBufferChangeTypeEnabled")); + RequireThrows([&] { WKPreferencesSetExperimentalFeatureForKey(second.Get(), false, sourceKey.Get()); }); + auto mediaKey = NKWebKit::Make(std::u16string(u"MediaSourceEnabled")); + WKPreferencesSetExperimentalFeatureForKey(first.Get(), false, mediaKey.Get()); + Require(!WKPreferencesGetMediaSourceEnabled(first.Get())); + auto copiedUnknown = Copy(anonymous.Get()); + RequireThrows([&] { WKPreferencesGetMediaSourceEnabled(copiedUnknown.Get()); }); +} + +} + +int main() { + Booleans(); + Deprecated(); + Numeric(); + Strings(); + Features(); + CreationAndUnknownDefaults(); + std::puts("WKPreferences: defaults, boolean round trips, deprecated APIs, numeric boundaries, Unicode/null strings, copies, features and unknown media defaults passed"); +} diff --git a/core/libs/prx/libSceNKWebKit/tests/WebCoreGeometry.cpp b/core/libs/prx/libSceNKWebKit/tests/WebCoreGeometry.cpp new file mode 100644 index 0000000000..5767504b90 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/tests/WebCoreGeometry.cpp @@ -0,0 +1,572 @@ +#include "prx/libc/include/general/VabiMacros.hpp" +#include "prx/libSceNKWebKit/libSceNKWebKit.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include + +static void Check(bool value, int line) { + if (!value) { + std::fprintf(stderr, "WebCore geometry check failed at line %d\n", line); + std::abort(); + } +} +#define Require(value) Check((value), __LINE__) + +static bool AlmostEqual(float a, float b, float eps = 1e-4f) { + return std::abs(a - b) <= eps; +} + +static bool AlmostEqual(double a, double b, double eps = 1e-6) { + return std::abs(a - b) <= eps; +} + +static void TestFloatPoint() { + WebCore::FloatPoint np = _ZN7WebCore10FloatPoint15narrowPrecisionEdd(12.345, 67.890); + Require(AlmostEqual(np.m_x, 12.345f)); + Require(AlmostEqual(np.m_y, 67.890f)); + + WebCore::FloatPoint norm{3.0f, 4.0f}; + _ZN7WebCore10FloatPoint9normalizeEv(&norm); + Require(AlmostEqual(norm.m_x, 0.6f)); + Require(AlmostEqual(norm.m_y, 0.8f)); + + WebCore::FloatPoint zeroNorm{0.0f, 0.0f}; + _ZN7WebCore10FloatPoint9normalizeEv(&zeroNorm); + Require(AlmostEqual(zeroNorm.m_x, 0.0f)); + Require(AlmostEqual(zeroNorm.m_y, 0.0f)); + + WebCore::IntPoint ip{10, 25}; + WebCore::FloatPoint fp1; + _ZN7WebCore10FloatPointC1ERKNS_8IntPointE(&fp1, ip); + Require(AlmostEqual(fp1.m_x, 10.0f)); + Require(AlmostEqual(fp1.m_y, 25.0f)); + + WebCore::FloatPoint fp2; + _ZN7WebCore10FloatPointC2ERKNS_8IntPointE(&fp2, ip); + Require(AlmostEqual(fp2.m_x, 10.0f)); + Require(AlmostEqual(fp2.m_y, 25.0f)); + + WebCore::AffineTransform at; + _ZN7WebCore15AffineTransform9translateEdd(&at, 15.0, -5.0); + WebCore::FloatPoint tp = _ZNK7WebCore10FloatPoint15matrixTransformERKNS_15AffineTransformE(&fp1, at); + Require(AlmostEqual(tp.m_x, 25.0f)); + Require(AlmostEqual(tp.m_y, 20.0f)); + + WebCore::TransformationMatrix tm; + _ZN7WebCore20TransformationMatrix15scaleNonUniformEdd(&tm, 2.0, 3.0); + WebCore::FloatPoint tmp = _ZNK7WebCore10FloatPoint15matrixTransformERKNS_20TransformationMatrixE(&fp1, tm); + Require(AlmostEqual(tmp.m_x, 20.0f)); + Require(AlmostEqual(tmp.m_y, 75.0f)); + + WebCore::FloatPoint minP{0.0f, 0.0f}; + WebCore::FloatPoint maxP{100.0f, 100.0f}; + WebCore::FloatPoint outP{-10.0f, 120.0f}; + WebCore::FloatPoint clamped = _ZNK7WebCore10FloatPoint18constrainedBetweenERKS0_S2_(&outP, minP, maxP); + Require(AlmostEqual(clamped.m_x, 0.0f)); + Require(AlmostEqual(clamped.m_y, 100.0f)); +} + +static void TestFloatSize() { + WebCore::FloatSize sz1{0.0f, 0.0f}; + Require(_ZNK7WebCore9FloatSize6isZeroEv(&sz1)); + WebCore::FloatSize sz2{1.0f, 0.0f}; + Require(!_ZNK7WebCore9FloatSize6isZeroEv(&sz2)); + + WebCore::FloatSize minS{5.0f, 10.0f}; + WebCore::FloatSize maxS{50.0f, 60.0f}; + WebCore::FloatSize curS{1.0f, 100.0f}; + WebCore::FloatSize clamped = _ZNK7WebCore9FloatSize18constrainedBetweenERKS0_S2_(&curS, minS, maxS); + Require(AlmostEqual(clamped.m_width, 5.0f)); + Require(AlmostEqual(clamped.m_height, 60.0f)); +} + +static void TestFloatRect() { + WebCore::IntRect ir{WebCore::IntPoint{5, 10}, WebCore::IntSize{20, 30}}; + WebCore::FloatRect fr1; + _ZN7WebCore9FloatRectC1ERKNS_7IntRectE(&fr1, ir); + Require(AlmostEqual(fr1.m_location.m_x, 5.0f)); + Require(AlmostEqual(fr1.m_location.m_y, 10.0f)); + Require(AlmostEqual(fr1.m_size.m_width, 20.0f)); + Require(AlmostEqual(fr1.m_size.m_height, 30.0f)); + + WebCore::FloatRect fr2; + _ZN7WebCore9FloatRectC2ERKNS_7IntRectE(&fr2, ir); + Require(AlmostEqual(fr2.m_location.m_x, 5.0f)); + Require(AlmostEqual(fr2.m_size.m_width, 20.0f)); + + _ZN7WebCore9FloatRect5scaleEff(&fr1, 2.0f, 3.0f); + Require(AlmostEqual(fr1.m_location.m_x, 10.0f)); + Require(AlmostEqual(fr1.m_location.m_y, 30.0f)); + Require(AlmostEqual(fr1.m_size.m_width, 40.0f)); + Require(AlmostEqual(fr1.m_size.m_height, 90.0f)); + + WebCore::FloatRect rA{WebCore::FloatPoint{0.0f, 0.0f}, WebCore::FloatSize{10.0f, 10.0f}}; + WebCore::FloatRect rB{WebCore::FloatPoint{5.0f, 5.0f}, WebCore::FloatSize{15.0f, 15.0f}}; + _ZN7WebCore9FloatRect5uniteERKS0_(&rA, rB); + Require(AlmostEqual(rA.m_location.m_x, 0.0f)); + Require(AlmostEqual(rA.m_location.m_y, 0.0f)); + Require(AlmostEqual(rA.m_size.m_width, 20.0f)); + Require(AlmostEqual(rA.m_size.m_height, 20.0f)); + + WebCore::FloatRect rInter{WebCore::FloatPoint{0.0f, 0.0f}, WebCore::FloatSize{10.0f, 10.0f}}; + WebCore::FloatRect rOther{WebCore::FloatPoint{4.0f, 3.0f}, WebCore::FloatSize{10.0f, 10.0f}}; + _ZN7WebCore9FloatRect9intersectERKS0_(&rInter, rOther); + Require(AlmostEqual(rInter.m_location.m_x, 4.0f)); + Require(AlmostEqual(rInter.m_location.m_y, 3.0f)); + Require(AlmostEqual(rInter.m_size.m_width, 6.0f)); + Require(AlmostEqual(rInter.m_size.m_height, 7.0f)); + + WebCore::FloatRect rDisjoint{WebCore::FloatPoint{50.0f, 50.0f}, WebCore::FloatSize{10.0f, 10.0f}}; + Require(!_ZNK7WebCore9FloatRect10intersectsERKS0_(&rInter, rDisjoint)); + Require(!_ZNK7WebCore9FloatRect21inclusivelyIntersectsERKS0_(&rInter, rDisjoint)); + + WebCore::FloatRect rTouch{WebCore::FloatPoint{10.0f, 3.0f}, WebCore::FloatSize{5.0f, 5.0f}}; + Require(!_ZNK7WebCore9FloatRect10intersectsERKS0_(&rInter, rTouch)); + Require(_ZNK7WebCore9FloatRect21inclusivelyIntersectsERKS0_(&rInter, rTouch)); + + WebCore::FloatPoint insidePt{5.0f, 4.0f}; + Require(_ZNK7WebCore9FloatRect8containsERKNS_10FloatPointENS0_12ContainsModeE( + &rInter, insidePt, 0u)); + WebCore::FloatPoint outsidePt{0.0f, 0.0f}; + Require(!_ZNK7WebCore9FloatRect8containsERKNS_10FloatPointENS0_12ContainsModeE( + &rInter, outsidePt, 0u)); + + WebCore::FloatRect smallInside{WebCore::FloatPoint{5.0f, 4.0f}, WebCore::FloatSize{2.0f, 2.0f}}; + Require(_ZNK7WebCore9FloatRect8containsERKS0_(&rInter, smallInside)); + + WebCore::FloatRect rExt{WebCore::FloatPoint{10.0f, 10.0f}, WebCore::FloatSize{10.0f, 10.0f}}; + WebCore::FloatPoint rExtPoint{25.0f, 25.0f}; + _ZN7WebCore9FloatRect6extendERKNS_10FloatPointE(&rExt, rExtPoint); + Require(AlmostEqual(rExt.m_location.m_x, 10.0f)); + Require(AlmostEqual(rExt.m_location.m_y, 10.0f)); + Require(AlmostEqual(rExt.m_size.m_width, 15.0f)); + Require(AlmostEqual(rExt.m_size.m_height, 15.0f)); +} + +static void TestFloatQuad() { + WebCore::FloatQuad q{ + WebCore::FloatPoint{0.0f, 0.0f}, + WebCore::FloatPoint{10.0f, 0.0f}, + WebCore::FloatPoint{10.0f, 10.0f}, + WebCore::FloatPoint{0.0f, 10.0f} + }; + WebCore::FloatRect bb = _ZNK7WebCore9FloatQuad11boundingBoxEv(&q); + Require(AlmostEqual(bb.m_location.m_x, 0.0f)); + Require(AlmostEqual(bb.m_location.m_y, 0.0f)); + Require(AlmostEqual(bb.m_size.m_width, 10.0f)); + Require(AlmostEqual(bb.m_size.m_height, 10.0f)); + + Require(_ZNK7WebCore9FloatQuad13isRectilinearEv(&q)); + + WebCore::FloatPoint inside{5.0f, 5.0f}; + WebCore::FloatPoint outside{15.0f, 5.0f}; + Require(_ZNK7WebCore9FloatQuad13containsPointERKNS_10FloatPointE(&q, inside)); + Require(!_ZNK7WebCore9FloatQuad13containsPointERKNS_10FloatPointE(&q, outside)); + + WebCore::FloatQuad smallQ{ + WebCore::FloatPoint{2.0f, 2.0f}, + WebCore::FloatPoint{8.0f, 2.0f}, + WebCore::FloatPoint{8.0f, 8.0f}, + WebCore::FloatPoint{2.0f, 8.0f} + }; + Require(_ZNK7WebCore9FloatQuad12containsQuadERKS0_(&q, smallQ)); +} + +static void TestFloatRoundedRect() { + WebCore::FloatRect rect{WebCore::FloatPoint{0.0f, 0.0f}, WebCore::FloatSize{100.0f, 100.0f}}; + WebCore::FloatRoundedRect::Radii radii{ + WebCore::FloatSize{10.0f, 10.0f}, + WebCore::FloatSize{10.0f, 10.0f}, + WebCore::FloatSize{10.0f, 10.0f}, + WebCore::FloatSize{10.0f, 10.0f} + }; + WebCore::FloatRoundedRect frr1; + _ZN7WebCore16FloatRoundedRectC1ERKNS_9FloatRectERKNS0_5RadiiE(&frr1, rect, radii); + Require(AlmostEqual(frr1.m_rect.m_size.m_width, 100.0f)); + Require(AlmostEqual(frr1.m_radii.m_topLeft.m_width, 10.0f)); + + WebCore::FloatRoundedRect frr2; + _ZN7WebCore16FloatRoundedRectC2ERKNS_9FloatRectERKNS0_5RadiiE(&frr2, rect, radii); + Require(AlmostEqual(frr2.m_rect.m_size.m_width, 100.0f)); +} + +static void TestIntPointIntSizeIntRect() { + WebCore::FloatPoint fp{15.7f, 25.2f}; + WebCore::IntPoint ip1; + _ZN7WebCore8IntPointC1ERKNS_10FloatPointE(&ip1, fp); + Require(ip1.m_x == 15); + Require(ip1.m_y == 25); + + WebCore::IntPoint ip2; + _ZN7WebCore8IntPointC2ERKNS_10FloatPointE(&ip2, fp); + Require(ip2.m_x == 15); + + WebCore::IntPoint minP{0, 0}; + WebCore::IntPoint maxP{10, 10}; + WebCore::IntPoint testP{15, -5}; + WebCore::IntPoint clamped = _ZNK7WebCore8IntPoint18constrainedBetweenERKS0_S2_(&testP, minP, maxP); + Require(clamped.m_x == 10); + Require(clamped.m_y == 0); + + WebCore::FloatSize fs{20.0f, 30.0f}; + WebCore::IntSize is1; + _ZN7WebCore7IntSizeC1ERKNS_9FloatSizeE(&is1, fs); + Require(is1.m_width == 20); + Require(is1.m_height == 30); + + WebCore::IntSize is2; + _ZN7WebCore7IntSizeC2ERKNS_9FloatSizeE(&is2, fs); + Require(is2.m_width == 20); + + WebCore::IntSize minS{5, 5}; + WebCore::IntSize maxS{50, 50}; + WebCore::IntSize testS{0, 100}; + WebCore::IntSize clampedS = _ZNK7WebCore7IntSize18constrainedBetweenERKS0_S2_(&testS, minS, maxS); + Require(clampedS.m_width == 5); + Require(clampedS.m_height == 50); + + WebCore::IntRect ir{WebCore::IntPoint{10, 20}, WebCore::IntSize{30, 40}}; + _ZN7WebCore7IntRect5scaleEf(&ir, 2.0f); + Require(ir.m_location.m_x == 20); + Require(ir.m_location.m_y == 40); + Require(ir.m_size.m_width == 60); + Require(ir.m_size.m_height == 80); + + WebCore::IntRect irA{WebCore::IntPoint{0, 0}, WebCore::IntSize{10, 10}}; + WebCore::IntRect irB{WebCore::IntPoint{5, 5}, WebCore::IntSize{15, 15}}; + _ZN7WebCore7IntRect5uniteERKS0_(&irA, irB); + Require(irA.m_location.m_x == 0); + Require(irA.m_size.m_width == 20); + + WebCore::IntRect irInter{WebCore::IntPoint{0, 0}, WebCore::IntSize{10, 10}}; + WebCore::IntRect irInterTarget{WebCore::IntPoint{3, 3}, WebCore::IntSize{10, 10}}; + _ZN7WebCore7IntRect9intersectERKS0_(&irInter, irInterTarget); + Require(irInter.m_location.m_x == 3); + Require(irInter.m_size.m_width == 7); + + Require(_ZNK7WebCore7IntRect10intersectsERKS0_(&irInter, irInterTarget)); + WebCore::IntRect insideRect{WebCore::IntPoint{4, 4}, WebCore::IntSize{2, 2}}; + Require(_ZNK7WebCore7IntRect8containsERKS0_(&irInter, insideRect)); + + WebCore::LayoutRect lr{WebCore::LayoutPoint{64, 128}, WebCore::LayoutSize{192, 256}}; + WebCore::IntRect irFromLr1; + _ZN7WebCore7IntRectC1ERKNS_10LayoutRectE(&irFromLr1, lr); + Require(irFromLr1.m_location.m_x == 1); + Require(irFromLr1.m_location.m_y == 2); + Require(irFromLr1.m_size.m_width == 3); + Require(irFromLr1.m_size.m_height == 4); + + WebCore::IntRect irFromLr2; + _ZN7WebCore7IntRectC2ERKNS_10LayoutRectE(&irFromLr2, lr); + Require(irFromLr2.m_location.m_x == 1); + + WebCore::FloatRect fr{WebCore::FloatPoint{5.0f, 6.0f}, WebCore::FloatSize{7.0f, 8.0f}}; + WebCore::IntRect irFromFr1; + _ZN7WebCore7IntRectC1ERKNS_9FloatRectE(&irFromFr1, fr); + Require(irFromFr1.m_location.m_x == 5); + Require(irFromFr1.m_size.m_width == 7); + + WebCore::IntRect irFromFr2; + _ZN7WebCore7IntRectC2ERKNS_9FloatRectE(&irFromFr2, fr); + Require(irFromFr2.m_location.m_x == 5); +} + +static void TestLayoutRect() { + WebCore::FloatRect fr{WebCore::FloatPoint{1.5f, 2.25f}, WebCore::FloatSize{10.0f, 20.0f}}; + WebCore::LayoutRect lr1; + _ZN7WebCore10LayoutRectC1ERKNS_9FloatRectE(&lr1, fr); + Require(lr1.m_location.m_x.m_value == static_cast(std::round(1.5f * 64.0f))); + Require(lr1.m_location.m_y.m_value == static_cast(std::round(2.25f * 64.0f))); + + WebCore::LayoutRect lr2; + _ZN7WebCore10LayoutRectC2ERKNS_9FloatRectE(&lr2, fr); + Require(lr2.m_location.m_x.m_value == lr1.m_location.m_x.m_value); + + _ZN7WebCore10LayoutRect5scaleEf(&lr1, 2.0f); + Require(lr1.m_location.m_x.m_value == static_cast(std::round(3.0f * 64.0f))); + + WebCore::LayoutRect lrA{WebCore::LayoutPoint{0, 0}, WebCore::LayoutSize{640, 640}}; + WebCore::LayoutRect lrB{WebCore::LayoutPoint{320, 320}, WebCore::LayoutSize{640, 640}}; + _ZN7WebCore10LayoutRect5uniteERKS0_(&lrA, lrB); + Require(lrA.m_location.m_x.m_value == 0); + Require(lrA.m_size.m_width.m_value == 960); + + WebCore::LayoutRect insideLr{WebCore::LayoutPoint{64, 64}, WebCore::LayoutSize{128, 128}}; + Require(_ZNK7WebCore10LayoutRect8containsERKS0_(&lrA, insideLr)); +} + +static void TestRoundedRect() { + WebCore::LayoutRect lr{WebCore::LayoutPoint{0, 0}, WebCore::LayoutSize{6400, 6400}}; + WebCore::LayoutSize sz{640, 640}; + WebCore::RoundedRect rr1; + _ZN7WebCore11RoundedRectC1ERKNS_10LayoutRectERKNS_10LayoutSizeES6_S6_S6_(&rr1, lr, sz, sz, sz, sz); + Require(rr1.m_radii.m_topLeft.m_width.m_value == 640); + + WebCore::RoundedRect rr2; + _ZN7WebCore11RoundedRectC2ERKNS_10LayoutRectERKNS_10LayoutSizeES6_S6_S6_(&rr2, lr, sz, sz, sz, sz); + Require(rr2.m_radii.m_topLeft.m_width.m_value == 640); + + WebCore::LayoutRect insideLr{WebCore::LayoutPoint{1280, 1280}, WebCore::LayoutSize{640, 640}}; + Require(_ZNK7WebCore11RoundedRect8containsERKNS_10LayoutRectE(&rr1, insideLr)); +} + +static void TestColor() { + WebCore::Color c1; + c1.m_colorAndFlags = 0xFF0000FFull; + + WebCore::Color cCopy; + _ZN7WebCore5ColorC1ERKS0_(&cCopy, c1); + Require(cCopy.m_colorAndFlags == c1.m_colorAndFlags); + + WebCore::Color cCopy2; + _ZN7WebCore5ColorC2ERKS0_(&cCopy2, c1); + Require(cCopy2.m_colorAndFlags == c1.m_colorAndFlags); + + WebCore::Color cMoveSrc = c1; + WebCore::Color cMove; + _ZN7WebCore5ColorC1EOS0_(&cMove, std::move(cMoveSrc)); + Require(cMove.m_colorAndFlags == c1.m_colorAndFlags); + + WebCore::Color cAssign; + _ZN7WebCore5ColoraSERKS0_(&cAssign, c1); + Require(cAssign.m_colorAndFlags == c1.m_colorAndFlags); + + WebCore::Color cMoveAssign; + _ZN7WebCore5ColoraSEOS0_(&cMoveAssign, std::move(cAssign)); + Require(cMoveAssign.m_colorAndFlags == c1.m_colorAndFlags); + + WebCore::Color cAlpha = _ZNK7WebCore5Color14colorWithAlphaEf(&c1, 0.5f); + Require((cAlpha.m_colorAndFlags & 0xFF) == 128); + + WebCore::Color cWhite; + cWhite.m_colorAndFlags = 0xFFFFFFFFull; + Require(AlmostEqual(_ZNK7WebCore5Color9lightnessEv(&cWhite), 1.0)); + Require(AlmostEqual(_ZNK7WebCore5Color9luminanceEv(&cWhite), 1.0)); + + WebCore::Color cBlack; + cBlack.m_colorAndFlags = 0x000000FFull; + Require(AlmostEqual(_ZNK7WebCore5Color9lightnessEv(&cBlack), 0.0)); + Require(AlmostEqual(_ZNK7WebCore5Color9luminanceEv(&cBlack), 0.0)); + + WebCore::Color cDarkened = _ZNK7WebCore5Color8darkenedEv(&cWhite); + Require(((cDarkened.m_colorAndFlags >> 24) & 0xFF) < 255); + + WebCore::Color cLightened = _ZNK7WebCore5Color9lightenedEv(&cBlack); + Require(((cLightened.m_colorAndFlags >> 24) & 0xFF) > 0); +} + +static void TestAffineTransform() { + WebCore::AffineTransform at; + Require(_ZNK7WebCore15AffineTransform10isIdentityEv(&at)); + + _ZN7WebCore15AffineTransform9translateEdd(&at, 10.0, 20.0); + Require(!_ZNK7WebCore15AffineTransform10isIdentityEv(&at)); + + WebCore::FloatPoint p{0.0f, 0.0f}; + WebCore::FloatPoint mp = _ZNK7WebCore15AffineTransform8mapPointERKNS_10FloatPointE(&at, p); + Require(AlmostEqual(mp.m_x, 10.0f)); + Require(AlmostEqual(mp.m_y, 20.0f)); + + WebCore::IntPoint ip{5, 5}; + WebCore::IntPoint mip = _ZNK7WebCore15AffineTransform8mapPointERKNS_8IntPointE(&at, ip); + Require(mip.m_x == 15); + Require(mip.m_y == 25); + + _ZN7WebCore15AffineTransform12makeIdentityEv(&at); + Require(_ZNK7WebCore15AffineTransform10isIdentityEv(&at)); + + _ZN7WebCore15AffineTransform5scaleEd(&at, 2.0); + Require(AlmostEqual(_ZNK7WebCore15AffineTransform6xScaleEv(&at), 2.0)); + Require(AlmostEqual(_ZNK7WebCore15AffineTransform6yScaleEv(&at), 2.0)); + + WebCore::FloatSize scaleSz{1.5f, 0.5f}; + _ZN7WebCore15AffineTransform5scaleERKNS_9FloatSizeE(&at, scaleSz); + Require(AlmostEqual(_ZNK7WebCore15AffineTransform6xScaleEv(&at), 3.0)); + Require(AlmostEqual(_ZNK7WebCore15AffineTransform6yScaleEv(&at), 1.0)); + + WebCore::FloatPoint transPt{2.0f, 3.0f}; + _ZN7WebCore15AffineTransform9translateERKNS_10FloatPointE(&at, transPt); + + WebCore::FloatSize transSz{1.0f, 2.0f}; + _ZN7WebCore15AffineTransform9translateERKNS_9FloatSizeE(&at, transSz); + + WebCore::AffineTransform skewT; + _ZN7WebCore15AffineTransform4skewEdd(&skewT, 0.0, 45.0); + Require(!_ZNK7WebCore15AffineTransform10isIdentityEv(&skewT)); + + WebCore::AffineTransform shearT; + _ZN7WebCore15AffineTransform5shearEdd(&shearT, 0.2, 0.3); + Require(!_ZNK7WebCore15AffineTransform10isIdentityEv(&shearT)); + + WebCore::AffineTransform multT; + _ZN7WebCore15AffineTransform8multiplyERKS0_(&multT, skewT); + + _ZN7WebCore15AffineTransform12makeIdentityEv(&at); + _ZN7WebCore15AffineTransform5flipXEv(&at); + Require(AlmostEqual(at.m_transform[0], -1.0)); + + _ZN7WebCore15AffineTransform5flipYEv(&at); + Require(AlmostEqual(at.m_transform[3], -1.0)); + + _ZN7WebCore15AffineTransform12makeIdentityEv(&at); + _ZN7WebCore15AffineTransform6rotateEd(&at, 90.0); + WebCore::FloatPoint rp = _ZNK7WebCore15AffineTransform8mapPointERKNS_10FloatPointE( + &at, WebCore::FloatPoint{1.0f, 0.0f}); + Require(AlmostEqual(rp.m_x, 0.0f)); + Require(AlmostEqual(rp.m_y, 1.0f)); + + _ZN7WebCore15AffineTransform12makeIdentityEv(&at); + _ZN7WebCore15AffineTransform15scaleNonUniformEdd(&at, 2.0, 3.0); + WebCore::FloatRect fr{WebCore::FloatPoint{10.0f, 10.0f}, WebCore::FloatSize{5.0f, 5.0f}}; + WebCore::FloatRect mfr = _ZNK7WebCore15AffineTransform7mapRectERKNS_9FloatRectE(&at, fr); + Require(AlmostEqual(mfr.m_location.m_x, 20.0f)); + Require(AlmostEqual(mfr.m_location.m_y, 30.0f)); + Require(AlmostEqual(mfr.m_size.m_width, 10.0f)); + Require(AlmostEqual(mfr.m_size.m_height, 15.0f)); + + WebCore::IntRect ir{WebCore::IntPoint{10, 10}, WebCore::IntSize{5, 5}}; + WebCore::IntRect mir = _ZNK7WebCore15AffineTransform7mapRectERKNS_7IntRectE(&at, ir); + Require(mir.m_location.m_x == 20); + Require(mir.m_size.m_width == 10); + + WebCore::FloatSize fsz{10.0f, 20.0f}; + WebCore::FloatSize mfsz = _ZNK7WebCore15AffineTransform7mapSizeERKNS_9FloatSizeE(&at, fsz); + Require(AlmostEqual(mfsz.m_width, 20.0f)); + Require(AlmostEqual(mfsz.m_height, 60.0f)); + + WebCore::IntSize isz{10, 20}; + WebCore::IntSize misz = _ZNK7WebCore15AffineTransform7mapSizeERKNS_7IntSizeE(&at, isz); + Require(misz.m_width == 20); + Require(misz.m_height == 60); + + WebCore::FloatQuad q{ + WebCore::FloatPoint{0.0f, 0.0f}, + WebCore::FloatPoint{10.0f, 0.0f}, + WebCore::FloatPoint{10.0f, 10.0f}, + WebCore::FloatPoint{0.0f, 10.0f} + }; + WebCore::FloatQuad mq = _ZNK7WebCore15AffineTransform7mapQuadERKNS_9FloatQuadE(&at, q); + Require(AlmostEqual(mq.m_p2.m_x, 20.0f)); + + WebCore::TransformationMatrix tm = _ZNK7WebCore15AffineTransform22toTransformationMatrixEv(&at); + Require(AlmostEqual(tm.m_matrix[0][0], 2.0)); + Require(AlmostEqual(tm.m_matrix[1][1], 3.0)); +} + +static void TestTransformationMatrix() { + WebCore::TransformationMatrix tm; + Require(_ZNK7WebCore20TransformationMatrix12isInvertibleEv(&tm)); + + _ZN7WebCore20TransformationMatrix11translate3dEddd(&tm, 5.0, 10.0, 15.0); + Require(AlmostEqual(tm.m_matrix[3][0], 5.0)); + Require(AlmostEqual(tm.m_matrix[3][1], 10.0)); + Require(AlmostEqual(tm.m_matrix[3][2], 15.0)); + + _ZN7WebCore20TransformationMatrix9translateEdd(&tm, 5.0, 5.0); + Require(AlmostEqual(tm.m_matrix[3][0], 10.0)); + Require(AlmostEqual(tm.m_matrix[3][1], 15.0)); + + WebCore::FloatPoint p{0.0f, 0.0f}; + WebCore::FloatPoint mp = _ZNK7WebCore20TransformationMatrix8mapPointERKNS_10FloatPointE(&tm, p); + Require(AlmostEqual(mp.m_x, 10.0f)); + Require(AlmostEqual(mp.m_y, 15.0f)); + + WebCore::TransformationMatrix scaleMat; + _ZN7WebCore20TransformationMatrix5scaleEd(&scaleMat, 3.0); + _ZN7WebCore20TransformationMatrix5flipXEv(&scaleMat); + Require(AlmostEqual(scaleMat.m_matrix[0][0], -3.0)); + _ZN7WebCore20TransformationMatrix5flipYEv(&scaleMat); + Require(AlmostEqual(scaleMat.m_matrix[1][1], -3.0)); + _ZN7WebCore20TransformationMatrix8multiplyERKS0_(&tm, scaleMat); + + WebCore::TransformationMatrix rotMat; + _ZN7WebCore20TransformationMatrix6rotateEd(&rotMat, 90.0); + Require(AlmostEqual(rotMat.m_matrix[0][1], 1.0)); + + WebCore::TransformationMatrix rot3dMat; + _ZN7WebCore20TransformationMatrix8rotate3dEddd(&rot3dMat, 0.0, 90.0, 0.0); + Require(_ZNK7WebCore20TransformationMatrix12isInvertibleEv(&rot3dMat)); + + WebCore::TransformationMatrix skewMat; + _ZN7WebCore20TransformationMatrix4skewEdd(&skewMat, 30.0, 45.0); + Require(_ZNK7WebCore20TransformationMatrix12isInvertibleEv(&skewMat)); + + _ZN7WebCore20TransformationMatrix10makeAffineEv(&tm); + Require(AlmostEqual(tm.m_matrix[0][2], 0.0)); + Require(AlmostEqual(tm.m_matrix[3][2], 0.0)); + + WebCore::AffineTransform at = _ZNK7WebCore20TransformationMatrix17toAffineTransformEv(&tm); + Require(AlmostEqual(at.m_transform[0], tm.m_matrix[0][0])); + + WebCore::FloatRect srcR{WebCore::FloatPoint{0.0f, 0.0f}, WebCore::FloatSize{100.0f, 100.0f}}; + WebCore::FloatRect dstR{WebCore::FloatPoint{50.0f, 50.0f}, WebCore::FloatSize{200.0f, 200.0f}}; + WebCore::TransformationMatrix r2r = _ZN7WebCore20TransformationMatrix10rectToRectERKNS_9FloatRectES3_(srcR, dstR); + Require(AlmostEqual(r2r.m_matrix[0][0], 2.0)); + Require(AlmostEqual(r2r.m_matrix[1][1], 2.0)); + Require(AlmostEqual(r2r.m_matrix[3][0], 50.0)); + Require(AlmostEqual(r2r.m_matrix[3][1], 50.0)); + + WebCore::FloatQuad q{ + WebCore::FloatPoint{0.0f, 0.0f}, + WebCore::FloatPoint{10.0f, 0.0f}, + WebCore::FloatPoint{10.0f, 10.0f}, + WebCore::FloatPoint{0.0f, 10.0f} + }; + WebCore::FloatQuad mq = _ZNK7WebCore20TransformationMatrix7mapQuadERKNS_9FloatQuadE(&r2r, q); + Require(AlmostEqual(mq.m_p1.m_x, 50.0f)); + Require(AlmostEqual(mq.m_p2.m_x, 70.0f)); + + WebCore::FloatRect mr = _ZNK7WebCore20TransformationMatrix7mapRectERKNS_9FloatRectE(&r2r, srcR); + Require(AlmostEqual(mr.m_location.m_x, 50.0f)); + Require(AlmostEqual(mr.m_size.m_width, 200.0f)); + + WebCore::TransformationMatrix fromAt1; + _ZN7WebCore20TransformationMatrixC1ERKNS_15AffineTransformE(&fromAt1, at); + Require(AlmostEqual(fromAt1.m_matrix[0][0], at.m_transform[0])); + + WebCore::TransformationMatrix fromAt2; + _ZN7WebCore20TransformationMatrixC2ERKNS_15AffineTransformE(&fromAt2, at); + Require(AlmostEqual(fromAt2.m_matrix[0][0], at.m_transform[0])); +} + +static void TestMatrixTransformOperation() { + WebCore::MatrixTransformOperation op{}; + op.m_a = 2.0; + op.m_b = 0.5; + op.m_c = -0.5; + op.m_d = 3.0; + op.m_e = 100.0; + op.m_f = 200.0; + + WebCore::TransformationMatrix tm = _ZNK7WebCore24MatrixTransformOperation6matrixEv(&op); + Require(AlmostEqual(tm.m_matrix[0][0], 2.0)); + Require(AlmostEqual(tm.m_matrix[0][1], 0.5)); + Require(AlmostEqual(tm.m_matrix[1][0], -0.5)); + Require(AlmostEqual(tm.m_matrix[1][1], 3.0)); + Require(AlmostEqual(tm.m_matrix[3][0], 100.0)); + Require(AlmostEqual(tm.m_matrix[3][1], 200.0)); + Require(AlmostEqual(tm.m_matrix[2][2], 1.0)); + Require(AlmostEqual(tm.m_matrix[3][3], 1.0)); +} + +int main() { + TestFloatPoint(); + TestFloatSize(); + TestFloatRect(); + TestFloatQuad(); + TestFloatRoundedRect(); + TestIntPointIntSizeIntRect(); + TestLayoutRect(); + TestRoundedRect(); + TestColor(); + TestAffineTransform(); + TestTransformationMatrix(); + TestMatrixTransformOperation(); + return 0; +} diff --git a/core/libs/prx/libSceNKWebKit/tests/Wtf.cpp b/core/libs/prx/libSceNKWebKit/tests/Wtf.cpp new file mode 100644 index 0000000000..5d0ac3dcb9 --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/tests/Wtf.cpp @@ -0,0 +1,876 @@ +#include "prx/libc/include/general/VabiMacros.hpp" +#include "prx/libSceNKWebKit/libSceNKWebKit.hpp" + +#include +#include +#include +#include +#include +#include +#include "../src/WtfStringAbi.hpp" +#include +#include +#include +#include + +namespace { + +void Require(bool condition) { + if (!condition) { + std::abort(); + } +} + +template +void* TryResult(Function function, Args... args) { + WTF::TryMallocReturnValue result{reinterpret_cast(std::uintptr_t{0xDEADBEEF})}; + WTF::TryMallocReturnValue* returned = function(&result, args...); + Require(returned == &result); + return result.data; +} + +using WTF::ClockType; +using WTF::TimeType; +using WTF::Seconds; +using WTF::MonotonicTime; +using WTF::WallTime; +using WTF::TimeWithDynamicClockType; +using WTF::CPUTime; +using WTF::GregorianDateTime; +using WTF::LocalTimeOffset; +using WebCore::FloatPoint; +using WebCore::FloatSize; +using WebCore::FloatRect; +using WebCore::IntPoint; +using WebCore::IntSize; +using WebCore::IntRect; + +} // namespace + +static void TestAllocationBoundaries() { + constexpr std::size_t maxSize = std::numeric_limits::max(); + Require(TryResult(_ZN3WTF13tryFastMallocEm, maxSize) == nullptr); + Require(TryResult(_ZN3WTF13tryFastMallocEm, maxSize - 8) == nullptr); + Require(TryResult(_ZN3WTF13tryFastMallocEm, maxSize - 64) == nullptr); + Require(TryResult(_ZN3WTF19tryFastZeroedMallocEm, maxSize) == nullptr); + Require(TryResult(_ZN3WTF13tryFastCallocEmm, 1, maxSize) == nullptr); + Require(TryResult(_ZN3WTF13tryFastCallocEmm, maxSize, 2) == nullptr); + Require(TryResult(_ZN3WTF13tryFastCallocEmm, maxSize / 2 + 1, 2) == nullptr); + Require(_ZN3WTF20tryFastAlignedMallocEmm(64, maxSize) == nullptr); + Require(_ZN3WTF20tryFastAlignedMallocEmm(std::size_t{1} << 62, 64) == nullptr); + Require(_ZN3WTF20tryFastAlignedMallocEmm(maxSize, 64) == nullptr); + Require(_ZN3WTF20tryFastAlignedMallocEmm(48, 64) == nullptr); + + void* p = _ZN3WTF10fastMallocEm(32); + Require(p != nullptr); + std::memset(p, 0x5A, 32); + Require(TryResult(_ZN3WTF14tryFastReallocEPvm, p, maxSize) == nullptr); + Require(_ZN3WTF14fastMallocSizeEPKv(p) == 32); + Require(static_cast(p)[31] == 0x5A); + _ZN3WTF8fastFreeEPv(p); + + void* z = TryResult(_ZN3WTF13tryFastCallocEmm, maxSize / 8, 0); + if (z) { + _ZN3WTF8fastFreeEPv(z); + } + void* zero = TryResult(_ZN3WTF13tryFastCallocEmm, 0, maxSize); + if (zero) { + _ZN3WTF8fastFreeEPv(zero); + } + + void* m = TryResult(_ZN3WTF13tryFastMallocEm, std::size_t{48}); + Require(m != nullptr); + Require(_ZN3WTF14fastMallocSizeEPKv(m) == 48); + std::memset(m, 0x3C, 48); + void* r = TryResult(_ZN3WTF14tryFastReallocEPvm, m, std::size_t{96}); + Require(r != nullptr); + Require(_ZN3WTF14fastMallocSizeEPKv(r) == 96); + for (int i = 0; i < 48; ++i) { + Require(static_cast(r)[i] == 0x3C); + } + _ZN3WTF8fastFreeEPv(r); + + auto* zm = static_cast(TryResult(_ZN3WTF19tryFastZeroedMallocEm, std::size_t{40})); + Require(zm != nullptr); + for (int i = 0; i < 40; ++i) { + Require(zm[i] == 0); + } + _ZN3WTF8fastFreeEPv(zm); + + auto* cm = static_cast(TryResult(_ZN3WTF13tryFastCallocEmm, std::size_t{6}, std::size_t{8})); + Require(cm != nullptr); + for (int i = 0; i < 48; ++i) { + Require(cm[i] == 0); + } + _ZN3WTF8fastFreeEPv(cm); +} + +static void TestMemoryAllocations() { + void* p1 = _ZN3WTF10fastMallocEm(128); + Require(p1 != nullptr); + Require((reinterpret_cast(p1) & 0x0F) == 0); + std::memset(p1, 0xAB, 128); + Require(_ZN3WTF14fastMallocSizeEPKv(p1) >= 128); + Require(_ZN3WTF18fastMallocGoodSizeEm(128) >= 128); + + void* p2 = _ZN3WTF11fastReallocEPvm(p1, 256); + Require(p2 != nullptr); + auto* b2 = static_cast(p2); + for (int i = 0; i < 128; ++i) { + Require(b2[i] == 0xAB); + } + _ZN3WTF8fastFreeEPv(p2); + + void* pZero = _ZN3WTF16fastZeroedMallocEm(64); + Require(pZero != nullptr); + auto* bZero = static_cast(pZero); + for (int i = 0; i < 64; ++i) { + Require(bZero[i] == 0); + } + _ZN3WTF8fastFreeEPv(pZero); + + void* pCalloc = _ZN3WTF10fastCallocEmm(10, 8); + Require(pCalloc != nullptr); + _ZN3WTF8fastFreeEPv(pCalloc); + + void* pAligned = _ZN3WTF17fastAlignedMallocEmm(64, 128); + Require(pAligned != nullptr); + Require((reinterpret_cast(pAligned) & 63) == 0); + _ZN3WTF15fastAlignedFreeEPv(pAligned); + + char* dup = _ZN3WTF10fastStrDupEPKc("hello wtf"); + Require(dup != nullptr); + Require(std::strcmp(dup, "hello wtf") == 0); + _ZN3WTF8fastFreeEPv(dup); + + Require(_ZN3WTF19isFastMallocEnabledEv() == true); + _ZN3WTF27releaseFastMallocFreeMemoryEv(); + _ZN3WTF40releaseFastMallocFreeMemoryForThisThreadEv(); + _ZN3WTF18fastEnableMiniModeEv(); + _ZN3WTF20fastDisableScavengerEv(); + FastMallocStatistics stats = _ZN3WTF20fastMallocStatisticsEv(); + static_cast(stats); + _ZN3WTF25fastMallocDumpMallocStatsEv(); + + void* jsVal = _ZN3WTF13jsValueMallocEm(32); + Require(jsVal != nullptr); + _ZN3WTF11jsValueFreeEPv(jsVal); + + void* bm = _ZN7bmalloc3api15mallocOutOfLineEmNS_8HeapKindE(96, 0); + Require(bm != nullptr); + _ZN7bmalloc3api13freeOutOfLineEPvNS_8HeapKindE(bm, 0); + Require(_ZN7bmalloc3api9isEnabledENS_8HeapKindE(0) == true); + Require(_ZN7bmalloc15availableMemoryEv() > 0); + Require(_ZN7bmalloc16isActiveHeapKindENS_8HeapKindE(0) == true); + Require(_ZN7bmalloc16isActiveHeapKindENS_8HeapKindE(1) == false); + Require(_ZN7bmalloc19mapToActiveHeapKindENS_8HeapKindE(2) == 0); + _ZN7bmalloc3api8scavengeEv(); + _ZN7bmalloc3api14enableMiniModeEv(); + _ZN7bmalloc3api16disableScavengerEv(); + + void* gc = _ZN8Gigacage6mallocENS_4KindEm(0, 112); + Require(gc != nullptr); + _ZN8Gigacage4freeENS_4KindEPv(0, gc); + + void* gcArr = _ZN8Gigacage11mallocArrayENS_4KindEmm(0, 5, 20); + Require(gcArr != nullptr); + void* gcRealloc = _ZN8Gigacage10tryReallocENS_4KindEPvm(0, gcArr, 200); + Require(gcRealloc != nullptr); + _ZN8Gigacage4freeENS_4KindEPv(0, gcRealloc); + + void* gcAligned = _ZN8Gigacage16tryAlignedMallocENS_4KindEmm(0, 128, 64); + Require(gcAligned != nullptr); + Require((reinterpret_cast(gcAligned) & 127) == 0); + _ZN8Gigacage11alignedFreeENS_4KindEPv(0, gcAligned); + + void* cross = _ZN3WTF10fastMallocEm(50); + _ZN7bmalloc3api13freeOutOfLineEPvNS_8HeapKindE(cross, 0); + + void* cross2 = _ZN7bmalloc3api15mallocOutOfLineEmNS_8HeapKindE(60, 0); + _ZN8Gigacage4freeENS_4KindEPv(0, cross2); +} + +static void TestTime() { + MonotonicTime mNow = _ZN3WTF13MonotonicTime3nowEv(); + Require(mNow.m_value > 0.0); + WallTime wNow = _ZN3WTF8WallTime3nowEv(); + Require(wNow.m_value > 1000000000.0); + + WallTime approxW = _ZNK3WTF13MonotonicTime19approximateWallTimeEv(&mNow); + Require(std::abs(approxW.m_value - wNow.m_value) < 5.0); + + MonotonicTime approxM = _ZNK3WTF8WallTime24approximateMonotonicTimeEv(&wNow); + Require(std::abs(approxM.m_value - mNow.m_value) < 5.0); + + TimeWithDynamicClockType dynWall = _ZN3WTF24TimeWithDynamicClockType3nowENS_9ClockTypeE(ClockType::Wall); + Require(dynWall.m_type == ClockType::Wall); + Require(dynWall.m_value > 0.0); + + TimeWithDynamicClockType dynMono = _ZN3WTF24TimeWithDynamicClockType3nowENS_9ClockTypeE(ClockType::Monotonic); + Require(dynMono.m_type == ClockType::Monotonic); + + TimeWithDynamicClockType dynMono2 = dynMono; + dynMono2.m_value += 1.0; + Require(_ZNK3WTF24TimeWithDynamicClockTypegtERKS0_(&dynMono2, dynMono)); + Require(_ZNK3WTF24TimeWithDynamicClockTypegeERKS0_(&dynMono2, dynMono)); + Require(_ZNK3WTF24TimeWithDynamicClockTypeleERKS0_(&dynMono, dynMono2)); + + Seconds diff = _ZNK3WTF24TimeWithDynamicClockTypemiERKS0_(&dynMono2, dynMono); + Require(std::abs(diff.m_value - 1.0) < 1e-6); + + Require(_ZN3WTF10hasElapsedERKNS_24TimeWithDynamicClockTypeE(dynMono) == true); + TimeWithDynamicClockType farFuture = dynMono; + farFuture.m_value += 1000.0; + Require(_ZN3WTF10hasElapsedERKNS_24TimeWithDynamicClockTypeE(farFuture) == false); + + Seconds sec{10.0}; + MonotonicTime mSub = _ZNK3WTF7SecondsmiENS_13MonotonicTimeE(&sec, MonotonicTime{4.0}); + Require(std::abs(mSub.m_value - 6.0) < 1e-6); + MonotonicTime mAdd = _ZNK3WTF7SecondsplENS_13MonotonicTimeE(&sec, MonotonicTime{4.0}); + Require(std::abs(mAdd.m_value - 14.0) < 1e-6); + + WallTime wSub = _ZNK3WTF7SecondsmiENS_8WallTimeE(&sec, WallTime{3.0}); + Require(std::abs(wSub.m_value - 7.0) < 1e-6); + WallTime wAdd = _ZNK3WTF7SecondsplENS_8WallTimeE(&sec, WallTime{3.0}); + Require(std::abs(wAdd.m_value - 13.0) < 1e-6); + + GregorianDateTime gdt{}; + _ZN3WTF17GregorianDateTime21setToCurrentLocalTimeEv(&gdt); + Require(gdt.m_year >= 2024); + Require(gdt.m_month >= 0 && gdt.m_month <= 11); + Require(gdt.m_monthDay >= 1 && gdt.m_monthDay <= 31); + + LocalTimeOffset lto = _ZN3WTF24calculateLocalTimeOffsetEdNS_8TimeTypeE(0.0, TimeType::UTCTime); + Require(lto.offset >= -86400000 && lto.offset <= 86400000); + + bool isLocal = false; + double parsed = _ZN3WTF40parseES5DateFromNullTerminatedCharactersEPKcRb("2024-05-10T12:00:00Z", isLocal); + Require(!std::isnan(parsed)); + Require(parsed > 1700000000000.0); + Require(isLocal == false); + + bool isLocal2 = false; + double parsedInvalid = _ZN3WTF40parseES5DateFromNullTerminatedCharactersEPKcRb("not-a-date", isLocal2); + Require(std::isnan(parsedInvalid)); + + Seconds threadCpu = _ZN3WTF7CPUTime16forCurrentThreadEv(); + Require(threadCpu.m_value >= 0.0); +} + +static void TestSystem() { + int cores = _ZN3WTF22numberOfProcessorCoresEv(); + Require(cores >= 1); + + std::uint64_t ram = _ZN3WTF7ramSizeEv(); + Require(ram >= 1024ULL * 1024ULL * 1024ULL); + + std::size_t page = _ZN3WTF8pageSizeEv(); + Require(page == 4096); + + _ZN3WTF6Config17permanentlyFreezeEv(); + + char b1[16] = {0}; + char b2[16] = {0}; + Require(_ZN3WTF18constantTimeMemcmpEPKvS1_m(b1, b2, 16) == 0); + b2[5] = 1; + Require(_ZN3WTF18constantTimeMemcmpEPKvS1_m(b1, b2, 16) != 0); + + std::uint8_t randBytes[32] = {0}; + _ZN3WTF29cryptographicallyRandomValuesEPvm(randBytes, sizeof(randBytes)); + bool hasNonZero = false; + for (std::size_t i = 0; i < sizeof(randBytes); ++i) { + if (randBytes[i] != 0) { + hasNonZero = true; + break; + } + } + Require(hasNonZero); +} + +static void TestString() { + const char* ascii = "hello world"; + unsigned int dataLen = 0; + unsigned int u16Len = 0; + unsigned int hash = _ZN3WTF7Unicode51calculateStringHashAndLengthFromUTF8MaskingTop8BitsEPKcS2_RjS3_( + ascii, ascii + std::strlen(ascii), dataLen, u16Len); + Require(hash != 0); + Require(dataLen == std::strlen(ascii)); + Require(u16Len == std::strlen(ascii)); + Require((hash & 0xFF000000U) == 0); + + const char* utf8 = "caf\xc3\xa9"; + unsigned int hash2 = _ZN3WTF7Unicode51calculateStringHashAndLengthFromUTF8MaskingTop8BitsEPKcS2_RjS3_( + utf8, utf8 + std::strlen(utf8), dataLen, u16Len); + Require(hash2 != 0); + Require(dataLen == 5); + Require(u16Len == 4); + + const char16_t numStr[] = u"123.456 extra"; + std::size_t parsedLen = 0; + double d = _ZN3WTF8Internal25parseDoubleFromLongStringEPKDsmRm(numStr, sizeof(numStr) / sizeof(char16_t) - 1, parsedLen); + Require(std::abs(d - 123.456) < 1e-6); + Require(parsedLen == 7); +} + +static void TestWebCorePure() { + Require(_ZN7WebCore30isStatusCodeCacheableByDefaultEi(200) == true); + Require(_ZN7WebCore30isStatusCodeCacheableByDefaultEi(404) == true); + Require(_ZN7WebCore30isStatusCodeCacheableByDefaultEi(403) == false); + Require(_ZN7WebCore30isStatusCodeCacheableByDefaultEi(500) == false); + + Require(_ZN7WebCore32isStatusCodePotentiallyCacheableEi(302) == true); + Require(_ZN7WebCore32isStatusCodePotentiallyCacheableEi(403) == true); + Require(_ZN7WebCore32isStatusCodePotentiallyCacheableEi(500) == false); + + Require(_ZN7WebCore43initializeMaximumHTTPConnectionCountPerHostEv() == 4); + _ZN7WebCore27setPresentingApplicationPIDEi(1234); + + FloatRect container{FloatPoint{0.0f, 0.0f}, FloatSize{200.0f, 100.0f}}; + FloatRect inside = _ZN7WebCore36largestRectWithAspectRatioInsideRectEfRKNS_9FloatRectE(1.0f, container); + Require(std::abs(inside.m_size.m_width - 100.0f) < 1e-3f); + Require(std::abs(inside.m_size.m_height - 100.0f) < 1e-3f); + Require(std::abs(inside.m_location.m_x - 50.0f) < 1e-3f); + + FloatRect around = _ZN7WebCore37smallestRectWithAspectRatioAroundRectEfRKNS_9FloatRectE(1.0f, container); + Require(std::abs(around.m_size.m_width - 200.0f) < 1e-3f); + Require(std::abs(around.m_size.m_height - 200.0f) < 1e-3f); + + FloatRect fr{FloatPoint{10.2f, 20.8f}, FloatSize{100.4f, 50.6f}}; + IntRect ir = _ZN7WebCore14roundedIntRectERKNS_9FloatRectE(fr); + Require(ir.m_location.m_x == 10); + Require(ir.m_location.m_y == 21); + Require(ir.m_size.m_width == 100); + Require(ir.m_size.m_height == 51); +} + +static void TestJscAndPal() { + double arr[4] = {1.0, 2.0, 3.0, 4.0}; + _ZN3JSC16clearArrayMemsetEPdj(arr, 4); + for (int i = 0; i < 4; ++i) { + Require(std::isnan(arr[i])); + } + + _ZN3JSC18enableSuperSamplerEv(); + _ZN3JSC19disableSuperSamplerEv(); + _ZN3JSC22printSuperSamplerStateEv(); + + Require(_ZN3JSC25numberOfOSRExitFuzzChecksEv() == 0); + Require(_ZN3JSC31numberOfStaticOSRExitFuzzChecksEv() == 0); + Require(_ZN3JSC27numberOfExceptionFuzzChecksEv() == 0); + Require(_ZN3JSC38numberOfExecutableAllocationFuzzChecksEv() == 0); + + _ZN3JSC27finalizeStatsAtEndOfTestingEv(); + _ZN3JSC20waitForVMDestructionEv(); + _ZN3JSC30waitForAsynchronousDisassemblyEv(); + _ZN3JSC18logTotalPhaseTimesEv(); + + _ZN3PAL10systemBeepEv(); + + void* stack[8] = {nullptr}; + int frames = 0; + WTFGetBacktrace(stack, &frames); + Require(frames >= 0); + Require(WTFIsDebuggerAttached() == false); +} + +void TestAdditionalWtf(); + +int main() { + TestAdditionalWtf(); + TestMemoryAllocations(); + TestAllocationBoundaries(); + TestTime(); + TestSystem(); + TestString(); + TestWebCorePure(); + TestJscAndPal(); + return 0; +} + +namespace Wtf2Tests { + +using namespace NKWebKit::WtfAbi; + +extern "C" { +} + +const auto Create8 = &_ZN3WTF10StringImpl6createEPKhj; +const auto Create16 = &_ZN3WTF10StringImpl6createEPKDsj; +const auto Narrow = &_ZN3WTF10StringImpl20create8BitIfPossibleEPKDsj; +const auto Uninit8 = &_ZN3WTF10StringImpl19createUninitializedEjRPh; +const auto Uninit16 = &_ZN3WTF10StringImpl19createUninitializedEjRPDs; +const auto ImplLower = &_ZN3WTF10StringImpl23convertToASCIILowercaseEv; +const auto ImplUpper = &_ZN3WTF10StringImpl23convertToASCIIUppercaseEv; +const auto Lower = &_ZNK3WTF6String23convertToASCIILowercaseEv; +const auto Upper = &_ZNK3WTF6String23convertToASCIIUppercaseEv; +const auto ViewLower = &_ZNK3WTF10StringView23convertToASCIILowercaseEv; +const auto ViewUpper = &_ZNK3WTF10StringView23convertToASCIIUppercaseEv; +const auto ImplUTF8 = &_ZNK3WTF10StringImpl4utf8ENS_14ConversionModeE; +const auto UTF8 = &_ZNK3WTF6String4utf8ENS_14ConversionModeE; +const auto ViewUTF8 = &_ZNK3WTF10StringView4utf8ENS_14ConversionModeE; +const auto FromUTF8 = &_ZN3WTF6String8fromUTF8EPKhm; +const auto FromUTF8Z = &_ZN3WTF6String8fromUTF8EPKh; +const auto FromCString = &_ZN3WTF6String8fromUTF8ERKNS_7CStringE; +const auto LatinFallback = &_ZN3WTF6String26fromUTF8WithLatin1FallbackEPKhm; +const auto FromCodePoint = &_ZN3WTF6String13fromCodePointEi; +const auto Character = &_ZNK3WTF6String19characterStartingAtEj; +const auto ImplCharacter = &_ZN3WTF10StringImpl19characterStartingAtEj; +const auto Hash = &_ZNK3WTF10StringImpl12hashSlowCaseEv; +const auto ConcurrentHash = &_ZNK3WTF10StringImpl14concurrentHashEv; +const auto BytesSize = &_ZNK3WTF10StringImpl11sizeInBytesEv; +const auto Starts = &_ZNK3WTF10StringImpl10startsWithEDs; +const auto Ends = &_ZNK3WTF10StringImpl8endsWithEDs; +const auto Prefix = &_ZNK3WTF10StringImpl10startsWithEPKcj; +const auto Suffix = &_ZNK3WTF10StringImpl8endsWithEPKcj; +const auto ViewStarts = &_ZNK3WTF10StringView10startsWithEDs; +const auto ViewEnds = &_ZNK3WTF10StringView8endsWithEDs; +const auto ReverseFind = &_ZN3WTF10StringImpl11reverseFindEDsj; +const auto Substring = &_ZN3WTF10StringImpl9substringEjj; +const auto SharedSubstring = &_ZNK3WTF6String20substringSharingImplEjj; +const auto Safe = &_ZNK3WTF6String27isSafeToSendToAnotherThreadEv; +const auto Ascii = &_ZNK3WTF6String5asciiEv; +const auto Latin1 = &_ZNK3WTF6String6latin1Ev; +const auto Find = &_ZNK3WTF10StringView4findES0_j; +const auto Case8 = &_ZNK3WTF10StringView26getCharactersWithASCIICaseENS0_15CaseConvertTypeEPh; +const auto Case16 = &_ZNK3WTF10StringView26getCharactersWithASCIICaseENS0_15CaseConvertTypeEPDs; +const auto EqualViews = &_ZN3WTF22equalRespectingNullityENS_10StringViewES0_; +const auto Equal = &_ZN3WTF5equalEPKNS_10StringImplES2_; +const auto EqualRefs = &_ZN3WTF5equalERKNS_10StringImplES2_; +const auto Equal8 = &_ZN3WTF5equalEPKNS_10StringImplEPKhj; +const auto Equal16 = &_ZN3WTF5equalEPKNS_10StringImplEPKDsj; +const auto EqualZ = &_ZN3WTF5equalEPKNS_10StringImplEPKh; +const auto EqualNullity = &_ZN3WTF20equalIgnoringNullityEPNS_10StringImplES1_; +const auto EqualRawNullity = &_ZN3WTF20equalIgnoringNullityEPKDsmPNS_10StringImplE; +const auto EqualCase = &_ZN3WTF22equalIgnoringASCIICaseEPKNS_10StringImplES2_; +const auto EqualCaseNonNull = &_ZN3WTF29equalIgnoringASCIICaseNonNullEPKNS_10StringImplES2_; +const auto CStringNew = &_ZN3WTF7CString16newUninitializedEmRPc; +const auto CStringMutable = &_ZN3WTF7CString11mutableDataEv; +const auto CStringGrow = &_ZN3WTF7CString4growEm; +const auto CStringHash = &_ZNK3WTF7CString4hashEv; +const auto CStringEqual = &_ZN3WTFeqERKNS_7CStringES2_; +const auto CStringEqualZ = &_ZN3WTFeqERKNS_7CStringEPKc; +const auto CStringLess = &_ZN3WTFltERKNS_7CStringES2_; +const auto CStringHashEqual = &_ZN3WTF11CStringHash5equalERKNS_7CStringES3_; +const auto AllPrivileges = &_ZN3WTF13allPrivilegesEv; +const auto SetPrivileges = &_ZN3WTF20setProcessPrivilegesENS_9OptionSetINS_16ProcessPrivilegeEEE; +const auto AddPrivilege = &_ZN3WTF19addProcessPrivilegeENS_16ProcessPrivilegeE; +const auto RemovePrivilege = &_ZN3WTF22removeProcessPrivilegeENS_16ProcessPrivilegeE; +const auto HasPrivilege = &_ZN3WTF19hasProcessPrivilegeENS_16ProcessPrivilegeE; +const auto SixHash = &_ZN3WTF31sixCharacterHashStringToIntegerEPKc; +const auto IsReload = &_ZN7WebCore8isReloadENS_13FrameLoadTypeE; +const auto IsBackForward = &_ZN7WebCore21isBackForwardLoadTypeENS_13FrameLoadTypeE; + +void Check(bool condition, std::source_location location = std::source_location::current()) { + if (!condition) { + std::fprintf(stderr, "WTF additional test failed at line %u\n", location.line()); + std::abort(); + } +} + +template void Throws(T action) { + bool threw = false; + try { action(); } catch (const std::exception&) { threw = true; } + Check(threw); +} + +const unsigned char* U8(const char* data) { return reinterpret_cast(data); } +std::string Bytes(const CString& value) { + return value.buffer ? std::string(reinterpret_cast(value.buffer + 1), value.buffer->length) : std::string(); +} +void Text(const String& value, const char* expected) { + Check(value.impl != nullptr); + Check(Bytes(UTF8(&value, 1)) == expected); +} + +void TestStorageAndQueries() { + String null; + auto empty = Create8(U8(""), 0); + Check(null.impl == nullptr && empty.impl != nullptr && empty.impl->length == 0); + auto fromNull = Create16(nullptr, 99); + Check(fromNull.impl == empty.impl); + unsigned char* data8 = reinterpret_cast(1); + auto empty8 = Uninit8(0, data8); + Check(!data8 && empty8.impl == empty.impl); + char16_t* data16 = reinterpret_cast(1); + auto empty16 = Uninit16(0, data16); + Check(!data16 && empty16.impl == empty.impl); + auto made8 = Uninit8(3, data8); + std::memcpy(data8, "aBa", 3); + Check(made8.impl->refCount == 2 && made8.impl->hashAndFlags == 4); + Check(made8.impl->data == reinterpret_cast(made8.impl) + 20); + auto made16 = Uninit16(3, data16); + data16[0] = 'a'; data16[1] = 'B'; data16[2] = 'a'; + Check(made16.impl->hashAndFlags == 0); + Check(Equal(made8.impl, made16.impl) && EqualRefs(*made8.impl, *made16.impl)); + Check(Equal8(made16.impl, U8("aBa"), 3) && Equal16(made8.impl, u"aBa", 3)); + Check(EqualZ(made16.impl, U8("aBa")) && !EqualZ(made16.impl, U8("aB"))); + Check(Equal(nullptr, nullptr) && !Equal(nullptr, empty.impl)); + Check(Equal8(nullptr, nullptr, 4) && !Equal8(empty.impl, nullptr, 0)); + Check(EqualNullity(nullptr, empty.impl) && EqualRawNullity(nullptr, 0, empty.impl)); + Check(!EqualNullity(nullptr, made8.impl) && !EqualRawNullity(u"aB", 2, made8.impl)); + auto lower = Create8(U8("aba"), 3); + Check(EqualCase(made16.impl, lower.impl) && EqualCaseNonNull(made8.impl, lower.impl)); + Check(EqualCase(nullptr, nullptr) && !EqualCase(nullptr, empty.impl)); + Throws([&] { EqualCaseNonNull(nullptr, lower.impl); }); + Check(BytesSize(made8.impl) == 27 && BytesSize(made16.impl) == 30); + Check(ConcurrentHash(made8.impl) == ConcurrentHash(made16.impl)); + Check(made8.impl->hashAndFlags == 4); + auto hash = Hash(made8.impl); + Check(hash != 0 && made8.impl->hashAndFlags == ((hash << 8) | 4)); + Check(Hash(made16.impl) == hash); + auto hello = Create8(U8("hello"), 5); + Check(Hash(hello.impl) == 0x00D17551U); + unsigned bytesRead = 99; + unsigned utf16Read = 99; + const char* valid = "hello"; + Check(_ZN3WTF7Unicode51calculateStringHashAndLengthFromUTF8MaskingTop8BitsEPKcS2_RjS3_(valid, valid + 5, bytesRead, utf16Read) == 0x00D17551U); + Check(bytesRead == 5 && utf16Read == 5); + for (const char* invalid : {"\xc0\xaf", "\xe0\x80\x80", "\xed\xa0\x80", "\xf4\x90\x80\x80", "\xe2\x82"}) { + bytesRead = 99; + Check(!_ZN3WTF7Unicode51calculateStringHashAndLengthFromUTF8MaskingTop8BitsEPKcS2_RjS3_(invalid, invalid + std::strlen(invalid), bytesRead, utf16Read)); + Check(bytesRead == 99 && utf16Read == 0); + } + auto released = Create8(U8("fastMalloc"), 10); + auto* storage = std::exchange(released.impl, nullptr); + Check(_ZN3WTF14fastMallocSizeEPKv(storage) >= 30); + _ZN3WTF8fastFreeEPv(storage); + Check(Starts(made8.impl, 'a') && Ends(made16.impl, 'a')); + Check(!Starts(empty.impl, 0) && !Ends(empty.impl, 0)); + Check(Prefix(made16.impl, "aB", 2) && Suffix(made8.impl, "Ba", 2)); + Check(Prefix(empty.impl, nullptr, 0) && !Prefix(made8.impl, "aBab", 4)); + Check(!Suffix(made16.impl, "bb", 2)); + Throws([&] { Prefix(made8.impl, nullptr, 1); }); + Check(ReverseFind(made8.impl, 'a', 99) == 2 && ReverseFind(made16.impl, 'a', 1) == 0); + Check(ReverseFind(empty.impl, 'a', 0) == std::size_t(-1)); + Check(ReverseFind(made8.impl, 0x100, 99) == std::size_t(-1)); + auto narrow = Narrow(u"caf\u00e9", 4); + Check((narrow.impl->hashAndFlags & 4) != 0); + auto wide = Narrow(u"x\u0100", 2); + Check((wide.impl->hashAndFlags & 4) == 0); + Check(Character(&null, 0) == 0 && Character(&made8, 99) == 0); + Check(ImplCharacter(made8.impl, 1) == 'B'); + Throws([&] { ImplCharacter(made8.impl, 3); }); + Throws([&] { BytesSize(nullptr); }); + Throws([&] { Uninit16(0xFFFFFFFF, data16); }); + Check(Safe(&null) && Safe(&made8) && Safe(&empty)); + { auto copy = made8; Check(!Safe(&made8)); } + Check(Safe(&made8)); +} + +void TestASCIIAndViews() { + auto original = Create16(u"Ab\u00c9z", 4); + auto lower = ImplLower(original.impl); + auto upper = ImplUpper(original.impl); + Check(Equal16(lower.impl, u"ab\u00c9z", 4)); + Check(Equal16(upper.impl, u"AB\u00c9Z", 4)); + { auto same = ImplLower(lower.impl); Check(same.impl == lower.impl && lower.impl->refCount == 4); } + Check(lower.impl->refCount == 2); + Check(Equal16(Lower(&original).impl, u"ab\u00c9z", 4)); + Check(Equal16(Upper(&original).impl, u"AB\u00c9Z", 4)); + String null; + Check(!Lower(&null).impl && !Upper(&null).impl); + StringView view{U8("aBcD"), 4, true}; + StringView wide{u"aBcD", 4, false}; + StringView empty{"", 0, true}; + StringView absent{nullptr, 0, true}; + Text(ViewLower(&view), "abcd"); + Text(ViewUpper(&wide), "ABCD"); + Check(!ViewLower(&absent).impl && ViewUpper(&empty).impl); + Check(ViewStarts(&view, 'a') && ViewEnds(&wide, 'D')); + Check(!ViewStarts(&absent, 0) && !ViewEnds(&empty, 0)); + Check(EqualViews(view, wide) && !EqualViews(absent, empty)); + Check(EqualViews(absent, absent) && EqualViews(empty, empty)); + StringView match{u"Bc", 2, false}; + Check(Find(&view, match, 0) == 1 && Find(&wide, {"D", 1, true}, 2) == 3); + Check(Find(&view, match, 2) == std::size_t(-1)); + Check(Find(&view, absent, 4) == 4 && Find(&view, absent, 5) == std::size_t(-1)); + unsigned char output8[5] = {0, 0, 0, 0, 77}; + char16_t output16[5] = {0, 0, 0, 0, 77}; + Case8(&view, 0, output8); + Case16(&view, 1, output16); + Check(!std::memcmp(output8, "ABCD", 4) && output8[4] == 77); + Check(!std::memcmp(output16, u"abcd", 8) && output16[4] == 77); + Case16(&wide, 0, output16); + Check(!std::memcmp(output16, u"ABCD", 8)); + Case8(&absent, 0, nullptr); + Throws([&] { Case8(&wide, 1, output8); }); + Throws([&] { Case16(&wide, 1, nullptr); }); + auto special = Create16(u"\0\n\x7f\u00e9\u0100", 5); + Check(Bytes(Ascii(&special)) == std::string("\0?\x7f??", 5)); + Check(Bytes(Latin1(&special)) == std::string("\0\n\x7f\xe9?", 5)); + Check(Ascii(&null).buffer != nullptr && Latin1(&null).buffer != nullptr); +} + +void TestUTFConversions() { + String null; + Check(Bytes(UTF8(&null, 1)).empty()); + Check(!FromUTF8(nullptr, 9).impl && !FromUTF8Z(nullptr).impl); + auto ascii = FromUTF8(U8("abc"), 3); + Check((ascii.impl->hashAndFlags & 4) != 0); + auto unicode = FromUTF8(U8("caf\xc3\xa9\xf0\x9f\x98\x80"), 9); + Check(unicode.impl && unicode.impl->length == 6 && !(unicode.impl->hashAndFlags & 4)); + Check(Character(&unicode, 4) == 0x1F600 && Character(&unicode, 5) == 0); + Check(Bytes(ImplUTF8(unicode.impl, 1)) == "caf\xc3\xa9\xf0\x9f\x98\x80"); + StringView view{unicode.impl->data, unicode.impl->length, false}; + Check(Bytes(ViewUTF8(&view, 1)) == Bytes(UTF8(&unicode, 1))); + for (const char* invalid : {"\xc0\xaf", "\xe0\x80\x80", "\xed\xa0\x80", "\xf4\x90\x80\x80", "\x80", "\xe2\x82"}) { + Check(!FromUTF8Z(U8(invalid)).impl); + } + auto fallback = LatinFallback(U8("\xff"), 1); + Check(Equal16(fallback.impl, u"\xff", 1) && (fallback.impl->hashAndFlags & 4)); + auto zero = FromUTF8(U8("a\0b"), 3); + Check(zero.impl->length == 3 && Character(&zero, 1) == 0); + char16_t bad[] = {0xD800, 'X', 0xDC00, 0xDFFF}; + auto malformed = Create16(bad, 4); + Check(ImplCharacter(malformed.impl, 0) == 0 && ImplCharacter(malformed.impl, 2) == 0); + Check(Bytes(UTF8(&malformed, 0)) == "\xed\xa0\x80X\xed\xb0\x80\xed\xbf\xbf"); + Check(Bytes(UTF8(&malformed, 2)) == "\xef\xbf\xbdX\xef\xbf\xbd\xef\xbf\xbd"); + Throws([&] { UTF8(&malformed, 1); }); + Text(FromCodePoint(0x1F600), "\xf0\x9f\x98\x80"); + Check(!FromCodePoint(-1).impl && !FromCodePoint(0x110000).impl); + auto surrogate = FromCodePoint(0xD800); + Check(surrogate.impl && surrogate.impl->length == 1 && Character(&surrogate, 0) == 0); + Throws([&] { FromUTF8(U8(""), std::size_t(0x80000000)); }); +} + +void TestSubstrings() { + auto original = Create8(U8("abcdefghijklmnopqrstuvwx"), 24); + { auto same = Substring(original.impl, 0, 99); Check(same.impl == original.impl); } + Text(Substring(original.impl, 23, 99), "x"); + Check(Substring(original.impl, 99, 9).impl->length == 0); + auto shared = SharedSubstring(&original, 1, 20); + Check((shared.impl->hashAndFlags & 3) == 2); + Check(shared.impl->data == static_cast(original.impl->data) + 1); + Check(original.impl->refCount == 4); + { + auto nested = SharedSubstring(&shared, 1, 18); + Text(nested, "cdefghijklmnopqrst"); + Check(original.impl->refCount == 6 && shared.impl->refCount == 2); + } + Check(original.impl->refCount == 4); + auto small = SharedSubstring(&original, 1, 3); + Check((small.impl->hashAndFlags & 3) == 0); + Text(small, "bcd"); + String null; + Check(!SharedSubstring(&null, 5, 9).impl); + auto wide = Create16(u"abcdefghijklmnopqrstuvwx", 24); + auto wideShared = SharedSubstring(&wide, 2, 20); + Check((wideShared.impl->hashAndFlags & 3) == 2 && !(wideShared.impl->hashAndFlags & 4)); + Text(wideShared, "cdefghijklmnopqrstuv"); +} + +void TestCStrings() { + char* data; + auto value = CStringNew(3, data); + Check(data[3] == 0 && value.buffer->refCount == 1); + std::memcpy(data, "abc", 3); + CString shared(value); + Check(value.buffer->refCount == 2); + char* writable = CStringMutable(&shared); + writable[0] = 'z'; + Check(Bytes(value) == "abc" && Bytes(shared) == "zbc"); + Check(value.buffer->refCount == 1 && shared.buffer->refCount == 1); + Check(CStringLess(value, shared) && !CStringEqual(value, shared)); + Check(CStringEqualZ(value, "abc") && !CStringEqualZ(value, nullptr)); + auto embedded = CStringNew(3, data); + std::memcpy(data, "a\0b", 3); + auto different = CStringNew(3, data); + std::memcpy(data, "a\0c", 3); + Check(!CStringEqual(embedded, different) && CStringEqualZ(embedded, "a")); + Check(CStringHash(&embedded) == CStringHash(&different)); + Check(!CStringHashEqual(embedded, different)); + CString absent; + auto empty = CStringNew(0, data); + Check(data[0] == 0 && !CStringEqual(absent, empty)); + Check(CStringHash(&absent) == 0 && CStringHash(&empty) != 0); + Check(CStringEqualZ(absent, nullptr) && CStringLess(absent, empty)); + Check(!CStringMutable(&absent)); + CStringGrow(&value, 8); + Check(value.buffer->length == 8 && !std::memcmp(Bytes(value).data(), "abc\0", 4)); + writable = CStringMutable(&value); + std::memcpy(writable + 3, "defgh", 5); + writable[8] = 0; + Check(Bytes(value) == "abcdefgh"); + Throws([&] { CStringGrow(&value, 8); }); + Throws([&] { CStringGrow(&absent, 1); }); + Throws([&] { CStringNew(std::size_t(-1), data); }); + Text(FromCString(embedded), "a"); + Check(!FromCString(absent).impl); + auto deleted = reinterpret_cast(std::uintptr_t(-1)); + CString a(deleted), b(deleted); + Check(CStringHashEqual(a, b) && !CStringHashEqual(a, value)); + a.buffer = nullptr; b.buffer = nullptr; +} + +void TestPrimitiveState() { + Check(AllPrivileges().storage == 7); + SetPrivileges({0}); + Check(!HasPrivilege(1)); + AddPrivilege(1); AddPrivilege(4); + Check(HasPrivilege(1) && HasPrivilege(4) && !HasPrivilege(2)); + RemovePrivilege(1); + Check(!HasPrivilege(1) && HasPrivilege(4)); + SetPrivileges({2}); + Check(HasPrivilege(2) && !HasPrivilege(4)); + SetPrivileges({0}); + Check(SixHash("AAAAAA") == 0 && SixHash("AAAAAB") == 1); + Check(SixHash("AAAAAa") == 26 && SixHash("AAAAA0") == 52); + Check(SixHash("999999") == 965660735U); + Throws([&] { SixHash(nullptr); }); + Throws([&] { SixHash("short"); }); + Throws([&] { SixHash("AAAAAAA"); }); + Throws([&] { SixHash("AAAAA!"); }); + for (std::uint8_t type = 0; type < 10; ++type) { + Check(IsReload(type) == (type == 4 || type == 8 || type == 9)); + Check(IsBackForward(type) == (type >= 1 && type <= 3)); + } + Throws([&] { IsReload(255); }); + Throws([&] { IsBackForward(255); }); +} + +void TestIntegersAndConstructors() { + Text(_ZN3WTF6String6numberEi(std::numeric_limits::min()), "-2147483648"); + Text(_ZN3WTF6String6numberEi(0), "0"); + Text(_ZN3WTF6String6numberEj(std::numeric_limits::max()), "4294967295"); + Text(_ZN3WTF6String6numberEj(0), "0"); + Text(_ZN3WTF6String6numberEl(std::numeric_limits::min()), "-9223372036854775808"); + Text(_ZN3WTF6String6numberEl(0), "0"); + Text(_ZN3WTF6String6numberEm(std::numeric_limits::max()), "18446744073709551615"); + Text(_ZN3WTF6String6numberEm(0), "0"); + Text(_ZN3WTF6String6numberEx(std::numeric_limits::min()), "-9223372036854775808"); + Text(_ZN3WTF6String6numberEx(0), "0"); + Text(_ZN3WTF6String6numberEy(std::numeric_limits::max()), "18446744073709551615"); + Text(_ZN3WTF6String6numberEy(0), "0"); + { String value; _ZN3WTF6StringC1EPKDsj(&value, u"test", 4); Text(value, "test"); } + { String value; _ZN3WTF6StringC1EPKDsj(&value, nullptr, 0); Check(!value.impl); } + { String value; _ZN3WTF6StringC2EPKDsj(&value, u"test", 4); Text(value, "test"); } + { String value; _ZN3WTF6StringC2EPKDsj(&value, nullptr, 0); Check(!value.impl); } + { String value; _ZN3WTF6StringC1EPKc(&value, "test"); Text(value, "test"); } + { String value; _ZN3WTF6StringC1EPKc(&value, nullptr); Check(!value.impl); } + { String value; _ZN3WTF6StringC2EPKc(&value, "test"); Text(value, "test"); } + { String value; _ZN3WTF6StringC2EPKc(&value, nullptr); Check(!value.impl); } + { String value; _ZN3WTF6StringC1EPKcj(&value, "test", 4); Text(value, "test"); } + { String value; _ZN3WTF6StringC1EPKcj(&value, nullptr, 0); Check(!value.impl); } + { String value; _ZN3WTF6StringC2EPKcj(&value, "test", 4); Text(value, "test"); } + { String value; _ZN3WTF6StringC2EPKcj(&value, nullptr, 0); Check(!value.impl); } + { String value; _ZN3WTF6StringC1EPKhj(&value, U8("test"), 4); Text(value, "test"); } + { String value; _ZN3WTF6StringC1EPKhj(&value, nullptr, 0); Check(!value.impl); } + { String value; _ZN3WTF6StringC2EPKhj(&value, U8("test"), 4); Text(value, "test"); } + { String value; _ZN3WTF6StringC2EPKhj(&value, nullptr, 0); Check(!value.impl); } + { CString value; _ZN3WTF7CStringC1EPKc(&value, "test"); Check(Bytes(value) == "test"); } + { CString value; _ZN3WTF7CStringC1EPKc(&value, nullptr); Check(!value.buffer); } + { CString value; _ZN3WTF7CStringC2EPKc(&value, "test"); Check(Bytes(value) == "test"); } + { CString value; _ZN3WTF7CStringC2EPKc(&value, nullptr); Check(!value.buffer); } + { CString value; _ZN3WTF7CStringC1EPKcm(&value, "test", 4); Check(Bytes(value) == "test"); } + { CString value; _ZN3WTF7CStringC1EPKcm(&value, nullptr, 0); Check(!value.buffer); } + { CString value; _ZN3WTF7CStringC2EPKcm(&value, "test", 4); Check(Bytes(value) == "test"); } + { CString value; _ZN3WTF7CStringC2EPKcm(&value, nullptr, 0); Check(!value.buffer); } +} + +void Run() { + TestStorageAndQueries(); + TestASCIIAndViews(); + TestUTFConversions(); + TestSubstrings(); + TestCStrings(); + TestPrimitiveState(); + TestIntegersAndConstructors(); +} + +} // namespace Wtf2Tests + +namespace Wtf2Tests { void TestURLsAndReallocation(); } + +void TestAdditionalWtf() { Wtf2Tests::Run(); Wtf2Tests::TestURLsAndReallocation(); } + +namespace Wtf2Tests { + +extern "C" { +} + +const auto URLProtocol = &_ZNK3WTF3URL8protocolEv; +const auto URLHost = &_ZNK3WTF3URL4hostEv; +const auto URLPath = &_ZNK3WTF3URL4pathEv; +const auto URLUser = &_ZNK3WTF3URL11encodedUserEv; +const auto URLPassword = &_ZNK3WTF3URL15encodedPasswordEv; +const auto URLFragment = &_ZNK3WTF3URL18fragmentIdentifierEv; +const auto URLFragmentSign = &_ZNK3WTF3URL39fragmentIdentifierWithLeadingNumberSignEv; +const auto URLQuery = &_ZNK3WTF3URL28queryWithLeadingQuestionMarkEv; +const auto URLIsProtocol = &_ZNK3WTF3URL10protocolIsENS_10StringViewE; +const auto URLHierarchical = &_ZNK3WTF3URL14isHierarchicalEv; +const auto URLBlank = &_ZNK3WTF3URL12isAboutBlankEv; +const auto URLSrcdoc = &_ZNK3WTF3URL13isAboutSrcDocEv; +const auto URLJavaScript = &_ZNK3WTF3URL20protocolIsJavaScriptEv; +const auto URLInvalidate = &_ZN3WTF3URL10invalidateEv; +const auto IsJavaScript = &_ZN3WTF20protocolIsJavaScriptENS_10StringViewE; +const auto IsHTTP = &_ZN3WTF22protocolIsInHTTPFamilyENS_10StringViewE; +const auto JSRealloc = &_ZN3WTF14jsValueReallocEPvm; + +std::string ViewText(StringView view) { return Bytes(ViewUTF8(&view, 1)); } + +void TestURLsAndReallocation() { + struct PinnedBits { + unsigned valid : 1; + unsigned http : 1; + unsigned cannotBeBase : 1; + unsigned portLength : 3; + unsigned schemeEnd : 26; + }; + static_assert(sizeof(PinnedBits) == 4); + PinnedBits fields{1, 1, 0, 5, 5}; + unsigned bits; + std::memcpy(&bits, &fields, sizeof(bits)); + Check(bits == (1U | 2U | (5U << 3) | (5U << 6))); + auto string = FromUTF8Z(U8("https://u%20:p%40@example.test:8443/a/b?q=1#frag")); + URL url{string.impl, bits, 8, 12, 17, 29, 37, 38, 42}; + std::string raw = Bytes(UTF8(&string, 1)); + url.hostEnd = static_cast(raw.find(":8443")); + url.pathAfterLastSlash = static_cast(raw.rfind('/') + 1); + url.pathEnd = static_cast(raw.find('?')); + url.queryEnd = static_cast(raw.find('#')); + Check(ViewText(URLProtocol(&url)) == "https"); + Check(ViewText(URLHost(&url)) == "example.test"); + Check(ViewText(URLUser(&url)) == "u%20" && ViewText(URLPassword(&url)) == "p%40"); + Check(ViewText(URLPath(&url)) == "/a/b"); + Check(ViewText(URLQuery(&url)) == "?q=1"); + Check(ViewText(URLFragment(&url)) == "frag" && ViewText(URLFragmentSign(&url)) == "#frag"); + Check(URLIsProtocol(&url, {"https", 5, true}) && !URLIsProtocol(&url, {"http", 4, true})); + Check(URLHierarchical(&url) && !URLBlank(&url) && !URLSrcdoc(&url)); + auto wideString = Create16(u"http://wide.test/path", 21); + URL wide{wideString.impl, 1U | 2U | (4U << 6), 7, 7, 7, 16, 17, 21, 21}; + Check(ViewText(URLProtocol(&wide)) == "http" && !URLHost(&wide).is8Bit); + Check(ViewText(URLHost(&wide)) == "wide.test" && ViewText(URLPath(&wide)) == "/path"); + auto about = FromUTF8Z(U8("about:blank#")); + URL blank{about.impl, 1U | 4U | (5U << 6), 6, 6, 6, 6, 6, 11, 11}; + Check(URLBlank(&blank) && !URLSrcdoc(&blank) && !URLHierarchical(&blank)); + Check(URLFragment(&blank).data && URLFragment(&blank).length == 0); + auto src = FromUTF8Z(U8("about:srcdoc")); + blank.impl = src.impl; blank.pathEnd = 12; blank.queryEnd = 12; + Check(URLSrcdoc(&blank) && !URLBlank(&blank)); + URL absent{}; + Check(!URLProtocol(&absent).data && !URLHost(&absent).data && !URLPath(&absent).data); + Check(!URLPassword(&absent).data && !URLQuery(&absent).data && !URLFragment(&absent).data); + Check(URLUser(&absent).data && URLUser(&absent).length == 0); + Check(!URLHierarchical(&absent) && !URLIsProtocol(&absent, {"", 0, true})); + auto js = FromUTF8Z(U8(" \tJaVa\nScRiPt:alert(1)")); + URL javascript{js.impl, 0, 0, 0, 0, 0, 0, 0, 0}; + Check(URLJavaScript(&javascript)); + Check(IsJavaScript({js.impl->data, js.impl->length, true})); + Check(!IsJavaScript({"javascriptx:", 12, true}) && !IsJavaScript({nullptr, 0, true})); + Check(IsHTTP({"HTTP:", 5, true}) && IsHTTP({u"HtTpS:", 6, false})); + Check(!IsHTTP({" https:", 7, true}) && !IsHTTP({"httpx:", 6, true})); + URLInvalidate(&url); + Check(url.impl == string.impl && url.bits == 0 && url.userStart == 0 && url.userEnd == 0); + Check(url.passwordEnd == 0 && url.hostEnd == 0 && url.pathEnd == 0 && url.pathAfterLastSlash == 0 && url.queryEnd == 0); + Throws([&] { URLInvalidate(nullptr); }); + Throws([&] { URLProtocol(nullptr); }); + auto* memory = static_cast(JSRealloc(nullptr, 5)); + std::memcpy(memory, "hello", 5); + memory = static_cast(JSRealloc(memory, 50)); + Check(!std::memcmp(memory, "hello", 5)); + memory = static_cast(JSRealloc(memory, 2)); + Check(memory[0] == 'h' && memory[1] == 'e'); + Check(!JSRealloc(memory, 0)); +} + +} // namespace Wtf2Tests diff --git a/core/libs/prx/libSceNKWebKitRequirements/Export.cpp b/core/libs/prx/libSceNKWebKitRequirements/Export.cpp index 388afc76f2..a395929a02 100644 --- a/core/libs/prx/libSceNKWebKitRequirements/Export.cpp +++ b/core/libs/prx/libSceNKWebKitRequirements/Export.cpp @@ -1,3 +1,6 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceNKWebKitRequirements/include/InventoryExports.hpp" +#include "prx/libSceNKWebKitRequirements/include/Identified.hpp" #include #include #include "SceTypes.hpp" @@ -6,500 +9,401 @@ extern "C" { -int APS5_VABI sceNKWebKitRequirementsUnknown_K4M0IhFb88Q_nid_no_patch() { +int APS5_VABI __ubsan_handle_cfi_check_fail_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("K4M0IhFb88Q", sceNKWebKitRequirementsUnknown_K4M0IhFb88Q_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_sPU6b2LaPqg_nid_no_patch() { +int APS5_VABI __ubsan_handle_cfi_check_fail_abort_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("sPU6b2LaPqg", sceNKWebKitRequirementsUnknown_sPU6b2LaPqg_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_gnWUEMlAxZY_nid_no_patch() { +int APS5_VABI deflate_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("gnWUEMlAxZY", sceNKWebKitRequirementsUnknown_gnWUEMlAxZY_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_VCIAd_nrADw_nid_no_patch() { +int APS5_VABI deflateBound_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("VCIAd+nrADw", sceNKWebKitRequirementsUnknown_VCIAd_nrADw_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_Z0pL_Tae6N4_nid_no_patch() { +int APS5_VABI deflateEnd_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("Z0pL-Tae6N4", sceNKWebKitRequirementsUnknown_Z0pL_Tae6N4_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_fKk7unahoVM_nid_no_patch() { +int APS5_VABI deflateInit2__nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("fKk7unahoVM", sceNKWebKitRequirementsUnknown_fKk7unahoVM_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_mhD00YrjSbg_nid_no_patch() { +int APS5_VABI deflateReset_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("mhD00YrjSbg", sceNKWebKitRequirementsUnknown_mhD00YrjSbg_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_dbDvWQUel6A_nid_no_patch() { +int APS5_VABI inflate_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("dbDvWQUel6A", sceNKWebKitRequirementsUnknown_dbDvWQUel6A_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_XVx6JyC0Mv4_nid_no_patch() { +int APS5_VABI inflateEnd_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("XVx6JyC0Mv4", sceNKWebKitRequirementsUnknown_XVx6JyC0Mv4_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_MM_aVBE7p_A_nid_no_patch() { +int APS5_VABI inflateInit2__nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("MM-aVBE7p-A", sceNKWebKitRequirementsUnknown_MM_aVBE7p_A_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_sUO777nQSTQ_nid_no_patch() { +int APS5_VABI inflateReset_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("sUO777nQSTQ", sceNKWebKitRequirementsUnknown_sUO777nQSTQ_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_RZdBACKeudU_nid_no_patch() { +int APS5_VABI jpeg_CreateDecompress_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("RZdBACKeudU", sceNKWebKitRequirementsUnknown_RZdBACKeudU_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_TPplvBxaj8w_nid_no_patch() { +int APS5_VABI jpeg_calc_output_dimensions_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("TPplvBxaj8w", sceNKWebKitRequirementsUnknown_TPplvBxaj8w_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_4QrIS2z8_EI_nid_no_patch() { +int APS5_VABI jpeg_consume_input_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("4QrIS2z8+EI", sceNKWebKitRequirementsUnknown_4QrIS2z8_EI_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_VXRQVSn69Ow_nid_no_patch() { +int APS5_VABI jpeg_destroy_decompress_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("VXRQVSn69Ow", sceNKWebKitRequirementsUnknown_VXRQVSn69Ow_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_z_M1pu_ssOM_nid_no_patch() { +int APS5_VABI jpeg_finish_decompress_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("z+M1pu-ssOM", sceNKWebKitRequirementsUnknown_z_M1pu_ssOM_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_h6fqSoAmmFQ_nid_no_patch() { +int APS5_VABI jpeg_finish_output_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("h6fqSoAmmFQ", sceNKWebKitRequirementsUnknown_h6fqSoAmmFQ_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_fUEoU29MwzA_nid_no_patch() { +int APS5_VABI jpeg_has_multiple_scans_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("fUEoU29MwzA", sceNKWebKitRequirementsUnknown_fUEoU29MwzA_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_hijfwtuVJT4_nid_no_patch() { +int APS5_VABI jpeg_input_complete_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("hijfwtuVJT4", sceNKWebKitRequirementsUnknown_hijfwtuVJT4_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_i3EU0fCS8j8_nid_no_patch() { +int APS5_VABI jpeg_read_header_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("i3EU0fCS8j8", sceNKWebKitRequirementsUnknown_i3EU0fCS8j8_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_t0W8_TBYlXc_nid_no_patch() { +int APS5_VABI jpeg_read_scanlines_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("t0W8-TBYlXc", sceNKWebKitRequirementsUnknown_t0W8_TBYlXc_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_wrb3I3Ze1C8_nid_no_patch() { +int APS5_VABI jpeg_resync_to_restart_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("wrb3I3Ze1C8", sceNKWebKitRequirementsUnknown_wrb3I3Ze1C8_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_MhdUhQtAIYk_nid_no_patch() { +int APS5_VABI jpeg_save_markers_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("MhdUhQtAIYk", sceNKWebKitRequirementsUnknown_MhdUhQtAIYk_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_APAcjNNVeDQ_nid_no_patch() { +int APS5_VABI jpeg_start_decompress_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("APAcjNNVeDQ", sceNKWebKitRequirementsUnknown_APAcjNNVeDQ_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_kgLz9IuqGvA_nid_no_patch() { +int APS5_VABI jpeg_start_output_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("kgLz9IuqGvA", sceNKWebKitRequirementsUnknown_kgLz9IuqGvA_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_Atq_9b5btSU_nid_no_patch() { +int APS5_VABI jpeg_std_error_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("Atq+9b5btSU", sceNKWebKitRequirementsUnknown_Atq_9b5btSU_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_vYQLyTYE6nw_nid_no_patch() { +int APS5_VABI psl_builtin_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("vYQLyTYE6nw", sceNKWebKitRequirementsUnknown_vYQLyTYE6nw_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_xNxRXaItFE0_nid_no_patch() { +int APS5_VABI psl_builtin_file_time_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("xNxRXaItFE0", sceNKWebKitRequirementsUnknown_xNxRXaItFE0_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_bEQToAEGGxQ_nid_no_patch() { +int APS5_VABI psl_builtin_filename_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("bEQToAEGGxQ", sceNKWebKitRequirementsUnknown_bEQToAEGGxQ_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown__yNC7DPGH2g_nid_no_patch() { +int APS5_VABI psl_builtin_outdated_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("+yNC7DPGH2g", sceNKWebKitRequirementsUnknown__yNC7DPGH2g_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_pHt_cpjRGfI_nid_no_patch() { +int APS5_VABI psl_builtin_sha1sum_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("pHt-cpjRGfI", sceNKWebKitRequirementsUnknown_pHt_cpjRGfI_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_dbR9oqRLeH8_nid_no_patch() { +int APS5_VABI psl_check_version_number_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("dbR9oqRLeH8", sceNKWebKitRequirementsUnknown_dbR9oqRLeH8_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_pbUudIEKcm8_nid_no_patch() { +int APS5_VABI psl_dist_filename_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("pbUudIEKcm8", sceNKWebKitRequirementsUnknown_pbUudIEKcm8_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown__gJRMHTKjwI_nid_no_patch() { +int APS5_VABI psl_free_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("-gJRMHTKjwI", sceNKWebKitRequirementsUnknown__gJRMHTKjwI_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_vcDMMUBBG_g_nid_no_patch() { +int APS5_VABI psl_free_string_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("vcDMMUBBG+g", sceNKWebKitRequirementsUnknown_vcDMMUBBG_g_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_h_wtQ0Jvjh4_nid_no_patch() { +int APS5_VABI psl_get_version_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("h+wtQ0Jvjh4", sceNKWebKitRequirementsUnknown_h_wtQ0Jvjh4_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_f79Y3ZlfBQk_nid_no_patch() { +int APS5_VABI psl_is_cookie_domain_acceptable_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("f79Y3ZlfBQk", sceNKWebKitRequirementsUnknown_f79Y3ZlfBQk_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_IwmVVM5dPhM_nid_no_patch() { +int APS5_VABI psl_is_public_suffix_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("IwmVVM5dPhM", sceNKWebKitRequirementsUnknown_IwmVVM5dPhM_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_fqBbFOBcJHU_nid_no_patch() { +int APS5_VABI psl_is_public_suffix2_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("fqBbFOBcJHU", sceNKWebKitRequirementsUnknown_fqBbFOBcJHU_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_toXPpb5jhhk_nid_no_patch() { +int APS5_VABI psl_latest_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("toXPpb5jhhk", sceNKWebKitRequirementsUnknown_toXPpb5jhhk_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_PGLtQ31bblg_nid_no_patch() { +int APS5_VABI psl_load_file_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("PGLtQ31bblg", sceNKWebKitRequirementsUnknown_PGLtQ31bblg_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_rymOrz6HZAs_nid_no_patch() { +int APS5_VABI psl_load_fp_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("rymOrz6HZAs", sceNKWebKitRequirementsUnknown_rymOrz6HZAs_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_H5kLCyRw33Y_nid_no_patch() { +int APS5_VABI psl_registrable_domain_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("H5kLCyRw33Y", sceNKWebKitRequirementsUnknown_H5kLCyRw33Y_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_QLufrpMhxjM_nid_no_patch() { +int APS5_VABI psl_str_to_utf8lower_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("QLufrpMhxjM", sceNKWebKitRequirementsUnknown_QLufrpMhxjM_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_RguMBf_bBTc_nid_no_patch() { +int APS5_VABI psl_suffix_count_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("RguMBf+bBTc", sceNKWebKitRequirementsUnknown_RguMBf_bBTc_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown__ZY_4CCqv7Y_nid_no_patch() { +int APS5_VABI psl_suffix_exception_count_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("-ZY+4CCqv7Y", sceNKWebKitRequirementsUnknown__ZY_4CCqv7Y_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_Vy6tew6SeVU_nid_no_patch() { +int APS5_VABI psl_suffix_wildcard_count_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("Vy6tew6SeVU", sceNKWebKitRequirementsUnknown_Vy6tew6SeVU_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_YW0nCl9fJK0_nid_no_patch() { +int APS5_VABI psl_unregistrable_domain_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("YW0nCl9fJK0", sceNKWebKitRequirementsUnknown_YW0nCl9fJK0_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_JvvQKXNn0HQ_nid_no_patch() { +int APS5_VABI sqlite3_bind_blob_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("JvvQKXNn0HQ", sceNKWebKitRequirementsUnknown_JvvQKXNn0HQ_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_etHgBXWnWn8_nid_no_patch() { +int APS5_VABI sqlite3_bind_double_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("etHgBXWnWn8", sceNKWebKitRequirementsUnknown_etHgBXWnWn8_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_7Wb0Jv2wCO0_nid_no_patch() { +int APS5_VABI sqlite3_bind_int_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("7Wb0Jv2wCO0", sceNKWebKitRequirementsUnknown_7Wb0Jv2wCO0_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_I1J4AmgICLM_nid_no_patch() { +int APS5_VABI sqlite3_bind_int64_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("I1J4AmgICLM", sceNKWebKitRequirementsUnknown_I1J4AmgICLM_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_qmDH4PGK8vQ_nid_no_patch() { +int APS5_VABI sqlite3_bind_null_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("qmDH4PGK8vQ", sceNKWebKitRequirementsUnknown_qmDH4PGK8vQ_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_92RMcC5IfeE_nid_no_patch() { +int APS5_VABI sqlite3_bind_parameter_count_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("92RMcC5IfeE", sceNKWebKitRequirementsUnknown_92RMcC5IfeE_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_XeIRR713LsI_nid_no_patch() { +int APS5_VABI sqlite3_bind_text16_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("XeIRR713LsI", sceNKWebKitRequirementsUnknown_XeIRR713LsI_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_wo6_V7jxzG0_nid_no_patch() { +int APS5_VABI sqlite3_busy_handler_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("wo6+V7jxzG0", sceNKWebKitRequirementsUnknown_wo6_V7jxzG0_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_LferlGyfxiw_nid_no_patch() { +int APS5_VABI sqlite3_busy_timeout_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("LferlGyfxiw", sceNKWebKitRequirementsUnknown_LferlGyfxiw_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_cJl4lpQr_TA_nid_no_patch() { +int APS5_VABI sqlite3_clear_bindings_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("cJl4lpQr+TA", sceNKWebKitRequirementsUnknown_cJl4lpQr_TA_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_L6QRY1pl3xc_nid_no_patch() { +int APS5_VABI sqlite3_close_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("L6QRY1pl3xc", sceNKWebKitRequirementsUnknown_L6QRY1pl3xc_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_u38IZ8Z7qYY_nid_no_patch() { +int APS5_VABI sqlite3_column_blob_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("u38IZ8Z7qYY", sceNKWebKitRequirementsUnknown_u38IZ8Z7qYY_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_qfdBMD8tNKs_nid_no_patch() { +int APS5_VABI sqlite3_column_bytes_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("qfdBMD8tNKs", sceNKWebKitRequirementsUnknown_qfdBMD8tNKs_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_e9TbTZXq_w8_nid_no_patch() { +int APS5_VABI sqlite3_column_bytes16_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("e9TbTZXq-w8", sceNKWebKitRequirementsUnknown_e9TbTZXq_w8_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_NPzB4u7iNOw_nid_no_patch() { +int APS5_VABI sqlite3_column_decltype_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("NPzB4u7iNOw", sceNKWebKitRequirementsUnknown_NPzB4u7iNOw_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_Gk_8gCXwG_E_nid_no_patch() { +int APS5_VABI sqlite3_column_double_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("Gk+8gCXwG-E", sceNKWebKitRequirementsUnknown_Gk_8gCXwG_E_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_AnQQM55IXDQ_nid_no_patch() { +int APS5_VABI sqlite3_column_int_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("AnQQM55IXDQ", sceNKWebKitRequirementsUnknown_AnQQM55IXDQ_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_PPOQBfvrMIQ_nid_no_patch() { +int APS5_VABI sqlite3_column_int64_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("PPOQBfvrMIQ", sceNKWebKitRequirementsUnknown_PPOQBfvrMIQ_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_5xDT5s6gCgg_nid_no_patch() { +int APS5_VABI sqlite3_column_name16_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("5xDT5s6gCgg", sceNKWebKitRequirementsUnknown_5xDT5s6gCgg_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_iWYXKx6f2r4_nid_no_patch() { +int APS5_VABI sqlite3_column_text16_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("iWYXKx6f2r4", sceNKWebKitRequirementsUnknown_iWYXKx6f2r4_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_0y370_q87ug_nid_no_patch() { +int APS5_VABI sqlite3_column_type_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("0y370-q87ug", sceNKWebKitRequirementsUnknown_0y370_q87ug_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_c6OcNEPqsOE_nid_no_patch() { +int APS5_VABI sqlite3_column_value_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("c6OcNEPqsOE", sceNKWebKitRequirementsUnknown_c6OcNEPqsOE_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_kxmCA67rtog_nid_no_patch() { +int APS5_VABI sqlite3_create_collation_v2_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("kxmCA67rtog", sceNKWebKitRequirementsUnknown_kxmCA67rtog_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_WTOiJ2zqWjk_nid_no_patch() { +int APS5_VABI sqlite3_create_function_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("WTOiJ2zqWjk", sceNKWebKitRequirementsUnknown_WTOiJ2zqWjk_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_8y1Cv7BS6dg_nid_no_patch() { +int APS5_VABI sqlite3_data_count_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("8y1Cv7BS6dg", sceNKWebKitRequirementsUnknown_8y1Cv7BS6dg_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_G_Lq53FSulk_nid_no_patch() { +int APS5_VABI sqlite3_errcode_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("G+Lq53FSulk", sceNKWebKitRequirementsUnknown_G_Lq53FSulk_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_V0N1qq7ikUc_nid_no_patch() { +int APS5_VABI sqlite3_errmsg_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("V0N1qq7ikUc", sceNKWebKitRequirementsUnknown_V0N1qq7ikUc_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_WOjpm4i__Y4_nid_no_patch() { +int APS5_VABI sqlite3_errstr_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("WOjpm4i--Y4", sceNKWebKitRequirementsUnknown_WOjpm4i__Y4_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_0_24WRoyyAg_nid_no_patch() { +int APS5_VABI sqlite3_extended_result_codes_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("0-24WRoyyAg", sceNKWebKitRequirementsUnknown_0_24WRoyyAg_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_lMGV4bOhOx8_nid_no_patch() { +int APS5_VABI sqlite3_finalize_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("lMGV4bOhOx8", sceNKWebKitRequirementsUnknown_lMGV4bOhOx8_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_O1Djg3YeTLU_nid_no_patch() { +int APS5_VABI sqlite3_get_autocommit_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("O1Djg3YeTLU", sceNKWebKitRequirementsUnknown_O1Djg3YeTLU_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_mkmgHfPc6_o_nid_no_patch() { +int APS5_VABI sqlite3_initialize_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("mkmgHfPc6+o", sceNKWebKitRequirementsUnknown_mkmgHfPc6_o_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_zsxq8S_s6og_nid_no_patch() { +int APS5_VABI sqlite3_interrupt_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("zsxq8S+s6og", sceNKWebKitRequirementsUnknown_zsxq8S_s6og_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_kLDgEC1CtLw_nid_no_patch() { +int APS5_VABI sqlite3_last_insert_rowid_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("kLDgEC1CtLw", sceNKWebKitRequirementsUnknown_kLDgEC1CtLw_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_RvvvsJ_ilks_nid_no_patch() { +int APS5_VABI sqlite3_next_stmt_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("RvvvsJ-ilks", sceNKWebKitRequirementsUnknown_RvvvsJ_ilks_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_hMPqBxgdqd4_nid_no_patch() { +int APS5_VABI sqlite3_open_v2_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("hMPqBxgdqd4", sceNKWebKitRequirementsUnknown_hMPqBxgdqd4_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_q5V1eZmYXKo_nid_no_patch() { +int APS5_VABI sqlite3_prepare_v2_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("q5V1eZmYXKo", sceNKWebKitRequirementsUnknown_q5V1eZmYXKo_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_f7_5WlpEqp8_nid_no_patch() { +int APS5_VABI sqlite3_reset_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("f7-5WlpEqp8", sceNKWebKitRequirementsUnknown_f7_5WlpEqp8_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_0Uek9fMv9z4_nid_no_patch() { +int APS5_VABI sqlite3_result_error_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("0Uek9fMv9z4", sceNKWebKitRequirementsUnknown_0Uek9fMv9z4_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_gFXm4KsdCOg_nid_no_patch() { +int APS5_VABI sqlite3_set_authorizer_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("gFXm4KsdCOg", sceNKWebKitRequirementsUnknown_gFXm4KsdCOg_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_0OeraXVXfzM_nid_no_patch() { +int APS5_VABI sqlite3_sql_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("0OeraXVXfzM", sceNKWebKitRequirementsUnknown_0OeraXVXfzM_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_03w8Wi7eD_A_nid_no_patch() { +int APS5_VABI sqlite3_step_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("03w8Wi7eD-A", sceNKWebKitRequirementsUnknown_03w8Wi7eD_A_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_ILCa64n_L8U_nid_no_patch() { +int APS5_VABI sqlite3_stmt_busy_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("ILCa64n-L8U", sceNKWebKitRequirementsUnknown_ILCa64n_L8U_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_ovdabH7tKu0_nid_no_patch() { +int APS5_VABI sqlite3_total_changes_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("ovdabH7tKu0", sceNKWebKitRequirementsUnknown_ovdabH7tKu0_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_9SRRU8yTt04_nid_no_patch() { +int APS5_VABI sqlite3_user_data_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("9SRRU8yTt04", sceNKWebKitRequirementsUnknown_9SRRU8yTt04_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_EyvrFZ67_fo_nid_no_patch() { +int APS5_VABI sqlite3_value_double_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("EyvrFZ67-fo", sceNKWebKitRequirementsUnknown_EyvrFZ67_fo_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_qRLpm_alR90_nid_no_patch() { +int APS5_VABI sqlite3_value_text16_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("qRLpm-alR90", sceNKWebKitRequirementsUnknown_qRLpm_alR90_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_71eCBabjnWU_nid_no_patch() { +int APS5_VABI sqlite3_value_type_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("71eCBabjnWU", sceNKWebKitRequirementsUnknown_71eCBabjnWU_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_LbstfuAwMhQ_nid_no_patch() { +int APS5_VABI sqlite3_wal_checkpoint_v2_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("LbstfuAwMhQ", sceNKWebKitRequirementsUnknown_LbstfuAwMhQ_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_72wZB0MqDcg_nid_no_patch() { +int APS5_VABI sqlite3_wal_hook_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("72wZB0MqDcg", sceNKWebKitRequirementsUnknown_72wZB0MqDcg_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_ROw6faazl58_nid_no_patch() { +int APS5_VABI uncompress_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("ROw6faazl58", sceNKWebKitRequirementsUnknown_ROw6faazl58_nid_no_patch); int APS5_VABI sceNKWebKitRequirementsUnknown_YFlXC_lRh0A_nid_no_patch() { NotImplemented_nid_no_patch(__func__); @@ -556,119 +460,260 @@ int APS5_VABI sceNKWebKitRequirementsUnknown_uVoRmKYYtcI_nid_no_patch() { } APS5_EXPORT("uVoRmKYYtcI", sceNKWebKitRequirementsUnknown_uVoRmKYYtcI_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_HnfoQSPjI7o_nid_no_patch() { +int APS5_VABI xmlByteConsumed_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("HnfoQSPjI7o", sceNKWebKitRequirementsUnknown_HnfoQSPjI7o_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_sPxTZD_Xqdk_nid_no_patch() { +int APS5_VABI xmlCreateMemoryParserCtxt_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("sPxTZD-Xqdk", sceNKWebKitRequirementsUnknown_sPxTZD_Xqdk_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_WMpTxKngZOg_nid_no_patch() { +int APS5_VABI xmlCreatePushParserCtxt_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("WMpTxKngZOg", sceNKWebKitRequirementsUnknown_WMpTxKngZOg_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_jVg6F_8c6oo_nid_no_patch() { +int APS5_VABI xmlCtxtGetLastError_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("jVg6F-8c6oo", sceNKWebKitRequirementsUnknown_jVg6F_8c6oo_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_pzl_F73sa6k_nid_no_patch() { +int APS5_VABI xmlCtxtUseOptions_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("pzl-F73sa6k", sceNKWebKitRequirementsUnknown_pzl_F73sa6k_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_8hi6_rkfY2M_nid_no_patch() { +int APS5_VABI xmlDictLookup_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("8hi6-rkfY2M", sceNKWebKitRequirementsUnknown_8hi6_rkfY2M_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_yB_1wOOpQIU_nid_no_patch() { +int APS5_VABI xmlFreeDoc_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("yB+1wOOpQIU", sceNKWebKitRequirementsUnknown_yB_1wOOpQIU_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_QtfzmrF_Gpc_nid_no_patch() { +int APS5_VABI xmlFreeParserCtxt_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("QtfzmrF+Gpc", sceNKWebKitRequirementsUnknown_QtfzmrF_Gpc_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_O4uuDAmh9Jk_nid_no_patch() { +int APS5_VABI xmlGetDocEntity_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("O4uuDAmh9Jk", sceNKWebKitRequirementsUnknown_O4uuDAmh9Jk_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_2XNpG4ZDT4s_nid_no_patch() { +int APS5_VABI xmlGetPredefinedEntity_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("2XNpG4ZDT4s", sceNKWebKitRequirementsUnknown_2XNpG4ZDT4s_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_WR19W1gFzTc_nid_no_patch() { +int APS5_VABI xmlInitParser_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("WR19W1gFzTc", sceNKWebKitRequirementsUnknown_WR19W1gFzTc_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_ks4vjG1O3Aw_nid_no_patch() { +int APS5_VABI xmlParseChunk_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("ks4vjG1O3Aw", sceNKWebKitRequirementsUnknown_ks4vjG1O3Aw_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_GKOdtyJINIc_nid_no_patch() { +int APS5_VABI xmlParseContent_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("GKOdtyJINIc", sceNKWebKitRequirementsUnknown_GKOdtyJINIc_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_IHQRMDrYqts_nid_no_patch() { +int APS5_VABI xmlRegisterInputCallbacks_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("IHQRMDrYqts", sceNKWebKitRequirementsUnknown_IHQRMDrYqts_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_3at8rFY_PRk_nid_no_patch() { +int APS5_VABI xmlRegisterOutputCallbacks_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("3at8rFY+PRk", sceNKWebKitRequirementsUnknown_3at8rFY_PRk_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_Hb45BVZ1WVQ_nid_no_patch() { +int APS5_VABI xmlSAX2EndDocument_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("Hb45BVZ1WVQ", sceNKWebKitRequirementsUnknown_Hb45BVZ1WVQ_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_1AYeyBFz_eM_nid_no_patch() { +int APS5_VABI xmlSAX2EntityDecl_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("1AYeyBFz+eM", sceNKWebKitRequirementsUnknown_1AYeyBFz_eM_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_Fj7T2VY7xg4_nid_no_patch() { +int APS5_VABI xmlSAX2InternalSubset_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("Fj7T2VY7xg4", sceNKWebKitRequirementsUnknown_Fj7T2VY7xg4_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_lCU9IGT_MN8_nid_no_patch() { +int APS5_VABI xmlSAX2StartDocument_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("lCU9IGT-MN8", sceNKWebKitRequirementsUnknown_lCU9IGT_MN8_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_0NzQg1z_fGM_nid_no_patch() { +int APS5_VABI xmlStopParser_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("0NzQg1z-fGM", sceNKWebKitRequirementsUnknown_0NzQg1z_fGM_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_IO92NEwJXT8_nid_no_patch() { +int APS5_VABI xmlStrdup_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("IO92NEwJXT8", sceNKWebKitRequirementsUnknown_IO92NEwJXT8_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_zuQqTYaKNl4_nid_no_patch() { +int APS5_VABI xmlStrndup_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("zuQqTYaKNl4", sceNKWebKitRequirementsUnknown_zuQqTYaKNl4_nid_no_patch); -int APS5_VABI sceNKWebKitRequirementsUnknown_Kzy7yDwocns_nid_no_patch() { +int APS5_VABI xmlSwitchEncoding_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("Kzy7yDwocns", sceNKWebKitRequirementsUnknown_Kzy7yDwocns_nid_no_patch); + +} + +extern "C" { + +int APS5_VABI libSceNKWebKitRequirementsUnknown__plus__plus_QInfMOBN0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("++QInfMOBN0", libSceNKWebKitRequirementsUnknown__plus__plus_QInfMOBN0_nid_no_patch); + +int APS5_VABI libSceNKWebKitRequirementsUnknown__plus_oA7tlz2Aiw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+oA7tlz2Aiw", libSceNKWebKitRequirementsUnknown__plus_oA7tlz2Aiw_nid_no_patch); + +int APS5_VABI libSceNKWebKitRequirementsUnknown_1MRhOnElUw4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1MRhOnElUw4", libSceNKWebKitRequirementsUnknown_1MRhOnElUw4_nid_no_patch); + +int APS5_VABI libSceNKWebKitRequirementsUnknown_1T7K_minus_PY5paE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1T7K-PY5paE", libSceNKWebKitRequirementsUnknown_1T7K_minus_PY5paE_nid_no_patch); + +int APS5_VABI libSceNKWebKitRequirementsUnknown_3yG30EKj_minus_64_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3yG30EKj-64", libSceNKWebKitRequirementsUnknown_3yG30EKj_minus_64_nid_no_patch); + +int APS5_VABI libSceNKWebKitRequirementsUnknown_4dTqu8uWd6Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4dTqu8uWd6Q", libSceNKWebKitRequirementsUnknown_4dTqu8uWd6Q_nid_no_patch); + +int APS5_VABI libSceNKWebKitRequirementsUnknown_6_minus_rd4IXD0mM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6-rd4IXD0mM", libSceNKWebKitRequirementsUnknown_6_minus_rd4IXD0mM_nid_no_patch); + +int APS5_VABI libSceNKWebKitRequirementsUnknown_68aoiQnJutE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("68aoiQnJutE", libSceNKWebKitRequirementsUnknown_68aoiQnJutE_nid_no_patch); + +int APS5_VABI libSceNKWebKitRequirementsUnknown_8u1QXzSpyno_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8u1QXzSpyno", libSceNKWebKitRequirementsUnknown_8u1QXzSpyno_nid_no_patch); + +int APS5_VABI libSceNKWebKitRequirementsUnknown_JwB900c8Nyo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JwB900c8Nyo", libSceNKWebKitRequirementsUnknown_JwB900c8Nyo_nid_no_patch); + +int APS5_VABI libSceNKWebKitRequirementsUnknown_KCP1Db_minus_mniM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KCP1Db-mniM", libSceNKWebKitRequirementsUnknown_KCP1Db_minus_mniM_nid_no_patch); + +int APS5_VABI libSceNKWebKitRequirementsUnknown_NCGIxzXT_minus_KA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NCGIxzXT-KA", libSceNKWebKitRequirementsUnknown_NCGIxzXT_minus_KA_nid_no_patch); + +int APS5_VABI libSceNKWebKitRequirementsUnknown_TAGTeghnmJs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TAGTeghnmJs", libSceNKWebKitRequirementsUnknown_TAGTeghnmJs_nid_no_patch); + +int APS5_VABI libSceNKWebKitRequirementsUnknown_TNO_minus_EUJZf3c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TNO-EUJZf3c", libSceNKWebKitRequirementsUnknown_TNO_minus_EUJZf3c_nid_no_patch); + +int APS5_VABI libSceNKWebKitRequirementsUnknown_Wz6vEl9ATDQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Wz6vEl9ATDQ", libSceNKWebKitRequirementsUnknown_Wz6vEl9ATDQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitRequirementsUnknown_YpZ1fAOlVoo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YpZ1fAOlVoo", libSceNKWebKitRequirementsUnknown_YpZ1fAOlVoo_nid_no_patch); + +int APS5_VABI libSceNKWebKitRequirementsUnknown_ZSkWe_minus_fNsuY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZSkWe-fNsuY", libSceNKWebKitRequirementsUnknown_ZSkWe_minus_fNsuY_nid_no_patch); + +int APS5_VABI libSceNKWebKitRequirementsUnknown_cgNin5rMqA8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cgNin5rMqA8", libSceNKWebKitRequirementsUnknown_cgNin5rMqA8_nid_no_patch); + +int APS5_VABI libSceNKWebKitRequirementsUnknown_cq16C8ickjY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cq16C8ickjY", libSceNKWebKitRequirementsUnknown_cq16C8ickjY_nid_no_patch); + +int APS5_VABI libSceNKWebKitRequirementsUnknown_hjlKZNuv_plus_v8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hjlKZNuv+v8", libSceNKWebKitRequirementsUnknown_hjlKZNuv_plus_v8_nid_no_patch); + +int APS5_VABI libSceNKWebKitRequirementsUnknown_o6hmqtmcw10_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("o6hmqtmcw10", libSceNKWebKitRequirementsUnknown_o6hmqtmcw10_nid_no_patch); + +int APS5_VABI libSceNKWebKitRequirementsUnknown_o7ktMsqiCBU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("o7ktMsqiCBU", libSceNKWebKitRequirementsUnknown_o7ktMsqiCBU_nid_no_patch); + +int APS5_VABI libSceNKWebKitRequirementsUnknown_rW6yS0aJbjQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rW6yS0aJbjQ", libSceNKWebKitRequirementsUnknown_rW6yS0aJbjQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitRequirementsUnknown_rgWcud6b43M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rgWcud6b43M", libSceNKWebKitRequirementsUnknown_rgWcud6b43M_nid_no_patch); + +int APS5_VABI libSceNKWebKitRequirementsUnknown_soW4BQ5l3Os_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("soW4BQ5l3Os", libSceNKWebKitRequirementsUnknown_soW4BQ5l3Os_nid_no_patch); + +int APS5_VABI libSceNKWebKitRequirementsUnknown_tc5h_plus_wVQWZI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tc5h+wVQWZI", libSceNKWebKitRequirementsUnknown_tc5h_plus_wVQWZI_nid_no_patch); + +int APS5_VABI libSceNKWebKitRequirementsUnknown_tu7_plus_XEdsUA8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tu7+XEdsUA8", libSceNKWebKitRequirementsUnknown_tu7_plus_XEdsUA8_nid_no_patch); + +int APS5_VABI libSceNKWebKitRequirementsUnknown_u4SbDPju5eo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("u4SbDPju5eo", libSceNKWebKitRequirementsUnknown_u4SbDPju5eo_nid_no_patch); + +int APS5_VABI libSceNKWebKitRequirementsUnknown_uXf4oddEz5E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uXf4oddEz5E", libSceNKWebKitRequirementsUnknown_uXf4oddEz5E_nid_no_patch); + +int APS5_VABI libSceNKWebKitRequirementsUnknown_uiTgPO1VRaA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uiTgPO1VRaA", libSceNKWebKitRequirementsUnknown_uiTgPO1VRaA_nid_no_patch); + +int APS5_VABI libSceNKWebKitRequirementsUnknown_x2xMh95HEb4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("x2xMh95HEb4", libSceNKWebKitRequirementsUnknown_x2xMh95HEb4_nid_no_patch); + +int APS5_VABI libSceNKWebKitRequirementsUnknown_z5L7zirdMWM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("z5L7zirdMWM", libSceNKWebKitRequirementsUnknown_z5L7zirdMWM_nid_no_patch); } diff --git a/core/libs/prx/libSceNKWebKitRequirements/include/Identified.hpp b/core/libs/prx/libSceNKWebKitRequirements/include/Identified.hpp new file mode 100644 index 0000000000..6a2a2dc188 --- /dev/null +++ b/core/libs/prx/libSceNKWebKitRequirements/include/Identified.hpp @@ -0,0 +1,127 @@ +#pragma once +#include "prx/libc/include/general/VabiMacros.hpp" + +extern "C" { +int APS5_VABI __ubsan_handle_cfi_check_fail_nid_disambig1_nid_postfix(); +int APS5_VABI __ubsan_handle_cfi_check_fail_abort_nid_disambig1_nid_postfix(); +int APS5_VABI deflate_nid_postfix(); +int APS5_VABI deflateBound_nid_postfix(); +int APS5_VABI deflateEnd_nid_postfix(); +int APS5_VABI deflateInit2__nid_postfix(); +int APS5_VABI deflateReset_nid_postfix(); +int APS5_VABI inflate_nid_postfix(); +int APS5_VABI inflateEnd_nid_postfix(); +int APS5_VABI inflateInit2__nid_postfix(); +int APS5_VABI inflateReset_nid_postfix(); +int APS5_VABI jpeg_CreateDecompress_nid_postfix(); +int APS5_VABI jpeg_calc_output_dimensions_nid_postfix(); +int APS5_VABI jpeg_consume_input_nid_postfix(); +int APS5_VABI jpeg_destroy_decompress_nid_postfix(); +int APS5_VABI jpeg_finish_decompress_nid_postfix(); +int APS5_VABI jpeg_finish_output_nid_postfix(); +int APS5_VABI jpeg_has_multiple_scans_nid_postfix(); +int APS5_VABI jpeg_input_complete_nid_postfix(); +int APS5_VABI jpeg_read_header_nid_postfix(); +int APS5_VABI jpeg_read_scanlines_nid_postfix(); +int APS5_VABI jpeg_resync_to_restart_nid_postfix(); +int APS5_VABI jpeg_save_markers_nid_postfix(); +int APS5_VABI jpeg_start_decompress_nid_postfix(); +int APS5_VABI jpeg_start_output_nid_postfix(); +int APS5_VABI jpeg_std_error_nid_postfix(); +int APS5_VABI psl_builtin_nid_postfix(); +int APS5_VABI psl_builtin_file_time_nid_postfix(); +int APS5_VABI psl_builtin_filename_nid_postfix(); +int APS5_VABI psl_builtin_outdated_nid_postfix(); +int APS5_VABI psl_builtin_sha1sum_nid_postfix(); +int APS5_VABI psl_check_version_number_nid_postfix(); +int APS5_VABI psl_dist_filename_nid_postfix(); +int APS5_VABI psl_free_nid_postfix(); +int APS5_VABI psl_free_string_nid_postfix(); +int APS5_VABI psl_get_version_nid_postfix(); +int APS5_VABI psl_is_cookie_domain_acceptable_nid_postfix(); +int APS5_VABI psl_is_public_suffix_nid_postfix(); +int APS5_VABI psl_is_public_suffix2_nid_postfix(); +int APS5_VABI psl_latest_nid_postfix(); +int APS5_VABI psl_load_file_nid_postfix(); +int APS5_VABI psl_load_fp_nid_postfix(); +int APS5_VABI psl_registrable_domain_nid_postfix(); +int APS5_VABI psl_str_to_utf8lower_nid_postfix(); +int APS5_VABI psl_suffix_count_nid_postfix(); +int APS5_VABI psl_suffix_exception_count_nid_postfix(); +int APS5_VABI psl_suffix_wildcard_count_nid_postfix(); +int APS5_VABI psl_unregistrable_domain_nid_postfix(); +int APS5_VABI sqlite3_bind_blob_nid_postfix(); +int APS5_VABI sqlite3_bind_double_nid_postfix(); +int APS5_VABI sqlite3_bind_int_nid_postfix(); +int APS5_VABI sqlite3_bind_int64_nid_postfix(); +int APS5_VABI sqlite3_bind_null_nid_postfix(); +int APS5_VABI sqlite3_bind_parameter_count_nid_postfix(); +int APS5_VABI sqlite3_bind_text16_nid_postfix(); +int APS5_VABI sqlite3_busy_handler_nid_postfix(); +int APS5_VABI sqlite3_busy_timeout_nid_postfix(); +int APS5_VABI sqlite3_clear_bindings_nid_postfix(); +int APS5_VABI sqlite3_close_nid_postfix(); +int APS5_VABI sqlite3_column_blob_nid_postfix(); +int APS5_VABI sqlite3_column_bytes_nid_postfix(); +int APS5_VABI sqlite3_column_bytes16_nid_postfix(); +int APS5_VABI sqlite3_column_decltype_nid_postfix(); +int APS5_VABI sqlite3_column_double_nid_postfix(); +int APS5_VABI sqlite3_column_int_nid_postfix(); +int APS5_VABI sqlite3_column_int64_nid_postfix(); +int APS5_VABI sqlite3_column_name16_nid_postfix(); +int APS5_VABI sqlite3_column_text16_nid_postfix(); +int APS5_VABI sqlite3_column_type_nid_postfix(); +int APS5_VABI sqlite3_column_value_nid_postfix(); +int APS5_VABI sqlite3_create_collation_v2_nid_postfix(); +int APS5_VABI sqlite3_create_function_nid_postfix(); +int APS5_VABI sqlite3_data_count_nid_postfix(); +int APS5_VABI sqlite3_errcode_nid_postfix(); +int APS5_VABI sqlite3_errmsg_nid_postfix(); +int APS5_VABI sqlite3_errstr_nid_postfix(); +int APS5_VABI sqlite3_extended_result_codes_nid_postfix(); +int APS5_VABI sqlite3_finalize_nid_postfix(); +int APS5_VABI sqlite3_get_autocommit_nid_postfix(); +int APS5_VABI sqlite3_initialize_nid_postfix(); +int APS5_VABI sqlite3_interrupt_nid_postfix(); +int APS5_VABI sqlite3_last_insert_rowid_nid_postfix(); +int APS5_VABI sqlite3_next_stmt_nid_postfix(); +int APS5_VABI sqlite3_open_v2_nid_postfix(); +int APS5_VABI sqlite3_prepare_v2_nid_postfix(); +int APS5_VABI sqlite3_reset_nid_postfix(); +int APS5_VABI sqlite3_result_error_nid_postfix(); +int APS5_VABI sqlite3_set_authorizer_nid_postfix(); +int APS5_VABI sqlite3_sql_nid_postfix(); +int APS5_VABI sqlite3_step_nid_postfix(); +int APS5_VABI sqlite3_stmt_busy_nid_postfix(); +int APS5_VABI sqlite3_total_changes_nid_postfix(); +int APS5_VABI sqlite3_user_data_nid_postfix(); +int APS5_VABI sqlite3_value_double_nid_postfix(); +int APS5_VABI sqlite3_value_text16_nid_postfix(); +int APS5_VABI sqlite3_value_type_nid_postfix(); +int APS5_VABI sqlite3_wal_checkpoint_v2_nid_postfix(); +int APS5_VABI sqlite3_wal_hook_nid_postfix(); +int APS5_VABI uncompress_nid_postfix(); +int APS5_VABI xmlByteConsumed_nid_postfix(); +int APS5_VABI xmlCreateMemoryParserCtxt_nid_postfix(); +int APS5_VABI xmlCreatePushParserCtxt_nid_postfix(); +int APS5_VABI xmlCtxtGetLastError_nid_postfix(); +int APS5_VABI xmlCtxtUseOptions_nid_postfix(); +int APS5_VABI xmlDictLookup_nid_postfix(); +int APS5_VABI xmlFreeDoc_nid_postfix(); +int APS5_VABI xmlFreeParserCtxt_nid_postfix(); +int APS5_VABI xmlGetDocEntity_nid_postfix(); +int APS5_VABI xmlGetPredefinedEntity_nid_postfix(); +int APS5_VABI xmlInitParser_nid_postfix(); +int APS5_VABI xmlParseChunk_nid_postfix(); +int APS5_VABI xmlParseContent_nid_postfix(); +int APS5_VABI xmlRegisterInputCallbacks_nid_postfix(); +int APS5_VABI xmlRegisterOutputCallbacks_nid_postfix(); +int APS5_VABI xmlSAX2EndDocument_nid_postfix(); +int APS5_VABI xmlSAX2EntityDecl_nid_postfix(); +int APS5_VABI xmlSAX2InternalSubset_nid_postfix(); +int APS5_VABI xmlSAX2StartDocument_nid_postfix(); +int APS5_VABI xmlStopParser_nid_postfix(); +int APS5_VABI xmlStrdup_nid_postfix(); +int APS5_VABI xmlStrndup_nid_postfix(); +int APS5_VABI xmlSwitchEncoding_nid_postfix(); +} diff --git a/core/libs/prx/libSceNKWebKitRequirements/include/InventoryExports.hpp b/core/libs/prx/libSceNKWebKitRequirements/include/InventoryExports.hpp new file mode 100644 index 0000000000..c681f38d13 --- /dev/null +++ b/core/libs/prx/libSceNKWebKitRequirements/include/InventoryExports.hpp @@ -0,0 +1,40 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceNKWebKitRequirementsUnknown__plus__plus_QInfMOBN0_nid_no_patch(); +int APS5_VABI libSceNKWebKitRequirementsUnknown__plus_oA7tlz2Aiw_nid_no_patch(); +int APS5_VABI libSceNKWebKitRequirementsUnknown_1MRhOnElUw4_nid_no_patch(); +int APS5_VABI libSceNKWebKitRequirementsUnknown_1T7K_minus_PY5paE_nid_no_patch(); +int APS5_VABI libSceNKWebKitRequirementsUnknown_3yG30EKj_minus_64_nid_no_patch(); +int APS5_VABI libSceNKWebKitRequirementsUnknown_4dTqu8uWd6Q_nid_no_patch(); +int APS5_VABI libSceNKWebKitRequirementsUnknown_6_minus_rd4IXD0mM_nid_no_patch(); +int APS5_VABI libSceNKWebKitRequirementsUnknown_68aoiQnJutE_nid_no_patch(); +int APS5_VABI libSceNKWebKitRequirementsUnknown_8u1QXzSpyno_nid_no_patch(); +int APS5_VABI libSceNKWebKitRequirementsUnknown_JwB900c8Nyo_nid_no_patch(); +int APS5_VABI libSceNKWebKitRequirementsUnknown_KCP1Db_minus_mniM_nid_no_patch(); +int APS5_VABI libSceNKWebKitRequirementsUnknown_NCGIxzXT_minus_KA_nid_no_patch(); +int APS5_VABI libSceNKWebKitRequirementsUnknown_TAGTeghnmJs_nid_no_patch(); +int APS5_VABI libSceNKWebKitRequirementsUnknown_TNO_minus_EUJZf3c_nid_no_patch(); +int APS5_VABI libSceNKWebKitRequirementsUnknown_Wz6vEl9ATDQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitRequirementsUnknown_YpZ1fAOlVoo_nid_no_patch(); +int APS5_VABI libSceNKWebKitRequirementsUnknown_ZSkWe_minus_fNsuY_nid_no_patch(); +int APS5_VABI libSceNKWebKitRequirementsUnknown_cgNin5rMqA8_nid_no_patch(); +int APS5_VABI libSceNKWebKitRequirementsUnknown_cq16C8ickjY_nid_no_patch(); +int APS5_VABI libSceNKWebKitRequirementsUnknown_hjlKZNuv_plus_v8_nid_no_patch(); +int APS5_VABI libSceNKWebKitRequirementsUnknown_o6hmqtmcw10_nid_no_patch(); +int APS5_VABI libSceNKWebKitRequirementsUnknown_o7ktMsqiCBU_nid_no_patch(); +int APS5_VABI libSceNKWebKitRequirementsUnknown_rW6yS0aJbjQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitRequirementsUnknown_rgWcud6b43M_nid_no_patch(); +int APS5_VABI libSceNKWebKitRequirementsUnknown_soW4BQ5l3Os_nid_no_patch(); +int APS5_VABI libSceNKWebKitRequirementsUnknown_tc5h_plus_wVQWZI_nid_no_patch(); +int APS5_VABI libSceNKWebKitRequirementsUnknown_tu7_plus_XEdsUA8_nid_no_patch(); +int APS5_VABI libSceNKWebKitRequirementsUnknown_u4SbDPju5eo_nid_no_patch(); +int APS5_VABI libSceNKWebKitRequirementsUnknown_uXf4oddEz5E_nid_no_patch(); +int APS5_VABI libSceNKWebKitRequirementsUnknown_uiTgPO1VRaA_nid_no_patch(); +int APS5_VABI libSceNKWebKitRequirementsUnknown_x2xMh95HEb4_nid_no_patch(); +int APS5_VABI libSceNKWebKitRequirementsUnknown_z5L7zirdMWM_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceNKWebKitRequirements/libSceNKWebKitRequirements.hpp b/core/libs/prx/libSceNKWebKitRequirements/libSceNKWebKitRequirements.hpp index 6f70f09bee..f487bd43a8 100644 --- a/core/libs/prx/libSceNKWebKitRequirements/libSceNKWebKitRequirements.hpp +++ b/core/libs/prx/libSceNKWebKitRequirements/libSceNKWebKitRequirements.hpp @@ -1 +1,3 @@ #pragma once +#include "prx/libSceNKWebKitRequirements/include/InventoryExports.hpp" +#include "prx/libSceNKWebKitRequirements/include/Identified.hpp" diff --git a/core/libs/prx/libSceNet/CMakeLists.txt b/core/libs/prx/libSceNet/CMakeLists.txt index 10ad0db42a..f5a380e277 100644 --- a/core/libs/prx/libSceNet/CMakeLists.txt +++ b/core/libs/prx/libSceNet/CMakeLists.txt @@ -1,4 +1,4 @@ -add_library(libSceNet SHARED EXCLUDE_FROM_ALL Export.cpp) +add_library(libSceNet SHARED EXCLUDE_FROM_ALL Export.cpp InventoryExports.cpp) target_include_directories(libSceNet PRIVATE ${LIBS_INCLUDE_DIR}) target_link_libraries(libSceNet PRIVATE libSceNetCtl) configure_windows_unwind(libSceNet) diff --git a/core/libs/prx/libSceNet/Export.cpp b/core/libs/prx/libSceNet/Export.cpp index 2103f34a7c..fed529568f 100644 --- a/core/libs/prx/libSceNet/Export.cpp +++ b/core/libs/prx/libSceNet/Export.cpp @@ -743,6 +743,12 @@ void GuestSceNetTest::SetResolverLookupForTests_nid_no_patch(ResolverLookup look extern "C" { extern const std::uint32_t sce_net_in6addr_any[4] = {}; + +alignas(std::uint32_t) extern const std::uint8_t sce_net_in6addr_loopback_nid_postfix[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; +alignas(std::uint32_t) extern const std::uint8_t sce_net_in6addr_nodelocal_allnodes_nid_postfix[16] = {0xff, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; +alignas(std::uint32_t) extern const std::uint8_t sce_net_in6addr_linklocal_allrouters_nid_postfix[16] = {0xff, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}; +extern const std::uint32_t sce_net_dummy_nid_postfix = 0; + alignas(std::uint32_t) extern const std::uint8_t sce_net_in6addr_linklocal_allnodes[16] = {0xff, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; int* APS5_VABI sceNetErrnoLoc(void) { diff --git a/core/libs/prx/libSceNet/InventoryExports.cpp b/core/libs/prx/libSceNet/InventoryExports.cpp new file mode 100644 index 0000000000..1285b54c58 --- /dev/null +++ b/core/libs/prx/libSceNet/InventoryExports.cpp @@ -0,0 +1,47 @@ +#include "SceTypes.hpp" +#include "prx/libc/include/General.hpp" +#include "prx/libc/include/general/ExportMacros.hpp" + +extern "C" { + +int APS5_VABI libSceNetUnknown__plus_hZ3zpjYiYw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+hZ3zpjYiYw", libSceNetUnknown__plus_hZ3zpjYiYw_nid_no_patch); + +int APS5_VABI libSceNetUnknown__minus_qjsa0xOWMc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-qjsa0xOWMc", libSceNetUnknown__minus_qjsa0xOWMc_nid_no_patch); + +int APS5_VABI libSceNetUnknown_DnB6WJ91HGg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DnB6WJ91HGg", libSceNetUnknown_DnB6WJ91HGg_nid_no_patch); + +int APS5_VABI libSceNetUnknown_HMievhVSU3g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HMievhVSU3g", libSceNetUnknown_HMievhVSU3g_nid_no_patch); + +int APS5_VABI libSceNetUnknown_YQZkUbAw6rg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YQZkUbAw6rg", libSceNetUnknown_YQZkUbAw6rg_nid_no_patch); + +int APS5_VABI libSceNetUnknown_guwFkKH_plus_wP8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("guwFkKH+wP8", libSceNetUnknown_guwFkKH_plus_wP8_nid_no_patch); + +int APS5_VABI libSceNetUnknown_mnXcgCBmiV0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mnXcgCBmiV0", libSceNetUnknown_mnXcgCBmiV0_nid_no_patch); + +int APS5_VABI libSceNetUnknown_pGboVhl_minus_6P0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pGboVhl-6P0", libSceNetUnknown_pGboVhl_minus_6P0_nid_no_patch); + +} diff --git a/core/libs/prx/libSceNet/include/Net.hpp b/core/libs/prx/libSceNet/include/Net.hpp index 86205fa855..78acb35539 100644 --- a/core/libs/prx/libSceNet/include/Net.hpp +++ b/core/libs/prx/libSceNet/include/Net.hpp @@ -218,6 +218,12 @@ using NetEventCallback = std::uint64_t (APS5_VABI*)(std::uint32_t interfaceId, s extern "C" { +extern const std::uint8_t sce_net_in6addr_loopback_nid_postfix[16]; +extern const std::uint8_t sce_net_in6addr_nodelocal_allnodes_nid_postfix[16]; +extern const std::uint8_t sce_net_in6addr_linklocal_allrouters_nid_postfix[16]; +extern const std::uint32_t sce_net_dummy_nid_postfix; + + int* APS5_VABI sceNetErrnoLoc(void); int APS5_VABI sceNetShowNetstat(void); int APS5_VABI sceNetInit_nid_postfix(void); diff --git a/core/libs/prx/libSceNetCtl/Export.cpp b/core/libs/prx/libSceNetCtl/Export.cpp index b82230ac78..fd2218367a 100644 --- a/core/libs/prx/libSceNetCtl/Export.cpp +++ b/core/libs/prx/libSceNetCtl/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceNetCtl/include/InventoryExports.hpp" #include "prx/libSceNetCtl/include/NetCtl.hpp" #ifdef _WIN32 #define WIN32_LEAN_AND_MEAN @@ -1379,3 +1381,104 @@ int APS5_VABI sceNetCtlGetWifiInfoIpcInt(NetCtlWifiInfo* info) { } } + +extern "C" { + +int APS5_VABI sceInetStatInit() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceInetStatTerm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceNetConnSwitcherStop() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI libSceNetCtlUnknown_09YMz3Vp5us_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("09YMz3Vp5us", libSceNetCtlUnknown_09YMz3Vp5us_nid_no_patch); + +int APS5_VABI libSceNetCtlUnknown_1PGApDf96ao_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1PGApDf96ao", libSceNetCtlUnknown_1PGApDf96ao_nid_no_patch); + +int APS5_VABI libSceNetCtlUnknown_1mrTXfVGn_plus_g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1mrTXfVGn+g", libSceNetCtlUnknown_1mrTXfVGn_plus_g_nid_no_patch); + +int APS5_VABI libSceNetCtlUnknown_2Ny2lzU3o9w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2Ny2lzU3o9w", libSceNetCtlUnknown_2Ny2lzU3o9w_nid_no_patch); + +int APS5_VABI libSceNetCtlUnknown_3cNKxJXXYYk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3cNKxJXXYYk", libSceNetCtlUnknown_3cNKxJXXYYk_nid_no_patch); + +int APS5_VABI libSceNetCtlUnknown_AIu_minus_tRC_minus_mSM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AIu-tRC-mSM", libSceNetCtlUnknown_AIu_minus_tRC_minus_mSM_nid_no_patch); + +int APS5_VABI libSceNetCtlUnknown_BSERkV_minus_a9e8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BSERkV-a9e8", libSceNetCtlUnknown_BSERkV_minus_a9e8_nid_no_patch); + +int APS5_VABI libSceNetCtlUnknown_FwX_plus_Js8qXNA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FwX+Js8qXNA", libSceNetCtlUnknown_FwX_plus_Js8qXNA_nid_no_patch); + +int APS5_VABI libSceNetCtlUnknown_I14Npt_minus_awQg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("I14Npt-awQg", libSceNetCtlUnknown_I14Npt_minus_awQg_nid_no_patch); + +int APS5_VABI libSceNetCtlUnknown_KUdWtCC6w_minus_0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KUdWtCC6w-0", libSceNetCtlUnknown_KUdWtCC6w_minus_0_nid_no_patch); + +int APS5_VABI libSceNetCtlUnknown_QnQ4RBu546Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QnQ4RBu546Y", libSceNetCtlUnknown_QnQ4RBu546Y_nid_no_patch); + +int APS5_VABI libSceNetCtlUnknown_e5_minus_Xj0wEzbI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("e5-Xj0wEzbI", libSceNetCtlUnknown_e5_minus_Xj0wEzbI_nid_no_patch); + +int APS5_VABI libSceNetCtlUnknown_lScJhO3Rnpk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lScJhO3Rnpk", libSceNetCtlUnknown_lScJhO3Rnpk_nid_no_patch); + +int APS5_VABI libSceNetCtlUnknown_mfWDyuk_minus_M0I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mfWDyuk-M0I", libSceNetCtlUnknown_mfWDyuk_minus_M0I_nid_no_patch); + +int APS5_VABI libSceNetCtlUnknown_on7RqSRy8pU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("on7RqSRy8pU", libSceNetCtlUnknown_on7RqSRy8pU_nid_no_patch); + +int APS5_VABI libSceNetCtlUnknown_sngJX5nUjVM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sngJX5nUjVM", libSceNetCtlUnknown_sngJX5nUjVM_nid_no_patch); + +int APS5_VABI libSceNetCtlUnknown_wVXoAlD7Fsg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wVXoAlD7Fsg", libSceNetCtlUnknown_wVXoAlD7Fsg_nid_no_patch); + +} diff --git a/core/libs/prx/libSceNetCtl/include/InventoryExports.hpp b/core/libs/prx/libSceNetCtl/include/InventoryExports.hpp new file mode 100644 index 0000000000..719c174371 --- /dev/null +++ b/core/libs/prx/libSceNetCtl/include/InventoryExports.hpp @@ -0,0 +1,28 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI sceInetStatInit(); +int APS5_VABI sceInetStatTerm(); +int APS5_VABI sceNetConnSwitcherStop(); +int APS5_VABI libSceNetCtlUnknown_09YMz3Vp5us_nid_no_patch(); +int APS5_VABI libSceNetCtlUnknown_1PGApDf96ao_nid_no_patch(); +int APS5_VABI libSceNetCtlUnknown_1mrTXfVGn_plus_g_nid_no_patch(); +int APS5_VABI libSceNetCtlUnknown_2Ny2lzU3o9w_nid_no_patch(); +int APS5_VABI libSceNetCtlUnknown_3cNKxJXXYYk_nid_no_patch(); +int APS5_VABI libSceNetCtlUnknown_AIu_minus_tRC_minus_mSM_nid_no_patch(); +int APS5_VABI libSceNetCtlUnknown_BSERkV_minus_a9e8_nid_no_patch(); +int APS5_VABI libSceNetCtlUnknown_FwX_plus_Js8qXNA_nid_no_patch(); +int APS5_VABI libSceNetCtlUnknown_I14Npt_minus_awQg_nid_no_patch(); +int APS5_VABI libSceNetCtlUnknown_KUdWtCC6w_minus_0_nid_no_patch(); +int APS5_VABI libSceNetCtlUnknown_QnQ4RBu546Y_nid_no_patch(); +int APS5_VABI libSceNetCtlUnknown_e5_minus_Xj0wEzbI_nid_no_patch(); +int APS5_VABI libSceNetCtlUnknown_lScJhO3Rnpk_nid_no_patch(); +int APS5_VABI libSceNetCtlUnknown_mfWDyuk_minus_M0I_nid_no_patch(); +int APS5_VABI libSceNetCtlUnknown_on7RqSRy8pU_nid_no_patch(); +int APS5_VABI libSceNetCtlUnknown_sngJX5nUjVM_nid_no_patch(); +int APS5_VABI libSceNetCtlUnknown_wVXoAlD7Fsg_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceNetCtl/libSceNetCtl.hpp b/core/libs/prx/libSceNetCtl/libSceNetCtl.hpp index d60a79d958..d6ff532a86 100644 --- a/core/libs/prx/libSceNetCtl/libSceNetCtl.hpp +++ b/core/libs/prx/libSceNetCtl/libSceNetCtl.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceNetCtl/include/NetCtl.hpp" +#include "prx/libSceNetCtl/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceNgs2.native/include/Ngs2Types.hpp b/core/libs/prx/libSceNgs2.native/include/Ngs2Types.hpp index 144c82dcf8..82f135f7b9 100644 --- a/core/libs/prx/libSceNgs2.native/include/Ngs2Types.hpp +++ b/core/libs/prx/libSceNgs2.native/include/Ngs2Types.hpp @@ -34,6 +34,7 @@ static constexpr int SCE_NGS2_ERROR_PS4_INVALID_STATE_SIZE = static_cast(0x static constexpr int SCE_NGS2_ERROR_INVALID_VOICE_ACCESS = static_cast(0x804A8351); static constexpr int SCE_NGS2_ERROR_INVALID_PEAK_METER_BLOCKS = static_cast(0x804A8092); static constexpr int SCE_NGS2_ERROR_INVALID_PEAK_METER_MODE = static_cast(0x804A8093); +static constexpr int SCE_NGS2_ERROR_INVALID_VOICE_OUTPUT_INDEX = static_cast(0x804A8357); static constexpr int SCE_NGS2_ERROR_NULL_PARAM_LIST = static_cast(0x804A8360); static constexpr int SCE_NGS2_ERROR_INVALID_PARAM_ID = static_cast(0x804A835A); static constexpr int SCE_NGS2_ERROR_INVALID_GEOM_LISTENER_ADDRESS = static_cast(0x804A8461); diff --git a/core/libs/prx/libSceNgs2.native/src/Ngs2Internal.hpp b/core/libs/prx/libSceNgs2.native/src/Ngs2Internal.hpp index 2feb20f23c..d7d81928c6 100644 --- a/core/libs/prx/libSceNgs2.native/src/Ngs2Internal.hpp +++ b/core/libs/prx/libSceNgs2.native/src/Ngs2Internal.hpp @@ -377,6 +377,7 @@ void Ngs2PrepareControlMix(Ngs2Voice& voice); void Ngs2RenderSystem(Ngs2System& system, const Ngs2RenderBufferInfo* bufferInfo, std::uint32_t numBufferInfo); void Ngs2RenderSilence(const Ngs2System& system, const Ngs2RenderBufferInfo* bufferInfo, std::uint32_t numBufferInfo); float Ngs2DefaultLevel(std::uint32_t sourceChannels, std::uint32_t source, std::uint32_t destChannels, std::uint32_t dest); +float Ngs2FixedDownmixLevel(std::uint32_t sourceChannels, std::uint32_t source, std::uint32_t destChannels, std::uint32_t dest); int Ngs2PanInit(Ngs2PanWork* work, const float* speaker_angles, float unit_angle, uint32_t num_speakers); int Ngs2PanGetVolumeMatrix(Ngs2PanWork* work, const Ngs2PanParam* params, uint32_t num_params, uint32_t matrix_format, float* out_volume_matrix); int Ngs2GeomResetListenerParam(Ngs2GeomListenerParam* out_listener_param); diff --git a/core/libs/prx/libSceNgs2.native/src/Pan.cpp b/core/libs/prx/libSceNgs2.native/src/Pan.cpp index f59c436bc9..e3ad5c7d2e 100644 --- a/core/libs/prx/libSceNgs2.native/src/Pan.cpp +++ b/core/libs/prx/libSceNgs2.native/src/Pan.cpp @@ -131,7 +131,7 @@ int Ngs2PanGetVolumeMatrix(Ngs2PanWork* work, const Ngs2PanParam* params, uint32 for (std::uint32_t channel = 0; channel < 8; channel++) mix[channel] = channel == LFE_CHANNEL ? param.lfe_level : mix[channel] * param.fbw_level; for (std::uint32_t dest = 0; dest < matrix_format; dest++) { float& level = out_volume_matrix[static_cast(dest) * num_params + p]; - for (std::uint32_t channel = 0; channel < layout->mixChannels; channel++) level += Ngs2DefaultLevel(layout->mixChannels, channel, matrix_format, dest) * mix[channel]; + for (std::uint32_t channel = 0; channel < layout->mixChannels; channel++) level += Ngs2FixedDownmixLevel(layout->mixChannels, channel, matrix_format, dest) * mix[channel]; } } return SCE_NGS2_OK; diff --git a/core/libs/prx/libSceNgs2.native/src/Render.cpp b/core/libs/prx/libSceNgs2.native/src/Render.cpp index 1e987fc582..181b81fba0 100644 --- a/core/libs/prx/libSceNgs2.native/src/Render.cpp +++ b/core/libs/prx/libSceNgs2.native/src/Render.cpp @@ -12,6 +12,12 @@ #include "prx/libc/include/General.hpp" #include "Ngs2Internal.hpp" +#ifdef APS5_NGS2_PS4_LIBRARY +static constexpr bool PS4_LIBRARY = true; +#else +static constexpr bool PS4_LIBRARY = false; +#endif + static void ReadPcm(const Ngs2Voice& voice, const std::uint8_t* frame, float* out) { Ngs2ReadPcmFrame(voice.waveformType, voice.channels, frame, out); @@ -176,11 +182,17 @@ static constexpr Ngs2DefaultRow QUAD_LEFT{0.5f, {HALF_POWER, 0}, {0, 0, 0, 0, 1, static constexpr Ngs2DefaultRow QUAD_RIGHT{0.5f, {0, HALF_POWER}, {0, 0, 0, 0, 0, 1}, {0, 0, 0, 0, 0, 1, 0, 0}}; static constexpr Ngs2DefaultRow FIVE_SURROUND_LEFT{0.5f, {0, 0}, {0, 0, 0, 0, 1, 0}, {0, 0, 0, 0, 1, 0, 0, 0}}; static constexpr Ngs2DefaultRow FIVE_SURROUND_RIGHT{0.5f, {0, 0}, {0, 0, 0, 0, 0, 1}, {0, 0, 0, 0, 0, 1, 0, 0}}; +static constexpr Ngs2DefaultRow BACK_CENTER{QUARTER_POWER, {QUARTER_POWER, QUARTER_POWER}, {0, 0, 0, 0, HALF_POWER, HALF_POWER}, {0, 0, 0, 0, 0, 0, HALF_POWER, HALF_POWER}}; static constexpr Ngs2DefaultRow SURROUND_LEFT{0.5f, {0.5f, 0}, {0, 0, 0, 0, 1, 0}, {0, 0, 0, 0, 1, 0, 0, 0}}; static constexpr Ngs2DefaultRow SURROUND_RIGHT{0.5f, {0, 0.5f}, {0, 0, 0, 0, 0, 1}, {0, 0, 0, 0, 0, 1, 0, 0}}; -static constexpr Ngs2DefaultRow BACK_CENTER{QUARTER_POWER, {QUARTER_POWER, QUARTER_POWER}, {0, 0, 0, 0, HALF_POWER, HALF_POWER}, {0, 0, 0, 0, 0, 0, HALF_POWER, HALF_POWER}}; static constexpr Ngs2DefaultRow BACK_LEFT{0.5f, {0.5f, 0}, {0, 0, 0, 0, 1, 0}, {0, 0, 0, 0, 0, 0, 1, 0}}; static constexpr Ngs2DefaultRow BACK_RIGHT{0.5f, {0, 0.5f}, {0, 0, 0, 0, 0, 1}, {0, 0, 0, 0, 0, 0, 0, 1}}; +static constexpr Ngs2DefaultRow SURROUND_LEFT_51{0.5f, {HALF_POWER, 0}, {0, 0, 0, 0, 1, 0}, {0, 0, 0, 0, 1, 0, 0, 0}}; +static constexpr Ngs2DefaultRow SURROUND_RIGHT_51{0.5f, {0, HALF_POWER}, {0, 0, 0, 0, 0, 1}, {0, 0, 0, 0, 0, 1, 0, 0}}; +static constexpr Ngs2DefaultRow SURROUND_LEFT_71{HALF_POWER, {HALF_POWER, 0}, {0, 0, 0, 0, 1, 0}, {0, 0, 0, 0, 1, 0, 0, 0}}; +static constexpr Ngs2DefaultRow SURROUND_RIGHT_71{HALF_POWER, {0, HALF_POWER}, {0, 0, 0, 0, 0, 1}, {0, 0, 0, 0, 0, 1, 0, 0}}; +static constexpr Ngs2DefaultRow BACK_LEFT_71{HALF_POWER, {HALF_POWER, 0}, {0, 0, 0, 0, 1, 0}, {0, 0, 0, 0, 0, 0, 1, 0}}; +static constexpr Ngs2DefaultRow BACK_RIGHT_71{HALF_POWER, {0, HALF_POWER}, {0, 0, 0, 0, 0, 1}, {0, 0, 0, 0, 0, 0, 0, 1}}; static constexpr Ngs2DefaultRow DEFAULT_MAP[NGS2_MAX_CHANNELS][NGS2_MAX_CHANNELS] = { {MONO_CENTER}, @@ -188,17 +200,15 @@ static constexpr Ngs2DefaultRow DEFAULT_MAP[NGS2_MAX_CHANNELS][NGS2_MAX_CHANNELS {FRONT_LEFT, FRONT_RIGHT, LFE}, {FRONT_LEFT, FRONT_RIGHT, QUAD_LEFT, QUAD_RIGHT}, {FRONT_LEFT, FRONT_RIGHT, MONO_CENTER, FIVE_SURROUND_LEFT, FIVE_SURROUND_RIGHT}, - {FRONT_LEFT, FRONT_RIGHT, MONO_CENTER, LFE, SURROUND_LEFT, SURROUND_RIGHT}, + {FRONT_LEFT, FRONT_RIGHT, MONO_CENTER, LFE, PS4_LIBRARY ? SURROUND_LEFT : SURROUND_LEFT_51, PS4_LIBRARY ? SURROUND_RIGHT : SURROUND_RIGHT_51}, {FRONT_LEFT, FRONT_RIGHT, MONO_CENTER, LFE, SURROUND_LEFT, SURROUND_RIGHT, BACK_CENTER}, - {FRONT_LEFT, FRONT_RIGHT, MONO_CENTER, LFE, SURROUND_LEFT, SURROUND_RIGHT, BACK_LEFT, BACK_RIGHT}, + {FRONT_LEFT, FRONT_RIGHT, MONO_CENTER, LFE, PS4_LIBRARY ? SURROUND_LEFT : SURROUND_LEFT_71, PS4_LIBRARY ? SURROUND_RIGHT : SURROUND_RIGHT_71, PS4_LIBRARY ? BACK_LEFT : BACK_LEFT_71, PS4_LIBRARY ? BACK_RIGHT : BACK_RIGHT_71}, }; -float Ngs2DefaultLevel(std::uint32_t sourceChannels, std::uint32_t source, std::uint32_t destChannels, std::uint32_t dest) { - if (sourceChannels > NGS2_MAX_CHANNELS || destChannels > NGS2_MAX_CHANNELS) { - throw std::runtime_error("NGS2: the default channel map from " + std::to_string(sourceChannels) + - " into " + std::to_string(destChannels) + " channels is not implemented"); - } - const auto& row = DEFAULT_MAP[sourceChannels - 1][source]; +static constexpr Ngs2DefaultRow FIXED_DOWNMIX_51[6] = {FRONT_LEFT, FRONT_RIGHT, MONO_CENTER, LFE, SURROUND_LEFT, SURROUND_RIGHT}; +static constexpr Ngs2DefaultRow FIXED_DOWNMIX_71[8] = {FRONT_LEFT, FRONT_RIGHT, MONO_CENTER, LFE, SURROUND_LEFT, SURROUND_RIGHT, BACK_LEFT, BACK_RIGHT}; + +static float RowLevel(const Ngs2DefaultRow& row, std::uint32_t destChannels, std::uint32_t dest) { switch (destChannels) { case 1: return row.mono; case 2: return row.stereo[dest]; @@ -208,6 +218,94 @@ float Ngs2DefaultLevel(std::uint32_t sourceChannels, std::uint32_t source, std:: } } +static void RequireMappedChannels(std::uint32_t sourceChannels, std::uint32_t destChannels) { + if (sourceChannels > NGS2_MAX_CHANNELS || destChannels > NGS2_MAX_CHANNELS) { + throw std::runtime_error("NGS2: the default channel map from " + std::to_string(sourceChannels) + + " into " + std::to_string(destChannels) + " channels is not implemented"); + } +} + +struct Ngs2MapTerm { + std::uint8_t dest; + std::uint8_t source; + float level; +}; + +struct Ngs2PairMap { + std::uint32_t sourceChannels; + std::uint32_t destChannelSet; + Ngs2MapTerm terms[8]; +}; + +template +static constexpr std::uint32_t ChannelSet(TCounts... counts) { + return ((1u << counts) | ...); +} + +static constexpr Ngs2PairMap ODD_COUNT_MAPS[] = { + {1, ChannelSet(3, 4), {{0, 0, HALF_POWER}, {1, 0, HALF_POWER}}}, + {1, ChannelSet(5, 7), {{2, 0, 1}}}, + {2, ChannelSet(3, 4, 5, 7), {{0, 0, 1}, {1, 1, 1}}}, + {3, ChannelSet(1), {{0, 0, HALF_POWER}, {0, 1, HALF_POWER}, {0, 2, 1}}}, + {3, ChannelSet(2, 3, 4), {{0, 0, 1}, {0, 2, HALF_POWER}, {1, 1, 1}, {1, 2, HALF_POWER}}}, + {3, ChannelSet(5, 6, 7, 8), {{0, 0, 1}, {1, 1, 1}, {2, 2, 1}}}, + {4, ChannelSet(1), {{0, 0, HALF_POWER}, {0, 1, HALF_POWER}, {0, 2, 0.5f}, {0, 3, 0.5f}}}, + {4, ChannelSet(2), {{0, 0, 1}, {0, 2, HALF_POWER}, {1, 1, 1}, {1, 3, HALF_POWER}}}, + {4, ChannelSet(3), {{0, 0, 1}, {1, 1, 1}, {2, 2, 1}}}, + {4, ChannelSet(4), {{0, 0, 1}, {1, 1, 1}, {2, 2, 1}, {3, 3, 1}}}, + {4, ChannelSet(5), {{0, 0, 1}, {1, 1, 1}, {4, 2, 1}}}, + {4, ChannelSet(6, 7, 8), {{0, 0, 1}, {1, 1, 1}, {4, 2, 1}, {5, 3, 1}}}, + {5, ChannelSet(1), {{0, 0, HALF_POWER}, {0, 1, HALF_POWER}, {0, 2, 1}, {0, 3, 0.5f}, {0, 4, 0.5f}}}, + {5, ChannelSet(2), {{0, 0, 1}, {0, 2, HALF_POWER}, {0, 3, HALF_POWER}, {1, 1, 1}, {1, 2, HALF_POWER}, {1, 4, HALF_POWER}}}, + {5, ChannelSet(3), {{0, 0, 1}, {0, 2, HALF_POWER}, {1, 1, 1}, {1, 2, HALF_POWER}, {2, 3, 1}}}, + {5, ChannelSet(4), {{0, 0, 1}, {0, 2, HALF_POWER}, {1, 1, 1}, {1, 2, HALF_POWER}, {2, 3, 1}, {3, 4, 1}}}, + {5, ChannelSet(5), {{0, 0, 1}, {1, 1, 1}, {2, 2, 1}, {4, 3, 1}}}, + {5, ChannelSet(6, 7, 8), {{0, 0, 1}, {1, 1, 1}, {2, 2, 1}, {4, 3, 1}, {5, 4, 1}}}, + {6, ChannelSet(3), {{0, 0, 1}, {0, 2, HALF_POWER}, {1, 1, 1}, {1, 2, HALF_POWER}, {2, 4, 1}}}, + {6, ChannelSet(4), {{0, 0, 1}, {0, 2, HALF_POWER}, {1, 1, 1}, {1, 2, HALF_POWER}, {2, 4, 1}, {3, 5, 1}}}, + {6, ChannelSet(5), {{0, 0, 1}, {1, 1, 1}, {2, 2, 1}, {3, 3, 1}, {4, 4, 1}}}, + {6, ChannelSet(7), {{0, 0, 1}, {1, 1, 1}, {2, 2, 1}, {3, 3, 1}, {4, 4, 1}, {5, 5, 1}}}, + {7, ChannelSet(1), {{0, 0, HALF_POWER}, {0, 1, HALF_POWER}, {0, 2, 1}, {0, 4, 0.5f}, {0, 5, 0.5f}, {0, 6, QUARTER_POWER}}}, + {7, ChannelSet(2), {{0, 0, 1}, {0, 2, HALF_POWER}, {0, 4, HALF_POWER}, {0, 6, 0.5f}, {1, 1, 1}, {1, 2, HALF_POWER}, {1, 5, HALF_POWER}, {1, 6, 0.5f}}}, + {7, ChannelSet(3), {{0, 0, 1}, {0, 2, HALF_POWER}, {1, 1, 1}, {1, 2, HALF_POWER}, {2, 4, 1}, {2, 6, HALF_POWER}}}, + {7, ChannelSet(4), {{0, 0, 1}, {0, 2, HALF_POWER}, {1, 1, 1}, {1, 2, HALF_POWER}, {2, 4, 1}, {2, 6, HALF_POWER}, {3, 5, 1}, {3, 6, HALF_POWER}}}, + {7, ChannelSet(5), {{0, 0, 1}, {1, 1, 1}, {2, 2, 1}, {3, 3, 1}, {4, 4, 1}, {4, 6, HALF_POWER}}}, + {7, ChannelSet(6), {{0, 0, 1}, {1, 1, 1}, {2, 2, 1}, {3, 3, 1}, {4, 4, 1}, {4, 6, HALF_POWER}, {5, 5, 1}, {5, 6, HALF_POWER}}}, + {7, ChannelSet(7), {{0, 0, 1}, {1, 1, 1}, {2, 2, 1}, {3, 3, 1}, {4, 4, 1}, {5, 5, 1}, {6, 6, HALF_POWER}}}, + {7, ChannelSet(8), {{0, 0, 1}, {1, 1, 1}, {2, 2, 1}, {3, 3, 1}, {4, 4, 1}, {5, 5, 1}, {6, 6, HALF_POWER}, {7, 6, HALF_POWER}}}, + {8, ChannelSet(3), {{0, 0, 1}, {1, 1, 1}, {2, 4, 1}, {2, 6, 1}}}, + {8, ChannelSet(4), {{0, 0, 1}, {1, 1, 1}, {2, 4, 1}, {2, 6, 1}, {3, 5, 1}, {3, 7, 1}}}, + {8, ChannelSet(5), {{0, 0, 1}, {1, 1, 1}, {2, 2, 1}, {3, 3, 1}, {4, 4, 1}, {4, 6, 1}}}, + {8, ChannelSet(7), {{0, 0, 1}, {1, 1, 1}, {2, 2, 1}, {3, 3, 1}, {4, 4, 1}, {5, 5, 1}, {6, 6, 1}}}, +}; + +static bool HasDefaultMap(std::uint32_t channels) { + return channels == 1 || channels == 2 || channels == 6 || channels == 8; +} + +static float OddCountLevel(std::uint32_t sourceChannels, std::uint32_t source, std::uint32_t destChannels, std::uint32_t dest) { + for (const auto& map : ODD_COUNT_MAPS) { + if (map.sourceChannels != sourceChannels || (map.destChannelSet & ChannelSet(destChannels)) == 0) continue; + for (const auto& term : map.terms) { + if (term.dest == dest && term.source == source) return term.level; + } + return 0.0f; + } + throw std::runtime_error("NGS2: the default channel map from " + std::to_string(sourceChannels) + " into " + std::to_string(destChannels) + " channels is not implemented"); +} + +float Ngs2DefaultLevel(std::uint32_t sourceChannels, std::uint32_t source, std::uint32_t destChannels, std::uint32_t dest) { + RequireMappedChannels(sourceChannels, destChannels); + if (!PS4_LIBRARY && (!HasDefaultMap(sourceChannels) || !HasDefaultMap(destChannels))) return OddCountLevel(sourceChannels, source, destChannels, dest); + return RowLevel(DEFAULT_MAP[sourceChannels - 1][source], destChannels, dest); +} + +float Ngs2FixedDownmixLevel(std::uint32_t sourceChannels, std::uint32_t source, std::uint32_t destChannels, std::uint32_t dest) { + RequireMappedChannels(sourceChannels, destChannels); + const auto* rows = sourceChannels == 6 ? FIXED_DOWNMIX_51 : sourceChannels == 8 ? FIXED_DOWNMIX_71 : DEFAULT_MAP[sourceChannels - 1]; + return RowLevel(rows[source], destChannels, dest); +} + void Ngs2PrepareControlMix(Ngs2Voice& voice) { for (auto& port : voice.ports) port.rampFrom.clear(); const bool changed = std::any_of(voice.pendingControls.begin(), voice.pendingControls.end(), [](const auto& control) { @@ -458,8 +556,15 @@ static std::size_t SampleBytes(std::uint32_t waveformType) { throw std::runtime_error("NGS2: render waveform type " + Ngs2Hex(waveformType) + " is not implemented"); } -static bool IsStereoIntoSurround(const Ngs2Voice& voice, const Ngs2RenderBufferInfo& output) { - return voice.channels == 2 && (output.num_channels == 6 || output.num_channels == 8); +static bool HasMasteringMap(std::uint32_t channels, std::uint32_t outputChannels) { + if (PS4_LIBRARY) return channels == 2 && (outputChannels == 6 || outputChannels == 8); + return HasDefaultMap(channels) && HasDefaultMap(outputChannels); +} + +static float MasteringOutputLevel(std::uint32_t channels, std::uint32_t channel, std::uint32_t outputChannels, std::uint32_t dest) { + if (channels == outputChannels) return PS4_LIBRARY || HasDefaultMap(channels) ? static_cast(channel == dest) : OddCountLevel(channels, channel, channels, dest); + if (channels == 1) return dest == 0 ? 1.0f : 0.0f; + return Ngs2DefaultLevel(channels, channel, outputChannels, dest); } static std::vector& OutputMix(std::vector>& mixes, const Ngs2RenderBufferInfo* bufferInfo, std::uint32_t numBufferInfo, @@ -467,7 +572,7 @@ static std::vector& OutputMix(std::vector>& mixes, con if (voice.outputId >= numBufferInfo) throw std::invalid_argument("NGS2: mastering output " + std::to_string(voice.outputId) + " has no render buffer"); const auto& output = bufferInfo[voice.outputId]; const auto sampleBytes = SampleBytes(output.waveform_type); - if (output.num_channels != voice.channels && !IsStereoIntoSurround(voice, output)) throw std::runtime_error("NGS2: mixing " + std::to_string(voice.channels) + " mastering channels into " + std::to_string(output.num_channels) + " is not implemented"); + if (output.num_channels != voice.channels && !HasMasteringMap(voice.channels, output.num_channels)) throw std::runtime_error("NGS2: mixing " + std::to_string(voice.channels) + " mastering channels into " + std::to_string(output.num_channels) + " is not implemented"); if (output.buffer == nullptr || output.buffer_size < static_cast(grain) * output.num_channels * sampleBytes) { throw std::invalid_argument("NGS2: render buffer " + std::to_string(voice.outputId) + " is missing or too small"); } @@ -483,8 +588,8 @@ static void WriteOutput(const Ngs2RenderBufferInfo& output, const std::vector(output.buffer); for (std::size_t i = 0; i < mix.size(); i++) { - if (!std::isfinite(mix[i])) throw std::runtime_error("NGS2: integer rendering of nonfinite samples is not implemented"); - pcm[i] = static_cast(std::min(std::lrint(std::clamp(mix[i], -1.0f, 1.0f) * 32768.0f), 32767L)); + const float scaled = mix[i] * 32767.0f; + pcm[i] = std::isnan(scaled) ? 0 : static_cast(std::clamp(scaled, -32767.0f, 32767.0f)); } } @@ -540,7 +645,11 @@ void Ngs2RenderSystem(Ngs2System& system, const Ngs2RenderBufferInfo* bufferInfo for (std::uint32_t channel = 0; channel < voice->channels; channel++) { const bool lfe = channel == 3 && (voice->channels == 6 || voice->channels == 8); const float level = lfe ? voice->lfeLevel : voice->fbwLevel; - for (std::uint32_t i = 0; i < grain; i++) mix[i * outputChannels + channel] += voice->samples[channel * grain + i] * level; + for (std::uint32_t dest = 0; dest < outputChannels; dest++) { + const float map = MasteringOutputLevel(voice->channels, channel, outputChannels, dest); + if (map == 0.0f) continue; + for (std::uint32_t i = 0; i < grain; i++) mix[i * outputChannels + dest] += voice->samples[channel * grain + i] * level * map; + } } } for (std::uint32_t i = 0; i < numBufferInfo; i++) { diff --git a/core/libs/prx/libSceNgs2.native/src/Reverb.cpp b/core/libs/prx/libSceNgs2.native/src/Reverb.cpp index ab3849fbdd..4946f8de9a 100644 --- a/core/libs/prx/libSceNgs2.native/src/Reverb.cpp +++ b/core/libs/prx/libSceNgs2.native/src/Reverb.cpp @@ -301,7 +301,7 @@ bool Ngs2ProcessReverb(Ngs2Voice& voice, std::uint32_t grain, std::uint32_t samp mapped.assign(static_cast(grain) * channels, 0.0f); for (std::uint32_t dst = 0; dst < channels; dst++) { for (std::uint32_t src = 0; src < inputChannels; src++) { - const float level = Ngs2DefaultLevel(inputChannels, src, channels, dst); + const float level = Ngs2FixedDownmixLevel(inputChannels, src, channels, dst); if (level == 0.0f) continue; for (std::uint32_t i = 0; i < grain; i++) mapped[static_cast(dst) * grain + i] += input[static_cast(src) * grain + i] * level; } diff --git a/core/libs/prx/libSceNgs2.native/src/System.cpp b/core/libs/prx/libSceNgs2.native/src/System.cpp index 4b7acdf62c..b1141fa2fc 100644 --- a/core/libs/prx/libSceNgs2.native/src/System.cpp +++ b/core/libs/prx/libSceNgs2.native/src/System.cpp @@ -17,8 +17,11 @@ #include #include "prx/libc/include/General.hpp" +#include "prx/libSceNgs2/include/Api.hpp" #include "Ngs2Internal.hpp" +using Ngs2ParseReadHandler = std::int32_t (APS5_VABI *)(std::uintptr_t user_data, std::uint32_t offset, void* data, std::size_t size); + static std::vector& Systems() { static auto* const systems = new std::vector(); return *systems; @@ -613,6 +616,62 @@ int APS5_VABI sceNgs2ReportUnregisterHandler(Ngs2Handle report_handle) { return SCE_NGS2_OK; } +int APS5_VABI sceNgs2SystemEnumHandles(uintptr_t* out_handles, uint32_t max_handles) { + constexpr int invalid_argument = static_cast(0x804A0053); + if (max_handles != 0 && out_handles == nullptr) return invalid_argument; + const Ngs2Lock lock; + uint32_t count = 0; + for (const auto* system : Systems()) { + if (out_handles != nullptr && count < max_handles) out_handles[count] = reinterpret_cast(system); + ++count; + } + return static_cast(count); +} + +int APS5_VABI sceNgs2SystemEnumRackHandles(uintptr_t system_handle, uintptr_t* out_handles, uint32_t max_handles) { + constexpr int invalid_argument = static_cast(0x804A0053); + constexpr int invalid_system_handle = static_cast(0x804A0230); + if (max_handles != 0 && out_handles == nullptr) return invalid_argument; + const Ngs2Lock lock; + const auto* system = Ngs2FindSystem(system_handle); + if (system == nullptr) return invalid_system_handle; + uint32_t count = 0; + for (const auto* rack : system->racks) { + if (out_handles != nullptr && count < max_handles) out_handles[count] = reinterpret_cast(rack); + ++count; + } + return static_cast(count); +} + +int APS5_VABI sceNgs2FftQuerySize(std::uint32_t length, std::uint32_t flags, std::uint64_t* size) { + static constexpr std::uint32_t samples[] = {64, 128, 256, 512, 1024}; + if (size == nullptr || length < 8 || length > 12) return -1; + std::uint32_t count = samples[length - 8]; + if ((flags & 2) != 0) count /= 2; + *size = static_cast(count) * 2 * 16 + 64; + return 0; +} + +int APS5_VABI sceNgs2ParseWaveformUser(std::uintptr_t handler, std::uintptr_t user_data, Ngs2WaveformInfo* out_info) { + constexpr int invalid_out_address = static_cast(0x804A0053); + constexpr int invalid_handler = static_cast(0x804A0408); + constexpr std::uint64_t max_waveform_bytes = 256ull * 1024 * 1024; + if (out_info == nullptr) return invalid_out_address; + if (handler == 0) return invalid_handler; + const auto read = reinterpret_cast(handler); + std::uint8_t header[12] = {}; + if (read(user_data, 0, header, sizeof(header)) < 0) return invalid_handler; + if (std::memcmp(header, "RIFF", 4) != 0 || std::memcmp(header + 8, "WAVE", 4) != 0) + return SCE_NGS2_ERROR_UNKNOWN_WAVEFORM_FORMAT; + const std::uint32_t riff_size = static_cast(header[4]) | static_cast(header[5]) << 8 | + static_cast(header[6]) << 16 | static_cast(header[7]) << 24; + const std::uint64_t riff_end = 8ull + riff_size; + if (riff_end < 12 || riff_end > max_waveform_bytes) return SCE_NGS2_ERROR_INVALID_WAVEFORM_DATA; + std::vector bytes(static_cast(riff_end)); + if (read(user_data, 0, bytes.data(), bytes.size()) < 0) return invalid_handler; + return sceNgs2ParseWaveformData(bytes.data(), bytes.size(), out_info); +} + } #pragma GCC visibility pop diff --git a/core/libs/prx/libSceNgs2.native/src/Voice.cpp b/core/libs/prx/libSceNgs2.native/src/Voice.cpp index d92cfb628a..21e60462aa 100644 --- a/core/libs/prx/libSceNgs2.native/src/Voice.cpp +++ b/core/libs/prx/libSceNgs2.native/src/Voice.cpp @@ -16,6 +16,8 @@ static constexpr std::uint32_t COMMAND_EVENT = 2; static constexpr std::uint32_t COMMAND_MATRIX_LEVELS = 5; static constexpr std::uint32_t COMMAND_PORT_VOLUME = 6; static constexpr std::uint32_t COMMAND_PORT_MATRIX = 7; +static constexpr float MAX_PORT_VOLUME = 32.0f; +static constexpr std::size_t DEFAULT_MAX_PORTS = 8; static constexpr std::uint8_t COMMAND_TYPE_FLOAT = 1; static constexpr std::uint8_t COMMAND_TYPE_INT = 3; static constexpr std::uint8_t COMMAND_TYPE_FLOAT_ARRAY = 0x11; @@ -523,8 +525,9 @@ static Ngs2PendingControl CaptureParamControl(Ngs2Voice& voice, const Ngs2VoiceP return event; } if (param.id == SCE_NGS2_VOICE_PARAM_PORT_VOLUME) { - const auto value = ParamAs(param); + auto value = ParamAs(param); PortAt(voice, value.port); + value.level = std::clamp(value.level, 0.0f, MAX_PORT_VOLUME); return value; } if (param.id == SCE_NGS2_VOICE_PARAM_PORT_MATRIX) { @@ -617,9 +620,9 @@ static Ngs2PendingControl CaptureCommandControl(Ngs2Voice& voice, const Ngs2Voic ValidateDeferredEvent(voice, command.value.u); return command.value.u; } - if (id == COMMAND_PORT_VOLUME && command.type == COMMAND_TYPE_FLOAT) { + if (id == COMMAND_PORT_VOLUME) { PortAt(voice, index); - return Ngs2VoicePortVolumeParam{{}, index, command.value.f}; + return Ngs2VoicePortVolumeParam{{}, index, std::clamp(command.value.f, 0.0f, MAX_PORT_VOLUME)}; } if (id == COMMAND_PORT_MATRIX && command.type == COMMAND_TYPE_INT) { PortAt(voice, index); @@ -755,7 +758,7 @@ static void ApplyCommonParam(Ngs2Voice& voice, const Ngs2VoiceParamHeader& param } case SCE_NGS2_VOICE_PARAM_PORT_VOLUME: { const auto& volume = ParamAs(param); - PortAt(voice, volume.port).volume = volume.level; + PortAt(voice, volume.port).volume = std::clamp(volume.level, 0.0f, MAX_PORT_VOLUME); break; } case SCE_NGS2_VOICE_PARAM_PORT_MATRIX: { @@ -1088,6 +1091,9 @@ int APS5_VABI sceNgs2VoiceRunCommands(uintptr_t voice_handle, const Ngs2VoiceCom if (voice.rack->system == nullptr && !voice.pendingControls.empty()) voice.ApplyPendingControls(); try { if (commands == nullptr && num_commands != 0) APS5_INVALID_ARG_EX; + const auto isVolume = [](const Ngs2VoiceCommand& command) { return (command.id & 0xffffff) == COMMAND_PORT_VOLUME; }; + const auto badPort = [&](const Ngs2VoiceCommand& command) { return isVolume(command) && (command.id >> 24) >= voice.ports.size(); }; + if (voice.ports.size() == DEFAULT_MAX_PORTS && std::any_of(commands, commands + num_commands, badPort) && std::all_of(commands, commands + num_commands, isVolume)) return SCE_NGS2_ERROR_INVALID_VOICE_OUTPUT_INDEX; if (DeferringControls(voice)) { if (num_commands > voice.pendingControls.max_size() - voice.pendingControls.size()) throw std::length_error("NGS2: too many buffered voice commands"); std::vector captured; @@ -1110,9 +1116,9 @@ int APS5_VABI sceNgs2VoiceRunCommands(uintptr_t voice_handle, const Ngs2VoiceCom : id == COMMAND_PORT_VOLUME ? COMMAND_TYPE_FLOAT : id == COMMAND_PORT_MATRIX ? COMMAND_TYPE_INT : 0; if (expectedType == 0) throw std::runtime_error("NGS2: voice command " + Ngs2Hex(command.id) + " is not implemented"); - if (command.type != expectedType) throw std::invalid_argument("NGS2: voice command " + Ngs2Hex(command.id) + " has value type " + Ngs2Hex(command.type)); + if (id != COMMAND_PORT_VOLUME && command.type != expectedType) throw std::invalid_argument("NGS2: voice command " + Ngs2Hex(command.id) + " has value type " + Ngs2Hex(command.type)); if (id == COMMAND_MATRIX_LEVELS) SetMatrixLevels(voice, index, command.value.levels, command.count); - else if (id == COMMAND_PORT_VOLUME) PortAt(voice, index).volume = command.value.f; + else if (id == COMMAND_PORT_VOLUME) PortAt(voice, index).volume = std::clamp(command.value.f, 0.0f, MAX_PORT_VOLUME); else SetPortMatrix(voice, index, command.value.i); } } catch (const Ngs2ReturnCode& result) { diff --git a/core/libs/prx/libSceNgs2.native/tests/Ngs2Gain.cpp b/core/libs/prx/libSceNgs2.native/tests/Ngs2Gain.cpp index 1240bb4e85..0ea112814a 100644 --- a/core/libs/prx/libSceNgs2.native/tests/Ngs2Gain.cpp +++ b/core/libs/prx/libSceNgs2.native/tests/Ngs2Gain.cpp @@ -218,7 +218,7 @@ static void TestIntegerOutput() { std::array out{}; const Ngs2RenderBufferInfo info{out.data(), sizeof(out), SCE_NGS2_WAVEFORM_TYPE_PCM_I16L, 1}; Require(sceNgs2SystemRender(graph.system, &info, 1) == SCE_NGS2_OK); - for (const auto sample : out) Require(sample == (gain > 0.0f ? 16384 : -16384)); + for (const auto sample : out) Require(sample == (gain > 0.0f ? 16383 : -16383)); } } diff --git a/core/libs/prx/libSceNgs2.native/tests/Ngs2HandleErrors.cpp b/core/libs/prx/libSceNgs2.native/tests/Ngs2HandleErrors.cpp index bea3a96124..e0000ba149 100644 --- a/core/libs/prx/libSceNgs2.native/tests/Ngs2HandleErrors.cpp +++ b/core/libs/prx/libSceNgs2.native/tests/Ngs2HandleErrors.cpp @@ -401,6 +401,38 @@ static void CheckSetSampleRate() { Status(sceNgs2SystemDestroy(system, nullptr), SCE_NGS2_OK, "system destroy failed"); } +static void CheckFftQuerySize() { + std::uint64_t size = 0; + Require(sceNgs2FftQuerySize(8, 0, &size) == 0 && size == 2112); + Require(sceNgs2FftQuerySize(8, 2, &size) == 0 && size == 1088); + Require(sceNgs2FftQuerySize(9, 0, &size) == 0 && size == 4160); + Require(sceNgs2FftQuerySize(12, 2, &size) == 0 && size == 16448); + Require(sceNgs2FftQuerySize(7, 0, &size) == -1); + Require(sceNgs2FftQuerySize(13, 0, &size) == -1); + Require(sceNgs2FftQuerySize(8, 0, nullptr) == -1); +} + +static void CheckEnumeration() { + constexpr int invalidArgument = static_cast(0x804A0053u); + constexpr int invalidSystem = static_cast(0x804A0230u); + uintptr_t handles[8] = {}; + Require(sceNgs2SystemEnumHandles(nullptr, 0) >= 0); + Require(sceNgs2SystemEnumHandles(nullptr, 1) == invalidArgument); + const auto system = CreateSystem(); + const auto rack = CreateRack(system, SCE_NGS2_RACK_ID_REVERB); + const int systems = sceNgs2SystemEnumHandles(handles, 8); + Require(systems >= 1); + bool found = false; + for (int i = 0; i < systems && i < 8; ++i) found = found || handles[i] == system; + Require(found); + Require(sceNgs2SystemEnumHandles(nullptr, 0) == systems); + Require(sceNgs2SystemEnumRackHandles(system, nullptr, 1) == invalidArgument); + Require(sceNgs2SystemEnumRackHandles(0x1234, handles, 8) == invalidSystem); + const int racks = sceNgs2SystemEnumRackHandles(system, handles, 8); + Require(racks == 1 && handles[0] == rack); + Require(sceNgs2SystemDestroy(system, nullptr) == SCE_NGS2_OK); +} + int main() { try { constexpr int systemError = static_cast(0x804A8201u); @@ -441,6 +473,8 @@ int main() { CheckResetScheduler(); CheckSetGrainSamples(); CheckSetSampleRate(); + CheckFftQuerySize(); + CheckEnumeration(); CheckExportLinked(); std::cout << "NGS2 PS5 handle errors and validation precedence checked\n"; return 0; diff --git a/core/libs/prx/libSceNgs2.native/tests/Ngs2JobBuffer.cpp b/core/libs/prx/libSceNgs2.native/tests/Ngs2JobBuffer.cpp index 55a7d8b4ce..577a5b00a1 100644 --- a/core/libs/prx/libSceNgs2.native/tests/Ngs2JobBuffer.cpp +++ b/core/libs/prx/libSceNgs2.native/tests/Ngs2JobBuffer.cpp @@ -5,10 +5,11 @@ #include #include #include +#include #include #include -enum class Update { Play, Start, Pause, Kill, Volume, Matrix, Combined, Pitch, Gain, PlayStop, StopPlay, PauseResume, KillPlay, PlayKill, PlayPause, StopResume, LongPause, Mute, SelectMatrix, Shift, ExternalShift, UnchangedShift }; +enum class Update { Play, Start, Pause, Kill, Volume, Matrix, Combined, Pitch, Gain, PlayStop, StopPlay, PauseResume, KillPlay, PlayKill, PlayPause, StopResume, LongPause, Mute, SelectMatrix, Over, Shift, ExternalShift, UnchangedShift }; struct BufferedState { std::uintptr_t voice; std::uintptr_t master; @@ -74,6 +75,35 @@ static int APS5_VABI UpdatePeer(Ngs2UserFxProcessContext* context) { Require(std::all_of(unused, end, [](auto byte) { return byte == 0xa5; })); break; } + case Update::Over: { + const auto volume = [&] { + Ngs2VoicePortInfo info{}; + Require(sceNgs2VoiceGetPortInfo(state.voice, 0, &info, sizeof(info)) == SCE_NGS2_OK); + return info.volume; + }; + const auto send = [&](float level, std::uint8_t type) { + if (!state.commands) return CommonControl(state, SCE_NGS2_VOICE_PARAM_PORT_VOLUME, level); + Ngs2VoiceCommand command{}; + command.id = 6; + command.type = type; + command.count = 1; + command.value.f = level; + Require(sceNgs2VoiceRunCommands(state.voice, &command, 1) == SCE_NGS2_OK); + }; + if (state.commands) { + send(2.0f, 3); + Require(volume() == 2.0f); + } + send(-1.0f, 1); + Require(std::bit_cast(volume()) == 0); + send(std::bit_cast(0x7fc00000u), 1); + Require(std::bit_cast(volume()) == 0x7fc00000u); + send(-0.0f, 1); + Require(std::bit_cast(volume()) == 0x80000000u); + send(33.0f, 1); + Require(volume() == 32.0f); + break; + } case Update::Shift: Control(state.voice, SCE_NGS2_CUSTOM_VOICE_PARAM_PITCH_SHIFT | 0x20, Ngs2CustomVoicePitchShiftParam{{}, -1200, 0, 0, 0}); break; @@ -206,6 +236,10 @@ static void TestBuffer(Update update, bool custom, bool commands, unsigned order } if (captured) captured->insert(captured->end(), samples.begin(), samples.begin() + grainFrames); for (unsigned i = 0; !shift && i < grainFrames; ++i) { + if (update == Update::Over) { + if (grain != 1) Require(samples[i] == (grain == 0 && i < 3 ? 0.0f : 1000.0f / 32768.0f) * (grain == 0 ? 1.0f : 32.0f)); + continue; + } float expected = 1000.0f / 32768.0f; const bool restarting = grain == 0 || (restart && grain == 1); if (restarting && i < 3) expected = 0; @@ -683,6 +717,10 @@ int main(int argc, char** argv) { } } TestBuffer(Update::Combined, true, true, 2, 256); + for (bool custom : {false, true}) for (bool commands : {false, true}) for (unsigned order = 0; order < 3; ++order) { + TestBuffer(Update::Over, custom, commands, order, 64); + cases++; + } std::vector worker, external, unchanged; TestBuffer(Update::Shift, true, false, 2, 256, &worker); TestBuffer(Update::ExternalShift, true, false, 2, 256, &external); diff --git a/core/libs/prx/libSceNgs2.native/tests/Ngs2Parse.cpp b/core/libs/prx/libSceNgs2.native/tests/Ngs2Parse.cpp index a818d0cf83..6e7e2d2694 100644 --- a/core/libs/prx/libSceNgs2.native/tests/Ngs2Parse.cpp +++ b/core/libs/prx/libSceNgs2.native/tests/Ngs2Parse.cpp @@ -241,8 +241,36 @@ static void TestFrameInfoErrors() { } } +static std::int32_t APS5_VABI ReadUserWaveform(std::uintptr_t user_data, std::uint32_t offset, void* data, std::size_t size) { + const auto& file = *reinterpret_cast*>(user_data); + if (offset > file.size() || size > file.size() - offset) return -1; + std::memcpy(data, file.data() + offset, size); + return static_cast(size); +} + +static void TestParseUser() { + const auto file = PcmFile(2, 44100, 16, 100); + Ngs2WaveformInfo expected{}; + Ngs2WaveformInfo actual{}; + Require(sceNgs2ParseWaveformData(file.data(), file.size(), &expected) == SCE_NGS2_OK); + Require(sceNgs2ParseWaveformUser(reinterpret_cast(&ReadUserWaveform), reinterpret_cast(&file), &actual) == SCE_NGS2_OK); + Require(std::memcmp(&expected, &actual, sizeof(expected)) == 0); + Require(sceNgs2ParseWaveformUser(0, 0, &actual) == static_cast(0x804A0408u)); + Require(sceNgs2ParseWaveformUser(reinterpret_cast(&ReadUserWaveform), reinterpret_cast(&file), nullptr) == + static_cast(0x804A0053u)); + auto bad = file; + bad[0] = 'X'; + Require(sceNgs2ParseWaveformUser(reinterpret_cast(&ReadUserWaveform), reinterpret_cast(&bad), &actual) == + SCE_NGS2_ERROR_UNKNOWN_WAVEFORM_FORMAT); + auto truncated = file; + truncated.resize(16); + Require(sceNgs2ParseWaveformUser(reinterpret_cast(&ReadUserWaveform), reinterpret_cast(&truncated), &actual) == + static_cast(0x804A0408u)); +} + int main() { TestParsePcm(); + TestParseUser(); TestParseUnknownFormats(); TestParseFile(); TestParseFileBank(); diff --git a/core/libs/prx/libSceNgs2.native/tests/Ngs2Render.cpp b/core/libs/prx/libSceNgs2.native/tests/Ngs2Render.cpp index 0b7566582c..34d94907fb 100644 --- a/core/libs/prx/libSceNgs2.native/tests/Ngs2Render.cpp +++ b/core/libs/prx/libSceNgs2.native/tests/Ngs2Render.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -15,6 +16,7 @@ #include #include #include +#include #include static uintptr_t Sampler(uintptr_t system, const std::vector& pcm, std::uint32_t repeats, uintptr_t* rack = nullptr) { @@ -40,6 +42,14 @@ static std::vector RenderI16(uintptr_t system, std::uint32_t grain return out; } +static std::int16_t TowardZero(std::int16_t sample) { + return static_cast(sample > 0 ? sample - 1 : sample < 0 ? sample + 1 : 0); +} + +static std::int16_t Ps5I16(float sample) { + return static_cast(std::clamp(sample * 32767.0f, -32767.0f, 32767.0f)); +} + static void TestErrorsAndInfo() { Ngs2SystemOption option{}; Require(sceNgs2SystemResetOption(&option) == SCE_NGS2_OK); @@ -137,7 +147,7 @@ static void TestPcmBlockEnd() { callbackFlags.clear(); auto out = RenderI16(system); - for (std::uint32_t i = 0; i < Grain; i++) Require(out[i] == (i < 3 ? 0 : pcm[i - 3])); + for (std::uint32_t i = 0; i < Grain; i++) Require(out[i] == (i < 3 ? 0 : TowardZero(pcm[i - 3]))); Require(Flags(sampler) == (SCE_NGS2_VOICE_STATE_FLAG_INUSE | SCE_NGS2_VOICE_STATE_FLAG_PLAYING) && callbackFlags.empty()); Ngs2SamplerVoiceState state{}; @@ -147,7 +157,7 @@ static void TestPcmBlockEnd() { Require(state.waveform_data == pcm.data() + Grain); out = RenderI16(system); - for (std::uint32_t i = 0; i < Grain; i++) Require(out[i] == (Grain + i - 3 < pcm.size() ? pcm[Grain + i - 3] : 0)); + for (std::uint32_t i = 0; i < Grain; i++) Require(out[i] == (Grain + i - 3 < pcm.size() ? TowardZero(pcm[Grain + i - 3]) : 0)); Require(callbackFlags.size() == 1 && callbackFlags[0] == SCE_NGS2_VOICE_CALLBACK_FLAG_BLOCK_END); Require(Flags(sampler) == 0); Require(sceNgs2VoiceGetState(sampler, &state.voice_state, sizeof(state)) == SCE_NGS2_OK); @@ -172,7 +182,7 @@ static void TestPatchToRackHandle() { Require(port.dest_handle == master && port.dest_input_id == 0); Event(sampler, SCE_NGS2_VOICE_EVENT_PLAY); const auto out = RenderI16(system); - for (std::uint32_t i = 0; i < Grain; ++i) Require(out[i] == (i < 3 ? 0 : pcm[i - 3])); + for (std::uint32_t i = 0; i < Grain; ++i) Require(out[i] == (i < 3 ? 0 : TowardZero(pcm[i - 3]))); Require(sceNgs2SystemDestroy(system, nullptr) == SCE_NGS2_OK); } @@ -381,9 +391,9 @@ static void TestPitchAndRepeat() { Event(sampler, SCE_NGS2_VOICE_EVENT_PLAY); callbackFlags.clear(); - const std::int16_t expected[] = {0, 0, 0, 0, 0, -30, 0, 470, - 1000, 1500, 2000, 2621, 3000, 1500, 0, 379, - 1000, 1500, 2000, 2621, 3000, 1530, 0, -91}; + const std::int16_t expected[] = {0, 0, 0, 0, 0, -30, 0, 469, + 999, 1499, 1999, 2621, 2999, 1499, 0, 378, + 999, 1499, 1999, 2621, 2999, 1530, 0, -90}; auto out = RenderI16(system); for (std::uint32_t i = 0; i < Grain; ++i) Require(out[i] == (i < std::size(expected) ? expected[i] : 0)); Require(callbackFlags == (std::vector{SCE_NGS2_VOICE_CALLBACK_FLAG_BLOCK_REPEAT, SCE_NGS2_VOICE_CALLBACK_FLAG_BLOCK_END})); @@ -407,7 +417,7 @@ static void TestSetupClearsCallback() { callbackFlags.clear(); auto out = RenderI16(system); - for (std::uint32_t i = 0; i < Grain; i++) Require(out[i] == (i >= 3 && i - 3 < pcm.size() ? pcm[i - 3] : 0)); + for (std::uint32_t i = 0; i < Grain; i++) Require(out[i] == (i >= 3 && i - 3 < pcm.size() ? TowardZero(pcm[i - 3]) : 0)); Require(callbackFlags.empty() && Flags(sampler) == 0); Control(sampler, SCE_NGS2_SAMPLER_VOICE_PARAM_SETUP, Ngs2SamplerVoiceSetupParam{{}, {SCE_NGS2_WAVEFORM_TYPE_PCM_I16L, 1, 48000, 0, 0, 0}}); @@ -417,7 +427,7 @@ static void TestSetupClearsCallback() { Control(sampler, SCE_NGS2_SAMPLER_VOICE_PARAM_ADD_WAVEFORM_BLOCKS, Ngs2SamplerVoiceWaveformBlocksParam{{}, pcm.data(), 0, 1, &stream}); Event(sampler, SCE_NGS2_VOICE_EVENT_PLAY); out = RenderI16(system); - for (std::uint32_t i = 0; i < Grain; i++) Require(out[i] == (i >= 3 && i - 3 < pcm.size() ? pcm[i - 3] : 0)); + for (std::uint32_t i = 0; i < Grain; i++) Require(out[i] == (i >= 3 && i - 3 < pcm.size() ? TowardZero(pcm[i - 3]) : 0)); Require(callbackFlags.size() == 1 && callbackFlags[0] == SCE_NGS2_VOICE_CALLBACK_FLAG_BLOCK_END); Require(sceNgs2SystemDestroy(system, nullptr) == SCE_NGS2_OK); } @@ -457,10 +467,10 @@ static void TestPcmCallbackReset() { Ngs2SamplerVoiceState state{}; Require(sceNgs2VoiceGetState(sampler, &state.voice_state, sizeof(state)) == SCE_NGS2_OK); Require(state.num_decoded_samples == 0 && state.decoded_data_size == 0 && state.waveform_data == nullptr); - for (std::uint32_t frame = 0; frame < Grain; ++frame) Require(first[frame] == (flag == SCE_NGS2_VOICE_CALLBACK_FLAG_BLOCK_REPEAT && frame == 2 ? 16384 : 0)); + for (std::uint32_t frame = 0; frame < Grain; ++frame) Require(first[frame] == (flag == SCE_NGS2_VOICE_CALLBACK_FLAG_BLOCK_REPEAT && frame == 2 ? 16383 : 0)); Event(sampler, SCE_NGS2_VOICE_EVENT_PLAY); const auto second = RenderI16(system); - for (std::uint32_t frame = 0; frame < Grain; ++frame) Require(second[frame] == (frame < 2 ? 0 : callback.pcm[frame * 2 - 3])); + for (std::uint32_t frame = 0; frame < Grain; ++frame) Require(second[frame] == (frame < 2 ? 0 : TowardZero(callback.pcm[frame * 2 - 3]))); Require(callback.calls == 1); Require(sceNgs2VoiceGetState(sampler, &state.voice_state, sizeof(state)) == SCE_NGS2_OK); Require(state.num_decoded_samples == Grain * 2 && state.waveform_data == callback.pcm.data() + Grain * 2); @@ -487,21 +497,21 @@ static void TestPcmCallbackRefill() { Event(sampler, SCE_NGS2_VOICE_EVENT_PLAY); const auto first = RenderI16(system, RenderGrain); Require(callback.calls == 1); - for (std::uint32_t frame = 0; frame < RenderGrain; ++frame) Require(first[frame] == (frame == 3 ? pcm : 0)); + for (std::uint32_t frame = 0; frame < RenderGrain; ++frame) Require(first[frame] == (frame == 3 ? TowardZero(pcm) : 0)); Ngs2SamplerVoiceState state{}; Require(sceNgs2VoiceGetState(sampler, &state.voice_state, sizeof(state)) == SCE_NGS2_OK); Require(state.num_decoded_samples == 1 && state.waveform_data == nullptr); const auto second = RenderI16(system, RenderGrain); for (std::uint32_t frame = 0; frame < RenderGrain; ++frame) { const float gain = pause ? static_cast(64 - frame) / 64.0f : 1.0f; - Require(second[frame] == std::lrint(callback.pcm[frame + 1] * gain)); + Require(second[frame] == Ps5I16(callback.pcm[frame + 1] / 32768.0f * gain)); } if (pause) Event(sampler, SCE_NGS2_VOICE_EVENT_RESUME); const auto third = RenderI16(system, RenderGrain); for (std::uint32_t frame = 0; frame < RenderGrain; ++frame) { const float gain = pause ? static_cast(frame) / 64.0f : 1.0f; const float source = frame < 63 ? callback.pcm[65 + frame] : 0.0f; - Require(third[frame] == std::lrint(source * gain)); + Require(third[frame] == Ps5I16(source / 32768.0f * gain)); } Require(callback.calls == 2 && Flags(sampler) == 0); Require(sceNgs2SystemDestroy(system, nullptr) == SCE_NGS2_OK); @@ -551,8 +561,8 @@ static void TestPcmCallbackSetup() { const auto frame = i / channels; const auto channel = i % channels; const auto expected = frame >= 3 && frame < (flag == SCE_NGS2_VOICE_CALLBACK_FLAG_BLOCK_REPEAT ? 5u : 4u) - ? channels == 2 ? static_cast(std::lrint(16384.0f * std::numbers::sqrt2_v / 2.0f)) - : channel == 2 ? 16384 : 0 : 0; + ? channels == 2 ? Ps5I16(0.5f * (std::numbers::sqrt2_v / 2.0f)) + : channel == 2 ? 16383 : 0 : 0; Require(output[i] == expected); } Ngs2SamplerVoiceState state{}; @@ -560,7 +570,7 @@ static void TestPcmCallbackSetup() { Require(state.num_decoded_samples == 0 && state.decoded_data_size == 0 && state.waveform_data == nullptr); Require(sceNgs2SystemRender(system, &info, 1) == SCE_NGS2_OK); Require(callback.calls == 1); - for (std::uint32_t i = 0; i < output.size(); ++i) Require(output[i] == (i < channels * 3 ? 0 : callback.pcm[i - channels * 3])); + for (std::uint32_t i = 0; i < output.size(); ++i) Require(output[i] == (i < channels * 3 ? 0 : TowardZero(callback.pcm[i - channels * 3]))); Require(sceNgs2VoiceGetState(sampler, &state.voice_state, sizeof(state)) == SCE_NGS2_OK); Require(state.num_decoded_samples == Grain && state.decoded_data_size == Grain * channels * sizeof(std::int16_t)); Require(state.waveform_data == callback.pcm.data() + Grain * channels); @@ -855,6 +865,104 @@ static void TestMatrixLevelClamp() { Require(sceNgs2SystemDestroy(system, nullptr) == SCE_NGS2_OK); } +static Ngs2VoiceCommand PortVolumeCommand(std::uint32_t port, float volume, std::uint8_t type = 1) { + return Ngs2VoiceCommand{(port << 24) | 6, 0, type, 0, {.f = volume}}; +} + +static float PortVolume(uintptr_t voice, std::uint32_t port) { + Ngs2VoicePortInfo info{}; + Require(sceNgs2VoiceGetPortInfo(voice, port, &info, sizeof(info)) == SCE_NGS2_OK); + return info.volume; +} + +static bool SameBits(float a, float b) { + return std::bit_cast(a) == std::bit_cast(b); +} + +static void TestPortVolumeClampedLikePs5() { + const std::vector pcm(Grain, 16384); + const float inf = INFINITY; + const float nan = std::bit_cast(0x7fc00000u); + const float negativeNan = std::bit_cast(0xffc00000u); + const float tiny = std::bit_cast(0x000116c2u); + const auto check = [&](bool command, float sent, float stored) { + const auto system = CreateSystem(); + const auto sampler = Sampler(system, pcm, 0); + Patch(sampler, Mastering(system, 1)); + if (command) { + const auto set = PortVolumeCommand(0, sent); + Require(sceNgs2VoiceRunCommands(sampler, &set, 1) == SCE_NGS2_OK); + } else { + Control(sampler, SCE_NGS2_VOICE_PARAM_PORT_VOLUME, Ngs2VoicePortVolumeParam{{}, 0, sent}); + } + Require(SameBits(PortVolume(sampler, 0), stored)); + Event(sampler, SCE_NGS2_VOICE_EVENT_PLAY); + std::vector out(Grain, -1.0f); + const Ngs2RenderBufferInfo info{out.data(), out.size() * sizeof(float), SCE_NGS2_WAVEFORM_TYPE_PCM_F32L, 1}; + Require(sceNgs2SystemRender(system, &info, 1) == SCE_NGS2_OK); + for (std::size_t i = 0; i < out.size(); ++i) Require(std::isnan(stored) ? std::isnan(out[i]) : out[i] == (i < 3 ? 0.0f : 0.5f * stored) && !std::signbit(out[i])); + Require(sceNgs2SystemDestroy(system, nullptr) == SCE_NGS2_OK); + }; + for (const bool command : {false, true}) { + for (const auto& [sent, stored] : std::vector>{ + {0.0f, 0.0f}, {0.5f, 0.5f}, {1.0f, 1.0f}, {32.0f, 32.0f}, {33.0f, 32.0f}, {inf, 32.0f}, {-1.0f, 0.0f}, {-inf, 0.0f}, + {-0.0f, -0.0f}, {tiny, tiny}, {-1e-40f, 0.0f}, {nan, nan}, {negativeNan, negativeNan}}) { + check(command, sent, stored); + } + } + for (const auto& [sent, stored] : std::vector>{{2.0f, 2.0f}, {31.0f, 31.0f}, {32.5f, 32.0f}, {64.0f, 32.0f}, {1e30f, 32.0f}, {-0.5f, 0.0f}, {-1e30f, 0.0f}}) { + check(false, sent, stored); + } + + const auto preset = [&](uintptr_t& system) { + system = CreateSystem(); + const auto sampler = Sampler(system, pcm, 0); + Patch(sampler, Mastering(system, 1)); + const auto set = PortVolumeCommand(0, 0.5f); + Require(sceNgs2VoiceRunCommands(sampler, &set, 1) == SCE_NGS2_OK); + return sampler; + }; + const auto run = [&](const std::vector& commands, int result, float port0, std::uint32_t port = 1, float other = 1.0f) { + uintptr_t system = 0; + const auto sampler = preset(system); + Require(sceNgs2VoiceRunCommands(sampler, commands.data(), commands.size()) == result); + Require(SameBits(PortVolume(sampler, 0), port0) && SameBits(PortVolume(sampler, port), other)); + Require(sceNgs2SystemDestroy(system, nullptr) == SCE_NGS2_OK); + }; + for (const std::uint8_t type : {0x11, 0x02, 0x03, 0x04, 0x00}) run({PortVolumeCommand(0, 2.0f, type)}, SCE_NGS2_OK, 2.0f); + auto realDouble = PortVolumeCommand(0, 0.0f, 0x02); + const double two = 2.0; + std::memcpy(&realDouble.value, &two, sizeof(two)); + run({realDouble}, SCE_NGS2_OK, 0.0f); + auto counted = PortVolumeCommand(0, 2.0f); + counted.count = 1; + run({counted}, SCE_NGS2_OK, 2.0f); + auto flagged = PortVolumeCommand(0, 2.0f); + flagged.flags = 1; + run({flagged}, SCE_NGS2_OK, 2.0f); + run({PortVolumeCommand(1, 2.0f)}, SCE_NGS2_OK, 0.5f, 1, 2.0f); + run({PortVolumeCommand(7, 2.0f)}, SCE_NGS2_OK, 0.5f, 7, 2.0f); + run({PortVolumeCommand(8, 2.0f)}, SCE_NGS2_ERROR_INVALID_VOICE_OUTPUT_INDEX, 0.5f); + run({PortVolumeCommand(255, 2.0f)}, SCE_NGS2_ERROR_INVALID_VOICE_OUTPUT_INDEX, 0.5f); + run({PortVolumeCommand(0, 2.0f), PortVolumeCommand(8, 3.0f), PortVolumeCommand(1, 4.0f)}, SCE_NGS2_ERROR_INVALID_VOICE_OUTPUT_INDEX, 0.5f); + run({PortVolumeCommand(0, 2.0f), PortVolumeCommand(0, 40.0f)}, SCE_NGS2_OK, 32.0f); + run({PortVolumeCommand(0, 2.0f), PortVolumeCommand(0, 3.0f, 0x03)}, SCE_NGS2_OK, 3.0f); + run({PortVolumeCommand(0, 3.0f, 0x03), PortVolumeCommand(0, 2.0f)}, SCE_NGS2_OK, 2.0f); + + uintptr_t system = 0; + const auto sampler = preset(system); + const std::vector mixed{Ngs2VoiceCommand{2, 0, 4, 0, {.u = SCE_NGS2_VOICE_EVENT_PLAY}}, PortVolumeCommand(8, 2.0f)}; + bool threw = false; + try { sceNgs2VoiceRunCommands(sampler, mixed.data(), mixed.size()); } catch (const std::invalid_argument&) { threw = true; } + Require(threw); + const auto master = Mastering(system, 1); + const auto masterVolume = PortVolumeCommand(0, 2.0f); + threw = false; + try { sceNgs2VoiceRunCommands(master, &masterVolume, 1); } catch (const std::invalid_argument&) { threw = true; } + Require(threw); + Require(sceNgs2SystemDestroy(system, nullptr) == SCE_NGS2_OK); +} + static int allocations = 0; static std::int32_t APS5_VABI Allocate(Ngs2ContextBufferInfo* info) { Require(info->host_buffer == nullptr && info->host_buffer_size != 0 && info->user_data == 9); @@ -1125,9 +1233,9 @@ static void TestSampleRate() { const auto sampler = Sampler(system, pcm, 2); Patch(sampler, master); Event(sampler, SCE_NGS2_VOICE_EVENT_PLAY); - const std::int16_t expected[] = {0, 0, 0, 0, 0, -30, 0, 470, - 1000, 1500, 2000, 2621, 3000, 1500, 0, 379, - 1000, 1500, 2000, 2621, 3000, 1530, 0, -91}; + const std::int16_t expected[] = {0, 0, 0, 0, 0, -30, 0, 469, + 999, 1499, 1999, 2621, 2999, 1499, 0, 378, + 999, 1499, 1999, 2621, 2999, 1530, 0, -90}; const auto out = RenderI16(system); for (std::uint32_t i = 0; i < Grain; i++) Require(out[i] == (i < std::size(expected) ? expected[i] : 0)); Require(sceNgs2SystemDestroy(system, nullptr) == SCE_NGS2_OK); @@ -1160,7 +1268,7 @@ static void TestSystemOptionFlags() { Patch(sampler, master); Event(sampler, SCE_NGS2_VOICE_EVENT_PLAY); const auto out = RenderI16(system); - for (std::uint32_t i = 0; i < Grain; ++i) Require(out[i] == (i < 3 || i - 3 >= pcm.size() * 2 ? 0 : pcm[(i - 3) % pcm.size()])); + for (std::uint32_t i = 0; i < Grain; ++i) Require(out[i] == (i < 3 || i - 3 >= pcm.size() * 2 ? 0 : TowardZero(pcm[(i - 3) % pcm.size()]))); Require(sceNgs2SystemDestroy(system, nullptr) == SCE_NGS2_OK); for (const std::uint32_t flags : {0x1u, 0x3u, 0x4u, 0x80000000u, 0x80000002u}) { @@ -1273,7 +1381,7 @@ static void TestMasteringGain() { Control(loud, SCE_NGS2_MASTERING_VOICE_PARAM_SETUP, Ngs2MasteringVoiceSetupParam{{}, 1, 0}); Event(loud, SCE_NGS2_VOICE_EVENT_PLAY); auto reset = RenderI16(loudSystem); - for (std::int16_t sample : reset) Require(sample == 24576); + for (std::int16_t sample : reset) Require(sample == 24575); Require(sceNgs2SystemDestroy(loudSystem, nullptr) == SCE_NGS2_OK); } @@ -1763,7 +1871,61 @@ static void TestLock() { Require(sceNgs2SystemDestroy(system, nullptr) == SCE_NGS2_OK); } +struct I16Sweep { + std::vector> cases; + std::uint32_t offset = 0; +}; + +static int APS5_VABI WriteSweep(Ngs2UserFxProcessContext* context) { + auto& sweep = *reinterpret_cast(context->user_data0); + for (std::uint32_t channel = 0; channel < context->num_channels; ++channel) { + for (std::uint32_t i = 0; i < context->num_grain_samples; ++i) context->channel_data[channel][i] = sweep.cases[(sweep.offset + i + channel) % sweep.cases.size()].first; + } + sweep.offset += context->num_grain_samples; + return SCE_NGS2_OK; +} + +static void TestI16RenderConversionLikePs5() { + const float inf = INFINITY; + const std::vector> cases{ + {0.0f, 0}, {-0.0f, 0}, {std::bit_cast(0x000116c2u), 0}, {std::bit_cast(0x800116c2u), 0}, + {0.25f / 32768.0f, 0}, {0.5f / 32768.0f, 0}, {0.75f / 32768.0f, 0}, {-0.75f / 32768.0f, 0}, + {std::bit_cast(0x38000100u), 1}, {std::bit_cast(0xb8000100u), -1}, {1.5f / 32768.0f, 1}, {2.5f / 32768.0f, 2}, + {std::bit_cast(0x38c00180u), 3}, {3.5f / 32768.0f, 3}, {-3.5f / 32768.0f, -3}, + {0.1f, 3276}, {-0.1f, -3276}, {0.25f, 8191}, {1.0f / 3.0f, 10922}, {std::bit_cast(0x3efc01f8u), 16128}, + {0.5f, 16383}, {-0.5f, -16383}, {0.75f, 24575}, {-0.75f, -24575}, {std::bit_cast(0x3f7fbfffu), 32735}, + {32766.5f / 32768.0f, 32765}, {32767.0f / 32768.0f, 32766}, {32767.5f / 32768.0f, 32766}, {-32767.5f / 32768.0f, -32766}, + {1.0f, 32767}, {1.25f, 32767}, {2.0f, 32767}, {1e10f, 32767}, {3e38f, 32767}, {inf, 32767}, + {-1.0f, -32767}, {-1.25f, -32767}, {-3e38f, -32767}, {-inf, -32767}, + {std::bit_cast(0x7fc00000u), 0}, {std::bit_cast(0xffc00000u), 0}, {std::bit_cast(0x7f800001u), 0}, {std::bit_cast(0x7fffffffu), 0}, + }; + for (const std::uint32_t channels : {1u, 2u, 6u, 8u}) { + const auto system = CreateSystem(); + const auto master = Mastering(system, channels); + const auto voice = Voice(CreateRack(system, SCE_NGS2_RACK_ID_SUBMIXER)); + Control(voice, SCE_NGS2_SUBMIXER_VOICE_PARAM_SETUP, Ngs2SubmixerVoiceSetupParam{{}, channels, 0}); + I16Sweep sweep{cases}; + Control(voice, SCE_NGS2_SUBMIXER_VOICE_PARAM_USER_FX, Ngs2SubmixerVoiceUserFxParam{{}, WriteSweep, reinterpret_cast(&sweep), 0, 0}); + Patch(voice, master); + Event(voice, SCE_NGS2_VOICE_EVENT_PLAY); + for (std::uint32_t first = 0; first < cases.size(); first += Grain) { + std::vector out(Grain * channels, 0x5a5a); + const Ngs2RenderBufferInfo info{out.data(), out.size() * sizeof(std::int16_t), SCE_NGS2_WAVEFORM_TYPE_PCM_I16L, channels}; + Require(sceNgs2SystemRender(system, &info, 1) == SCE_NGS2_OK); + for (std::uint32_t i = 0; i < Grain; ++i) { + for (std::uint32_t channel = 0; channel < channels; ++channel) Require(out[i * channels + channel] == cases[(first + i + channel) % cases.size()].second); + } + } + Require(sceNgs2SystemDestroy(system, nullptr) == SCE_NGS2_OK); + } +} + static constexpr float HalfPower = std::numbers::sqrt2_v / 2.0f; +#ifdef APS5_NGS2_PS4_LIBRARY +static constexpr bool Ps4Library = true; +#else +static constexpr bool Ps4Library = false; +#endif static std::vector MixFrame(std::uint32_t sourceChannels, std::uint32_t sourceChannel, std::uint32_t destChannels) { const auto firstBuffer = usedBuffers; @@ -1795,24 +1957,25 @@ static void TestDefaultChannelMap() { Require(MixFrame(2, 0, 1) == std::vector{half} && MixFrame(2, 1, 1) == std::vector{half}); Require(MixFrame(2, 1, 2) == (std::vector{0, 0.5f})); Require(MixFrame(2, 1, 6) == (std::vector{0, 0.5f, 0, 0, 0, 0})); - Require(MixFrame(3, 2, 2) == (std::vector{0, 0})); - Require(MixFrame(3, 2, 6) == (std::vector{0, 0, 0, 0.5f, 0, 0})); + Require(MixFrame(3, 2, 2) == (Ps4Library ? std::vector{0, 0} : std::vector{half, half})); + Require(MixFrame(3, 2, 6) == (Ps4Library ? std::vector{0, 0, 0, 0.5f, 0, 0} : std::vector{0, 0, 0.5f, 0, 0, 0})); Require(MixFrame(4, 2, 1) == std::vector{0.25f}); Require(MixFrame(4, 2, 2) == (std::vector{half, 0})); Require(MixFrame(4, 3, 6) == (std::vector{0, 0, 0, 0, 0, 0.5f})); Require(MixFrame(5, 2, 2) == (std::vector{half, half})); Require(MixFrame(5, 3, 1) == std::vector{0.25f}); - Require(MixFrame(5, 3, 2) == (std::vector{0, 0})); + Require(MixFrame(5, 3, 2) == (Ps4Library ? std::vector{0, 0} : std::vector{half, 0})); Require(MixFrame(6, 3, 1) == std::vector{0}); - Require(MixFrame(6, 4, 2) == (std::vector{0.25f, 0})); + Require(MixFrame(6, 4, 2) == (std::vector{Ps4Library ? 0.25f : half, 0})); Require(MixFrame(6, 5, 8) == (std::vector{0, 0, 0, 0, 0, 0.5f, 0, 0})); Require(MixFrame(7, 6, 1) == std::vector{quarter}); - Require(MixFrame(7, 6, 2) == (std::vector{quarter, quarter})); + Require(MixFrame(7, 6, 2) == (Ps4Library ? std::vector{quarter, quarter} : std::vector{0.25f, 0.25f})); Require(MixFrame(7, 6, 6) == (std::vector{0, 0, 0, 0, half, half})); Require(MixFrame(7, 6, 8) == (std::vector{0, 0, 0, 0, 0, 0, half, half})); - Require(MixFrame(8, 6, 2) == (std::vector{0.25f, 0})); + Require(MixFrame(8, 6, 2) == (std::vector{Ps4Library ? 0.25f : half, 0})); Require(MixFrame(8, 7, 6) == (std::vector{0, 0, 0, 0, 0, 0.5f})); Require(MixFrame(8, 7, 8) == (std::vector{0, 0, 0, 0, 0, 0, 0, 0.5f})); + if (Ps4Library) return; const auto system = CreateSystem(); const auto master = Mastering(system, 2); @@ -1826,12 +1989,168 @@ static void TestDefaultChannelMap() { Event(sampler, SCE_NGS2_VOICE_EVENT_PLAY); std::vector out(Grain * 2, -1.0f); const Ngs2RenderBufferInfo info{out.data(), out.size() * sizeof(float), SCE_NGS2_WAVEFORM_TYPE_PCM_F32L, 2}; - bool unsupported = false; - try { sceNgs2SystemRender(system, &info, 1); } catch (const std::runtime_error&) { unsupported = true; } - Require(unsupported); + Require(sceNgs2SystemRender(system, &info, 1) == SCE_NGS2_OK); + for (std::uint32_t i = 0; i < Grain; i++) Require(out[i * 2] == (i < 3 ? 0.0f : half) && out[i * 2 + 1] == (i < 3 ? 0.0f : half)); Require(sceNgs2SystemDestroy(system, nullptr) == SCE_NGS2_OK); } +static std::vector PortMapGains(std::uint32_t sourceChannels, std::uint32_t destChannels) { + const auto firstBuffer = usedBuffers; + const auto system = CreateSystem(); + const auto master = Mastering(system, 8); + const auto submixer = Voice(CreateRack(system, SCE_NGS2_RACK_ID_SUBMIXER)); + Control(submixer, SCE_NGS2_SUBMIXER_VOICE_PARAM_SETUP, Ngs2SubmixerVoiceSetupParam{{}, destChannels, 0}); + std::vector identity(8 * destChannels, 0.0f); + for (std::uint32_t channel = 0; channel < destChannels; channel++) identity[channel * destChannels + channel] = 1.0f; + Control(submixer, SCE_NGS2_VOICE_PARAM_MATRIX_LEVELS, Ngs2VoiceMatrixLevelsParam{{}, 0, static_cast(identity.size()), identity.data()}); + Control(submixer, SCE_NGS2_VOICE_PARAM_PORT_MATRIX, Ngs2VoicePortMatrixParam{{}, 0, 0}); + Patch(submixer, master); + Event(submixer, SCE_NGS2_VOICE_EVENT_PLAY); + const auto sampler = Voice(CreateRack(system, SCE_NGS2_RACK_ID_SAMPLER)); + Control(sampler, SCE_NGS2_SAMPLER_VOICE_PARAM_SETUP, Ngs2SamplerVoiceSetupParam{{}, {SCE_NGS2_WAVEFORM_TYPE_PCM_I16L, sourceChannels, 48000, 0, 0, 0}}); + static std::vector frames; + frames.assign(2 * Grain * sourceChannels, 0); + for (std::uint32_t channel = 0; channel < sourceChannels; channel++) frames[channel * sourceChannels + channel] = 16384; + const Ngs2WaveformBlock block{0, frames.size() * sizeof(std::int16_t), 0, 0, 2 * Grain, 0, 0}; + Control(sampler, SCE_NGS2_SAMPLER_VOICE_PARAM_ADD_WAVEFORM_BLOCKS, Ngs2SamplerVoiceWaveformBlocksParam{{}, frames.data(), 0, 1, &block}); + Patch(sampler, submixer); + Event(sampler, SCE_NGS2_VOICE_EVENT_PLAY); + std::vector out(2 * Grain * 8, -1.0f); + for (std::uint32_t grain = 0; grain < 2; grain++) { + const Ngs2RenderBufferInfo info{out.data() + grain * Grain * 8, Grain * 8 * sizeof(float), SCE_NGS2_WAVEFORM_TYPE_PCM_F32L, 8}; + Require(sceNgs2SystemRender(system, &info, 1) == SCE_NGS2_OK); + } + Require(sceNgs2SystemDestroy(system, nullptr) == SCE_NGS2_OK); + ResetBuffers(firstBuffer); + for (std::uint32_t frame = 0; frame < 2 * Grain; frame++) { + if (frame >= 3 && frame < sourceChannels + 3) continue; + for (std::uint32_t channel = 0; channel < 8; channel++) Require(out[frame * 8 + channel] == 0.0f); + } + std::vector gains(8 * sourceChannels); + for (std::uint32_t dest = 0; dest < 8; dest++) { + for (std::uint32_t source = 0; source < sourceChannels; source++) gains[dest * sourceChannels + source] = out[(source + 3) * 8 + dest] * 2.0f; + } + return gains; +} + +struct MeasuredPortMap { + std::uint32_t sourceChannels; + std::vector destChannels; + const char* rows; +}; + +static std::vector MeasuredGains(std::uint32_t sourceChannels, const char* rows) { + std::vector gains(8 * sourceChannels, 0.0f); + for (const char* text = rows; *text != '\0';) { + const std::uint32_t dest = static_cast(text[0] - '0'); + const std::uint32_t source = static_cast(text[2] - '0'); + Require(text[1] == '<' && dest < 8 && source < sourceChannels); + text += 3; + float gain = 1.0f; + if (*text == '*') { + gain = text[1] == 'h' ? 0.707106769f : text[1] == 'q' ? 0.353553385f : 0.5f; + text += 2; + } + gains[dest * sourceChannels + source] = gain; + while (*text == ' ') text++; + } + return gains; +} + +static void TestOddCountMasteringStage() { + const float half = 0.5f * HalfPower; + const auto stage = [&](std::uint32_t channels, std::uint32_t channel) { + const auto firstBuffer = usedBuffers; + const auto system = CreateSystem(); + const auto master = Mastering(system, channels); + const auto voice = Voice(CreateRack(system, SCE_NGS2_RACK_ID_SAMPLER)); + Control(voice, SCE_NGS2_SAMPLER_VOICE_PARAM_SETUP, Ngs2SamplerVoiceSetupParam{{}, {SCE_NGS2_WAVEFORM_TYPE_PCM_I16L, channels, 48000, 0, 0, 0}}); + std::vector frames(Grain * channels, 0); + for (std::uint32_t i = 0; i < Grain; i++) frames[i * channels + channel] = 16384; + const Ngs2WaveformBlock block{0, frames.size() * sizeof(std::int16_t), 0, 0, Grain, 0, 0}; + Control(voice, SCE_NGS2_SAMPLER_VOICE_PARAM_ADD_WAVEFORM_BLOCKS, Ngs2SamplerVoiceWaveformBlocksParam{{}, frames.data(), 0, 1, &block}); + std::vector identity(channels * channels, 0.0f); + for (std::uint32_t i = 0; i < channels; i++) identity[i * channels + i] = 1.0f; + Control(voice, SCE_NGS2_VOICE_PARAM_MATRIX_LEVELS, Ngs2VoiceMatrixLevelsParam{{}, 0, channels * channels, identity.data()}); + Control(voice, SCE_NGS2_VOICE_PARAM_PORT_MATRIX, Ngs2VoicePortMatrixParam{{}, 0, 0}); + Patch(voice, master); + Event(voice, SCE_NGS2_VOICE_EVENT_PLAY); + std::vector out(Grain * channels, -1.0f); + const Ngs2RenderBufferInfo info{out.data(), out.size() * sizeof(float), SCE_NGS2_WAVEFORM_TYPE_PCM_F32L, channels}; + Require(sceNgs2SystemRender(system, &info, 1) == SCE_NGS2_OK); + Require(sceNgs2SystemDestroy(system, nullptr) == SCE_NGS2_OK); + ResetBuffers(firstBuffer); + return std::vector(out.begin() + 3 * channels, out.begin() + 4 * channels); + }; + const auto unit = [](std::uint32_t channels, std::uint32_t channel) { + std::vector row(channels, 0.0f); + row[channel] = 0.5f; + return row; + }; + for (std::uint32_t channel = 0; channel < 4; channel++) Require(stage(4, channel) == unit(4, channel)); + Require(stage(3, 0) == unit(3, 0) && stage(3, 1) == unit(3, 1) && stage(3, 2) == (std::vector{half, half, 0})); + for (std::uint32_t channel = 0; channel < 3; channel++) Require(stage(5, channel) == unit(5, channel)); + Require(stage(5, 3) == unit(5, 4) && stage(5, 4) == std::vector(5, 0.0f)); + for (std::uint32_t channel = 0; channel < 6; channel++) Require(stage(7, channel) == unit(7, channel)); + Require(stage(7, 6) == (std::vector{0, 0, 0, 0, 0, 0, half})); +} + +static void TestOddChannelPortMaps() { + const MeasuredPortMap maps[] = { + {3, {1}, "0<0*h 0<1*h 0<2"}, + {3, {2, 3, 4}, "0<0 0<2*h 1<1 1<2*h"}, + {3, {5, 6, 7, 8}, "0<0 1<1 2<2"}, + {4, {1}, "0<0*h 0<1*h 0<2*5 0<3*5"}, + {4, {2}, "0<0 0<2*h 1<1 1<3*h"}, + {4, {3}, "0<0 1<1 2<2"}, + {4, {4}, "0<0 1<1 2<2 3<3"}, + {4, {5}, "0<0 1<1 4<2"}, + {4, {6, 7, 8}, "0<0 1<1 4<2 5<3"}, + {5, {1}, "0<0*h 0<1*h 0<2 0<3*5 0<4*5"}, + {5, {2}, "0<0 0<2*h 0<3*h 1<1 1<2*h 1<4*h"}, + {5, {3}, "0<0 0<2*h 1<1 1<2*h 2<3"}, + {5, {4}, "0<0 0<2*h 1<1 1<2*h 2<3 3<4"}, + {5, {5}, "0<0 1<1 2<2 4<3"}, + {5, {6, 7, 8}, "0<0 1<1 2<2 4<3 5<4"}, + {7, {1}, "0<0*h 0<1*h 0<2 0<4*5 0<5*5 0<6*q"}, + {7, {2}, "0<0 0<2*h 0<4*h 0<6*5 1<1 1<2*h 1<5*h 1<6*5"}, + {7, {3}, "0<0 0<2*h 1<1 1<2*h 2<4 2<6*h"}, + {7, {4}, "0<0 0<2*h 1<1 1<2*h 2<4 2<6*h 3<5 3<6*h"}, + {7, {5}, "0<0 1<1 2<2 3<3 4<4 4<6*h"}, + {7, {6}, "0<0 1<1 2<2 3<3 4<4 4<6*h 5<5 5<6*h"}, + {7, {7}, "0<0 1<1 2<2 3<3 4<4 5<5 6<6*h"}, + {7, {8}, "0<0 1<1 2<2 3<3 4<4 5<5 6<6*h 7<6*h"}, + {1, {3, 4}, "0<0*h 1<0*h"}, + {1, {5, 7}, "2<0"}, + {2, {3, 4, 5, 7}, "0<0 1<1"}, + {6, {3}, "0<0 0<2*h 1<1 1<2*h 2<4"}, + {6, {4}, "0<0 0<2*h 1<1 1<2*h 2<4 3<5"}, + {6, {5}, "0<0 1<1 2<2 3<3 4<4"}, + {6, {7}, "0<0 1<1 2<2 3<3 4<4 5<5"}, + {8, {3}, "0<0 1<1 2<4 2<6"}, + {8, {4}, "0<0 1<1 2<4 2<6 3<5 3<7"}, + {8, {5}, "0<0 1<1 2<2 3<3 4<4 4<6"}, + {8, {7}, "0<0 1<1 2<2 3<3 4<4 5<5 6<6"}, + }; + std::uint32_t pairs = 0; + for (const auto& map : maps) { + for (std::uint32_t destChannels : map.destChannels) { + Require(PortMapGains(map.sourceChannels, destChannels) == MeasuredGains(map.sourceChannels, map.rows)); + pairs++; + } + } + Require(pairs == 48); + + const float half = 0.5f * 0.707106769f; + Require(MixFrame(3, 2, 3) == (std::vector{half, half, 0})); + Require(MixFrame(4, 3, 4) == (std::vector{0, 0, 0, 0.5f})); + Require(MixFrame(5, 3, 5) == (std::vector{0, 0, 0, 0, 0})); + Require(MixFrame(6, 3, 5) == (std::vector{0, 0, 0, 0, 0.5f})); + Require(MixFrame(8, 4, 3) == (std::vector{half, half, 0})); + Require(MixFrame(7, 6, 7) == (std::vector{0, 0, 0, 0, 0, 0, 0.5f * 0.49999997f})); + Require(MixFrame(1, 0, 7) == (std::vector{0, 0, 0.5f, 0, 0, 0, 0})); +} + static void TestUnsetMatrix() { const auto system = CreateSystem(); const auto master = Mastering(system, 2); @@ -1873,6 +2192,67 @@ static void TestUnsetMatrix() { Require(sceNgs2SystemDestroy(stereoSystem, nullptr) == SCE_NGS2_OK); } +static void TestDefaultMapLikePs5() { + const float half = 0.5f * HalfPower; + Require(MixFrame(6, 4, 2) == (std::vector{half, 0}) && MixFrame(6, 5, 2) == (std::vector{0, half})); + Require(MixFrame(6, 4, 1) == std::vector{0.25f} && MixFrame(6, 5, 1) == std::vector{0.25f}); + for (std::uint32_t channel = 4; channel < 8; channel++) { + Require(MixFrame(8, channel, 2) == (channel % 2 == 0 ? std::vector{half, 0} : std::vector{0, half})); + Require(MixFrame(8, channel, 1) == std::vector{half}); + } + + const auto masterFrame = [](std::uint32_t channels, std::uint32_t channel, std::uint32_t outputChannels, float fbw) { + const auto firstBuffer = usedBuffers; + const auto system = CreateSystem(); + const auto master = Mastering(system, channels); + Control(master, SCE_NGS2_MASTERING_VOICE_PARAM_GAIN, Ngs2MasteringVoiceGainParam{{}, fbw, 1.0f}); + const auto voice = Voice(CreateRack(system, SCE_NGS2_RACK_ID_SAMPLER)); + Control(voice, SCE_NGS2_SAMPLER_VOICE_PARAM_SETUP, Ngs2SamplerVoiceSetupParam{{}, {SCE_NGS2_WAVEFORM_TYPE_PCM_I16L, channels, 48000, 0, 0, 0}}); + std::vector frames(Grain * channels, 0); + for (std::uint32_t i = 0; i < Grain; i++) frames[i * channels + channel] = 16384; + const Ngs2WaveformBlock block{0, frames.size() * sizeof(std::int16_t), 0, 0, Grain, 0, 0}; + Control(voice, SCE_NGS2_SAMPLER_VOICE_PARAM_ADD_WAVEFORM_BLOCKS, Ngs2SamplerVoiceWaveformBlocksParam{{}, frames.data(), 0, 1, &block}); + std::vector identity(channels * channels, 0.0f); + for (std::uint32_t i = 0; i < channels; i++) identity[i * channels + i] = 1.0f; + Control(voice, SCE_NGS2_VOICE_PARAM_MATRIX_LEVELS, Ngs2VoiceMatrixLevelsParam{{}, 0, channels * channels, identity.data()}); + Control(voice, SCE_NGS2_VOICE_PARAM_PORT_MATRIX, Ngs2VoicePortMatrixParam{{}, 0, 0}); + Patch(voice, master); + Event(voice, SCE_NGS2_VOICE_EVENT_PLAY); + std::vector out(Grain * outputChannels, -1.0f); + const Ngs2RenderBufferInfo info{out.data(), out.size() * sizeof(float), SCE_NGS2_WAVEFORM_TYPE_PCM_F32L, outputChannels}; + bool threw = false; + try { + Require(sceNgs2SystemRender(system, &info, 1) == SCE_NGS2_OK); + } catch (const std::runtime_error&) { + threw = true; + } + Require(sceNgs2SystemDestroy(system, nullptr) == SCE_NGS2_OK); + ResetBuffers(firstBuffer); + for (std::uint32_t i = 4; !threw && i < Grain; i++) Require(std::equal(out.begin() + 3 * outputChannels, out.begin() + 4 * outputChannels, out.begin() + i * outputChannels)); + return threw ? std::vector{} : std::vector(out.begin() + 3 * outputChannels, out.begin() + 4 * outputChannels); + }; + Require(masterFrame(1, 0, 2, 1.0f) == (std::vector{0.5f, 0})); + Require(masterFrame(1, 0, 6, 1.0f) == (std::vector{0.5f, 0, 0, 0, 0, 0})); + Require(masterFrame(1, 0, 8, 1.0f) == (std::vector{0.5f, 0, 0, 0, 0, 0, 0, 0})); + Require(masterFrame(2, 1, 1, 1.0f) == std::vector{half}); + Require(masterFrame(2, 1, 8, 1.0f) == (std::vector{0, 0.5f, 0, 0, 0, 0, 0, 0})); + Require(masterFrame(6, 0, 1, 1.0f) == std::vector{half}); + Require(masterFrame(6, 2, 1, 1.0f) == std::vector{0.5f}); + Require(masterFrame(6, 3, 1, 1.0f) == std::vector{0}); + Require(masterFrame(6, 4, 1, 1.0f) == std::vector{0.25f}); + Require(masterFrame(6, 2, 2, 1.0f) == (std::vector{half, half})); + Require(masterFrame(6, 3, 2, 1.0f) == (std::vector{0, 0})); + Require(masterFrame(6, 5, 2, 1.0f) == (std::vector{0, half})); + Require(masterFrame(6, 0, 2, 0.5f) == (std::vector{0.25f, 0})); + Require(masterFrame(6, 3, 8, 1.0f) == (std::vector{0, 0, 0, 0.5f, 0, 0, 0, 0})); + Require(masterFrame(6, 5, 8, 1.0f) == (std::vector{0, 0, 0, 0, 0, 0.5f, 0, 0})); + Require(masterFrame(8, 4, 1, 1.0f) == std::vector{half}); + Require(masterFrame(8, 6, 1, 1.0f) == std::vector{half}); + Require(masterFrame(8, 7, 2, 1.0f) == (std::vector{0, half})); + Require(masterFrame(8, 6, 6, 1.0f) == (std::vector{0, 0, 0, 0, 0.5f, 0})); + Require(masterFrame(8, 3, 6, 1.0f) == (std::vector{0, 0, 0, 0.5f, 0, 0})); +} + template static void TestRenderCapacity(std::uint32_t waveformType, std::uint32_t channels) { const auto system = CreateSystem(); @@ -2045,6 +2425,9 @@ int main() { TestMasteringGainClampedLikePs5(); TestSystemOptionFlags(); + + if (!Ps4Library) TestDefaultMapLikePs5(); + TestUserData(); TestPcmCallbackReset(); TestPcmCallbackRefill(); @@ -2052,6 +2435,9 @@ int main() { TestSetupClearsCallback(); TestMasteringGain(); TestMatrixLevelClamp(); + + TestPortVolumeClampedLikePs5(); + TestStereoIntoSurround(); TestLock(); TestRackLockLeavesQueries(); @@ -2061,7 +2447,12 @@ int main() { TestRackLocksAcrossSystemsAndRender(); TestRackDestroyWaitsForLock(); TestDestroyDuringOwnRenderThrows(); + + TestI16RenderConversionLikePs5(); + TestDefaultChannelMap(); + if (!Ps4Library) TestOddChannelPortMaps(); + if (!Ps4Library) TestOddCountMasteringStage(); TestUnsetMatrix(); TestRenderCapacity(SCE_NGS2_WAVEFORM_TYPE_PCM_F32L, 1); TestRenderCapacity(SCE_NGS2_WAVEFORM_TYPE_PCM_F32L, 2); diff --git a/core/libs/prx/libSceNgs2.native/tests/Ngs2Routing.cpp b/core/libs/prx/libSceNgs2.native/tests/Ngs2Routing.cpp index ad5d5b4c1f..57fc53084e 100644 --- a/core/libs/prx/libSceNgs2.native/tests/Ngs2Routing.cpp +++ b/core/libs/prx/libSceNgs2.native/tests/Ngs2Routing.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include static Ngs2CustomSubmixerRackOption RackOption(std::uint32_t count, std::uint32_t channels = 2) { @@ -79,7 +80,7 @@ static uintptr_t Input(uintptr_t system, const std::vector& pcm, s return voice; } -static void Render(uintptr_t system, const std::vector& expected, std::uint32_t channels = 2, std::uint32_t grain = Grain, bool startup = false) { +static void Render(uintptr_t system, const std::vector& expected, std::uint32_t channels = 2, std::uint32_t grain = Grain, bool startup = false, const std::vector& scale = {}) { Require(sceNgs2SystemSetGrainSamples(system, grain) == SCE_NGS2_OK); std::vector> samples(expected.size(), std::vector(grain * channels, 9.0f)); std::vector info; @@ -87,7 +88,7 @@ static void Render(uintptr_t system, const std::vector& expected, std::ui Require(sceNgs2SystemRender(system, info.data(), static_cast(info.size())) == SCE_NGS2_OK); for (std::size_t port = 0; port < expected.size(); port++) { for (std::size_t i = 0; i < samples[port].size(); ++i) { - const float value = startup && i / channels < 3 ? 0.0f : expected[port]; + const float value = startup && i / channels < 3 ? 0.0f : expected[port] * (scale.empty() ? 1.0f : scale[i % channels]); Require(std::fabs(samples[port][i] - value) <= 0.000001f); } } @@ -196,8 +197,24 @@ static void TestUnityCopy() { Require(sceNgs2SystemDestroy(system, nullptr) == SCE_NGS2_OK); } +#ifdef APS5_NGS2_PS4_LIBRARY +static constexpr bool Ps4Library = true; +#else +static constexpr bool Ps4Library = false; +#endif + +static std::vector MasteringScale(std::uint32_t channels) { + if (Ps4Library) return {}; + constexpr float half = std::numbers::sqrt2_v / 2.0f; + if (channels == 3) return {1.0f + half, 1.0f + half, 0.0f}; + if (channels == 5) return {1.0f, 1.0f, 1.0f, 0.0f, 1.0f}; + if (channels == 7) return {1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, half}; + return {}; +} + static void TestIndependentVoicesAndSilentRamp(std::uint32_t channels) { const auto system = CreateSystem(); + const auto scale = MasteringScale(channels); auto option = RackOption(4, channels); AddGain(option, 0, 3); const auto rack = CustomRack(system, option); @@ -214,13 +231,13 @@ static void TestIndependentVoicesAndSilentRamp(std::uint32_t channels) { const auto input1 = Input(system, pcm1, channels); Route(input0, 0, first, 0, channels); Route(input1, 0, second, 0, channels); - Render(system, {0.5f, 0.75f}, channels, Grain, true); + Render(system, {0.5f, 0.75f}, channels, Grain, true, scale); Route(input0, 0, 0, 0, channels); - Render(system, {0.0f, 0.75f}, channels); + Render(system, {0.0f, 0.75f}, channels, Grain, false, scale); SetGain(first, 4.0f); - Render(system, {0.0f, 0.75f}, channels); + Render(system, {0.0f, 0.75f}, channels, Grain, false, scale); Route(input0, 0, first, 0, channels); - Render(system, {1.0f, 0.75f}, channels); + Render(system, {1.0f, 0.75f}, channels, Grain, false, scale); Require(sceNgs2SystemDestroy(system, nullptr) == SCE_NGS2_OK); } diff --git a/core/libs/prx/libSceNgs2.native/tests/Ngs2Stream.cpp b/core/libs/prx/libSceNgs2.native/tests/Ngs2Stream.cpp index d98092cce4..e413d91a85 100644 --- a/core/libs/prx/libSceNgs2.native/tests/Ngs2Stream.cpp +++ b/core/libs/prx/libSceNgs2.native/tests/Ngs2Stream.cpp @@ -51,27 +51,27 @@ static void TestStreamEndsAtDeclaredSamples() { AddBlock(voice, first.data(), first.size() * 2, 3 * Grain - 4, SCE_NGS2_WAVEFORM_BLOCKS_FLAG_CONTINUE); Event(voice, SCE_NGS2_VOICE_EVENT_PLAY); auto out = RenderI16(system); - for (std::uint32_t i = 0; i < Grain; i++) Require(out[i] == (i >= 3 ? 16384 : 0)); + for (std::uint32_t i = 0; i < Grain; i++) Require(out[i] == (i >= 3 ? 16383 : 0)); Require(Flags(voice) == (SCE_NGS2_VOICE_STATE_FLAG_INUSE | SCE_NGS2_VOICE_STATE_FLAG_PLAYING | SCE_NGS2_VOICE_STATE_FLAG_EMPTY)); Ngs2SamplerVoiceState state{}; Require(sceNgs2VoiceGetState(voice, &state.voice_state, sizeof(state)) == SCE_NGS2_OK); Require(state.num_decoded_samples == first.size() && state.decoded_data_size == first.size() * 2 && state.waveform_data == first.data() + first.size()); out = RenderI16(system); - for (std::uint32_t i = 0; i < Grain; i++) Require(out[i] == (i == 0 ? 16384 : 0)); + for (std::uint32_t i = 0; i < Grain; i++) Require(out[i] == (i == 0 ? 16383 : 0)); Require(sceNgs2VoiceGetState(voice, &state.voice_state, sizeof(state)) == SCE_NGS2_OK); Require(state.num_decoded_samples == first.size() && state.decoded_data_size == first.size() * 2); AddBlock(voice, second.data(), second.size() * 2, 3 * Grain - 4, SCE_NGS2_WAVEFORM_BLOCKS_FLAG_CONTINUE | SCE_NGS2_WAVEFORM_BLOCKS_FLAG_APPEND); Require(sceNgs2VoiceGetState(voice, &state.voice_state, sizeof(state)) == SCE_NGS2_OK && state.waveform_data == first.data() + first.size()); out = RenderI16(system); - for (std::uint32_t i = 0; i < Grain; i++) Require(out[i] == (i < Grain - 1 ? 8192 : 0)); + for (std::uint32_t i = 0; i < Grain; i++) Require(out[i] == (i < Grain - 1 ? 8191 : 0)); Require(sceNgs2VoiceGetState(voice, &state.voice_state, sizeof(state)) == SCE_NGS2_OK); Require(state.num_decoded_samples == first.size() + second.size() && state.decoded_data_size == (first.size() + second.size()) * 2 && state.waveform_data == second.data() + second.size()); AddBlock(voice, last.data(), last.size() * 2, 3 * Grain - 4, SCE_NGS2_WAVEFORM_BLOCKS_FLAG_APPEND); out = RenderI16(system); - for (std::uint32_t i = 0; i < Grain; i++) Require(out[i] == (i < Grain - 3 ? 4096 : 0)); + for (std::uint32_t i = 0; i < Grain; i++) Require(out[i] == (i < Grain - 3 ? 4095 : 0)); Require(Flags(voice) == 0); Require(sceNgs2VoiceGetState(voice, &state.voice_state, sizeof(state)) == SCE_NGS2_OK); Require(state.num_decoded_samples == 0 && state.decoded_data_size == 0 && state.waveform_data == nullptr); @@ -90,10 +90,10 @@ static void TestStreamClosedBeforeDeclaredSamples() { Event(voice, SCE_NGS2_VOICE_EVENT_PLAY); AddBlock(voice, closing.data(), closing.size() * 2, 1000, SCE_NGS2_WAVEFORM_BLOCKS_FLAG_APPEND); auto out = RenderI16(system); - for (std::uint32_t i = 0; i < Grain; i++) Require(out[i] == (i < 3 ? 0 : 16384)); + for (std::uint32_t i = 0; i < Grain; i++) Require(out[i] == (i < 3 ? 0 : 16383)); Require(Flags(voice) == (SCE_NGS2_VOICE_STATE_FLAG_INUSE | SCE_NGS2_VOICE_STATE_FLAG_PLAYING)); out = RenderI16(system); - for (std::uint32_t i = 0; i < Grain; i++) Require(out[i] == (i == 0 ? 16384 : i < 5 ? 8192 : 0)); + for (std::uint32_t i = 0; i < Grain; i++) Require(out[i] == (i == 0 ? 16383 : i < 5 ? 8191 : 0)); Require(Flags(voice) == 0); Ngs2SamplerVoiceState state{}; Require(sceNgs2VoiceGetState(voice, &state.voice_state, sizeof(state)) == SCE_NGS2_OK); @@ -152,10 +152,10 @@ static void TestSilenceBlock() { AddBlock(withData, pcm.data(), pcm.size() * 2, Grain, SCE_NGS2_WAVEFORM_BLOCKS_FLAG_SILENCE); Event(withData, SCE_NGS2_VOICE_EVENT_PLAY); out = RenderI16(system); - for (std::uint32_t i = 0; i < Grain; i++) Require(out[i] == (i < 3 ? 0 : 1234)); + for (std::uint32_t i = 0; i < Grain; i++) Require(out[i] == (i < 3 ? 0 : 1233)); Require(Flags(withData) == (SCE_NGS2_VOICE_STATE_FLAG_INUSE | SCE_NGS2_VOICE_STATE_FLAG_PLAYING)); out = RenderI16(system); - for (std::uint32_t i = 0; i < Grain; ++i) Require(out[i] == (i < 3 ? 1234 : 0)); + for (std::uint32_t i = 0; i < Grain; ++i) Require(out[i] == (i < 3 ? 1233 : 0)); Require(Flags(withData) == 0); const auto dataless = StreamVoice(rack, 2, master); @@ -197,7 +197,7 @@ static void TestDrainedStreamReportsEmpty() { const std::vector longer(Grain * 2, 8192); AddBlock(voice, longer.data(), longer.size() * 2, Grain * 2, SCE_NGS2_WAVEFORM_BLOCKS_FLAG_CONTINUE); const auto out = RenderI16(system); - Require(out[0] == 8192 && out[3] == 8192); + Require(out[0] == 8191 && out[3] == 8191); Require(Flags(voice) == playing); AddBlock(voice, pcm.data(), pcm.size() * 2, 4, 0); diff --git a/core/libs/prx/libSceNgs2.native/tests/Ngs2Test.hpp b/core/libs/prx/libSceNgs2.native/tests/Ngs2Test.hpp index 4c9cd946ef..38fc0e432e 100644 --- a/core/libs/prx/libSceNgs2.native/tests/Ngs2Test.hpp +++ b/core/libs/prx/libSceNgs2.native/tests/Ngs2Test.hpp @@ -3,6 +3,7 @@ #include "prx/libSceNgs2.native/include/Api.hpp" #include "prx/libSceNgs2.native/include/Ngs2Types.hpp" +#include "prx/libSceNgs2/include/Api.hpp" #include #include @@ -11,7 +12,6 @@ #include extern "C" { -int APS5_VABI sceNgs2ParseWaveformData(const void*, size_t, Ngs2WaveformInfo*); int APS5_VABI sceNgs2ParseWaveformFile(const char*, uint32_t, Ngs2WaveformInfo*); int APS5_VABI sceNgs2CalcWaveformBlock(const Ngs2WaveformFormat*, uint32_t, uint32_t, Ngs2WaveformBlock*); int APS5_VABI sceNgs2GetWaveformFrameInfo(const Ngs2WaveformFormat*, uint32_t*, uint32_t*, uint32_t*, uint32_t*); diff --git a/core/libs/prx/libSceNgs2/CMakeLists.txt b/core/libs/prx/libSceNgs2/CMakeLists.txt index 70784182a4..7fcf07b212 100644 --- a/core/libs/prx/libSceNgs2/CMakeLists.txt +++ b/core/libs/prx/libSceNgs2/CMakeLists.txt @@ -22,6 +22,9 @@ if(BUILD_TESTING) add_test_executable(ngs2_core_${testName}_tests ${CMAKE_CURRENT_SOURCE_DIR}/../libSceNgs2.native/tests/Ngs2${ngs2Test}.cpp) target_include_directories(ngs2_core_${testName}_tests PRIVATE ${LIBS_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/3rdparty/LibAtrac9/C/src) target_link_libraries(ngs2_core_${testName}_tests PRIVATE libSceNgs2 atrac9 libkernel libc) + if(testName STREQUAL "routing") + target_compile_definitions(ngs2_core_${testName}_tests PRIVATE APS5_NGS2_PS4_LIBRARY) + endif() configure_windows_unwind(ngs2_core_${testName}_tests) add_test(NAME ngs2_core_${testName} COMMAND ngs2_core_${testName}_tests) if(WIN32) @@ -32,6 +35,7 @@ if(BUILD_TESTING) add_test_executable(ngs2_core_render_tests ${CMAKE_CURRENT_SOURCE_DIR}/../libSceNgs2.native/tests/Ngs2Render.cpp) target_include_directories(ngs2_core_render_tests PRIVATE ${LIBS_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/3rdparty/LibAtrac9/C/src) target_link_libraries(ngs2_core_render_tests PRIVATE libSceNgs2 atrac9 libkernel libc) + target_compile_definitions(ngs2_core_render_tests PRIVATE APS5_NGS2_PS4_LIBRARY) configure_windows_unwind(ngs2_core_render_tests) add_test(NAME ngs2_core_render COMMAND ngs2_core_render_tests) if(WIN32) diff --git a/core/libs/prx/libSceNgs2/PendingExports.cpp b/core/libs/prx/libSceNgs2/PendingExports.cpp index e1942c4923..4e1bc5c883 100644 --- a/core/libs/prx/libSceNgs2/PendingExports.cpp +++ b/core/libs/prx/libSceNgs2/PendingExports.cpp @@ -14,21 +14,5 @@ int APS5_VABI sceNgs2FftProcess() { NotImplemented_nid_no_patch(__func__); return 0; } -int APS5_VABI sceNgs2FftQuerySize() { - NotImplemented_nid_no_patch(__func__); - return 0; -} -int APS5_VABI sceNgs2ParseWaveformUser(std::uintptr_t handler, std::uintptr_t userData, void* outInfo) { - NotImplemented_nid_no_patch(__func__); - return 0; -} -int APS5_VABI sceNgs2SystemEnumHandles(std::uintptr_t* outHandles, std::uint32_t maxHandles) { - NotImplemented_nid_no_patch(__func__); - return 0; -} -int APS5_VABI sceNgs2SystemEnumRackHandles(std::uintptr_t systemHandle, std::uintptr_t* outHandles, std::uint32_t maxHandles) { - NotImplemented_nid_no_patch(__func__); - return 0; -} } diff --git a/core/libs/prx/libSceNgs2/include/Api.hpp b/core/libs/prx/libSceNgs2/include/Api.hpp index 3398761ed6..de4b3c023d 100644 --- a/core/libs/prx/libSceNgs2/include/Api.hpp +++ b/core/libs/prx/libSceNgs2/include/Api.hpp @@ -1,13 +1,15 @@ #pragma once #include "SceTypes.hpp" +#include "prx/libSceNgs2.native/include/Ngs2Types.hpp" extern "C" { int APS5_VABI sceNgs2FftInit(); int APS5_VABI sceNgs2FftProcess(); -int APS5_VABI sceNgs2FftQuerySize(); -int APS5_VABI sceNgs2ParseWaveformUser(std::uintptr_t handler, std::uintptr_t userData, void* outInfo); +int APS5_VABI sceNgs2FftQuerySize(std::uint32_t length, std::uint32_t flags, std::uint64_t* size); +int APS5_VABI sceNgs2ParseWaveformData(const void* data, std::size_t dataSize, Ngs2WaveformInfo* outInfo); +int APS5_VABI sceNgs2ParseWaveformUser(std::uintptr_t handler, std::uintptr_t userData, Ngs2WaveformInfo* outInfo); int APS5_VABI sceNgs2SystemEnumHandles(std::uintptr_t* outHandles, std::uint32_t maxHandles); int APS5_VABI sceNgs2SystemEnumRackHandles(std::uintptr_t systemHandle, std::uintptr_t* outHandles, std::uint32_t maxHandles); diff --git a/core/libs/prx/libSceNpAuthAuthorizedAppDialog/CMakeLists.txt b/core/libs/prx/libSceNpAuthAuthorizedAppDialog/CMakeLists.txt index 15dcbb4f2e..e8d6b871fd 100644 --- a/core/libs/prx/libSceNpAuthAuthorizedAppDialog/CMakeLists.txt +++ b/core/libs/prx/libSceNpAuthAuthorizedAppDialog/CMakeLists.txt @@ -1,4 +1,5 @@ add_library(libSceNpAuthAuthorizedAppDialog SHARED EXCLUDE_FROM_ALL Export.cpp) +target_link_libraries(libSceNpAuthAuthorizedAppDialog PRIVATE libSceIme) target_include_directories(libSceNpAuthAuthorizedAppDialog PRIVATE ${LIBS_INCLUDE_DIR}) configure_windows_unwind(libSceNpAuthAuthorizedAppDialog) @@ -7,10 +8,10 @@ target_link_libraries(libSceNpAuthAuthorizedAppDialog PRIVATE libSceUserService) if(BUILD_TESTING) add_test_executable(guest_np_auth_authorized_app_dialog_tests ${LIBS_INCLUDE_DIR}/tests/GuestNpAuthAuthorizedAppDialog.cpp) target_include_directories(guest_np_auth_authorized_app_dialog_tests PRIVATE ${LIBS_INCLUDE_DIR}) - target_link_libraries(guest_np_auth_authorized_app_dialog_tests PRIVATE libSceNpAuthAuthorizedAppDialog libSceUserService) + target_link_libraries(guest_np_auth_authorized_app_dialog_tests PRIVATE libSceNpAuthAuthorizedAppDialog libSceIme libSceUserService) add_test(NAME guest_np_auth_authorized_app_dialog COMMAND guest_np_auth_authorized_app_dialog_tests) if(WIN32) set_tests_properties(guest_np_auth_authorized_app_dialog PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") + "PATH=path_list_prepend:$;PATH=path_list_prepend:$") endif() endif() diff --git a/core/libs/prx/libSceNpAuthAuthorizedAppDialog/Export.cpp b/core/libs/prx/libSceNpAuthAuthorizedAppDialog/Export.cpp index e483fc0a9d..55718664f4 100644 --- a/core/libs/prx/libSceNpAuthAuthorizedAppDialog/Export.cpp +++ b/core/libs/prx/libSceNpAuthAuthorizedAppDialog/Export.cpp @@ -7,6 +7,7 @@ #include "SceTypes.hpp" #include "prx/libSceCommonDialog/CommonDialog.hpp" #include "prx/libc/include/General.hpp" +#include "prx/libSceIme/include/PsnDialogNotice.hpp" namespace { @@ -46,6 +47,7 @@ int APS5_VABI sceNpAuthAuthorizedAppDialogOpen(const NpAuthAuthorizedAppDialogPa if (status == COMMON_DIALOG_STATUS_NONE) return COMMON_DIALOG_ERROR_NOT_INITIALIZED; if (status == COMMON_DIALOG_STATUS_RUNNING) return COMMON_DIALOG_ERROR_BUSY; g_status = COMMON_DIALOG_STATUS_FINISHED; + PsnDialogNoticeOffer_nid_postfix(PsnDialogNoticeKind::PsnFeature); return 0; } diff --git a/core/libs/prx/libSceNpCommerce/CMakeLists.txt b/core/libs/prx/libSceNpCommerce/CMakeLists.txt index 1c59d83752..dfd5e7d90a 100644 --- a/core/libs/prx/libSceNpCommerce/CMakeLists.txt +++ b/core/libs/prx/libSceNpCommerce/CMakeLists.txt @@ -1,4 +1,5 @@ add_library(libSceNpCommerce SHARED EXCLUDE_FROM_ALL Export.cpp) +target_link_libraries(libSceNpCommerce PRIVATE libSceIme) target_include_directories(libSceNpCommerce PRIVATE ${LIBS_INCLUDE_DIR}) configure_windows_unwind(libSceNpCommerce) target_link_libraries(libSceNpCommerce PRIVATE libc libSceUserService) @@ -6,11 +7,11 @@ target_link_libraries(libSceNpCommerce PRIVATE libc libSceUserService) if(BUILD_TESTING) add_test_executable(guest_np_commerce_dialog_tests ${LIBS_INCLUDE_DIR}/tests/GuestNpCommerceDialog.cpp) target_include_directories(guest_np_commerce_dialog_tests PRIVATE ${LIBS_INCLUDE_DIR}) - target_link_libraries(guest_np_commerce_dialog_tests PRIVATE libSceNpCommerce libc libSceUserService) + target_link_libraries(guest_np_commerce_dialog_tests PRIVATE libSceNpCommerce libSceIme libc libSceUserService) configure_windows_unwind(guest_np_commerce_dialog_tests) add_test(NAME guest_np_commerce_dialog COMMAND guest_np_commerce_dialog_tests) if(WIN32) set_tests_properties(guest_np_commerce_dialog PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") + "PATH=path_list_prepend:$;PATH=path_list_prepend:$") endif() endif() diff --git a/core/libs/prx/libSceNpCommerce/Export.cpp b/core/libs/prx/libSceNpCommerce/Export.cpp index a94c5c9e82..e964c0be97 100644 --- a/core/libs/prx/libSceNpCommerce/Export.cpp +++ b/core/libs/prx/libSceNpCommerce/Export.cpp @@ -8,6 +8,7 @@ #include "SceTypes.hpp" #include "prx/libSceCommonDialog/CommonDialog.hpp" #include "prx/libc/include/General.hpp" +#include "prx/libSceIme/include/PsnDialogNotice.hpp" namespace { @@ -109,6 +110,7 @@ int APS5_VABI sceNpCommerceDialogOpen(const NpCommerceDialogParam* param) { if (!validateParam(*param)) return COMMON_DIALOG_ERROR_INVALID_ARGUMENT; g_userData = param->userData; g_status = COMMON_DIALOG_STATUS_FINISHED; + PsnDialogNoticeOffer_nid_postfix(PsnDialogNoticeKind::PsnFeature); return 0; } @@ -166,6 +168,7 @@ int APS5_VABI sceNpCommerceDialogOpen2(const NpCommerceDialogParam2* param) { if (!validateParam2(*param)) return COMMON_DIALOG_ERROR_INVALID_ARGUMENT; g_userData = param->userData; g_status = COMMON_DIALOG_STATUS_FINISHED; + PsnDialogNoticeOffer_nid_postfix(PsnDialogNoticeKind::PsnFeature); return 0; } diff --git a/core/libs/prx/libSceNpCommon/CMakeLists.txt b/core/libs/prx/libSceNpCommon/CMakeLists.txt index d4cc13ef65..c438c9db8b 100644 --- a/core/libs/prx/libSceNpCommon/CMakeLists.txt +++ b/core/libs/prx/libSceNpCommon/CMakeLists.txt @@ -2,7 +2,7 @@ add_library(libSceNpCommon SHARED EXCLUDE_FROM_ALL PendingExports.cpp PendingExp if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/Export.cpp") target_sources(libSceNpCommon PRIVATE Export.cpp) endif() -target_sources(libSceNpCommon PRIVATE Runtime.cpp Strings.cpp) +target_sources(libSceNpCommon PRIVATE Json.cpp Runtime.cpp Strings.cpp) target_include_directories(libSceNpCommon PRIVATE ${LIBS_INCLUDE_DIR}) target_link_libraries(libSceNpCommon PRIVATE libc libkernel libSceRtc libSceUserService) configure_windows_unwind(libSceNpCommon) diff --git a/core/libs/prx/libSceNpCommon/Export.cpp b/core/libs/prx/libSceNpCommon/Export.cpp index 77a7b33fc9..d32ce8ed7c 100644 --- a/core/libs/prx/libSceNpCommon/Export.cpp +++ b/core/libs/prx/libSceNpCommon/Export.cpp @@ -157,6 +157,7 @@ int APS5_VABI sceNpJoinThread(Pthread thread, void** retval) { } int APS5_VABI sceNpGetSystemClockUsec(std::int64_t* usec) { + if (usec == nullptr) return NP_ERROR_INVALID_ARGUMENT; KernelTimespec now{}; const int result = sceKernelClockGettime(CLOCK_MONOTONIC_ID, &now); if (result == 0) *usec = now.tv_sec * 1000000 + now.tv_nsec / 1000; diff --git a/core/libs/prx/libSceNpCommon/Json.cpp b/core/libs/prx/libSceNpCommon/Json.cpp new file mode 100644 index 0000000000..a030859149 --- /dev/null +++ b/core/libs/prx/libSceNpCommon/Json.cpp @@ -0,0 +1,958 @@ +#include +#include +#include +#include +#include +#include +#include "prx/libSceNpCommon/include/Api.hpp" +#include "SceTypes.hpp" + +namespace { + +constexpr int NP_UTIL_ERROR_INVALID_ARGUMENT = static_cast(0x80550601); +constexpr int NP_UTIL_ERROR_BUFFER_TOO_SMALL = static_cast(0x80550602); +constexpr int NP_JSON_ERROR_TOO_DEEP = static_cast(0x80550603); +constexpr int NP_SERVER_ERROR_JSON_BAD_CODE = static_cast(0x80559C02); + +constexpr int NP_SERVER_ERROR_BASE = static_cast(0x82000000); +constexpr int NP_SERVER_ERROR_HTTP_BASE = static_cast(0x82F00000); +constexpr int NP_SERVER_ERROR_UNKNOWN = static_cast(0x82FFFFFF); +constexpr std::uint32_t NP_SERVER_ERROR_CODE_LIMIT = 0xC00000; +constexpr long long NP_SERVER_ERROR_CODE_MAX = 0xFFFFFF; +constexpr std::int32_t NP_SERVER_ERROR_NO_CODE = -1; +constexpr std::uint32_t HTTP_STATUS_FIRST = 100; +constexpr std::uint32_t HTTP_STATUS_COUNT = 500; + +constexpr std::uint32_t JSON_MAX_DEPTH = 16; +constexpr std::size_t JSON_KEY_SIZE = 0x80; +constexpr std::size_t JSON_TEXT_SIZE = 0x600; +constexpr std::size_t JSON_MIN_VALUE_SIZE = 0x20; +constexpr std::size_t JSON_CHAR_WINDOW = 6; +constexpr std::size_t JSON_CHAR_SIZE = 8; +constexpr std::int32_t JSON_NO_INDEX = -1; + +enum NpJsonEvent : std::int32_t { + NP_JSON_OBJECT_START = 1, + NP_JSON_OBJECT_END = 2, + NP_JSON_ARRAY_START = 3, + NP_JSON_ARRAY_END = 4, + NP_JSON_KEY = 5, + NP_JSON_VALUE = 6, +}; + +enum NpJsonValueType : std::uint32_t { + NP_JSON_NULL = 0, + NP_JSON_TRUE = 1, + NP_JSON_FALSE = 2, + NP_JSON_NUMBER = 3, + NP_JSON_STRING = 4, +}; + +enum NpJsonRuleKind : std::uint32_t { + NP_JSON_RULE_MEMBER = 1, + NP_JSON_RULE_ELEMENT = 2, +}; + +enum ParserState : std::uint32_t { + STATE_ROOT, + STATE_OBJECT, + STATE_OBJECT_END, + STATE_ARRAY, + STATE_ARRAY_END, + STATE_KEY, + STATE_KEY_TEXT, + STATE_COLON, + STATE_VALUE, + STATE_NEXT, + STATE_LITERAL, + STATE_NUMBER, + STATE_STRING, + STATE_SKIP, + STATE_SKIP_STRING, + STATE_COUNT, +}; + +struct NpJsonIndices { + std::int32_t slot[2 * JSON_MAX_DEPTH + 1]; + + std::int32_t& Element(std::uint32_t depth) { return slot[depth]; } + std::int32_t& Array(std::uint32_t depth) { return slot[JSON_MAX_DEPTH + depth]; } + std::uint32_t State() const { return static_cast(slot[2 * JSON_MAX_DEPTH]); } + void SetState(std::uint32_t state) { slot[2 * JSON_MAX_DEPTH] = static_cast(state); } +}; + +struct NpJsonPending { + char bytes[2 * JSON_CHAR_WINDOW]; +}; + +struct NpJsonParseContext { + const NpJsonRuleSet* rules; + char data[JSON_KEY_SIZE + sizeof(std::uint32_t) + JSON_TEXT_SIZE]; + std::uint32_t depth; + NpJsonIndices indices; + std::uint32_t length; + const char* literal; + std::uint32_t matched; + std::uint32_t descend; + std::uint32_t rootDone; + std::int32_t firstNamedDepth; + std::uint32_t skipDepth; + NpJsonPending pending; + std::uint64_t pendingLength; + std::uint64_t pendingNeed; + NpJsonCallback callback; + void* user; +}; + +struct NpJsonParseBufContext { + const NpJsonRuleSet* rules; + char* key; + std::uint64_t keySize; + std::uint32_t valueType; + char* value; + std::uint64_t valueSize; + std::uint32_t depth; + NpJsonIndices indices; + std::uint32_t length; + const char* literal; + std::uint32_t matched; + std::uint32_t descend; + std::uint32_t rootDone; + std::int32_t firstNamedDepth; + std::uint32_t skipDepth; + NpJsonPending pending; + std::uint64_t pendingLength; + std::uint64_t pendingNeed; + NpJsonCallback callback; + void* user; +}; + +struct NpJsonParseExContext { + const NpJsonRuleSet* rules; + char* key; + std::uint64_t keySize; + std::uint32_t valueType; + char* value; + std::uint64_t valueSize; + std::uint32_t depth; + NpJsonIndices indices; + std::uint32_t offset; + std::uint32_t tokenOffset; + std::uint32_t length; + const char* literal; + std::uint32_t matched; + std::uint32_t descend; + std::uint32_t rootDone; + std::int32_t firstNamedDepth; + std::uint32_t skipDepth; + NpJsonPending pending; + std::uint64_t pendingLength; + std::uint64_t pendingNeed; + NpJsonExCallback callback; + void* user; +}; + +struct NpJsonBufValue { + std::uint32_t type; + const char* text; +}; + +struct NpJsonExValue { + std::uint32_t type; + const char* text; + std::uint32_t last; +}; + +static_assert(offsetof(NpJsonParseContext, data) == 0x8 && offsetof(NpJsonParseContext, depth) == 0x68C); +static_assert(offsetof(NpJsonParseContext, indices) == 0x690 && offsetof(NpJsonParseContext, length) == 0x714); +static_assert(offsetof(NpJsonParseContext, literal) == 0x718 && offsetof(NpJsonParseContext, matched) == 0x720); +static_assert(offsetof(NpJsonParseContext, firstNamedDepth) == 0x72C && offsetof(NpJsonParseContext, pending) == 0x734); +static_assert(offsetof(NpJsonParseContext, pendingLength) == 0x740 && offsetof(NpJsonParseContext, callback) == 0x750); +static_assert(sizeof(NpJsonParseContext) == 0x760); +static_assert(offsetof(NpJsonParseBufContext, valueType) == 0x18 && offsetof(NpJsonParseBufContext, depth) == 0x30); +static_assert(offsetof(NpJsonParseBufContext, length) == 0xB8 && offsetof(NpJsonParseBufContext, matched) == 0xC8); +static_assert(offsetof(NpJsonParseBufContext, pending) == 0xDC && offsetof(NpJsonParseBufContext, callback) == 0xF8); +static_assert(sizeof(NpJsonParseBufContext) == 0x108); +static_assert(offsetof(NpJsonParseExContext, offset) == 0xB8 && offsetof(NpJsonParseExContext, length) == 0xC0); +static_assert(offsetof(NpJsonParseExContext, matched) == 0xD0 && offsetof(NpJsonParseExContext, pending) == 0xE4); +static_assert(offsetof(NpJsonParseExContext, pendingNeed) == 0xF8 && offsetof(NpJsonParseExContext, callback) == 0x100); +static_assert(sizeof(NpJsonParseExContext) == 0x110); +static_assert(sizeof(NpJsonExValue) == 0x18); + +constexpr char LITERAL_TRUE[] = "true"; +constexpr char LITERAL_FALSE[] = "false"; +constexpr char LITERAL_NULL[] = "null"; +constexpr char EMPTY_TEXT[] = ""; + +bool IsNumberChar(unsigned char c) { + return (c >= '0' && c <= '9') || c == '+' || c == '-' || c == '.' || c == 'e' || c == 'E'; +} + +struct DecodedChar { + bool complete; + char bytes[JSON_CHAR_SIZE]; + std::size_t length; + std::size_t consumed; + std::size_t raw; + + bool IsQuote() const { return complete && length == 1 && raw == 1 && bytes[0] == '"'; } +}; + +template +class JsonParser { +public: + static constexpr bool EX = std::is_same_v; + static constexpr bool BUFFERED = !std::is_same_v; + + explicit JsonParser(TContext* context) : c(context) {} + + int Parse(const char* data, int length) { + state = c->indices.State(); + const int result = Run(data, length); + if (result == 0) c->indices.SetState(state); + return result; + } + +private: + TContext* c; + std::uint32_t state = STATE_ROOT; + + char* key() { + if constexpr (BUFFERED) return c->key; + else return c->data; + } + + std::size_t keySize() const { + if constexpr (BUFFERED) return c->keySize; + else return JSON_KEY_SIZE; + } + + char* text() { + if constexpr (BUFFERED) return c->value; + else return c->data + JSON_KEY_SIZE + sizeof(std::uint32_t); + } + + std::size_t textSize() const { + if constexpr (BUFFERED) return c->valueSize; + else return JSON_TEXT_SIZE; + } + + std::uint32_t valueType() const { + if constexpr (BUFFERED) { + return c->valueType; + } else { + std::uint32_t type = 0; + std::memcpy(&type, c->data + JSON_KEY_SIZE, sizeof(type)); + return type; + } + } + + void setValueType(std::uint32_t type) { + if constexpr (BUFFERED) c->valueType = type; + else std::memcpy(c->data + JSON_KEY_SIZE, &type, sizeof(type)); + } + + void clearValue() { + if constexpr (BUFFERED) std::memset(c->value, 0, c->valueSize); + else std::memset(c->data + JSON_KEY_SIZE, 0, sizeof(std::uint32_t) + JSON_TEXT_SIZE); + } + + void consume(std::size_t count) { + if constexpr (EX) c->offset += static_cast(count); + } + + void markToken() { + if constexpr (EX) c->tokenOffset = c->offset; + } + + bool wildcard(std::uint32_t depth) const { + return c->firstNamedDepth == JSON_NO_INDEX || static_cast(depth) < c->firstNamedDepth; + } + + const NpJsonRule* level(std::uint32_t depth) const { + if (depth >= static_cast(c->rules->count)) return nullptr; + const NpJsonRule* rules = c->rules->levels[depth]; + const auto kind = static_cast(rules->kind); + return kind == NP_JSON_RULE_MEMBER || kind == NP_JSON_RULE_ELEMENT ? rules : nullptr; + } + + static bool validKind(const NpJsonRule& rule) { + const auto kind = static_cast(rule.kind); + return kind == NP_JSON_RULE_MEMBER || kind == NP_JSON_RULE_ELEMENT; + } + + bool keyMatches(const NpJsonRule& rule) { + return rule.key != nullptr && strncasecmp(rule.key, key(), BUFFERED ? keySize() : JSON_KEY_SIZE) == 0; + } + + bool findRule(std::uint32_t depth, bool colon, std::int32_t* element, std::uint32_t* descend) { + if constexpr (EX) { + if (c->rules == nullptr) { + if (colon && depth > JSON_MAX_DEPTH) return false; + *element = JSON_NO_INDEX; + *descend = !colon || depth != JSON_MAX_DEPTH ? 1 : 0; + return true; + } + if (colon && depth > JSON_MAX_DEPTH - 1) return false; + } + const NpJsonRule* rules = level(depth); + if (rules == nullptr) return false; + const bool wild = wildcard(depth); + const bool inArray = !colon && c->indices.Array(depth) != JSON_NO_INDEX; + for (std::int32_t i = 0; validKind(rules[i]); ++i) { + const NpJsonRule& rule = rules[i]; + bool hit = false; + if (wild) hit = rule.key == nullptr; + else if (inArray) hit = static_cast(rule.kind) == NP_JSON_RULE_ELEMENT; + else hit = static_cast(rule.kind) == NP_JSON_RULE_MEMBER && keyMatches(rule); + if (hit) { + *element = i; + *descend = static_cast(rule.descend); + return true; + } + } + return false; + } + + bool findElementRule(std::uint32_t depth, std::int32_t* element, std::uint32_t* descend) { + if constexpr (EX) { + if (c->rules == nullptr) { + *element = JSON_NO_INDEX; + *descend = depth != JSON_MAX_DEPTH ? 1 : 0; + return true; + } + if (depth > JSON_MAX_DEPTH - 1) return false; + } + const NpJsonRule* rules = level(depth); + if (rules == nullptr) return false; + for (std::int32_t i = 0; validKind(rules[i]); ++i) { + const bool hit = static_cast(depth) >= c->firstNamedDepth + ? static_cast(rules[i].kind) == NP_JSON_RULE_ELEMENT + : rules[i].key == nullptr; + if (hit) { + *element = i; + *descend = static_cast(rules[i].descend); + return true; + } + } + return false; + } + + void setFirstNamedDepth(std::uint32_t depth) { + if (c->firstNamedDepth == JSON_NO_INDEX) c->firstNamedDepth = static_cast(depth); + } + + int emit(std::int32_t event, std::uint32_t depth, const char* eventKey, const void* value, bool atToken) { + const std::int32_t element = c->indices.Element(depth); + const std::int32_t arrayIndex = c->indices.Array(depth); + if constexpr (EX) { + const std::uint32_t offset = atToken ? c->tokenOffset : c->offset; + return c->callback(c, event, depth, element, eventKey, value, arrayIndex, offset, c->user); + } else { + return c->callback(c, event, depth, element, eventKey, value, arrayIndex, c->user); + } + } + + int emitContainer(std::int32_t event, std::uint32_t depth) { + return emit(event, depth, nullptr, nullptr, false); + } + + int deliver(bool literal, bool last) { + const char* valueKey = c->indices.Array(c->depth) == JSON_NO_INDEX ? key() : nullptr; + if constexpr (EX) { + const NpJsonExValue value{valueType(), literal ? EMPTY_TEXT : text(), last ? 1u : 0u}; + return emit(NP_JSON_VALUE, c->depth, valueKey, &value, true); + } else if constexpr (BUFFERED) { + const NpJsonBufValue value{valueType(), literal ? EMPTY_TEXT : text()}; + return emit(NP_JSON_VALUE, c->depth, valueKey, &value, true); + } else { + return emit(NP_JSON_VALUE, c->depth, valueKey, c->data + JSON_KEY_SIZE, true); + } + } + + DecodedChar readChar(const char* data, std::size_t remaining) { + DecodedChar out{}; + if (c->pendingNeed != 0) { + const std::size_t take = c->pendingNeed < remaining ? static_cast(c->pendingNeed) : remaining; + std::memcpy(c->pending.bytes + c->pendingLength, data, take); + c->pendingLength += take; + c->pendingNeed -= take; + out.consumed = take; + if (c->pendingNeed != 0) return out; + const int result = sceNpUtilJsonGetOneChar(out.bytes, JSON_CHAR_SIZE, c->pending.bytes, + static_cast(c->pendingLength), &out.length, &out.raw); + if (result == NP_UTIL_ERROR_BUFFER_TOO_SMALL) { + c->pendingNeed = out.raw - c->pendingLength; + return out; + } + out.complete = true; + if (result < 0) { + out.bytes[0] = c->pending.bytes[0]; + out.length = out.raw = out.consumed = 1; + return out; + } + c->pendingNeed = 0; + c->pendingLength = 0; + return out; + } + const std::size_t window = remaining < JSON_CHAR_WINDOW ? remaining : JSON_CHAR_WINDOW; + out.consumed = window; + const int result = sceNpUtilJsonGetOneChar(out.bytes, JSON_CHAR_SIZE, data, window, &out.length, &out.raw); + if (result == NP_UTIL_ERROR_BUFFER_TOO_SMALL) { + std::memcpy(c->pending.bytes, data, window); + c->pendingLength = window; + c->pendingNeed = out.raw - window; + return out; + } + out.complete = true; + if (result < 0) { + out.bytes[0] = data[0]; + out.length = out.raw = out.consumed = 1; + return out; + } + out.consumed = out.raw; + return out; + } + + int openContainer(bool isArray) { + const std::uint32_t depth = c->depth; + if (depth > JSON_MAX_DEPTH - 1) return NP_JSON_ERROR_TOO_DEEP; + std::int32_t element = 0; + std::uint32_t descend = 0; + if (!findRule(depth, false, &element, &descend)) { + c->matched = 0; + if (depth == 0) { + state = STATE_ROOT; + if (!isArray) setFirstNamedDepth(0); + return 0; + } + c->depth = depth + 1; + c->indices.Array(depth + 1) = isArray ? 0 : JSON_NO_INDEX; + c->skipDepth = depth + 1; + state = STATE_SKIP; + if (!isArray) setFirstNamedDepth(depth + 1); + return 0; + } + c->matched = 1; + c->indices.Element(depth) = element; + c->descend = descend; + const int result = emitContainer(isArray ? NP_JSON_ARRAY_START : NP_JSON_OBJECT_START, depth); + if (result < 0) return result; + if (!isArray) { + c->depth = depth + 1; + c->indices.Array(depth + 1) = JSON_NO_INDEX; + if (c->descend == 1) { + state = STATE_KEY; + } else { + state = STATE_SKIP; + c->skipDepth = depth + 1; + } + setFirstNamedDepth(depth + 1); + return 0; + } + if (c->firstNamedDepth < 0) { + if constexpr (EX) clearValue(); + c->depth = depth + 1; + c->indices.Element(depth + 1) = element; + c->indices.Array(depth + 1) = 0; + c->descend = descend; + state = STATE_VALUE; + return 0; + } + if (!findElementRule(depth + 1, &element, &descend)) { + c->matched = 0; + if (depth == 0) { + state = STATE_ROOT; + return 0; + } + c->depth = depth + 1; + c->indices.Array(depth + 1) = 0; + c->skipDepth = depth + 1; + state = STATE_SKIP; + return 0; + } + c->matched = 1; + if constexpr (EX) clearValue(); + c->depth = depth + 1; + c->indices.Element(depth + 1) = element; + c->indices.Array(depth + 1) = 0; + c->descend = descend; + state = STATE_VALUE; + return 0; + } + + int closeContainer(bool isArray) { + if (c->matched == 1 && c->depth != 0) { + --c->depth; + const int result = emitContainer(isArray ? NP_JSON_ARRAY_END : NP_JSON_OBJECT_END, c->depth); + if (result < 0) return result; + } + if (c->depth == 0) { + c->rootDone = 1; + state = STATE_ROOT; + } else { + state = STATE_NEXT; + } + return 0; + } + + int matchKey() { + const std::uint32_t depth = c->depth; + std::int32_t element = 0; + std::uint32_t descend = 0; + if (!findRule(depth, true, &element, &descend)) { + c->matched = 0; + c->skipDepth = depth + 1; + state = STATE_SKIP; + return 0; + } + c->matched = 1; + c->indices.Element(depth) = element; + c->descend = descend; + const int result = emit(NP_JSON_KEY, depth, key(), nullptr, true); + if (result < 0) return result; + clearValue(); + state = STATE_VALUE; + return 0; + } + + void startLiteral(std::uint32_t type, const char* literal) { + setValueType(type); + c->literal = literal; + c->length = 1; + markToken(); + state = STATE_LITERAL; + } + + int flushPiece() { + text()[c->length] = '\0'; + const int result = deliver(false, false); + if (result < 0) return result; + c->length = 0; + clearValue(); + return 0; + } + + int Run(const char* data, int length) { + std::size_t position = 0; + const auto total = static_cast(length > 0 ? length : 0); + while (position < total) { + const auto ch = static_cast(data[position]); + const bool inObject = c->indices.Array(c->depth) == JSON_NO_INDEX; + switch (state) { + case STATE_ROOT: + if (ch == '"') { + state = STATE_KEY; + } else if (ch == '[' || ch == '{') { + if (c->rootDone) ++position; + else state = ch == '[' ? STATE_ARRAY : STATE_OBJECT; + } else { + consume(1); + ++position; + } + break; + case STATE_OBJECT: + case STATE_ARRAY: { + const bool isArray = state == STATE_ARRAY; + if (ch == (isArray ? '[' : '{')) { + const int result = openContainer(isArray); + if (result < 0) return result; + } + consume(1); + ++position; + break; + } + case STATE_OBJECT_END: + case STATE_ARRAY_END: { + const bool isArray = state == STATE_ARRAY_END; + if (ch == (isArray ? ']' : '}')) { + const int result = closeContainer(isArray); + if (result < 0) return result; + } + consume(1); + ++position; + break; + } + case STATE_KEY: + if (ch == '}' && inObject) { + state = STATE_OBJECT_END; + break; + } + if (ch == ']' && !inObject) { + state = STATE_ARRAY_END; + break; + } + if (ch == '"') { + std::memset(key(), 0, keySize()); + c->length = 0; + markToken(); + state = STATE_KEY_TEXT; + } + consume(1); + ++position; + break; + case STATE_KEY_TEXT: { + const DecodedChar decoded = readChar(data + position, total - position); + if (decoded.complete && (c->length + decoded.length >= keySize() || decoded.IsQuote())) { + key()[c->length] = '\0'; + state = STATE_COLON; + break; + } + if (decoded.complete) { + std::memcpy(key() + c->length, decoded.bytes, decoded.length); + c->length += static_cast(decoded.length); + } + consume(decoded.consumed); + position += decoded.consumed; + break; + } + case STATE_COLON: + if (ch == ':') { + const int result = matchKey(); + if (result < 0) return result; + } + consume(1); + ++position; + break; + case STATE_VALUE: + if (ch == '[') { + state = STATE_ARRAY; + } else if (ch == '{') { + state = STATE_OBJECT; + } else if (ch == ']' && !inObject) { + state = STATE_ARRAY_END; + } else if (ch == '}' && inObject) { + state = STATE_OBJECT_END; + } else { + if (ch == 't') startLiteral(NP_JSON_TRUE, LITERAL_TRUE); + else if (ch == 'f') startLiteral(NP_JSON_FALSE, LITERAL_FALSE); + else if (ch == 'n') startLiteral(NP_JSON_NULL, LITERAL_NULL); + else if ((ch >= '0' && ch <= '9') || ch == '-') { + setValueType(NP_JSON_NUMBER); + markToken(); + text()[0] = static_cast(ch); + c->length = 1; + state = STATE_NUMBER; + } else if (ch == '"') { + setValueType(NP_JSON_STRING); + markToken(); + c->length = 0; + state = STATE_STRING; + } + consume(1); + ++position; + } + break; + case STATE_LITERAL: { + const char* literal = c->literal; + const std::uint32_t matchedLength = c->length; + if (literal == nullptr || std::strlen(literal) <= matchedLength + || ch != static_cast(literal[matchedLength])) { + state = STATE_NEXT; + break; + } + c->length = matchedLength + 1; + if (literal[matchedLength + 1] == '\0') { + const int result = deliver(true, true); + if (result < 0) return result; + if constexpr (EX) c->literal = nullptr; + state = STATE_NEXT; + } + consume(1); + ++position; + break; + } + case STATE_NUMBER: + if (!IsNumberChar(ch)) { + text()[c->length] = '\0'; + state = STATE_NEXT; + const int result = deliver(false, true); + if (result < 0) return result; + break; + } + if (c->length + 1 >= textSize()) { + if constexpr (!EX) return NP_UTIL_ERROR_BUFFER_TOO_SMALL; + const int result = flushPiece(); + if (result < 0) return result; + } + text()[c->length] = static_cast(ch); + ++c->length; + consume(1); + ++position; + break; + case STATE_STRING: { + const DecodedChar decoded = readChar(data + position, total - position); + if (!decoded.complete) { + consume(decoded.consumed); + position += decoded.consumed; + break; + } + if (decoded.IsQuote()) { + text()[c->length] = '\0'; + const int result = deliver(false, true); + if (result < 0) return result; + state = STATE_NEXT; + consume(1); + ++position; + break; + } + if (c->length + decoded.length >= textSize()) { + if constexpr (!EX) return NP_UTIL_ERROR_BUFFER_TOO_SMALL; + const int result = flushPiece(); + if (result < 0) return result; + } + std::memcpy(text() + c->length, decoded.bytes, decoded.length); + c->length += static_cast(decoded.length); + consume(decoded.consumed); + position += decoded.consumed; + break; + } + case STATE_NEXT: + if (ch == '}' && inObject) { + c->matched = 1; + state = STATE_OBJECT_END; + break; + } + if (ch == ']' && !inObject) { + c->matched = 1; + state = STATE_ARRAY_END; + break; + } + if (ch == ',') { + if (inObject) { + state = STATE_KEY; + } else { + clearValue(); + if (c->matched == 1) ++c->indices.Array(c->depth); + state = STATE_VALUE; + } + } + consume(1); + ++position; + break; + case STATE_SKIP: { + const std::uint32_t depth = c->depth; + if (ch == '[' || ch == '{') { + if (depth > JSON_MAX_DEPTH - 1) return NP_JSON_ERROR_TOO_DEEP; + c->depth = depth + 1; + c->indices.Array(depth + 1) = ch == '[' ? 0 : JSON_NO_INDEX; + } else if (ch == ']' || ch == '}') { + const bool closesHere = (c->indices.Array(depth) != JSON_NO_INDEX) == (ch == ']'); + if (closesHere && depth != 0) { + if (depth < c->skipDepth) { + c->skipDepth = 0; + c->matched = 1; + state = ch == ']' ? STATE_ARRAY_END : STATE_OBJECT_END; + break; + } + c->depth = depth - 1; + } + } else if (ch == '"') { + state = STATE_SKIP_STRING; + } else if (ch == ',' && depth < c->skipDepth) { + c->skipDepth = 0; + state = STATE_NEXT; + break; + } + consume(1); + ++position; + break; + } + case STATE_SKIP_STRING: { + const DecodedChar decoded = readChar(data + position, total - position); + if (decoded.IsQuote()) { + state = STATE_SKIP; + consume(1); + ++position; + break; + } + consume(decoded.consumed); + position += decoded.consumed; + break; + } + default: + consume(1); + ++position; + break; + } + } + return 0; + } +}; + +template +void ResetParserState(TContext* context) { + context->depth = 0; + for (std::uint32_t i = 0; i < JSON_MAX_DEPTH; ++i) context->indices.Array(i) = JSON_NO_INDEX; + context->firstNamedDepth = JSON_NO_INDEX; +} + +template +int InitBuffered(TContext* context, const NpJsonRuleSet* rules, char* key, std::size_t keySize, char* value, + std::size_t valueSize) { + if (context == nullptr || key == nullptr || value == nullptr) return NP_UTIL_ERROR_INVALID_ARGUMENT; + if (keySize == 0 || valueSize < JSON_MIN_VALUE_SIZE) return NP_UTIL_ERROR_BUFFER_TOO_SMALL; + std::memset(&context->valueType, 0, sizeof(TContext) - offsetof(TContext, valueType)); + context->rules = rules; + context->key = key; + context->keySize = keySize; + context->value = value; + context->valueSize = valueSize; + ResetParserState(context); + return 0; +} + +static_assert(offsetof(NpServerErrorJsonResult, code) == 4); + +constexpr NpJsonRule SERVER_ERROR_TOP[] = { + {NP_JSON_RULE_MEMBER, "error", 1}, + {0, "", 0}, +}; +constexpr NpJsonRule SERVER_ERROR_CODE[] = { + {NP_JSON_RULE_MEMBER, "code", 0}, + {0, "", 0}, +}; +constexpr NpJsonRule SERVER_ERROR_MULTI_TOP[] = { + {NP_JSON_RULE_MEMBER, "error", 1}, + {NP_JSON_RULE_MEMBER, "code", 0}, + {0, "", 0}, +}; +constexpr const NpJsonRule* SERVER_ERROR_LEVELS[] = {SERVER_ERROR_TOP, SERVER_ERROR_CODE}; +constexpr const NpJsonRule* SERVER_ERROR_MULTI_LEVELS[] = {SERVER_ERROR_MULTI_TOP, SERVER_ERROR_CODE}; +constexpr NpJsonRuleSet SERVER_ERROR_RULES = {SERVER_ERROR_LEVELS, 2}; +constexpr NpJsonRuleSet SERVER_ERROR_MULTI_RULES = {SERVER_ERROR_MULTI_LEVELS, 2}; + +int StoreServerErrorCode(const void* value, void* user) { + std::uint32_t type = 0; + std::memcpy(&type, value, sizeof(type)); + if (type != NP_JSON_NUMBER) return NP_SERVER_ERROR_JSON_BAD_CODE; + const long long code = std::strtoll(static_cast(value) + sizeof(type), nullptr, 10); + if (code < 0 || code > NP_SERVER_ERROR_CODE_MAX) return NP_SERVER_ERROR_JSON_BAD_CODE; + auto* result = static_cast(user); + result->code = static_cast(code); + result->found = 1; + return 0; +} + +int APS5_VABI ServerErrorCallback_nid_no_patch(void*, std::int32_t event, std::uint32_t depth, std::int32_t element, + const char*, const void* value, std::int32_t, void* user) { + if (event != NP_JSON_VALUE || depth != 1 || element != 0) return 0; + return StoreServerErrorCode(value, user); +} + +int APS5_VABI ServerErrorMultiCallback_nid_no_patch(void*, std::int32_t event, std::uint32_t depth, + std::int32_t element, const char*, const void* value, std::int32_t, void* user) { + if (event != NP_JSON_VALUE) return 0; + if (!(depth == 1 && element == 0) && !(depth == 0 && element == 1)) return 0; + return StoreServerErrorCode(value, user); +} + +int InitServerError(NpJsonParseContext* context, NpServerErrorJsonResult* result, const NpJsonRuleSet* rules, + NpJsonCallback callback); + +int HttpStatusError(std::int32_t httpStatus) { + if (static_cast(httpStatus) - HTTP_STATUS_FIRST < HTTP_STATUS_COUNT) + return NP_SERVER_ERROR_HTTP_BASE | httpStatus; + return NP_SERVER_ERROR_UNKNOWN; +} + +int ServerErrorCode(std::int32_t httpStatus, const char* json, std::size_t length, const NpJsonRuleSet* rules, + NpJsonCallback callback) { + if (json == nullptr || length == 0) return HttpStatusError(httpStatus); + NpJsonParseContext context{}; + NpServerErrorJsonResult result{0, NP_SERVER_ERROR_NO_CODE}; + if (InitServerError(&context, &result, rules, callback) < 0) return HttpStatusError(httpStatus); + const int parsed = JsonParser(&context).Parse(json, static_cast(length)); + if (parsed < 0) return HttpStatusError(httpStatus); + if (result.found == 0 || result.code == NP_SERVER_ERROR_NO_CODE) return HttpStatusError(httpStatus); + if (static_cast(result.code) < NP_SERVER_ERROR_CODE_LIMIT) return NP_SERVER_ERROR_BASE | result.code; + return NP_SERVER_ERROR_UNKNOWN; +} + +} // namespace + +extern "C" { + +int APS5_VABI sceNpJsonParseInit(void* guestContext, const NpJsonRuleSet* rules, NpJsonCallback callback, + void* user) { + auto* context = static_cast(guestContext); + if (context == nullptr) return NP_UTIL_ERROR_INVALID_ARGUMENT; + std::memset(context->data, 0, offsetof(NpJsonParseContext, callback) - offsetof(NpJsonParseContext, data)); + context->rules = rules; + context->callback = callback; + context->user = user; + ResetParserState(context); + return 0; +} + +int APS5_VABI sceNpJsonParse(void* guestContext, const char* data, int length) { + auto* context = static_cast(guestContext); + return JsonParser(context).Parse(data, length); +} + +int APS5_VABI sceNpJsonParseBufInit(void* guestContext, const NpJsonRuleSet* rules, char* key, + std::size_t keySize, char* value, std::size_t valueSize, NpJsonCallback callback, void* user) { + auto* context = static_cast(guestContext); + const int result = InitBuffered(context, rules, key, keySize, value, valueSize); + if (result != 0) return result; + context->callback = callback; + context->user = user; + return 0; +} + +int APS5_VABI sceNpJsonParseBuf(void* guestContext, const char* data, int length) { + auto* context = static_cast(guestContext); + return JsonParser(context).Parse(data, length); +} + +int APS5_VABI sceNpJsonParseExInit(void* guestContext, const NpJsonRuleSet* rules, char* key, + std::size_t keySize, char* value, std::size_t valueSize, NpJsonExCallback callback, void* user) { + auto* context = static_cast(guestContext); + const int result = InitBuffered(context, rules, key, keySize, value, valueSize); + if (result != 0) return result; + context->callback = callback; + context->user = user; + return 0; +} + +int APS5_VABI sceNpJsonParseEx(void* guestContext, const char* data, int length) { + auto* context = static_cast(guestContext); + return JsonParser(context).Parse(data, length); +} + +int APS5_VABI sceNpServerErrorJsonParseInit(void* guestContext, NpServerErrorJsonResult* result) { + auto* context = static_cast(guestContext); + return InitServerError(context, result, &SERVER_ERROR_RULES, ServerErrorCallback_nid_no_patch); +} + +int APS5_VABI sceNpServerErrorJsonParseMultiInit(void* guestContext, NpServerErrorJsonResult* result) { + auto* context = static_cast(guestContext); + return InitServerError(context, result, &SERVER_ERROR_MULTI_RULES, ServerErrorMultiCallback_nid_no_patch); +} + +int APS5_VABI sceNpServerErrorJsonParse(void* guestContext, const char* data, int length) { + auto* context = static_cast(guestContext); + return sceNpJsonParse(context, data, length); +} + +int APS5_VABI sceNpServerErrorJsonGetErrorCode(std::int32_t httpStatus, const char* json, std::size_t length) { + return ServerErrorCode(httpStatus, json, length, &SERVER_ERROR_RULES, ServerErrorCallback_nid_no_patch); +} + +int APS5_VABI sceNpServerErrorJsonMultiGetErrorCode(std::int32_t httpStatus, const char* json, std::size_t length) { + return ServerErrorCode(httpStatus, json, length, &SERVER_ERROR_MULTI_RULES, ServerErrorMultiCallback_nid_no_patch); +} + +} + +namespace { + +int InitServerError(NpJsonParseContext* context, NpServerErrorJsonResult* result, const NpJsonRuleSet* rules, + NpJsonCallback callback) { + if (result == nullptr) return NP_UTIL_ERROR_INVALID_ARGUMENT; + result->found = 0; + result->code = NP_SERVER_ERROR_NO_CODE; + return sceNpJsonParseInit(context, rules, callback, result); +} + +} // namespace diff --git a/core/libs/prx/libSceNpCommon/PendingExports.cpp b/core/libs/prx/libSceNpCommon/PendingExports.cpp index b6479f111b..718ddf19b7 100644 --- a/core/libs/prx/libSceNpCommon/PendingExports.cpp +++ b/core/libs/prx/libSceNpCommon/PendingExports.cpp @@ -6,6 +6,14 @@ extern "C" { +int APS5_VABI sceNpGetSandboxMode() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceNpUtilGetSandboxMode() { + NotImplemented_nid_no_patch(__func__); +} + int APS5_VABI sceNpCloseSema(void) { NotImplemented_nid_no_patch(__func__); return 0; @@ -26,66 +34,11 @@ int APS5_VABI sceNpIntSetPlatformType(void) { return 0; } -int APS5_VABI sceNpJsonParse(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI sceNpJsonParseBuf(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI sceNpJsonParseBufInit(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI sceNpJsonParseEx(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI sceNpJsonParseExInit(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI sceNpJsonParseInit(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI sceNpOpenSema(void) { NotImplemented_nid_no_patch(__func__); return 0; } -int APS5_VABI sceNpServerErrorJsonGetErrorCode(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI sceNpServerErrorJsonMultiGetErrorCode(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI sceNpServerErrorJsonParse(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI sceNpServerErrorJsonParseInit(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI sceNpServerErrorJsonParseMultiInit(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI sceNpSetPlatformType(void) { NotImplemented_nid_no_patch(__func__); return 0; diff --git a/core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp b/core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp index 4fd2925746..f0f9d3e111 100644 --- a/core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp +++ b/core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp @@ -41,11 +41,6 @@ int APS5_VABI _ZN3sce2np14JsonDocBuilderC2ERKNS0_9JsonValueE(void) { return 0; } -int APS5_VABI _ZN3sce2np18MemoryStreamReaderD0Ev(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI _ZN3sce2np7RingBuf4dtorEv(void) { NotImplemented_nid_no_patch(__func__); return 0; @@ -111,11 +106,6 @@ int APS5_VABI _ZN3sce2np3ipc17ServiceIpmiClient21DeleteRequestForAsyncEii(void) return 0; } -int APS5_VABI _ZN3sce2np18MemoryStreamWriter5WriteEPNS0_6HandleEPKvmPm(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI _ZN3sce2np15CancelableScopeD1Ev(void) { NotImplemented_nid_no_patch(__func__); return 0; @@ -196,11 +186,6 @@ int APS5_VABI _ZN3sce2np10EventQueue4ctorEv(void) { return 0; } -int APS5_VABI _ZN3sce2np12StreamReader4ReadEPNS0_6HandleEPNS0_9StreamCtxEPvmPm(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI _ZN3sce2np20BufferedStreamReaderD1Ev(void) { NotImplemented_nid_no_patch(__func__); return 0; @@ -331,11 +316,6 @@ int APS5_VABI _ZNK3sce2np10JsonString6GetStrEPcm(void) { return 0; } -int APS5_VABI _ZN3sce2np8NpCommIdC2ERK20SceNpCommunicationId(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI _ZN3sce2np10Cancelable10LockCancelEPKciS3_(void) { NotImplemented_nid_no_patch(__func__); return 0; @@ -356,11 +336,6 @@ int APS5_VABI _ZN3sce2np7RingBuf14CheckinForReadEm(void) { return 0; } -int APS5_VABI _ZN3sce2np12StreamWriter9WriteDataEPNS0_6HandleEPKvmPm(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI _ZN3sce2np6ThreadD1Ev(void) { NotImplemented_nid_no_patch(__func__); return 0; @@ -376,11 +351,6 @@ int APS5_VABI _ZN3sce2np9EventFlag3SetEm(void) { return 0; } -int APS5_VABI _ZN3sce2np9RefObjectC1Ev(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI _ZNK3sce2np7RingBuf6IsFullEv(void) { NotImplemented_nid_no_patch(__func__); return 0; @@ -481,11 +451,6 @@ int APS5_VABI _ZN3sce2np9HttpTrans21GetResponseStatusCodeEPNS0_6HandleEPi(void) return 0; } -int APS5_VABI _ZN3sce2np12StreamReader8SkipDataEPNS0_6HandleElPl(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI _ZN3sce2np13NpTitleSecretC2ERKS1_(void) { NotImplemented_nid_no_patch(__func__); return 0; @@ -536,31 +501,16 @@ int APS5_VABI _ZN3sce2np9SemaphoreD2Ev(void) { return 0; } -int APS5_VABI _ZN3sce2np18MemoryStreamReaderC1EPKvm(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI _ZN3sce2np9EventFlagD2Ev(void) { NotImplemented_nid_no_patch(__func__); return 0; } -int APS5_VABI _ZN3sce2np9RefObjectD1Ev(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI _sceNpAllocatorMalloc(void) { NotImplemented_nid_no_patch(__func__); return 0; } -int APS5_VABI _ZN3sce2np18MemoryStreamWriterD0Ev(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI _ZN3sce2npneERK10SceRtcTickRKNS0_4TimeE(void) { NotImplemented_nid_no_patch(__func__); return 0; @@ -596,11 +546,6 @@ int APS5_VABI _ZNK3sce2np10EventQueue6IsInitEv(void) { return 0; } -int APS5_VABI _ZN3sce2np18MemoryStreamWriterD1Ev(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI _ZN3sce2np8JsonBool5ClearEv(void) { NotImplemented_nid_no_patch(__func__); return 0; @@ -621,11 +566,6 @@ int APS5_VABI _ZN3sce2np13RingBufMemory7DestroyEv(void) { return 0; } -int APS5_VABI _ZN3sce2np9RefObject7ReleaseEv(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI _ZN3sce2np9LocalFileC1Ev(void) { NotImplemented_nid_no_patch(__func__); return 0; @@ -641,11 +581,6 @@ int APS5_VABI _ZN3sce2np4PathD2Ev(void) { return 0; } -int APS5_VABI _ZN3sce2np12StreamReader7ReadAllEPNS0_6HandleEPvmPm(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI _ZN3sce2np4CondD1Ev(void) { NotImplemented_nid_no_patch(__func__); return 0; @@ -701,11 +636,6 @@ int APS5_VABI _ZN3sce2np8JsonNull5ClearEv(void) { return 0; } -int APS5_VABI _ZN3sce2np18MemoryStreamWriterD2Ev(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI _ZN3sce2np4Time12GetUserClockEPS1_(void) { NotImplemented_nid_no_patch(__func__); return 0; diff --git a/core/libs/prx/libSceNpCommon/Runtime.cpp b/core/libs/prx/libSceNpCommon/Runtime.cpp index 8771da87a1..4d559d4a0c 100644 --- a/core/libs/prx/libSceNpCommon/Runtime.cpp +++ b/core/libs/prx/libSceNpCommon/Runtime.cpp @@ -100,6 +100,11 @@ constexpr int NP_ERROR_TITLE_ID_BUFFER_TOO_SMALL = static_cast(0x80559E0D); constexpr std::size_t NP_TITLE_ID_CODE_LENGTH = 9; constexpr std::size_t NP_TITLE_ID_LENGTH = 12; +void* const NpRefObjectVtable[] = { + nullptr, nullptr, + reinterpret_cast(&_ZN3sce2np9RefObjectD1Ev), reinterpret_cast(&_ZN3sce2np9RefObjectD0Ev), +}; + void* const NpTitleIdVtable[] = { nullptr, nullptr, reinterpret_cast(&_ZN3sce2np9NpTitleIdD1Ev), reinterpret_cast(&_ZN3sce2np9NpTitleIdD0Ev), @@ -128,6 +133,20 @@ int StoreTitleId(NpTitleIdObject* out, const char* text, std::size_t length, std std::memcpy(out->titleId.data + NP_TITLE_ID_CODE_LENGTH, "_00", 3); return 0; } + +void* const NpCommIdVtable[] = { + nullptr, nullptr, + reinterpret_cast(&_ZN3sce2np8NpCommIdD1Ev), reinterpret_cast(&_ZN3sce2np8NpCommIdD0Ev), +}; + +bool IsCommIdText(const char* text) { + return std::all_of(text, text + 4, IsTitleIdLetter) && std::all_of(text + 4, text + NP_TITLE_ID_CODE_LENGTH, IsTitleIdDigit) && + text[9] == '_' && IsTitleIdDigit(text[10]) && IsTitleIdDigit(text[11]); +} + +bool SameCommId(const NpCommunicationId& lhs, const NpCommunicationId& rhs) { + return std::strncmp(lhs.data, rhs.data, sizeof(lhs.data)) == 0 && lhs.num == rhs.num; +} constexpr std::size_t NP_SDK_VERSION_SIZE = 8; constexpr std::size_t NP_RFC3339_BUFFER_MIN = 0x80; constexpr std::size_t NP_USER_ID_LIST_SIZE = 20; @@ -235,6 +254,136 @@ NpAllocator MemoryHeapAllocator(NpMemoryHeap* heap) { constexpr std::size_t NP_OBJECT_HEADER_SIZE = 16; +constexpr int NP_ERROR_STREAM_BUFFER_TOO_SMALL = static_cast(0x80559E0D); +constexpr std::size_t NP_MEMORY_STREAM_SIZE = 0x20; + +void* const NpMemoryStreamReaderVtable[] = { + nullptr, nullptr, + reinterpret_cast(&_ZN3sce2np18MemoryStreamReaderD1Ev), reinterpret_cast(&_ZN3sce2np18MemoryStreamReaderD0Ev), + reinterpret_cast(&_ZN3sce2np18MemoryStreamReader4ReadEPNS0_6HandleEPvmPm), +}; + +void* const NpMemoryStreamWriterVtable[] = { + nullptr, nullptr, + reinterpret_cast(&_ZN3sce2np18MemoryStreamWriterD1Ev), reinterpret_cast(&_ZN3sce2np18MemoryStreamWriterD0Ev), + reinterpret_cast(&_ZN3sce2np18MemoryStreamWriter5WriteEPNS0_6HandleEPKvmPm), +}; +constexpr int NP_ERROR_STREAM_SHORT = static_cast(0x80559E10); +constexpr std::size_t NP_STREAM_CHUNK = 0x100; + +int StreamRead(NpStreamReader* self, void* handle, void* out, std::size_t size, std::size_t* read) { + using Read = int(APS5_VABI*)(NpStreamReader*, void*, void*, std::size_t, std::size_t*); + return reinterpret_cast(const_cast(self->vtable[2]))(self, handle, out, size, read); +} + +int StreamWrite(NpStreamWriter* self, void* handle, const void* data, std::size_t size, std::size_t* written) { + using Write = int(APS5_VABI*)(NpStreamWriter*, void*, const void*, std::size_t, std::size_t*); + return reinterpret_cast(const_cast(self->vtable[2]))(self, handle, data, size, written); +} + +int StreamNotify(NpStreamCtx* ctx, const void* data, std::size_t size) { + using Notify = int(APS5_VABI*)(NpStreamCtx*, const void*, std::size_t); + return ctx == nullptr ? 0 : reinterpret_cast(const_cast(ctx->vtable[2]))(ctx, data, size); +} + +int ReadAll(NpStreamReader* self, void* handle, NpStreamCtx* ctx, void* out, std::size_t size, std::size_t* read) { + auto* cursor = static_cast(out); + std::size_t got = 0; + std::size_t total = 0; + for (std::size_t remaining = size; remaining != 0; remaining = size - total) { + int result = StreamRead(self, handle, cursor, remaining, &got); + if (result < 0) return result; + result = StreamNotify(ctx, cursor, got); + if (result < 0) return result; + if (remaining < got) sceNpPanic(); + if (got == 0) { + *read = total; + return 0; + } + total += got; + cursor += got; + } + std::uint8_t probe = 0; + int result = StreamRead(self, handle, &probe, 1, &got); + if (result < 0) return result; + result = StreamNotify(ctx, &probe, got); + if (result < 0) return result; + if (got != 0) return NP_ERROR_STREAM_BUFFER_TOO_SMALL; + *read = size; + return 0; +} + +int SkipAll(NpStreamReader* self, void* handle, NpStreamCtx* ctx, std::int64_t* skipped) { + std::uint8_t buffer[NP_STREAM_CHUNK]; + while (true) { + std::size_t got = 0; + int result = StreamRead(self, handle, buffer, sizeof(buffer), &got); + if (result >= 0) result = StreamNotify(ctx, buffer, got); + if (skipped != nullptr) *skipped += static_cast(got); + if (result < 0) return result; + if (got == 0) return 0; + } +} + +int ReadData(NpStreamReader* self, void* handle, NpStreamCtx* ctx, void* out, std::size_t size, std::size_t* read) { + auto* bytes = static_cast(out); + std::size_t total = 0; + std::size_t got = 0; + int result = 0; + do { + result = StreamRead(self, handle, bytes + total, size - total, &got); + if (result >= 0) result = StreamNotify(ctx, bytes + total, got); + if (result < 0) break; + total += got; + } while (got != 0 && total != size); + if (result >= 0) result = total == size ? 0 : NP_ERROR_STREAM_SHORT; + if (read != nullptr) *read = total; + return result; +} + +int SkipData(NpStreamReader* self, void* handle, NpStreamCtx* ctx, std::int64_t size, std::int64_t* skipped) { + std::uint8_t buffer[NP_STREAM_CHUNK]; + int result = 0; + while (size >= 1) { + std::size_t done = 0; + result = ReadData(self, handle, ctx, buffer, std::min(static_cast(size), sizeof(buffer)), &done); + if (skipped != nullptr) *skipped += static_cast(done); + size -= static_cast(done); + if (result < 0) return result; + } + return 0; +} + +int WriteFilledData(NpStreamWriter* self, void* handle, NpStreamCtx* ctx, char fill, std::int64_t size) { + std::uint8_t buffer[NP_STREAM_CHUNK]; + std::memset(buffer, static_cast(fill), sizeof(buffer)); + while (size > 0) { + std::size_t written = 0; + int result = StreamWrite(self, handle, buffer, std::min(static_cast(size), sizeof(buffer)), &written); + if (result < 0) return result; + result = StreamNotify(ctx, buffer, written); + if (result < 0) return result; + size -= static_cast(written); + } + return 0; +} + +int WriteData(NpStreamWriter* self, void* handle, NpStreamCtx* ctx, const void* data, std::size_t size, std::size_t* written) { + const auto* bytes = static_cast(data); + std::size_t total = 0; + std::size_t got = 0; + int result = 0; + while (total < size) { + result = StreamWrite(self, handle, bytes + total, size - total, &got); + if (result >= 0) result = StreamNotify(ctx, bytes + total, got); + if (result < 0) break; + total += got; + } + if (result >= 0) result = 0; + if (written != nullptr) *written = total; + return result; +} + void* AllocateObject(std::size_t size, NpAllocator* allocator) { auto* header = static_cast(allocator->allocate(size + NP_OBJECT_HEADER_SIZE, allocator->context)); if (header == nullptr) return nullptr; @@ -862,6 +1011,65 @@ void APS5_VABI sceNpDbgDumpBinary(const void* data, std::size_t size) { std::putchar('\n'); } +void APS5_VABI _ZN3sce2np18MemoryStreamReaderC1EPKvm(NpMemoryStreamReader* self, const void* data, std::size_t size) { + self->vtable = &NpMemoryStreamReaderVtable[2]; + self->data = data; + self->size = size; + self->position = 0; +} + +void APS5_VABI _ZN3sce2np18MemoryStreamReaderC2EPKvm(NpMemoryStreamReader* self, const void* data, std::size_t size) { + _ZN3sce2np18MemoryStreamReaderC1EPKvm(self, data, size); +} + +void APS5_VABI _ZN3sce2np18MemoryStreamReaderD1Ev(NpMemoryStreamReader*) {} + +void APS5_VABI _ZN3sce2np18MemoryStreamReaderD2Ev(NpMemoryStreamReader*) {} + +void APS5_VABI _ZN3sce2np18MemoryStreamReaderD0Ev(NpMemoryStreamReader* self) { + _ZdlPvm_nid_postfix(self, NP_MEMORY_STREAM_SIZE); +} + +int APS5_VABI _ZN3sce2np18MemoryStreamReader4ReadEPNS0_6HandleEPvmPm(NpMemoryStreamReader* self, void*, void* out, std::size_t size, std::size_t* read) { + std::size_t count = 0; + if (self->position < self->size) { + count = std::min(size, self->size - self->position); + std::memcpy(out, static_cast(self->data) + self->position, count); + self->position += count; + } + *read = count; + return 0; +} + +void APS5_VABI _ZN3sce2np18MemoryStreamWriterC1EPvm(NpMemoryStreamWriter* self, void* data, std::size_t size) { + self->vtable = &NpMemoryStreamWriterVtable[2]; + self->data = data; + self->size = size; + self->position = 0; +} + +void APS5_VABI _ZN3sce2np18MemoryStreamWriterC2EPvm(NpMemoryStreamWriter* self, void* data, std::size_t size) { + _ZN3sce2np18MemoryStreamWriterC1EPvm(self, data, size); +} + +void APS5_VABI _ZN3sce2np18MemoryStreamWriterD1Ev(NpMemoryStreamWriter*) {} + +void APS5_VABI _ZN3sce2np18MemoryStreamWriterD2Ev(NpMemoryStreamWriter*) {} + +void APS5_VABI _ZN3sce2np18MemoryStreamWriterD0Ev(NpMemoryStreamWriter* self) { + _ZdlPvm_nid_postfix(self, NP_MEMORY_STREAM_SIZE); +} + +int APS5_VABI _ZN3sce2np18MemoryStreamWriter5WriteEPNS0_6HandleEPKvmPm(NpMemoryStreamWriter* self, void*, const void* data, std::size_t size, std::size_t* written) { + if (self->data != nullptr) { + const std::size_t room = self->size == 0 ? 0 : self->size - self->position; + if (room < size) return NP_ERROR_STREAM_BUFFER_TOO_SMALL; + std::memcpy(static_cast(self->data) + self->position, data, size); + } + self->position += size; + if (written != nullptr) *written = size; + return 0; +} void APS5_VABI _ZN3sce2np9NpTitleIdC1Ev(NpTitleIdObject* self) { self->vtable = &NpTitleIdVtable[2]; @@ -966,4 +1174,202 @@ bool APS5_VABI _ZN3sce2npneERKNS0_9NpTitleIdERK12SceNpTitleId(const NpTitleIdObj return !SameTitleId(lhs->titleId.data, rhs->data); } +int APS5_VABI _ZN3sce2np12StreamReader4ReadEPNS0_6HandleEPNS0_9StreamCtxEPvmPm(NpStreamReader* self, void* handle, NpStreamCtx* ctx, void* out, std::size_t size, std::size_t* read) { + int result = StreamRead(self, handle, out, size, read); + if (result < 0) return result; + if (ctx != nullptr) result = StreamNotify(ctx, out, *read); + return result < 0 ? result : 0; +} + +int APS5_VABI _ZN3sce2np12StreamReader7ReadAllEPNS0_6HandleEPvmPm(NpStreamReader* self, void* handle, void* out, std::size_t size, std::size_t* read) { + return ReadAll(self, handle, nullptr, out, size, read); +} + +int APS5_VABI _ZN3sce2np12StreamReader7ReadAllEPNS0_6HandleEPNS0_9StreamCtxEPvmPm(NpStreamReader* self, void* handle, NpStreamCtx* ctx, void* out, std::size_t size, std::size_t* read) { + return ReadAll(self, handle, ctx, out, size, read); +} + +int APS5_VABI _ZN3sce2np12StreamReader7SkipAllEPNS0_6HandleEPl(NpStreamReader* self, void* handle, std::int64_t* skipped) { + return SkipAll(self, handle, nullptr, skipped); +} + +int APS5_VABI _ZN3sce2np12StreamReader7SkipAllEPNS0_6HandleEPNS0_9StreamCtxEPl(NpStreamReader* self, void* handle, NpStreamCtx* ctx, std::int64_t* skipped) { + return SkipAll(self, handle, ctx, skipped); +} + +int APS5_VABI _ZN3sce2np12StreamReader8ReadDataEPNS0_6HandleEPvmPm(NpStreamReader* self, void* handle, void* out, std::size_t size, std::size_t* read) { + return ReadData(self, handle, nullptr, out, size, read); +} + +int APS5_VABI _ZN3sce2np12StreamReader8ReadDataEPNS0_6HandleEPNS0_9StreamCtxEPvmPm(NpStreamReader* self, void* handle, NpStreamCtx* ctx, void* out, std::size_t size, std::size_t* read) { + return ReadData(self, handle, ctx, out, size, read); +} + +int APS5_VABI _ZN3sce2np12StreamReader8SkipDataEPNS0_6HandleElPl(NpStreamReader* self, void* handle, std::int64_t size, std::int64_t* skipped) { + return SkipData(self, handle, nullptr, size, skipped); +} + +int APS5_VABI _ZN3sce2np12StreamReader8SkipDataEPNS0_6HandleEPNS0_9StreamCtxElPl(NpStreamReader* self, void* handle, NpStreamCtx* ctx, std::int64_t size, std::int64_t* skipped) { + return SkipData(self, handle, ctx, size, skipped); +} + +int APS5_VABI _ZN3sce2np12StreamWriter15WriteFilledDataEPNS0_6HandleEcl(NpStreamWriter* self, void* handle, char fill, std::int64_t size) { + return WriteFilledData(self, handle, nullptr, fill, size); +} + +int APS5_VABI _ZN3sce2np12StreamWriter15WriteFilledDataEPNS0_6HandleEPNS0_9StreamCtxEcl(NpStreamWriter* self, void* handle, NpStreamCtx* ctx, char fill, std::int64_t size) { + return WriteFilledData(self, handle, ctx, fill, size); +} + +int APS5_VABI _ZN3sce2np12StreamWriter5WriteEPNS0_6HandleEPNS0_9StreamCtxEPKvmPm(NpStreamWriter* self, void* handle, NpStreamCtx* ctx, const void* data, std::size_t size, std::size_t* written) { + int result = StreamWrite(self, handle, data, size, written); + if (result < 0) return result; + if (ctx != nullptr) result = StreamNotify(ctx, data, *written); + return result < 0 ? result : 0; +} + +int APS5_VABI _ZN3sce2np12StreamWriter9WriteDataEPNS0_6HandleEPKvmPm(NpStreamWriter* self, void* handle, const void* data, std::size_t size, std::size_t* written) { + return WriteData(self, handle, nullptr, data, size, written); +} + +int APS5_VABI _ZN3sce2np12StreamWriter9WriteDataEPNS0_6HandleEPNS0_9StreamCtxEPKvmPm(NpStreamWriter* self, void* handle, NpStreamCtx* ctx, const void* data, std::size_t size, std::size_t* written) { + return WriteData(self, handle, ctx, data, size, written); +} + +void APS5_VABI _ZN3sce2np9RefObjectC1Ev(NpRefObject* self) { + self->vtable = &NpRefObjectVtable[2]; + self->refCount = 0; +} + +void APS5_VABI _ZN3sce2np9RefObjectC2Ev(NpRefObject* self) { + _ZN3sce2np9RefObjectC1Ev(self); +} + +void APS5_VABI _ZN3sce2np9RefObjectD1Ev(NpRefObject*) {} + +void APS5_VABI _ZN3sce2np9RefObjectD2Ev(NpRefObject*) {} + +void APS5_VABI _ZN3sce2np9RefObjectD0Ev(NpRefObject* self) { + _ZN3sce2np6ObjectdlEPv(self); +} + +int APS5_VABI _ZN3sce2np9RefObject6AddRefEv(NpRefObject* self) { + return static_cast(static_cast(sceNpAtomicInc32(&self->refCount)) + 1); +} + +int APS5_VABI _ZN3sce2np9RefObject7ReleaseEv(NpRefObject* self) { + using Destroy = void(APS5_VABI*)(NpRefObject*); + const int count = static_cast(static_cast(sceNpAtomicDec32(&self->refCount)) - 1); + if (count == 0) reinterpret_cast(const_cast(self->vtable[1]))(self); + return count; +} + +int APS5_VABI sceNpUtilParseTitleId(NpCommunicationId* parts, const char* titleId) { + if (titleId == nullptr) return NP_ERROR_INVALID_ARGUMENT_UTIL; + const std::size_t length = std::strlen(titleId); + if (length < 10 || length >= NP_TITLE_ID_SIZE || titleId[9] != '_') return NP_UTIL_ERROR_OUT_OF_RANGE; + *parts = {}; + std::memcpy(parts->data, titleId, sizeof(parts->data)); + parts->num = static_cast(std::strtol(titleId + 10, nullptr, 10)); + return 0; +} + +void APS5_VABI _ZN3sce2np8NpCommIdC1Ev(NpCommIdObject* self) { + self->vtable = &NpCommIdVtable[2]; + self->commId = {}; +} + +void APS5_VABI _ZN3sce2np8NpCommIdC2Ev(NpCommIdObject* self) { + _ZN3sce2np8NpCommIdC1Ev(self); +} + +void APS5_VABI _ZN3sce2np8NpCommIdC1ERKS1_(NpCommIdObject* self, const NpCommIdObject* other) { + self->vtable = &NpCommIdVtable[2]; + self->commId = other->commId; +} + +void APS5_VABI _ZN3sce2np8NpCommIdC2ERKS1_(NpCommIdObject* self, const NpCommIdObject* other) { + _ZN3sce2np8NpCommIdC1ERKS1_(self, other); +} + +void APS5_VABI _ZN3sce2np8NpCommIdC1ERK20SceNpCommunicationId(NpCommIdObject* self, const NpCommunicationId* commId) { + self->vtable = &NpCommIdVtable[2]; + self->commId = *commId; +} + +void APS5_VABI _ZN3sce2np8NpCommIdC2ERK20SceNpCommunicationId(NpCommIdObject* self, const NpCommunicationId* commId) { + _ZN3sce2np8NpCommIdC1ERK20SceNpCommunicationId(self, commId); +} + +void APS5_VABI _ZN3sce2np8NpCommIdD1Ev(NpCommIdObject*) {} + +void APS5_VABI _ZN3sce2np8NpCommIdD2Ev(NpCommIdObject*) {} + +void APS5_VABI _ZN3sce2np8NpCommIdD0Ev(NpCommIdObject* self) { + _ZN3sce2np6ObjectdlEPv(self); +} + +void APS5_VABI _ZN3sce2np8NpCommId5ClearEv(NpCommIdObject* self) { + self->commId = {}; +} + +bool APS5_VABI _ZNK3sce2np8NpCommId7IsEmptyEv(const NpCommIdObject* self) { + return self->commId.data[0] == '\0' && self->commId.num == 0; +} + +bool APS5_VABI _ZNK3sce2np8NpCommId6EqualsEPKc(const NpCommIdObject* self, const char* commId) { + if (std::strlen(commId) != NP_TITLE_ID_LENGTH || !IsCommIdText(commId)) return false; + const auto num = static_cast(std::strtol(commId + 10, nullptr, 10)); + return self->commId.num == num && std::strncmp(self->commId.data, commId, sizeof(self->commId.data)) == 0; +} + +bool APS5_VABI _ZNK3sce2np8NpCommId6EqualsERKS1_(const NpCommIdObject* self, const NpCommIdObject* other) { + return SameCommId(self->commId, other->commId); +} + +bool APS5_VABI _ZNK3sce2np8NpCommId6EqualsERK20SceNpCommunicationId(const NpCommIdObject* self, const NpCommunicationId* commId) { + return SameCommId(self->commId, *commId); +} + +int APS5_VABI _ZN3sce2np8NpCommId5ParseEPS1_PKc(NpCommIdObject* out, const char* text) { + if (std::strlen(text) != NP_TITLE_ID_LENGTH || !IsCommIdText(text)) return NP_ERROR_TITLE_ID_INVALID; + return NpResult(sceNpUtilParseTitleId(&out->commId, text)); +} + +int APS5_VABI _ZN3sce2np8NpCommId5ParseEPS1_PKcm(NpCommIdObject* out, const char* text, std::size_t length) { + if (length != NP_TITLE_ID_LENGTH || !IsCommIdText(text)) return NP_ERROR_TITLE_ID_INVALID; + char copy[NP_TITLE_ID_LENGTH + 1] = {}; + std::memcpy(copy, text, NP_TITLE_ID_LENGTH); + return NpResult(sceNpUtilParseTitleId(&out->commId, copy)); +} + +int APS5_VABI _ZN3sce2np8NpCommId5BuildERKS1_Pcm(const NpCommIdObject* commId, char* text, std::size_t size) { + std::memset(text, 0, size); + return NpResult(sceNpUtilBuildTitleId(reinterpret_cast(&commId->commId), text, size)); +} + +bool APS5_VABI _ZN3sce2npeqERKNS0_8NpCommIdES3_(const NpCommIdObject* lhs, const NpCommIdObject* rhs) { + return SameCommId(lhs->commId, rhs->commId); +} + +bool APS5_VABI _ZN3sce2npeqERK20SceNpCommunicationIdRKNS0_8NpCommIdE(const NpCommunicationId* lhs, const NpCommIdObject* rhs) { + return SameCommId(*lhs, rhs->commId); +} + +bool APS5_VABI _ZN3sce2npeqERKNS0_8NpCommIdERK20SceNpCommunicationId(const NpCommIdObject* lhs, const NpCommunicationId* rhs) { + return SameCommId(lhs->commId, *rhs); +} + +bool APS5_VABI _ZN3sce2npneERKNS0_8NpCommIdES3_(const NpCommIdObject* lhs, const NpCommIdObject* rhs) { + return !SameCommId(lhs->commId, rhs->commId); +} + +bool APS5_VABI _ZN3sce2npneERK20SceNpCommunicationIdRKNS0_8NpCommIdE(const NpCommunicationId* lhs, const NpCommIdObject* rhs) { + return !SameCommId(*lhs, rhs->commId); +} + +bool APS5_VABI _ZN3sce2npneERKNS0_8NpCommIdERK20SceNpCommunicationId(const NpCommIdObject* lhs, const NpCommunicationId* rhs) { + return !SameCommId(lhs->commId, *rhs); +} + } diff --git a/core/libs/prx/libSceNpCommon/include/Api.hpp b/core/libs/prx/libSceNpCommon/include/Api.hpp index 96b3454420..02ca7ce914 100644 --- a/core/libs/prx/libSceNpCommon/include/Api.hpp +++ b/core/libs/prx/libSceNpCommon/include/Api.hpp @@ -47,6 +47,22 @@ struct NpIdFull { std::uint8_t reserved[8]; }; +struct NpJsonRule { + std::uint64_t kind; + const char* key; + std::uint64_t descend; +}; + +struct NpJsonRuleSet { + const NpJsonRule* const* levels; + std::uint64_t count; +}; + +using NpJsonCallback = int(APS5_VABI*)(void* context, std::int32_t event, std::uint32_t depth, std::int32_t element, + const char* key, const void* value, std::int32_t arrayIndex, void* user); +using NpJsonExCallback = int(APS5_VABI*)(void* context, std::int32_t event, std::uint32_t depth, std::int32_t element, + const char* key, const void* value, std::int32_t arrayIndex, std::uint32_t offset, void* user); + struct NpKernelMemory { std::uint64_t size; std::uint64_t reserved; @@ -58,12 +74,60 @@ struct NpMemoryHeap { NpHeap heap; }; +struct NpServerErrorJsonResult { + std::uint8_t found; + std::int32_t code; +}; + struct NpTitleIdParts { char id[9]; char reserved; std::uint8_t index; }; +struct NpMemoryStreamReader { + const void* const* vtable; + const void* data; + std::size_t size; + std::size_t position; +}; + +struct NpMemoryStreamWriter { + const void* const* vtable; + void* data; + std::size_t size; + std::size_t position; +}; + +struct NpStreamReader { + const void* const* vtable; +}; + +struct NpStreamWriter { + const void* const* vtable; +}; + +struct NpStreamCtx { + const void* const* vtable; +}; + +struct NpRefObject { + const void* const* vtable; + std::int32_t refCount; +}; + +struct NpCommunicationId { + char data[9]; + char term; + std::uint8_t num; + char dummy; +}; + +struct NpCommIdObject { + const void* const* vtable; + NpCommunicationId commId; +}; + struct NpTitleIdObject { const void* const* vtable; NpTitleId titleId; @@ -71,6 +135,9 @@ struct NpTitleIdObject { extern "C" { +int APS5_VABI sceNpGetSandboxMode(); +int APS5_VABI sceNpUtilGetSandboxMode(); + int APS5_VABI sceNpCmpOnlineId(const NpOnlineId* onlineId1, const NpOnlineId* onlineId2); int APS5_VABI sceNpCmpNpIdInOrder(const NpIdFull* npId1, const NpIdFull* npId2, std::int32_t* order); int APS5_VABI sceNpGetPlatformType(const NpIdFull* npId); @@ -96,18 +163,21 @@ int APS5_VABI sceNpCloseSema(void); int APS5_VABI sceNpGetNavSdkVersion(void); int APS5_VABI sceNpIntGetPlatformType(void); int APS5_VABI sceNpIntSetPlatformType(void); -int APS5_VABI sceNpJsonParse(void); -int APS5_VABI sceNpJsonParseBuf(void); -int APS5_VABI sceNpJsonParseBufInit(void); -int APS5_VABI sceNpJsonParseEx(void); -int APS5_VABI sceNpJsonParseExInit(void); -int APS5_VABI sceNpJsonParseInit(void); +int APS5_VABI sceNpJsonParse(void* guestContext, const char* data, int length); +int APS5_VABI sceNpJsonParseBuf(void* guestContext, const char* data, int length); +int APS5_VABI sceNpJsonParseBufInit(void* guestContext, const NpJsonRuleSet* rules, char* key, + std::size_t keySize, char* value, std::size_t valueSize, NpJsonCallback callback, void* user); +int APS5_VABI sceNpJsonParseEx(void* guestContext, const char* data, int length); +int APS5_VABI sceNpJsonParseExInit(void* guestContext, const NpJsonRuleSet* rules, char* key, + std::size_t keySize, char* value, std::size_t valueSize, NpJsonExCallback callback, void* user); +int APS5_VABI sceNpJsonParseInit(void* guestContext, const NpJsonRuleSet* rules, NpJsonCallback callback, + void* user); int APS5_VABI sceNpOpenSema(void); -int APS5_VABI sceNpServerErrorJsonGetErrorCode(void); -int APS5_VABI sceNpServerErrorJsonMultiGetErrorCode(void); -int APS5_VABI sceNpServerErrorJsonParse(void); -int APS5_VABI sceNpServerErrorJsonParseInit(void); -int APS5_VABI sceNpServerErrorJsonParseMultiInit(void); +int APS5_VABI sceNpServerErrorJsonGetErrorCode(std::int32_t httpStatus, const char* json, std::size_t length); +int APS5_VABI sceNpServerErrorJsonMultiGetErrorCode(std::int32_t httpStatus, const char* json, std::size_t length); +int APS5_VABI sceNpServerErrorJsonParse(void* guestContext, const char* data, int length); +int APS5_VABI sceNpServerErrorJsonParseInit(void* guestContext, NpServerErrorJsonResult* result); +int APS5_VABI sceNpServerErrorJsonParseMultiInit(void* guestContext, NpServerErrorJsonResult* result); int APS5_VABI sceNpSetPlatformType(void); int APS5_VABI sceNpUtilCanonicalizeNpIdForPs4(void); int APS5_VABI sceNpUtilCanonicalizeNpIdForPsp2(void); @@ -239,7 +309,6 @@ int APS5_VABI _sceNpAllocatorExRealloc(void); int APS5_VABI _ZN3sce2np8WorkItem6CancelEi(void); int APS5_VABI _ZN3sce2np9WorkQueue11GetItemByIdEi(void); int APS5_VABI _ZN3sce2np14JsonDocBuilderC2ERKNS0_9JsonValueE(void); -int APS5_VABI _ZN3sce2np18MemoryStreamReaderD0Ev(void); int APS5_VABI _ZN3sce2np7RingBuf4dtorEv(void); int APS5_VABI _ZThn16_N3sce2np9HttpTransD0Ev(void); int APS5_VABI _ZN3sce2np10MemoryFileD0Ev(void); @@ -253,7 +322,6 @@ int APS5_VABI _ZN3sce2np8WorkItem10SetRunningEv(void); int APS5_VABI _ZN3sce2np3ipc17ServiceIpmiClient21CreateRequestForAsyncEPiiPKvm(void); int APS5_VABI _ZN3sce2np18HttpConnectionPool13InvalidateAllEv(void); int APS5_VABI _ZN3sce2np3ipc17ServiceIpmiClient21DeleteRequestForAsyncEii(void); -int APS5_VABI _ZN3sce2np18MemoryStreamWriter5WriteEPNS0_6HandleEPKvmPm(void); int APS5_VABI _ZN3sce2np15CancelableScopeD1Ev(void); int APS5_VABI _ZN3sce2np8JsonFileD2Ev(void); int APS5_VABI _ZN3sce2np9JsonArray12AddItemArrayEPPS1_(void); @@ -270,7 +338,6 @@ int APS5_VABI _ZN3sce2np12HttpTemplateD1Ev(void); int APS5_VABI _ZN3sce2np9WorkQueueD2Ev(void); int APS5_VABI _ZThn16_N3sce2np9HttpTrans5WriteEPNS0_6HandleEPKvmPm(void); int APS5_VABI _ZN3sce2np10EventQueue4ctorEv(void); -int APS5_VABI _ZN3sce2np12StreamReader4ReadEPNS0_6HandleEPNS0_9StreamCtxEPvmPm(void); int APS5_VABI _ZN3sce2np20BufferedStreamReaderD1Ev(void); int APS5_VABI _ZN3sce2np3ipc10IpmiClient7ConnectEPKvm(void); int APS5_VABI _ZN3sce2np4Cond4InitEPKcPNS0_5MutexE(void); @@ -297,16 +364,13 @@ int APS5_VABI _ZN3sce2np15CancelableScopeD0Ev(void); int APS5_VABI _ZN3sce2np10Cancelable7DestroyEv(void); int APS5_VABI _ZThn8_N3sce2np9LocalFileD1Ev(void); int APS5_VABI _ZNK3sce2np10JsonString6GetStrEPcm(void); -int APS5_VABI _ZN3sce2np8NpCommIdC2ERK20SceNpCommunicationId(void); int APS5_VABI _ZN3sce2np10Cancelable10LockCancelEPKciS3_(void); int APS5_VABI _ZN3sce2np8WorkItem10SetPendingEv(void); int APS5_VABI _ZN3sce2np7Callout4StopEv(void); int APS5_VABI _ZN3sce2np7RingBuf14CheckinForReadEm(void); -int APS5_VABI _ZN3sce2np12StreamWriter9WriteDataEPNS0_6HandleEPKvmPm(void); int APS5_VABI _ZN3sce2np6ThreadD1Ev(void); int APS5_VABI _ZN3sce2npeqERK12SceNpTitleIdRKNS0_9NpTitleIdE(void); int APS5_VABI _ZN3sce2np9EventFlag3SetEm(void); -int APS5_VABI _ZN3sce2np9RefObjectC1Ev(void); int APS5_VABI _ZNK3sce2np7RingBuf6IsFullEv(void); int APS5_VABI _ZN3sce2npneERKNS0_13NpTitleSecretERK16SceNpTitleSecret(void); int APS5_VABI _ZN3sce2np9LocalFileD0Ev(void); @@ -327,7 +391,6 @@ int APS5_VABI _ZN3sce2np3ipc17ServiceIpmiClient7ConnectEPKvm(void); int APS5_VABI _ZN3sce2np7RingBufC1Ev(void); int APS5_VABI _ZN3sce2np10MemoryFileD1Ev(void); int APS5_VABI _ZN3sce2np9HttpTrans21GetResponseStatusCodeEPNS0_6HandleEPi(void); -int APS5_VABI _ZN3sce2np12StreamReader8SkipDataEPNS0_6HandleElPl(void); int APS5_VABI _ZN3sce2np13NpTitleSecretC2ERKS1_(void); int APS5_VABI _ZN3sce2np14CalloutContextD1Ev(void); int APS5_VABI _ZN3sce2np5Mutex7DestroyEv(void); @@ -338,11 +401,8 @@ int APS5_VABI _ZN3sce2np9EventFlag6CreateEPKcj(void); int APS5_VABI _ZN3sce2np3ipc17ServiceIpmiClient15RegisterServiceEPKNS1_17ServiceClientInfoE(void); int APS5_VABI _ZN3sce2np8WorkItemD0Ev(void); int APS5_VABI _ZN3sce2np9SemaphoreD2Ev(void); -int APS5_VABI _ZN3sce2np18MemoryStreamReaderC1EPKvm(void); int APS5_VABI _ZN3sce2np9EventFlagD2Ev(void); -int APS5_VABI _ZN3sce2np9RefObjectD1Ev(void); int APS5_VABI _sceNpAllocatorMalloc(void); -int APS5_VABI _ZN3sce2np18MemoryStreamWriterD0Ev(void); int APS5_VABI _ZN3sce2npneERK10SceRtcTickRKNS0_4TimeE(void); int APS5_VABI _ZN3sce2np13RingBufMemory6IsInitEv(void); int APS5_VABI _ZN3sce2np7RingBufD0Ev(void); @@ -350,16 +410,13 @@ int APS5_VABI _sceNpHeapMalloc(void); int APS5_VABI _ZN3sce2np12HttpTemplate7DestroyEv(void); int APS5_VABI _ZN3sce2np15CancelableScope5BeginEPNS0_6HandleEPKciS5_(void); int APS5_VABI _ZNK3sce2np10EventQueue6IsInitEv(void); -int APS5_VABI _ZN3sce2np18MemoryStreamWriterD1Ev(void); int APS5_VABI _ZN3sce2np8JsonBool5ClearEv(void); int APS5_VABI _ZN3sce2np9LocalFile8TruncateEl(void); int APS5_VABI _ZNK3sce2np10JsonNumber6GetNumEPcm(void); int APS5_VABI _ZN3sce2np13RingBufMemory7DestroyEv(void); -int APS5_VABI _ZN3sce2np9RefObject7ReleaseEv(void); int APS5_VABI _ZN3sce2np9LocalFileC1Ev(void); int APS5_VABI _ZN3sce2np7RingBufD2Ev(void); int APS5_VABI _ZN3sce2np4PathD2Ev(void); -int APS5_VABI _ZN3sce2np12StreamReader7ReadAllEPNS0_6HandleEPvmPm(void); int APS5_VABI _ZN3sce2np4CondD1Ev(void); int APS5_VABI _ZN3sce2np9EventFlag7DestroyEv(void); int APS5_VABI _ZN3sce2np9HttpTransC1EP16SceNpAllocatorEx(void); @@ -371,11 +428,22 @@ int APS5_VABI _ZN3sce2np9LocalFile5CloseEv(void); int APS5_VABI _ZNK3sce2np10JsonString9GetLengthEv(void); int APS5_VABI _ZN3sce2np10EventQueueD0Ev(void); int APS5_VABI _ZN3sce2np8JsonNull5ClearEv(void); -int APS5_VABI _ZN3sce2np18MemoryStreamWriterD2Ev(void); int APS5_VABI _ZN3sce2np4Time12GetUserClockEPS1_(void); int APS5_VABI _ZN3sce2np3ipc17ServiceIpmiClient12AbortRequestEii(void); int APS5_VABI _ZNK3sce2np5Mutex6IsInitEv(void); +void APS5_VABI _ZN3sce2np18MemoryStreamReaderC1EPKvm(NpMemoryStreamReader* self, const void* data, std::size_t size); +void APS5_VABI _ZN3sce2np18MemoryStreamReaderC2EPKvm(NpMemoryStreamReader* self, const void* data, std::size_t size); +void APS5_VABI _ZN3sce2np18MemoryStreamReaderD1Ev(NpMemoryStreamReader* self); +void APS5_VABI _ZN3sce2np18MemoryStreamReaderD2Ev(NpMemoryStreamReader* self); +void APS5_VABI _ZN3sce2np18MemoryStreamReaderD0Ev(NpMemoryStreamReader* self); +int APS5_VABI _ZN3sce2np18MemoryStreamReader4ReadEPNS0_6HandleEPvmPm(NpMemoryStreamReader* self, void* handle, void* out, std::size_t size, std::size_t* read); +void APS5_VABI _ZN3sce2np18MemoryStreamWriterC1EPvm(NpMemoryStreamWriter* self, void* data, std::size_t size); +void APS5_VABI _ZN3sce2np18MemoryStreamWriterC2EPvm(NpMemoryStreamWriter* self, void* data, std::size_t size); +void APS5_VABI _ZN3sce2np18MemoryStreamWriterD1Ev(NpMemoryStreamWriter* self); +void APS5_VABI _ZN3sce2np18MemoryStreamWriterD2Ev(NpMemoryStreamWriter* self); +void APS5_VABI _ZN3sce2np18MemoryStreamWriterD0Ev(NpMemoryStreamWriter* self); +int APS5_VABI _ZN3sce2np18MemoryStreamWriter5WriteEPNS0_6HandleEPKvmPm(NpMemoryStreamWriter* self, void* handle, const void* data, std::size_t size, std::size_t* written); void APS5_VABI _ZN3sce2np9NpTitleIdC1Ev(NpTitleIdObject* self); void APS5_VABI _ZN3sce2np9NpTitleIdC2Ev(NpTitleIdObject* self); void APS5_VABI _ZN3sce2np9NpTitleIdC1ERKS1_(NpTitleIdObject* self, const NpTitleIdObject* other); @@ -402,6 +470,51 @@ bool APS5_VABI _ZN3sce2npneERKNS0_9NpTitleIdES3_(const NpTitleIdObject* lhs, con bool APS5_VABI _ZN3sce2npneERK12SceNpTitleIdRKNS0_9NpTitleIdE(const NpTitleId* lhs, const NpTitleIdObject* rhs); bool APS5_VABI _ZN3sce2npneERKNS0_9NpTitleIdERK12SceNpTitleId(const NpTitleIdObject* lhs, const NpTitleId* rhs); +int APS5_VABI _ZN3sce2np12StreamReader4ReadEPNS0_6HandleEPNS0_9StreamCtxEPvmPm(NpStreamReader* self, void* handle, NpStreamCtx* ctx, void* out, std::size_t size, std::size_t* read); +int APS5_VABI _ZN3sce2np12StreamReader7ReadAllEPNS0_6HandleEPvmPm(NpStreamReader* self, void* handle, void* out, std::size_t size, std::size_t* read); +int APS5_VABI _ZN3sce2np12StreamReader7ReadAllEPNS0_6HandleEPNS0_9StreamCtxEPvmPm(NpStreamReader* self, void* handle, NpStreamCtx* ctx, void* out, std::size_t size, std::size_t* read); +int APS5_VABI _ZN3sce2np12StreamReader7SkipAllEPNS0_6HandleEPl(NpStreamReader* self, void* handle, std::int64_t* skipped); +int APS5_VABI _ZN3sce2np12StreamReader7SkipAllEPNS0_6HandleEPNS0_9StreamCtxEPl(NpStreamReader* self, void* handle, NpStreamCtx* ctx, std::int64_t* skipped); +int APS5_VABI _ZN3sce2np12StreamReader8ReadDataEPNS0_6HandleEPvmPm(NpStreamReader* self, void* handle, void* out, std::size_t size, std::size_t* read); +int APS5_VABI _ZN3sce2np12StreamReader8ReadDataEPNS0_6HandleEPNS0_9StreamCtxEPvmPm(NpStreamReader* self, void* handle, NpStreamCtx* ctx, void* out, std::size_t size, std::size_t* read); +int APS5_VABI _ZN3sce2np12StreamReader8SkipDataEPNS0_6HandleElPl(NpStreamReader* self, void* handle, std::int64_t size, std::int64_t* skipped); +int APS5_VABI _ZN3sce2np12StreamReader8SkipDataEPNS0_6HandleEPNS0_9StreamCtxElPl(NpStreamReader* self, void* handle, NpStreamCtx* ctx, std::int64_t size, std::int64_t* skipped); +int APS5_VABI _ZN3sce2np12StreamWriter15WriteFilledDataEPNS0_6HandleEcl(NpStreamWriter* self, void* handle, char fill, std::int64_t size); +int APS5_VABI _ZN3sce2np12StreamWriter15WriteFilledDataEPNS0_6HandleEPNS0_9StreamCtxEcl(NpStreamWriter* self, void* handle, NpStreamCtx* ctx, char fill, std::int64_t size); +int APS5_VABI _ZN3sce2np12StreamWriter5WriteEPNS0_6HandleEPNS0_9StreamCtxEPKvmPm(NpStreamWriter* self, void* handle, NpStreamCtx* ctx, const void* data, std::size_t size, std::size_t* written); +int APS5_VABI _ZN3sce2np12StreamWriter9WriteDataEPNS0_6HandleEPKvmPm(NpStreamWriter* self, void* handle, const void* data, std::size_t size, std::size_t* written); +int APS5_VABI _ZN3sce2np12StreamWriter9WriteDataEPNS0_6HandleEPNS0_9StreamCtxEPKvmPm(NpStreamWriter* self, void* handle, NpStreamCtx* ctx, const void* data, std::size_t size, std::size_t* written); +void APS5_VABI _ZN3sce2np9RefObjectC1Ev(NpRefObject* self); +void APS5_VABI _ZN3sce2np9RefObjectC2Ev(NpRefObject* self); +void APS5_VABI _ZN3sce2np9RefObjectD1Ev(NpRefObject* self); +void APS5_VABI _ZN3sce2np9RefObjectD2Ev(NpRefObject* self); +void APS5_VABI _ZN3sce2np9RefObjectD0Ev(NpRefObject* self); +int APS5_VABI _ZN3sce2np9RefObject6AddRefEv(NpRefObject* self); +int APS5_VABI _ZN3sce2np9RefObject7ReleaseEv(NpRefObject* self); +int APS5_VABI sceNpUtilParseTitleId(NpCommunicationId* parts, const char* titleId); +void APS5_VABI _ZN3sce2np8NpCommIdC1Ev(NpCommIdObject* self); +void APS5_VABI _ZN3sce2np8NpCommIdC2Ev(NpCommIdObject* self); +void APS5_VABI _ZN3sce2np8NpCommIdC1ERKS1_(NpCommIdObject* self, const NpCommIdObject* other); +void APS5_VABI _ZN3sce2np8NpCommIdC2ERKS1_(NpCommIdObject* self, const NpCommIdObject* other); +void APS5_VABI _ZN3sce2np8NpCommIdC1ERK20SceNpCommunicationId(NpCommIdObject* self, const NpCommunicationId* commId); +void APS5_VABI _ZN3sce2np8NpCommIdC2ERK20SceNpCommunicationId(NpCommIdObject* self, const NpCommunicationId* commId); +void APS5_VABI _ZN3sce2np8NpCommIdD1Ev(NpCommIdObject* self); +void APS5_VABI _ZN3sce2np8NpCommIdD2Ev(NpCommIdObject* self); +void APS5_VABI _ZN3sce2np8NpCommIdD0Ev(NpCommIdObject* self); +void APS5_VABI _ZN3sce2np8NpCommId5ClearEv(NpCommIdObject* self); +bool APS5_VABI _ZNK3sce2np8NpCommId7IsEmptyEv(const NpCommIdObject* self); +bool APS5_VABI _ZNK3sce2np8NpCommId6EqualsEPKc(const NpCommIdObject* self, const char* commId); +bool APS5_VABI _ZNK3sce2np8NpCommId6EqualsERKS1_(const NpCommIdObject* self, const NpCommIdObject* other); +bool APS5_VABI _ZNK3sce2np8NpCommId6EqualsERK20SceNpCommunicationId(const NpCommIdObject* self, const NpCommunicationId* commId); +int APS5_VABI _ZN3sce2np8NpCommId5ParseEPS1_PKc(NpCommIdObject* out, const char* text); +int APS5_VABI _ZN3sce2np8NpCommId5ParseEPS1_PKcm(NpCommIdObject* out, const char* text, std::size_t length); +int APS5_VABI _ZN3sce2np8NpCommId5BuildERKS1_Pcm(const NpCommIdObject* commId, char* text, std::size_t size); +bool APS5_VABI _ZN3sce2npeqERKNS0_8NpCommIdES3_(const NpCommIdObject* lhs, const NpCommIdObject* rhs); +bool APS5_VABI _ZN3sce2npeqERK20SceNpCommunicationIdRKNS0_8NpCommIdE(const NpCommunicationId* lhs, const NpCommIdObject* rhs); +bool APS5_VABI _ZN3sce2npeqERKNS0_8NpCommIdERK20SceNpCommunicationId(const NpCommIdObject* lhs, const NpCommunicationId* rhs); +bool APS5_VABI _ZN3sce2npneERKNS0_8NpCommIdES3_(const NpCommIdObject* lhs, const NpCommIdObject* rhs); +bool APS5_VABI _ZN3sce2npneERK20SceNpCommunicationIdRKNS0_8NpCommIdE(const NpCommunicationId* lhs, const NpCommIdObject* rhs); +bool APS5_VABI _ZN3sce2npneERKNS0_8NpCommIdERK20SceNpCommunicationId(const NpCommIdObject* lhs, const NpCommunicationId* rhs); [[noreturn]] void APS5_VABI sceNpPanic(void); } diff --git a/core/libs/prx/libSceNpCppWebApi/CMakeLists.txt b/core/libs/prx/libSceNpCppWebApi/CMakeLists.txt index d3ffa1ac9e..c6c7e4e41d 100644 --- a/core/libs/prx/libSceNpCppWebApi/CMakeLists.txt +++ b/core/libs/prx/libSceNpCppWebApi/CMakeLists.txt @@ -2,6 +2,18 @@ add_library(libSceNpCppWebApi SHARED EXCLUDE_FROM_ALL Export.cpp) target_include_directories(libSceNpCppWebApi PRIVATE ${LIBS_INCLUDE_DIR}) configure_windows_unwind(libSceNpCppWebApi) +if(BUILD_TESTING) + add_test_executable(guest_np_cpp_web_api_matchmaking_tests ${LIBS_INCLUDE_DIR}/tests/GuestNpCppWebApiMatchmaking.cpp) + target_include_directories(guest_np_cpp_web_api_matchmaking_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_np_cpp_web_api_matchmaking_tests PRIVATE libSceNpCppWebApi libc) + configure_windows_unwind(guest_np_cpp_web_api_matchmaking_tests) + add_test(NAME guest_np_cpp_web_api_matchmaking COMMAND guest_np_cpp_web_api_matchmaking_tests) + if(WIN32) + set_tests_properties(guest_np_cpp_web_api_matchmaking + PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() +endif() + if(MINGW) foreach(runtimeLinkFlag IN ITEMS -static-libgcc -static-libstdc++ -static) string(REPLACE "${runtimeLinkFlag}" "" CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}") @@ -14,6 +26,15 @@ if(BUILD_TESTING) target_link_libraries(guest_np_cpp_web_api_string_tests PRIVATE libSceNpCppWebApi libc) configure_windows_unwind(guest_np_cpp_web_api_string_tests) add_test(NAME guest_np_cpp_web_api_string COMMAND guest_np_cpp_web_api_string_tests) + add_test_executable(guest_np_cpp_web_api_title_cloud_storage_tests ${LIBS_INCLUDE_DIR}/tests/GuestNpCppWebApiTitleCloudStorage.cpp) + target_include_directories(guest_np_cpp_web_api_title_cloud_storage_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_np_cpp_web_api_title_cloud_storage_tests PRIVATE libSceNpCppWebApi libc) + configure_windows_unwind(guest_np_cpp_web_api_title_cloud_storage_tests) + add_test(NAME guest_np_cpp_web_api_title_cloud_storage COMMAND guest_np_cpp_web_api_title_cloud_storage_tests) + if(WIN32) + set_tests_properties(guest_np_cpp_web_api_title_cloud_storage + PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + endif() add_test(NAME guest_np_cpp_web_api_alias_append COMMAND guest_np_cpp_web_api_string_tests alias-append) add_test(NAME guest_np_cpp_web_api_alias_string_vector COMMAND guest_np_cpp_web_api_string_tests alias-vector) add_test(NAME guest_np_cpp_web_api_alias_intrusive_vector COMMAND guest_np_cpp_web_api_intrusive_ptr_tests alias-vector) diff --git a/core/libs/prx/libSceNpCppWebApi/Export.cpp b/core/libs/prx/libSceNpCppWebApi/Export.cpp index 5351d8f8c0..33b677ea4b 100644 --- a/core/libs/prx/libSceNpCppWebApi/Export.cpp +++ b/core/libs/prx/libSceNpCppWebApi/Export.cpp @@ -260,6 +260,518 @@ static int InitializeParameterWithBody(void* self, const std::uint64_t* context, return ParameterBodyMissing; } +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V113PlayerForRead19getPlayerAttributesEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V115LocationFactory6createEPNS1_6Common10LibContextEPNS5_12IntrusivePtrINS3_8LocationEEE(void* self) { + (void)self; + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V116AttributeFactory6createEPNS1_6Common10LibContextEPKcNS3_13AttributeTypeES9_PNS5_12IntrusivePtrINS3_9AttributeEEE(void* self) { + (void)self; + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody10getPlayersEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody10getPlayersEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody19getTicketAttributesEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V121PlayerForTicketCreate10setNatTypeERKi(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V121PlayerForTicketCreate11setTeamNameEPKc(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V121PlayerForTicketCreate19setPlayerAttributesERKNS1_6Common6VectorINS5_12IntrusivePtrINS3_9AttributeEEEEE(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V123SubmitTicketRequestBody11setLocationERKNS1_6Common12IntrusivePtrINS3_8LocationEEE(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V123SubmitTicketRequestBody19setTicketAttributesERKNS1_6Common6VectorINS5_12IntrusivePtrINS3_9AttributeEEEEE(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V128PlayerForTicketCreateFactory6createEPNS1_6Common10LibContextERKmNS3_8PlatformEPNS5_12IntrusivePtrINS3_21PlayerForTicketCreateEEE(void* self) { + (void)self; + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V130SubmitTicketRequestBodyFactory6createEPNS1_6Common10LibContextEPKcRKNS5_6VectorINS5_12IntrusivePtrINS3_21PlayerForTicketCreateEEEEEPNSB_INS3_23SubmitTicketRequestBodyEEE(void* self) { + (void)self; + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api12cancelTicketEiRKNS4_23ParameterToCancelTicketERNS1_6Common11TransactionINS8_15DefaultResponseENS8_12IntrusivePtrINS8_18ResponseHeaderBaseEEEEE(void* self) { + (void)self; + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api12submitTicketEiRKNS4_23ParameterToSubmitTicketERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_24SubmitTicketResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE(void* self) { + (void)self; + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api19ParameterToGetOffer10initializeEPNS1_6Common10LibContextEPKc(void* self, const std::uint64_t* context, const char* id) { + return InitializeParameter(self, context, id != nullptr); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api19ParameterToGetOffer9terminateEv(void* self) { + return TerminateParameter(self); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api19ParameterToGetOfferC1Ev(void* self) { + ConstructParameter(self); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api19ParameterToGetOfferD1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api20ParameterToGetTicket10initializeEPNS1_6Common10LibContextEPKc(void* self, const std::uint64_t* context, const char* id) { + return InitializeParameter(self, context, id != nullptr); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api20ParameterToGetTicket7setviewEPKc(void* self, const char* view) { + return SetParameterText(self, view); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api20ParameterToGetTicket9terminateEv(void* self) { + return TerminateParameter(self); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api20ParameterToGetTicketC1Ev(void* self) { + ConstructParameter(self); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api20ParameterToGetTicketD1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api23ParameterToCancelTicket10initializeEPNS1_6Common10LibContextEPKc(void* self, const std::uint64_t* context, const char* id) { + return InitializeParameter(self, context, id != nullptr); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api23ParameterToCancelTicket9terminateEv(void* self) { + return TerminateParameter(self); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api23ParameterToCancelTicketC1Ev(void* self) { + ConstructParameter(self); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api23ParameterToCancelTicketD1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api23ParameterToSubmitTicket10initializeEPNS1_6Common10LibContextENS6_12IntrusivePtrINS3_23SubmitTicketRequestBodyEEE(void* self, const std::uint64_t* context, const IntrusivePtr* body) { + return InitializeParameterWithBody(self, context, true, body); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api23ParameterToSubmitTicket9terminateEv(void* self) { + return TerminateParameter(self); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api23ParameterToSubmitTicketC1Ev(void* self) { + ConstructParameter(self); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api23ParameterToSubmitTicketD1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api8getOfferEiRKNS4_19ParameterToGetOfferERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_20GetOfferResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE(void* self) { + (void)self; + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api9getTicketEiRKNS4_20ParameterToGetTicketERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_21GetTicketResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE(void* self) { + (void)self; + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V18Location16setGameSessionIdEPKc(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V113PlayerForRead11getOnlineIdEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V113PlayerForRead11getPlatformEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V113PlayerForRead11getTeamNameEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V113PlayerForRead12getAccountIdEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V113PlayerForRead13onlineIdIsSetEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V113PlayerForRead13platformIsSetEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V113PlayerForRead13teamNameIsSetEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V113PlayerForRead14accountIdIsSetEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V113PlayerForRead21playerAttributesIsSetEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V118PlayerForOfferRead11getOnlineIdEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V118PlayerForOfferRead11getPlatformEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V118PlayerForOfferRead11getTeamNameEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V118PlayerForOfferRead11getTicketIdEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V118PlayerForOfferRead12getAccountIdEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V118PlayerForOfferRead13onlineIdIsSetEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V118PlayerForOfferRead13platformIsSetEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V118PlayerForOfferRead13teamNameIsSetEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V118PlayerForOfferRead13ticketIdIsSetEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V118PlayerForOfferRead14accountIdIsSetEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody10getOfferIdEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody11getLocationEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody11statusIsSetEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody12offerIdIsSetEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody12playersIsSetEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody13locationIsSetEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody14getRulesetNameEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody16rulesetNameIsSetEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody18getCreatedDateTimeEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody18getUpdatedDateTimeEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody20createdDateTimeIsSetEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody20updatedDateTimeIsSetEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody9getStatusEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody11getTicketIdEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody11statusIsSetEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody12getSubmitterEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody12playersIsSetEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody13ticketIdIsSetEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody14getRulesetNameEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody14submitterIsSetEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody16rulesetNameIsSetEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody18getCreatedDateTimeEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody18getUpdatedDateTimeEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody20createdDateTimeIsSetEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody20updatedDateTimeIsSetEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody21ticketAttributesIsSetEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody9getStatusEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V124SubmitTicketResponseBody11getTicketIdEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V124SubmitTicketResponseBody13ticketIdIsSetEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V18Location16getGameSessionIdEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V18Location18gameSessionIdIsSetEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V19Attribute7getNameEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V19Attribute7getTypeEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V19Attribute8getValueEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V19Submitter11getPlatformEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V19Submitter12getAccountIdEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V19Submitter13platformIsSetEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V19Submitter14accountIdIsSetEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi23ParameterToDownloadData10initializeEPNS1_6Common10LibContextEPKci(void* self, const std::uint64_t* context, const char* text, int value) { (void)value; return InitializeParameter(self, context, text != nullptr); @@ -279,6 +791,175 @@ int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi23ParameterToDow return 0; } +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V129SetDataInfoRequestBodyFactory6createEPNS1_6Common10LibContextEPvmPNS5_12IntrusivePtrINS3_22SetDataInfoRequestBodyEEE(void* self) { + (void)self; + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi10uploadDataEiRKNS4_21ParameterToUploadDataERNS1_6Common19UpStreamTransactionINS8_12IntrusivePtrINS3_22UploadDataResponseBodyEEENSA_INS4_25UploadDataResponseHeadersEEEEE(void* self) { + (void)self; + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi10uploadDataEiRKNS4_42ParameterWithBinaryRequestBodyToUploadDataERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_22UploadDataResponseBodyEEENSA_INS4_25UploadDataResponseHeadersEEEEE(void* self) { + (void)self; + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi11setDataInfoEiRKNS4_22ParameterToSetDataInfoERNS1_6Common11TransactionINS8_15DefaultResponseENS8_12IntrusivePtrINS4_26SetDataInfoResponseHeadersEEEEE(void* self) { + (void)self; + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi12downloadDataEiRKNS4_23ParameterToDownloadDataERNS1_6Common11TransactionINS8_12IntrusivePtrINS8_6BinaryEEENSA_INS4_27DownloadDataResponseHeadersEEEEE(void* self) { + (void)self; + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi21ParameterToUploadData10initializeEPNS1_6Common10LibContextEPKci(void* self, const std::uint64_t* context, const char* text, int value) { + (void)value; + return InitializeParameter(self, context, text != nullptr); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi21ParameterToUploadData21setxPsnNpServiceLabelEj(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi21ParameterToUploadData22setxPsnAtomicOperationENS5_19XPsnAtomicOperationE(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi21ParameterToUploadData9terminateEv(void* self) { + return TerminateParameter(self); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi21ParameterToUploadDataC1Ev(void* self) { + ConstructParameter(self); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi21ParameterToUploadDataD1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi21deleteMultiDataByUserEiRKNS4_32ParameterToDeleteMultiDataByUserERNS1_6Common11TransactionINS8_15DefaultResponseENS8_12IntrusivePtrINS8_18ResponseHeaderBaseEEEEE(void* self) { + (void)self; + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi22ParameterToSetDataInfo10initializeEPNS1_6Common10LibContextEPKciNS6_12IntrusivePtrINS3_22SetDataInfoRequestBodyEEE(void* self, const std::uint64_t* context, const char* text, int value, const IntrusivePtr* body) { + (void)value; + return InitializeParameterWithBody(self, context, text != nullptr, body); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi22ParameterToSetDataInfo22setxPsnAtomicOperationENS5_19XPsnAtomicOperationE(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi22ParameterToSetDataInfo24setxPsnAtomicOperationIdEPKc(void* self, const char* text) { + return SetParameterText(self, text); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi22ParameterToSetDataInfo9terminateEv(void* self) { + return TerminateParameter(self); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi22ParameterToSetDataInfoC1Ev(void* self) { + ConstructParameter(self); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi22ParameterToSetDataInfoD1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi23ParameterToDownloadData17setnpServiceLabelEj(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi32ParameterToDeleteMultiDataByUser10initializeEPNS1_6Common10LibContextEPKcSA_(void* self, const std::uint64_t* context, const char* first, const char* second) { + return InitializeParameter(self, context, first != nullptr && second != nullptr); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi32ParameterToDeleteMultiDataByUser17setnpServiceLabelEj(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi32ParameterToDeleteMultiDataByUser9terminateEv(void* self) { + return TerminateParameter(self); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi32ParameterToDeleteMultiDataByUserC1Ev(void* self) { + ConstructParameter(self); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi32ParameterToDeleteMultiDataByUserD1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi37ParameterToGetMultiDataStatusesByUser17setnpServiceLabelEj(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi42ParameterWithBinaryRequestBodyToUploadData10initializeEPNS1_6Common10LibContextEPKci(void* self, const std::uint64_t* context, const char* text, int value) { + (void)value; + return InitializeParameter(self, context, text != nullptr); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi42ParameterWithBinaryRequestBodyToUploadData14setRequestBodyEPKhm(void* self, const void* data, std::size_t size) { + if (static_cast(self)->implementation == nullptr) return ParameterNotInitialized; + if (data == nullptr && size != 0) return ParameterInvalidArgument; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi42ParameterWithBinaryRequestBodyToUploadData9terminateEv(void* self) { + return TerminateParameter(self); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi42ParameterWithBinaryRequestBodyToUploadDataC1Ev(void* self) { + ConstructParameter(self); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi42ParameterWithBinaryRequestBodyToUploadDataD1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi17TitleCloudStorage2V110DataStatus22getLastUpdatedDateTimeEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi17TitleCloudStorage2V110DataStatus7getInfoEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi25UploadDataResponseHeaders24getXPsnAtomicOperationIdEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi25UploadDataResponseHeaders24hasXPsnAtomicOperationIdEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + int APS5_VABI _ZN3sce2Np9CppWebApi6Common10InitParamsC1Ev(void* self) { (void)self; return 0; @@ -526,18 +1207,7 @@ int APS5_VABI _ZN3sce2Np9CppWebApi6Common21DownStreamTransactionINS2_12Intrusive static_assert(sizeof(CommonString) == 0x20 && offsetof(CommonString, buffer) == 0x08); static_assert(offsetof(CommonString, bufferSize) == 0x10 && offsetof(CommonString, libContext) == 0x18); -void APS5_VABI _ZN3sce2Np9CppWebApi6Common6StringC1EPNS2_10LibContextE(CommonString* self, void* libContext) { - self->referenceCount = 0; - self->buffer = nullptr; - self->bufferSize = 0; - self->libContext = libContext; -} -void APS5_VABI _ZN3sce2Np9CppWebApi6Common6StringD1Ev(CommonString* self) { - std::free(self->buffer); - self->buffer = nullptr; - self->bufferSize = 0; -} int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_12Leaderboards2V14UserEEEE8pushBackERKS8_() { return 0; @@ -836,9 +1506,6 @@ const void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common6Binary9getBinaryEv(const void return nullptr; } -const char* APS5_VABI _ZNK3sce2Np9CppWebApi6Common6String5c_strEv(const CommonString* self) { - return self->buffer != nullptr ? self->buffer : ""; -} void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_12Leaderboards2V15EntryEEEEdeEv(const void* self) { (void)self; @@ -1122,26 +1789,6 @@ int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi25joinPl return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common6String6appendEPKc(CommonString* self, const char* text) { - if (text == nullptr) return 0; - const std::size_t textLength = std::strlen(text); - const std::size_t oldLength = self->buffer != nullptr ? std::strlen(self->buffer) : 0; - const std::size_t needed = oldLength + textLength + 1; - if (needed > self->bufferSize) { - std::size_t capacity = self->bufferSize != 0 ? static_cast(self->bufferSize) : 16; - while (capacity < needed) capacity *= 2; - char* buffer = static_cast(std::malloc(capacity)); - if (buffer == nullptr) return -1; - if (oldLength != 0) std::memcpy(buffer, self->buffer, oldLength); - std::memmove(buffer + oldLength, text, textLength + 1); - std::free(self->buffer); - self->buffer = buffer; - self->bufferSize = capacity; - return 0; - } - std::memmove(self->buffer + oldLength, text, textLength + 1); - return 0; -} int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V132RequestCreatePlayerSessionPlayerEEEE8pushBackERKS8_(IntrusivePtr* self, const void* element) { return VectorPushBackIntrusivePtr(self, static_cast(element)); @@ -1173,9 +1820,6 @@ int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14 return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V126RequestPlayerSessionPlayerEEEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x30, __func__); -} int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi29ParameterToLeavePlayerSessionC1Ev(void* self) { ConstructParameter(self); @@ -1266,9 +1910,6 @@ int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi38Parame return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V126RequestPlayerSessionPlayerEEEE8pushBackERKS8_(IntrusivePtr* self, const void* element) { - return VectorPushBackIntrusivePtr(self, static_cast(element)); -} void* APS5_VABI _ZN3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_14SessionManager2V136UsersPlayerSessionsInvitationForReadEEEEppEv(void* self) { (void)self; @@ -1349,9 +1990,6 @@ void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V1 ReleaseIntrusivePtr(self, 0x00, __func__); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS2_6StringEEEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { - CopyIntrusivePtr(self, source, 0x30); -} void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_14SessionManager2V136UsersPlayerSessionsInvitationForReadEEEEdeEv(const void* self) { (void)self; @@ -1368,11 +2006,6 @@ int APS5_VABI _ZN3sce2Np9CppWebApi6Common15DefaultResponseD1Ev(void* self) { return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS2_6StringEEEEC1EPS6_PFvS8_EPNS2_10LibContextE(IntrusivePtr* self, void* body, void (APS5_VABI* deleter)(void*), void* libContext) { - self->object = body; - self->deleter = deleter; - self->libContext = libContext; -} void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V120RequestPlayerSessionEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { self->object = nullptr; @@ -1411,11 +2044,6 @@ int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_1 return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V126RequestPlayerSessionPlayerEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { - self->object = nullptr; - self->deleter = nullptr; - self->libContext = libContext; -} void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V124PlayerSessionPushContextEED1Ev(IntrusivePtr* self) { ReleaseIntrusivePtr(self, 0x00, __func__); @@ -1456,9 +2084,6 @@ void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V1 ReleaseIntrusivePtr(self, 0x00, __func__); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS2_6StringEEEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x30, __func__); -} void* APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V154GetUsersAccountIdPlayerSessionsInvitationsResponseBody14getInvitationsEv(void* self) { (void)self; @@ -2706,10 +3331,6 @@ int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrIN return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_11UserProfile2V113BasicPresenceEEEE4sizeEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V129GetPlayerSessionsResponseBodyEED1Ev(IntrusivePtr* self) { ReleaseIntrusivePtr(self, 0x00, __func__); @@ -3215,9 +3836,6 @@ void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorImEEEC1Ev(In *self = {}; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorImEEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x30, __func__); -} int APS5_VABI _ZN3sce2Np9CppWebApi6Common13ConstIteratorINS2_6StringEED2Ev(void* self) { (void)self; @@ -3259,10 +3877,6 @@ std::int64_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_15Defau return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorImEEEaSERS6_(IntrusivePtr* self, const IntrusivePtr* source) { - ReleaseIntrusivePtr(self, 0x30, __func__); - CopyIntrusivePtr(self, source, 0x30); -} int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_15DefaultResponseENS2_12IntrusivePtrINS2_18ResponseHeaderBaseEEEE5abortEv() { return TransactionNotStarted; @@ -3273,9 +3887,6 @@ int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_6StringEE5beginEv() { return 0; } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common6String5emptyEv(const CommonString* self) { - return self->buffer == nullptr || self->buffer[0] == '\0'; -} void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS2_6StringEEEE3getEv(const IntrusivePtr* self) { return self->object; @@ -3672,4 +4283,1687 @@ int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_1 return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } + + + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi15getGameSessionsEiRKNS4_26ParameterToGetGameSessionsERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_27GetGameSessionsResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi16leaveGameSessionEiRKNS4_27ParameterToLeaveGameSessionERNS1_6Common11TransactionINS8_15DefaultResponseENS8_12IntrusivePtrINS8_18ResponseHeaderBaseEEEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi18createGameSessionsEiRKNS4_29ParameterToCreateGameSessionsERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_28PostGameSessionsResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi23joinGameSessionAsPlayerEiRKNS4_34ParameterToJoinGameSessionAsPlayerERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_50PostGameSessionsSessionIdMemberPlayersResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi24setGameSessionPropertiesEiRKNS4_35ParameterToSetGameSessionPropertiesERNS1_6Common11TransactionINS8_15DefaultResponseENS8_12IntrusivePtrINS8_18ResponseHeaderBaseEEEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi26ParameterToGetGameSessions10initializeEPNS1_6Common10LibContextEPKc(void* self, const std::uint64_t* context, const char* a1) { + return InitializeParameter(self, context, a1 != nullptr); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi26ParameterToGetGameSessions9setfieldsENS1_6Common12IntrusivePtrINS6_6VectorINS6_6StringEEEEE() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi26ParameterToGetGameSessions9terminateEv(void* self) { + return TerminateParameter(self); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi26ParameterToGetGameSessionsC1Ev(void* self) { + ConstructParameter(self); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi26ParameterToGetGameSessionsD1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi27ParameterToLeaveGameSession10initializeEPNS1_6Common10LibContextEPKcSA_(void* self, const std::uint64_t* context, ...) { + return InitializeParameter(self, context, true); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi27ParameterToLeaveGameSession9terminateEv(void* self) { + return TerminateParameter(self); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi27ParameterToLeaveGameSessionC1Ev(void* self) { + ConstructParameter(self); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi27ParameterToLeaveGameSessionD1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi29ParameterToCreateGameSessions10initializeEPNS1_6Common10LibContextENS6_12IntrusivePtrINS3_27PostGameSessionsRequestBodyEEE(void* self, const std::uint64_t* context, ...) { + return InitializeParameter(self, context, true); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi29ParameterToCreateGameSessions9terminateEv(void* self) { + return TerminateParameter(self); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi29ParameterToCreateGameSessionsC1Ev(void* self) { + ConstructParameter(self); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi29ParameterToCreateGameSessionsD1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi34ParameterToJoinGameSessionAsPlayer10initializeEPNS1_6Common10LibContextEPKcNS6_12IntrusivePtrINS3_49PostGameSessionsSessionIdMemberPlayersRequestBodyEEE(void* self, const std::uint64_t* context, ...) { + return InitializeParameter(self, context, true); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi34ParameterToJoinGameSessionAsPlayer9terminateEv(void* self) { + return TerminateParameter(self); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi34ParameterToJoinGameSessionAsPlayerC1Ev(void* self) { + ConstructParameter(self); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi34ParameterToJoinGameSessionAsPlayerD1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi35ParameterToSetGameSessionProperties10initializeEPNS1_6Common10LibContextEPKcNS6_12IntrusivePtrINS3_37PatchGameSessionsSessionIdRequestBodyEEE(void* self, const std::uint64_t* context, ...) { + return InitializeParameter(self, context, true); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi35ParameterToSetGameSessionProperties9terminateEv(void* self) { + return TerminateParameter(self); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi35ParameterToSetGameSessionPropertiesC1Ev(void* self) { + ConstructParameter(self); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi35ParameterToSetGameSessionPropertiesD1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V118RequestGameSession14setCustomData1EPKvm() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V118RequestGameSession14setCustomData2EPKvm() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V118RequestGameSession16setMaxSpectatorsERKi() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V118RequestGameSession19setUsePlayerSessionERKb() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V120RequestPlayerSession16setSwapSupportedERKb() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V120RequestPlayerSession19setLeaderPrivilegesERKNS1_6Common6VectorINS5_6StringEEE() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V124RequestGameSessionPlayer12setJoinStateERKNS3_16InitialJoinStateE() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V124RequestGameSessionPlayer15setPushContextsERKNS1_6Common6VectorINS5_12IntrusivePtrINS3_22GameSessionPushContextEEEEE() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V125RequestGameSessionFactory6createEPNS1_6Common10LibContextEiNS5_12IntrusivePtrINS3_30RequestGameSessionMemberPlayerEEERKNS5_6VectorINS5_6StringEEEPNS8_INS3_18RequestGameSessionEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V127GetGameSessionsResponseBody15getGameSessionsEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V128PostGameSessionsResponseBody15getGameSessionsEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V128RequestJoinGameSessionPlayer12setJoinStateERKNS3_16InitialJoinStateE() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V128RequestJoinGameSessionPlayer15setPushContextsERKNS1_6Common6VectorINS5_12IntrusivePtrINS3_22GameSessionPushContextEEEEE() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V129GameSessionPushContextFactory6createEPNS1_6Common10LibContextEPKcPNS5_12IntrusivePtrINS3_22GameSessionPushContextEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V131RequestGameSessionPlayerFactory6createEPNS1_6Common10LibContextEPKcS9_PNS5_12IntrusivePtrINS3_24RequestGameSessionPlayerEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V134PostGameSessionsRequestBodyFactory6createEPNS1_6Common10LibContextERKNS5_6VectorINS5_12IntrusivePtrINS3_18RequestGameSessionEEEEEPNS9_INS3_27PostGameSessionsRequestBodyEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V135RequestJoinGameSessionPlayerFactory6createEPNS1_6Common10LibContextEPKcS9_PNS5_12IntrusivePtrINS3_28RequestJoinGameSessionPlayerEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V137PatchGameSessionsSessionIdRequestBody14setCustomData1EPKvm() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V137PatchGameSessionsSessionIdRequestBody14setCustomData2EPKvm() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V137PatchGameSessionsSessionIdRequestBody16setMaxSpectatorsERKi() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V137RequestGameSessionMemberPlayerFactory6createEPNS1_6Common10LibContextERKNS5_6VectorINS5_12IntrusivePtrINS3_24RequestGameSessionPlayerEEEEEPNS9_INS3_30RequestGameSessionMemberPlayerEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V139PatchPlayerSessionsSessionIdRequestBody14setCustomData1EPKvm() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V139PatchPlayerSessionsSessionIdRequestBody14setCustomData2EPKvm() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V139PatchPlayerSessionsSessionIdRequestBody16setMaxSpectatorsERKi() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V144PatchGameSessionsSessionIdRequestBodyFactory6createEPNS1_6Common10LibContextEPNS5_12IntrusivePtrINS3_37PatchGameSessionsSessionIdRequestBodyEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V156PostGameSessionsSessionIdMemberPlayersRequestBodyFactory6createEPNS1_6Common10LibContextERKNS5_6VectorINS5_12IntrusivePtrINS3_28RequestJoinGameSessionPlayerEEEEEPNS9_INS3_49PostGameSessionsSessionIdMemberPlayersRequestBodyEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11Matchmaking2V120GetOfferResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11Matchmaking2V120GetOfferResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11Matchmaking2V120GetOfferResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11Matchmaking2V124SubmitTicketResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11Matchmaking2V124SubmitTicketResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11Matchmaking2V124SubmitTicketResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V125GetPublicProfilesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEEENS4_INS6_9RecordApi26RecordScoreResponseHeadersEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSD_ESD_() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V127GetGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V127GetGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V127GetGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V128PostGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V128PostGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V128PostGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V129GetPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V130PostPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V150PostGameSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V150PostGameSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V150PostGameSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V150PostPlayerSessionsSessionIdInvitationsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V152PostPlayerSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_7Matches2V119CreateMatchResponseEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_7Matches2V119CreateMatchResponseEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_7Matches2V119CreateMatchResponseEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS2_6VectorINS4_INS1_13InGameCatalog2V59ContainerEEEEEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliSB_PvEPFvliSF_ESF_() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_15DefaultResponseENS2_12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi26SetDataInfoResponseHeadersEEEEC1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_15DefaultResponseENS2_12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi26SetDataInfoResponseHeadersEEEED1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_15DefaultResponseENS2_12IntrusivePtrINS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS4_PvEPFvliS9_ES9_() { + return 0; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11Matchmaking2V121PlayerForTicketCreateEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11Matchmaking2V121PlayerForTicketCreateEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11Matchmaking2V123SubmitTicketRequestBodyEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, ReferenceCountOffset); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11Matchmaking2V123SubmitTicketRequestBodyEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11Matchmaking2V123SubmitTicketRequestBodyEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11Matchmaking2V19AttributeEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11Matchmaking2V19AttributeEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V114RepresentativeEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V118MatchmakingForReadEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V118RequestGameSessionEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V118RequestGameSessionEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V122GameSessionPushContextEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, ReferenceCountOffset); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V122GameSessionPushContextEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V122GameSessionPushContextEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V124PlayerSessionPushContextEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, ReferenceCountOffset); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V124RequestGameSessionPlayerEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V124RequestGameSessionPlayerEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V127PostGameSessionsRequestBodyEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, ReferenceCountOffset); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V127PostGameSessionsRequestBodyEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V127PostGameSessionsRequestBodyEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V128RequestJoinGameSessionPlayerEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V128RequestJoinGameSessionPlayerEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V130RequestGameSessionMemberPlayerEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, ReferenceCountOffset); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V130RequestGameSessionMemberPlayerEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V130RequestGameSessionMemberPlayerEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V137PatchGameSessionsSessionIdRequestBodyEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, ReferenceCountOffset); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V137PatchGameSessionsSessionIdRequestBodyEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V137PatchGameSessionsSessionIdRequestBodyEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V149PostGameSessionsSessionIdMemberPlayersRequestBodyEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, ReferenceCountOffset); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V149PostGameSessionsSessionIdMemberPlayersRequestBodyEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V149PostGameSessionsSessionIdMemberPlayersRequestBodyEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_15ProfanityFilter2V223FilterProfanityResponseEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_15ProfanityFilter2V223FilterProfanityResponseEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_17TitleCloudStorage2V122SetDataInfoRequestBodyEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, ReferenceCountOffset); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_17TitleCloudStorage2V122SetDataInfoRequestBodyEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_17TitleCloudStorage2V122SetDataInfoRequestBodyEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi25UploadDataResponseHeadersEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi25UploadDataResponseHeadersEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V111AddedPlayerEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V111AddedPlayerEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V113RemovedPlayerEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V113RemovedPlayerEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V113RequestMemberEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V113RequestMemberEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V116JoinMatchRequestEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, ReferenceCountOffset); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V116JoinMatchRequestEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V116JoinMatchRequestEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V116RequestMatchTeamEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V116RequestMatchTeamEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V117LeaveMatchRequestEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, ReferenceCountOffset); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V117LeaveMatchRequestEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V117LeaveMatchRequestEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V118CreateMatchRequestEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, ReferenceCountOffset); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V118CreateMatchRequestEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V118CreateMatchRequestEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V118RequestMatchPlayerEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V118RequestMatchPlayerEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V118RequestTeamResultsEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V118RequestTeamResultsEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V119AdditionalStatisticEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V119AdditionalStatisticEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V119RequestInGameRosterEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V119RequestInGameRosterEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V119RequestMatchResultsEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, ReferenceCountOffset); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V119RequestMatchResultsEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V119RequestMatchResultsEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V120ReportResultsRequestEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, ReferenceCountOffset); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V120ReportResultsRequestEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V120ReportResultsRequestEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V120RequestPlayerResultsEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V120RequestPlayerResultsEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V120RequestTeamStatisticEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V120RequestTeamStatisticEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V122RequestMatchStatisticsEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V122RequestMatchStatisticsEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V122RequestPlayerStatisticEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V122RequestPlayerStatisticEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V123RequestTeamMemberResultEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V123RequestTeamMemberResultEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V124RequestCompetitiveResultEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V124RequestCompetitiveResultEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V124UpdateMatchDetailRequestEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, ReferenceCountOffset); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V124UpdateMatchDetailRequestEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V124UpdateMatchDetailRequestEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V124UpdateMatchStatusRequestEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, ReferenceCountOffset); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V124UpdateMatchStatusRequestEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V124UpdateMatchStatusRequestEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V126RequestTeamMemberStatisticEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V126RequestTeamMemberStatisticEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_13InGameCatalog2V59ContainerEEEEEEC1ERSA_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, 0x30); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V111GameSessionEEEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V118GameSessionForReadEEEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11Matchmaking2V120GetOfferResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11Matchmaking2V120GetOfferResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11Matchmaking2V120GetOfferResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { + return TransactionNotStarted; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11Matchmaking2V124SubmitTicketResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11Matchmaking2V124SubmitTicketResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11Matchmaking2V124SubmitTicketResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { + return TransactionNotStarted; +} + + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEEENS4_INS6_9RecordApi26RecordScoreResponseHeadersEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V127GetGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V127GetGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V127GetGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { + return TransactionNotStarted; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V128PostGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V128PostGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V128PostGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { + return TransactionNotStarted; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V129GetPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V130PostPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V150PostGameSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V150PostGameSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V150PostGameSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { + return TransactionNotStarted; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V150PostPlayerSessionsSessionIdInvitationsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V152PostPlayerSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_17TitleCloudStorage2V122UploadDataResponseBodyEEENS4_INS6_7DataApi25UploadDataResponseHeadersEEEE6finishEv() { + return TransactionNotStarted; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_7Matches2V119CreateMatchResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_7Matches2V119CreateMatchResponseEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { + return TransactionNotStarted; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_15DefaultResponseENS2_12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi26SetDataInfoResponseHeadersEEEE5startEPNS2_10LibContextE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_15DefaultResponseENS2_12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi26SetDataInfoResponseHeadersEEEE6finishEv() { + return TransactionNotStarted; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_15DefaultResponseENS2_12IntrusivePtrINS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common19UpStreamTransactionINS2_12IntrusivePtrINS1_17TitleCloudStorage2V122UploadDataResponseBodyEEENS4_INS6_7DataApi25UploadDataResponseHeadersEEEE5startEPNS2_10LibContextEm() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common19UpStreamTransactionINS2_12IntrusivePtrINS1_17TitleCloudStorage2V122UploadDataResponseBodyEEENS4_INS6_7DataApi25UploadDataResponseHeadersEEEE8sendDataEPKvm() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common19UpStreamTransactionINS2_12IntrusivePtrINS1_17TitleCloudStorage2V122UploadDataResponseBodyEEENS4_INS6_7DataApi25UploadDataResponseHeadersEEEEC1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common19UpStreamTransactionINS2_12IntrusivePtrINS1_17TitleCloudStorage2V122UploadDataResponseBodyEEENS4_INS6_7DataApi25UploadDataResponseHeadersEEEED1Ev(void* self) { + (void)self; + return 0; +} + + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_11Matchmaking2V121PlayerForTicketCreateEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element) { + return VectorPushBackIntrusivePtr(self, element); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_11Matchmaking2V121PlayerForTicketCreateEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_11Matchmaking2V121PlayerForTicketCreateEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_11Matchmaking2V19AttributeEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element) { + return VectorPushBackIntrusivePtr(self, element); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_11Matchmaking2V19AttributeEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_11Matchmaking2V19AttributeEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); +} + +void* APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V111GameSessionEEEEixEm(void* self, std::uint64_t index) { + return HostVectorElement(self, index, __func__); +} + +void* APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V118GameSessionForReadEEEEixEm(void* self, std::uint64_t index) { + return HostVectorElement(self, index, __func__); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V118RequestGameSessionEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element) { + return VectorPushBackIntrusivePtr(self, element); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V118RequestGameSessionEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V118RequestGameSessionEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); +} + +void* APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V120PlayerSessionForReadEEEEixEm(void* self, std::uint64_t index) { + return HostVectorElement(self, index, __func__); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V122GameSessionPushContextEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element) { + return VectorPushBackIntrusivePtr(self, element); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V122GameSessionPushContextEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V122GameSessionPushContextEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V124RequestGameSessionPlayerEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element) { + return VectorPushBackIntrusivePtr(self, element); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V124RequestGameSessionPlayerEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V124RequestGameSessionPlayerEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V128RequestJoinGameSessionPlayerEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element) { + return VectorPushBackIntrusivePtr(self, element); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V128RequestJoinGameSessionPlayerEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V128RequestJoinGameSessionPlayerEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V111AddedPlayerEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element) { + return VectorPushBackIntrusivePtr(self, element); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V111AddedPlayerEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V111AddedPlayerEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V113RemovedPlayerEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element) { + return VectorPushBackIntrusivePtr(self, element); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V113RemovedPlayerEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V113RemovedPlayerEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V113RequestMemberEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element) { + return VectorPushBackIntrusivePtr(self, element); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V113RequestMemberEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V113RequestMemberEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V116RequestMatchTeamEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element) { + return VectorPushBackIntrusivePtr(self, element); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V116RequestMatchTeamEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V116RequestMatchTeamEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V118RequestMatchPlayerEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element) { + return VectorPushBackIntrusivePtr(self, element); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V118RequestMatchPlayerEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V118RequestMatchPlayerEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V118RequestTeamResultsEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element) { + return VectorPushBackIntrusivePtr(self, element); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V118RequestTeamResultsEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V118RequestTeamResultsEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V119AdditionalStatisticEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element) { + return VectorPushBackIntrusivePtr(self, element); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V119AdditionalStatisticEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V119AdditionalStatisticEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V120RequestPlayerResultsEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element) { + return VectorPushBackIntrusivePtr(self, element); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V120RequestPlayerResultsEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V120RequestPlayerResultsEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V120RequestTeamStatisticEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element) { + return VectorPushBackIntrusivePtr(self, element); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V120RequestTeamStatisticEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V120RequestTeamStatisticEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V122RequestPlayerStatisticEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element) { + return VectorPushBackIntrusivePtr(self, element); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V122RequestPlayerStatisticEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V122RequestPlayerStatisticEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V123RequestTeamMemberResultEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element) { + return VectorPushBackIntrusivePtr(self, element); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V123RequestTeamMemberResultEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V123RequestTeamMemberResultEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V126RequestTeamMemberStatisticEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element) { + return VectorPushBackIntrusivePtr(self, element); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V126RequestTeamMemberStatisticEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V126RequestTeamMemberStatisticEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_6StringEE7reserveEi() { + return 0; +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +int APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V114PersonalDetail11getLastNameEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V114PersonalDetail12getFirstNameEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V114PersonalDetail13getMiddleNameEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +bool APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V114PersonalDetail13lastNameIsSetEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return false; +} + +bool APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V114PersonalDetail14firstNameIsSetEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return false; +} + +bool APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V114PersonalDetail15middleNameIsSetEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return false; +} + + + + + + + + + + + + + +int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V111GameSession12getSessionIdEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V114Representative11getOnlineIdEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V114Representative12getAccountIdEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V118GameSessionForRead14getCustomData1Ev(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V118GameSessionForRead14getCustomData2Ev(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V118GameSessionForRead14getMatchmakingEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +bool APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V118GameSessionForRead16customData1IsSetEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return false; +} + +bool APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V118GameSessionForRead16customData2IsSetEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return false; +} + +bool APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V118GameSessionForRead16matchmakingIsSetEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return false; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V118GameSessionForRead17getRepresentativeEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +bool APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V118GameSessionForRead19representativeIsSetEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return false; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V118LeaderWithOnlineId11getOnlineIdEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V118MatchmakingForRead10getOfferIdEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +bool APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V120PlayerSessionForRead11leaderIsSetEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return false; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_15ProfanityFilter2V223FilterProfanityResponseEEENS4_INS2_18ResponseHeaderBaseEEEE11getResponseERS8_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11Matchmaking2V121PlayerForTicketCreateEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11Matchmaking2V123SubmitTicketRequestBodyEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11Matchmaking2V124SubmitTicketResponseBodyEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V19RecordApi26RecordScoreResponseHeadersEE3getEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V111GameSessionEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V114RepresentativeEEptEv(const IntrusivePtr* self) { + return self->object; +} + +bool APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V118GameSessionForReadEEcvbEv(const IntrusivePtr* self) { + return self->object != nullptr; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V118GameSessionForReadEEdeEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V118GameSessionForReadEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V118MatchmakingForReadEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V118RequestGameSessionEEptEv(const IntrusivePtr* self) { + return self->object; +} + +bool APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V120PlayerSessionForReadEEcvbEv(const IntrusivePtr* self) { + return self->object != nullptr; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V120PlayerSessionForReadEEdeEv(const IntrusivePtr* self) { + return self->object; +} + +bool APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V122GameSessionPushContextEEcvbEv(const IntrusivePtr* self) { + return self->object != nullptr; +} + +bool APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V124PlayerSessionPushContextEEcvbEv(const IntrusivePtr* self) { + return self->object != nullptr; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V124RequestGameSessionPlayerEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V127GetGameSessionsResponseBodyEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V128PostGameSessionsResponseBodyEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V128RequestJoinGameSessionPlayerEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V137PatchGameSessionsSessionIdRequestBodyEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi25UploadDataResponseHeadersEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V111AddedPlayerEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V113RemovedPlayerEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V116JoinMatchRequestEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V116RequestMatchTeamEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V117LeaveMatchRequestEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V118CreateMatchRequestEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V118RequestMatchPlayerEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V118RequestTeamResultsEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V119CreateMatchResponseEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V119RequestInGameRosterEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V119RequestMatchResultsEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V120ReportResultsRequestEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V120RequestPlayerResultsEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V120RequestTeamStatisticEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V122RequestMatchStatisticsEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V124RequestCompetitiveResultEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V124UpdateMatchDetailRequestEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V124UpdateMatchStatusRequestEEptEv(const IntrusivePtr* self) { + return self->object; +} + + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_12Leaderboards2V15EntryEEEEEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V111GameSessionEEEEEEdeEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V118GameSessionForReadEEEEEEdeEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V118GameSessionForReadEEEEEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V120PlayerSessionForReadEEEEEEdeEv(const IntrusivePtr* self) { + return self->object; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11Matchmaking2V120GetOfferResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11Matchmaking2V124SubmitTicketResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V125GetPublicProfilesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V127GetGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V128PostGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V129GetPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V130PostPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V150PostGameSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V150PostPlayerSessionsSessionIdInvitationsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V152PostPlayerSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_17TitleCloudStorage2V122UploadDataResponseBodyEEENS4_INS6_7DataApi25UploadDataResponseHeadersEEEE18getResponseHeadersERSB_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_15DefaultResponseENS2_12IntrusivePtrINS2_18ResponseHeaderBaseEEEE18getResponseHeadersERS7_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + + +std::size_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_12Leaderboards2V15EntryEEEE4sizeEv(const void* self) { + return HostVectorSize(self, __func__); +} + +std::size_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_13InGameCatalog2V57ProductEEEE4sizeEv(const void* self) { + return HostVectorSize(self, __func__); +} + +std::size_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V118GameSessionForReadEEEE4sizeEv(const void* self) { + return HostVectorSize(self, __func__); +} + +std::size_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V120PlayerSessionForReadEEEE4sizeEv(const void* self) { + return HostVectorSize(self, __func__); +} + +std::size_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V113RequestMemberEEEE4sizeEv(const void* self) { + return HostVectorSize(self, __func__); +} + +std::size_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V116RequestMatchTeamEEEE4sizeEv(const void* self) { + return HostVectorSize(self, __func__); +} + +std::size_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V118RequestMatchPlayerEEEE4sizeEv(const void* self) { + return HostVectorSize(self, __func__); +} + +std::size_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V120RequestTeamStatisticEEEE4sizeEv(const void* self) { + return HostVectorSize(self, __func__); +} + + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6StringC1EPNS2_10LibContextE(CommonString* self, void* libContext) { + self->referenceCount = 0; + self->buffer = nullptr; + self->bufferSize = 0; + self->libContext = libContext; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6StringD1Ev(CommonString* self) { + std::free(self->buffer); + self->buffer = nullptr; + self->bufferSize = 0; +} + +const char* APS5_VABI _ZNK3sce2Np9CppWebApi6Common6String5c_strEv(const CommonString* self) { + return self->buffer != nullptr ? self->buffer : ""; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6String6appendEPKc(CommonString* self, const char* text) { + if (text == nullptr) return 0; + const std::size_t textLength = std::strlen(text); + const std::size_t oldLength = self->buffer != nullptr ? std::strlen(self->buffer) : 0; + const std::size_t needed = oldLength + textLength + 1; + if (needed > self->bufferSize) { + std::size_t capacity = self->bufferSize != 0 ? static_cast(self->bufferSize) : 16; + while (capacity < needed) capacity *= 2; + char* buffer = static_cast(std::malloc(capacity)); + if (buffer == nullptr) return -1; + if (oldLength != 0) std::memcpy(buffer, self->buffer, oldLength); + std::memmove(buffer + oldLength, text, textLength + 1); + std::free(self->buffer); + self->buffer = buffer; + self->bufferSize = capacity; + return 0; + } + std::memmove(self->buffer + oldLength, text, textLength + 1); + return 0; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V126RequestPlayerSessionPlayerEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V126RequestPlayerSessionPlayerEEEE8pushBackERKS8_(IntrusivePtr* self, const void* element) { + return VectorPushBackIntrusivePtr(self, static_cast(element)); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS2_6StringEEEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, 0x30); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS2_6StringEEEEC1EPS6_PFvS8_EPNS2_10LibContextE(IntrusivePtr* self, void* body, void (APS5_VABI* deleter)(void*), void* libContext) { + self->object = body; + self->deleter = deleter; + self->libContext = libContext; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V126RequestPlayerSessionPlayerEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS2_6StringEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_11UserProfile2V113BasicPresenceEEEE4sizeEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorImEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorImEEEaSERS6_(IntrusivePtr* self, const IntrusivePtr* source) { + ReleaseIntrusivePtr(self, 0x30, __func__); + CopyIntrusivePtr(self, source, 0x30); +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common6String5emptyEv(const CommonString* self) { + return self->buffer == nullptr || self->buffer[0] == '\0'; +} } diff --git a/core/libs/prx/libSceNpCppWebApi/include/Api.hpp b/core/libs/prx/libSceNpCppWebApi/include/Api.hpp index 9750c96de1..c5844039e4 100644 --- a/core/libs/prx/libSceNpCppWebApi/include/Api.hpp +++ b/core/libs/prx/libSceNpCppWebApi/include/Api.hpp @@ -18,6 +18,99 @@ struct IntrusivePtr { extern "C" { int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V111UserFactory6createEPNS1_6Common10LibContextEPNS5_12IntrusivePtrINS3_4UserEEE(); + +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V113PlayerForRead19getPlayerAttributesEv(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V115LocationFactory6createEPNS1_6Common10LibContextEPNS5_12IntrusivePtrINS3_8LocationEEE(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V116AttributeFactory6createEPNS1_6Common10LibContextEPKcNS3_13AttributeTypeES9_PNS5_12IntrusivePtrINS3_9AttributeEEE(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody10getPlayersEv(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody10getPlayersEv(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody19getTicketAttributesEv(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V121PlayerForTicketCreate10setNatTypeERKi(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V121PlayerForTicketCreate11setTeamNameEPKc(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V121PlayerForTicketCreate19setPlayerAttributesERKNS1_6Common6VectorINS5_12IntrusivePtrINS3_9AttributeEEEEE(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V123SubmitTicketRequestBody11setLocationERKNS1_6Common12IntrusivePtrINS3_8LocationEEE(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V123SubmitTicketRequestBody19setTicketAttributesERKNS1_6Common6VectorINS5_12IntrusivePtrINS3_9AttributeEEEEE(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V128PlayerForTicketCreateFactory6createEPNS1_6Common10LibContextERKmNS3_8PlatformEPNS5_12IntrusivePtrINS3_21PlayerForTicketCreateEEE(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V130SubmitTicketRequestBodyFactory6createEPNS1_6Common10LibContextEPKcRKNS5_6VectorINS5_12IntrusivePtrINS3_21PlayerForTicketCreateEEEEEPNSB_INS3_23SubmitTicketRequestBodyEEE(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api12cancelTicketEiRKNS4_23ParameterToCancelTicketERNS1_6Common11TransactionINS8_15DefaultResponseENS8_12IntrusivePtrINS8_18ResponseHeaderBaseEEEEE(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api12submitTicketEiRKNS4_23ParameterToSubmitTicketERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_24SubmitTicketResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api19ParameterToGetOffer10initializeEPNS1_6Common10LibContextEPKc(void* self, const std::uint64_t* context, const char* id); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api19ParameterToGetOffer9terminateEv(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api19ParameterToGetOfferC1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api19ParameterToGetOfferD1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api20ParameterToGetTicket10initializeEPNS1_6Common10LibContextEPKc(void* self, const std::uint64_t* context, const char* id); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api20ParameterToGetTicket7setviewEPKc(void* self, const char* view); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api20ParameterToGetTicket9terminateEv(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api20ParameterToGetTicketC1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api20ParameterToGetTicketD1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api23ParameterToCancelTicket10initializeEPNS1_6Common10LibContextEPKc(void* self, const std::uint64_t* context, const char* id); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api23ParameterToCancelTicket9terminateEv(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api23ParameterToCancelTicketC1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api23ParameterToCancelTicketD1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api23ParameterToSubmitTicket10initializeEPNS1_6Common10LibContextENS6_12IntrusivePtrINS3_23SubmitTicketRequestBodyEEE(void* self, const std::uint64_t* context, const IntrusivePtr* body); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api23ParameterToSubmitTicket9terminateEv(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api23ParameterToSubmitTicketC1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api23ParameterToSubmitTicketD1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api8getOfferEiRKNS4_19ParameterToGetOfferERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_20GetOfferResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api9getTicketEiRKNS4_20ParameterToGetTicketERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_21GetTicketResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V18Location16setGameSessionIdEPKc(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V113PlayerForRead11getOnlineIdEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V113PlayerForRead11getPlatformEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V113PlayerForRead11getTeamNameEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V113PlayerForRead12getAccountIdEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V113PlayerForRead13onlineIdIsSetEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V113PlayerForRead13platformIsSetEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V113PlayerForRead13teamNameIsSetEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V113PlayerForRead14accountIdIsSetEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V113PlayerForRead21playerAttributesIsSetEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V118PlayerForOfferRead11getOnlineIdEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V118PlayerForOfferRead11getPlatformEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V118PlayerForOfferRead11getTeamNameEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V118PlayerForOfferRead11getTicketIdEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V118PlayerForOfferRead12getAccountIdEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V118PlayerForOfferRead13onlineIdIsSetEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V118PlayerForOfferRead13platformIsSetEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V118PlayerForOfferRead13teamNameIsSetEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V118PlayerForOfferRead13ticketIdIsSetEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V118PlayerForOfferRead14accountIdIsSetEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody10getOfferIdEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody11getLocationEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody11statusIsSetEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody12offerIdIsSetEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody12playersIsSetEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody13locationIsSetEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody14getRulesetNameEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody16rulesetNameIsSetEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody18getCreatedDateTimeEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody18getUpdatedDateTimeEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody20createdDateTimeIsSetEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody20updatedDateTimeIsSetEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody9getStatusEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody11getTicketIdEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody11statusIsSetEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody12getSubmitterEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody12playersIsSetEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody13ticketIdIsSetEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody14getRulesetNameEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody14submitterIsSetEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody16rulesetNameIsSetEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody18getCreatedDateTimeEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody18getUpdatedDateTimeEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody20createdDateTimeIsSetEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody20updatedDateTimeIsSetEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody21ticketAttributesIsSetEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody9getStatusEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V124SubmitTicketResponseBody11getTicketIdEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V124SubmitTicketResponseBody13ticketIdIsSetEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V18Location16getGameSessionIdEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V18Location18gameSessionIdIsSetEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V19Attribute7getNameEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V19Attribute7getTypeEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V19Attribute8getValueEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V19Submitter11getPlatformEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V19Submitter12getAccountIdEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V19Submitter13platformIsSetEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V19Submitter14accountIdIsSetEv(void* self); int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V121GetRankingRequestBody18setStartSerialRankERKi(); int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V121GetRankingRequestBody8setGroupERKNS3_5GroupE(); int APS5_VABI _ZN3sce2Np9CppWebApi12Leaderboards2V121GetRankingRequestBody8setLimitERKi(); @@ -114,8 +207,6 @@ int APS5_VABI _ZN3sce2Np9CppWebApi6Common21DownStreamTransactionINS2_12Intrusive int APS5_VABI _ZN3sce2Np9CppWebApi6Common21DownStreamTransactionINS2_12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi27DownloadDataResponseHeadersEEEE8readDataEPcm(); int APS5_VABI _ZN3sce2Np9CppWebApi6Common21DownStreamTransactionINS2_12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi27DownloadDataResponseHeadersEEEEC1Ev(void* self); int APS5_VABI _ZN3sce2Np9CppWebApi6Common21DownStreamTransactionINS2_12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi27DownloadDataResponseHeadersEEEED1Ev(void* self); -void APS5_VABI _ZN3sce2Np9CppWebApi6Common6StringC1EPNS2_10LibContextE(CommonString* self, void* libContext); -void APS5_VABI _ZN3sce2Np9CppWebApi6Common6StringD1Ev(CommonString* self); int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_12Leaderboards2V14UserEEEE8pushBackERKS8_(); int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_12Leaderboards2V14UserEEEEC1EPNS2_10LibContextE(void* self); int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_12Leaderboards2V14UserEEEED1Ev(void* self); @@ -171,7 +262,6 @@ void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_ int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEEENS4_INS6_9RecordApi26RecordScoreResponseHeadersEEEE18getResponseHeadersERSB_(); std::size_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common6Binary4sizeEv(const void* self); const void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common6Binary9getBinaryEv(const void* self); -const char* APS5_VABI _ZNK3sce2Np9CppWebApi6Common6String5c_strEv(const CommonString* self); void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_12Leaderboards2V15EntryEEEEdeEv(const void* self); bool APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_12Leaderboards2V15EntryEEEEneERKS9_(const void* self, const void* other); void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V115LocalizedStringEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source); @@ -209,7 +299,6 @@ void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V1 int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V154GetUsersAccountIdPlayerSessionsInvitationsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self); void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V151PostPlayerSessionsSessionIdMemberPlayersRequestBodyEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source); int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi25joinPlayerSessionAsPlayerEiRKNS4_36ParameterToJoinPlayerSessionAsPlayerERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_52PostPlayerSessionsSessionIdMemberPlayersResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE(); -int APS5_VABI _ZN3sce2Np9CppWebApi6Common6String6appendEPKc(CommonString* self, const char* text); int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V132RequestCreatePlayerSessionPlayerEEEE8pushBackERKS8_(IntrusivePtr* self, const void* element); int APS5_VABI _ZN3sce2Np9CppWebApi6Common15DefaultResponseC1Ev(void* self); int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi36ParameterToJoinPlayerSessionAsPlayer9terminateEv(void* self); @@ -217,7 +306,6 @@ int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi31Parame void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V110FromMemberEEptEv(const IntrusivePtr* self); void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V132RequestPlayerSessionMemberPlayerEED1Ev(IntrusivePtr* self); int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V130PostPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self); -void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V126RequestPlayerSessionPlayerEEEED1Ev(IntrusivePtr* self); int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi29ParameterToLeavePlayerSessionC1Ev(void* self); void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V130PostPlayerSessionsResponseBodyEED1Ev(IntrusivePtr* self); void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V126RequestPlayerSessionPlayerEEC1Ev(IntrusivePtr* self); @@ -238,7 +326,6 @@ void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V1 void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V110FromMemberEED1Ev(IntrusivePtr* self); void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V154GetUsersAccountIdPlayerSessionsInvitationsResponseBodyEEptEv(const IntrusivePtr* self); int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi38ParameterToGetPlayerSessionInvitationsC1Ev(void* self); -int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V126RequestPlayerSessionPlayerEEEE8pushBackERKS8_(IntrusivePtr* self, const void* element); void* APS5_VABI _ZN3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_14SessionManager2V136UsersPlayerSessionsInvitationForReadEEEEppEv(void* self); int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V152PostPlayerSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self); int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V120RequestPlayerSession19setJoinableUserTypeERKNS3_16JoinableUserTypeE(); @@ -256,11 +343,9 @@ bool APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V154GetUsersAccountIdPlayer void* APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V113PlayerSessionEEEEixEm(void* self, std::uint64_t index); int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi29ParameterToLeavePlayerSession10initializeEPNS1_6Common10LibContextEPKcSA_(void* self, const std::uint64_t* context, const char* sessionId, const char* accountId); void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V115LocalizedStringEED1Ev(IntrusivePtr* self); -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS2_6StringEEEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source); void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_14SessionManager2V136UsersPlayerSessionsInvitationForReadEEEEdeEv(const void* self); int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi38ParameterToGetPlayerSessionInvitations9setfieldsENS1_6Common12IntrusivePtrINS6_6VectorINS6_6StringEEEEE(); int APS5_VABI _ZN3sce2Np9CppWebApi6Common15DefaultResponseD1Ev(void* self); -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS2_6StringEEEEC1EPS6_PFvS8_EPNS2_10LibContextE(IntrusivePtr* self, void* body, void (APS5_VABI* deleter)(void*), void* libContext); void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V120RequestPlayerSessionEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext); int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V133RequestPlayerSessionPlayerFactory6createEPNS1_6Common10LibContextEPKcS9_PNS5_12IntrusivePtrINS3_26RequestPlayerSessionPlayerEEE(); int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi20createPlayerSessionsEiRKNS4_31ParameterToCreatePlayerSessionsERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_30PostPlayerSessionsResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE(); @@ -269,7 +354,6 @@ bool APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V136UsersPlayerSessionsInvi int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V126RequestPlayerSessionPlayer15setPushContextsERKNS1_6Common6VectorINS5_12IntrusivePtrINS3_24PlayerSessionPushContextEEEEE(); int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V127RequestPlayerSessionFactory6createEPNS1_6Common10LibContextEiNS5_12IntrusivePtrINS3_32RequestPlayerSessionMemberPlayerEEERKNS5_6VectorINS5_6StringEEENS8_INS3_15LocalizedStringEEEPNS8_INS3_20RequestPlayerSessionEEE(); int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V130PostPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE11getResponseERS8_(); -void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V126RequestPlayerSessionPlayerEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext); void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V124PlayerSessionPushContextEED1Ev(IntrusivePtr* self); int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V131PlayerSessionPushContextFactory6createEPNS1_6Common10LibContextEPKcPNS5_12IntrusivePtrINS3_24PlayerSessionPushContextEEE(); void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V129PostPlayerSessionsRequestBodyEED1Ev(IntrusivePtr* self); @@ -279,7 +363,6 @@ bool APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_14Se int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi38ParameterToGetPlayerSessionInvitations10initializeEPNS1_6Common10LibContextEPKc(void* self, const std::uint64_t* context, const char* accountId); void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V130PostPlayerSessionsResponseBodyEEptEv(const IntrusivePtr* self); void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V154GetUsersAccountIdPlayerSessionsInvitationsResponseBodyEED1Ev(IntrusivePtr* self); -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS2_6StringEEEED1Ev(IntrusivePtr* self); void* APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V154GetUsersAccountIdPlayerSessionsInvitationsResponseBody14getInvitationsEv(void* self); void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V132RequestCreatePlayerSessionPlayerEEC1Ev(IntrusivePtr* self); int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V152PostPlayerSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv(); @@ -376,6 +459,41 @@ int APS5_VABI _ZNK3sce2Np9CppWebApi17TitleCloudStorage2V110DataStatus9getSlotIdE void* APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V132GetMultiDataStatusesResponseBody17getDataStatusListEv(void* self); std::uint32_t APS5_VABI _ZNK3sce2Np9CppWebApi17TitleCloudStorage2V132GetMultiDataStatusesResponseBody23getTotalDataStatusCountEv(const void* self); std::uint64_t APS5_VABI _ZNK3sce2Np9CppWebApi17TitleCloudStorage2V15Owner12getAccountIdEv(const void* self); + +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V129SetDataInfoRequestBodyFactory6createEPNS1_6Common10LibContextEPvmPNS5_12IntrusivePtrINS3_22SetDataInfoRequestBodyEEE(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi10uploadDataEiRKNS4_21ParameterToUploadDataERNS1_6Common19UpStreamTransactionINS8_12IntrusivePtrINS3_22UploadDataResponseBodyEEENSA_INS4_25UploadDataResponseHeadersEEEEE(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi10uploadDataEiRKNS4_42ParameterWithBinaryRequestBodyToUploadDataERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_22UploadDataResponseBodyEEENSA_INS4_25UploadDataResponseHeadersEEEEE(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi11setDataInfoEiRKNS4_22ParameterToSetDataInfoERNS1_6Common11TransactionINS8_15DefaultResponseENS8_12IntrusivePtrINS4_26SetDataInfoResponseHeadersEEEEE(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi12downloadDataEiRKNS4_23ParameterToDownloadDataERNS1_6Common11TransactionINS8_12IntrusivePtrINS8_6BinaryEEENSA_INS4_27DownloadDataResponseHeadersEEEEE(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi21ParameterToUploadData10initializeEPNS1_6Common10LibContextEPKci(void* self, const std::uint64_t* context, const char* text, int value); +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi21ParameterToUploadData21setxPsnNpServiceLabelEj(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi21ParameterToUploadData22setxPsnAtomicOperationENS5_19XPsnAtomicOperationE(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi21ParameterToUploadData9terminateEv(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi21ParameterToUploadDataC1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi21ParameterToUploadDataD1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi21deleteMultiDataByUserEiRKNS4_32ParameterToDeleteMultiDataByUserERNS1_6Common11TransactionINS8_15DefaultResponseENS8_12IntrusivePtrINS8_18ResponseHeaderBaseEEEEE(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi22ParameterToSetDataInfo10initializeEPNS1_6Common10LibContextEPKciNS6_12IntrusivePtrINS3_22SetDataInfoRequestBodyEEE(void* self, const std::uint64_t* context, const char* text, int value, const IntrusivePtr* body); +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi22ParameterToSetDataInfo22setxPsnAtomicOperationENS5_19XPsnAtomicOperationE(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi22ParameterToSetDataInfo24setxPsnAtomicOperationIdEPKc(void* self, const char* text); +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi22ParameterToSetDataInfo9terminateEv(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi22ParameterToSetDataInfoC1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi22ParameterToSetDataInfoD1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi23ParameterToDownloadData17setnpServiceLabelEj(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi32ParameterToDeleteMultiDataByUser10initializeEPNS1_6Common10LibContextEPKcSA_(void* self, const std::uint64_t* context, const char* first, const char* second); +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi32ParameterToDeleteMultiDataByUser17setnpServiceLabelEj(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi32ParameterToDeleteMultiDataByUser9terminateEv(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi32ParameterToDeleteMultiDataByUserC1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi32ParameterToDeleteMultiDataByUserD1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi37ParameterToGetMultiDataStatusesByUser17setnpServiceLabelEj(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi42ParameterWithBinaryRequestBodyToUploadData10initializeEPNS1_6Common10LibContextEPKci(void* self, const std::uint64_t* context, const char* text, int value); +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi42ParameterWithBinaryRequestBodyToUploadData14setRequestBodyEPKhm(void* self, const void* data, std::size_t size); +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi42ParameterWithBinaryRequestBodyToUploadData9terminateEv(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi42ParameterWithBinaryRequestBodyToUploadDataC1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi42ParameterWithBinaryRequestBodyToUploadDataD1Ev(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi17TitleCloudStorage2V110DataStatus22getLastUpdatedDateTimeEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi17TitleCloudStorage2V110DataStatus7getInfoEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi25UploadDataResponseHeaders24getXPsnAtomicOperationIdEv(void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi25UploadDataResponseHeaders24hasXPsnAtomicOperationIdEv(void* self); int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V110FriendsApi10getFriendsEiRKNS4_21ParameterToGetFriendsERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_18GetFriendsResponseEEENSA_INS8_18ResponseHeaderBaseEEEEE(); int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V110FriendsApi21ParameterToGetFriends10initializeEPNS1_6Common10LibContextEPKc(void* self, const std::uint64_t* context, const char* accountId); int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V110FriendsApi21ParameterToGetFriends9terminateEv(void* self); @@ -556,7 +674,6 @@ int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrIN int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V125GetBasicPresencesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_(); int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_15ProfanityFilter2V223FilterProfanityResponseEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_(); int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_30CommunicationRestrictionStatus2V338CommunicationRestrictionStatusResponseEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_(); -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_11UserProfile2V113BasicPresenceEEEE4sizeEv(); void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V129GetPlayerSessionsResponseBodyEED1Ev(IntrusivePtr* self); int APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V120PlayerSessionForReadEEEE5emptyEv(const IntrusivePtr* self); void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V150PostPlayerSessionsSessionIdInvitationsResponseBodyEEC1Ev(IntrusivePtr* self); @@ -664,7 +781,6 @@ int APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_13InGam void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_13InGameCatalog2V59ContainerEEEEEEaSERKSA_(IntrusivePtr* self, const IntrusivePtr* source); int APS5_VABI _ZN3sce2Np9CppWebApi6Common8IteratorINS2_6StringEEppEv(); void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorImEEEC1Ev(IntrusivePtr* self); -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorImEEED1Ev(IntrusivePtr* self); int APS5_VABI _ZN3sce2Np9CppWebApi6Common13ConstIteratorINS2_6StringEED2Ev(void* self); int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_6StringEE8copyFromERKS5_(); void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorImEEE3getEv(const IntrusivePtr* self); @@ -674,10 +790,8 @@ void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS2_6Stri int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_6StringEE3endEv(); int APS5_VABI _ZN3sce2Np9CppWebApi6Common6StringeqEPKc(const CommonString* self, const char* other); std::int64_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_15DefaultResponseENS2_12IntrusivePtrINS2_18ResponseHeaderBaseEEEE5getIdEv(); -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorImEEEaSERS6_(IntrusivePtr* self, const IntrusivePtr* source); int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_15DefaultResponseENS2_12IntrusivePtrINS2_18ResponseHeaderBaseEEEE5abortEv(); int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_6StringEE5beginEv(); -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common6String5emptyEv(const CommonString* self); void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS2_6StringEEEE3getEv(const IntrusivePtr* self); int APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_6StringEEdeEv(); @@ -768,5 +882,366 @@ int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11 int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V19BlocksApi27ParameterToGetBlockingUsers8setlimitEi(); int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V19BlocksApi27ParameterToGetBlockingUsers9setoffsetEi(); void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_11UserProfile2V112BasicProfileEEEEEED1Ev(IntrusivePtr* self); - +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi15getGameSessionsEiRKNS4_26ParameterToGetGameSessionsERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_27GetGameSessionsResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE(); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi16leaveGameSessionEiRKNS4_27ParameterToLeaveGameSessionERNS1_6Common11TransactionINS8_15DefaultResponseENS8_12IntrusivePtrINS8_18ResponseHeaderBaseEEEEE(); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi18createGameSessionsEiRKNS4_29ParameterToCreateGameSessionsERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_28PostGameSessionsResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE(); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi23joinGameSessionAsPlayerEiRKNS4_34ParameterToJoinGameSessionAsPlayerERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_50PostGameSessionsSessionIdMemberPlayersResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE(); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi24setGameSessionPropertiesEiRKNS4_35ParameterToSetGameSessionPropertiesERNS1_6Common11TransactionINS8_15DefaultResponseENS8_12IntrusivePtrINS8_18ResponseHeaderBaseEEEEE(); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi26ParameterToGetGameSessions10initializeEPNS1_6Common10LibContextEPKc(void* self, const std::uint64_t* context, const char* a1); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi26ParameterToGetGameSessions9setfieldsENS1_6Common12IntrusivePtrINS6_6VectorINS6_6StringEEEEE(); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi26ParameterToGetGameSessions9terminateEv(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi26ParameterToGetGameSessionsC1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi26ParameterToGetGameSessionsD1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi27ParameterToLeaveGameSession10initializeEPNS1_6Common10LibContextEPKcSA_(void* self, const std::uint64_t* context, ...); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi27ParameterToLeaveGameSession9terminateEv(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi27ParameterToLeaveGameSessionC1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi27ParameterToLeaveGameSessionD1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi29ParameterToCreateGameSessions10initializeEPNS1_6Common10LibContextENS6_12IntrusivePtrINS3_27PostGameSessionsRequestBodyEEE(void* self, const std::uint64_t* context, ...); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi29ParameterToCreateGameSessions9terminateEv(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi29ParameterToCreateGameSessionsC1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi29ParameterToCreateGameSessionsD1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi34ParameterToJoinGameSessionAsPlayer10initializeEPNS1_6Common10LibContextEPKcNS6_12IntrusivePtrINS3_49PostGameSessionsSessionIdMemberPlayersRequestBodyEEE(void* self, const std::uint64_t* context, ...); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi34ParameterToJoinGameSessionAsPlayer9terminateEv(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi34ParameterToJoinGameSessionAsPlayerC1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi34ParameterToJoinGameSessionAsPlayerD1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi35ParameterToSetGameSessionProperties10initializeEPNS1_6Common10LibContextEPKcNS6_12IntrusivePtrINS3_37PatchGameSessionsSessionIdRequestBodyEEE(void* self, const std::uint64_t* context, ...); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi35ParameterToSetGameSessionProperties9terminateEv(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi35ParameterToSetGameSessionPropertiesC1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi35ParameterToSetGameSessionPropertiesD1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V118RequestGameSession14setCustomData1EPKvm(); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V118RequestGameSession14setCustomData2EPKvm(); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V118RequestGameSession16setMaxSpectatorsERKi(); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V118RequestGameSession19setUsePlayerSessionERKb(); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V120RequestPlayerSession16setSwapSupportedERKb(); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V120RequestPlayerSession19setLeaderPrivilegesERKNS1_6Common6VectorINS5_6StringEEE(); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V124RequestGameSessionPlayer12setJoinStateERKNS3_16InitialJoinStateE(); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V124RequestGameSessionPlayer15setPushContextsERKNS1_6Common6VectorINS5_12IntrusivePtrINS3_22GameSessionPushContextEEEEE(); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V125RequestGameSessionFactory6createEPNS1_6Common10LibContextEiNS5_12IntrusivePtrINS3_30RequestGameSessionMemberPlayerEEERKNS5_6VectorINS5_6StringEEEPNS8_INS3_18RequestGameSessionEEE(); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V127GetGameSessionsResponseBody15getGameSessionsEv(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V128PostGameSessionsResponseBody15getGameSessionsEv(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V128RequestJoinGameSessionPlayer12setJoinStateERKNS3_16InitialJoinStateE(); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V128RequestJoinGameSessionPlayer15setPushContextsERKNS1_6Common6VectorINS5_12IntrusivePtrINS3_22GameSessionPushContextEEEEE(); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V129GameSessionPushContextFactory6createEPNS1_6Common10LibContextEPKcPNS5_12IntrusivePtrINS3_22GameSessionPushContextEEE(); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V131RequestGameSessionPlayerFactory6createEPNS1_6Common10LibContextEPKcS9_PNS5_12IntrusivePtrINS3_24RequestGameSessionPlayerEEE(); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V134PostGameSessionsRequestBodyFactory6createEPNS1_6Common10LibContextERKNS5_6VectorINS5_12IntrusivePtrINS3_18RequestGameSessionEEEEEPNS9_INS3_27PostGameSessionsRequestBodyEEE(); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V135RequestJoinGameSessionPlayerFactory6createEPNS1_6Common10LibContextEPKcS9_PNS5_12IntrusivePtrINS3_28RequestJoinGameSessionPlayerEEE(); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V137PatchGameSessionsSessionIdRequestBody14setCustomData1EPKvm(); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V137PatchGameSessionsSessionIdRequestBody14setCustomData2EPKvm(); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V137PatchGameSessionsSessionIdRequestBody16setMaxSpectatorsERKi(); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V137RequestGameSessionMemberPlayerFactory6createEPNS1_6Common10LibContextERKNS5_6VectorINS5_12IntrusivePtrINS3_24RequestGameSessionPlayerEEEEEPNS9_INS3_30RequestGameSessionMemberPlayerEEE(); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V139PatchPlayerSessionsSessionIdRequestBody14setCustomData1EPKvm(); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V139PatchPlayerSessionsSessionIdRequestBody14setCustomData2EPKvm(); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V139PatchPlayerSessionsSessionIdRequestBody16setMaxSpectatorsERKi(); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V144PatchGameSessionsSessionIdRequestBodyFactory6createEPNS1_6Common10LibContextEPNS5_12IntrusivePtrINS3_37PatchGameSessionsSessionIdRequestBodyEEE(); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V156PostGameSessionsSessionIdMemberPlayersRequestBodyFactory6createEPNS1_6Common10LibContextERKNS5_6VectorINS5_12IntrusivePtrINS3_28RequestJoinGameSessionPlayerEEEEEPNS9_INS3_49PostGameSessionsSessionIdMemberPlayersRequestBodyEEE(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11Matchmaking2V120GetOfferResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11Matchmaking2V120GetOfferResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11Matchmaking2V120GetOfferResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11Matchmaking2V124SubmitTicketResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11Matchmaking2V124SubmitTicketResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11Matchmaking2V124SubmitTicketResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V125GetPublicProfilesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEEENS4_INS6_9RecordApi26RecordScoreResponseHeadersEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSD_ESD_(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V127GetGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V127GetGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V127GetGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V128PostGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V128PostGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V128PostGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V129GetPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V130PostPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V150PostGameSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V150PostGameSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V150PostGameSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V150PostPlayerSessionsSessionIdInvitationsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V152PostPlayerSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_7Matches2V119CreateMatchResponseEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_7Matches2V119CreateMatchResponseEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_7Matches2V119CreateMatchResponseEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS2_6VectorINS4_INS1_13InGameCatalog2V59ContainerEEEEEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliSB_PvEPFvliSF_ESF_(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_15DefaultResponseENS2_12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi26SetDataInfoResponseHeadersEEEEC1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_15DefaultResponseENS2_12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi26SetDataInfoResponseHeadersEEEED1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_15DefaultResponseENS2_12IntrusivePtrINS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS4_PvEPFvliS9_ES9_(); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11Matchmaking2V121PlayerForTicketCreateEEC1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11Matchmaking2V121PlayerForTicketCreateEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11Matchmaking2V123SubmitTicketRequestBodyEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11Matchmaking2V123SubmitTicketRequestBodyEEC1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11Matchmaking2V123SubmitTicketRequestBodyEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11Matchmaking2V19AttributeEEC1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11Matchmaking2V19AttributeEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V114RepresentativeEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V118MatchmakingForReadEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V118RequestGameSessionEEC1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V118RequestGameSessionEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V122GameSessionPushContextEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V122GameSessionPushContextEEC1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V122GameSessionPushContextEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V124PlayerSessionPushContextEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V124RequestGameSessionPlayerEEC1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V124RequestGameSessionPlayerEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V127PostGameSessionsRequestBodyEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V127PostGameSessionsRequestBodyEEC1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V127PostGameSessionsRequestBodyEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V128RequestJoinGameSessionPlayerEEC1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V128RequestJoinGameSessionPlayerEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V130RequestGameSessionMemberPlayerEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V130RequestGameSessionMemberPlayerEEC1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V130RequestGameSessionMemberPlayerEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V137PatchGameSessionsSessionIdRequestBodyEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V137PatchGameSessionsSessionIdRequestBodyEEC1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V137PatchGameSessionsSessionIdRequestBodyEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V149PostGameSessionsSessionIdMemberPlayersRequestBodyEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V149PostGameSessionsSessionIdMemberPlayersRequestBodyEEC1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V149PostGameSessionsSessionIdMemberPlayersRequestBodyEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_15ProfanityFilter2V223FilterProfanityResponseEEC1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_15ProfanityFilter2V223FilterProfanityResponseEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_17TitleCloudStorage2V122SetDataInfoRequestBodyEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_17TitleCloudStorage2V122SetDataInfoRequestBodyEEC1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_17TitleCloudStorage2V122SetDataInfoRequestBodyEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi25UploadDataResponseHeadersEEC1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi25UploadDataResponseHeadersEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V111AddedPlayerEEC1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V111AddedPlayerEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V113RemovedPlayerEEC1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V113RemovedPlayerEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V113RequestMemberEEC1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V113RequestMemberEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V116JoinMatchRequestEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V116JoinMatchRequestEEC1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V116JoinMatchRequestEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V116RequestMatchTeamEEC1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V116RequestMatchTeamEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V117LeaveMatchRequestEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V117LeaveMatchRequestEEC1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V117LeaveMatchRequestEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V118CreateMatchRequestEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V118CreateMatchRequestEEC1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V118CreateMatchRequestEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V118RequestMatchPlayerEEC1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V118RequestMatchPlayerEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V118RequestTeamResultsEEC1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V118RequestTeamResultsEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V119AdditionalStatisticEEC1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V119AdditionalStatisticEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V119RequestInGameRosterEEC1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V119RequestInGameRosterEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V119RequestMatchResultsEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V119RequestMatchResultsEEC1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V119RequestMatchResultsEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V120ReportResultsRequestEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V120ReportResultsRequestEEC1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V120ReportResultsRequestEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V120RequestPlayerResultsEEC1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V120RequestPlayerResultsEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V120RequestTeamStatisticEEC1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V120RequestTeamStatisticEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V122RequestMatchStatisticsEEC1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V122RequestMatchStatisticsEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V122RequestPlayerStatisticEEC1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V122RequestPlayerStatisticEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V123RequestTeamMemberResultEEC1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V123RequestTeamMemberResultEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V124RequestCompetitiveResultEEC1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V124RequestCompetitiveResultEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V124UpdateMatchDetailRequestEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V124UpdateMatchDetailRequestEEC1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V124UpdateMatchDetailRequestEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V124UpdateMatchStatusRequestEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V124UpdateMatchStatusRequestEEC1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V124UpdateMatchStatusRequestEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V126RequestTeamMemberStatisticEEC1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V126RequestTeamMemberStatisticEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_13InGameCatalog2V59ContainerEEEEEEC1ERSA_(IntrusivePtr* self, const IntrusivePtr* source); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V111GameSessionEEEEEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V118GameSessionForReadEEEEEED1Ev(IntrusivePtr* self); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11Matchmaking2V120GetOfferResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11Matchmaking2V120GetOfferResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11Matchmaking2V120GetOfferResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11Matchmaking2V124SubmitTicketResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11Matchmaking2V124SubmitTicketResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11Matchmaking2V124SubmitTicketResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEEENS4_INS6_9RecordApi26RecordScoreResponseHeadersEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V127GetGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V127GetGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V127GetGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V128PostGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V128PostGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V128PostGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V129GetPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V130PostPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V150PostGameSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V150PostGameSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V150PostGameSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V150PostPlayerSessionsSessionIdInvitationsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V152PostPlayerSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_17TitleCloudStorage2V122UploadDataResponseBodyEEENS4_INS6_7DataApi25UploadDataResponseHeadersEEEE6finishEv(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_7Matches2V119CreateMatchResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_7Matches2V119CreateMatchResponseEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_15DefaultResponseENS2_12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi26SetDataInfoResponseHeadersEEEE5startEPNS2_10LibContextE(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_15DefaultResponseENS2_12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi26SetDataInfoResponseHeadersEEEE6finishEv(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_15DefaultResponseENS2_12IntrusivePtrINS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common19UpStreamTransactionINS2_12IntrusivePtrINS1_17TitleCloudStorage2V122UploadDataResponseBodyEEENS4_INS6_7DataApi25UploadDataResponseHeadersEEEE5startEPNS2_10LibContextEm(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common19UpStreamTransactionINS2_12IntrusivePtrINS1_17TitleCloudStorage2V122UploadDataResponseBodyEEENS4_INS6_7DataApi25UploadDataResponseHeadersEEEE8sendDataEPKvm(); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common19UpStreamTransactionINS2_12IntrusivePtrINS1_17TitleCloudStorage2V122UploadDataResponseBodyEEENS4_INS6_7DataApi25UploadDataResponseHeadersEEEEC1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common19UpStreamTransactionINS2_12IntrusivePtrINS1_17TitleCloudStorage2V122UploadDataResponseBodyEEENS4_INS6_7DataApi25UploadDataResponseHeadersEEEED1Ev(void* self); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_11Matchmaking2V121PlayerForTicketCreateEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_11Matchmaking2V121PlayerForTicketCreateEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_11Matchmaking2V121PlayerForTicketCreateEEEED1Ev(IntrusivePtr* self); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_11Matchmaking2V19AttributeEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_11Matchmaking2V19AttributeEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_11Matchmaking2V19AttributeEEEED1Ev(IntrusivePtr* self); +void* APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V111GameSessionEEEEixEm(void* self, std::uint64_t index); +void* APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V118GameSessionForReadEEEEixEm(void* self, std::uint64_t index); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V118RequestGameSessionEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V118RequestGameSessionEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V118RequestGameSessionEEEED1Ev(IntrusivePtr* self); +void* APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V120PlayerSessionForReadEEEEixEm(void* self, std::uint64_t index); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V122GameSessionPushContextEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V122GameSessionPushContextEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V122GameSessionPushContextEEEED1Ev(IntrusivePtr* self); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V124RequestGameSessionPlayerEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V124RequestGameSessionPlayerEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V124RequestGameSessionPlayerEEEED1Ev(IntrusivePtr* self); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V128RequestJoinGameSessionPlayerEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V128RequestJoinGameSessionPlayerEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V128RequestJoinGameSessionPlayerEEEED1Ev(IntrusivePtr* self); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V111AddedPlayerEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V111AddedPlayerEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V111AddedPlayerEEEED1Ev(IntrusivePtr* self); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V113RemovedPlayerEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V113RemovedPlayerEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V113RemovedPlayerEEEED1Ev(IntrusivePtr* self); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V113RequestMemberEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V113RequestMemberEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V113RequestMemberEEEED1Ev(IntrusivePtr* self); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V116RequestMatchTeamEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V116RequestMatchTeamEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V116RequestMatchTeamEEEED1Ev(IntrusivePtr* self); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V118RequestMatchPlayerEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V118RequestMatchPlayerEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V118RequestMatchPlayerEEEED1Ev(IntrusivePtr* self); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V118RequestTeamResultsEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V118RequestTeamResultsEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V118RequestTeamResultsEEEED1Ev(IntrusivePtr* self); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V119AdditionalStatisticEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V119AdditionalStatisticEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V119AdditionalStatisticEEEED1Ev(IntrusivePtr* self); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V120RequestPlayerResultsEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V120RequestPlayerResultsEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V120RequestPlayerResultsEEEED1Ev(IntrusivePtr* self); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V120RequestTeamStatisticEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V120RequestTeamStatisticEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V120RequestTeamStatisticEEEED1Ev(IntrusivePtr* self); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V122RequestPlayerStatisticEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V122RequestPlayerStatisticEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V122RequestPlayerStatisticEEEED1Ev(IntrusivePtr* self); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V123RequestTeamMemberResultEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V123RequestTeamMemberResultEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V123RequestTeamMemberResultEEEED1Ev(IntrusivePtr* self); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V126RequestTeamMemberStatisticEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V126RequestTeamMemberStatisticEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V126RequestTeamMemberStatisticEEEED1Ev(IntrusivePtr* self); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_6StringEE7reserveEi(); +int APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V114PersonalDetail11getLastNameEv(const void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V114PersonalDetail12getFirstNameEv(const void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V114PersonalDetail13getMiddleNameEv(const void* self); +bool APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V114PersonalDetail13lastNameIsSetEv(const void* self); +bool APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V114PersonalDetail14firstNameIsSetEv(const void* self); +bool APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V114PersonalDetail15middleNameIsSetEv(const void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V111GameSession12getSessionIdEv(const void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V114Representative11getOnlineIdEv(const void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V114Representative12getAccountIdEv(const void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V118GameSessionForRead14getCustomData1Ev(const void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V118GameSessionForRead14getCustomData2Ev(const void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V118GameSessionForRead14getMatchmakingEv(const void* self); +bool APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V118GameSessionForRead16customData1IsSetEv(const void* self); +bool APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V118GameSessionForRead16customData2IsSetEv(const void* self); +bool APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V118GameSessionForRead16matchmakingIsSetEv(const void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V118GameSessionForRead17getRepresentativeEv(const void* self); +bool APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V118GameSessionForRead19representativeIsSetEv(const void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V118LeaderWithOnlineId11getOnlineIdEv(const void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V118MatchmakingForRead10getOfferIdEv(const void* self); +bool APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V120PlayerSessionForRead11leaderIsSetEv(const void* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_15ProfanityFilter2V223FilterProfanityResponseEEENS4_INS2_18ResponseHeaderBaseEEEE11getResponseERS8_(); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11Matchmaking2V121PlayerForTicketCreateEEptEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11Matchmaking2V123SubmitTicketRequestBodyEEptEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11Matchmaking2V124SubmitTicketResponseBodyEEptEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V19RecordApi26RecordScoreResponseHeadersEE3getEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V111GameSessionEEptEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V114RepresentativeEEptEv(const IntrusivePtr* self); +bool APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V118GameSessionForReadEEcvbEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V118GameSessionForReadEEdeEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V118GameSessionForReadEEptEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V118MatchmakingForReadEEptEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V118RequestGameSessionEEptEv(const IntrusivePtr* self); +bool APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V120PlayerSessionForReadEEcvbEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V120PlayerSessionForReadEEdeEv(const IntrusivePtr* self); +bool APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V122GameSessionPushContextEEcvbEv(const IntrusivePtr* self); +bool APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V124PlayerSessionPushContextEEcvbEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V124RequestGameSessionPlayerEEptEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V127GetGameSessionsResponseBodyEEptEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V128PostGameSessionsResponseBodyEEptEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V128RequestJoinGameSessionPlayerEEptEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V137PatchGameSessionsSessionIdRequestBodyEEptEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi25UploadDataResponseHeadersEEptEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V111AddedPlayerEEptEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V113RemovedPlayerEEptEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V116JoinMatchRequestEEptEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V116RequestMatchTeamEEptEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V117LeaveMatchRequestEEptEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V118CreateMatchRequestEEptEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V118RequestMatchPlayerEEptEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V118RequestTeamResultsEEptEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V119CreateMatchResponseEEptEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V119RequestInGameRosterEEptEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V119RequestMatchResultsEEptEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V120ReportResultsRequestEEptEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V120RequestPlayerResultsEEptEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V120RequestTeamStatisticEEptEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V122RequestMatchStatisticsEEptEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V124RequestCompetitiveResultEEptEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V124UpdateMatchDetailRequestEEptEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V124UpdateMatchStatusRequestEEptEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_12Leaderboards2V15EntryEEEEEEptEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V111GameSessionEEEEEEdeEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V118GameSessionForReadEEEEEEdeEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V118GameSessionForReadEEEEEEptEv(const IntrusivePtr* self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V120PlayerSessionForReadEEEEEEdeEv(const IntrusivePtr* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11Matchmaking2V120GetOfferResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_(); +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11Matchmaking2V124SubmitTicketResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_(); +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V125GetPublicProfilesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_(); +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_(); +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V127GetGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_(); +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V128PostGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_(); +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V129GetPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_(); +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V130PostPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_(); +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V150PostGameSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_(); +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V150PostPlayerSessionsSessionIdInvitationsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_(); +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V152PostPlayerSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_(); +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_17TitleCloudStorage2V122UploadDataResponseBodyEEENS4_INS6_7DataApi25UploadDataResponseHeadersEEEE18getResponseHeadersERSB_(); +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_15DefaultResponseENS2_12IntrusivePtrINS2_18ResponseHeaderBaseEEEE18getResponseHeadersERS7_(); +std::size_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_12Leaderboards2V15EntryEEEE4sizeEv(const void* self); +std::size_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_13InGameCatalog2V57ProductEEEE4sizeEv(const void* self); +std::size_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V118GameSessionForReadEEEE4sizeEv(const void* self); +std::size_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V120PlayerSessionForReadEEEE4sizeEv(const void* self); +std::size_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V113RequestMemberEEEE4sizeEv(const void* self); +std::size_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V116RequestMatchTeamEEEE4sizeEv(const void* self); +std::size_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V118RequestMatchPlayerEEEE4sizeEv(const void* self); +std::size_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V120RequestTeamStatisticEEEE4sizeEv(const void* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6StringC1EPNS2_10LibContextE(CommonString* self, void* libContext); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6StringD1Ev(CommonString* self); +const char* APS5_VABI _ZNK3sce2Np9CppWebApi6Common6String5c_strEv(const CommonString* self); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6String6appendEPKc(CommonString* self, const char* text); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V126RequestPlayerSessionPlayerEEEED1Ev(IntrusivePtr* self); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V126RequestPlayerSessionPlayerEEEE8pushBackERKS8_(IntrusivePtr* self, const void* element); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS2_6StringEEEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS2_6StringEEEEC1EPS6_PFvS8_EPNS2_10LibContextE(IntrusivePtr* self, void* body, void (APS5_VABI* deleter)(void*), void* libContext); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V126RequestPlayerSessionPlayerEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS2_6StringEEEED1Ev(IntrusivePtr* self); +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_11UserProfile2V113BasicPresenceEEEE4sizeEv(); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorImEEED1Ev(IntrusivePtr* self); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorImEEEaSERS6_(IntrusivePtr* self, const IntrusivePtr* source); +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common6String5emptyEv(const CommonString* self); } diff --git a/core/libs/prx/libSceNpEntitlementAccess/Export.cpp b/core/libs/prx/libSceNpEntitlementAccess/Export.cpp index a6a393c676..3df65ec49d 100644 --- a/core/libs/prx/libSceNpEntitlementAccess/Export.cpp +++ b/core/libs/prx/libSceNpEntitlementAccess/Export.cpp @@ -21,6 +21,7 @@ static constexpr int SCE_NP_ENTITLEMENT_ACCESS_ERROR_PARAMETER = static_cast(0x80558007); static constexpr int SCE_NP_ERROR_SIGNED_OUT = static_cast(0x80550006); static constexpr uint32_t SKU_FLAG_FULL = 3; +static constexpr std::int32_t USER_ID_INVALID = -1; namespace { @@ -198,9 +199,9 @@ int APS5_VABI sceNpEntitlementAccessRequestUnifiedEntitlementInfoList(std::int32 return SCE_NP_ERROR_SIGNED_OUT; } -int APS5_VABI sceNpEntitlementAccessGetAddcontEntitlementInfoIndividual() { - NotImplemented_nid_no_patch(__func__); - return 0; +int APS5_VABI sceNpEntitlementAccessGetAddcontEntitlementInfoIndividual(std::int32_t user_id, uint32_t service_label, const NpUnifiedEntitlementLabel* entitlement_label, NpEntitlementAccessAddcontEntitlementInfo* info) { + if (user_id == USER_ID_INVALID) return SCE_NP_ENTITLEMENT_ACCESS_ERROR_PARAMETER; + return sceNpEntitlementAccessGetAddcontEntitlementInfo(service_label, entitlement_label, info); } int APS5_VABI sceNpEntitlementAccessPollConsumableEntitlementInfo() { diff --git a/core/libs/prx/libSceNpEntitlementAccess/include/Api.hpp b/core/libs/prx/libSceNpEntitlementAccess/include/Api.hpp index d68d483b87..f65a2a2cb3 100644 --- a/core/libs/prx/libSceNpEntitlementAccess/include/Api.hpp +++ b/core/libs/prx/libSceNpEntitlementAccess/include/Api.hpp @@ -25,7 +25,7 @@ int APS5_VABI sceNpEntitlementAccessPollServiceEntitlementInfoList(std::int64_t int APS5_VABI sceNpEntitlementAccessPollUnifiedEntitlementInfoList(std::int64_t requestId, std::int32_t* result, NpEntitlementAccessUnifiedInfo* infos, std::uint32_t capacity, std::int32_t* firstResult, std::int32_t* secondResult, std::int32_t* thirdResult); int APS5_VABI sceNpEntitlementAccessRequestServiceEntitlementInfoList(std::int32_t userId, std::uint32_t serviceLabel, const NpServiceEntitlementLabel* entitlementLabels, std::uint32_t labelCount, const NpEntitlementAccessListParameter* parameter, std::int64_t* requestId); int APS5_VABI sceNpEntitlementAccessRequestUnifiedEntitlementInfoList(std::int32_t userId, std::uint32_t serviceLabel, const NpUnifiedEntitlementLabel* entitlementLabels, std::uint32_t labelCount, const NpEntitlementAccessListParameter* parameter, std::int64_t* requestId); -int APS5_VABI sceNpEntitlementAccessGetAddcontEntitlementInfoIndividual(); +int APS5_VABI sceNpEntitlementAccessGetAddcontEntitlementInfoIndividual(std::int32_t userId, uint32_t serviceLabel, const NpUnifiedEntitlementLabel* entitlementLabel, NpEntitlementAccessAddcontEntitlementInfo* info); int APS5_VABI sceNpEntitlementAccessPollConsumableEntitlementInfo(); int APS5_VABI sceNpEntitlementAccessRequestConsumableEntitlementInfo(); int APS5_VABI sceNpEntitlementAccessRequestConsumeEntitlement(); diff --git a/core/libs/prx/libSceNpFriendListDialog/CMakeLists.txt b/core/libs/prx/libSceNpFriendListDialog/CMakeLists.txt index 219499b30b..c235b1f317 100644 --- a/core/libs/prx/libSceNpFriendListDialog/CMakeLists.txt +++ b/core/libs/prx/libSceNpFriendListDialog/CMakeLists.txt @@ -1,14 +1,15 @@ add_library(libSceNpFriendListDialog SHARED EXCLUDE_FROM_ALL Export.cpp) +target_link_libraries(libSceNpFriendListDialog PRIVATE libSceIme) target_include_directories(libSceNpFriendListDialog PRIVATE ${LIBS_INCLUDE_DIR}) configure_windows_unwind(libSceNpFriendListDialog) if(BUILD_TESTING) add_test_executable(guest_np_friend_list_dialog_tests ${LIBS_INCLUDE_DIR}/tests/GuestNpFriendListDialog.cpp) target_include_directories(guest_np_friend_list_dialog_tests PRIVATE ${LIBS_INCLUDE_DIR}) - target_link_libraries(guest_np_friend_list_dialog_tests PRIVATE libSceNpFriendListDialog) + target_link_libraries(guest_np_friend_list_dialog_tests PRIVATE libSceNpFriendListDialog libSceIme) add_test(NAME guest_np_friend_list_dialog COMMAND guest_np_friend_list_dialog_tests) if(WIN32) set_tests_properties(guest_np_friend_list_dialog PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") + "PATH=path_list_prepend:$;PATH=path_list_prepend:$") endif() endif() diff --git a/core/libs/prx/libSceNpFriendListDialog/Export.cpp b/core/libs/prx/libSceNpFriendListDialog/Export.cpp index aee6fb1edf..776d707121 100644 --- a/core/libs/prx/libSceNpFriendListDialog/Export.cpp +++ b/core/libs/prx/libSceNpFriendListDialog/Export.cpp @@ -5,6 +5,7 @@ #include #include "SceTypes.hpp" #include "prx/libc/include/General.hpp" +#include "prx/libSceIme/include/PsnDialogNotice.hpp" namespace { @@ -37,6 +38,7 @@ int APS5_VABI sceNpFriendListDialogOpenA(const void* param) { if (status == COMMON_DIALOG_STATUS_RUNNING) return COMMON_DIALOG_ERROR_BUSY; if (param == nullptr) return COMMON_DIALOG_ERROR_ARG_NULL; g_status = COMMON_DIALOG_STATUS_FINISHED; + PsnDialogNoticeOffer_nid_postfix(PsnDialogNoticeKind::PsnFeature); return 0; } diff --git a/core/libs/prx/libSceNpManager/Export.cpp b/core/libs/prx/libSceNpManager/Export.cpp index 046eafb727..3a3e6681d0 100644 --- a/core/libs/prx/libSceNpManager/Export.cpp +++ b/core/libs/prx/libSceNpManager/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libSceNpManager/include/LegacyExports.hpp" +#include "prx/libc/include/general/ExportMacros.hpp" #include "prx/libSceNpManager/include/Api.hpp" #include #include @@ -1105,3 +1107,42 @@ int APS5_VABI sceNpSnsFacebookGetAccessToken() { } } + +extern "C" { + +int APS5_VABI npManagerLegacyUnknown_70N4VzVCpQg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("70N4VzVCpQg", npManagerLegacyUnknown_70N4VzVCpQg_nid_no_patch); + +int APS5_VABI npManagerLegacyUnknown_SSuF3qPYjgA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SSuF3qPYjgA", npManagerLegacyUnknown_SSuF3qPYjgA_nid_no_patch); + +int APS5_VABI npManagerLegacyUnknown_ZKqJVpTOtW0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZKqJVpTOtW0", npManagerLegacyUnknown_ZKqJVpTOtW0_nid_no_patch); + +int APS5_VABI npManagerLegacyUnknown_jBLJpaqaV1A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jBLJpaqaV1A", npManagerLegacyUnknown_jBLJpaqaV1A_nid_no_patch); + +int APS5_VABI npManagerLegacyUnknown_mtowPSR0JN8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mtowPSR0JN8", npManagerLegacyUnknown_mtowPSR0JN8_nid_no_patch); + +int APS5_VABI npManagerLegacyUnknown_qp_minus_DvqvPOYM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qp-DvqvPOYM", npManagerLegacyUnknown_qp_minus_DvqvPOYM_nid_no_patch); + +int APS5_VABI npManagerLegacyUnknown_tmnDjDmI3AI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tmnDjDmI3AI", npManagerLegacyUnknown_tmnDjDmI3AI_nid_no_patch); + +} diff --git a/core/libs/prx/libSceNpManager/include/LegacyExports.hpp b/core/libs/prx/libSceNpManager/include/LegacyExports.hpp new file mode 100644 index 0000000000..4ce154f1eb --- /dev/null +++ b/core/libs/prx/libSceNpManager/include/LegacyExports.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI npManagerLegacyUnknown_70N4VzVCpQg_nid_no_patch(); +int APS5_VABI npManagerLegacyUnknown_SSuF3qPYjgA_nid_no_patch(); +int APS5_VABI npManagerLegacyUnknown_ZKqJVpTOtW0_nid_no_patch(); +int APS5_VABI npManagerLegacyUnknown_jBLJpaqaV1A_nid_no_patch(); +int APS5_VABI npManagerLegacyUnknown_mtowPSR0JN8_nid_no_patch(); +int APS5_VABI npManagerLegacyUnknown_qp_minus_DvqvPOYM_nid_no_patch(); +int APS5_VABI npManagerLegacyUnknown_tmnDjDmI3AI_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceNpManager/libSceNpManager.hpp b/core/libs/prx/libSceNpManager/libSceNpManager.hpp index 5fa5fa4390..c4c5bf6dc6 100644 --- a/core/libs/prx/libSceNpManager/libSceNpManager.hpp +++ b/core/libs/prx/libSceNpManager/libSceNpManager.hpp @@ -1,3 +1,5 @@ #pragma once +#include "prx/libSceNpManager/include/LegacyExports.hpp" + #include "prx/libSceNpManager/include/Api.hpp" diff --git a/core/libs/prx/libSceNpPartner001/Export.cpp b/core/libs/prx/libSceNpPartner001/Export.cpp index 2a4635c7c8..43325c7145 100644 --- a/core/libs/prx/libSceNpPartner001/Export.cpp +++ b/core/libs/prx/libSceNpPartner001/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceNpPartner001/include/InventoryExports.hpp" #include "prx/libSceNpPartner001/include/Api.hpp" #include "prx/libc/include/General.hpp" #include @@ -31,3 +33,12 @@ int APS5_VABI sceNpHasEAAccessSubscription(int userId, bool* result) { } } + +extern "C" { + +int APS5_VABI libSceNpPartner001Unknown_pQfYTZHznMc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pQfYTZHznMc", libSceNpPartner001Unknown_pQfYTZHznMc_nid_no_patch); + +} diff --git a/core/libs/prx/libSceNpPartner001/include/InventoryExports.hpp b/core/libs/prx/libSceNpPartner001/include/InventoryExports.hpp new file mode 100644 index 0000000000..78e735c3a4 --- /dev/null +++ b/core/libs/prx/libSceNpPartner001/include/InventoryExports.hpp @@ -0,0 +1,9 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceNpPartner001Unknown_pQfYTZHznMc_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceNpPartner001/libSceNpPartner001.hpp b/core/libs/prx/libSceNpPartner001/libSceNpPartner001.hpp index 83c567edd0..2a092bdaa0 100644 --- a/core/libs/prx/libSceNpPartner001/libSceNpPartner001.hpp +++ b/core/libs/prx/libSceNpPartner001/libSceNpPartner001.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceNpPartner001/include/Api.hpp" +#include "prx/libSceNpPartner001/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceNpParty/Export.cpp b/core/libs/prx/libSceNpParty/Export.cpp index 971b894470..0f2dcb53c9 100644 --- a/core/libs/prx/libSceNpParty/Export.cpp +++ b/core/libs/prx/libSceNpParty/Export.cpp @@ -16,6 +16,7 @@ constexpr std::uint16_t NP_PARTY_STATE_NOT_IN_PARTY = 2; std::atomic g_initialized{false}; int notInParty(const void* out) { + if (!g_initialized) return NP_PARTY_ERROR_NOT_INITIALIZED; if (!out) return NP_PARTY_ERROR_INVALID_ARGUMENT; return NP_PARTY_ERROR_NOT_IN_PARTY; } @@ -25,6 +26,7 @@ int notInParty(const void* out) { extern "C" { int APS5_VABI sceNpPartyGetState(std::uint16_t* state) { + if (!g_initialized) return NP_PARTY_ERROR_NOT_INITIALIZED; if (!state) return NP_PARTY_ERROR_INVALID_ARGUMENT; *state = NP_PARTY_STATE_NOT_IN_PARTY; return 0; @@ -78,7 +80,9 @@ int APS5_VABI sceNpPartyGetStateAsUser(void) { return 0; } -int APS5_VABI sceNpPartyGetStateAsUserA(std::int32_t, std::uint16_t* state) { +int APS5_VABI sceNpPartyGetStateAsUserA(std::int32_t userId, std::uint16_t* state) { + if (!g_initialized) return NP_PARTY_ERROR_NOT_INITIALIZED; + if (userId == -1) return NP_PARTY_ERROR_INVALID_ARGUMENT; return sceNpPartyGetState(state); } diff --git a/core/libs/prx/libSceNpProfileDialog/CMakeLists.txt b/core/libs/prx/libSceNpProfileDialog/CMakeLists.txt index 6406591808..d0c19a4614 100644 --- a/core/libs/prx/libSceNpProfileDialog/CMakeLists.txt +++ b/core/libs/prx/libSceNpProfileDialog/CMakeLists.txt @@ -1,4 +1,5 @@ add_library(libSceNpProfileDialog SHARED EXCLUDE_FROM_ALL Export.cpp) +target_link_libraries(libSceNpProfileDialog PRIVATE libSceIme) target_include_directories(libSceNpProfileDialog PRIVATE ${LIBS_INCLUDE_DIR}) target_link_libraries(libSceNpProfileDialog PRIVATE libc) configure_windows_unwind(libSceNpProfileDialog) @@ -6,11 +7,11 @@ configure_windows_unwind(libSceNpProfileDialog) if(BUILD_TESTING) add_test_executable(guest_np_profile_dialog_tests ${LIBS_INCLUDE_DIR}/tests/GuestNpProfileDialog.cpp) target_include_directories(guest_np_profile_dialog_tests PRIVATE ${LIBS_INCLUDE_DIR}) - target_link_libraries(guest_np_profile_dialog_tests PRIVATE libSceNpProfileDialog libc) + target_link_libraries(guest_np_profile_dialog_tests PRIVATE libSceNpProfileDialog libSceIme libc) configure_windows_unwind(guest_np_profile_dialog_tests) add_test(NAME guest_np_profile_dialog COMMAND guest_np_profile_dialog_tests) if(WIN32) set_tests_properties(guest_np_profile_dialog PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") + "PATH=path_list_prepend:$;PATH=path_list_prepend:$") endif() endif() diff --git a/core/libs/prx/libSceNpProfileDialog/Export.cpp b/core/libs/prx/libSceNpProfileDialog/Export.cpp index 3ece49618f..0cb54f9a1a 100644 --- a/core/libs/prx/libSceNpProfileDialog/Export.cpp +++ b/core/libs/prx/libSceNpProfileDialog/Export.cpp @@ -7,6 +7,7 @@ #include "SceTypes.hpp" #include "prx/libSceCommonDialog/CommonDialog.hpp" #include "prx/libc/include/General.hpp" +#include "prx/libSceIme/include/PsnDialogNotice.hpp" namespace { @@ -74,6 +75,7 @@ int OpenDialog(const TParam* param, const char* function) { } dialog.userData = param->userData; dialog.status = COMMON_DIALOG_STATUS_FINISHED; + PsnDialogNoticeOffer_nid_postfix(PsnDialogNoticeKind::PsnFeature); return COMMON_DIALOG_OK; } diff --git a/core/libs/prx/libSceNpSessionSignalingCrossplay/Export.cpp b/core/libs/prx/libSceNpSessionSignalingCrossplay/Export.cpp new file mode 100644 index 0000000000..37e5c0bc6a --- /dev/null +++ b/core/libs/prx/libSceNpSessionSignalingCrossplay/Export.cpp @@ -0,0 +1,70 @@ +#include "prx/libSceNpSessionSignalingCrossplay/include/Api.hpp" +#include +#include +#include "SceTypes.hpp" +#include "prx/libc/include/General.hpp" + +extern "C" { + +int APS5_VABI sceNpSessionSignalingCrossplayInitialize(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceNpSessionSignalingCrossplayTerminate(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceNpSessionSignalingCrossplayCreateContext(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("SPHdC4zuXfY", sceNpSessionSignalingCrossplayUnknown00); +int APS5_VABI sceNpSessionSignalingCrossplayUnknown00(void) { + NotImplemented_nid_no_patch("SPHdC4zuXfY"); + return 0; +} + +int APS5_VABI sceNpSessionSignalingCrossplayDestroyContext(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("2nvt1vCR3qo", sceNpSessionSignalingCrossplayUnknown01); +int APS5_VABI sceNpSessionSignalingCrossplayUnknown01(void) { + NotImplemented_nid_no_patch("2nvt1vCR3qo"); + return 0; +} + +APS5_EXPORT("wypjyjGWaLM", sceNpSessionSignalingCrossplayUnknown02); +int APS5_VABI sceNpSessionSignalingCrossplayUnknown02(void) { + NotImplemented_nid_no_patch("wypjyjGWaLM"); + return 0; +} + +APS5_EXPORT("eGv1EEmON+A", sceNpSessionSignalingCrossplayUnknown03); +int APS5_VABI sceNpSessionSignalingCrossplayUnknown03(void) { + NotImplemented_nid_no_patch("eGv1EEmON+A"); + return 0; +} + +APS5_EXPORT("GMGOCumydk0", sceNpSessionSignalingCrossplayUnknown04); +int APS5_VABI sceNpSessionSignalingCrossplayUnknown04(void) { + NotImplemented_nid_no_patch("GMGOCumydk0"); + return 0; +} + +APS5_EXPORT("LfFgtyCjdbs", sceNpSessionSignalingCrossplayUnknown05); +int APS5_VABI sceNpSessionSignalingCrossplayUnknown05(void) { + NotImplemented_nid_no_patch("LfFgtyCjdbs"); + return 0; +} + +int APS5_VABI sceNpSessionSignalingCrossplayGetMemoryInfo(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +} diff --git a/core/libs/prx/libSceNpSessionSignalingCrossplay/include/Api.hpp b/core/libs/prx/libSceNpSessionSignalingCrossplay/include/Api.hpp new file mode 100644 index 0000000000..c1cd2e574d --- /dev/null +++ b/core/libs/prx/libSceNpSessionSignalingCrossplay/include/Api.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI sceNpSessionSignalingCrossplayInitialize(void); +int APS5_VABI sceNpSessionSignalingCrossplayTerminate(void); +int APS5_VABI sceNpSessionSignalingCrossplayCreateContext(void); +int APS5_VABI sceNpSessionSignalingCrossplayUnknown00(void); +int APS5_VABI sceNpSessionSignalingCrossplayDestroyContext(void); +int APS5_VABI sceNpSessionSignalingCrossplayUnknown01(void); +int APS5_VABI sceNpSessionSignalingCrossplayUnknown02(void); +int APS5_VABI sceNpSessionSignalingCrossplayUnknown03(void); +int APS5_VABI sceNpSessionSignalingCrossplayUnknown04(void); +int APS5_VABI sceNpSessionSignalingCrossplayUnknown05(void); +int APS5_VABI sceNpSessionSignalingCrossplayGetMemoryInfo(void); + +} diff --git a/core/libs/prx/libSceNpSessionSignalingCrossplay/libSceNpSessionSignalingCrossplay.hpp b/core/libs/prx/libSceNpSessionSignalingCrossplay/libSceNpSessionSignalingCrossplay.hpp new file mode 100644 index 0000000000..57a3474455 --- /dev/null +++ b/core/libs/prx/libSceNpSessionSignalingCrossplay/libSceNpSessionSignalingCrossplay.hpp @@ -0,0 +1,3 @@ +#pragma once + +#include "prx/libSceNpSessionSignalingCrossplay/include/Api.hpp" diff --git a/core/libs/prx/libSceNpSnsFacebookDialog/CMakeLists.txt b/core/libs/prx/libSceNpSnsFacebookDialog/CMakeLists.txt index 5445d0dddd..b7cfa38eee 100644 --- a/core/libs/prx/libSceNpSnsFacebookDialog/CMakeLists.txt +++ b/core/libs/prx/libSceNpSnsFacebookDialog/CMakeLists.txt @@ -1,14 +1,15 @@ add_library(libSceNpSnsFacebookDialog SHARED EXCLUDE_FROM_ALL Export.cpp) +target_link_libraries(libSceNpSnsFacebookDialog PRIVATE libSceIme) target_include_directories(libSceNpSnsFacebookDialog PRIVATE ${LIBS_INCLUDE_DIR}) configure_windows_unwind(libSceNpSnsFacebookDialog) if(BUILD_TESTING) add_test_executable(guest_np_sns_facebook_dialog_tests ${LIBS_INCLUDE_DIR}/tests/GuestNpSnsFacebookDialog.cpp) target_include_directories(guest_np_sns_facebook_dialog_tests PRIVATE ${LIBS_INCLUDE_DIR}) - target_link_libraries(guest_np_sns_facebook_dialog_tests PRIVATE libSceNpSnsFacebookDialog) + target_link_libraries(guest_np_sns_facebook_dialog_tests PRIVATE libSceNpSnsFacebookDialog libSceIme) add_test(NAME guest_np_sns_facebook_dialog COMMAND guest_np_sns_facebook_dialog_tests) if(WIN32) set_tests_properties(guest_np_sns_facebook_dialog PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") + "PATH=path_list_prepend:$;PATH=path_list_prepend:$") endif() endif() diff --git a/core/libs/prx/libSceNpSnsFacebookDialog/Export.cpp b/core/libs/prx/libSceNpSnsFacebookDialog/Export.cpp index ebad76b2f2..c5010ded30 100644 --- a/core/libs/prx/libSceNpSnsFacebookDialog/Export.cpp +++ b/core/libs/prx/libSceNpSnsFacebookDialog/Export.cpp @@ -5,6 +5,7 @@ #include #include "SceTypes.hpp" #include "prx/libc/include/General.hpp" +#include "prx/libSceIme/include/PsnDialogNotice.hpp" namespace { @@ -37,6 +38,7 @@ int APS5_VABI sceNpSnsFacebookDialogOpen(const void* param) { if (status == COMMON_DIALOG_STATUS_RUNNING) return COMMON_DIALOG_ERROR_BUSY; if (param == nullptr) return COMMON_DIALOG_ERROR_ARG_NULL; g_status = COMMON_DIALOG_STATUS_FINISHED; + PsnDialogNoticeOffer_nid_postfix(PsnDialogNoticeKind::PsnFeature); return 0; } diff --git a/core/libs/prx/libSceNpTcs/Export.cpp b/core/libs/prx/libSceNpTcs/Export.cpp index f496f8ffbf..78dee5e9ae 100644 --- a/core/libs/prx/libSceNpTcs/Export.cpp +++ b/core/libs/prx/libSceNpTcs/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libSceNpTcs/include/LegacyExports.hpp" +#include "prx/libc/include/general/ExportMacros.hpp" #include "prx/libSceNpTcs/include/Api.hpp" #include #include @@ -22,3 +24,47 @@ int APS5_VABI sceNpTcsIntUploadDataToNewSlotBegin() { } } + +extern "C" { + +int APS5_VABI npTcsLegacyUnknown__minus_Bbx0u2xR4Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-Bbx0u2xR4Q", npTcsLegacyUnknown__minus_Bbx0u2xR4Q_nid_no_patch); + +int APS5_VABI npTcsLegacyUnknown_3ruFwEv4KQg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3ruFwEv4KQg", npTcsLegacyUnknown_3ruFwEv4KQg_nid_no_patch); + +int APS5_VABI npTcsLegacyUnknown_Mlt9z_minus_KrFc4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Mlt9z-KrFc4", npTcsLegacyUnknown_Mlt9z_minus_KrFc4_nid_no_patch); + +int APS5_VABI npTcsLegacyUnknown_ORvFvy4FTvs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ORvFvy4FTvs", npTcsLegacyUnknown_ORvFvy4FTvs_nid_no_patch); + +int APS5_VABI npTcsLegacyUnknown_Qx4CWBw5quY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Qx4CWBw5quY", npTcsLegacyUnknown_Qx4CWBw5quY_nid_no_patch); + +int APS5_VABI npTcsLegacyUnknown_YTUqdMJrU6Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YTUqdMJrU6Q", npTcsLegacyUnknown_YTUqdMJrU6Q_nid_no_patch); + +int APS5_VABI npTcsLegacyUnknown_ik_minus_uhY6YvWk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ik-uhY6YvWk", npTcsLegacyUnknown_ik_minus_uhY6YvWk_nid_no_patch); + +int APS5_VABI npTcsLegacyUnknown_xSse4lLrSNA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xSse4lLrSNA", npTcsLegacyUnknown_xSse4lLrSNA_nid_no_patch); + +} diff --git a/core/libs/prx/libSceNpTcs/include/LegacyExports.hpp b/core/libs/prx/libSceNpTcs/include/LegacyExports.hpp new file mode 100644 index 0000000000..0238e33d45 --- /dev/null +++ b/core/libs/prx/libSceNpTcs/include/LegacyExports.hpp @@ -0,0 +1,16 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI npTcsLegacyUnknown__minus_Bbx0u2xR4Q_nid_no_patch(); +int APS5_VABI npTcsLegacyUnknown_3ruFwEv4KQg_nid_no_patch(); +int APS5_VABI npTcsLegacyUnknown_Mlt9z_minus_KrFc4_nid_no_patch(); +int APS5_VABI npTcsLegacyUnknown_ORvFvy4FTvs_nid_no_patch(); +int APS5_VABI npTcsLegacyUnknown_Qx4CWBw5quY_nid_no_patch(); +int APS5_VABI npTcsLegacyUnknown_YTUqdMJrU6Q_nid_no_patch(); +int APS5_VABI npTcsLegacyUnknown_ik_minus_uhY6YvWk_nid_no_patch(); +int APS5_VABI npTcsLegacyUnknown_xSse4lLrSNA_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceNpTcs/libSceNpTcs.hpp b/core/libs/prx/libSceNpTcs/libSceNpTcs.hpp index cf84369ec2..6d7edef15f 100644 --- a/core/libs/prx/libSceNpTcs/libSceNpTcs.hpp +++ b/core/libs/prx/libSceNpTcs/libSceNpTcs.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceNpTcs/include/Api.hpp" +#include "prx/libSceNpTcs/include/LegacyExports.hpp" diff --git a/core/libs/prx/libSceNpTrophy/Export.cpp b/core/libs/prx/libSceNpTrophy/Export.cpp index e7cf7428a1..3322573f4d 100644 --- a/core/libs/prx/libSceNpTrophy/Export.cpp +++ b/core/libs/prx/libSceNpTrophy/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceNpTrophy/include/InventoryExports.hpp" #include #include "prx/libSceNpTrophy/include/Api.hpp" #include @@ -811,3 +813,37 @@ int APS5_VABI sceNpTrophySystemWrapGetTrophyDetails() { } } + +extern "C" { + +int APS5_VABI libSceNpTrophyUnknown__plus_O9vU1CpGZA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+O9vU1CpGZA", libSceNpTrophyUnknown__plus_O9vU1CpGZA_nid_no_patch); + +int APS5_VABI libSceNpTrophyUnknown__plus_not13BEdVI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+not13BEdVI", libSceNpTrophyUnknown__plus_not13BEdVI_nid_no_patch); + +int APS5_VABI libSceNpTrophyUnknown_FJZW2oHUHFk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FJZW2oHUHFk", libSceNpTrophyUnknown_FJZW2oHUHFk_nid_no_patch); + +int APS5_VABI libSceNpTrophyUnknown_bGnKq23jqek_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bGnKq23jqek", libSceNpTrophyUnknown_bGnKq23jqek_nid_no_patch); + +int APS5_VABI libSceNpTrophyUnknown_lX611WLCvX0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lX611WLCvX0", libSceNpTrophyUnknown_lX611WLCvX0_nid_no_patch); + +int APS5_VABI libSceNpTrophyUnknown_n4AHGHb_minus_pfY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("n4AHGHb-pfY", libSceNpTrophyUnknown_n4AHGHb_minus_pfY_nid_no_patch); + +} diff --git a/core/libs/prx/libSceNpTrophy/include/InventoryExports.hpp b/core/libs/prx/libSceNpTrophy/include/InventoryExports.hpp new file mode 100644 index 0000000000..ad8cbd3296 --- /dev/null +++ b/core/libs/prx/libSceNpTrophy/include/InventoryExports.hpp @@ -0,0 +1,14 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceNpTrophyUnknown__plus_O9vU1CpGZA_nid_no_patch(); +int APS5_VABI libSceNpTrophyUnknown__plus_not13BEdVI_nid_no_patch(); +int APS5_VABI libSceNpTrophyUnknown_FJZW2oHUHFk_nid_no_patch(); +int APS5_VABI libSceNpTrophyUnknown_bGnKq23jqek_nid_no_patch(); +int APS5_VABI libSceNpTrophyUnknown_lX611WLCvX0_nid_no_patch(); +int APS5_VABI libSceNpTrophyUnknown_n4AHGHb_minus_pfY_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceNpTrophy/libSceNpTrophy.hpp b/core/libs/prx/libSceNpTrophy/libSceNpTrophy.hpp index f808efbd11..154e3bf20d 100644 --- a/core/libs/prx/libSceNpTrophy/libSceNpTrophy.hpp +++ b/core/libs/prx/libSceNpTrophy/libSceNpTrophy.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceNpTrophy/include/Api.hpp" +#include "prx/libSceNpTrophy/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceNpTrophy2/Export.cpp b/core/libs/prx/libSceNpTrophy2/Export.cpp index 31a83cfca0..4958ac0ad7 100644 --- a/core/libs/prx/libSceNpTrophy2/Export.cpp +++ b/core/libs/prx/libSceNpTrophy2/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libSceNpTrophy2/include/LegacyExports.hpp" +#include "prx/libc/include/general/ExportMacros.hpp" #include "prx/libSceNpTrophy2/include/InventoryExports.hpp" #include "prx/libSceNpTrophy2/include/Api.hpp" #include @@ -187,3 +189,32 @@ int APS5_VABI sceNpTrophy2SystemUnregisterTitleUpdateCallback() { } } + +extern "C" { + +int APS5_VABI npTrophy2LegacyUnknown_1nbnAo_minus_VuLw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1nbnAo-VuLw", npTrophy2LegacyUnknown_1nbnAo_minus_VuLw_nid_no_patch); + +int APS5_VABI npTrophy2LegacyUnknown_aEjFqY489BI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aEjFqY489BI", npTrophy2LegacyUnknown_aEjFqY489BI_nid_no_patch); + +int APS5_VABI npTrophy2LegacyUnknown_b2NKDc_plus__minus_VX4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("b2NKDc+-VX4", npTrophy2LegacyUnknown_b2NKDc_plus__minus_VX4_nid_no_patch); + +int APS5_VABI npTrophy2LegacyUnknown_cKAQ579AuCc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cKAQ579AuCc", npTrophy2LegacyUnknown_cKAQ579AuCc_nid_no_patch); + +int APS5_VABI npTrophy2LegacyUnknown_g9PYnP3Tca0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("g9PYnP3Tca0", npTrophy2LegacyUnknown_g9PYnP3Tca0_nid_no_patch); + +} diff --git a/core/libs/prx/libSceNpTrophy2/include/LegacyExports.hpp b/core/libs/prx/libSceNpTrophy2/include/LegacyExports.hpp new file mode 100644 index 0000000000..e976ba1862 --- /dev/null +++ b/core/libs/prx/libSceNpTrophy2/include/LegacyExports.hpp @@ -0,0 +1,13 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI npTrophy2LegacyUnknown_1nbnAo_minus_VuLw_nid_no_patch(); +int APS5_VABI npTrophy2LegacyUnknown_aEjFqY489BI_nid_no_patch(); +int APS5_VABI npTrophy2LegacyUnknown_b2NKDc_plus__minus_VX4_nid_no_patch(); +int APS5_VABI npTrophy2LegacyUnknown_cKAQ579AuCc_nid_no_patch(); +int APS5_VABI npTrophy2LegacyUnknown_g9PYnP3Tca0_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceNpTrophy2/libSceNpTrophy2.hpp b/core/libs/prx/libSceNpTrophy2/libSceNpTrophy2.hpp index 0a98172b4b..65712901d7 100644 --- a/core/libs/prx/libSceNpTrophy2/libSceNpTrophy2.hpp +++ b/core/libs/prx/libSceNpTrophy2/libSceNpTrophy2.hpp @@ -2,3 +2,4 @@ #include "prx/libSceNpTrophy2/include/Api.hpp" #include "prx/libSceNpTrophy2/include/InventoryExports.hpp" +#include "prx/libSceNpTrophy2/include/LegacyExports.hpp" diff --git a/core/libs/prx/libSceNpTrophy2/tests/TrophyStore.cpp b/core/libs/prx/libSceNpTrophy2/tests/TrophyStore.cpp index 5a70852cc0..67651be3da 100644 --- a/core/libs/prx/libSceNpTrophy2/tests/TrophyStore.cpp +++ b/core/libs/prx/libSceNpTrophy2/tests/TrophyStore.cpp @@ -3,6 +3,7 @@ #include "prx/libSceNpTrophy2/include/TitleTrophies.hpp" #include "prx/libSceNpTrophy2/include/TrophyStore.hpp" #include "prx/libc/include/general/VabiMacros.hpp" +#include "tests/TemporaryFile.hpp" #include #include @@ -91,7 +92,7 @@ class StderrCapture { public: StderrCapture() { std::fflush(stderr); - file = std::tmpfile(); + file = TemporaryFile::Open(); check(file != nullptr, "cannot open a temporary file for stderr"); #ifdef _WIN32 saved = _dup(_fileno(stderr)); diff --git a/core/libs/prx/libSceNpTus/Export.cpp b/core/libs/prx/libSceNpTus/Export.cpp index fcd25e7083..d0a0d22a42 100644 --- a/core/libs/prx/libSceNpTus/Export.cpp +++ b/core/libs/prx/libSceNpTus/Export.cpp @@ -1002,8 +1002,7 @@ int APS5_VABI sceNpTssGetData() { } int APS5_VABI sceNpTusCreateNpTitleCtx(std::uint32_t serviceLabel, void* npId) { - NotImplemented_nid_no_patch(__func__); - return 0; + return sceNpTssCreateNpTitleCtx(serviceLabel, static_cast(npId)); } int APS5_VABI sceNpTusGetData(int reqId, const void* targetNpId, std::int32_t slotId, void* dataStatus, std::uint64_t dataStatusSize, void* data, std::uint64_t recvSize, void* option) { diff --git a/core/libs/prx/libSceNpWebApi/CMakeLists.txt b/core/libs/prx/libSceNpWebApi/CMakeLists.txt index 0e3e193000..c40af150ee 100644 --- a/core/libs/prx/libSceNpWebApi/CMakeLists.txt +++ b/core/libs/prx/libSceNpWebApi/CMakeLists.txt @@ -1,4 +1,4 @@ -add_library(libSceNpWebApi SHARED EXCLUDE_FROM_ALL Export.cpp) +add_library(libSceNpWebApi SHARED EXCLUDE_FROM_ALL Export.cpp InventoryExports.cpp) target_include_directories(libSceNpWebApi PRIVATE ${LIBS_INCLUDE_DIR}) configure_windows_unwind(libSceNpWebApi) @@ -14,3 +14,16 @@ if(BUILD_TESTING) "PATH=path_list_prepend:$") endif() endif() + +if(BUILD_TESTING) + add_test_executable(guest_np_web_api_initialize_tests ${LIBS_INCLUDE_DIR}/tests/GuestNpWebApiInitialize.cpp) + target_include_directories(guest_np_web_api_initialize_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_np_web_api_initialize_tests PRIVATE libSceNpWebApi ${CMAKE_DL_LIBS}) + configure_windows_unwind(guest_np_web_api_initialize_tests) + add_test(NAME guest_np_web_api_initialize COMMAND guest_np_web_api_initialize_tests) + set_tests_properties(guest_np_web_api_initialize PROPERTIES TIMEOUT 20) + if(WIN32) + set_tests_properties(guest_np_web_api_initialize PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceNpWebApi/Export.cpp b/core/libs/prx/libSceNpWebApi/Export.cpp index e727950f59..4f9b31e73c 100644 --- a/core/libs/prx/libSceNpWebApi/Export.cpp +++ b/core/libs/prx/libSceNpWebApi/Export.cpp @@ -2,6 +2,7 @@ #include "SceTypes.hpp" #include "prx/libc/include/ApplicationHeap.hpp" #include "prx/libc/include/General.hpp" +#include "prx/libkernel/Time/include/Time.hpp" #include "prx/libSceUserService/UserService.hpp" #include #include @@ -29,15 +30,22 @@ static constexpr int SCE_NP_WEBAPI_ERROR_SIGNED_IN_USER_NOT_FOUND = static_cast< static constexpr int SCE_NP_WEBAPI_ERROR_LIB_CONTEXT_MAX = static_cast(0x8055291A); static constexpr int SCE_NP_WEBAPI_HTTP_METHOD_DELETE = 3; +static constexpr int SCE_NP_WEBAPI_HTTP_METHOD_PATCH = 4; static constexpr std::uint32_t SCE_NP_INVALID_SERVICE_LABEL = 0xFFFFFFFF; static constexpr std::uint32_t SDK_VERSION_1_00 = 0x01000000; static constexpr std::uint32_t SDK_VERSION_2_00 = 0x02000000; static constexpr std::uint32_t SDK_VERSION_2_50 = 0x02500000; +static constexpr std::uint32_t SDK_VERSION_3_00 = 0x03000000; +static constexpr std::uint64_t TIMEOUT_SCAN_PERIOD = 1000; namespace { struct Request { bool aborted; + bool multipart; + bool expired; + std::uint32_t timeout; + std::uint64_t endTime; }; struct UserContext { @@ -51,6 +59,7 @@ struct LibraryContext { int libHttpCtxId; std::size_t poolSize; std::unordered_set handles; + std::unordered_set timeoutCapableHandles; std::unordered_set pushEventFilters; std::unordered_map userContexts; }; @@ -73,6 +82,7 @@ int lastContext = 0; int lastObject = 0; int lastUserContext = 0; std::int64_t lastRequest = 0; +std::uint64_t lastTimeoutScan = 0; int nextObject() { lastObject = lastObject % 0xefffffff + 1; @@ -102,6 +112,30 @@ RequestLookup findRequest(std::int64_t requestId) { return {0, lookup.user, &request->second}; } +int createRequest(int titleUserCtxId, bool multipart, std::int64_t* requestId) { + const auto lookup = findUserContext(titleUserCtxId); + if (lookup.error != 0) return lookup.error; + lastRequest = lastRequest % 0xffffffff + 1; + const std::int64_t base = static_cast(titleUserCtxId) << 32; + std::int64_t id = base | lastRequest; + while (lookup.user->requests.contains(id)) --id; + if (id <= base) throw std::runtime_error("sceNpWebApiCreateRequest: every request id of the user context is in use"); + lookup.user->requests.emplace(id, Request{false, multipart, false, 0, 0}); + if (requestId) *requestId = id; + return 0; +} + +int sendRequest(std::int64_t requestId) { + std::lock_guard lock(contextsMutex); + const auto lookup = findRequest(requestId); + if (lookup.error != 0) return lookup.error; + auto& request = *lookup.request; + if (request.timeout != 0 && request.endTime == 0) request.endTime = sceKernelGetProcessTime() + request.timeout; + if (request.multipart) return SCE_NP_WEBAPI_ERROR_INVALID_ARGUMENT; + if (request.aborted && !request.expired) return SCE_NP_WEBAPI_ERROR_ABORTED; + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + } extern "C" { @@ -136,6 +170,7 @@ int APS5_VABI sceNpWebApiCreateHandle(int libCtxId) { if (context == contexts.end()) return SCE_NP_WEBAPI_ERROR_LIB_CONTEXT_NOT_FOUND; const auto handle = nextObject(); context->second.handles.insert(handle); + if (compiledSdkVersion() >= SDK_VERSION_3_00) context->second.timeoutCapableHandles.insert(handle); return handle; } @@ -154,16 +189,7 @@ int APS5_VABI sceNpWebApiCreateRequest(int titleUserCtxId, const char* apiGroup, if (contentParameter && contentParameter->contentLength != 0 && !contentParameter->contentType) return SCE_NP_WEBAPI_ERROR_INVALID_CONTENT_PARAMETER; if (method > SCE_NP_WEBAPI_HTTP_METHOD_DELETE && compiledSdkVersion() >= SDK_VERSION_2_50) return SCE_NP_WEBAPI_ERROR_INVALID_ARGUMENT; std::lock_guard lock(contextsMutex); - const auto lookup = findUserContext(titleUserCtxId); - if (lookup.error != 0) return lookup.error; - lastRequest = lastRequest % 0xffffffff + 1; - const std::int64_t base = static_cast(titleUserCtxId) << 32; - std::int64_t id = base | lastRequest; - while (lookup.user->requests.contains(id)) --id; - if (id <= base) throw std::runtime_error("sceNpWebApiCreateRequest: every request id of the user context is in use"); - lookup.user->requests.emplace(id, Request{false}); - if (requestId) *requestId = id; - return 0; + return createRequest(titleUserCtxId, false, requestId); } int APS5_VABI sceNpWebApiCreateServicePushEventFilter(int libCtxId, int handleId, const char* npServiceName, std::uint32_t npServiceLabel, const void* filterParam, std::size_t filterParamNum) { @@ -188,6 +214,7 @@ int APS5_VABI sceNpWebApiDeleteHandle(int libCtxId, int handleId) { std::lock_guard lock(contextsMutex); const auto context = contexts.find(libCtxId); if (context == contexts.end()) return SCE_NP_WEBAPI_ERROR_LIB_CONTEXT_NOT_FOUND; + context->second.timeoutCapableHandles.erase(handleId); return context->second.handles.erase(handleId) != 0 ? 0 : SCE_NP_WEBAPI_ERROR_HANDLE_NOT_FOUND; } @@ -273,11 +300,7 @@ int APS5_VABI sceNpWebApiRegisterServicePushEventCallback(int titleUserCtxId, in int APS5_VABI sceNpWebApiSendRequest(std::int64_t requestId, const void* data, std::size_t dataSize) { (void)data; (void)dataSize; - std::lock_guard lock(contextsMutex); - const auto lookup = findRequest(requestId); - if (lookup.error != 0) return lookup.error; - if (lookup.request->aborted) return SCE_NP_WEBAPI_ERROR_ABORTED; - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; + return sendRequest(requestId); } int APS5_VABI sceNpWebApiTerminate(int libCtxId) { @@ -304,20 +327,37 @@ int APS5_VABI sceNpWebApiUtilityParseNpId() { return 0; } -int APS5_VABI sceNpWebApiAbortHandle() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI sceNpWebApiAbortHandle(int libCtxId, int handleId) { + std::lock_guard lock(contextsMutex); + const auto context = contexts.find(libCtxId); + if (context == contexts.end()) return SCE_NP_WEBAPI_ERROR_LIB_CONTEXT_NOT_FOUND; + return context->second.handles.contains(handleId) ? 0 : SCE_NP_WEBAPI_ERROR_HANDLE_NOT_FOUND; } -int APS5_VABI sceNpWebApiAddHttpRequestHeader() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI sceNpWebApiAddHttpRequestHeader(std::int64_t requestId, const char* fieldName, const char* value) { + if (!fieldName || !value) return SCE_NP_WEBAPI_ERROR_INVALID_ARGUMENT; + std::lock_guard lock(contextsMutex); + return findRequest(requestId).error; } int APS5_VABI sceNpWebApiAddMultipartPart() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI sceNpWebApiCheckTimeout() { - NotImplemented_nid_no_patch(__func__); +void APS5_VABI sceNpWebApiCheckTimeout() { + const std::uint64_t now = sceKernelGetProcessTime(); + std::lock_guard lock(contextsMutex); + if (contexts.empty() || now < lastTimeoutScan + TIMEOUT_SCAN_PERIOD) return; + lastTimeoutScan = now; + for (auto& [libCtxId, library] : contexts) { + for (auto& [titleUserCtxId, user] : library.userContexts) { + for (auto& [requestId, request] : user.requests) { + if (request.expired || request.endTime == 0 || request.endTime >= now) continue; + request.expired = true; + request.aborted = true; + } + } + } } int APS5_VABI sceNpWebApiClearAllUnusedConnection() { @@ -328,8 +368,11 @@ int APS5_VABI sceNpWebApiClearUnusedConnection() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI sceNpWebApiCreateMultipartRequest() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI sceNpWebApiCreateMultipartRequest(int titleUserCtxId, const char* apiGroup, const char* path, int method, std::int64_t* requestId) { + if (!apiGroup || !path) return SCE_NP_WEBAPI_ERROR_INVALID_ARGUMENT; + if (method > SCE_NP_WEBAPI_HTTP_METHOD_DELETE && compiledSdkVersion() >= SDK_VERSION_2_50) return SCE_NP_WEBAPI_ERROR_INVALID_ARGUMENT; + std::lock_guard lock(contextsMutex); + return createRequest(titleUserCtxId, true, requestId); } int APS5_VABI sceNpWebApiGetConnectionStats() { @@ -340,24 +383,33 @@ int APS5_VABI sceNpWebApiGetErrorCode() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI sceNpWebApiInitializeForPresence() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI sceNpWebApiInitializeForPresence(int libHttpCtxId, std::size_t poolSize) { + return sceNpWebApiInitialize(libHttpCtxId, poolSize); } int APS5_VABI sceNpWebApiIntCreateCtxIndExtdPushEventFilter() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI sceNpWebApiIntCreateRequest() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI sceNpWebApiIntCreateRequest(int titleUserCtxId, const char* apiGroup, const char* path, int method, const NpWebApiContentParameter* contentParameter, const NpWebApiIntCreateRequestExtraArgs* internalArgs, std::int64_t* requestId) { + if (!apiGroup || !path || method > SCE_NP_WEBAPI_HTTP_METHOD_PATCH) return SCE_NP_WEBAPI_ERROR_INVALID_ARGUMENT; + if (contentParameter && contentParameter->contentLength != 0 && !contentParameter->contentType) return SCE_NP_WEBAPI_ERROR_INVALID_CONTENT_PARAMETER; + std::lock_guard lock(contextsMutex); + if (internalArgs && (internalArgs->unknown0 || internalArgs->unknown1 || internalArgs->unknown2)) { + const auto lookup = findUserContext(titleUserCtxId); + if (lookup.error != 0) return lookup.error; + NotImplemented_nid_no_patch("sceNpWebApiIntCreateRequest with internal arguments set"); + } + return createRequest(titleUserCtxId, false, requestId); } int APS5_VABI sceNpWebApiIntCreateServicePushEventFilter() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI sceNpWebApiIntInitialize() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI sceNpWebApiIntInitialize(const NpWebApiIntInitializeArgs* args) { + if (!args || args->structSize != sizeof(NpWebApiIntInitializeArgs)) return SCE_NP_WEBAPI_ERROR_INVALID_ARGUMENT; + return sceNpWebApiInitialize(static_cast(args->libHttpCtxId), args->poolSize); } int APS5_VABI sceNpWebApiIntRegisterServicePushEventCallback() { @@ -372,8 +424,11 @@ int APS5_VABI sceNpWebApiRegisterExtdPushEventCallback() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI sceNpWebApiRegisterNotificationCallback() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI sceNpWebApiRegisterNotificationCallback(int titleUserCtxId, void* callback, void* userArg) { + (void)userArg; + if (!callback) return SCE_NP_WEBAPI_ERROR_INVALID_ARGUMENT; + std::lock_guard lock(contextsMutex); + return findUserContext(titleUserCtxId).error; } int APS5_VABI sceNpWebApiSendMultipartRequest() { @@ -384,32 +439,47 @@ int APS5_VABI sceNpWebApiSendMultipartRequest2() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI sceNpWebApiSendRequest2() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI sceNpWebApiSendRequest2(std::int64_t requestId, const void* data, std::size_t dataSize, void* responseInformation) { + (void)data; + (void)dataSize; + (void)responseInformation; + return sendRequest(requestId); } -int APS5_VABI sceNpWebApiSetHandleTimeout() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI sceNpWebApiSetHandleTimeout(int libCtxId, int handleId, std::uint32_t timeout) { + (void)timeout; + std::lock_guard lock(contextsMutex); + const auto context = contexts.find(libCtxId); + if (context == contexts.end()) return SCE_NP_WEBAPI_ERROR_LIB_CONTEXT_NOT_FOUND; + return context->second.timeoutCapableHandles.contains(handleId) ? 0 : SCE_NP_WEBAPI_ERROR_HANDLE_NOT_FOUND; } int APS5_VABI sceNpWebApiSetMaxConnection() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI sceNpWebApiSetMultipartContentType() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI sceNpWebApiSetMultipartContentType(std::int64_t requestId, const char* typeName, const char* boundary) { + (void)typeName; + (void)boundary; + std::lock_guard lock(contextsMutex); + return findRequest(requestId).error; } -int APS5_VABI sceNpWebApiSetRequestTimeout() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI sceNpWebApiSetRequestTimeout(std::int64_t requestId, std::uint32_t timeout) { + std::lock_guard lock(contextsMutex); + const auto lookup = findRequest(requestId); + if (lookup.error != 0) return lookup.error; + lookup.request->timeout = timeout; + return 0; } -int APS5_VABI sceNpWebApiUnregisterNotificationCallback() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI sceNpWebApiUnregisterNotificationCallback(int titleUserCtxId) { + std::lock_guard lock(contextsMutex); + return findUserContext(titleUserCtxId).error; } -int APS5_VABI sceNpWebApiVshInitialize() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI sceNpWebApiVshInitialize(int libHttpCtxId, std::size_t poolSize) { + return sceNpWebApiInitialize(libHttpCtxId, poolSize); } } diff --git a/core/libs/prx/libSceNpWebApi/InventoryExports.cpp b/core/libs/prx/libSceNpWebApi/InventoryExports.cpp new file mode 100644 index 0000000000..ba72276195 --- /dev/null +++ b/core/libs/prx/libSceNpWebApi/InventoryExports.cpp @@ -0,0 +1,197 @@ +#include "SceTypes.hpp" +#include "prx/libc/include/General.hpp" +#include "prx/libc/include/general/ExportMacros.hpp" + +extern "C" { + +int APS5_VABI libSceNpWebApiUnknown__plus_aMuhoVidDY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+aMuhoVidDY", libSceNpWebApiUnknown__plus_aMuhoVidDY_nid_no_patch); + +int APS5_VABI libSceNpWebApiUnknown_0cCtt7Uv6rU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0cCtt7Uv6rU", libSceNpWebApiUnknown_0cCtt7Uv6rU_nid_no_patch); + +int APS5_VABI libSceNpWebApiUnknown_4yR2XRjuTRI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4yR2XRjuTRI", libSceNpWebApiUnknown_4yR2XRjuTRI_nid_no_patch); + +int APS5_VABI libSceNpWebApiUnknown_54n5gNkHtlM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("54n5gNkHtlM", libSceNpWebApiUnknown_54n5gNkHtlM_nid_no_patch); + +int APS5_VABI libSceNpWebApiUnknown_B4OVXU6VY9o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("B4OVXU6VY9o", libSceNpWebApiUnknown_B4OVXU6VY9o_nid_no_patch); + +int APS5_VABI libSceNpWebApiUnknown_BkxO0e2_plus_ueg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BkxO0e2+ueg", libSceNpWebApiUnknown_BkxO0e2_plus_ueg_nid_no_patch); + +int APS5_VABI libSceNpWebApiUnknown_Gm138_minus_2DI6g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Gm138-2DI6g", libSceNpWebApiUnknown_Gm138_minus_2DI6g_nid_no_patch); + +int APS5_VABI libSceNpWebApiUnknown_HgaTom_minus_g_plus_VQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HgaTom-g+VQ", libSceNpWebApiUnknown_HgaTom_minus_g_plus_VQ_nid_no_patch); + +int APS5_VABI libSceNpWebApiUnknown_JKm18ddwAM8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JKm18ddwAM8", libSceNpWebApiUnknown_JKm18ddwAM8_nid_no_patch); + +int APS5_VABI libSceNpWebApiUnknown_JNiFPWtH_minus_Hk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JNiFPWtH-Hk", libSceNpWebApiUnknown_JNiFPWtH_minus_Hk_nid_no_patch); + +int APS5_VABI libSceNpWebApiUnknown_KEYeKen41pc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KEYeKen41pc", libSceNpWebApiUnknown_KEYeKen41pc_nid_no_patch); + +int APS5_VABI libSceNpWebApiUnknown_PCliRwT6ueA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PCliRwT6ueA", libSceNpWebApiUnknown_PCliRwT6ueA_nid_no_patch); + +int APS5_VABI libSceNpWebApiUnknown_PwJ4BO0uwR4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PwJ4BO0uwR4", libSceNpWebApiUnknown_PwJ4BO0uwR4_nid_no_patch); + +int APS5_VABI libSceNpWebApiUnknown_QGbJTngpl80_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QGbJTngpl80", libSceNpWebApiUnknown_QGbJTngpl80_nid_no_patch); + +int APS5_VABI libSceNpWebApiUnknown_U2KAvj2rtSE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("U2KAvj2rtSE", libSceNpWebApiUnknown_U2KAvj2rtSE_nid_no_patch); + +int APS5_VABI libSceNpWebApiUnknown_V6DhvHJCGfM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("V6DhvHJCGfM", libSceNpWebApiUnknown_V6DhvHJCGfM_nid_no_patch); + +int APS5_VABI libSceNpWebApiUnknown_WBl0nAQLZjc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WBl0nAQLZjc", libSceNpWebApiUnknown_WBl0nAQLZjc_nid_no_patch); + +int APS5_VABI libSceNpWebApiUnknown_YZjQyCXoYxk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YZjQyCXoYxk", libSceNpWebApiUnknown_YZjQyCXoYxk_nid_no_patch); + +int APS5_VABI libSceNpWebApiUnknown_YfK56KsJN0M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YfK56KsJN0M", libSceNpWebApiUnknown_YfK56KsJN0M_nid_no_patch); + +int APS5_VABI libSceNpWebApiUnknown_a8OI5hE_minus_DUQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("a8OI5hE-DUQ", libSceNpWebApiUnknown_a8OI5hE_minus_DUQ_nid_no_patch); + +int APS5_VABI libSceNpWebApiUnknown_daA4FMfpA58_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("daA4FMfpA58", libSceNpWebApiUnknown_daA4FMfpA58_nid_no_patch); + +int APS5_VABI libSceNpWebApiUnknown_eJ1gJsUhQW4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eJ1gJsUhQW4", libSceNpWebApiUnknown_eJ1gJsUhQW4_nid_no_patch); + +int APS5_VABI libSceNpWebApiUnknown_fe1j0GOZ7_minus_8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fe1j0GOZ7-8", libSceNpWebApiUnknown_fe1j0GOZ7_minus_8_nid_no_patch); + +int APS5_VABI libSceNpWebApiUnknown_flWi3MA9OVo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("flWi3MA9OVo", libSceNpWebApiUnknown_flWi3MA9OVo_nid_no_patch); + +int APS5_VABI libSceNpWebApiUnknown_fwS31KfUHoA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fwS31KfUHoA", libSceNpWebApiUnknown_fwS31KfUHoA_nid_no_patch); + +int APS5_VABI libSceNpWebApiUnknown_jhZyUt_plus_lyVc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jhZyUt+lyVc", libSceNpWebApiUnknown_jhZyUt_plus_lyVc_nid_no_patch); + +int APS5_VABI libSceNpWebApiUnknown_ldAEblBOOwk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ldAEblBOOwk", libSceNpWebApiUnknown_ldAEblBOOwk_nid_no_patch); + +int APS5_VABI libSceNpWebApiUnknown_lyhL_minus_aTxj98_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lyhL-aTxj98", libSceNpWebApiUnknown_lyhL_minus_aTxj98_nid_no_patch); + +int APS5_VABI libSceNpWebApiUnknown_meMsH0c36rQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("meMsH0c36rQ", libSceNpWebApiUnknown_meMsH0c36rQ_nid_no_patch); + +int APS5_VABI libSceNpWebApiUnknown_nP9mHqC8v4M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nP9mHqC8v4M", libSceNpWebApiUnknown_nP9mHqC8v4M_nid_no_patch); + +int APS5_VABI libSceNpWebApiUnknown_nrDh9GesOyk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nrDh9GesOyk", libSceNpWebApiUnknown_nrDh9GesOyk_nid_no_patch); + +int APS5_VABI libSceNpWebApiUnknown_ojGP5vur_plus_qM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ojGP5vur+qM", libSceNpWebApiUnknown_ojGP5vur_plus_qM_nid_no_patch); + +int APS5_VABI libSceNpWebApiUnknown_ugei4b97OXE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ugei4b97OXE", libSceNpWebApiUnknown_ugei4b97OXE_nid_no_patch); + +int APS5_VABI libSceNpWebApiUnknown_vQgD7uDMKaA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vQgD7uDMKaA", libSceNpWebApiUnknown_vQgD7uDMKaA_nid_no_patch); + +int APS5_VABI libSceNpWebApiUnknown_vm9OVSS7E18_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vm9OVSS7E18", libSceNpWebApiUnknown_vm9OVSS7E18_nid_no_patch); + +int APS5_VABI libSceNpWebApiUnknown_wNSQ60gepNA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wNSQ60gepNA", libSceNpWebApiUnknown_wNSQ60gepNA_nid_no_patch); + +int APS5_VABI libSceNpWebApiUnknown_wXXTksptCEo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wXXTksptCEo", libSceNpWebApiUnknown_wXXTksptCEo_nid_no_patch); + +int APS5_VABI libSceNpWebApiUnknown_zQE2rxZdLy8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zQE2rxZdLy8", libSceNpWebApiUnknown_zQE2rxZdLy8_nid_no_patch); + +} diff --git a/core/libs/prx/libSceNpWebApi/include/Api.hpp b/core/libs/prx/libSceNpWebApi/include/Api.hpp index 5956d9f2f3..e8b44ee222 100644 --- a/core/libs/prx/libSceNpWebApi/include/Api.hpp +++ b/core/libs/prx/libSceNpWebApi/include/Api.hpp @@ -2,6 +2,24 @@ #include "SceTypes.hpp" +struct NpWebApiIntInitializeArgs { + std::uint32_t libHttpCtxId; + std::uint8_t reserved[4]; + std::size_t poolSize; + const char* name; + std::size_t structSize; +}; + +static_assert(sizeof(NpWebApiIntInitializeArgs) == 0x20); + +struct NpWebApiIntCreateRequestExtraArgs { + const void* unknown0; + const void* unknown1; + const void* unknown2; +}; + +static_assert(sizeof(NpWebApiIntCreateRequestExtraArgs) == 24); + struct NpWebApiContentParameter { std::uint64_t contentLength; const char* contentType; @@ -36,32 +54,32 @@ int APS5_VABI sceNpWebApiUnregisterPushEventCallback(int titleUserCtxId, int cal int APS5_VABI sceNpWebApiUnregisterServicePushEventCallback(int titleUserCtxId, int callbackId); int APS5_VABI sceNpWebApiUtilityParseNpId(); -int APS5_VABI sceNpWebApiAbortHandle(); -int APS5_VABI sceNpWebApiAddHttpRequestHeader(); +int APS5_VABI sceNpWebApiAbortHandle(int libCtxId, int handleId); +int APS5_VABI sceNpWebApiAddHttpRequestHeader(std::int64_t requestId, const char* fieldName, const char* value); int APS5_VABI sceNpWebApiAddMultipartPart(); -int APS5_VABI sceNpWebApiCheckTimeout(); +void APS5_VABI sceNpWebApiCheckTimeout(); int APS5_VABI sceNpWebApiClearAllUnusedConnection(); int APS5_VABI sceNpWebApiClearUnusedConnection(); -int APS5_VABI sceNpWebApiCreateMultipartRequest(); +int APS5_VABI sceNpWebApiCreateMultipartRequest(int titleUserCtxId, const char* apiGroup, const char* path, int method, std::int64_t* requestId); int APS5_VABI sceNpWebApiGetConnectionStats(); int APS5_VABI sceNpWebApiGetErrorCode(); -int APS5_VABI sceNpWebApiInitializeForPresence(); +int APS5_VABI sceNpWebApiInitializeForPresence(int libHttpCtxId, std::size_t poolSize); int APS5_VABI sceNpWebApiIntCreateCtxIndExtdPushEventFilter(); -int APS5_VABI sceNpWebApiIntCreateRequest(); +int APS5_VABI sceNpWebApiIntCreateRequest(int titleUserCtxId, const char* apiGroup, const char* path, int method, const NpWebApiContentParameter* contentParameter, const NpWebApiIntCreateRequestExtraArgs* internalArgs, std::int64_t* requestId); int APS5_VABI sceNpWebApiIntCreateServicePushEventFilter(); -int APS5_VABI sceNpWebApiIntInitialize(); +int APS5_VABI sceNpWebApiIntInitialize(const NpWebApiIntInitializeArgs* args); int APS5_VABI sceNpWebApiIntRegisterServicePushEventCallback(); int APS5_VABI sceNpWebApiIntRegisterServicePushEventCallbackA(); int APS5_VABI sceNpWebApiRegisterExtdPushEventCallback(); -int APS5_VABI sceNpWebApiRegisterNotificationCallback(); +int APS5_VABI sceNpWebApiRegisterNotificationCallback(int titleUserCtxId, void* callback, void* userArg); int APS5_VABI sceNpWebApiSendMultipartRequest(); int APS5_VABI sceNpWebApiSendMultipartRequest2(); -int APS5_VABI sceNpWebApiSendRequest2(); -int APS5_VABI sceNpWebApiSetHandleTimeout(); +int APS5_VABI sceNpWebApiSendRequest2(std::int64_t requestId, const void* data, std::size_t dataSize, void* responseInformation); +int APS5_VABI sceNpWebApiSetHandleTimeout(int libCtxId, int handleId, std::uint32_t timeout); int APS5_VABI sceNpWebApiSetMaxConnection(); -int APS5_VABI sceNpWebApiSetMultipartContentType(); -int APS5_VABI sceNpWebApiSetRequestTimeout(); -int APS5_VABI sceNpWebApiUnregisterNotificationCallback(); -int APS5_VABI sceNpWebApiVshInitialize(); +int APS5_VABI sceNpWebApiSetMultipartContentType(std::int64_t requestId, const char* typeName, const char* boundary); +int APS5_VABI sceNpWebApiSetRequestTimeout(std::int64_t requestId, std::uint32_t timeout); +int APS5_VABI sceNpWebApiUnregisterNotificationCallback(int titleUserCtxId); +int APS5_VABI sceNpWebApiVshInitialize(int libHttpCtxId, std::size_t poolSize); } diff --git a/core/libs/prx/libSceNpWebApi2/Export.cpp b/core/libs/prx/libSceNpWebApi2/Export.cpp index fda278f8c6..1ede183689 100644 --- a/core/libs/prx/libSceNpWebApi2/Export.cpp +++ b/core/libs/prx/libSceNpWebApi2/Export.cpp @@ -8,6 +8,8 @@ #include #include #include +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceNpWebApi2/include/Firmware320Exports.hpp" // The PSN web API has no service behind it: handles can be created, but requests fail. static constexpr int SCE_NP_WEBAPI2_ERROR_INVALID_ARGUMENT = static_cast(0x80553402); @@ -285,3 +287,27 @@ int APS5_VABI sceNpWebApi2SetMultipartContentType() { } } + +extern "C" { + +int APS5_VABI libSceNpWebApi2Unknown_4N85o28Ifbk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4N85o28Ifbk", libSceNpWebApi2Unknown_4N85o28Ifbk_nid_no_patch); + +int APS5_VABI libSceNpWebApi2Unknown_A9IoYzANK3M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("A9IoYzANK3M", libSceNpWebApi2Unknown_A9IoYzANK3M_nid_no_patch); + +int APS5_VABI libSceNpWebApi2Unknown_lylvdXiq1UE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lylvdXiq1UE", libSceNpWebApi2Unknown_lylvdXiq1UE_nid_no_patch); + +int APS5_VABI libSceNpWebApi2Unknown_qaMcX2_plus_6ZiA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qaMcX2+6ZiA", libSceNpWebApi2Unknown_qaMcX2_plus_6ZiA_nid_no_patch); + +} diff --git a/core/libs/prx/libSceNpWebApi2/include/Firmware320Exports.hpp b/core/libs/prx/libSceNpWebApi2/include/Firmware320Exports.hpp new file mode 100644 index 0000000000..a7eedbb9bc --- /dev/null +++ b/core/libs/prx/libSceNpWebApi2/include/Firmware320Exports.hpp @@ -0,0 +1,12 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceNpWebApi2Unknown_4N85o28Ifbk_nid_no_patch(); +int APS5_VABI libSceNpWebApi2Unknown_A9IoYzANK3M_nid_no_patch(); +int APS5_VABI libSceNpWebApi2Unknown_lylvdXiq1UE_nid_no_patch(); +int APS5_VABI libSceNpWebApi2Unknown_qaMcX2_plus_6ZiA_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceNpWebApi2/libSceNpWebApi2.hpp b/core/libs/prx/libSceNpWebApi2/libSceNpWebApi2.hpp index 6c299c3731..6462dce53f 100644 --- a/core/libs/prx/libSceNpWebApi2/libSceNpWebApi2.hpp +++ b/core/libs/prx/libSceNpWebApi2/libSceNpWebApi2.hpp @@ -1,3 +1,5 @@ #pragma once +#include "prx/libSceNpWebApi2/include/Firmware320Exports.hpp" + #include "prx/libSceNpWebApi2/include/Api.hpp" diff --git a/core/libs/prx/libSceOpusDec/Export.cpp b/core/libs/prx/libSceOpusDec/Export.cpp index 138675d8f7..dc487b2049 100644 --- a/core/libs/prx/libSceOpusDec/Export.cpp +++ b/core/libs/prx/libSceOpusDec/Export.cpp @@ -1,3 +1,4 @@ +#include "prx/libSceOpusDec/include/InventoryExports.hpp" #include "prx/libSceOpusDec/include/Api.hpp" #include "prx/libc/include/general/VabiMacros.hpp" #include "prx/libSceOpusDec/include/OpusDecoder.hpp" @@ -69,3 +70,11 @@ int APS5_VABI sceOpusDecDecodeWithPriorityAndTimeout(void* state, const std::uin } } + +extern "C" { + +int APS5_VABI sceOpusDecGetAjmContext() { + NotImplemented_nid_no_patch(__func__); +} + +} diff --git a/core/libs/prx/libSceOpusDec/include/InventoryExports.hpp b/core/libs/prx/libSceOpusDec/include/InventoryExports.hpp new file mode 100644 index 0000000000..0250712cd4 --- /dev/null +++ b/core/libs/prx/libSceOpusDec/include/InventoryExports.hpp @@ -0,0 +1,9 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI sceOpusDecGetAjmContext(); + +} diff --git a/core/libs/prx/libSceOpusDec/libSceOpusDec.hpp b/core/libs/prx/libSceOpusDec/libSceOpusDec.hpp index fd17892819..36325330f2 100644 --- a/core/libs/prx/libSceOpusDec/libSceOpusDec.hpp +++ b/core/libs/prx/libSceOpusDec/libSceOpusDec.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceOpusDec/include/Api.hpp" +#include "prx/libSceOpusDec/include/InventoryExports.hpp" diff --git a/core/libs/prx/libScePad/CMakeLists.txt b/core/libs/prx/libScePad/CMakeLists.txt index baaa5c8899..48fefce3be 100644 --- a/core/libs/prx/libScePad/CMakeLists.txt +++ b/core/libs/prx/libScePad/CMakeLists.txt @@ -1,6 +1,8 @@ add_library(libScePad SHARED EXCLUDE_FROM_ALL ${CMAKE_CURRENT_SOURCE_DIR}/Export.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/InventoryExports.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/PadState.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/HostVolumeState.cpp ) target_include_directories(libScePad PRIVATE ${LIBS_INCLUDE_DIR}) set_target_properties(libScePad PROPERTIES CXX_EXTENSIONS OFF) diff --git a/core/libs/prx/libScePad/Export.cpp b/core/libs/prx/libScePad/Export.cpp index a0e44bd6b6..e0c2fec1f7 100644 --- a/core/libs/prx/libScePad/Export.cpp +++ b/core/libs/prx/libScePad/Export.cpp @@ -68,6 +68,13 @@ bool KnownHandle(int handle) { return PortOf(handle) >= 0 || SpecialHandle(handle); } +bool OpenHandle(int handle) { + const int port = PortOf(handle); + return (port >= 0 && g_opened[port]) || SpecialHandle(handle); +} + +constexpr std::size_t PAD_LEONARDO_UNIQUE_DATA_SIZE = 0x18; + PadData SpecialData() { PadData data{}; data.left_stick_x = data.left_stick_y = data.right_stick_x = data.right_stick_y = 0x80; @@ -178,8 +185,9 @@ int APS5_VABI scePadGetControllerInformation(int handle, PadControllerInformatio info->stickInfo.deadZoneLeft = 13; info->stickInfo.deadZoneRight = 13; info->connectionType = PAD_CONNECTION_TYPE_LOCAL; - info->connectedCount = 1; - info->connected = true; + const bool connected = PortOf(handle) != 0 || Pad::IsConnected(0); + info->connectedCount = connected ? 1 : 0; + info->connected = connected; info->deviceClass = PAD_DEVICE_CLASS_STANDARD; return PAD_OK; } @@ -212,15 +220,6 @@ int APS5_VABI scePadGetInfo_nid_postfix(PadInfo* info) { ++count; } } - if (count == 0) { - PadInfo::PadTypeInfo& slot = info->padTypeInfo[0]; - slot.connectPort = 0; - slot.status = 1; - slot.deviceType = PAD_DEVICE_TYPE_DUAL_SENSE; - slot.connectType = PAD_CONNECT_TYPE_BLUETOOTH; - std::memcpy(slot.bluetoothMacAddress, PAD_BD_ADDRESS, sizeof(slot.bluetoothMacAddress)); - count = 1; - } info->connectedCount[0] = count; info->connectedCount[1] = 0; return PAD_OK; @@ -814,8 +813,11 @@ int APS5_VABI scePadVrControllerGetPhysicalUsbConnectionStatus(PadVrUsbConnectio } int APS5_VABI scePadParseUniqueDataLeonardo(std::int32_t handle, const PadLeonardoData* data, PadLeonardoUniqueData* uniqueData) { - NotImplemented_nid_no_patch(__func__); - return 0; + (void)handle; + if (!Pad::IsInitialized()) return PAD_ERROR_NOT_INITIALIZED; + if (data == nullptr || uniqueData == nullptr) return PAD_ERROR_INVALID_ARG; + std::memset(static_cast(uniqueData), 0, PAD_LEONARDO_UNIQUE_DATA_SIZE); + return PAD_ERROR_INVALID_HANDLE; } int APS5_VABI scePadGetControllerTypeLeonardo(std::int32_t deviceId, std::int32_t* controllerType) { @@ -957,8 +959,11 @@ int APS5_VABI scePadResetOrientationForTracker(std::int32_t handle) { } int APS5_VABI scePadGetMotionTimerUnit(std::int32_t handle, float* unit) { - NotImplemented_nid_no_patch(__func__); - return 0; + if (!Pad::IsInitialized()) return PAD_ERROR_NOT_INITIALIZED; + if (unit == nullptr) return PAD_ERROR_INVALID_ARG; + *unit = 0.0f; + if (!OpenHandle(handle)) return PAD_ERROR_INVALID_HANDLE; + return PAD_ERROR_DEVICE_NOT_CONNECTED; } int APS5_VABI scePadSetVrTrackingMode(std::uint8_t mode) { @@ -967,13 +972,17 @@ int APS5_VABI scePadSetVrTrackingMode(std::uint8_t mode) { } int APS5_VABI scePadGetMotionSensorPosition(std::int32_t handle, PadMotionSensorPosition* position) { - NotImplemented_nid_no_patch(__func__); - return 0; + if (!Pad::IsInitialized()) return PAD_ERROR_NOT_INITIALIZED; + if (position == nullptr) return PAD_ERROR_INVALID_ARG; + if (!OpenHandle(handle)) return PAD_ERROR_INVALID_HANDLE; + return PAD_ERROR_DEVICE_NOT_CONNECTED; } int APS5_VABI scePadGetSphereRadius(std::int32_t handle, float* radius) { - NotImplemented_nid_no_patch(__func__); - return 0; + if (!Pad::IsInitialized()) return PAD_ERROR_NOT_INITIALIZED; + if (radius == nullptr) return PAD_ERROR_INVALID_ARG; + if (OpenPortType(handle) != PAD_PORT_TYPE_SPECIAL) return PAD_ERROR_INVALID_HANDLE; + return PAD_ERROR_DEVICE_NOT_CONNECTED; } bool APS5_VABI scePadIsValidHandle(std::int32_t handle, std::int32_t portType) { @@ -997,8 +1006,10 @@ bool APS5_VABI scePadIsMoveConnected(std::int32_t handle) { } int APS5_VABI scePadGetBluetoothAddress(std::int32_t handle, std::uint64_t* address) { - NotImplemented_nid_no_patch(__func__); - return 0; + if (!Pad::IsInitialized()) return PAD_ERROR_NOT_INITIALIZED; + if (address == nullptr) return PAD_ERROR_INVALID_ARG; + if (!OpenHandle(handle)) return PAD_ERROR_INVALID_HANDLE; + return PAD_ERROR_DEVICE_NOT_CONNECTED; } int APS5_VABI scePadIsMoveReproductionModel(std::int32_t handle) { diff --git a/core/libs/prx/libScePad/InventoryExports.cpp b/core/libs/prx/libScePad/InventoryExports.cpp new file mode 100644 index 0000000000..91f7312888 --- /dev/null +++ b/core/libs/prx/libScePad/InventoryExports.cpp @@ -0,0 +1,72 @@ +#include "SceTypes.hpp" +#include "prx/libc/include/General.hpp" +#include "prx/libc/include/general/ExportMacros.hpp" + +extern "C" { + +int APS5_VABI libScePadUnknown_1YXygubV1Gc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1YXygubV1Gc", libScePadUnknown_1YXygubV1Gc_nid_no_patch); + +int APS5_VABI libScePadUnknown_3LNwlXW4f54_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3LNwlXW4f54", libScePadUnknown_3LNwlXW4f54_nid_no_patch); + +int APS5_VABI libScePadUnknown_7xA_plus_hFtvBCA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7xA+hFtvBCA", libScePadUnknown_7xA_plus_hFtvBCA_nid_no_patch); + +int APS5_VABI libScePadUnknown_KY0hSB_plus_Uyfo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KY0hSB+Uyfo", libScePadUnknown_KY0hSB_plus_Uyfo_nid_no_patch); + +int APS5_VABI libScePadUnknown_Ql4q5ePNaw0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ql4q5ePNaw0", libScePadUnknown_Ql4q5ePNaw0_nid_no_patch); + +int APS5_VABI libScePadUnknown_UeUUvNOgXKU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UeUUvNOgXKU", libScePadUnknown_UeUUvNOgXKU_nid_no_patch); + +int APS5_VABI libScePadUnknown_XFqNcPu1meI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XFqNcPu1meI", libScePadUnknown_XFqNcPu1meI_nid_no_patch); + +int APS5_VABI libScePadUnknown_eqldkyw7GAo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eqldkyw7GAo", libScePadUnknown_eqldkyw7GAo_nid_no_patch); + +int APS5_VABI libScePadUnknown_ickjfjk9okM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ickjfjk9okM", libScePadUnknown_ickjfjk9okM_nid_no_patch); + +int APS5_VABI libScePadUnknown_qJgegDoE0g8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qJgegDoE0g8", libScePadUnknown_qJgegDoE0g8_nid_no_patch); + +int APS5_VABI libScePadUnknown_r2S7Nuicg8s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("r2S7Nuicg8s", libScePadUnknown_r2S7Nuicg8s_nid_no_patch); + +int APS5_VABI libScePadUnknown_wMvV6XbeFd0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wMvV6XbeFd0", libScePadUnknown_wMvV6XbeFd0_nid_no_patch); + +int APS5_VABI libScePadUnknown_ybhL4IoyGZA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ybhL4IoyGZA", libScePadUnknown_ybhL4IoyGZA_nid_no_patch); + +} diff --git a/core/libs/prx/libScePad/include/HostVolume.hpp b/core/libs/prx/libScePad/include/HostVolume.hpp new file mode 100644 index 0000000000..17169d2933 --- /dev/null +++ b/core/libs/prx/libScePad/include/HostVolume.hpp @@ -0,0 +1,73 @@ +#ifndef CORE_LIBS_PRX_LIBSCEPAD_INCLUDE_HOSTVOLUME_HPP +#define CORE_LIBS_PRX_LIBSCEPAD_INCLUDE_HOSTVOLUME_HPP + +#include +#include + +class HostVolume { +public: + static constexpr int MaxVolume = 100; + static constexpr int VolumeStep = 5; + static constexpr std::uint32_t UnityGain = 65536; + + int Volume() const { return volume; } + bool Muted() const { return muted; } + bool MuteOnFocusLoss() const { return muteOnFocusLoss; } + bool FocusMuted() const { return muteOnFocusLoss && !focused; } + + bool Silent() const { return muted || FocusMuted(); } + + std::uint32_t Gain() const { + if (Silent()) return 0; + const auto level = static_cast(volume); + return (level * level * UnityGain + (MaxVolume * MaxVolume) / 2) / (MaxVolume * MaxVolume); + } + + bool SetMuteOnFocusLoss(bool enabled) { + const bool before = FocusMuted(); + muteOnFocusLoss = enabled; + return before != FocusMuted(); + } + + bool FocusChanged(bool hasFocus) { + const bool before = FocusMuted(); + focused = hasFocus; + return before != FocusMuted(); + } + + bool SetVolume(int value) { + if (value < 0 || value > MaxVolume) throw std::invalid_argument("HostVolume: volume out of range"); + const bool changed = value != volume; + volume = value; + return changed; + } + + bool ToggleMute() { + muted = !muted; + return true; + } + + bool VolumeUp() { + const bool wasMuted = muted; + muted = false; + if (volume >= MaxVolume) return wasMuted; + volume = volume + VolumeStep > MaxVolume ? MaxVolume : volume + VolumeStep; + return true; + } + + bool VolumeDown() { + const bool wasMuted = muted; + muted = false; + if (volume <= 0) return wasMuted; + volume = volume - VolumeStep < 0 ? 0 : volume - VolumeStep; + return true; + } + +private: + int volume = MaxVolume; + bool muted = false; + bool focused = true; + bool muteOnFocusLoss = false; +}; + +#endif diff --git a/core/libs/prx/libScePad/include/HostVolumeControl.hpp b/core/libs/prx/libScePad/include/HostVolumeControl.hpp new file mode 100644 index 0000000000..3f590d1cae --- /dev/null +++ b/core/libs/prx/libScePad/include/HostVolumeControl.hpp @@ -0,0 +1,20 @@ +#ifndef CORE_LIBS_PRX_LIBSCEPAD_INCLUDE_HOSTVOLUMECONTROL_HPP +#define CORE_LIBS_PRX_LIBSCEPAD_INCLUDE_HOSTVOLUMECONTROL_HPP + +#include + +#include "prx/libScePad/include/HostVolume.hpp" + +enum class HostVolumeCommand { + VolumeUp, + VolumeDown, + ToggleMute +}; + +extern "C" bool HostVolumeApply_nid_no_patch(HostVolumeCommand command, HostVolume* after); +extern "C" bool HostVolumeFocus_nid_no_patch(bool focused, HostVolume* after); +extern "C" void HostVolumeConfigure_nid_no_patch(const char* initialVolume, const char* muteOnFocusLoss); +extern "C" void HostVolumeConfigureFromEnvironment_nid_no_patch(); +extern "C" std::uint32_t HostVolumeGain_nid_no_patch(); + +#endif diff --git a/core/libs/prx/libScePad/include/HostVolumeSettings.hpp b/core/libs/prx/libScePad/include/HostVolumeSettings.hpp new file mode 100644 index 0000000000..9265d91feb --- /dev/null +++ b/core/libs/prx/libScePad/include/HostVolumeSettings.hpp @@ -0,0 +1,34 @@ +#ifndef CORE_LIBS_PRX_LIBSCEPAD_INCLUDE_HOSTVOLUMESETTINGS_HPP +#define CORE_LIBS_PRX_LIBSCEPAD_INCLUDE_HOSTVOLUMESETTINGS_HPP + +#include +#include +#include +#include + +#include "prx/libScePad/include/HostVolume.hpp" + +inline bool ParseHostVolumeFlag(std::string_view name, std::string_view value) { + if (value == "0") return false; + if (value == "1") return true; + throw std::runtime_error(std::string(name) + " must be 0 or 1, not '" + std::string(value) + "'"); +} + +inline int ParseHostVolumeLevel(std::string_view name, std::string_view value) { + int parsed = 0; + const auto end = value.data() + value.size(); + const auto result = std::from_chars(value.data(), end, parsed); + if (value.empty() || result.ec != std::errc{} || result.ptr != end || parsed < 0 || parsed > HostVolume::MaxVolume) { + throw std::runtime_error(std::string(name) + " must be a whole number from 0 to " + std::to_string(HostVolume::MaxVolume) + ", not '" + std::string(value) + "'"); + } + return parsed; +} + +inline std::string HostVolumeMessage(const HostVolume& state) { + const std::string level = std::to_string(state.Volume()) + "%"; + if (state.Muted()) return "Host volume: muted (volume " + level + ")"; + if (state.FocusMuted()) return "Host volume: muted while the window has no focus (volume " + level + ")"; + return "Host volume: " + level; +} + +#endif diff --git a/core/libs/prx/libScePad/include/InputCommandFile.hpp b/core/libs/prx/libScePad/include/InputCommandFile.hpp index 172735fd62..0d2fd0bc2a 100644 --- a/core/libs/prx/libScePad/include/InputCommandFile.hpp +++ b/core/libs/prx/libScePad/include/InputCommandFile.hpp @@ -60,6 +60,24 @@ public: std::uint32_t Buttons(std::uint64_t now) { return Poll(now).buttons; } + std::uint32_t HeldThrough(std::uint64_t since, std::uint64_t now) const { + if (events.empty() || since < started || now < since) return 0; + const auto from = since - started; + const auto to = now - started; + auto event = std::upper_bound(events.begin(), events.end(), from, + [](std::uint64_t time, const Event& candidate) { return time < candidate.start; }); + if (event == events.begin()) return 0; + --event; + std::uint32_t held = ~0u; + for (std::uint64_t covered = from; event != events.end() && event->start <= covered; ++event) { + if (covered >= event->end) return 0; + held &= event->input.buttons; + covered = event->end; + if (to < covered) return held; + } + return 0; + } + private: struct Event { std::uint64_t start = 0; diff --git a/core/libs/prx/libScePad/include/InputMapping.hpp b/core/libs/prx/libScePad/include/InputMapping.hpp index ba992ba106..99ffcc96be 100644 --- a/core/libs/prx/libScePad/include/InputMapping.hpp +++ b/core/libs/prx/libScePad/include/InputMapping.hpp @@ -29,6 +29,7 @@ struct InputSettings { double stickModifierScale = 0.5; double keyboardRampMs = 0.0; double triggerRampMs = 0.0; + bool mouseControlsRightStick = true; }; struct InputConfiguration { @@ -41,6 +42,9 @@ inline constexpr std::array InputMapping{ InputBinding{SDL_SCANCODE_F10, MouseButton::None, InputControl::TogglePerformanceOverlay}, InputBinding{SDL_SCANCODE_F12, MouseButton::None, InputControl::Screenshot}, InputBinding{SDL_SCANCODE_F9, MouseButton::None, InputControl::ShowPadStatus}, + InputBinding{SDL_SCANCODE_F5, MouseButton::None, InputControl::VolumeDown}, + InputBinding{SDL_SCANCODE_F6, MouseButton::None, InputControl::VolumeUp}, + InputBinding{SDL_SCANCODE_F8, MouseButton::None, InputControl::ToggleMute}, InputBinding{SDL_SCANCODE_RETURN, MouseButton::None, InputControl::Button, PadButton::Cross}, InputBinding{SDL_SCANCODE_SPACE, MouseButton::None, InputControl::Button, PadButton::Cross}, InputBinding{SDL_SCANCODE_ESCAPE, MouseButton::None, InputControl::Button, PadButton::Options}, diff --git a/core/libs/prx/libScePad/include/KeyboardMouse.hpp b/core/libs/prx/libScePad/include/KeyboardMouse.hpp index f96e89102a..84f4478d1e 100644 --- a/core/libs/prx/libScePad/include/KeyboardMouse.hpp +++ b/core/libs/prx/libScePad/include/KeyboardMouse.hpp @@ -56,6 +56,9 @@ struct InputRequests { bool togglePerformanceOverlay = false; bool screenshot = false; bool showPadStatus = false; + bool volumeUp = false; + bool volumeDown = false; + bool toggleMute = false; bool toggleMouse = false; bool releaseMouse = false; }; diff --git a/core/libs/prx/libScePad/include/PadInputTypes.hpp b/core/libs/prx/libScePad/include/PadInputTypes.hpp index f271acbda6..b6515da5a9 100644 --- a/core/libs/prx/libScePad/include/PadInputTypes.hpp +++ b/core/libs/prx/libScePad/include/PadInputTypes.hpp @@ -25,7 +25,10 @@ enum class InputControl { ToggleFullscreen, TogglePerformanceOverlay, Screenshot, - ShowPadStatus + ShowPadStatus, + VolumeUp, + VolumeDown, + ToggleMute }; enum class PadButton : std::uint32_t { diff --git a/core/libs/prx/libScePad/include/PadState.hpp b/core/libs/prx/libScePad/include/PadState.hpp index 365627eb3a..1dfc108fcc 100644 --- a/core/libs/prx/libScePad/include/PadState.hpp +++ b/core/libs/prx/libScePad/include/PadState.hpp @@ -80,6 +80,7 @@ bool IsConnected(int port); extern "C" void PadPublishInput_nid_postfix(const PadInputState& input); extern "C" void PadPublishInputForPort_nid_postfix(int port, const PadInputState& input); +extern "C" void PadApplyInjectedInput_nid_postfix(PadInputState* state); extern "C" void PadReportInputFailure_nid_postfix(std::exception_ptr error); extern "C" bool PadFetchOutput_nid_postfix(std::uint32_t* seenSequence, PadOutputState* out); extern "C" bool PadFetchOutputForPort_nid_postfix(int port, std::uint32_t* seenSequence, PadOutputState* out); diff --git a/core/libs/prx/libScePad/src/HostVolumeState.cpp b/core/libs/prx/libScePad/src/HostVolumeState.cpp new file mode 100644 index 0000000000..41a8a83fb7 --- /dev/null +++ b/core/libs/prx/libScePad/src/HostVolumeState.cpp @@ -0,0 +1,57 @@ +#include "prx/libScePad/include/HostVolumeControl.hpp" + +#include +#include +#include + +#include "prx/libScePad/include/HostVolumeSettings.hpp" + +namespace { + +std::mutex stateMutex; +HostVolume state; +std::atomic publishedGain{HostVolume::UnityGain}; + +void publish() { + publishedGain.store(state.Gain(), std::memory_order_release); +} + +} + +bool HostVolumeApply_nid_no_patch(HostVolumeCommand command, HostVolume* after) { + std::lock_guard lock(stateMutex); + bool changed = false; + switch (command) { + case HostVolumeCommand::VolumeUp: changed = state.VolumeUp(); break; + case HostVolumeCommand::VolumeDown: changed = state.VolumeDown(); break; + case HostVolumeCommand::ToggleMute: changed = state.ToggleMute(); break; + } + publish(); + if (after != nullptr) *after = state; + return changed; +} + +bool HostVolumeFocus_nid_no_patch(bool focused, HostVolume* after) { + std::lock_guard lock(stateMutex); + const bool changed = state.FocusChanged(focused); + publish(); + if (after != nullptr) *after = state; + return changed; +} + +void HostVolumeConfigure_nid_no_patch(const char* initialVolume, const char* muteOnFocusLoss) { + HostVolume fresh; + if (initialVolume != nullptr) fresh.SetVolume(ParseHostVolumeLevel("ANYPS5_VOLUME", initialVolume)); + if (muteOnFocusLoss != nullptr) fresh.SetMuteOnFocusLoss(ParseHostVolumeFlag("ANYPS5_MUTE_ON_FOCUS_LOSS", muteOnFocusLoss)); + std::lock_guard lock(stateMutex); + state = fresh; + publish(); +} + +void HostVolumeConfigureFromEnvironment_nid_no_patch() { + HostVolumeConfigure_nid_no_patch(std::getenv("ANYPS5_VOLUME"), std::getenv("ANYPS5_MUTE_ON_FOCUS_LOSS")); +} + +std::uint32_t HostVolumeGain_nid_no_patch() { + return publishedGain.load(std::memory_order_acquire); +} diff --git a/core/libs/prx/libScePad/src/PadState.cpp b/core/libs/prx/libScePad/src/PadState.cpp index 2b57276eed..ee47ae1d03 100644 --- a/core/libs/prx/libScePad/src/PadState.cpp +++ b/core/libs/prx/libScePad/src/PadState.cpp @@ -18,6 +18,8 @@ namespace { constexpr std::uint64_t kLatchExpiryLimit = 500000; constexpr std::uint32_t kInterceptedButton = 0x80000000; std::uint64_t injectedTimestamp = 0; + std::uint32_t injectedHeldThroughCapture = 0; + std::uint64_t injectedHeldAt = 0; struct QueuedInput { PadInputState input; @@ -243,7 +245,23 @@ PadData BuildData(PadSlot& slot, const PadInputState& state, std::uint64_t chang return data; } -Pad::InputCommandFile::Input InjectedInput(std::uint64_t now) { +bool WithdrawnPort(int port, const PadSlot& slot) { + return port == 0 && !slot.connected; +} + +PadData WithdrawnData(std::uint64_t changeTime) { + PadData data{}; + data.orientation_w = 1.0f; + std::uint8_t connectedCount = 0; + for (const auto& s : slots) { + if (s.connected) ++connectedCount; + } + data.connected_count = connectedCount; + data.timestamp = changeTime; + return data; +} + +Pad::InputCommandFile& InjectedCommands() { static Pad::InputCommandFile commands([] { #ifdef _WIN32 const auto* path = _wgetenv(L"APS5_PAD_INPUT_FILE"); @@ -252,8 +270,12 @@ Pad::InputCommandFile::Input InjectedInput(std::uint64_t now) { #endif return path ? std::filesystem::path(path) : std::filesystem::path{}; }()); + return commands; +} + +Pad::InputCommandFile::Input InjectedInput(std::uint64_t now) { static Pad::InputCommandFile::Input lastInjected; - const auto injected = commands.Poll(now); + const auto injected = InjectedCommands().Poll(now); if (injected != lastInjected) { lastInjected = injected; slots[0].timestamp = now; @@ -262,6 +284,15 @@ Pad::InputCommandFile::Input InjectedInput(std::uint64_t now) { return injected; } +Pad::InputCommandFile::Input InjectedTitleInput(std::uint64_t now) { + auto injected = InjectedInput(now); + if (slots[0].state.intercepted) injectedHeldThroughCapture |= injected.buttons; + else injectedHeldThroughCapture &= InjectedCommands().HeldThrough(injectedHeldAt, now); + injectedHeldAt = now; + injected.buttons &= ~injectedHeldThroughCapture; + return injected; +} + std::uint64_t LatchExpiry(const PadSlot& slot) { return std::clamp(slot.readInterval + slot.readInterval / 2, kLatchExpiry, kLatchExpiryLimit); } @@ -273,10 +304,11 @@ PadData Pad::ReadState(int port) { if (failure) std::rethrow_exception(failure); if (!initialized) throw std::runtime_error("Pad: read before initialization"); const std::uint64_t now = sceKernelGetProcessTime(); - const auto injected = port == 0 ? InjectedInput(now) : Pad::InputCommandFile::Input{}; + const auto injected = port == 0 ? InjectedTitleInput(now) : Pad::InputCommandFile::Input{}; auto& slot = slots[port]; - PadData data = BuildData(slot, slot.state, slot.timestamp, now, injected, port); - if (slot.pressedSinceRead != 0 && now - slot.pressedAt <= LatchExpiry(slot)) { + const bool withdrawn = WithdrawnPort(port, slot); + PadData data = withdrawn ? WithdrawnData(slot.timestamp) : BuildData(slot, slot.state, slot.timestamp, now, injected, port); + if (!withdrawn && slot.pressedSinceRead != 0 && now - slot.pressedAt <= LatchExpiry(slot)) { data.buttons |= slot.pressedSinceRead; if (slot.pressedSinceRead & 0x100u) data.analog_buttons_l2 = std::max(data.analog_buttons_l2, slot.pressedAnalogL2); if (slot.pressedSinceRead & 0x200u) data.analog_buttons_r2 = std::max(data.analog_buttons_r2, slot.pressedAnalogR2); @@ -296,7 +328,12 @@ int Pad::Read(PadData* data, int num, int port) { auto& slot = slots[port]; slot.pressedSinceRead = 0; const std::uint64_t now = sceKernelGetProcessTime(); - const auto injected = port == 0 ? InjectedInput(now) : Pad::InputCommandFile::Input{}; + const auto injected = port == 0 ? InjectedTitleInput(now) : Pad::InputCommandFile::Input{}; + if (WithdrawnPort(port, slot)) { + slot.queue.clear(); + data[0] = WithdrawnData(slot.timestamp); + return 1; + } if (slot.queue.empty()) { data[0] = BuildData(slot, slot.state, slot.timestamp, now, injected, port); return 1; @@ -505,6 +542,16 @@ extern "C" void PadPublishInput_nid_postfix(const PadInputState& input) { PadPublishInputForPort_nid_postfix(0, input); } +extern "C" void PadApplyInjectedInput_nid_postfix(PadInputState* state) { + if (state == nullptr) return; + std::lock_guard lock(stateMutex); + const auto injected = InjectedInput(sceKernelGetProcessTime()); + injectedHeldThroughCapture |= injected.buttons; + injectedHeldAt = sceKernelGetProcessTime(); + state->buttons |= injected.buttons; + if (injected.hasSticks) state->sticks = injected.sticks; +} + extern "C" void PadReportInputFailure_nid_postfix(std::exception_ptr error) { if (!error) throw std::invalid_argument("Pad: missing input failure"); std::lock_guard lock(stateMutex); diff --git a/core/libs/prx/libScePlayGo/Export.cpp b/core/libs/prx/libScePlayGo/Export.cpp index 5dd9cfd488..574f2938ad 100644 --- a/core/libs/prx/libScePlayGo/Export.cpp +++ b/core/libs/prx/libScePlayGo/Export.cpp @@ -31,6 +31,18 @@ static uint64_t g_languageMask = PLAYGO_LANGUAGE_MASK_ALL; static constexpr int SCE_PLAYGO_ERROR_BAD_CHUNK_ID = static_cast(0x80B2000C); static constexpr int SCE_PLAYGO_ERROR_BAD_SIZE = static_cast(0x80B2000B); static constexpr int SCE_PLAYGO_ERROR_BAD_LOCUS = static_cast(0x80B20010); +static constexpr int SCE_PLAYGO_ERROR_INVALID_ARGUMENT = static_cast(0x80B20004); +static constexpr int SCE_PLAYGO_ERROR_NOT_INITIALIZED = static_cast(0x80B20005); +static constexpr int SCE_PLAYGO_ERROR_BAD_SPEED = static_cast(0x80B2000D); +static constexpr int SCE_PLAYGO_ERROR_EPERM = static_cast(0x80B2000F); +static constexpr int SCE_PLAYGO_ERROR_BAD_OPTIONAL_TYPE = static_cast(0x80B20024); +static constexpr int SCE_PLAYGO_ERROR_BAD_SCENARIO_CONFIGURATION = static_cast(0x80B20026); +static constexpr int32_t PLAYGO_INSTALL_SPEED_SUSPENDED = 0; +static constexpr uint32_t PLAYGO_OPTIONAL_CHUNK_TYPE_SCENARIO = 1; +static constexpr uint32_t PLAYGO_OPTIONAL_CHUNK_TYPE_LAST = 2; +static constexpr uint64_t PLAYGO_SCENARIO_MASK_ALL = 0x1F; + +static bool g_initialized = false; struct ChunkTable { std::set ids{0}; @@ -127,6 +139,17 @@ static int ValidateChunks(const uint16_t* chunk_ids, uint32_t number_of_entries) return 0; } +static uint64_t SupportedOptionalChunkMask(uint32_t type) { + return type == PLAYGO_OPTIONAL_CHUNK_TYPE_SCENARIO ? PLAYGO_SCENARIO_MASK_ALL : PLAYGO_OPTIONAL_CHUNK_MASK_ALL; +} + +static int ValidateOptionalChunkRequest(uint32_t type, const PlayGoOptionalChunk* option) { + if (!option) return SCE_PLAYGO_ERROR_BAD_POINTER; + if (type > PLAYGO_OPTIONAL_CHUNK_TYPE_LAST) return SCE_PLAYGO_ERROR_BAD_OPTIONAL_TYPE; + if (type == PLAYGO_OPTIONAL_CHUNK_TYPE_SCENARIO && (option->bitmask & ~PLAYGO_SCENARIO_MASK_ALL) != 0) return SCE_PLAYGO_ERROR_BAD_SCENARIO_CONFIGURATION; + return 0; +} + extern "C" { int APS5_VABI scePlayGoClose(int handle) { @@ -190,8 +213,8 @@ int APS5_VABI scePlayGoGetLocus(int handle, const uint16_t* chunkIds, uint32_t n int APS5_VABI scePlayGoGetOptionalChunk(int handle, std::uint32_t type, PlayGoOptionalChunk* option) { if (handle != PLAYGO_HANDLE) return SCE_PLAYGO_ERROR_BAD_HANDLE; if (!option) return SCE_PLAYGO_ERROR_BAD_POINTER; - if (type > 2) return static_cast(0x80B20024); - option->bitmask = PLAYGO_OPTIONAL_CHUNK_MASK_ALL; + if (type > PLAYGO_OPTIONAL_CHUNK_TYPE_LAST) return SCE_PLAYGO_ERROR_BAD_OPTIONAL_TYPE; + option->bitmask = SupportedOptionalChunkMask(type); return 0; } @@ -204,15 +227,19 @@ int APS5_VABI scePlayGoGetProgress(int handle, const uint16_t* chunk_ids, uint32 return 0; } -int APS5_VABI scePlayGoGetRequiredDisc() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI scePlayGoGetRequiredDisc(int handle, std::uint32_t type, const PlayGoOptionalChunk* option, uint32_t* out_required_disc) { + if (handle != PLAYGO_HANDLE) return SCE_PLAYGO_ERROR_BAD_HANDLE; + if (!out_required_disc) return SCE_PLAYGO_ERROR_BAD_POINTER; + if (const int error = ValidateOptionalChunkRequest(type, option)) return error; + *out_required_disc = 0; + return 0; } int APS5_VABI scePlayGoGetSupportedOptionalChunk(int handle, std::uint32_t type, PlayGoOptionalChunk* option) { if (handle != PLAYGO_HANDLE) return SCE_PLAYGO_ERROR_BAD_HANDLE; if (!option) return SCE_PLAYGO_ERROR_BAD_POINTER; - if (type > 2) return static_cast(0x80B20024); - option->bitmask = PLAYGO_OPTIONAL_CHUNK_MASK_ALL; + if (type > PLAYGO_OPTIONAL_CHUNK_TYPE_LAST) return SCE_PLAYGO_ERROR_BAD_OPTIONAL_TYPE; + option->bitmask = SupportedOptionalChunkMask(type); return 0; } @@ -227,6 +254,7 @@ int APS5_VABI scePlayGoGetToDoList(int handle, PlayGoToDo* out_todo_list, uint32 int APS5_VABI scePlayGoInitialize(const PlayGoInitParams* init) { if (!init) return SCE_PLAYGO_ERROR_BAD_POINTER; + g_initialized = true; return 0; } @@ -256,8 +284,13 @@ int APS5_VABI scePlayGoSetInstallSpeed(int handle, int32_t speed) { return 0; } -int APS5_VABI scePlayGoSetInstallSpeed2() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI scePlayGoSetInstallSpeed2(int32_t reserved, uint32_t speed) { + if (!g_initialized) return SCE_PLAYGO_ERROR_NOT_INITIALIZED; + if (reserved != 0) return SCE_PLAYGO_ERROR_INVALID_ARGUMENT; + if (speed > static_cast(PLAYGO_INSTALL_SPEED_FULL)) return SCE_PLAYGO_ERROR_BAD_SPEED; + if (speed == static_cast(PLAYGO_INSTALL_SPEED_SUSPENDED)) return SCE_PLAYGO_ERROR_EPERM; + g_installSpeed = static_cast(speed); + return 0; } int APS5_VABI scePlayGoSetToDoList(int handle, const PlayGoToDo* todo_list, uint32_t number_of_entries) { @@ -273,16 +306,19 @@ int APS5_VABI scePlayGoSetToDoList(int handle, const PlayGoToDo* todo_list, uint } int APS5_VABI scePlayGoTerminate(void) { + g_initialized = false; return 0; } -int APS5_VABI scePlayGoRequestNextChunk() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI scePlayGoRequestNextChunk(int handle, const void* reserved) { + if (handle != PLAYGO_HANDLE) return SCE_PLAYGO_ERROR_BAD_HANDLE; + if (reserved) return SCE_PLAYGO_ERROR_INVALID_ARGUMENT; return 0; } -int APS5_VABI scePlayGoRequestOptionalChunk() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI scePlayGoRequestOptionalChunk(int handle, std::uint32_t type, const PlayGoOptionalChunk* option) { + if (handle != PLAYGO_HANDLE) return SCE_PLAYGO_ERROR_BAD_HANDLE; + return ValidateOptionalChunkRequest(type, option); } int APS5_VABI scePlayGoSetLanguageMask(int handle, uint64_t language_mask) { diff --git a/core/libs/prx/libScePlayGo/include/Api.hpp b/core/libs/prx/libScePlayGo/include/Api.hpp index 18445de2d1..1f72fd12f9 100644 --- a/core/libs/prx/libScePlayGo/include/Api.hpp +++ b/core/libs/prx/libScePlayGo/include/Api.hpp @@ -13,7 +13,7 @@ int APS5_VABI scePlayGoGetLanguageMask(int handle, uint64_t* outLanguageMask); int APS5_VABI scePlayGoGetLocus(int handle, const uint16_t* chunkIds, uint32_t numberOfEntries, int8_t* outLoci); int APS5_VABI scePlayGoGetOptionalChunk(int handle, std::uint32_t type, PlayGoOptionalChunk* option); int APS5_VABI scePlayGoGetProgress(int handle, const uint16_t* chunkIds, uint32_t numberOfEntries, PlayGoProgress* outProgress); -int APS5_VABI scePlayGoGetRequiredDisc(); +int APS5_VABI scePlayGoGetRequiredDisc(int handle, std::uint32_t type, const PlayGoOptionalChunk* option, uint32_t* outRequiredDisc); int APS5_VABI scePlayGoGetSupportedOptionalChunk(int handle, std::uint32_t type, PlayGoOptionalChunk* option); int APS5_VABI scePlayGoGetToDoList(int handle, PlayGoToDo* outTodoList, uint32_t numberOfEntries, uint32_t* outEntries); int APS5_VABI scePlayGoInitialize(const PlayGoInitParams* init); @@ -21,11 +21,11 @@ int APS5_VABI scePlayGoOpen(int* outHandle, const void* param); int APS5_VABI scePlayGoPrefetch(int handle, const uint16_t* chunkIds, uint32_t numberOfEntries, int8_t minimumLocus); int APS5_VABI scePlayGoPrefetchOptionalChunk(int handle, int32_t type, const PlayGoOptionalChunk* option); int APS5_VABI scePlayGoSetInstallSpeed(int handle, int32_t speed); -int APS5_VABI scePlayGoSetInstallSpeed2(); +int APS5_VABI scePlayGoSetInstallSpeed2(int32_t reserved, uint32_t speed); int APS5_VABI scePlayGoSetToDoList(int handle, const PlayGoToDo* todoList, uint32_t numberOfEntries); int APS5_VABI scePlayGoTerminate(void); -int APS5_VABI scePlayGoRequestNextChunk(); -int APS5_VABI scePlayGoRequestOptionalChunk(); +int APS5_VABI scePlayGoRequestNextChunk(int handle, const void* reserved); +int APS5_VABI scePlayGoRequestOptionalChunk(int handle, std::uint32_t type, const PlayGoOptionalChunk* option); int APS5_VABI scePlayGoSetLanguageMask(int handle, uint64_t languageMask); int APS5_VABI scePlayGoSnapshot(); diff --git a/core/libs/prx/libScePlayReady/Export.cpp b/core/libs/prx/libScePlayReady/Export.cpp index 4c7e5fe395..c09e68fee3 100644 --- a/core/libs/prx/libScePlayReady/Export.cpp +++ b/core/libs/prx/libScePlayReady/Export.cpp @@ -1,9 +1,33 @@ #include "prx/libScePlayReady/include/Api.hpp" +#include #include #include +#include +#include #include "SceTypes.hpp" #include "prx/libc/include/General.hpp" +namespace { + +constexpr int PlayReadyInvalidArgument = static_cast(0x80070057); +constexpr std::size_t BufferSize = 0x18; +constexpr std::size_t InitParamsSize = 0x138; +constexpr uint32_t InitParamsMagic = 0x50524459; +constexpr uint32_t InitParamsVersion = 1; +constexpr uint64_t ApiVersions[2][4] = {{2, 5, 0, 1788}, {1, 3, 3, 2021111201}}; + +char versionText[32]; + +void InitializeInitParams(void* params) { + if (params == nullptr) return; + auto* bytes = static_cast(params); + std::memset(bytes, 0, InitParamsSize); + std::memcpy(bytes, &InitParamsMagic, sizeof(InitParamsMagic)); + std::memcpy(bytes + sizeof(InitParamsMagic), &InitParamsVersion, sizeof(InitParamsVersion)); +} + +} // namespace + extern "C" { int APS5_VABI sceBufferAlloc() { @@ -21,9 +45,8 @@ int APS5_VABI sceBufferFree() { return 0; } -int APS5_VABI sceBufferInit() { - NotImplemented_nid_no_patch(__func__); - return 0; +void APS5_VABI sceBufferInit(void* buffer) { + if (buffer != nullptr) std::memset(buffer, 0, BufferSize); } int APS5_VABI sceBufferRealloc() { @@ -31,9 +54,8 @@ int APS5_VABI sceBufferRealloc() { return 0; } -int APS5_VABI scePlayReadyApiInitializeInitParams() { - NotImplemented_nid_no_patch(__func__); - return 0; +void APS5_VABI scePlayReadyApiInitializeInitParams(void* params) { + InitializeInitParams(params); } int APS5_VABI scePlayReadyApiIsStarted() { @@ -51,14 +73,26 @@ int APS5_VABI scePlayReadyApiStop() { return 0; } -int APS5_VABI scePlayReadyApiVersion() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI scePlayReadyApiVersion(uint32_t index, uint64_t* version) { + if (index >= std::size(ApiVersions) || version == nullptr) return PlayReadyInvalidArgument; + std::memcpy(version, ApiVersions[index], sizeof(ApiVersions[index])); return 0; } -int APS5_VABI scePlayReadyApiVersionString() { - NotImplemented_nid_no_patch(__func__); - return 0; +const char* APS5_VABI scePlayReadyApiVersionString(uint32_t index) { + if (index >= std::size(ApiVersions)) { + std::memset(versionText, 0, sizeof(versionText)); + return versionText; + } + char text[sizeof(versionText)]; + char* end = text; + for (std::size_t part = 0; part < std::size(ApiVersions[index]); ++part) { + if (part != 0) *end++ = '.'; + end = std::to_chars(end, text + sizeof(text) - 1, ApiVersions[index][part]).ptr; + } + *end++ = '\0'; + std::memcpy(versionText, text, static_cast(end - text)); + return versionText; } int APS5_VABI scePlayReadyBufferFree() { @@ -66,8 +100,9 @@ int APS5_VABI scePlayReadyBufferFree() { return 0; } -int APS5_VABI scePlayReadyBufferInit() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI scePlayReadyBufferInit(void* buffer) { + if (buffer == nullptr) return PlayReadyInvalidArgument; + std::memset(buffer, 0, BufferSize); return 0; } @@ -176,9 +211,8 @@ int APS5_VABI scePlayReadyInitialize() { return 0; } -int APS5_VABI scePlayReadyInitializeInitParams() { - NotImplemented_nid_no_patch(__func__); - return 0; +void APS5_VABI scePlayReadyInitializeInitParams(void* params) { + InitializeInitParams(params); } int APS5_VABI scePlayReadyLicenseAcqGenerateAck() { diff --git a/core/libs/prx/libScePlayReady/include/Api.hpp b/core/libs/prx/libScePlayReady/include/Api.hpp index 6fb478bbda..70ad502339 100644 --- a/core/libs/prx/libScePlayReady/include/Api.hpp +++ b/core/libs/prx/libScePlayReady/include/Api.hpp @@ -1,22 +1,23 @@ #pragma once #include "SceTypes.hpp" +#include extern "C" { int APS5_VABI sceBufferAlloc(); int APS5_VABI sceBufferDup(); int APS5_VABI sceBufferFree(); -int APS5_VABI sceBufferInit(); +void APS5_VABI sceBufferInit(void* buffer); int APS5_VABI sceBufferRealloc(); -int APS5_VABI scePlayReadyApiInitializeInitParams(); +void APS5_VABI scePlayReadyApiInitializeInitParams(void* params); int APS5_VABI scePlayReadyApiIsStarted(); int APS5_VABI scePlayReadyApiStart(); int APS5_VABI scePlayReadyApiStop(); -int APS5_VABI scePlayReadyApiVersion(); -int APS5_VABI scePlayReadyApiVersionString(); +int APS5_VABI scePlayReadyApiVersion(uint32_t index, uint64_t* version); +const char* APS5_VABI scePlayReadyApiVersionString(uint32_t index); int APS5_VABI scePlayReadyBufferFree(); -int APS5_VABI scePlayReadyBufferInit(); +int APS5_VABI scePlayReadyBufferInit(void* buffer); int APS5_VABI scePlayReadyBufferMalloc(); int APS5_VABI scePlayReadyBufferRealloc(); int APS5_VABI scePlayReadyContentGetProperty(); @@ -38,7 +39,7 @@ int APS5_VABI scePlayReadyEnvelopeSeek(); int APS5_VABI scePlayReadyFinalize(); int APS5_VABI scePlayReadyFreeDecryptContext(); int APS5_VABI scePlayReadyInitialize(); -int APS5_VABI scePlayReadyInitializeInitParams(); +void APS5_VABI scePlayReadyInitializeInitParams(void* params); int APS5_VABI scePlayReadyLicenseAcqGenerateAck(); int APS5_VABI scePlayReadyLicenseAcqGenerateChallenge(); int APS5_VABI scePlayReadyLicenseAcqGetAdditionalResponseData(); diff --git a/core/libs/prx/libScePlayReady4/Export.cpp b/core/libs/prx/libScePlayReady4/Export.cpp index 42760908ef..27b4893f63 100644 --- a/core/libs/prx/libScePlayReady4/Export.cpp +++ b/core/libs/prx/libScePlayReady4/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libScePlayReady4/include/InventoryExports.hpp" #include "prx/libScePlayReady4/include/Api.hpp" #include #include @@ -203,3 +205,242 @@ int APS5_VABI scePlayReadyDomainJoinProcessResponse2() { } } + +extern "C" { + +int APS5_VABI libScePlayReady4Unknown_2OZeMccOeho_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2OZeMccOeho", libScePlayReady4Unknown_2OZeMccOeho_nid_no_patch); + +int APS5_VABI libScePlayReady4Unknown_3fo8fAvHn9A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3fo8fAvHn9A", libScePlayReady4Unknown_3fo8fAvHn9A_nid_no_patch); + +int APS5_VABI libScePlayReady4Unknown_HNB_minus_eWVwwng_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HNB-eWVwwng", libScePlayReady4Unknown_HNB_minus_eWVwwng_nid_no_patch); + +int APS5_VABI libScePlayReady4Unknown_LL9r9r4cCdQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LL9r9r4cCdQ", libScePlayReady4Unknown_LL9r9r4cCdQ_nid_no_patch); + +int APS5_VABI libScePlayReady4Unknown_OqSN3eUfHMY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OqSN3eUfHMY", libScePlayReady4Unknown_OqSN3eUfHMY_nid_no_patch); + +int APS5_VABI libScePlayReady4Unknown_XawoudE54JE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XawoudE54JE", libScePlayReady4Unknown_XawoudE54JE_nid_no_patch); + +int APS5_VABI libScePlayReady4Unknown_asAQ9li6_plus_mo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("asAQ9li6+mo", libScePlayReady4Unknown_asAQ9li6_plus_mo_nid_no_patch); + +int APS5_VABI libScePlayReady4Unknown_o2H2P7xoLec_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("o2H2P7xoLec", libScePlayReady4Unknown_o2H2P7xoLec_nid_no_patch); + +int APS5_VABI libScePlayReady4Unknown_sK0jAAnbbiI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sK0jAAnbbiI", libScePlayReady4Unknown_sK0jAAnbbiI_nid_no_patch); + +int APS5_VABI libScePlayReady4LegacyUnknown__plus_YmG2s3DvCk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+YmG2s3DvCk", libScePlayReady4LegacyUnknown__plus_YmG2s3DvCk_nid_no_patch); + +int APS5_VABI libScePlayReady4LegacyUnknown__minus_gF0zOwGz9E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-gF0zOwGz9E", libScePlayReady4LegacyUnknown__minus_gF0zOwGz9E_nid_no_patch); + +int APS5_VABI libScePlayReady4LegacyUnknown_04KqHETjgSM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("04KqHETjgSM", libScePlayReady4LegacyUnknown_04KqHETjgSM_nid_no_patch); + +int APS5_VABI libScePlayReady4LegacyUnknown_0VUjhKU8MuM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0VUjhKU8MuM", libScePlayReady4LegacyUnknown_0VUjhKU8MuM_nid_no_patch); + +int APS5_VABI libScePlayReady4LegacyUnknown_0y6EouMfHdc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0y6EouMfHdc", libScePlayReady4LegacyUnknown_0y6EouMfHdc_nid_no_patch); + +int APS5_VABI libScePlayReady4LegacyUnknown_1exu5Xgmk_minus_M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1exu5Xgmk-M", libScePlayReady4LegacyUnknown_1exu5Xgmk_minus_M_nid_no_patch); + +int APS5_VABI libScePlayReady4LegacyUnknown_4DC6ObdGHnM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4DC6ObdGHnM", libScePlayReady4LegacyUnknown_4DC6ObdGHnM_nid_no_patch); + +int APS5_VABI libScePlayReady4LegacyUnknown_4Y2U8T8qLK8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4Y2U8T8qLK8", libScePlayReady4LegacyUnknown_4Y2U8T8qLK8_nid_no_patch); + +int APS5_VABI libScePlayReady4LegacyUnknown_5QciIg5fiEU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5QciIg5fiEU", libScePlayReady4LegacyUnknown_5QciIg5fiEU_nid_no_patch); + +int APS5_VABI libScePlayReady4LegacyUnknown_5sj70SoNZk4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5sj70SoNZk4", libScePlayReady4LegacyUnknown_5sj70SoNZk4_nid_no_patch); + +int APS5_VABI libScePlayReady4LegacyUnknown_7xpxheSYUGc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7xpxheSYUGc", libScePlayReady4LegacyUnknown_7xpxheSYUGc_nid_no_patch); + +int APS5_VABI libScePlayReady4LegacyUnknown_9VmAjxwffnw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9VmAjxwffnw", libScePlayReady4LegacyUnknown_9VmAjxwffnw_nid_no_patch); + +int APS5_VABI libScePlayReady4LegacyUnknown_C7YeAC1DT_minus_8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("C7YeAC1DT-8", libScePlayReady4LegacyUnknown_C7YeAC1DT_minus_8_nid_no_patch); + +int APS5_VABI libScePlayReady4LegacyUnknown_C7ukQ505fng_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("C7ukQ505fng", libScePlayReady4LegacyUnknown_C7ukQ505fng_nid_no_patch); + +int APS5_VABI libScePlayReady4LegacyUnknown_E_plus_PJjXu_plus_ldo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("E+PJjXu+ldo", libScePlayReady4LegacyUnknown_E_plus_PJjXu_plus_ldo_nid_no_patch); + +int APS5_VABI libScePlayReady4LegacyUnknown_FN34vyYimhw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FN34vyYimhw", libScePlayReady4LegacyUnknown_FN34vyYimhw_nid_no_patch); + +int APS5_VABI libScePlayReady4LegacyUnknown_Fjp5yC5nra4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Fjp5yC5nra4", libScePlayReady4LegacyUnknown_Fjp5yC5nra4_nid_no_patch); + +int APS5_VABI libScePlayReady4LegacyUnknown_HQFs7qCzusw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HQFs7qCzusw", libScePlayReady4LegacyUnknown_HQFs7qCzusw_nid_no_patch); + +int APS5_VABI libScePlayReady4LegacyUnknown_JitxfgFD8fY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JitxfgFD8fY", libScePlayReady4LegacyUnknown_JitxfgFD8fY_nid_no_patch); + +int APS5_VABI libScePlayReady4LegacyUnknown_SDoU52cLUdM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SDoU52cLUdM", libScePlayReady4LegacyUnknown_SDoU52cLUdM_nid_no_patch); + +int APS5_VABI libScePlayReady4LegacyUnknown_SO8bKPwYC9w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SO8bKPwYC9w", libScePlayReady4LegacyUnknown_SO8bKPwYC9w_nid_no_patch); + +int APS5_VABI libScePlayReady4LegacyUnknown_SRJvxiIfRgc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SRJvxiIfRgc", libScePlayReady4LegacyUnknown_SRJvxiIfRgc_nid_no_patch); + +int APS5_VABI libScePlayReady4LegacyUnknown_VIZHbSOKjCY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VIZHbSOKjCY", libScePlayReady4LegacyUnknown_VIZHbSOKjCY_nid_no_patch); + +int APS5_VABI libScePlayReady4LegacyUnknown_X1XN0nxTrB0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("X1XN0nxTrB0", libScePlayReady4LegacyUnknown_X1XN0nxTrB0_nid_no_patch); + +int APS5_VABI libScePlayReady4LegacyUnknown_Z7uUgRiNaUA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Z7uUgRiNaUA", libScePlayReady4LegacyUnknown_Z7uUgRiNaUA_nid_no_patch); + +int APS5_VABI libScePlayReady4LegacyUnknown_aCSc_plus_gFPhTk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aCSc+gFPhTk", libScePlayReady4LegacyUnknown_aCSc_plus_gFPhTk_nid_no_patch); + +int APS5_VABI libScePlayReady4LegacyUnknown_aMlr7G9NwEc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aMlr7G9NwEc", libScePlayReady4LegacyUnknown_aMlr7G9NwEc_nid_no_patch); + +int APS5_VABI libScePlayReady4LegacyUnknown_hGDkBn_plus_wW24_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hGDkBn+wW24", libScePlayReady4LegacyUnknown_hGDkBn_plus_wW24_nid_no_patch); + +int APS5_VABI libScePlayReady4LegacyUnknown_i1ZfbPUs1hY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("i1ZfbPUs1hY", libScePlayReady4LegacyUnknown_i1ZfbPUs1hY_nid_no_patch); + +int APS5_VABI libScePlayReady4LegacyUnknown_mo83jp_plus_TDf4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mo83jp+TDf4", libScePlayReady4LegacyUnknown_mo83jp_plus_TDf4_nid_no_patch); + +int APS5_VABI libScePlayReady4LegacyUnknown_tIqisAWtdsc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tIqisAWtdsc", libScePlayReady4LegacyUnknown_tIqisAWtdsc_nid_no_patch); + +int APS5_VABI libScePlayReady4LegacyUnknown_tdqGjUK6t4A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tdqGjUK6t4A", libScePlayReady4LegacyUnknown_tdqGjUK6t4A_nid_no_patch); + +int APS5_VABI libScePlayReady4LegacyUnknown_uyPYr3M0e88_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uyPYr3M0e88", libScePlayReady4LegacyUnknown_uyPYr3M0e88_nid_no_patch); + +int APS5_VABI libScePlayReady4LegacyUnknown_vItDz4CEogs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vItDz4CEogs", libScePlayReady4LegacyUnknown_vItDz4CEogs_nid_no_patch); + +int APS5_VABI libScePlayReady4LegacyUnknown_wvdUsNr4oio_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wvdUsNr4oio", libScePlayReady4LegacyUnknown_wvdUsNr4oio_nid_no_patch); + +int APS5_VABI libScePlayReady4LegacyUnknown_y8e4ucs2eZ0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("y8e4ucs2eZ0", libScePlayReady4LegacyUnknown_y8e4ucs2eZ0_nid_no_patch); + +int APS5_VABI libScePlayReady4LegacyUnknown_yaXM3FQJV1E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yaXM3FQJV1E", libScePlayReady4LegacyUnknown_yaXM3FQJV1E_nid_no_patch); + +int APS5_VABI libScePlayReady4LegacyUnknown_zGW9LWmm1vI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zGW9LWmm1vI", libScePlayReady4LegacyUnknown_zGW9LWmm1vI_nid_no_patch); + +} diff --git a/core/libs/prx/libScePlayReady4/include/InventoryExports.hpp b/core/libs/prx/libScePlayReady4/include/InventoryExports.hpp new file mode 100644 index 0000000000..d8675c45fe --- /dev/null +++ b/core/libs/prx/libScePlayReady4/include/InventoryExports.hpp @@ -0,0 +1,56 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libScePlayReady4Unknown_2OZeMccOeho_nid_no_patch(); +int APS5_VABI libScePlayReady4Unknown_3fo8fAvHn9A_nid_no_patch(); +int APS5_VABI libScePlayReady4Unknown_HNB_minus_eWVwwng_nid_no_patch(); +int APS5_VABI libScePlayReady4Unknown_LL9r9r4cCdQ_nid_no_patch(); +int APS5_VABI libScePlayReady4Unknown_OqSN3eUfHMY_nid_no_patch(); +int APS5_VABI libScePlayReady4Unknown_XawoudE54JE_nid_no_patch(); +int APS5_VABI libScePlayReady4Unknown_asAQ9li6_plus_mo_nid_no_patch(); +int APS5_VABI libScePlayReady4Unknown_o2H2P7xoLec_nid_no_patch(); +int APS5_VABI libScePlayReady4Unknown_sK0jAAnbbiI_nid_no_patch(); + +int APS5_VABI libScePlayReady4LegacyUnknown__plus_YmG2s3DvCk_nid_no_patch(); +int APS5_VABI libScePlayReady4LegacyUnknown__minus_gF0zOwGz9E_nid_no_patch(); +int APS5_VABI libScePlayReady4LegacyUnknown_04KqHETjgSM_nid_no_patch(); +int APS5_VABI libScePlayReady4LegacyUnknown_0VUjhKU8MuM_nid_no_patch(); +int APS5_VABI libScePlayReady4LegacyUnknown_0y6EouMfHdc_nid_no_patch(); +int APS5_VABI libScePlayReady4LegacyUnknown_1exu5Xgmk_minus_M_nid_no_patch(); +int APS5_VABI libScePlayReady4LegacyUnknown_4DC6ObdGHnM_nid_no_patch(); +int APS5_VABI libScePlayReady4LegacyUnknown_4Y2U8T8qLK8_nid_no_patch(); +int APS5_VABI libScePlayReady4LegacyUnknown_5QciIg5fiEU_nid_no_patch(); +int APS5_VABI libScePlayReady4LegacyUnknown_5sj70SoNZk4_nid_no_patch(); +int APS5_VABI libScePlayReady4LegacyUnknown_7xpxheSYUGc_nid_no_patch(); +int APS5_VABI libScePlayReady4LegacyUnknown_9VmAjxwffnw_nid_no_patch(); +int APS5_VABI libScePlayReady4LegacyUnknown_C7YeAC1DT_minus_8_nid_no_patch(); +int APS5_VABI libScePlayReady4LegacyUnknown_C7ukQ505fng_nid_no_patch(); +int APS5_VABI libScePlayReady4LegacyUnknown_E_plus_PJjXu_plus_ldo_nid_no_patch(); +int APS5_VABI libScePlayReady4LegacyUnknown_FN34vyYimhw_nid_no_patch(); +int APS5_VABI libScePlayReady4LegacyUnknown_Fjp5yC5nra4_nid_no_patch(); +int APS5_VABI libScePlayReady4LegacyUnknown_HQFs7qCzusw_nid_no_patch(); +int APS5_VABI libScePlayReady4LegacyUnknown_JitxfgFD8fY_nid_no_patch(); +int APS5_VABI libScePlayReady4LegacyUnknown_SDoU52cLUdM_nid_no_patch(); +int APS5_VABI libScePlayReady4LegacyUnknown_SO8bKPwYC9w_nid_no_patch(); +int APS5_VABI libScePlayReady4LegacyUnknown_SRJvxiIfRgc_nid_no_patch(); +int APS5_VABI libScePlayReady4LegacyUnknown_VIZHbSOKjCY_nid_no_patch(); +int APS5_VABI libScePlayReady4LegacyUnknown_X1XN0nxTrB0_nid_no_patch(); +int APS5_VABI libScePlayReady4LegacyUnknown_Z7uUgRiNaUA_nid_no_patch(); +int APS5_VABI libScePlayReady4LegacyUnknown_aCSc_plus_gFPhTk_nid_no_patch(); +int APS5_VABI libScePlayReady4LegacyUnknown_aMlr7G9NwEc_nid_no_patch(); +int APS5_VABI libScePlayReady4LegacyUnknown_hGDkBn_plus_wW24_nid_no_patch(); +int APS5_VABI libScePlayReady4LegacyUnknown_i1ZfbPUs1hY_nid_no_patch(); +int APS5_VABI libScePlayReady4LegacyUnknown_mo83jp_plus_TDf4_nid_no_patch(); +int APS5_VABI libScePlayReady4LegacyUnknown_tIqisAWtdsc_nid_no_patch(); +int APS5_VABI libScePlayReady4LegacyUnknown_tdqGjUK6t4A_nid_no_patch(); +int APS5_VABI libScePlayReady4LegacyUnknown_uyPYr3M0e88_nid_no_patch(); +int APS5_VABI libScePlayReady4LegacyUnknown_vItDz4CEogs_nid_no_patch(); +int APS5_VABI libScePlayReady4LegacyUnknown_wvdUsNr4oio_nid_no_patch(); +int APS5_VABI libScePlayReady4LegacyUnknown_y8e4ucs2eZ0_nid_no_patch(); +int APS5_VABI libScePlayReady4LegacyUnknown_yaXM3FQJV1E_nid_no_patch(); +int APS5_VABI libScePlayReady4LegacyUnknown_zGW9LWmm1vI_nid_no_patch(); + +} diff --git a/core/libs/prx/libScePlayReady4/libScePlayReady4.hpp b/core/libs/prx/libScePlayReady4/libScePlayReady4.hpp index 97c4cdd3e7..a76aa8006b 100644 --- a/core/libs/prx/libScePlayReady4/libScePlayReady4.hpp +++ b/core/libs/prx/libScePlayReady4/libScePlayReady4.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libScePlayReady4/include/Api.hpp" +#include "prx/libScePlayReady4/include/InventoryExports.hpp" diff --git a/core/libs/prx/libScePlayReady4L/Export.cpp b/core/libs/prx/libScePlayReady4L/Export.cpp new file mode 100644 index 0000000000..576f70d2a2 --- /dev/null +++ b/core/libs/prx/libScePlayReady4L/Export.cpp @@ -0,0 +1,57 @@ +#include "prx/libScePlayReady4L/include/Api.hpp" +#include +#include +#include "SceTypes.hpp" +#include "prx/libc/include/General.hpp" + +extern "C" { + +APS5_EXPORT("OqSN3eUfHMY", scePlayReady4LUnknown00); +int APS5_VABI scePlayReady4LUnknown00(void) { + NotImplemented_nid_no_patch("OqSN3eUfHMY"); + return 0; +} + +APS5_EXPORT("2OZeMccOeho", scePlayReady4LUnknown01); +int APS5_VABI scePlayReady4LUnknown01(void) { + NotImplemented_nid_no_patch("2OZeMccOeho"); + return 0; +} + +APS5_EXPORT("sK0jAAnbbiI", scePlayReady4LUnknown02); +int APS5_VABI scePlayReady4LUnknown02(void) { + NotImplemented_nid_no_patch("sK0jAAnbbiI"); + return 0; +} + +APS5_EXPORT("HNB-eWVwwng", scePlayReady4LUnknown03); +int APS5_VABI scePlayReady4LUnknown03(void) { + NotImplemented_nid_no_patch("HNB-eWVwwng"); + return 0; +} + +APS5_EXPORT("o2H2P7xoLec", scePlayReady4LUnknown04); +int APS5_VABI scePlayReady4LUnknown04(void) { + NotImplemented_nid_no_patch("o2H2P7xoLec"); + return 0; +} + +APS5_EXPORT("3fo8fAvHn9A", scePlayReady4LUnknown05); +int APS5_VABI scePlayReady4LUnknown05(void) { + NotImplemented_nid_no_patch("3fo8fAvHn9A"); + return 0; +} + +APS5_EXPORT("XawoudE54JE", scePlayReady4LUnknown06); +int APS5_VABI scePlayReady4LUnknown06(void) { + NotImplemented_nid_no_patch("XawoudE54JE"); + return 0; +} + +APS5_EXPORT("asAQ9li6+mo", scePlayReady4LUnknown07); +int APS5_VABI scePlayReady4LUnknown07(void) { + NotImplemented_nid_no_patch("asAQ9li6+mo"); + return 0; +} + +} diff --git a/core/libs/prx/libScePlayReady4L/include/Api.hpp b/core/libs/prx/libScePlayReady4L/include/Api.hpp new file mode 100644 index 0000000000..c445931113 --- /dev/null +++ b/core/libs/prx/libScePlayReady4L/include/Api.hpp @@ -0,0 +1,16 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI scePlayReady4LUnknown00(void); +int APS5_VABI scePlayReady4LUnknown01(void); +int APS5_VABI scePlayReady4LUnknown02(void); +int APS5_VABI scePlayReady4LUnknown03(void); +int APS5_VABI scePlayReady4LUnknown04(void); +int APS5_VABI scePlayReady4LUnknown05(void); +int APS5_VABI scePlayReady4LUnknown06(void); +int APS5_VABI scePlayReady4LUnknown07(void); + +} diff --git a/core/libs/prx/libScePlayReady4L/libScePlayReady4L.hpp b/core/libs/prx/libScePlayReady4L/libScePlayReady4L.hpp new file mode 100644 index 0000000000..9415afb176 --- /dev/null +++ b/core/libs/prx/libScePlayReady4L/libScePlayReady4L.hpp @@ -0,0 +1,3 @@ +#pragma once + +#include "prx/libScePlayReady4L/include/Api.hpp" diff --git a/core/libs/prx/libScePngParser/Export.cpp b/core/libs/prx/libScePngParser/Export.cpp index d81f4a5e32..691d4702fd 100644 --- a/core/libs/prx/libScePngParser/Export.cpp +++ b/core/libs/prx/libScePngParser/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libScePngParser/include/InventoryExports.hpp" #include #include #include "SceTypes.hpp" @@ -8,3 +10,42 @@ extern "C" { APS5_DUMMY_FUN } + +extern "C" { + +int APS5_VABI libScePngParserUnknown_suBT1aYALqA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("suBT1aYALqA", libScePngParserUnknown_suBT1aYALqA_nid_no_patch); + +int APS5_VABI libScePngParserUnknown_zfzpwUnVvYE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zfzpwUnVvYE", libScePngParserUnknown_zfzpwUnVvYE_nid_no_patch); + +int APS5_VABI libScePngParserUnknown_70kLUNq_plus_dvQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("70kLUNq+dvQ", libScePngParserUnknown_70kLUNq_plus_dvQ_nid_no_patch); + +int APS5_VABI libScePngParserUnknown_I58FzHBd1OE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("I58FzHBd1OE", libScePngParserUnknown_I58FzHBd1OE_nid_no_patch); + +int APS5_VABI libScePngParserUnknown_G6G_minus_KRVQEwI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("G6G-KRVQEwI", libScePngParserUnknown_G6G_minus_KRVQEwI_nid_no_patch); + +int APS5_VABI libScePngParserUnknown_ji_plus_m7tJEFUk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ji+m7tJEFUk", libScePngParserUnknown_ji_plus_m7tJEFUk_nid_no_patch); + +int APS5_VABI libScePngParserUnknown_Ena5vQ_plus_C5Vs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ena5vQ+C5Vs", libScePngParserUnknown_Ena5vQ_plus_C5Vs_nid_no_patch); + +} diff --git a/core/libs/prx/libScePngParser/include/InventoryExports.hpp b/core/libs/prx/libScePngParser/include/InventoryExports.hpp new file mode 100644 index 0000000000..14898e3c19 --- /dev/null +++ b/core/libs/prx/libScePngParser/include/InventoryExports.hpp @@ -0,0 +1,16 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libScePngParserUnknown_suBT1aYALqA_nid_no_patch(); + +int APS5_VABI libScePngParserUnknown_zfzpwUnVvYE_nid_no_patch(); +int APS5_VABI libScePngParserUnknown_70kLUNq_plus_dvQ_nid_no_patch(); +int APS5_VABI libScePngParserUnknown_I58FzHBd1OE_nid_no_patch(); +int APS5_VABI libScePngParserUnknown_G6G_minus_KRVQEwI_nid_no_patch(); +int APS5_VABI libScePngParserUnknown_ji_plus_m7tJEFUk_nid_no_patch(); +int APS5_VABI libScePngParserUnknown_Ena5vQ_plus_C5Vs_nid_no_patch(); + +} diff --git a/core/libs/prx/libScePngParser/libScePngParser.hpp b/core/libs/prx/libScePngParser/libScePngParser.hpp index 6f70f09bee..5139493e49 100644 --- a/core/libs/prx/libScePngParser/libScePngParser.hpp +++ b/core/libs/prx/libScePngParser/libScePngParser.hpp @@ -1 +1,2 @@ #pragma once +#include "prx/libScePngParser/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceProprietaryVoiceChatHelper.native/Export.cpp b/core/libs/prx/libSceProprietaryVoiceChatHelper.native/Export.cpp new file mode 100644 index 0000000000..d81f4a5e32 --- /dev/null +++ b/core/libs/prx/libSceProprietaryVoiceChatHelper.native/Export.cpp @@ -0,0 +1,10 @@ +#include +#include +#include "SceTypes.hpp" +#include "prx/libc/include/General.hpp" + +extern "C" { + +APS5_DUMMY_FUN + +} diff --git a/core/libs/prx/libSceProprietaryVoiceChatHelper.native/libSceProprietaryVoiceChatHelper.native.hpp b/core/libs/prx/libSceProprietaryVoiceChatHelper.native/libSceProprietaryVoiceChatHelper.native.hpp new file mode 100644 index 0000000000..6f70f09bee --- /dev/null +++ b/core/libs/prx/libSceProprietaryVoiceChatHelper.native/libSceProprietaryVoiceChatHelper.native.hpp @@ -0,0 +1 @@ +#pragma once diff --git a/core/libs/prx/libSceRazorCpu/Export.cpp b/core/libs/prx/libSceRazorCpu/Export.cpp index 0283aa1a71..ee40869b5a 100644 --- a/core/libs/prx/libSceRazorCpu/Export.cpp +++ b/core/libs/prx/libSceRazorCpu/Export.cpp @@ -4,6 +4,8 @@ #include "SceTypes.hpp" #include "prx/libc/include/General.hpp" +static constexpr int SCE_RAZOR_CPU_ERROR_NOT_INITIALIZED = static_cast(0x80580000); + extern "C" { uint32_t APS5_VABI sceRazorCpuIsCapturing(void) { @@ -96,7 +98,7 @@ int APS5_VABI sceRazorCpuShutdownDataTags(void) { size_t APS5_VABI sceRazorCpuGetDataTagStorageSize(uint32_t tagCount) { (void)tagCount; - NotImplemented_nid_no_patch(__func__); + return 0; } int APS5_VABI sceRazorCpuTagArray(const char* label, uint32_t category, void* array, size_t bufferSize, size_t elementSize) { @@ -142,23 +144,20 @@ int APS5_VABI sceRazorCpuEndLogicalFileAccess(void) { } int APS5_VABI sceRazorCpuFiberLogNameChange(void) { - NotImplemented_nid_no_patch(__func__); - return 0; + return 0; } int APS5_VABI sceRazorCpuFiberSwitch(void) { - NotImplemented_nid_no_patch(__func__); - return 0; + return 0; } int APS5_VABI sceRazorCpuGpuMarkerSync(void) { - NotImplemented_nid_no_patch(__func__); - return 0; + return 0; } -int APS5_VABI sceRazorCpuInitializeGpuMarkerContext(void) { - NotImplemented_nid_no_patch(__func__); - return 0; +int APS5_VABI sceRazorCpuInitializeGpuMarkerContext(const uint8_t* context) { + if (!context || context[0] != 1) return 22; + return 0; } int APS5_VABI sceRazorCpuInitializeInternal(void) { @@ -166,44 +165,36 @@ int APS5_VABI sceRazorCpuInitializeInternal(void) { return 0; } -int APS5_VABI sceRazorCpuSetPopMarkerCallback(void) { - NotImplemented_nid_no_patch(__func__); - return 0; +void APS5_VABI sceRazorCpuSetPopMarkerCallback(void* callback) { + (void)callback; } -int APS5_VABI sceRazorCpuSetPushMarkerCallback(void) { - NotImplemented_nid_no_patch(__func__); - return 0; +void APS5_VABI sceRazorCpuSetPushMarkerCallback(void* callback) { + (void)callback; } -int APS5_VABI sceRazorCpuSetPushMarkerStaticCallback(void) { - NotImplemented_nid_no_patch(__func__); - return 0; +void APS5_VABI sceRazorCpuSetPushMarkerStaticCallback(void* callback) { + (void)callback; } int APS5_VABI sceRazorCpuStartCaptureInternal(void) { - NotImplemented_nid_no_patch(__func__); - return 0; + return SCE_RAZOR_CPU_ERROR_NOT_INITIALIZED; } int APS5_VABI sceRazorCpuStopCaptureInternal(void) { - NotImplemented_nid_no_patch(__func__); - return 0; + return SCE_RAZOR_CPU_ERROR_NOT_INITIALIZED; } int APS5_VABI sceRazorCpuWorkloadRunBegin(void) { - NotImplemented_nid_no_patch(__func__); - return 0; + return 0; } int APS5_VABI sceRazorCpuWorkloadRunEnd(void) { - NotImplemented_nid_no_patch(__func__); - return 0; + return 0; } int APS5_VABI sceRazorCpuWorkloadSubmit(void) { - NotImplemented_nid_no_patch(__func__); - return 0; + return 0; } int APS5_VABI sceRazorCpuUserSignalWaitBegin() { diff --git a/core/libs/prx/libSceRazorCpu/include/Api.hpp b/core/libs/prx/libSceRazorCpu/include/Api.hpp index 6898e6e76a..21bcbb13b0 100644 --- a/core/libs/prx/libSceRazorCpu/include/Api.hpp +++ b/core/libs/prx/libSceRazorCpu/include/Api.hpp @@ -29,11 +29,11 @@ int APS5_VABI sceRazorCpuEndLogicalFileAccess(void); int APS5_VABI sceRazorCpuFiberLogNameChange(void); int APS5_VABI sceRazorCpuFiberSwitch(void); int APS5_VABI sceRazorCpuGpuMarkerSync(void); -int APS5_VABI sceRazorCpuInitializeGpuMarkerContext(void); +int APS5_VABI sceRazorCpuInitializeGpuMarkerContext(const uint8_t* context); int APS5_VABI sceRazorCpuInitializeInternal(void); -int APS5_VABI sceRazorCpuSetPopMarkerCallback(void); -int APS5_VABI sceRazorCpuSetPushMarkerCallback(void); -int APS5_VABI sceRazorCpuSetPushMarkerStaticCallback(void); +void APS5_VABI sceRazorCpuSetPopMarkerCallback(void* callback); +void APS5_VABI sceRazorCpuSetPushMarkerCallback(void* callback); +void APS5_VABI sceRazorCpuSetPushMarkerStaticCallback(void* callback); int APS5_VABI sceRazorCpuStartCaptureInternal(void); int APS5_VABI sceRazorCpuStopCaptureInternal(void); int APS5_VABI sceRazorCpuWorkloadRunBegin(void); diff --git a/core/libs/prx/libSceRegMgr/CMakeLists.txt b/core/libs/prx/libSceRegMgr/CMakeLists.txt index e10c382e33..fd61a9bf30 100644 --- a/core/libs/prx/libSceRegMgr/CMakeLists.txt +++ b/core/libs/prx/libSceRegMgr/CMakeLists.txt @@ -1,4 +1,4 @@ -add_library(libSceRegMgr SHARED EXCLUDE_FROM_ALL Export.cpp) +add_library(libSceRegMgr SHARED EXCLUDE_FROM_ALL Export.cpp InventoryExports.cpp) target_include_directories(libSceRegMgr PRIVATE ${LIBS_INCLUDE_DIR}) configure_windows_unwind(libSceRegMgr) diff --git a/core/libs/prx/libSceRegMgr/InventoryExports.cpp b/core/libs/prx/libSceRegMgr/InventoryExports.cpp new file mode 100644 index 0000000000..7830cdafa9 --- /dev/null +++ b/core/libs/prx/libSceRegMgr/InventoryExports.cpp @@ -0,0 +1,47 @@ +#include "SceTypes.hpp" +#include "prx/libc/include/General.hpp" +#include "prx/libc/include/general/ExportMacros.hpp" + +extern "C" { + +int APS5_VABI libSceRegMgrUnknown_JfNNpUQdhQw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JfNNpUQdhQw", libSceRegMgrUnknown_JfNNpUQdhQw_nid_no_patch); + +int APS5_VABI libSceRegMgrUnknown_UuGXdpQj1Aw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UuGXdpQj1Aw", libSceRegMgrUnknown_UuGXdpQj1Aw_nid_no_patch); + +int APS5_VABI libSceRegMgrUnknown_YtmvqKL9PEo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YtmvqKL9PEo", libSceRegMgrUnknown_YtmvqKL9PEo_nid_no_patch); + +int APS5_VABI libSceRegMgrUnknown_csy_minus_cEETOKg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("csy-cEETOKg", libSceRegMgrUnknown_csy_minus_cEETOKg_nid_no_patch); + +int APS5_VABI libSceRegMgrUnknown_iHi1Omn25M4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iHi1Omn25M4", libSceRegMgrUnknown_iHi1Omn25M4_nid_no_patch); + +int APS5_VABI libSceRegMgrUnknown_wpJW0oIM6rg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wpJW0oIM6rg", libSceRegMgrUnknown_wpJW0oIM6rg_nid_no_patch); + +int APS5_VABI libSceRegMgrUnknown_x0YJQilTJDo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("x0YJQilTJDo", libSceRegMgrUnknown_x0YJQilTJDo_nid_no_patch); + +int APS5_VABI libSceRegMgrUnknown_x9WN_plus_tFTY34_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("x9WN+tFTY34", libSceRegMgrUnknown_x9WN_plus_tFTY34_nid_no_patch); + +} diff --git a/core/libs/prx/libSceRemoteplay/Export.cpp b/core/libs/prx/libSceRemoteplay/Export.cpp index 3e527838ba..c5544cba3e 100644 --- a/core/libs/prx/libSceRemoteplay/Export.cpp +++ b/core/libs/prx/libSceRemoteplay/Export.cpp @@ -1,3 +1,4 @@ +#include "prx/libc/include/general/ExportMacros.hpp" #include "prx/libSceRemoteplay/include/InventoryExports.hpp" #include "prx/libSceRemoteplay/include/Api.hpp" #include @@ -263,4 +264,23 @@ int APS5_VABI sceRemoteplaySetRpMode(void) { return 0; } +int APS5_VABI sceRemoteplayDisableInputDevice(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceRemoteplayEnableInputDevice(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +} + +extern "C" { + +int APS5_VABI libSceRemoteplayUnknown_HV7jZe1frbM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HV7jZe1frbM", libSceRemoteplayUnknown_HV7jZe1frbM_nid_no_patch); + } diff --git a/core/libs/prx/libSceRemoteplay/include/InventoryExports.hpp b/core/libs/prx/libSceRemoteplay/include/InventoryExports.hpp index 8b7845baef..349a780792 100644 --- a/core/libs/prx/libSceRemoteplay/include/InventoryExports.hpp +++ b/core/libs/prx/libSceRemoteplay/include/InventoryExports.hpp @@ -8,5 +8,8 @@ int APS5_VABI sceRemoteplayIsRemoteViewering(); int APS5_VABI sceRemoteplayNotifyCanWakeup(); int APS5_VABI sceRemoteplayRegistCallback(); int APS5_VABI sceRemoteplayUnregistCallback(); +int APS5_VABI sceRemoteplayDisableInputDevice(void); +int APS5_VABI sceRemoteplayEnableInputDevice(void); +int APS5_VABI libSceRemoteplayUnknown_HV7jZe1frbM_nid_no_patch(); } diff --git a/core/libs/prx/libSceRudp/CMakeLists.txt b/core/libs/prx/libSceRudp/CMakeLists.txt index 2f8f0c7420..435a336abc 100644 --- a/core/libs/prx/libSceRudp/CMakeLists.txt +++ b/core/libs/prx/libSceRudp/CMakeLists.txt @@ -17,3 +17,15 @@ if(BUILD_TESTING) "PATH=path_list_prepend:$") endif() endif() + +if(BUILD_TESTING) + add_test_executable(guest_rudp_unconnected_tests ${LIBS_INCLUDE_DIR}/tests/GuestRudpUnconnected.cpp) + target_include_directories(guest_rudp_unconnected_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_rudp_unconnected_tests PRIVATE libSceRudp libc ${CMAKE_DL_LIBS}) + configure_windows_unwind(guest_rudp_unconnected_tests) + add_test(NAME guest_rudp_unconnected COMMAND guest_rudp_unconnected_tests) + if(WIN32) + set_tests_properties(guest_rudp_unconnected PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceRudp/Export.cpp b/core/libs/prx/libSceRudp/Export.cpp index 56b1f239bf..ec5c912c84 100644 --- a/core/libs/prx/libSceRudp/Export.cpp +++ b/core/libs/prx/libSceRudp/Export.cpp @@ -38,6 +38,7 @@ constexpr int RUDP_POOL_MIN_SIZE = 0xC58; constexpr std::uintptr_t RUDP_POOL_ALIGNMENT = 8; constexpr std::size_t RUDP_STATUS_SIZE = 0xF8; constexpr std::size_t RUDP_STATUS_CURRENT_CONTEXTS = 0x64; +constexpr std::size_t RUDP_CONTEXT_BUFFER_STATUS_SIZE = 16; constexpr uint16_t RUDP_MAX_SEGMENT_SIZE = 1410; enum RudpOption { @@ -313,8 +314,20 @@ int APS5_VABI sceRudpGetContextStatus(int ctx_id, void* status, uint32_t size) { } int APS5_VABI sceRudpGetRemoteInfo(int contextId, void* address, std::uint32_t* addressSize, std::uint16_t* virtualPort) { - NotImplemented_nid_no_patch(__func__); - return 0; + (void)address; + (void)addressSize; + (void)virtualPort; + std::lock_guard lk(g_mutex); + if (!g_inited) { + return RUDP_ERROR_NOT_INITIALIZED; + } + if (contextId < 0) { + return RUDP_ERROR_INVALID_ARGUMENT; + } + if (!valid_ctx(contextId)) { + return RUDP_ERROR_INVALID_CONTEXT_ID; + } + return RUDP_ERROR_NOT_ACCEPTABLE; } int APS5_VABI sceRudpGetNumberOfPacketsToRead(int ctx_id) { @@ -525,9 +538,18 @@ int APS5_VABI sceRudpAccept() { return 0; } -int APS5_VABI sceRudpFlush() { - NotImplemented_nid_no_patch(__func__); - return 0; +int APS5_VABI sceRudpFlush(int ctxId) { + std::lock_guard lk(g_mutex); + if (!g_inited) { + return RUDP_ERROR_NOT_INITIALIZED; + } + if (ctxId < 0) { + return RUDP_ERROR_INVALID_ARGUMENT; + } + if (!valid_ctx(ctxId)) { + return RUDP_ERROR_INVALID_CONTEXT_ID; + } + return RUDP_ERROR_NOT_ACCEPTABLE; } int APS5_VABI sceRudpGetLocalInfo() { @@ -582,8 +604,19 @@ int APS5_VABI sceRudpSetMaxSegmentSize(uint16_t mss) { return 0; } -int APS5_VABI sceRudpGetContextBufferStatus() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI sceRudpGetContextBufferStatus(int ctxId, void* status, std::size_t size) { + std::lock_guard lk(g_mutex); + if (!g_inited) { + return RUDP_ERROR_NOT_INITIALIZED; + } + if (ctxId < 0 || status == nullptr || size == 0 || size > RUDP_CONTEXT_BUFFER_STATUS_SIZE) { + return RUDP_ERROR_INVALID_ARGUMENT; + } + if (!valid_ctx(ctxId)) { + return RUDP_ERROR_INVALID_CONTEXT_ID; + } + std::memset(status, 0, size); + return 0; } } diff --git a/core/libs/prx/libSceRudp/include/Api.hpp b/core/libs/prx/libSceRudp/include/Api.hpp index 369be35a89..9a7f2706b2 100644 --- a/core/libs/prx/libSceRudp/include/Api.hpp +++ b/core/libs/prx/libSceRudp/include/Api.hpp @@ -35,11 +35,11 @@ int APS5_VABI sceRudpPollControl(int pollId, int op, int ctxId, uint16_t events) int APS5_VABI sceRudpPollWait(int pollId, RudpPollEvent* events, std::size_t eventLen, uint64_t timeout); int APS5_VABI sceRudpPollDestroy(int pollId); int APS5_VABI sceRudpAccept(); -int APS5_VABI sceRudpFlush(); +int APS5_VABI sceRudpFlush(int ctxId); int APS5_VABI sceRudpGetLocalInfo(); int APS5_VABI sceRudpListen(); int APS5_VABI sceRudpPollCancel(int pollId); int APS5_VABI sceRudpSetMaxSegmentSize(uint16_t mss); -int APS5_VABI sceRudpGetContextBufferStatus(); +int APS5_VABI sceRudpGetContextBufferStatus(int ctxId, void* status, std::size_t size); } diff --git a/core/libs/prx/libSceSaveData.native/CMakeLists.txt b/core/libs/prx/libSceSaveData.native/CMakeLists.txt index 7d1e1e0c55..1d30e2d536 100644 --- a/core/libs/prx/libSceSaveData.native/CMakeLists.txt +++ b/core/libs/prx/libSceSaveData.native/CMakeLists.txt @@ -60,4 +60,14 @@ if(BUILD_TESTING) set_tests_properties(guest_savedata_cancel PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") endif() + + add_test_executable(guest_savedata_host_space_tests ${LIBS_INCLUDE_DIR}/tests/GuestSaveDataHostSpace.cpp) + target_include_directories(guest_savedata_host_space_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_savedata_host_space_tests PRIVATE libSceSaveData.native libc) + configure_windows_unwind(guest_savedata_host_space_tests) + add_test(NAME guest_savedata_host_space COMMAND guest_savedata_host_space_tests) + if(WIN32) + set_tests_properties(guest_savedata_host_space PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() endif() diff --git a/core/libs/prx/libSceSaveData.native/Export.cpp b/core/libs/prx/libSceSaveData.native/Export.cpp index eef4648384..644b421f49 100644 --- a/core/libs/prx/libSceSaveData.native/Export.cpp +++ b/core/libs/prx/libSceSaveData.native/Export.cpp @@ -24,6 +24,7 @@ #include "prx/libc/include/RemoveTree.hpp" #include "prx/libkernel/AppMetadata/include/AppMetadata.hpp" #include "SaveData.hpp" +#include "prx/libSceSaveData.native/include/SaveDataHostSpace.hpp" #include "prx/libSceSaveData/SaveDataFile.hpp" #ifdef _WIN32 #ifndef NOMINMAX @@ -332,16 +333,19 @@ static std::string blocks_path(const std::string& real_path) { return real_path + ".blocks"; } -static bool isMountedDirectory(const std::string& path) { +static bool isMountedDirectory(const std::string& path, std::error_code& error) { for (const auto& slot : g_slots) { if (!slot.used) continue; if (slot.real_path == path) return true; - if (!std::filesystem::exists(path) || !std::filesystem::exists(slot.real_path)) continue; - std::error_code error; + const bool exists = std::filesystem::exists(path, error); + if (error) return false; + if (!exists) continue; + const bool mountedExists = std::filesystem::exists(slot.real_path, error); + if (error) return false; + if (!mountedExists) continue; const bool sameDirectory = std::filesystem::equivalent(slot.real_path, path, error); - if (error && error != std::errc::no_such_file_or_directory) { - throw std::filesystem::filesystem_error("SaveData: failed to compare save paths", slot.real_path, path, error); - } + if (error == std::errc::no_such_file_or_directory) error.clear(); + if (error) return false; if (sameDirectory) return true; } return false; @@ -361,7 +365,9 @@ static int deleteSave(const SaveDataDelete* del) { } const std::string path = save_root() + "/" + dirName; std::lock_guard lock(g_slots_mutex); - if (isMountedDirectory(path)) return SAVE_DATA_ERROR_BUSY; + std::error_code error; + if (isMountedDirectory(path, error)) return SAVE_DATA_ERROR_BUSY; + if (error) return SAVE_DATA_ERROR_INTERNAL; if (std::filesystem::is_directory(path)) { RemoveTree(path); } @@ -385,6 +391,41 @@ int APS5_VABI sceSaveDataDeleteTransactionResource(int32_t resource) { static constexpr std::uint64_t SAVE_DATA_BLOCK_BYTES = 65536; +enum class FreeSpaceMode : std::uint8_t { Fixed, Host }; + +static FreeSpaceMode free_space_mode() { + const char* configured = std::getenv("ANYPS5_FREE_SPACE"); + if (configured == nullptr || std::strcmp(configured, "fixed") == 0) return FreeSpaceMode::Fixed; + if (std::strcmp(configured, "host") == 0) return FreeSpaceMode::Host; + throw std::runtime_error("ANYPS5_FREE_SPACE must be fixed or host, not \"" + std::string(configured) + "\""); +} + +static std::uint64_t default_free_space(const std::string& path) { + std::filesystem::path probe = std::filesystem::absolute(path); + std::error_code error; + while (!std::filesystem::exists(probe, error) && probe.has_relative_path()) probe = probe.parent_path(); + return static_cast(std::filesystem::space(probe).available); +} + +static SaveDataFreeSpaceSource g_free_space_source = default_free_space; + +extern "C" void SetSaveDataFreeSpaceSourceForTest_nid_no_patch(SaveDataFreeSpaceSource source) { + g_free_space_source = source != nullptr ? source : default_free_space; +} + +static bool host_free_bytes(const std::string& path, std::uint64_t& bytes) { + try { + bytes = g_free_space_source(path); + return true; + } catch (const std::exception& failure) { + static std::atomic reported{false}; + if (!reported.exchange(true, std::memory_order_relaxed)) { + std::fprintf(stderr, "[SAVEDATA:native] host free space unavailable, saves keep their own size: %s\n", failure.what()); + } + return false; + } +} + static std::uint64_t save_blocks(const std::string& real_path) { std::ifstream file(blocks_path(real_path)); std::uint64_t blocks = 0; @@ -394,12 +435,9 @@ static std::uint64_t save_blocks(const std::string& real_path) { return std::min(blocks, SAVE_DATA_BLOCKS_MAX); } -static void keep_save_blocks(const std::string& real_path, std::uint64_t blocks) { - std::ofstream file(blocks_path(real_path), std::ios::trunc); - file << std::min(blocks, SAVE_DATA_BLOCKS_MAX) << '\n'; - if (!file) { - throw std::runtime_error("sceSaveDataMount3: the save's size could not be kept"); - } +static bool keep_save_blocks(const std::string& real_path, std::uint64_t blocks) { + const auto content = std::to_string(std::min(blocks, SAVE_DATA_BLOCKS_MAX)) + '\n'; + return savedata::replace_file(blocks_path(real_path), content.data(), content.size()); } static std::uint64_t used_blocks(const std::string& real_path) { @@ -419,7 +457,12 @@ static std::uint64_t used_blocks(const std::string& real_path) { static SaveDataSearchInfo search_info(const std::string& real_path) { const auto blocks = save_blocks(real_path); - return SaveDataSearchInfo{blocks, blocks - std::min(blocks, used_blocks(real_path)), {}}; + auto freeBlocks = blocks - std::min(blocks, used_blocks(real_path)); + if (free_space_mode() == FreeSpaceMode::Host) { + std::uint64_t available = 0; + if (host_free_bytes(real_path, available)) freeBlocks = std::min(freeBlocks, available / SAVE_DATA_BLOCK_BYTES); + } + return SaveDataSearchInfo{blocks, freeBlocks, {}}; } static int dirNameSearch(const SaveDataDirNameSearchCond* cond, SaveDataDirNameSearchResult* result) { @@ -633,6 +676,7 @@ static int mount3(const SaveDataMount3* mount, SaveDataMountResult* mount_result if (mount == nullptr || mount_result == nullptr || mount->dir_name == nullptr) { return SAVE_DATA_ERROR_PARAMETER; } + const FreeSpaceMode freeSpace = free_space_mode(); const bool create = (mount->mount_mode & SAVE_DATA_MOUNT_MODE_CREATE) != 0; const bool create2 = (mount->mount_mode & SAVE_DATA_MOUNT_MODE_CREATE2) != 0; const bool rdonly = (mount->mount_mode & SAVE_DATA_MOUNT_MODE_RDONLY) != 0; @@ -651,8 +695,12 @@ static int mount3(const SaveDataMount3* mount, SaveDataMountResult* mount_result } const std::string real_path = save_root() + "/" + dirName; std::lock_guard lock(g_slots_mutex); - if (isMountedDirectory(real_path)) return SAVE_DATA_ERROR_BUSY; - const bool exists = std::filesystem::is_directory(real_path); + std::error_code error; + if (isMountedDirectory(real_path, error)) return SAVE_DATA_ERROR_BUSY; + if (error) return SAVE_DATA_ERROR_INTERNAL; + const bool exists = std::filesystem::is_directory(real_path, error); + if (error == std::errc::no_such_file_or_directory) error.clear(); + if (error) return SAVE_DATA_ERROR_INTERNAL; if (create && exists) { return SAVE_DATA_ERROR_EXISTS; } @@ -663,13 +711,36 @@ static int mount3(const SaveDataMount3* mount, SaveDataMountResult* mount_result if (slot == -1) { return SAVE_DATA_ERROR_MOUNT_FULL; } - if (create || create2) { - std::filesystem::create_directories(real_path); + if (!exists && (create || create2) && freeSpace == FreeSpaceMode::Host) { + const std::uint64_t blocks = mount->blocks == 0 ? SAVE_DATA_BLOCKS_MAX : std::min(mount->blocks, SAVE_DATA_BLOCKS_MAX); + const std::uint64_t required = blocks * SAVE_DATA_BLOCK_BYTES; + std::uint64_t available = 0; + if (host_free_bytes(real_path, available) && available < required) { + std::memset(mount_result, 0, sizeof(*mount_result)); + mount_result->required_blocks = (required - available + SAVE_DATA_BLOCK_BYTES - 1) / SAVE_DATA_BLOCK_BYTES; + return SAVE_DATA_ERROR_NO_SPACE_FS; + } + } + bool keepSize = mount->blocks != 0 && (create || (create2 && !exists)); + if (mount->blocks != 0 && !keepSize) { + keepSize = !std::filesystem::exists(blocks_path(real_path), error); + if (error) return SAVE_DATA_ERROR_INTERNAL; + } + const auto absolutePath = std::filesystem::absolute(real_path, error).string(); + if (error) return SAVE_DATA_ERROR_INTERNAL; + const bool created = (create || create2) && std::filesystem::create_directories(real_path, error); + if (error) return SAVE_DATA_ERROR_INTERNAL; + if (keepSize && !keep_save_blocks(real_path, mount->blocks)) { + if (created) { + std::error_code ignored; + std::filesystem::remove(real_path, ignored); + } + return SAVE_DATA_ERROR_INTERNAL; } // The title gets a short mount point (16 bytes on the PS5) and opens files under it; the // path resolver maps it to the save directory, whose name may be far longer. const std::string mountPoint = "/savedata" + std::to_string(slot); - AddPathAlias_nid_no_patch(mountPoint.c_str(), std::filesystem::absolute(real_path).string().c_str()); + AddPathAlias_nid_no_patch(mountPoint.c_str(), absolutePath.c_str()); std::memset(mount_result, 0, sizeof(*mount_result)); g_slots[slot].used = true; g_slots[slot].mount_point = mountPoint; @@ -677,16 +748,12 @@ static int mount3(const SaveDataMount3* mount, SaveDataMountResult* mount_result std::memcpy(mount_result->mount_point.data, mountPoint.c_str(), mountPoint.size() + 1); mount_result->required_blocks = 0; mount_result->mount_status = (create || (create2 && !exists)) ? 1u : 0u; - std::error_code sized; - if (mount->blocks != 0 && (create || (create2 && !exists) || !std::filesystem::exists(blocks_path(real_path), sized))) { - keep_save_blocks(real_path, mount->blocks); - } return SAVE_DATA_OK; } int APS5_VABI sceSaveDataMount3(const SaveDataMount3* mount, SaveDataMountResult* mount_result) { const int rc = mount3(mount, mount_result); - SAVEDATA_TRACE("mount3 user=%d dir=%.*s mode=0x%x blocks=%llu -> 0x%08x point=%.*s status=%u", mount != nullptr ? mount->user_id : -1, static_cast(sizeof(SceSaveDataDirName::data)), mount != nullptr && mount->dir_name != nullptr ? mount->dir_name->data : "(null)", mount != nullptr ? mount->mount_mode : 0u, mount != nullptr ? static_cast(mount->blocks) : 0ull, static_cast(rc), static_cast(sizeof(SaveDataMountPoint::data)), mount_result != nullptr ? mount_result->mount_point.data : "", mount_result != nullptr ? mount_result->mount_status : 0u); + SAVEDATA_TRACE("mount3 user=%d dir=%.*s mode=0x%x blocks=%llu -> 0x%08x point=%.*s status=%u", mount != nullptr ? mount->user_id : -1, static_cast(sizeof(SceSaveDataDirName::data)), mount != nullptr && mount->dir_name != nullptr ? mount->dir_name->data : "(null)", mount != nullptr ? mount->mount_mode : 0u, mount != nullptr ? static_cast(mount->blocks) : 0ull, static_cast(rc), static_cast(sizeof(SaveDataMountPoint::data)), rc == SAVE_DATA_OK && mount_result != nullptr ? mount_result->mount_point.data : "", rc == SAVE_DATA_OK && mount_result != nullptr ? mount_result->mount_status : 0u); return rc; } diff --git a/core/libs/prx/libSceSaveData.native/SaveData.hpp b/core/libs/prx/libSceSaveData.native/SaveData.hpp index 1a8681cb38..b8d2b8a1f9 100644 --- a/core/libs/prx/libSceSaveData.native/SaveData.hpp +++ b/core/libs/prx/libSceSaveData.native/SaveData.hpp @@ -17,6 +17,7 @@ constexpr int SAVE_DATA_ERROR_NOT_MOUNTED = -2137063420; constexpr int SAVE_DATA_ERROR_MOUNT_FULL = -2137063412; constexpr int SAVE_DATA_ERROR_EXISTS = -2137063417; constexpr int SAVE_DATA_ERROR_NOT_FOUND = -2137063416; +constexpr int SAVE_DATA_ERROR_NO_SPACE_FS = -2137063414; constexpr int SAVE_DATA_ERROR_INTERNAL = -2137063413; // 0x809F000B constexpr int SAVE_DATA_ERROR_MEMORY_NOT_READY = -2137063406; // 0x809F0012 diff --git a/core/libs/prx/libSceSaveData.native/include/SaveDataHostSpace.hpp b/core/libs/prx/libSceSaveData.native/include/SaveDataHostSpace.hpp new file mode 100644 index 0000000000..d52ea04e6d --- /dev/null +++ b/core/libs/prx/libSceSaveData.native/include/SaveDataHostSpace.hpp @@ -0,0 +1,11 @@ +#ifndef CORE_LIBS_PRX_LIBSCESAVEDATANATIVE_INCLUDE_SAVEDATAHOSTSPACE_HPP +#define CORE_LIBS_PRX_LIBSCESAVEDATANATIVE_INCLUDE_SAVEDATAHOSTSPACE_HPP + +#include +#include + +using SaveDataFreeSpaceSource = std::uint64_t (*)(const std::string& path); + +extern "C" void SetSaveDataFreeSpaceSourceForTest_nid_no_patch(SaveDataFreeSpaceSource source); + +#endif diff --git a/core/libs/prx/libSceSaveData/CMakeLists.txt b/core/libs/prx/libSceSaveData/CMakeLists.txt index ed878f0e32..ecde5e9dc3 100644 --- a/core/libs/prx/libSceSaveData/CMakeLists.txt +++ b/core/libs/prx/libSceSaveData/CMakeLists.txt @@ -1,2 +1,3 @@ include(${CMAKE_CURRENT_SOURCE_DIR}/../libSceSaveData.native/SaveDataLibrary.cmake) add_sce_savedata_library(libSceSaveData) +target_sources(libSceSaveData PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/InventoryExports.cpp) diff --git a/core/libs/prx/libSceSaveData/InventoryExports.cpp b/core/libs/prx/libSceSaveData/InventoryExports.cpp new file mode 100644 index 0000000000..7638823209 --- /dev/null +++ b/core/libs/prx/libSceSaveData/InventoryExports.cpp @@ -0,0 +1,77 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceSaveData/include/InventoryExports.hpp" +#include "prx/libc/include/General.hpp" + +extern "C" { + +int APS5_VABI libSceSaveDataUnknown_0TAVrO_minus_LgPI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0TAVrO-LgPI", libSceSaveDataUnknown_0TAVrO_minus_LgPI_nid_no_patch); + +int APS5_VABI libSceSaveDataUnknown_35cI_minus_Z0nz68_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("35cI-Z0nz68", libSceSaveDataUnknown_35cI_minus_Z0nz68_nid_no_patch); + +int APS5_VABI libSceSaveDataUnknown_AuTE0gFxZCI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AuTE0gFxZCI", libSceSaveDataUnknown_AuTE0gFxZCI_nid_no_patch); + +int APS5_VABI libSceSaveDataUnknown_IE_plus_HJN8_plus_Jdg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IE+HJN8+Jdg", libSceSaveDataUnknown_IE_plus_HJN8_plus_Jdg_nid_no_patch); + +int APS5_VABI libSceSaveDataUnknown_IGpkv_minus_UOup0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IGpkv-UOup0", libSceSaveDataUnknown_IGpkv_minus_UOup0_nid_no_patch); + +int APS5_VABI libSceSaveDataUnknown_NxxouhCA12c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NxxouhCA12c", libSceSaveDataUnknown_NxxouhCA12c_nid_no_patch); + +int APS5_VABI libSceSaveDataUnknown_QaI8L6NzmJU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QaI8L6NzmJU", libSceSaveDataUnknown_QaI8L6NzmJU_nid_no_patch); + +int APS5_VABI libSceSaveDataUnknown_VM8qEhWh_minus_A4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VM8qEhWh-A4", libSceSaveDataUnknown_VM8qEhWh_minus_A4_nid_no_patch); + +int APS5_VABI libSceSaveDataUnknown_apvJPjG_plus_6_minus_Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("apvJPjG+6-Q", libSceSaveDataUnknown_apvJPjG_plus_6_minus_Q_nid_no_patch); + +int APS5_VABI libSceSaveDataUnknown_cbD93i6sy9E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cbD93i6sy9E", libSceSaveDataUnknown_cbD93i6sy9E_nid_no_patch); + +int APS5_VABI libSceSaveDataUnknown_fIu_minus_ckf3n_minus_o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fIu-ckf3n-o", libSceSaveDataUnknown_fIu_minus_ckf3n_minus_o_nid_no_patch); + +int APS5_VABI libSceSaveDataUnknown_g1roz3Ux_plus_3I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("g1roz3Ux+3I", libSceSaveDataUnknown_g1roz3Ux_plus_3I_nid_no_patch); + +int APS5_VABI libSceSaveDataUnknown_q8KxzjSpPVw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("q8KxzjSpPVw", libSceSaveDataUnknown_q8KxzjSpPVw_nid_no_patch); + +int APS5_VABI libSceSaveDataUnknown_yBM2vzabhEA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yBM2vzabhEA", libSceSaveDataUnknown_yBM2vzabhEA_nid_no_patch); + +} diff --git a/core/libs/prx/libSceSaveData/include/InventoryExports.hpp b/core/libs/prx/libSceSaveData/include/InventoryExports.hpp new file mode 100644 index 0000000000..106add58ae --- /dev/null +++ b/core/libs/prx/libSceSaveData/include/InventoryExports.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceSaveDataUnknown_0TAVrO_minus_LgPI_nid_no_patch(); +int APS5_VABI libSceSaveDataUnknown_35cI_minus_Z0nz68_nid_no_patch(); +int APS5_VABI libSceSaveDataUnknown_AuTE0gFxZCI_nid_no_patch(); +int APS5_VABI libSceSaveDataUnknown_IE_plus_HJN8_plus_Jdg_nid_no_patch(); +int APS5_VABI libSceSaveDataUnknown_IGpkv_minus_UOup0_nid_no_patch(); +int APS5_VABI libSceSaveDataUnknown_NxxouhCA12c_nid_no_patch(); +int APS5_VABI libSceSaveDataUnknown_QaI8L6NzmJU_nid_no_patch(); +int APS5_VABI libSceSaveDataUnknown_VM8qEhWh_minus_A4_nid_no_patch(); +int APS5_VABI libSceSaveDataUnknown_apvJPjG_plus_6_minus_Q_nid_no_patch(); +int APS5_VABI libSceSaveDataUnknown_cbD93i6sy9E_nid_no_patch(); +int APS5_VABI libSceSaveDataUnknown_fIu_minus_ckf3n_minus_o_nid_no_patch(); +int APS5_VABI libSceSaveDataUnknown_g1roz3Ux_plus_3I_nid_no_patch(); +int APS5_VABI libSceSaveDataUnknown_q8KxzjSpPVw_nid_no_patch(); +int APS5_VABI libSceSaveDataUnknown_yBM2vzabhEA_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceSaveData/libSceSaveData.hpp b/core/libs/prx/libSceSaveData/libSceSaveData.hpp index 72713a0e1f..5b29b59e46 100644 --- a/core/libs/prx/libSceSaveData/libSceSaveData.hpp +++ b/core/libs/prx/libSceSaveData/libSceSaveData.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceSaveData/include/Api.hpp" +#include "prx/libSceSaveData/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceShare/Export.cpp b/core/libs/prx/libSceShare/Export.cpp index e2f486e7f1..3076aa4355 100644 --- a/core/libs/prx/libSceShare/Export.cpp +++ b/core/libs/prx/libSceShare/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceShare/include/InventoryExports.hpp" #include "prx/libSceShare/include/Api.hpp" #include #include @@ -133,3 +135,34 @@ int APS5_VABI sceShareSetContentParamForApplicationTitle(const char* application } } + + +extern "C" { + +int APS5_VABI sceShareFeatureExPermit() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceShareFeatureExProhibit() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceShareRegisterUploadCallback() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceShareUnregisterUploadCallback() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI libSceShareUnknown_YPIiGz4uKOU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YPIiGz4uKOU", libSceShareUnknown_YPIiGz4uKOU_nid_no_patch); + +int APS5_VABI libSceShareUnknown_txixe0fiPKM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("txixe0fiPKM", libSceShareUnknown_txixe0fiPKM_nid_no_patch); + +} diff --git a/core/libs/prx/libSceShare/include/InventoryExports.hpp b/core/libs/prx/libSceShare/include/InventoryExports.hpp new file mode 100644 index 0000000000..8c451202d5 --- /dev/null +++ b/core/libs/prx/libSceShare/include/InventoryExports.hpp @@ -0,0 +1,14 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI sceShareFeatureExPermit(); +int APS5_VABI sceShareFeatureExProhibit(); +int APS5_VABI sceShareRegisterUploadCallback(); +int APS5_VABI sceShareUnregisterUploadCallback(); +int APS5_VABI libSceShareUnknown_YPIiGz4uKOU_nid_no_patch(); +int APS5_VABI libSceShareUnknown_txixe0fiPKM_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceShare/libSceShare.hpp b/core/libs/prx/libSceShare/libSceShare.hpp index ee79c2f96a..e9a283210f 100644 --- a/core/libs/prx/libSceShare/libSceShare.hpp +++ b/core/libs/prx/libSceShare/libSceShare.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceShare/include/Api.hpp" +#include "prx/libSceShare/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceShareInternal.native/Export.cpp b/core/libs/prx/libSceShareInternal.native/Export.cpp index d81f4a5e32..c698fcb321 100644 --- a/core/libs/prx/libSceShareInternal.native/Export.cpp +++ b/core/libs/prx/libSceShareInternal.native/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceShareInternal.native/include/InventoryExports.hpp" #include #include #include "SceTypes.hpp" @@ -8,3 +10,94 @@ extern "C" { APS5_DUMMY_FUN } + +extern "C" { + +int APS5_VABI sceShareEventCallbackProcessed() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceShareFeaturePermitCompatible() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceShareFeatureProhibitCompatible() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceShareGetContentParam() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceShareGetStoredAppStatus() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceShareInitializeForShellCore() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceShareInitializeInternal() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceShareRegisterEventCallback() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceShareSetCurrentStatus() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceShareSetUploadEventInfo() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceShareTerminateForShellCore() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceShareTerminateInternal() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceShareUnregisterEventCallback() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI libSceShareInternal_nativeUnknown__plus_LB32s0kCYg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+LB32s0kCYg", libSceShareInternal_nativeUnknown__plus_LB32s0kCYg_nid_no_patch); + +int APS5_VABI libSceShareInternal_nativeUnknown_0IbPXX_minus_WvQQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0IbPXX-WvQQ", libSceShareInternal_nativeUnknown_0IbPXX_minus_WvQQ_nid_no_patch); + +int APS5_VABI libSceShareInternal_nativeUnknown_8E7VGc9qRvY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8E7VGc9qRvY", libSceShareInternal_nativeUnknown_8E7VGc9qRvY_nid_no_patch); + +int APS5_VABI libSceShareInternal_nativeUnknown_9fIEK6i1idg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9fIEK6i1idg", libSceShareInternal_nativeUnknown_9fIEK6i1idg_nid_no_patch); + +int APS5_VABI libSceShareInternal_nativeUnknown_9oywh7VdSjM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9oywh7VdSjM", libSceShareInternal_nativeUnknown_9oywh7VdSjM_nid_no_patch); + +int APS5_VABI libSceShareInternal_nativeUnknown_IvkDssl52mA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IvkDssl52mA", libSceShareInternal_nativeUnknown_IvkDssl52mA_nid_no_patch); + +int APS5_VABI libSceShareInternal_nativeUnknown_zyzD8P5ZKPA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zyzD8P5ZKPA", libSceShareInternal_nativeUnknown_zyzD8P5ZKPA_nid_no_patch); + +} diff --git a/core/libs/prx/libSceShareInternal.native/include/InventoryExports.hpp b/core/libs/prx/libSceShareInternal.native/include/InventoryExports.hpp new file mode 100644 index 0000000000..dfeff88cf8 --- /dev/null +++ b/core/libs/prx/libSceShareInternal.native/include/InventoryExports.hpp @@ -0,0 +1,28 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI sceShareEventCallbackProcessed(); +int APS5_VABI sceShareFeaturePermitCompatible(); +int APS5_VABI sceShareFeatureProhibitCompatible(); +int APS5_VABI sceShareGetContentParam(); +int APS5_VABI sceShareGetStoredAppStatus(); +int APS5_VABI sceShareInitializeForShellCore(); +int APS5_VABI sceShareInitializeInternal(); +int APS5_VABI sceShareRegisterEventCallback(); +int APS5_VABI sceShareSetCurrentStatus(); +int APS5_VABI sceShareSetUploadEventInfo(); +int APS5_VABI sceShareTerminateForShellCore(); +int APS5_VABI sceShareTerminateInternal(); +int APS5_VABI sceShareUnregisterEventCallback(); +int APS5_VABI libSceShareInternal_nativeUnknown__plus_LB32s0kCYg_nid_no_patch(); +int APS5_VABI libSceShareInternal_nativeUnknown_0IbPXX_minus_WvQQ_nid_no_patch(); +int APS5_VABI libSceShareInternal_nativeUnknown_8E7VGc9qRvY_nid_no_patch(); +int APS5_VABI libSceShareInternal_nativeUnknown_9fIEK6i1idg_nid_no_patch(); +int APS5_VABI libSceShareInternal_nativeUnknown_9oywh7VdSjM_nid_no_patch(); +int APS5_VABI libSceShareInternal_nativeUnknown_IvkDssl52mA_nid_no_patch(); +int APS5_VABI libSceShareInternal_nativeUnknown_zyzD8P5ZKPA_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceShareInternal.native/libSceShareInternal.native.hpp b/core/libs/prx/libSceShareInternal.native/libSceShareInternal.native.hpp index 6f70f09bee..b969840f3b 100644 --- a/core/libs/prx/libSceShareInternal.native/libSceShareInternal.native.hpp +++ b/core/libs/prx/libSceShareInternal.native/libSceShareInternal.native.hpp @@ -1 +1,2 @@ #pragma once +#include "prx/libSceShareInternal.native/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceSharePlay/Export.cpp b/core/libs/prx/libSceSharePlay/Export.cpp index efd1120fdd..b9c1c1936e 100644 --- a/core/libs/prx/libSceSharePlay/Export.cpp +++ b/core/libs/prx/libSceSharePlay/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceSharePlay/include/InventoryExports.hpp" #include "prx/libSceSharePlay/include/Api.hpp" #include #include @@ -136,3 +138,27 @@ int APS5_VABI sceSharePlaySetShareScreenStatus() { } } + +extern "C" { + +int APS5_VABI libSceSharePlayUnknown_6egMR0eB8RU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6egMR0eB8RU", libSceSharePlayUnknown_6egMR0eB8RU_nid_no_patch); + +int APS5_VABI libSceSharePlayUnknown_891hmdoV7UQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("891hmdoV7UQ", libSceSharePlayUnknown_891hmdoV7UQ_nid_no_patch); + +int APS5_VABI libSceSharePlayUnknown_LpPA6mprZ8Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LpPA6mprZ8Q", libSceSharePlayUnknown_LpPA6mprZ8Q_nid_no_patch); + +int APS5_VABI libSceSharePlayUnknown_wcI2co2I4Xc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wcI2co2I4Xc", libSceSharePlayUnknown_wcI2co2I4Xc_nid_no_patch); + +} diff --git a/core/libs/prx/libSceSharePlay/include/InventoryExports.hpp b/core/libs/prx/libSceSharePlay/include/InventoryExports.hpp new file mode 100644 index 0000000000..696f0d7b23 --- /dev/null +++ b/core/libs/prx/libSceSharePlay/include/InventoryExports.hpp @@ -0,0 +1,12 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceSharePlayUnknown_6egMR0eB8RU_nid_no_patch(); +int APS5_VABI libSceSharePlayUnknown_891hmdoV7UQ_nid_no_patch(); +int APS5_VABI libSceSharePlayUnknown_LpPA6mprZ8Q_nid_no_patch(); +int APS5_VABI libSceSharePlayUnknown_wcI2co2I4Xc_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceSharePlay/libSceSharePlay.hpp b/core/libs/prx/libSceSharePlay/libSceSharePlay.hpp index c68e519720..22f3a4b12c 100644 --- a/core/libs/prx/libSceSharePlay/libSceSharePlay.hpp +++ b/core/libs/prx/libSceSharePlay/libSceSharePlay.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceSharePlay/include/Api.hpp" +#include "prx/libSceSharePlay/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceSrcUtl/Export.cpp b/core/libs/prx/libSceSrcUtl/Export.cpp index a5aa6731a3..458ab04dab 100644 --- a/core/libs/prx/libSceSrcUtl/Export.cpp +++ b/core/libs/prx/libSceSrcUtl/Export.cpp @@ -1,9 +1,43 @@ #include "prx/libSceSrcUtl/include/Api.hpp" +#include #include #include +#include +#include #include "SceTypes.hpp" #include "prx/libc/include/General.hpp" +namespace { + +constexpr int SRC_UTILITY_ERROR_INVALID_HANDLE = static_cast(0x815D0000); +constexpr int SRC_UTILITY_ERROR_INVALID_POINTER = static_cast(0x815D0001); +constexpr int SRC_UTILITY_ERROR_INVALID_CHANNELS = static_cast(0x815D0002); +constexpr int SRC_UTILITY_ERROR_INVALID_MODE = static_cast(0x815D0003); +constexpr int SRC_UTILITY_ERROR_INVALID_INPUT_RATE = static_cast(0x815D0004); +constexpr int SRC_UTILITY_ERROR_INVALID_OUTPUT_RATE = static_cast(0x815D0005); + +constexpr int SRC_UTILITY_HANDLE_SIZE = 0x9678; +constexpr std::size_t SRC_UTILITY_PRIORITY_OFFSET = 0x2C; +constexpr std::size_t SRC_UTILITY_MAGIC_OFFSET = 0x9470; +constexpr std::uint64_t SRC_UTILITY_MAGIC = 0xDEADBEEFBAADF00Dull; +constexpr std::uint32_t SRC_UTILITY_MAX_CHANNELS = 8; +constexpr std::uint32_t SRC_UTILITY_MAX_MODE = 2; +constexpr std::uint32_t SRC_UTILITY_INPUT_RATES[] = {22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000, 128000, 176400, 192000}; +constexpr std::uint32_t SRC_UTILITY_OUTPUT_RATES[] = {44100, 48000, 96000, 192000}; + +template +bool IsRate(const std::uint32_t (&rates)[N], std::uint32_t rate) { + return std::find(std::begin(rates), std::end(rates), rate) != std::end(rates); +} + +bool HandleIsInitialized(const void* handle) { + std::uint64_t magic = 0; + std::memcpy(&magic, static_cast(handle) + SRC_UTILITY_MAGIC_OFFSET, sizeof(magic)); + return magic == SRC_UTILITY_MAGIC; +} + +} + extern "C" { int APS5_VABI sceSrcUtilityCreateEx() { @@ -33,13 +67,18 @@ int APS5_VABI sceSrcUtilityGetDelaySamples() { return 0; } -int APS5_VABI sceSrcUtilityGetHandleSize() { - NotImplemented_nid_no_patch(__func__); - return 0; +int APS5_VABI sceSrcUtilityGetHandleSize(std::uint32_t channels, std::uint32_t mode, std::uint32_t input_rate, std::uint32_t output_rate) { + if (channels == 0 || channels > SRC_UTILITY_MAX_CHANNELS) return SRC_UTILITY_ERROR_INVALID_CHANNELS; + if (mode > SRC_UTILITY_MAX_MODE) return SRC_UTILITY_ERROR_INVALID_MODE; + if (!IsRate(SRC_UTILITY_INPUT_RATES, input_rate)) return SRC_UTILITY_ERROR_INVALID_INPUT_RATE; + if (!IsRate(SRC_UTILITY_OUTPUT_RATES, output_rate)) return SRC_UTILITY_ERROR_INVALID_OUTPUT_RATE; + return SRC_UTILITY_HANDLE_SIZE; } -int APS5_VABI sceSrcUtilityGetPriority() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI sceSrcUtilityGetPriority(const void* handle, std::uint32_t* priority) { + if (handle == nullptr || !HandleIsInitialized(handle)) return SRC_UTILITY_ERROR_INVALID_HANDLE; + if (priority == nullptr) return SRC_UTILITY_ERROR_INVALID_POINTER; + std::memcpy(priority, static_cast(handle) + SRC_UTILITY_PRIORITY_OFFSET, sizeof(*priority)); return 0; } @@ -58,8 +97,9 @@ int APS5_VABI sceSrcUtilityResample() { return 0; } -int APS5_VABI sceSrcUtilitySetPriority() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI sceSrcUtilitySetPriority(void* handle, std::uint32_t priority) { + if (handle == nullptr || !HandleIsInitialized(handle)) return SRC_UTILITY_ERROR_INVALID_HANDLE; + std::memcpy(static_cast(handle) + SRC_UTILITY_PRIORITY_OFFSET, &priority, sizeof(priority)); return 0; } int APS5_VABI sceSrcUtilityTerminateEx() { diff --git a/core/libs/prx/libSceSrcUtl/include/Api.hpp b/core/libs/prx/libSceSrcUtl/include/Api.hpp index ace228a162..54c7c8e523 100644 --- a/core/libs/prx/libSceSrcUtl/include/Api.hpp +++ b/core/libs/prx/libSceSrcUtl/include/Api.hpp @@ -10,12 +10,12 @@ int APS5_VABI sceSrcUtilityFinalize(); int APS5_VABI sceSrcUtilityFlush(); int APS5_VABI sceSrcUtilityGetAjmContext(); int APS5_VABI sceSrcUtilityGetDelaySamples(); -int APS5_VABI sceSrcUtilityGetHandleSize(); -int APS5_VABI sceSrcUtilityGetPriority(); +int APS5_VABI sceSrcUtilityGetHandleSize(std::uint32_t channels, std::uint32_t mode, std::uint32_t input_rate, std::uint32_t output_rate); +int APS5_VABI sceSrcUtilityGetPriority(const void* handle, std::uint32_t* priority); int APS5_VABI sceSrcUtilityInitialize(); int APS5_VABI sceSrcUtilityInitializeEx(); int APS5_VABI sceSrcUtilityResample(); -int APS5_VABI sceSrcUtilitySetPriority(); +int APS5_VABI sceSrcUtilitySetPriority(void* handle, std::uint32_t priority); int APS5_VABI sceSrcUtilityTerminateEx(); } diff --git a/core/libs/prx/libSceSysCore/Export.cpp b/core/libs/prx/libSceSysCore/Export.cpp index 1bc0ff3ea2..cf7e65149c 100644 --- a/core/libs/prx/libSceSysCore/Export.cpp +++ b/core/libs/prx/libSceSysCore/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceSysCore/include/InventoryExports.hpp" #include "prx/libSceSysCore/include/Api.hpp" #include #include @@ -326,3 +328,32 @@ int APS5_VABI sceApplicationSwitchToPprNativeMode2() { NotImplemented_nid_no_patch(__func__); } } + +extern "C" { + +int APS5_VABI libSceSysCoreUnknown_F2qydFnZWfY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("F2qydFnZWfY", libSceSysCoreUnknown_F2qydFnZWfY_nid_no_patch); + +int APS5_VABI libSceSysCoreUnknown_Q5nkKEHtW18_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Q5nkKEHtW18", libSceSysCoreUnknown_Q5nkKEHtW18_nid_no_patch); + +int APS5_VABI libSceSysCoreUnknown_V7awqOXNG30_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("V7awqOXNG30", libSceSysCoreUnknown_V7awqOXNG30_nid_no_patch); + +int APS5_VABI libSceSysCoreUnknown_lGA8mxzKIhk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lGA8mxzKIhk", libSceSysCoreUnknown_lGA8mxzKIhk_nid_no_patch); + +int APS5_VABI libSceSysCoreUnknown_piCjhbSYauo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("piCjhbSYauo", libSceSysCoreUnknown_piCjhbSYauo_nid_no_patch); + +} diff --git a/core/libs/prx/libSceSysCore/include/InventoryExports.hpp b/core/libs/prx/libSceSysCore/include/InventoryExports.hpp new file mode 100644 index 0000000000..e1d0fbe783 --- /dev/null +++ b/core/libs/prx/libSceSysCore/include/InventoryExports.hpp @@ -0,0 +1,13 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceSysCoreUnknown_F2qydFnZWfY_nid_no_patch(); +int APS5_VABI libSceSysCoreUnknown_Q5nkKEHtW18_nid_no_patch(); +int APS5_VABI libSceSysCoreUnknown_V7awqOXNG30_nid_no_patch(); +int APS5_VABI libSceSysCoreUnknown_lGA8mxzKIhk_nid_no_patch(); +int APS5_VABI libSceSysCoreUnknown_piCjhbSYauo_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceSysCore/libSceSysCore.hpp b/core/libs/prx/libSceSysCore/libSceSysCore.hpp index c0d6d0db48..4b30ea9181 100644 --- a/core/libs/prx/libSceSysCore/libSceSysCore.hpp +++ b/core/libs/prx/libSceSysCore/libSceSysCore.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceSysCore/include/Api.hpp" +#include "prx/libSceSysCore/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceSysmodule/CMakeLists.txt b/core/libs/prx/libSceSysmodule/CMakeLists.txt index b03a2433c9..f8c08ca098 100644 --- a/core/libs/prx/libSceSysmodule/CMakeLists.txt +++ b/core/libs/prx/libSceSysmodule/CMakeLists.txt @@ -1,4 +1,4 @@ -add_library(libSceSysmodule SHARED EXCLUDE_FROM_ALL Export.cpp) +add_library(libSceSysmodule SHARED EXCLUDE_FROM_ALL Export.cpp InventoryExports.cpp) target_include_directories(libSceSysmodule PRIVATE ${LIBS_INCLUDE_DIR}) configure_windows_unwind(libSceSysmodule) diff --git a/core/libs/prx/libSceSysmodule/InventoryExports.cpp b/core/libs/prx/libSceSysmodule/InventoryExports.cpp new file mode 100644 index 0000000000..3eae1db757 --- /dev/null +++ b/core/libs/prx/libSceSysmodule/InventoryExports.cpp @@ -0,0 +1,32 @@ +#include "SceTypes.hpp" +#include "prx/libc/include/General.hpp" +#include "prx/libc/include/general/ExportMacros.hpp" + +extern "C" { + +int APS5_VABI libSceSysmoduleUnknown_5gs662NWKhE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5gs662NWKhE", libSceSysmoduleUnknown_5gs662NWKhE_nid_no_patch); + +int APS5_VABI libSceSysmoduleUnknown_6XFxHG0KhBg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6XFxHG0KhBg", libSceSysmoduleUnknown_6XFxHG0KhBg_nid_no_patch); + +int APS5_VABI libSceSysmoduleUnknown_9Q9uHJVfB4w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9Q9uHJVfB4w", libSceSysmoduleUnknown_9Q9uHJVfB4w_nid_no_patch); + +int APS5_VABI libSceSysmoduleUnknown_kMn8gDsKp9Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kMn8gDsKp9Y", libSceSysmoduleUnknown_kMn8gDsKp9Y_nid_no_patch); + +int APS5_VABI libSceSysmoduleUnknown_uQqnJudN5fY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uQqnJudN5fY", libSceSysmoduleUnknown_uQqnJudN5fY_nid_no_patch); + +} diff --git a/core/libs/prx/libSceSystemGesture/Export.cpp b/core/libs/prx/libSceSystemGesture/Export.cpp index 056318a3a4..ac06a3cb01 100644 --- a/core/libs/prx/libSceSystemGesture/Export.cpp +++ b/core/libs/prx/libSceSystemGesture/Export.cpp @@ -1,3 +1,4 @@ +#include "prx/libSceSystemGesture/include/InventoryExports.hpp" #include "prx/libSceSystemGesture/include/Api.hpp" #include #include @@ -371,3 +372,11 @@ int APS5_VABI sceSystemGestureDebugGetVersion() { } } + +extern "C" { + +int APS5_VABI sceSystemGestureSetTouchAreaInformation() { + NotImplemented_nid_no_patch(__func__); +} + +} diff --git a/core/libs/prx/libSceSystemGesture/include/InventoryExports.hpp b/core/libs/prx/libSceSystemGesture/include/InventoryExports.hpp new file mode 100644 index 0000000000..9ec54a0a01 --- /dev/null +++ b/core/libs/prx/libSceSystemGesture/include/InventoryExports.hpp @@ -0,0 +1,9 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI sceSystemGestureSetTouchAreaInformation(); + +} diff --git a/core/libs/prx/libSceSystemGesture/libSceSystemGesture.hpp b/core/libs/prx/libSceSystemGesture/libSceSystemGesture.hpp index 1e6ac94f6a..cc676856f9 100644 --- a/core/libs/prx/libSceSystemGesture/libSceSystemGesture.hpp +++ b/core/libs/prx/libSceSystemGesture/libSceSystemGesture.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceSystemGesture/include/Api.hpp" +#include "prx/libSceSystemGesture/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceSystemLogger2/Export.cpp b/core/libs/prx/libSceSystemLogger2/Export.cpp index 68b941b7db..ccf931d52c 100644 --- a/core/libs/prx/libSceSystemLogger2/Export.cpp +++ b/core/libs/prx/libSceSystemLogger2/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceSystemLogger2/include/InventoryExports.hpp" #include "prx/libSceSystemLogger2/include/Api.hpp" #include #include @@ -56,3 +58,22 @@ int APS5_VABI sceSystemLogger2SetEventAsyncInternal() { } } + +extern "C" { + +int APS5_VABI libSceSystemLogger2Unknown_PcjxaaFQATU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PcjxaaFQATU", libSceSystemLogger2Unknown_PcjxaaFQATU_nid_no_patch); + +int APS5_VABI libSceSystemLogger2Unknown_UI7zoVuRjdU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UI7zoVuRjdU", libSceSystemLogger2Unknown_UI7zoVuRjdU_nid_no_patch); + +int APS5_VABI libSceSystemLogger2Unknown_eI4wpp_plus_8Bco_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eI4wpp+8Bco", libSceSystemLogger2Unknown_eI4wpp_plus_8Bco_nid_no_patch); + +} diff --git a/core/libs/prx/libSceSystemLogger2/include/InventoryExports.hpp b/core/libs/prx/libSceSystemLogger2/include/InventoryExports.hpp new file mode 100644 index 0000000000..8d1308f1ba --- /dev/null +++ b/core/libs/prx/libSceSystemLogger2/include/InventoryExports.hpp @@ -0,0 +1,11 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceSystemLogger2Unknown_PcjxaaFQATU_nid_no_patch(); +int APS5_VABI libSceSystemLogger2Unknown_UI7zoVuRjdU_nid_no_patch(); +int APS5_VABI libSceSystemLogger2Unknown_eI4wpp_plus_8Bco_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceSystemLogger2/libSceSystemLogger2.hpp b/core/libs/prx/libSceSystemLogger2/libSceSystemLogger2.hpp index 931a124f24..0b54e3de40 100644 --- a/core/libs/prx/libSceSystemLogger2/libSceSystemLogger2.hpp +++ b/core/libs/prx/libSceSystemLogger2/libSceSystemLogger2.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceSystemLogger2/include/Api.hpp" +#include "prx/libSceSystemLogger2/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceSystemLogger2NativeQueueClient/Export.cpp b/core/libs/prx/libSceSystemLogger2NativeQueueClient/Export.cpp index 799d5ba8c8..afbcd3a2ff 100644 --- a/core/libs/prx/libSceSystemLogger2NativeQueueClient/Export.cpp +++ b/core/libs/prx/libSceSystemLogger2NativeQueueClient/Export.cpp @@ -1,3 +1,4 @@ +#include "prx/libc/include/general/ExportMacros.hpp" #include "prx/libSceSystemLogger2NativeQueueClient/include/Api.hpp" #include #include @@ -55,4 +56,9 @@ int APS5_VABI sceSystemLogger2NativeQueueClientTerminate() { NotImplemented_nid_no_patch(__func__); } +int APS5_VABI libSceSystemLogger2NativeQueueClientUnknown_AuwwRl6zAcU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AuwwRl6zAcU", libSceSystemLogger2NativeQueueClientUnknown_AuwwRl6zAcU_nid_no_patch); + } diff --git a/core/libs/prx/libSceSystemLogger2NativeQueueClient/include/Api.hpp b/core/libs/prx/libSceSystemLogger2NativeQueueClient/include/Api.hpp index bfb3f2722e..d6ea2e740b 100644 --- a/core/libs/prx/libSceSystemLogger2NativeQueueClient/include/Api.hpp +++ b/core/libs/prx/libSceSystemLogger2NativeQueueClient/include/Api.hpp @@ -17,4 +17,6 @@ int APS5_VABI sceSystemLogger2NativeQueueClientGetEvent2(); int APS5_VABI sceSystemLogger2NativeQueueClientInitialize(); int APS5_VABI sceSystemLogger2NativeQueueClientTerminate(); +int APS5_VABI libSceSystemLogger2NativeQueueClientUnknown_AuwwRl6zAcU_nid_no_patch(); + } diff --git a/core/libs/prx/libSceSystemService/CMakeLists.txt b/core/libs/prx/libSceSystemService/CMakeLists.txt index 2831f4653a..1311faaac2 100644 --- a/core/libs/prx/libSceSystemService/CMakeLists.txt +++ b/core/libs/prx/libSceSystemService/CMakeLists.txt @@ -131,6 +131,24 @@ if(BUILD_TESTING) "PATH=path_list_prepend:$;PATH=path_list_prepend:$") endif() endforeach() + add_test_executable(guest_system_service_activation_tests ${LIBS_INCLUDE_DIR}/tests/GuestSystemServiceActivation.cpp) + target_include_directories(guest_system_service_activation_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_system_service_activation_tests PRIVATE libSceSystemService libc) + configure_windows_unwind(guest_system_service_activation_tests) + add_test(NAME guest_system_service_activation COMMAND guest_system_service_activation_tests) + if(WIN32) + set_tests_properties(guest_system_service_activation PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test_executable(guest_system_service_ps_button_event_tests ${LIBS_INCLUDE_DIR}/tests/GuestSystemServicePSButtonEvent.cpp) + target_include_directories(guest_system_service_ps_button_event_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_system_service_ps_button_event_tests PRIVATE libSceSystemService libc) + configure_windows_unwind(guest_system_service_ps_button_event_tests) + add_test(NAME guest_system_service_ps_button_event COMMAND guest_system_service_ps_button_event_tests) + if(WIN32) + set_tests_properties(guest_system_service_ps_button_event PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() add_test_executable(guest_system_kill_app_tests ${LIBS_INCLUDE_DIR}/tests/GuestSystemKillApp.cpp) target_include_directories(guest_system_kill_app_tests PRIVATE ${LIBS_INCLUDE_DIR}) target_link_libraries(guest_system_kill_app_tests PRIVATE libSceSystemService libc) diff --git a/core/libs/prx/libSceSystemService/PendingExports.cpp b/core/libs/prx/libSceSystemService/PendingExports.cpp index 21179c6118..1e820338fa 100644 --- a/core/libs/prx/libSceSystemService/PendingExports.cpp +++ b/core/libs/prx/libSceSystemService/PendingExports.cpp @@ -2,10 +2,25 @@ #include "prx/libSceSystemService/SystemService.hpp" #include "prx/libc/include/General.hpp" +#include +#include + namespace { constexpr int SystemServiceUnavailable = static_cast(0x80A10002); +constexpr int SystemServiceInvalidArgument = static_cast(0x80A10003); constexpr int SystemServiceRejected = static_cast(0x80A10005); +constexpr int ShellCoreInvalidArgument = static_cast(0x80E30005); + +constexpr std::int32_t ActivationTypeMpeg2 = 0; +constexpr std::int32_t ActivationTypeHevc = 3; +constexpr std::int32_t ActivationTypeHevcSoft = 4; +constexpr std::int32_t ActivationStatus = 2; +constexpr std::intptr_t ActivationHandleStep = 4; +constexpr std::int32_t FirstPSButtonEventType = 0x20000001; +constexpr std::int32_t LastPSButtonEventType = 0x20000002; + +std::atomic nextActivationHandle{0x1000}; } @@ -16,6 +31,10 @@ static_assert(offsetof(ShellCoreErrorDialogParam, flag) == 16); struct SystemServiceEvent; +static_assert(sizeof(SystemServicePSButtonEvent) == 16); +static_assert(offsetof(SystemServicePSButtonEvent, dataAt8) == 4); +static_assert(offsetof(SystemServicePSButtonEvent, dataAt0) == 8); + static_assert(sizeof(SystemServiceStoreParam) == 4); static_assert(sizeof(ShellCoreLaunchByUriParam) == 8); @@ -542,17 +561,21 @@ int APS5_VABI sceShellCoreUtilActivateAbort(std::intptr_t handle) { } int APS5_VABI sceShellCoreUtilActivateGetStatus(std::intptr_t handle, std::int32_t* status, std::int32_t* result) { - NotImplemented_nid_no_patch(__func__); + if (status == nullptr || result == nullptr) return ShellCoreInvalidArgument; + *status = ActivationStatus; + *result = 0; return 0; } int APS5_VABI sceShellCoreUtilActivateInit(std::int32_t type, std::intptr_t* handle) { - NotImplemented_nid_no_patch(__func__); + if (handle == nullptr) return ShellCoreInvalidArgument; + *handle = nextActivationHandle.fetch_add(ActivationHandleStep); return 0; } -int APS5_VABI sceShellCoreUtilActivateIsActivated(std::intptr_t handle, bool* activated) { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI sceShellCoreUtilActivateIsActivated(std::int32_t type, bool* activated) { + if (activated == nullptr) return ShellCoreInvalidArgument; + *activated = true; return 0; } @@ -1567,103 +1590,101 @@ int APS5_VABI sceSystemServiceAcquireFb0() { } int APS5_VABI sceSystemServiceActivateHevc() { - NotImplemented_nid_no_patch(__func__); - return 0; + return sceShellCoreUtilActivateRecordActivation(); } int APS5_VABI sceSystemServiceActivateHevcAbort(std::uintptr_t handle) { - NotImplemented_nid_no_patch(__func__); - return 0; + if (handle == 0) return SystemServiceInvalidArgument; + return sceShellCoreUtilActivateAbort(static_cast(handle)); } int APS5_VABI sceSystemServiceActivateHevcGetStatus(std::uintptr_t handle, std::uint32_t* status, std::int32_t* result) { - NotImplemented_nid_no_patch(__func__); - return 0; + if (handle == 0 || status == nullptr || result == nullptr) return SystemServiceInvalidArgument; + return sceShellCoreUtilActivateGetStatus(static_cast(handle), reinterpret_cast(status), result); } int APS5_VABI sceSystemServiceActivateHevcInit(std::uintptr_t* handle) { - NotImplemented_nid_no_patch(__func__); - return 0; + if (handle == nullptr) return SystemServiceInvalidArgument; + return sceShellCoreUtilActivateInit(ActivationTypeHevc, reinterpret_cast(handle)); } int APS5_VABI sceSystemServiceActivateHevcIsActivated(std::uint8_t* activated) { - NotImplemented_nid_no_patch(__func__); - return 0; + if (activated == nullptr) return SystemServiceInvalidArgument; + return sceShellCoreUtilActivateIsActivated(ActivationTypeHevc, reinterpret_cast(activated)); } int APS5_VABI sceSystemServiceActivateHevcSoft() { - NotImplemented_nid_no_patch(__func__); - return 0; + return sceShellCoreUtilActivateRecordActivation(); } int APS5_VABI sceSystemServiceActivateHevcSoftAbort(std::uintptr_t handle) { - NotImplemented_nid_no_patch(__func__); - return 0; + if (handle == 0) return SystemServiceInvalidArgument; + return sceShellCoreUtilActivateAbort(static_cast(handle)); } int APS5_VABI sceSystemServiceActivateHevcSoftGetStatus(std::uintptr_t handle, std::uint32_t* status, std::int32_t* result) { - NotImplemented_nid_no_patch(__func__); - return 0; + if (handle == 0 || status == nullptr || result == nullptr) return SystemServiceInvalidArgument; + return sceShellCoreUtilActivateGetStatus(static_cast(handle), reinterpret_cast(status), result); } int APS5_VABI sceSystemServiceActivateHevcSoftInit(std::uintptr_t* handle) { - NotImplemented_nid_no_patch(__func__); - return 0; + if (handle == nullptr) return SystemServiceInvalidArgument; + return sceShellCoreUtilActivateInit(ActivationTypeHevcSoft, reinterpret_cast(handle)); } int APS5_VABI sceSystemServiceActivateHevcSoftIsActivated(std::uint8_t* activated) { - NotImplemented_nid_no_patch(__func__); - return 0; + if (activated == nullptr) return SystemServiceInvalidArgument; + return sceShellCoreUtilActivateIsActivated(ActivationTypeHevcSoft, reinterpret_cast(activated)); } int APS5_VABI sceSystemServiceActivateHevcSoftStart(std::uintptr_t handle) { - NotImplemented_nid_no_patch(__func__); - return 0; + if (handle == 0) return SystemServiceInvalidArgument; + return sceShellCoreUtilActivateStartAsync(static_cast(handle)); } int APS5_VABI sceSystemServiceActivateHevcSoftTerm(std::uintptr_t handle) { - NotImplemented_nid_no_patch(__func__); - return 0; + if (handle == 0) return SystemServiceInvalidArgument; + return sceShellCoreUtilActivateTerm(static_cast(handle)); } int APS5_VABI sceSystemServiceActivateHevcStart(std::uintptr_t handle) { - NotImplemented_nid_no_patch(__func__); - return 0; + if (handle == 0) return SystemServiceInvalidArgument; + return sceShellCoreUtilActivateStartAsync(static_cast(handle)); } int APS5_VABI sceSystemServiceActivateHevcTerm(std::uintptr_t handle) { - NotImplemented_nid_no_patch(__func__); - return 0; + if (handle == 0) return SystemServiceInvalidArgument; + return sceShellCoreUtilActivateTerm(static_cast(handle)); } int APS5_VABI sceSystemServiceActivateMpeg2Abort(std::uintptr_t handle) { - NotImplemented_nid_no_patch(__func__); - return 0; + if (handle == 0) return SystemServiceInvalidArgument; + return sceShellCoreUtilActivateAbort(static_cast(handle)); } int APS5_VABI sceSystemServiceActivateMpeg2GetStatus(std::uintptr_t handle, std::uint32_t* status, std::int32_t* result) { - NotImplemented_nid_no_patch(__func__); - return 0; + if (handle == 0 || status == nullptr || result == nullptr) return SystemServiceInvalidArgument; + return sceShellCoreUtilActivateGetStatus(static_cast(handle), reinterpret_cast(status), result); } int APS5_VABI sceSystemServiceActivateMpeg2Init(std::uintptr_t* handle) { - NotImplemented_nid_no_patch(__func__); - return 0; + if (handle == nullptr) return SystemServiceInvalidArgument; + return sceShellCoreUtilActivateInit(ActivationTypeMpeg2, reinterpret_cast(handle)); } int APS5_VABI sceSystemServiceActivateMpeg2IsActivated(std::uint8_t* activated) { - NotImplemented_nid_no_patch(__func__); - return 0; + if (activated == nullptr) return SystemServiceInvalidArgument; + return sceShellCoreUtilActivateIsActivated(ActivationTypeMpeg2, reinterpret_cast(activated)); } int APS5_VABI sceSystemServiceActivateMpeg2Start(std::uintptr_t handle) { - NotImplemented_nid_no_patch(__func__); - return 0; + if (handle == 0) return SystemServiceInvalidArgument; + return sceShellCoreUtilActivateStartAsync(static_cast(handle)); } int APS5_VABI sceSystemServiceActivateMpeg2Term(std::uintptr_t handle) { - NotImplemented_nid_no_patch(__func__); - return 0; + if (handle == 0) return SystemServiceInvalidArgument; + return sceShellCoreUtilActivateTerm(static_cast(handle)); } int APS5_VABI sceSystemServiceAddLocalProcess(std::int32_t appId, const char* path, const char* const* argv, const SystemServiceLocalProcessParam* param) { @@ -1834,7 +1855,14 @@ int APS5_VABI sceSystemServiceGetMainAppTitleId() { } int APS5_VABI sceSystemServiceGetPSButtonEvent(const SystemServiceEvent* event, SystemServicePSButtonEvent* buttonEvent) { - NotImplemented_nid_no_patch(__func__); + if (event == nullptr || buttonEvent == nullptr) return SystemServiceInvalidArgument; + const auto* bytes = reinterpret_cast(event); + SystemServicePSButtonEvent result{}; + std::memcpy(&result.eventType, bytes, sizeof(result.eventType)); + if (result.eventType < FirstPSButtonEventType || result.eventType > LastPSButtonEventType) return SystemServiceInvalidArgument; + std::memcpy(&result.dataAt0, bytes + 4, sizeof(result.dataAt0)); + std::memcpy(&result.dataAt8, bytes + 12, sizeof(result.dataAt8)); + *buttonEvent = result; return 0; } diff --git a/core/libs/prx/libSceSystemService/include/SystemService.hpp b/core/libs/prx/libSceSystemService/include/SystemService.hpp index 6c0120e66b..47b2c0e0db 100644 --- a/core/libs/prx/libSceSystemService/include/SystemService.hpp +++ b/core/libs/prx/libSceSystemService/include/SystemService.hpp @@ -20,7 +20,11 @@ struct ShellCoreErrorDialogParam { struct SystemServiceDaemonEvent; struct SystemServiceLocalProcessStatus; -struct SystemServicePSButtonEvent; +struct SystemServicePSButtonEvent { + std::int32_t eventType; + std::uint32_t dataAt8; + std::uint64_t dataAt0; +}; struct SystemServicePrivacyDefinitionData; struct SystemServicePrivacyDefinitionVersion; struct SystemServiceTitleWorkaroundInfo; @@ -353,7 +357,7 @@ int APS5_VABI sceShellCoreUtilAcquireSharePlayCpuBudget(); int APS5_VABI sceShellCoreUtilActivateAbort(std::intptr_t handle); int APS5_VABI sceShellCoreUtilActivateGetStatus(std::intptr_t handle, std::int32_t* status, std::int32_t* result); int APS5_VABI sceShellCoreUtilActivateInit(std::int32_t type, std::intptr_t* handle); -int APS5_VABI sceShellCoreUtilActivateIsActivated(std::intptr_t handle, bool* activated); +int APS5_VABI sceShellCoreUtilActivateIsActivated(std::int32_t type, bool* activated); int APS5_VABI sceShellCoreUtilActivateRecordActivation(); int APS5_VABI sceShellCoreUtilActivateStart(std::intptr_t handle); int APS5_VABI sceShellCoreUtilActivateStartAsync(std::intptr_t handle); diff --git a/core/libs/prx/libSceSystemTts/Export.cpp b/core/libs/prx/libSceSystemTts/Export.cpp index 94e3d245ac..bd8c49e250 100644 --- a/core/libs/prx/libSceSystemTts/Export.cpp +++ b/core/libs/prx/libSceSystemTts/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceSystemTts/include/InventoryExports.hpp" #include "prx/libSceSystemTts/include/Api.hpp" #include #include @@ -48,3 +50,12 @@ int APS5_VABI sceSystemTtsWait() { } } + +extern "C" { + +int APS5_VABI libSceSystemTtsUnknown_aIz2UUh6oi0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aIz2UUh6oi0", libSceSystemTtsUnknown_aIz2UUh6oi0_nid_no_patch); + +} diff --git a/core/libs/prx/libSceSystemTts/include/InventoryExports.hpp b/core/libs/prx/libSceSystemTts/include/InventoryExports.hpp new file mode 100644 index 0000000000..6e3fb0437c --- /dev/null +++ b/core/libs/prx/libSceSystemTts/include/InventoryExports.hpp @@ -0,0 +1,9 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceSystemTtsUnknown_aIz2UUh6oi0_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceSystemTts/libSceSystemTts.hpp b/core/libs/prx/libSceSystemTts/libSceSystemTts.hpp index f2c384d4c4..4bd0decb6c 100644 --- a/core/libs/prx/libSceSystemTts/libSceSystemTts.hpp +++ b/core/libs/prx/libSceSystemTts/libSceSystemTts.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceSystemTts/include/Api.hpp" +#include "prx/libSceSystemTts/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceTEEClient/Export.cpp b/core/libs/prx/libSceTEEClient/Export.cpp index 71faf0cb5f..f550aa63e3 100644 --- a/core/libs/prx/libSceTEEClient/Export.cpp +++ b/core/libs/prx/libSceTEEClient/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceTEEClient/include/InventoryExports.hpp" #include "prx/libSceTEEClient/include/Api.hpp" #include #include @@ -58,3 +60,32 @@ int APS5_VABI TEEC_RequestCancellation_nid_postfix(void) { } } + +extern "C" { + +int APS5_VABI libSceTEEClientUnknown_H9IE7wXy3qY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("H9IE7wXy3qY", libSceTEEClientUnknown_H9IE7wXy3qY_nid_no_patch); + +int APS5_VABI libSceTEEClientUnknown_VaBqpbmaWpc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VaBqpbmaWpc", libSceTEEClientUnknown_VaBqpbmaWpc_nid_no_patch); + +int APS5_VABI libSceTEEClientUnknown_Xn5kfzvPht4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Xn5kfzvPht4", libSceTEEClientUnknown_Xn5kfzvPht4_nid_no_patch); + +int APS5_VABI libSceTEEClientUnknown_ZAJdq_minus_IONZ4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZAJdq-IONZ4", libSceTEEClientUnknown_ZAJdq_minus_IONZ4_nid_no_patch); + +int APS5_VABI libSceTEEClientUnknown_d_minus_OLk3nvFIA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("d-OLk3nvFIA", libSceTEEClientUnknown_d_minus_OLk3nvFIA_nid_no_patch); + +} diff --git a/core/libs/prx/libSceTEEClient/include/InventoryExports.hpp b/core/libs/prx/libSceTEEClient/include/InventoryExports.hpp new file mode 100644 index 0000000000..fa490466d4 --- /dev/null +++ b/core/libs/prx/libSceTEEClient/include/InventoryExports.hpp @@ -0,0 +1,13 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceTEEClientUnknown_H9IE7wXy3qY_nid_no_patch(); +int APS5_VABI libSceTEEClientUnknown_VaBqpbmaWpc_nid_no_patch(); +int APS5_VABI libSceTEEClientUnknown_Xn5kfzvPht4_nid_no_patch(); +int APS5_VABI libSceTEEClientUnknown_ZAJdq_minus_IONZ4_nid_no_patch(); +int APS5_VABI libSceTEEClientUnknown_d_minus_OLk3nvFIA_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceTEEClient/libSceTEEClient.hpp b/core/libs/prx/libSceTEEClient/libSceTEEClient.hpp index 7b3b5682b7..254509fed0 100644 --- a/core/libs/prx/libSceTEEClient/libSceTEEClient.hpp +++ b/core/libs/prx/libSceTEEClient/libSceTEEClient.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceTEEClient/include/Api.hpp" +#include "prx/libSceTEEClient/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceTextToSpeech/Export.cpp b/core/libs/prx/libSceTextToSpeech/Export.cpp index cd4a31d3f6..29790a5f21 100644 --- a/core/libs/prx/libSceTextToSpeech/Export.cpp +++ b/core/libs/prx/libSceTextToSpeech/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceTextToSpeech/include/InventoryExports.hpp" #include "prx/libSceTextToSpeech/include/Api.hpp" #include #include @@ -57,3 +59,17 @@ int APS5_VABI sceTextToSpeechTermImpl() { } } + +extern "C" { + +int APS5_VABI libSceTextToSpeechUnknown_6ZLFpZLuqEk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6ZLFpZLuqEk", libSceTextToSpeechUnknown_6ZLFpZLuqEk_nid_no_patch); + +int APS5_VABI libSceTextToSpeechUnknown_L_minus_pHC7qtEug_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("L-pHC7qtEug", libSceTextToSpeechUnknown_L_minus_pHC7qtEug_nid_no_patch); + +} diff --git a/core/libs/prx/libSceTextToSpeech/include/InventoryExports.hpp b/core/libs/prx/libSceTextToSpeech/include/InventoryExports.hpp new file mode 100644 index 0000000000..faf8de09ec --- /dev/null +++ b/core/libs/prx/libSceTextToSpeech/include/InventoryExports.hpp @@ -0,0 +1,10 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceTextToSpeechUnknown_6ZLFpZLuqEk_nid_no_patch(); +int APS5_VABI libSceTextToSpeechUnknown_L_minus_pHC7qtEug_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceTextToSpeech/libSceTextToSpeech.hpp b/core/libs/prx/libSceTextToSpeech/libSceTextToSpeech.hpp index 0238da246a..bda7c225c1 100644 --- a/core/libs/prx/libSceTextToSpeech/libSceTextToSpeech.hpp +++ b/core/libs/prx/libSceTextToSpeech/libSceTextToSpeech.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceTextToSpeech/include/Api.hpp" +#include "prx/libSceTextToSpeech/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceTtsCoreG3Bc/Export.cpp b/core/libs/prx/libSceTtsCoreG3Bc/Export.cpp index d81f4a5e32..545cd35679 100644 --- a/core/libs/prx/libSceTtsCoreG3Bc/Export.cpp +++ b/core/libs/prx/libSceTtsCoreG3Bc/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceTtsCoreG3Bc/include/InventoryExports.hpp" #include #include #include "SceTypes.hpp" @@ -8,3 +10,97 @@ extern "C" { APS5_DUMMY_FUN } + +extern "C" { + +int APS5_VABI libSceTtsCoreG3BcUnknown__plus_b5_minus_z8Ff4cw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+b5-z8Ff4cw", libSceTtsCoreG3BcUnknown__plus_b5_minus_z8Ff4cw_nid_no_patch); + +int APS5_VABI libSceTtsCoreG3BcUnknown_1scTM6aHK5I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1scTM6aHK5I", libSceTtsCoreG3BcUnknown_1scTM6aHK5I_nid_no_patch); + +int APS5_VABI libSceTtsCoreG3BcUnknown_9tnCCarXqdY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9tnCCarXqdY", libSceTtsCoreG3BcUnknown_9tnCCarXqdY_nid_no_patch); + +int APS5_VABI libSceTtsCoreG3BcUnknown_EmF4qOwLp5w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EmF4qOwLp5w", libSceTtsCoreG3BcUnknown_EmF4qOwLp5w_nid_no_patch); + +int APS5_VABI libSceTtsCoreG3BcUnknown_H0VOaNk61es_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("H0VOaNk61es", libSceTtsCoreG3BcUnknown_H0VOaNk61es_nid_no_patch); + +int APS5_VABI libSceTtsCoreG3BcUnknown_LQ65KkmJ48g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LQ65KkmJ48g", libSceTtsCoreG3BcUnknown_LQ65KkmJ48g_nid_no_patch); + +int APS5_VABI libSceTtsCoreG3BcUnknown_PRmv_minus_UzXa1w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PRmv-UzXa1w", libSceTtsCoreG3BcUnknown_PRmv_minus_UzXa1w_nid_no_patch); + +int APS5_VABI libSceTtsCoreG3BcUnknown_RByzVVv6e0A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RByzVVv6e0A", libSceTtsCoreG3BcUnknown_RByzVVv6e0A_nid_no_patch); + +int APS5_VABI libSceTtsCoreG3BcUnknown_Sq5GSDo_minus_Rhk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Sq5GSDo-Rhk", libSceTtsCoreG3BcUnknown_Sq5GSDo_minus_Rhk_nid_no_patch); + +int APS5_VABI libSceTtsCoreG3BcUnknown_V_plus_nR_plus_xHS2ag_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("V+nR+xHS2ag", libSceTtsCoreG3BcUnknown_V_plus_nR_plus_xHS2ag_nid_no_patch); + +int APS5_VABI libSceTtsCoreG3BcUnknown_bapD6H6e7Yk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bapD6H6e7Yk", libSceTtsCoreG3BcUnknown_bapD6H6e7Yk_nid_no_patch); + +int APS5_VABI libSceTtsCoreG3BcUnknown_fF3Q3LdPUtk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fF3Q3LdPUtk", libSceTtsCoreG3BcUnknown_fF3Q3LdPUtk_nid_no_patch); + +int APS5_VABI libSceTtsCoreG3BcUnknown_iW0DoaHZE5Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iW0DoaHZE5Y", libSceTtsCoreG3BcUnknown_iW0DoaHZE5Y_nid_no_patch); + +int APS5_VABI libSceTtsCoreG3BcUnknown_k1_minus_orvzQrHw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("k1-orvzQrHw", libSceTtsCoreG3BcUnknown_k1_minus_orvzQrHw_nid_no_patch); + +int APS5_VABI libSceTtsCoreG3BcUnknown_lQLzsMt_minus_6NU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lQLzsMt-6NU", libSceTtsCoreG3BcUnknown_lQLzsMt_minus_6NU_nid_no_patch); + +int APS5_VABI libSceTtsCoreG3BcUnknown_pacG6ffHAvU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pacG6ffHAvU", libSceTtsCoreG3BcUnknown_pacG6ffHAvU_nid_no_patch); + +int APS5_VABI libSceTtsCoreG3BcUnknown_pzhkpUfnlqY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pzhkpUfnlqY", libSceTtsCoreG3BcUnknown_pzhkpUfnlqY_nid_no_patch); + +int APS5_VABI libSceTtsCoreG3BcUnknown_stLW2n_minus_xJ6M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("stLW2n-xJ6M", libSceTtsCoreG3BcUnknown_stLW2n_minus_xJ6M_nid_no_patch); + +} diff --git a/core/libs/prx/libSceTtsCoreG3Bc/include/InventoryExports.hpp b/core/libs/prx/libSceTtsCoreG3Bc/include/InventoryExports.hpp new file mode 100644 index 0000000000..b1fa3ccb29 --- /dev/null +++ b/core/libs/prx/libSceTtsCoreG3Bc/include/InventoryExports.hpp @@ -0,0 +1,26 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceTtsCoreG3BcUnknown__plus_b5_minus_z8Ff4cw_nid_no_patch(); +int APS5_VABI libSceTtsCoreG3BcUnknown_1scTM6aHK5I_nid_no_patch(); +int APS5_VABI libSceTtsCoreG3BcUnknown_9tnCCarXqdY_nid_no_patch(); +int APS5_VABI libSceTtsCoreG3BcUnknown_EmF4qOwLp5w_nid_no_patch(); +int APS5_VABI libSceTtsCoreG3BcUnknown_H0VOaNk61es_nid_no_patch(); +int APS5_VABI libSceTtsCoreG3BcUnknown_LQ65KkmJ48g_nid_no_patch(); +int APS5_VABI libSceTtsCoreG3BcUnknown_PRmv_minus_UzXa1w_nid_no_patch(); +int APS5_VABI libSceTtsCoreG3BcUnknown_RByzVVv6e0A_nid_no_patch(); +int APS5_VABI libSceTtsCoreG3BcUnknown_Sq5GSDo_minus_Rhk_nid_no_patch(); +int APS5_VABI libSceTtsCoreG3BcUnknown_V_plus_nR_plus_xHS2ag_nid_no_patch(); +int APS5_VABI libSceTtsCoreG3BcUnknown_bapD6H6e7Yk_nid_no_patch(); +int APS5_VABI libSceTtsCoreG3BcUnknown_fF3Q3LdPUtk_nid_no_patch(); +int APS5_VABI libSceTtsCoreG3BcUnknown_iW0DoaHZE5Y_nid_no_patch(); +int APS5_VABI libSceTtsCoreG3BcUnknown_k1_minus_orvzQrHw_nid_no_patch(); +int APS5_VABI libSceTtsCoreG3BcUnknown_lQLzsMt_minus_6NU_nid_no_patch(); +int APS5_VABI libSceTtsCoreG3BcUnknown_pacG6ffHAvU_nid_no_patch(); +int APS5_VABI libSceTtsCoreG3BcUnknown_pzhkpUfnlqY_nid_no_patch(); +int APS5_VABI libSceTtsCoreG3BcUnknown_stLW2n_minus_xJ6M_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceTtsCoreG3Bc/libSceTtsCoreG3Bc.hpp b/core/libs/prx/libSceTtsCoreG3Bc/libSceTtsCoreG3Bc.hpp index 6f70f09bee..2946b67d4a 100644 --- a/core/libs/prx/libSceTtsCoreG3Bc/libSceTtsCoreG3Bc.hpp +++ b/core/libs/prx/libSceTtsCoreG3Bc/libSceTtsCoreG3Bc.hpp @@ -1 +1,2 @@ #pragma once +#include "prx/libSceTtsCoreG3Bc/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceTtsEngine/Export.cpp b/core/libs/prx/libSceTtsEngine/Export.cpp new file mode 100644 index 0000000000..334bf571ad --- /dev/null +++ b/core/libs/prx/libSceTtsEngine/Export.cpp @@ -0,0 +1,66 @@ +#include "prx/libSceTtsEngine/include/Api.hpp" +#include +#include +#include "SceTypes.hpp" +#include "prx/libc/include/General.hpp" + +extern "C" { + +int APS5_VABI sceTtsEngineInitialize(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceTtsEngineTerminate(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("ULO80qzqyLo", sceTtsEngineUnknown00); +int APS5_VABI sceTtsEngineUnknown00(void) { + NotImplemented_nid_no_patch("ULO80qzqyLo"); + return 0; +} + +APS5_EXPORT("BGb-DqWHvH8", sceTtsEngineUnknown01); +int APS5_VABI sceTtsEngineUnknown01(void) { + NotImplemented_nid_no_patch("BGb-DqWHvH8"); + return 0; +} + +int APS5_VABI sceTtsEngineSetText(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceTtsEngineGetAudio(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceTtsEngineClear(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceTtsEngineSetPitch(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceTtsEngineSetSpeed(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceTtsEngineSetVolume(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceTtsEngineSetDepth(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +} diff --git a/core/libs/prx/libSceTtsEngine/include/Api.hpp b/core/libs/prx/libSceTtsEngine/include/Api.hpp new file mode 100644 index 0000000000..0e253d57f1 --- /dev/null +++ b/core/libs/prx/libSceTtsEngine/include/Api.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI sceTtsEngineInitialize(void); +int APS5_VABI sceTtsEngineTerminate(void); +int APS5_VABI sceTtsEngineUnknown00(void); +int APS5_VABI sceTtsEngineUnknown01(void); +int APS5_VABI sceTtsEngineSetText(void); +int APS5_VABI sceTtsEngineGetAudio(void); +int APS5_VABI sceTtsEngineClear(void); +int APS5_VABI sceTtsEngineSetPitch(void); +int APS5_VABI sceTtsEngineSetSpeed(void); +int APS5_VABI sceTtsEngineSetVolume(void); +int APS5_VABI sceTtsEngineSetDepth(void); + +} diff --git a/core/libs/prx/libSceTtsEngine/libSceTtsEngine.hpp b/core/libs/prx/libSceTtsEngine/libSceTtsEngine.hpp new file mode 100644 index 0000000000..531463be16 --- /dev/null +++ b/core/libs/prx/libSceTtsEngine/libSceTtsEngine.hpp @@ -0,0 +1,3 @@ +#pragma once + +#include "prx/libSceTtsEngine/include/Api.hpp" diff --git a/core/libs/prx/libSceUgcBgUploaderClient/Export.cpp b/core/libs/prx/libSceUgcBgUploaderClient/Export.cpp new file mode 100644 index 0000000000..5f79df92ac --- /dev/null +++ b/core/libs/prx/libSceUgcBgUploaderClient/Export.cpp @@ -0,0 +1,93 @@ +#include "prx/libSceUgcBgUploaderClient/include/Api.hpp" +#include +#include +#include "SceTypes.hpp" +#include "prx/libc/include/General.hpp" + +extern "C" { + +APS5_EXPORT("dzBXKg8LRSE", sceUgcBgUploaderClientUnknown00); +int APS5_VABI sceUgcBgUploaderClientUnknown00(void) { + NotImplemented_nid_no_patch("dzBXKg8LRSE"); + return 0; +} + +APS5_EXPORT("vZWGBzv5sZo", sceUgcBgUploaderClientUnknown01); +int APS5_VABI sceUgcBgUploaderClientUnknown01(void) { + NotImplemented_nid_no_patch("vZWGBzv5sZo"); + return 0; +} + +APS5_EXPORT("bKijF18p0jk", sceUgcBgUploaderClientUnknown02); +int APS5_VABI sceUgcBgUploaderClientUnknown02(void) { + NotImplemented_nid_no_patch("bKijF18p0jk"); + return 0; +} + +APS5_EXPORT("wDavD24aWP8", sceUgcBgUploaderClientUnknown03); +int APS5_VABI sceUgcBgUploaderClientUnknown03(void) { + NotImplemented_nid_no_patch("wDavD24aWP8"); + return 0; +} + +APS5_EXPORT("uGQCU4501-k", sceUgcBgUploaderClientUnknown04); +int APS5_VABI sceUgcBgUploaderClientUnknown04(void) { + NotImplemented_nid_no_patch("uGQCU4501-k"); + return 0; +} + +APS5_EXPORT("doSBP2mLvME", sceUgcBgUploaderClientUnknown05); +int APS5_VABI sceUgcBgUploaderClientUnknown05(void) { + NotImplemented_nid_no_patch("doSBP2mLvME"); + return 0; +} + +APS5_EXPORT("65j9Fleu65U", sceUgcBgUploaderClientUnknown06); +int APS5_VABI sceUgcBgUploaderClientUnknown06(void) { + NotImplemented_nid_no_patch("65j9Fleu65U"); + return 0; +} + +APS5_EXPORT("7bNsgHpcYx4", sceUgcBgUploaderClientUnknown07); +int APS5_VABI sceUgcBgUploaderClientUnknown07(void) { + NotImplemented_nid_no_patch("7bNsgHpcYx4"); + return 0; +} + +APS5_EXPORT("h31ASRkW-DY", sceUgcBgUploaderClientUnknown08); +int APS5_VABI sceUgcBgUploaderClientUnknown08(void) { + NotImplemented_nid_no_patch("h31ASRkW-DY"); + return 0; +} + +APS5_EXPORT("uxggwRYz-IM", sceUgcBgUploaderClientUnknown09); +int APS5_VABI sceUgcBgUploaderClientUnknown09(void) { + NotImplemented_nid_no_patch("uxggwRYz-IM"); + return 0; +} + +APS5_EXPORT("90inOzxnHoM", sceUgcBgUploaderClientUnknown10); +int APS5_VABI sceUgcBgUploaderClientUnknown10(void) { + NotImplemented_nid_no_patch("90inOzxnHoM"); + return 0; +} + +APS5_EXPORT("l84v6g6cfzI", sceUgcBgUploaderClientUnknown11); +int APS5_VABI sceUgcBgUploaderClientUnknown11(void) { + NotImplemented_nid_no_patch("l84v6g6cfzI"); + return 0; +} + +APS5_EXPORT("6uRyQCuSVJs", sceUgcBgUploaderClientUnknown12); +int APS5_VABI sceUgcBgUploaderClientUnknown12(void) { + NotImplemented_nid_no_patch("6uRyQCuSVJs"); + return 0; +} + +APS5_EXPORT("LEdSOpwaSVg", sceUgcBgUploaderClientUnknown13); +int APS5_VABI sceUgcBgUploaderClientUnknown13(void) { + NotImplemented_nid_no_patch("LEdSOpwaSVg"); + return 0; +} + +} diff --git a/core/libs/prx/libSceUgcBgUploaderClient/include/Api.hpp b/core/libs/prx/libSceUgcBgUploaderClient/include/Api.hpp new file mode 100644 index 0000000000..fa15ef2a64 --- /dev/null +++ b/core/libs/prx/libSceUgcBgUploaderClient/include/Api.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI sceUgcBgUploaderClientUnknown00(void); +int APS5_VABI sceUgcBgUploaderClientUnknown01(void); +int APS5_VABI sceUgcBgUploaderClientUnknown02(void); +int APS5_VABI sceUgcBgUploaderClientUnknown03(void); +int APS5_VABI sceUgcBgUploaderClientUnknown04(void); +int APS5_VABI sceUgcBgUploaderClientUnknown05(void); +int APS5_VABI sceUgcBgUploaderClientUnknown06(void); +int APS5_VABI sceUgcBgUploaderClientUnknown07(void); +int APS5_VABI sceUgcBgUploaderClientUnknown08(void); +int APS5_VABI sceUgcBgUploaderClientUnknown09(void); +int APS5_VABI sceUgcBgUploaderClientUnknown10(void); +int APS5_VABI sceUgcBgUploaderClientUnknown11(void); +int APS5_VABI sceUgcBgUploaderClientUnknown12(void); +int APS5_VABI sceUgcBgUploaderClientUnknown13(void); + +} diff --git a/core/libs/prx/libSceUgcBgUploaderClient/libSceUgcBgUploaderClient.hpp b/core/libs/prx/libSceUgcBgUploaderClient/libSceUgcBgUploaderClient.hpp new file mode 100644 index 0000000000..4af25a44d6 --- /dev/null +++ b/core/libs/prx/libSceUgcBgUploaderClient/libSceUgcBgUploaderClient.hpp @@ -0,0 +1,3 @@ +#pragma once + +#include "prx/libSceUgcBgUploaderClient/include/Api.hpp" diff --git a/core/libs/prx/libSceUgcServiceS3/Export.cpp b/core/libs/prx/libSceUgcServiceS3/Export.cpp new file mode 100644 index 0000000000..2cdafa465c --- /dev/null +++ b/core/libs/prx/libSceUgcServiceS3/Export.cpp @@ -0,0 +1,89 @@ +#include "prx/libSceUgcServiceS3/include/Api.hpp" +#include +#include +#include "SceTypes.hpp" +#include "prx/libc/include/General.hpp" + +extern "C" { + +APS5_EXPORT("stkA1oba6eY", sceUgcServiceS3Unknown00); +int APS5_VABI sceUgcServiceS3Unknown00(void) { + NotImplemented_nid_no_patch("stkA1oba6eY"); + return 0; +} + +APS5_EXPORT("VlNz4Z+qWu8", sceUgcServiceS3Unknown01); +int APS5_VABI sceUgcServiceS3Unknown01(void) { + NotImplemented_nid_no_patch("VlNz4Z+qWu8"); + return 0; +} + +int APS5_VABI sceUgcServiceS3CreateRequest(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("6MeapakWJb8", sceUgcServiceS3Unknown02); +int APS5_VABI sceUgcServiceS3Unknown02(void) { + NotImplemented_nid_no_patch("6MeapakWJb8"); + return 0; +} + +int APS5_VABI sceUgcServiceS3CancelRequest(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("bxfGN4Ghqmg", sceUgcServiceS3Unknown03); +int APS5_VABI sceUgcServiceS3Unknown03(void) { + NotImplemented_nid_no_patch("bxfGN4Ghqmg"); + return 0; +} + +APS5_EXPORT("40fNo08E7T4", sceUgcServiceS3Unknown04); +int APS5_VABI sceUgcServiceS3Unknown04(void) { + NotImplemented_nid_no_patch("40fNo08E7T4"); + return 0; +} + +APS5_EXPORT("diqgMYgC9oE", sceUgcServiceS3Unknown05); +int APS5_VABI sceUgcServiceS3Unknown05(void) { + NotImplemented_nid_no_patch("diqgMYgC9oE"); + return 0; +} + +APS5_EXPORT("9NCT1TQWTQE", sceUgcServiceS3Unknown06); +int APS5_VABI sceUgcServiceS3Unknown06(void) { + NotImplemented_nid_no_patch("9NCT1TQWTQE"); + return 0; +} + +int APS5_VABI sceUgcServiceS3UploadFileWithGmsResponse(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("QOhoeuKdo7E", sceUgcServiceS3Unknown07); +int APS5_VABI sceUgcServiceS3Unknown07(void) { + NotImplemented_nid_no_patch("QOhoeuKdo7E"); + return 0; +} + +APS5_EXPORT("9967FcQ+zos", sceUgcServiceS3Unknown08); +int APS5_VABI sceUgcServiceS3Unknown08(void) { + NotImplemented_nid_no_patch("9967FcQ+zos"); + return 0; +} + +int APS5_VABI sceUgcServiceS3DownloadFileWithGmsResponse(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("0lMDwFrLjkM", sceUgcServiceS3Unknown09); +int APS5_VABI sceUgcServiceS3Unknown09(void) { + NotImplemented_nid_no_patch("0lMDwFrLjkM"); + return 0; +} + +} diff --git a/core/libs/prx/libSceUgcServiceS3/include/Api.hpp b/core/libs/prx/libSceUgcServiceS3/include/Api.hpp new file mode 100644 index 0000000000..54e356209b --- /dev/null +++ b/core/libs/prx/libSceUgcServiceS3/include/Api.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI sceUgcServiceS3Unknown00(void); +int APS5_VABI sceUgcServiceS3Unknown01(void); +int APS5_VABI sceUgcServiceS3CreateRequest(void); +int APS5_VABI sceUgcServiceS3Unknown02(void); +int APS5_VABI sceUgcServiceS3CancelRequest(void); +int APS5_VABI sceUgcServiceS3Unknown03(void); +int APS5_VABI sceUgcServiceS3Unknown04(void); +int APS5_VABI sceUgcServiceS3Unknown05(void); +int APS5_VABI sceUgcServiceS3Unknown06(void); +int APS5_VABI sceUgcServiceS3UploadFileWithGmsResponse(void); +int APS5_VABI sceUgcServiceS3Unknown07(void); +int APS5_VABI sceUgcServiceS3Unknown08(void); +int APS5_VABI sceUgcServiceS3DownloadFileWithGmsResponse(void); +int APS5_VABI sceUgcServiceS3Unknown09(void); + +} diff --git a/core/libs/prx/libSceUgcServiceS3/libSceUgcServiceS3.hpp b/core/libs/prx/libSceUgcServiceS3/libSceUgcServiceS3.hpp new file mode 100644 index 0000000000..2de02b1b1f --- /dev/null +++ b/core/libs/prx/libSceUgcServiceS3/libSceUgcServiceS3.hpp @@ -0,0 +1,3 @@ +#pragma once + +#include "prx/libSceUgcServiceS3/include/Api.hpp" diff --git a/core/libs/prx/libSceUsbStorage/Export.cpp b/core/libs/prx/libSceUsbStorage/Export.cpp index 2dacb35158..6a90d328d6 100644 --- a/core/libs/prx/libSceUsbStorage/Export.cpp +++ b/core/libs/prx/libSceUsbStorage/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceUsbStorage/include/InventoryExports.hpp" #include "prx/libSceSystemService/include/SystemService.hpp" #include #include @@ -565,3 +567,122 @@ int APS5_VABI sceUsbStorageSetFakeWriteProtection() { } } + +extern "C" { + +int APS5_VABI libSceUsbStorageUnknown_267oD_minus_IF_plus_8k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("267oD-IF+8k", libSceUsbStorageUnknown_267oD_minus_IF_plus_8k_nid_no_patch); + +int APS5_VABI libSceUsbStorageUnknown_96s31EeG0LM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("96s31EeG0LM", libSceUsbStorageUnknown_96s31EeG0LM_nid_no_patch); + +int APS5_VABI libSceUsbStorageUnknown_AIyv_minus_u_minus_8w0s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AIyv-u-8w0s", libSceUsbStorageUnknown_AIyv_minus_u_minus_8w0s_nid_no_patch); + +int APS5_VABI libSceUsbStorageUnknown_FhdRv3K4EMQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FhdRv3K4EMQ", libSceUsbStorageUnknown_FhdRv3K4EMQ_nid_no_patch); + +int APS5_VABI libSceUsbStorageUnknown_H6axEciG5Gw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("H6axEciG5Gw", libSceUsbStorageUnknown_H6axEciG5Gw_nid_no_patch); + +int APS5_VABI libSceUsbStorageUnknown_IgVY6sHaVuE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IgVY6sHaVuE", libSceUsbStorageUnknown_IgVY6sHaVuE_nid_no_patch); + +int APS5_VABI libSceUsbStorageUnknown_O6_plus_fXKZS62g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("O6+fXKZS62g", libSceUsbStorageUnknown_O6_plus_fXKZS62g_nid_no_patch); + +int APS5_VABI libSceUsbStorageUnknown_OhsV6P0FD5A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OhsV6P0FD5A", libSceUsbStorageUnknown_OhsV6P0FD5A_nid_no_patch); + +int APS5_VABI libSceUsbStorageUnknown_PsB2k0hnCRo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PsB2k0hnCRo", libSceUsbStorageUnknown_PsB2k0hnCRo_nid_no_patch); + +int APS5_VABI libSceUsbStorageUnknown_W_plus_CjjL0iEmU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("W+CjjL0iEmU", libSceUsbStorageUnknown_W_plus_CjjL0iEmU_nid_no_patch); + +int APS5_VABI libSceUsbStorageUnknown_W5e8Vxa9OCI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("W5e8Vxa9OCI", libSceUsbStorageUnknown_W5e8Vxa9OCI_nid_no_patch); + +int APS5_VABI libSceUsbStorageUnknown_W6xoHROgu6w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("W6xoHROgu6w", libSceUsbStorageUnknown_W6xoHROgu6w_nid_no_patch); + +int APS5_VABI libSceUsbStorageUnknown_XMDFDnkOilA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XMDFDnkOilA", libSceUsbStorageUnknown_XMDFDnkOilA_nid_no_patch); + +int APS5_VABI libSceUsbStorageUnknown_d5QHvMfsCx0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("d5QHvMfsCx0", libSceUsbStorageUnknown_d5QHvMfsCx0_nid_no_patch); + +int APS5_VABI libSceUsbStorageUnknown_dVQFgpSzA2I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dVQFgpSzA2I", libSceUsbStorageUnknown_dVQFgpSzA2I_nid_no_patch); + +int APS5_VABI libSceUsbStorageUnknown_jjKZ79juYfE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jjKZ79juYfE", libSceUsbStorageUnknown_jjKZ79juYfE_nid_no_patch); + +int APS5_VABI libSceUsbStorageUnknown_jl_plus__plus_fwrnXXI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jl++fwrnXXI", libSceUsbStorageUnknown_jl_plus__plus_fwrnXXI_nid_no_patch); + +int APS5_VABI libSceUsbStorageUnknown_jpS2TJZhsRU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jpS2TJZhsRU", libSceUsbStorageUnknown_jpS2TJZhsRU_nid_no_patch); + +int APS5_VABI libSceUsbStorageUnknown_jqw6RT84rQI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jqw6RT84rQI", libSceUsbStorageUnknown_jqw6RT84rQI_nid_no_patch); + +int APS5_VABI libSceUsbStorageUnknown_kzxjYuKrhv0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kzxjYuKrhv0", libSceUsbStorageUnknown_kzxjYuKrhv0_nid_no_patch); + +int APS5_VABI libSceUsbStorageUnknown_rZgSodboauI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rZgSodboauI", libSceUsbStorageUnknown_rZgSodboauI_nid_no_patch); + +int APS5_VABI libSceUsbStorageUnknown_uXZqnG02MiM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uXZqnG02MiM", libSceUsbStorageUnknown_uXZqnG02MiM_nid_no_patch); + +int APS5_VABI libSceUsbStorageUnknown_yct_minus_absP9LM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yct-absP9LM", libSceUsbStorageUnknown_yct_minus_absP9LM_nid_no_patch); + +} diff --git a/core/libs/prx/libSceUsbStorage/include/InventoryExports.hpp b/core/libs/prx/libSceUsbStorage/include/InventoryExports.hpp new file mode 100644 index 0000000000..dd1b085d48 --- /dev/null +++ b/core/libs/prx/libSceUsbStorage/include/InventoryExports.hpp @@ -0,0 +1,31 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceUsbStorageUnknown_267oD_minus_IF_plus_8k_nid_no_patch(); +int APS5_VABI libSceUsbStorageUnknown_96s31EeG0LM_nid_no_patch(); +int APS5_VABI libSceUsbStorageUnknown_AIyv_minus_u_minus_8w0s_nid_no_patch(); +int APS5_VABI libSceUsbStorageUnknown_FhdRv3K4EMQ_nid_no_patch(); +int APS5_VABI libSceUsbStorageUnknown_H6axEciG5Gw_nid_no_patch(); +int APS5_VABI libSceUsbStorageUnknown_IgVY6sHaVuE_nid_no_patch(); +int APS5_VABI libSceUsbStorageUnknown_O6_plus_fXKZS62g_nid_no_patch(); +int APS5_VABI libSceUsbStorageUnknown_OhsV6P0FD5A_nid_no_patch(); +int APS5_VABI libSceUsbStorageUnknown_PsB2k0hnCRo_nid_no_patch(); +int APS5_VABI libSceUsbStorageUnknown_W_plus_CjjL0iEmU_nid_no_patch(); +int APS5_VABI libSceUsbStorageUnknown_W5e8Vxa9OCI_nid_no_patch(); +int APS5_VABI libSceUsbStorageUnknown_W6xoHROgu6w_nid_no_patch(); +int APS5_VABI libSceUsbStorageUnknown_XMDFDnkOilA_nid_no_patch(); +int APS5_VABI libSceUsbStorageUnknown_d5QHvMfsCx0_nid_no_patch(); +int APS5_VABI libSceUsbStorageUnknown_dVQFgpSzA2I_nid_no_patch(); +int APS5_VABI libSceUsbStorageUnknown_jjKZ79juYfE_nid_no_patch(); +int APS5_VABI libSceUsbStorageUnknown_jl_plus__plus_fwrnXXI_nid_no_patch(); +int APS5_VABI libSceUsbStorageUnknown_jpS2TJZhsRU_nid_no_patch(); +int APS5_VABI libSceUsbStorageUnknown_jqw6RT84rQI_nid_no_patch(); +int APS5_VABI libSceUsbStorageUnknown_kzxjYuKrhv0_nid_no_patch(); +int APS5_VABI libSceUsbStorageUnknown_rZgSodboauI_nid_no_patch(); +int APS5_VABI libSceUsbStorageUnknown_uXZqnG02MiM_nid_no_patch(); +int APS5_VABI libSceUsbStorageUnknown_yct_minus_absP9LM_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceUsbStorage/libSceUsbStorage.hpp b/core/libs/prx/libSceUsbStorage/libSceUsbStorage.hpp index bf34865160..7a988104e2 100644 --- a/core/libs/prx/libSceUsbStorage/libSceUsbStorage.hpp +++ b/core/libs/prx/libSceUsbStorage/libSceUsbStorage.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceUsbStorage/UsbStorage.hpp" +#include "prx/libSceUsbStorage/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceUserService/CMakeLists.txt b/core/libs/prx/libSceUserService/CMakeLists.txt index 282c8e98a3..ee3f746eb4 100644 --- a/core/libs/prx/libSceUserService/CMakeLists.txt +++ b/core/libs/prx/libSceUserService/CMakeLists.txt @@ -1,7 +1,8 @@ -add_library(libSceUserService SHARED EXCLUDE_FROM_ALL Export.cpp) +add_library(libSceUserService SHARED EXCLUDE_FROM_ALL Export.cpp InventoryExports.cpp) target_include_directories(libSceUserService PRIVATE ${LIBS_INCLUDE_DIR}) target_link_libraries(libSceUserService PRIVATE libSceSystemService) configure_windows_unwind(libSceUserService) +target_sources(libSceUserService PRIVATE LegacyExports.cpp) if(BUILD_TESTING) add_test_executable(guest_user_service_tests ${LIBS_INCLUDE_DIR}/tests/GuestUserService.cpp) diff --git a/core/libs/prx/libSceUserService/Export.cpp b/core/libs/prx/libSceUserService/Export.cpp index 3d1628ff25..fab4886e27 100644 --- a/core/libs/prx/libSceUserService/Export.cpp +++ b/core/libs/prx/libSceUserService/Export.cpp @@ -54,7 +54,9 @@ void PopulateInitialLoginEvents() { std::lock_guard lock(userMutex); eventQueue.clear(); constexpr std::uint32_t EventTypeLogin = 0; - eventQueue.push_back({EventTypeLogin, USER_SERVICE_INITIAL_USER_ID}); + if (userConnected[0]) { + eventQueue.push_back({EventTypeLogin, USER_SERVICE_INITIAL_USER_ID}); + } for (int i = 1; i < USER_SERVICE_MAX_USERS; ++i) { if (userConnected[i]) { eventQueue.push_back({EventTypeLogin, USER_SERVICE_INITIAL_USER_ID + i}); @@ -98,7 +100,7 @@ static int ReportKeyboardSetting(int user_id, int32_t* type, int32_t (*value)()) extern "C" { void UserServiceSetUserConnected_nid_postfix(int userIndex, bool connected) { - if (userIndex <= 0 || userIndex >= USER_SERVICE_MAX_USERS) return; + if (userIndex < 0 || userIndex >= USER_SERVICE_MAX_USERS) return; std::lock_guard lock(userMutex); if (userConnected[userIndex] != connected) { userConnected[userIndex] = connected; diff --git a/core/libs/prx/libSceUserService/InventoryExports.cpp b/core/libs/prx/libSceUserService/InventoryExports.cpp new file mode 100644 index 0000000000..0a45386094 --- /dev/null +++ b/core/libs/prx/libSceUserService/InventoryExports.cpp @@ -0,0 +1,187 @@ +#include "SceTypes.hpp" +#include "prx/libc/include/General.hpp" +#include "prx/libc/include/general/ExportMacros.hpp" + +extern "C" { + +int APS5_VABI sceUserServiceGetPartyChatTranscriptionVoiceType_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ebq9pcMYrko", sceUserServiceGetPartyChatTranscriptionVoiceType_nid_no_patch); + +int APS5_VABI sceUserServiceSetVoiceAgentEnableByButton_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Jz06XYyyqGE", sceUserServiceSetVoiceAgentEnableByButton_nid_no_patch); + +int APS5_VABI libSceUserServiceUnknown__minus_JCFmPNhxY8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-JCFmPNhxY8", libSceUserServiceUnknown__minus_JCFmPNhxY8_nid_no_patch); + +int APS5_VABI libSceUserServiceUnknown__minus_dkPbHlL9O8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-dkPbHlL9O8", libSceUserServiceUnknown__minus_dkPbHlL9O8_nid_no_patch); + +int APS5_VABI libSceUserServiceUnknown__minus_o_plus_vKoB_plus_bIw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-o+vKoB+bIw", libSceUserServiceUnknown__minus_o_plus_vKoB_plus_bIw_nid_no_patch); + +int APS5_VABI libSceUserServiceUnknown_0rgUYD57RHc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0rgUYD57RHc", libSceUserServiceUnknown_0rgUYD57RHc_nid_no_patch); + +int APS5_VABI libSceUserServiceUnknown_1b1BuBizZ2Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1b1BuBizZ2Q", libSceUserServiceUnknown_1b1BuBizZ2Q_nid_no_patch); + +int APS5_VABI libSceUserServiceUnknown_1fV_minus_P4lyYAM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1fV-P4lyYAM", libSceUserServiceUnknown_1fV_minus_P4lyYAM_nid_no_patch); + +int APS5_VABI libSceUserServiceUnknown_6Qsib4RLbFw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6Qsib4RLbFw", libSceUserServiceUnknown_6Qsib4RLbFw_nid_no_patch); + +int APS5_VABI libSceUserServiceUnknown_6erDJ4_minus_MGCs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6erDJ4-MGCs", libSceUserServiceUnknown_6erDJ4_minus_MGCs_nid_no_patch); + +int APS5_VABI libSceUserServiceUnknown_A_minus_wBTL_plus_Cs5A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("A-wBTL+Cs5A", libSceUserServiceUnknown_A_minus_wBTL_plus_Cs5A_nid_no_patch); + +int APS5_VABI libSceUserServiceUnknown_BdzmN4JP3JM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BdzmN4JP3JM", libSceUserServiceUnknown_BdzmN4JP3JM_nid_no_patch); + +int APS5_VABI libSceUserServiceUnknown_Bx_plus_ESDBWJm4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Bx+ESDBWJm4", libSceUserServiceUnknown_Bx_plus_ESDBWJm4_nid_no_patch); + +int APS5_VABI libSceUserServiceUnknown_Cqt7pJZRKLI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Cqt7pJZRKLI", libSceUserServiceUnknown_Cqt7pJZRKLI_nid_no_patch); + +int APS5_VABI libSceUserServiceUnknown_D5lYX9Wm7PI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("D5lYX9Wm7PI", libSceUserServiceUnknown_D5lYX9Wm7PI_nid_no_patch); + +int APS5_VABI libSceUserServiceUnknown_DL6cKVeISqs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DL6cKVeISqs", libSceUserServiceUnknown_DL6cKVeISqs_nid_no_patch); + +int APS5_VABI libSceUserServiceUnknown_ErTMkmSho4E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ErTMkmSho4E", libSceUserServiceUnknown_ErTMkmSho4E_nid_no_patch); + +int APS5_VABI libSceUserServiceUnknown_GbRykQBfmM8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GbRykQBfmM8", libSceUserServiceUnknown_GbRykQBfmM8_nid_no_patch); + +int APS5_VABI libSceUserServiceUnknown_JD766DzZIIU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JD766DzZIIU", libSceUserServiceUnknown_JD766DzZIIU_nid_no_patch); + +int APS5_VABI libSceUserServiceUnknown_L9NSPGwLZTQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("L9NSPGwLZTQ", libSceUserServiceUnknown_L9NSPGwLZTQ_nid_no_patch); + +int APS5_VABI libSceUserServiceUnknown_PBJH7EFon8c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PBJH7EFon8c", libSceUserServiceUnknown_PBJH7EFon8c_nid_no_patch); + +int APS5_VABI libSceUserServiceUnknown_UKInJ0LzusI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UKInJ0LzusI", libSceUserServiceUnknown_UKInJ0LzusI_nid_no_patch); + +int APS5_VABI libSceUserServiceUnknown_WGYLbMB95kM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WGYLbMB95kM", libSceUserServiceUnknown_WGYLbMB95kM_nid_no_patch); + +int APS5_VABI libSceUserServiceUnknown_YZwUXHtKrXI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YZwUXHtKrXI", libSceUserServiceUnknown_YZwUXHtKrXI_nid_no_patch); + +int APS5_VABI libSceUserServiceUnknown_fPmaQlxVoqI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fPmaQlxVoqI", libSceUserServiceUnknown_fPmaQlxVoqI_nid_no_patch); + +int APS5_VABI libSceUserServiceUnknown_hKzuaakSOLE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hKzuaakSOLE", libSceUserServiceUnknown_hKzuaakSOLE_nid_no_patch); + +int APS5_VABI libSceUserServiceUnknown_iRkGgbFAhcw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iRkGgbFAhcw", libSceUserServiceUnknown_iRkGgbFAhcw_nid_no_patch); + +int APS5_VABI libSceUserServiceUnknown_isbcQWjV_minus_qU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("isbcQWjV-qU", libSceUserServiceUnknown_isbcQWjV_minus_qU_nid_no_patch); + +int APS5_VABI libSceUserServiceUnknown_keFAPHk6pIc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("keFAPHk6pIc", libSceUserServiceUnknown_keFAPHk6pIc_nid_no_patch); + +int APS5_VABI libSceUserServiceUnknown_oF3Ygwz32Bs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oF3Ygwz32Bs", libSceUserServiceUnknown_oF3Ygwz32Bs_nid_no_patch); + +int APS5_VABI libSceUserServiceUnknown_pfgU0SxMMxw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pfgU0SxMMxw", libSceUserServiceUnknown_pfgU0SxMMxw_nid_no_patch); + +int APS5_VABI libSceUserServiceUnknown_pr3J39r9ArQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pr3J39r9ArQ", libSceUserServiceUnknown_pr3J39r9ArQ_nid_no_patch); + +int APS5_VABI libSceUserServiceUnknown_shuQwNy79HM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("shuQwNy79HM", libSceUserServiceUnknown_shuQwNy79HM_nid_no_patch); + +int APS5_VABI libSceUserServiceUnknown_tPbEIE0wYCM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tPbEIE0wYCM", libSceUserServiceUnknown_tPbEIE0wYCM_nid_no_patch); + +int APS5_VABI libSceUserServiceUnknown_u5SR3_plus_a0lTw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("u5SR3+a0lTw", libSceUserServiceUnknown_u5SR3_plus_a0lTw_nid_no_patch); + +int APS5_VABI libSceUserServiceUnknown_ys8aAGjUads_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ys8aAGjUads", libSceUserServiceUnknown_ys8aAGjUads_nid_no_patch); + +} diff --git a/core/libs/prx/libSceUserService/LegacyExports.cpp b/core/libs/prx/libSceUserService/LegacyExports.cpp new file mode 100644 index 0000000000..ac3ba56053 --- /dev/null +++ b/core/libs/prx/libSceUserService/LegacyExports.cpp @@ -0,0 +1,166 @@ +#include "prx/libSceUserService/include/LegacyExports.hpp" +#include "prx/libc/include/General.hpp" + +extern "C" { + +int APS5_VABI sceUserServiceGetFileBrowserFilter() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceGetFileBrowserSortContent() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceGetFileBrowserSortTitle() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceGetFileSelectorFilter() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceGetFileSelectorSortContent() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceGetFileSelectorSortTitle() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceGetImeAutoCapitalEnabled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceGetImeInitFlag() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceGetImePredictiveTextEnabled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceGetImeRunCount() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceGetShareButtonAssign() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceGetShareDailymotionAccessToken() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceGetShareDailymotionRefreshToken() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceGetThemeBgImageDimmer() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceGetThemeBgImageWaveColor() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceGetThemeBgImageZoom() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceGetThemeEntitlementId() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceGetThemeHomeShareOwner() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceGetThemeTextShadow() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceGetThemeWaveColor() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceSetFileBrowserFilter() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceSetFileBrowserSortContent() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceSetFileBrowserSortTitle() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceSetFileSelectorFilter() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceSetFileSelectorSortContent() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceSetFileSelectorSortTitle() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceSetImeAutoCapitalEnabled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceSetImeInitFlag() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceSetImePredictiveTextEnabled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceSetImeRunCount() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceSetShareButtonAssign() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceSetShareDailymotionAccessToken() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceSetShareDailymotionRefreshToken() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceSetThemeBgImageDimmer() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceSetThemeBgImageWaveColor() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceSetThemeBgImageZoom() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceSetThemeEntitlementId() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceSetThemeHomeShareOwner() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceSetThemeTextShadow() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUserServiceSetThemeWaveColor() { + NotImplemented_nid_no_patch(__func__); +} + +} diff --git a/core/libs/prx/libSceUserService/include/LegacyExports.hpp b/core/libs/prx/libSceUserService/include/LegacyExports.hpp new file mode 100644 index 0000000000..8f9f71a4b7 --- /dev/null +++ b/core/libs/prx/libSceUserService/include/LegacyExports.hpp @@ -0,0 +1,48 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI sceUserServiceGetFileBrowserFilter(); +int APS5_VABI sceUserServiceGetFileBrowserSortContent(); +int APS5_VABI sceUserServiceGetFileBrowserSortTitle(); +int APS5_VABI sceUserServiceGetFileSelectorFilter(); +int APS5_VABI sceUserServiceGetFileSelectorSortContent(); +int APS5_VABI sceUserServiceGetFileSelectorSortTitle(); +int APS5_VABI sceUserServiceGetImeAutoCapitalEnabled(); +int APS5_VABI sceUserServiceGetImeInitFlag(); +int APS5_VABI sceUserServiceGetImePredictiveTextEnabled(); +int APS5_VABI sceUserServiceGetImeRunCount(); +int APS5_VABI sceUserServiceGetShareButtonAssign(); +int APS5_VABI sceUserServiceGetShareDailymotionAccessToken(); +int APS5_VABI sceUserServiceGetShareDailymotionRefreshToken(); +int APS5_VABI sceUserServiceGetThemeBgImageDimmer(); +int APS5_VABI sceUserServiceGetThemeBgImageWaveColor(); +int APS5_VABI sceUserServiceGetThemeBgImageZoom(); +int APS5_VABI sceUserServiceGetThemeEntitlementId(); +int APS5_VABI sceUserServiceGetThemeHomeShareOwner(); +int APS5_VABI sceUserServiceGetThemeTextShadow(); +int APS5_VABI sceUserServiceGetThemeWaveColor(); +int APS5_VABI sceUserServiceSetFileBrowserFilter(); +int APS5_VABI sceUserServiceSetFileBrowserSortContent(); +int APS5_VABI sceUserServiceSetFileBrowserSortTitle(); +int APS5_VABI sceUserServiceSetFileSelectorFilter(); +int APS5_VABI sceUserServiceSetFileSelectorSortContent(); +int APS5_VABI sceUserServiceSetFileSelectorSortTitle(); +int APS5_VABI sceUserServiceSetImeAutoCapitalEnabled(); +int APS5_VABI sceUserServiceSetImeInitFlag(); +int APS5_VABI sceUserServiceSetImePredictiveTextEnabled(); +int APS5_VABI sceUserServiceSetImeRunCount(); +int APS5_VABI sceUserServiceSetShareButtonAssign(); +int APS5_VABI sceUserServiceSetShareDailymotionAccessToken(); +int APS5_VABI sceUserServiceSetShareDailymotionRefreshToken(); +int APS5_VABI sceUserServiceSetThemeBgImageDimmer(); +int APS5_VABI sceUserServiceSetThemeBgImageWaveColor(); +int APS5_VABI sceUserServiceSetThemeBgImageZoom(); +int APS5_VABI sceUserServiceSetThemeEntitlementId(); +int APS5_VABI sceUserServiceSetThemeHomeShareOwner(); +int APS5_VABI sceUserServiceSetThemeTextShadow(); +int APS5_VABI sceUserServiceSetThemeWaveColor(); + +} diff --git a/core/libs/prx/libSceUserService/libSceUserService.hpp b/core/libs/prx/libSceUserService/libSceUserService.hpp index 32a9d2d7ae..18bd89f716 100644 --- a/core/libs/prx/libSceUserService/libSceUserService.hpp +++ b/core/libs/prx/libSceUserService/libSceUserService.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceUserService/UserService.hpp" +#include "prx/libSceUserService/include/LegacyExports.hpp" diff --git a/core/libs/prx/libSceVdecShevc/Export.cpp b/core/libs/prx/libSceVdecShevc/Export.cpp index 43e4936066..13d6337e2c 100644 --- a/core/libs/prx/libSceVdecShevc/Export.cpp +++ b/core/libs/prx/libSceVdecShevc/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceVdecShevc/include/InventoryExports.hpp" #include "prx/libSceVdecShevc/include/Api.hpp" #include #include @@ -42,3 +44,37 @@ int APS5_VABI sceSdecResetSwHevc() { } } + +extern "C" { + +int APS5_VABI libSceVdecShevcUnknown_79qqGAVnWfA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("79qqGAVnWfA", libSceVdecShevcUnknown_79qqGAVnWfA_nid_no_patch); + +int APS5_VABI libSceVdecShevcUnknown_PTO17yTeoSk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PTO17yTeoSk", libSceVdecShevcUnknown_PTO17yTeoSk_nid_no_patch); + +int APS5_VABI libSceVdecShevcUnknown_hZXstu74B4I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hZXstu74B4I", libSceVdecShevcUnknown_hZXstu74B4I_nid_no_patch); + +int APS5_VABI libSceVdecShevcUnknown_lLaAHswK1zQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lLaAHswK1zQ", libSceVdecShevcUnknown_lLaAHswK1zQ_nid_no_patch); + +int APS5_VABI libSceVdecShevcUnknown_wvq_plus_GPpswaw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wvq+GPpswaw", libSceVdecShevcUnknown_wvq_plus_GPpswaw_nid_no_patch); + +int APS5_VABI libSceVdecShevcUnknown_xbRElcEVmdM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xbRElcEVmdM", libSceVdecShevcUnknown_xbRElcEVmdM_nid_no_patch); + +} diff --git a/core/libs/prx/libSceVdecShevc/include/InventoryExports.hpp b/core/libs/prx/libSceVdecShevc/include/InventoryExports.hpp new file mode 100644 index 0000000000..ba4eee98a8 --- /dev/null +++ b/core/libs/prx/libSceVdecShevc/include/InventoryExports.hpp @@ -0,0 +1,14 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceVdecShevcUnknown_79qqGAVnWfA_nid_no_patch(); +int APS5_VABI libSceVdecShevcUnknown_PTO17yTeoSk_nid_no_patch(); +int APS5_VABI libSceVdecShevcUnknown_hZXstu74B4I_nid_no_patch(); +int APS5_VABI libSceVdecShevcUnknown_lLaAHswK1zQ_nid_no_patch(); +int APS5_VABI libSceVdecShevcUnknown_wvq_plus_GPpswaw_nid_no_patch(); +int APS5_VABI libSceVdecShevcUnknown_xbRElcEVmdM_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceVdecShevc/libSceVdecShevc.hpp b/core/libs/prx/libSceVdecShevc/libSceVdecShevc.hpp index e6f868789a..1d58b977db 100644 --- a/core/libs/prx/libSceVdecShevc/libSceVdecShevc.hpp +++ b/core/libs/prx/libSceVdecShevc/libSceVdecShevc.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceVdecShevc/include/Api.hpp" +#include "prx/libSceVdecShevc/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceVdecSvp9/Export.cpp b/core/libs/prx/libSceVdecSvp9/Export.cpp new file mode 100644 index 0000000000..ca700a82cf --- /dev/null +++ b/core/libs/prx/libSceVdecSvp9/Export.cpp @@ -0,0 +1,71 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceVdecSvp9/include/InventoryExports.hpp" +#include +#include +#include "SceTypes.hpp" +#include "prx/libc/include/General.hpp" + +extern "C" { + +APS5_DUMMY_FUN + +} + +extern "C" { + +int APS5_VABI libSceVdecSvp9Unknown_2dO21ExX5hM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2dO21ExX5hM", libSceVdecSvp9Unknown_2dO21ExX5hM_nid_no_patch); + +int APS5_VABI libSceVdecSvp9Unknown_33wXf5Ne2xc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("33wXf5Ne2xc", libSceVdecSvp9Unknown_33wXf5Ne2xc_nid_no_patch); + +int APS5_VABI libSceVdecSvp9Unknown_BFFONbbPMXw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BFFONbbPMXw", libSceVdecSvp9Unknown_BFFONbbPMXw_nid_no_patch); + +int APS5_VABI libSceVdecSvp9Unknown_JawAvxR7M_plus_k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JawAvxR7M+k", libSceVdecSvp9Unknown_JawAvxR7M_plus_k_nid_no_patch); + +int APS5_VABI libSceVdecSvp9Unknown_RuWQMaRBlEs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RuWQMaRBlEs", libSceVdecSvp9Unknown_RuWQMaRBlEs_nid_no_patch); + +int APS5_VABI libSceVdecSvp9Unknown_VGbdvyOsLzg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VGbdvyOsLzg", libSceVdecSvp9Unknown_VGbdvyOsLzg_nid_no_patch); + +int APS5_VABI libSceVdecSvp9Unknown_VmDqnxqvIFg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VmDqnxqvIFg", libSceVdecSvp9Unknown_VmDqnxqvIFg_nid_no_patch); + +int APS5_VABI libSceVdecSvp9Unknown_gktyGB_plus_7_minus_go_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gktyGB+7-go", libSceVdecSvp9Unknown_gktyGB_plus_7_minus_go_nid_no_patch); + +int APS5_VABI libSceVdecSvp9Unknown_hWezRodOVBI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hWezRodOVBI", libSceVdecSvp9Unknown_hWezRodOVBI_nid_no_patch); + +int APS5_VABI libSceVdecSvp9Unknown_kUyX8iOM0E4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kUyX8iOM0E4", libSceVdecSvp9Unknown_kUyX8iOM0E4_nid_no_patch); + +int APS5_VABI libSceVdecSvp9Unknown_x_plus_HO8XFm6io_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("x+HO8XFm6io", libSceVdecSvp9Unknown_x_plus_HO8XFm6io_nid_no_patch); + +} diff --git a/core/libs/prx/libSceVdecSvp9/include/InventoryExports.hpp b/core/libs/prx/libSceVdecSvp9/include/InventoryExports.hpp new file mode 100644 index 0000000000..72e440902f --- /dev/null +++ b/core/libs/prx/libSceVdecSvp9/include/InventoryExports.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceVdecSvp9Unknown_2dO21ExX5hM_nid_no_patch(); +int APS5_VABI libSceVdecSvp9Unknown_33wXf5Ne2xc_nid_no_patch(); +int APS5_VABI libSceVdecSvp9Unknown_BFFONbbPMXw_nid_no_patch(); +int APS5_VABI libSceVdecSvp9Unknown_JawAvxR7M_plus_k_nid_no_patch(); +int APS5_VABI libSceVdecSvp9Unknown_RuWQMaRBlEs_nid_no_patch(); +int APS5_VABI libSceVdecSvp9Unknown_VGbdvyOsLzg_nid_no_patch(); +int APS5_VABI libSceVdecSvp9Unknown_VmDqnxqvIFg_nid_no_patch(); +int APS5_VABI libSceVdecSvp9Unknown_gktyGB_plus_7_minus_go_nid_no_patch(); +int APS5_VABI libSceVdecSvp9Unknown_hWezRodOVBI_nid_no_patch(); +int APS5_VABI libSceVdecSvp9Unknown_kUyX8iOM0E4_nid_no_patch(); +int APS5_VABI libSceVdecSvp9Unknown_x_plus_HO8XFm6io_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceVdecSvp9/libSceVdecSvp9.hpp b/core/libs/prx/libSceVdecSvp9/libSceVdecSvp9.hpp new file mode 100644 index 0000000000..be355d5547 --- /dev/null +++ b/core/libs/prx/libSceVdecSvp9/libSceVdecSvp9.hpp @@ -0,0 +1,2 @@ +#pragma once +#include "prx/libSceVdecSvp9/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceVenc/Export.cpp b/core/libs/prx/libSceVenc/Export.cpp index 92f0c3bdd7..26a5b0b581 100644 --- a/core/libs/prx/libSceVenc/Export.cpp +++ b/core/libs/prx/libSceVenc/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceVenc/include/InventoryExports.hpp" #include "prx/libSceVenc/include/Api.hpp" #include #include @@ -97,3 +99,26 @@ int APS5_VABI sceVencSetCodecConfig() { } } + +extern "C" { + +int APS5_VABI sceVencUnmapMemory() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI libSceVencUnknown_6nGfjRPqCUM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6nGfjRPqCUM", libSceVencUnknown_6nGfjRPqCUM_nid_no_patch); + +int APS5_VABI libSceVencUnknown_B5iyzWMm_plus_DY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("B5iyzWMm+DY", libSceVencUnknown_B5iyzWMm_plus_DY_nid_no_patch); + +int APS5_VABI libSceVencUnknown_Vm5uPoERWmg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Vm5uPoERWmg", libSceVencUnknown_Vm5uPoERWmg_nid_no_patch); + +} diff --git a/core/libs/prx/libSceVenc/include/InventoryExports.hpp b/core/libs/prx/libSceVenc/include/InventoryExports.hpp new file mode 100644 index 0000000000..c2286327ab --- /dev/null +++ b/core/libs/prx/libSceVenc/include/InventoryExports.hpp @@ -0,0 +1,12 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI sceVencUnmapMemory(); +int APS5_VABI libSceVencUnknown_6nGfjRPqCUM_nid_no_patch(); +int APS5_VABI libSceVencUnknown_B5iyzWMm_plus_DY_nid_no_patch(); +int APS5_VABI libSceVencUnknown_Vm5uPoERWmg_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceVenc/libSceVenc.hpp b/core/libs/prx/libSceVenc/libSceVenc.hpp index cae676b0b2..839190d019 100644 --- a/core/libs/prx/libSceVenc/libSceVenc.hpp +++ b/core/libs/prx/libSceVenc/libSceVenc.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceVenc/include/Api.hpp" +#include "prx/libSceVenc/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceVideoNativeExtEssential/Export.cpp b/core/libs/prx/libSceVideoNativeExtEssential/Export.cpp index 83c4dda32a..c8896316a2 100644 --- a/core/libs/prx/libSceVideoNativeExtEssential/Export.cpp +++ b/core/libs/prx/libSceVideoNativeExtEssential/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceVideoNativeExtEssential/include/InventoryExports.hpp" #include "prx/libSceVideoNativeExtEssential/include/Api.hpp" #include #include @@ -32,3 +34,12 @@ int APS5_VABI sceVideoNativeExtEssential_IsInit() { } } + +extern "C" { + +int APS5_VABI libSceVideoNativeExtEssentialUnknown_iwAQhvb9BvY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iwAQhvb9BvY", libSceVideoNativeExtEssentialUnknown_iwAQhvb9BvY_nid_no_patch); + +} diff --git a/core/libs/prx/libSceVideoNativeExtEssential/include/InventoryExports.hpp b/core/libs/prx/libSceVideoNativeExtEssential/include/InventoryExports.hpp new file mode 100644 index 0000000000..ccad32650d --- /dev/null +++ b/core/libs/prx/libSceVideoNativeExtEssential/include/InventoryExports.hpp @@ -0,0 +1,9 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceVideoNativeExtEssentialUnknown_iwAQhvb9BvY_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceVideoNativeExtEssential/libSceVideoNativeExtEssential.hpp b/core/libs/prx/libSceVideoNativeExtEssential/libSceVideoNativeExtEssential.hpp index 07fbad2f88..46f7cf1790 100644 --- a/core/libs/prx/libSceVideoNativeExtEssential/libSceVideoNativeExtEssential.hpp +++ b/core/libs/prx/libSceVideoNativeExtEssential/libSceVideoNativeExtEssential.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceVideoNativeExtEssential/include/Api.hpp" +#include "prx/libSceVideoNativeExtEssential/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceVideoOut/CMakeLists.txt b/core/libs/prx/libSceVideoOut/CMakeLists.txt index 3089a1cd24..8da34b281e 100644 --- a/core/libs/prx/libSceVideoOut/CMakeLists.txt +++ b/core/libs/prx/libSceVideoOut/CMakeLists.txt @@ -109,7 +109,8 @@ if(BUILD_TESTING) endforeach() set_target_properties(video_out_flip_tests PROPERTIES EXCLUDE_FROM_ALL OFF) - foreach(flipMode IN ITEMS lifetime reopen decode controls overlay padstatus unopened ps4 resolution resolution_override fresh) + foreach(flipMode IN ITEMS lifetime reopen decode controls overlay padstatus unopened ps4 resolution resolution_override fresh + present backtoback dcc pacing aftergpu onedevice deferred unregistered) if(flipMode STREQUAL "lifetime") add_test(NAME video_out_flip_${flipMode} COMMAND video_out_flip_tests) else() @@ -135,6 +136,12 @@ if(BUILD_TESTING) set_tests_properties(video_out_flip_cpuflip_in_order PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") endif() + add_test(NAME video_out_flip_unavailable COMMAND video_out_flip_tests unavailable) + set_tests_properties(video_out_flip_unavailable PROPERTIES TIMEOUT 30 RESOURCE_LOCK videoout_app0 ENVIRONMENT "SDL_VIDEODRIVER=dummy") + if(WIN32) + set_tests_properties(video_out_flip_unavailable PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() endif() if(BUILD_TESTING AND NOT WIN32) @@ -190,6 +197,17 @@ if(BUILD_TESTING) endif() endif() +if(BUILD_TESTING) + add_test_executable(pad_host_volume_tests tests/HostVolumeInput.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../libScePad/src/HostVolumeState.cpp) + target_include_directories(pad_host_volume_tests PRIVATE ${LIBS_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/3rdparty/SDL2/include) + target_link_libraries(pad_host_volume_tests PRIVATE SDL2-static) + if(MINGW) + target_compile_options(pad_host_volume_tests PRIVATE -fasynchronous-unwind-tables) + target_link_options(pad_host_volume_tests PRIVATE -static -static-libgcc -static-libstdc++) + endif() + add_test(NAME pad_host_volume COMMAND pad_host_volume_tests) +endif() + if(BUILD_TESTING) add_test_executable(pad_keyboard_mouse_tests tests/KeyboardMouse.cpp src/KeyboardMouse.cpp) target_include_directories(pad_keyboard_mouse_tests PRIVATE ${LIBS_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/3rdparty/SDL2/include) @@ -335,3 +353,24 @@ if(BUILD_TESTING) "PATH=path_list_prepend:$") endif() endif() + +if(BUILD_TESTING) + add_test_executable(video_out_port0_presence_tests tests/Port0Presence.cpp) + target_include_directories(video_out_port0_presence_tests PRIVATE ${LIBS_INCLUDE_DIR}) + configure_host_test_executable(video_out_port0_presence_tests) + add_test(NAME video_out_port0_presence COMMAND video_out_port0_presence_tests) + set_tests_properties(video_out_port0_presence PROPERTIES TIMEOUT 30) +endif() + +if(BUILD_TESTING) + add_test_executable(pad_port0_tests tests/PadPort0.cpp) + target_include_directories(pad_port0_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(pad_port0_tests PRIVATE libSceVideoOut libScePad libSceIme libSceUserService libc SDL2-static) + configure_windows_unwind(pad_port0_tests) + add_test(NAME pad_port0 COMMAND pad_port0_tests) + set_tests_properties(pad_port0 PROPERTIES SKIP_RETURN_CODE 77 TIMEOUT 60) + if(WIN32) + set_tests_properties(pad_port0 PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$;PATH=path_list_prepend:$;PATH=path_list_prepend:$;PATH=path_list_prepend:$;PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceVideoOut/InventoryExports.cpp b/core/libs/prx/libSceVideoOut/InventoryExports.cpp index 21908db714..e298727bb5 100644 --- a/core/libs/prx/libSceVideoOut/InventoryExports.cpp +++ b/core/libs/prx/libSceVideoOut/InventoryExports.cpp @@ -1,3 +1,4 @@ +#include "prx/libSceVideoOut/include/LegacyExports.hpp" #include "prx/libc/include/general/ExportMacros.hpp" #include "prx/libSceVideoOut/include/InventoryExports.hpp" #include "prx/libc/include/General.hpp" @@ -783,3 +784,46 @@ int APS5_VABI libSceVideoOutUnknown_ys239q8VgXY_nid_no_patch() { APS5_EXPORT("ys239q8VgXY", libSceVideoOutUnknown_ys239q8VgXY_nid_no_patch); } + +extern "C" { + +int APS5_VABI videoOutLegacyUnknown__plus_epU_plus_rgObyw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+epU+rgObyw", videoOutLegacyUnknown__plus_epU_plus_rgObyw_nid_no_patch); + +int APS5_VABI videoOutLegacyUnknown_6L0_minus_A5piudQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6L0-A5piudQ", videoOutLegacyUnknown_6L0_minus_A5piudQ_nid_no_patch); + +int APS5_VABI videoOutLegacyUnknown_QSmT3attiVg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QSmT3attiVg", videoOutLegacyUnknown_QSmT3attiVg_nid_no_patch); + +int APS5_VABI videoOutLegacyUnknown_ekwMB_minus_Ftq18_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ekwMB-Ftq18", videoOutLegacyUnknown_ekwMB_minus_Ftq18_nid_no_patch); + +int APS5_VABI videoOutLegacyUnknown_fZgBeiGqE_plus_c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fZgBeiGqE+c", videoOutLegacyUnknown_fZgBeiGqE_plus_c_nid_no_patch); + +int APS5_VABI videoOutLegacyUnknown_spvjek0G4es_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("spvjek0G4es", videoOutLegacyUnknown_spvjek0G4es_nid_no_patch); + +int APS5_VABI videoOutLegacyUnknown_xwhyGPZkW6w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xwhyGPZkW6w", videoOutLegacyUnknown_xwhyGPZkW6w_nid_no_patch); + +int APS5_VABI sceVideoOutSetConfigurationMode() { + NotImplemented_nid_no_patch(__func__); +} + +} diff --git a/core/libs/prx/libSceVideoOut/include/HostVolumeInput.hpp b/core/libs/prx/libSceVideoOut/include/HostVolumeInput.hpp new file mode 100644 index 0000000000..aa7197bbc5 --- /dev/null +++ b/core/libs/prx/libSceVideoOut/include/HostVolumeInput.hpp @@ -0,0 +1,33 @@ +#ifndef CORE_LIBS_PRX_LIBSCEVIDEOOUT_INCLUDE_HOSTVOLUMEINPUT_HPP +#define CORE_LIBS_PRX_LIBSCEVIDEOOUT_INCLUDE_HOSTVOLUMEINPUT_HPP + +#include "SDL_events.h" + +#include "prx/libScePad/include/HostVolumeControl.hpp" +#include "prx/libScePad/include/KeyboardMouse.hpp" + +inline bool ApplyHostVolumeRequests(const Pad::InputRequests& requests, HostVolume* after) { + bool requested = false; + if (requests.volumeUp) { + HostVolumeApply_nid_no_patch(HostVolumeCommand::VolumeUp, after); + requested = true; + } + if (requests.volumeDown) { + HostVolumeApply_nid_no_patch(HostVolumeCommand::VolumeDown, after); + requested = true; + } + if (requests.toggleMute) { + HostVolumeApply_nid_no_patch(HostVolumeCommand::ToggleMute, after); + requested = true; + } + return requested; +} + +inline bool ApplyHostFocusEvent(const SDL_Event& event, Uint32 windowId, HostVolume* after) { + if (event.type != SDL_WINDOWEVENT || event.window.windowID != windowId) return false; + if (event.window.event == SDL_WINDOWEVENT_FOCUS_LOST) return HostVolumeFocus_nid_no_patch(false, after); + if (event.window.event == SDL_WINDOWEVENT_FOCUS_GAINED) return HostVolumeFocus_nid_no_patch(true, after); + return false; +} + +#endif diff --git a/core/libs/prx/libSceVideoOut/include/LegacyExports.hpp b/core/libs/prx/libSceVideoOut/include/LegacyExports.hpp new file mode 100644 index 0000000000..8e3f845770 --- /dev/null +++ b/core/libs/prx/libSceVideoOut/include/LegacyExports.hpp @@ -0,0 +1,17 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI videoOutLegacyUnknown__plus_epU_plus_rgObyw_nid_no_patch(); +int APS5_VABI videoOutLegacyUnknown_6L0_minus_A5piudQ_nid_no_patch(); +int APS5_VABI videoOutLegacyUnknown_QSmT3attiVg_nid_no_patch(); +int APS5_VABI videoOutLegacyUnknown_ekwMB_minus_Ftq18_nid_no_patch(); +int APS5_VABI videoOutLegacyUnknown_fZgBeiGqE_plus_c_nid_no_patch(); +int APS5_VABI videoOutLegacyUnknown_spvjek0G4es_nid_no_patch(); +int APS5_VABI videoOutLegacyUnknown_xwhyGPZkW6w_nid_no_patch(); + +int APS5_VABI sceVideoOutSetConfigurationMode(); + +} diff --git a/core/libs/prx/libSceVideoOut/include/PadInput.hpp b/core/libs/prx/libSceVideoOut/include/PadInput.hpp index 6e7441138f..079d8b3b20 100644 --- a/core/libs/prx/libSceVideoOut/include/PadInput.hpp +++ b/core/libs/prx/libSceVideoOut/include/PadInput.hpp @@ -7,6 +7,7 @@ #include "prx/libScePad/include/PadState.hpp" #include "prx/libScePad/include/Pad.hpp" #include "prx/libSceVideoOut/include/PadOutputPacing.hpp" +#include "prx/libSceVideoOut/include/Port0Presence.hpp" #include "prx/libSceAgcDriver/Execution/include/PadStatus.hpp" #include #include @@ -57,11 +58,17 @@ private: void enableSensors(int slot); AgcDriver::PadStatusSnapshot statusSnapshot() const; void reportStatus(); + void updatePort0(); + void applyPort0(bool connected); Pad::KeyboardMouse keyboardMouse; std::array slots{}; VideoOutTelemetry::PadChangeFilter telemetryFilter; AgcDriver::PadStatusProvider statusProvider; + Port0Presence::Mode port0Mode; + Port0Presence::Presence port0; + bool padCaptured = false; + bool hostFocusSynced = false; }; #endif diff --git a/core/libs/prx/libSceVideoOut/include/Port0Presence.hpp b/core/libs/prx/libSceVideoOut/include/Port0Presence.hpp new file mode 100644 index 0000000000..be199da0c7 --- /dev/null +++ b/core/libs/prx/libSceVideoOut/include/Port0Presence.hpp @@ -0,0 +1,64 @@ +#ifndef CORE_LIBS_PRX_LIBSCEVIDEOOUT_PORT0PRESENCE_HPP +#define CORE_LIBS_PRX_LIBSCEVIDEOOUT_PORT0PRESENCE_HPP + +#include +#include +#include +#include +#include + +namespace Port0Presence { + +enum class Mode { + Default, + Controller +}; + +constexpr std::chrono::milliseconds kHold{500}; + +inline Mode ParseMode(const char* text) { + if (text == nullptr) return Mode::Default; + const std::string value(text); + if (value == "default") return Mode::Default; + if (value == "controller") return Mode::Controller; + throw std::runtime_error("ANYPS5_PAD_PORT0_STATE must be default or controller, not '" + value + "'"); +} + +inline Mode ConfiguredMode() { + return ParseMode(std::getenv("ANYPS5_PAD_PORT0_STATE")); +} + +class Presence { +public: + using Clock = std::chrono::steady_clock; + + Presence(Mode mode, bool bound) : mode(mode), committed(mode == Mode::Default || bound) {} + + bool Connected() const { return committed; } + + std::optional Observe(bool bound, Clock::time_point now) { + if (mode == Mode::Default || bound == committed) { + waiting = false; + return std::nullopt; + } + if (!waiting) { + waiting = true; + since = now; + return std::nullopt; + } + if (now - since < kHold) return std::nullopt; + committed = bound; + waiting = false; + return committed; + } + +private: + Mode mode; + bool committed; + bool waiting = false; + Clock::time_point since{}; +}; + +} + +#endif diff --git a/core/libs/prx/libSceVideoOut/libSceVideoOut.hpp b/core/libs/prx/libSceVideoOut/libSceVideoOut.hpp index 04462ec298..f917f95ea8 100644 --- a/core/libs/prx/libSceVideoOut/libSceVideoOut.hpp +++ b/core/libs/prx/libSceVideoOut/libSceVideoOut.hpp @@ -5,3 +5,4 @@ #include "prx/libSceVideoOut/include/Output.hpp" #include "prx/libSceVideoOut/include/VideoOut.hpp" #include "prx/libSceVideoOut/include/InventoryExports.hpp" +#include "prx/libSceVideoOut/include/LegacyExports.hpp" diff --git a/core/libs/prx/libSceVideoOut/src/InputMapping.cpp b/core/libs/prx/libSceVideoOut/src/InputMapping.cpp index d9d53c74c4..5a3b969c45 100644 --- a/core/libs/prx/libSceVideoOut/src/InputMapping.cpp +++ b/core/libs/prx/libSceVideoOut/src/InputMapping.cpp @@ -57,7 +57,10 @@ constexpr auto actions = std::array{ InputAction{"ToggleFullscreen", Pad::InputControl::ToggleFullscreen, Pad::PadButton::None}, InputAction{"TogglePerformanceOverlay", Pad::InputControl::TogglePerformanceOverlay, Pad::PadButton::None}, InputAction{"Screenshot", Pad::InputControl::Screenshot, Pad::PadButton::None}, - InputAction{"ShowPadStatus", Pad::InputControl::ShowPadStatus, Pad::PadButton::None} + InputAction{"ShowPadStatus", Pad::InputControl::ShowPadStatus, Pad::PadButton::None}, + InputAction{"VolumeUp", Pad::InputControl::VolumeUp, Pad::PadButton::None}, + InputAction{"VolumeDown", Pad::InputControl::VolumeDown, Pad::PadButton::None}, + InputAction{"ToggleMute", Pad::InputControl::ToggleMute, Pad::PadButton::None} }; std::string upper(std::string_view value) { @@ -125,6 +128,15 @@ Pad::InputBinding parseBinding(const InputAction& action, std::string_view sourc if (action.control == Pad::InputControl::ShowPadStatus) { throw std::runtime_error("ShowPadStatus can only use a keyboard key"); } + if (action.control == Pad::InputControl::VolumeUp) { + throw std::runtime_error("VolumeUp can only use a keyboard key"); + } + if (action.control == Pad::InputControl::VolumeDown) { + throw std::runtime_error("VolumeDown can only use a keyboard key"); + } + if (action.control == Pad::InputControl::ToggleMute) { + throw std::runtime_error("ToggleMute can only use a keyboard key"); + } return {SDL_SCANCODE_UNKNOWN, parseMouseButton(value), action.control, action.button, 0}; } if (type == "WHEEL") { @@ -149,7 +161,8 @@ enum class InputSetting { MouseDecayMs, StickModifierScale, KeyboardRampMs, - TriggerRampMs + TriggerRampMs, + MouseControlsRightStick }; struct InputSettingName { @@ -169,7 +182,8 @@ constexpr auto settingNames = std::array{ InputSettingName{"MouseDecayMs", InputSetting::MouseDecayMs}, InputSettingName{"StickModifierScale", InputSetting::StickModifierScale}, InputSettingName{"KeyboardRampMs", InputSetting::KeyboardRampMs}, - InputSettingName{"TriggerRampMs", InputSetting::TriggerRampMs} + InputSettingName{"TriggerRampMs", InputSetting::TriggerRampMs}, + InputSettingName{"MouseStickTarget", InputSetting::MouseControlsRightStick} }; const InputSettingName* findSetting(std::string_view name) { @@ -216,6 +230,13 @@ double parseNumber(std::string_view value, std::string_view name, double minimum return parsed; } +int parseStickId(std::string_view value) { + const auto normalized = upper(value); + if (normalized == "LEFT") return 0; + if (normalized == "RIGHT") return 1; + throw std::runtime_error("mouse target stick must be LEFT or RIGHT"); +} + void applySetting(Pad::InputSettings& settings, InputSetting setting, std::string_view value) { switch (setting) { case InputSetting::LeftStickDeadzone: settings.leftStickDeadzonePercent = parseDeadzonePercent(value); break; @@ -230,6 +251,7 @@ void applySetting(Pad::InputSettings& settings, InputSetting setting, std::strin case InputSetting::StickModifierScale: settings.stickModifierScale = parseNumber(value, "stick modifier scale", 0.05, 1.0); break; case InputSetting::KeyboardRampMs: settings.keyboardRampMs = parseNumber(value, "keyboard ramp", 0.0, 2000.0); break; case InputSetting::TriggerRampMs: settings.triggerRampMs = parseNumber(value, "trigger ramp", 0.0, 2000.0); break; + case InputSetting::MouseControlsRightStick: settings.mouseControlsRightStick = (parseStickId(value) == 1); break; } } diff --git a/core/libs/prx/libSceVideoOut/src/KeyboardMouse.cpp b/core/libs/prx/libSceVideoOut/src/KeyboardMouse.cpp index ef30002a28..3a4f9dac35 100644 --- a/core/libs/prx/libSceVideoOut/src/KeyboardMouse.cpp +++ b/core/libs/prx/libSceVideoOut/src/KeyboardMouse.cpp @@ -265,6 +265,9 @@ Pad::InputRequests Pad::KeyboardMouse::HandleEvent(const SDL_Event& event, Clock if (binding.control == InputControl::TogglePerformanceOverlay && keyboard && down && !pressed[index]) requests.togglePerformanceOverlay = true; if (binding.control == InputControl::Screenshot && keyboard && down && !pressed[index]) requests.screenshot = true; if (binding.control == InputControl::ShowPadStatus && keyboard && down && !pressed[index]) requests.showPadStatus = true; + if (binding.control == InputControl::VolumeUp && keyboard && down && !pressed[index]) requests.volumeUp = true; + if (binding.control == InputControl::VolumeDown && keyboard && down && !pressed[index]) requests.volumeDown = true; + if (binding.control == InputControl::ToggleMute && keyboard && down && !pressed[index]) requests.toggleMute = true; if (binding.control == InputControl::ToggleMouse && down && !pressed[index]) requests.toggleMouse = true; pressed[index] = down; } @@ -306,6 +309,9 @@ PadInputState Pad::KeyboardMouse::Compose(const PadInputState& controller) const case InputControl::TogglePerformanceOverlay: break; case InputControl::Screenshot: break; case InputControl::ShowPadStatus: break; + case InputControl::VolumeUp: break; + case InputControl::VolumeDown: break; + case InputControl::ToggleMute: break; } } const auto input = stickInput(); @@ -315,8 +321,9 @@ PadInputState Pad::KeyboardMouse::Compose(const PadInputState& controller) const } if (mouseMode) { const auto deflection = mouse.Deflection(); - state.sticks[2] = StickByte(deflection[0]); - state.sticks[3] = StickByte(deflection[1]); + const std::size_t offset = configuration.settings.mouseControlsRightStick ? 2 : 0; + state.sticks[offset] = StickByte(deflection[0]); + state.sticks[offset + 1] = StickByte(deflection[1]); } if (configuration.settings.triggerRampMs > 0.0) { state.analogButtonsL2 = std::max(state.analogButtonsL2, triggerByte(triggerAxes[0])); diff --git a/core/libs/prx/libSceVideoOut/src/PadInput.cpp b/core/libs/prx/libSceVideoOut/src/PadInput.cpp index 4a3c1b8185..57bc24695c 100644 --- a/core/libs/prx/libSceVideoOut/src/PadInput.cpp +++ b/core/libs/prx/libSceVideoOut/src/PadInput.cpp @@ -23,15 +23,20 @@ #include "prx/libc/include/General.hpp" #include "prx/libSceIme/include/ImeInput.hpp" #include "prx/libSceIme/include/ModalDialog.hpp" +#include "prx/libSceVideoOut/include/HostVolumeInput.hpp" +#include "prx/libScePad/include/HostVolumeSettings.hpp" PadInput::PadInput() : PadInput(Pad::LoadInputMapping()) { + HostVolumeConfigureFromEnvironment_nid_no_patch(); } static_assert(PAD_MAX_CONTROLLERS == AgcDriver::PadStatusSlots, "the pad status panel lists one line per controller slot"); -PadInput::PadInput(Pad::InputConfiguration configuration) : keyboardMouse(std::move(configuration)), statusProvider{[this] { return statusSnapshot(); }} { +PadInput::PadInput(Pad::InputConfiguration configuration) : keyboardMouse(std::move(configuration)), statusProvider{[this] { return statusSnapshot(); }}, port0Mode(Port0Presence::ConfiguredMode()), port0(port0Mode, false) { static_cast(Pad::RumblePercent()); openAvailableControllers(); + port0 = Port0Presence::Presence(port0Mode, slots[0].controller != nullptr); + if (port0Mode == Port0Presence::Mode::Controller) applyPort0(port0.Connected()); } PadInput::~PadInput() { @@ -91,8 +96,10 @@ void PadInput::openController(int deviceIndex) { SDL_GameControllerHasSensor(gc, SDL_SENSOR_ACCEL) == SDL_TRUE, SDL_GameControllerHasSensor(gc, SDL_SENSOR_GYRO) == SDL_TRUE, SDL_GameControllerGetNumTouchpads(gc), SDL_GameControllerHasLED(gc) == SDL_TRUE, SDL_GameControllerHasRumbleTriggers(gc) == SDL_TRUE); enableSensors(slot); - PadSetPortConnected_nid_postfix(slot, true); - UserServiceSetUserConnected_nid_postfix(slot, true); + if (slot > 0) { + PadSetPortConnected_nid_postfix(slot, true); + UserServiceSetUserConnected_nid_postfix(slot, true); + } } void PadInput::enableSensors(int slot) { @@ -139,6 +146,15 @@ void PadInput::reportStatus() { AgcDriverPadStatusPoll_nid_postfix(&statusProvider); } +void PadInput::applyPort0(bool connected) { + PadSetPortConnected_nid_postfix(0, connected); + UserServiceSetUserConnected_nid_postfix(0, connected); +} + +void PadInput::updatePort0() { + if (const auto change = port0.Observe(slots[0].controller != nullptr, std::chrono::steady_clock::now())) applyPort0(*change); +} + void PadInput::applyOutput() { for (int slot = 0; slot < PAD_MAX_CONTROLLERS; ++slot) { PadOutputState fetched; @@ -310,6 +326,8 @@ void PadInput::HandleEvent(const SDL_Event& event, DisplayWindow& window) { } if (event.type == SDL_WINDOWEVENT) { if (keyboardMouse.HandleEvent(event, std::chrono::steady_clock::now()).releaseMouse) setMouseMode(false); + HostVolume volume; + if (window.Handle() != nullptr && ApplyHostFocusEvent(event, SDL_GetWindowID(window.Handle()), &volume)) APS5_LOG_ERR("%s", HostVolumeMessage(volume).c_str()); publish(window.FrameNumber(), 0); return; } @@ -330,11 +348,20 @@ void PadInput::HandleEvent(const SDL_Event& event, DisplayWindow& window) { AgcDriverPadStatusShow_nid_postfix(); reportStatus(); } + if (window.Handle() != nullptr && event.key.windowID == SDL_GetWindowID(window.Handle())) { + HostVolume volume; + if (ApplyHostVolumeRequests(requests, &volume)) APS5_LOG_ERR("%s", HostVolumeMessage(volume).c_str()); + } if (requests.toggleMouse) setMouseMode(!keyboardMouse.MouseMode()); if (event.type != SDL_MOUSEMOTION) publish(window.FrameNumber(), 0); } void PadInput::Update(const DisplayWindow& window) { + if (!hostFocusSynced && window.Handle() != nullptr) { + hostFocusSynced = true; + HostVolume volume; + if (HostVolumeFocus_nid_no_patch(SDL_GetKeyboardFocus() == window.Handle(), &volume)) APS5_LOG_ERR("%s", HostVolumeMessage(volume).c_str()); + } bool anyController = false; for (int slot = 0; slot < PAD_MAX_CONTROLLERS; ++slot) { if (slots[slot].controller != nullptr) { @@ -343,6 +370,7 @@ void PadInput::Update(const DisplayWindow& window) { } } if (anyController) SDL_GameControllerUpdate(); + updatePort0(); reportStatus(); applyOutput(); for (int slot = 0; slot < PAD_MAX_CONTROLLERS; ++slot) { @@ -357,7 +385,9 @@ void PadInput::Update(const DisplayWindow& window) { return; } const bool changed = keyboardMouse.Advance(std::chrono::steady_clock::now()); - if (slots[0].controller != nullptr || keyboardMouse.MouseMode() || changed) { + const bool captured = ImeCapturesPad_nid_postfix() || ModalDialogCapturesInput_nid_postfix(); + const bool captureChanged = std::exchange(padCaptured, captured) != captured; + if (slots[0].controller != nullptr || keyboardMouse.MouseMode() || changed || captured || captureChanged) { publish(window.FrameNumber(), 0); } for (int slot = 1; slot < PAD_MAX_CONTROLLERS; ++slot) { @@ -377,6 +407,7 @@ PadInputState PadInput::handOff(int slot, PadInputState state) { auto& held = slots[slot].heldThroughCapture; const bool imeCaptures = ImeCapturesPad_nid_postfix(); if (imeCaptures || ModalDialogCapturesInput_nid_postfix()) { + if (slot == 0) PadApplyInjectedInput_nid_postfix(&state); if (slot == 0 && imeCaptures) ImePublishPad_nid_postfix({state.buttons, state.sticks[0], state.sticks[1], state.analogButtonsL2}); else if (slot == 0) ModalDialogPublishPad_nid_postfix({state.buttons, state.sticks[0], state.sticks[1], state.analogButtonsL2}); held = state.buttons; @@ -396,7 +427,8 @@ PadInputState PadInput::handOff(int slot, PadInputState state) { void PadInput::publish(std::uint64_t frame, int slot) { if (slot < 0 || slot >= PAD_MAX_CONTROLLERS) return; if (slot == 0) { - const auto state = handOff(0, keyboardMouse.Compose(slots[0].state)); + const auto composed = port0.Connected() ? keyboardMouse.Compose(slots[0].state) : PadInputState{}; + const auto state = handOff(0, composed); PadPublishInput_nid_postfix(state); if (auto* telemetry = VideoOutTelemetry::Instance(); telemetry != nullptr) VideoOutTelemetry::EmitPadIfChanged(*telemetry, telemetryFilter, frame, state); } else { diff --git a/core/libs/prx/libSceVideoOut/tests/HostVolumeInput.cpp b/core/libs/prx/libSceVideoOut/tests/HostVolumeInput.cpp new file mode 100644 index 0000000000..fc2d4c8a06 --- /dev/null +++ b/core/libs/prx/libSceVideoOut/tests/HostVolumeInput.cpp @@ -0,0 +1,140 @@ +#include "prx/libSceVideoOut/include/HostVolumeInput.hpp" + +#include +#include +#include + +namespace { + +SDL_Event windowEvent(Uint32 windowId, Uint8 kind) { + SDL_Event event{}; + event.type = SDL_WINDOWEVENT; + event.window.windowID = windowId; + event.window.event = kind; + return event; +} + +void require(bool condition, const char* message) { + if (!condition) throw std::runtime_error(message); +} + +void noRequestChangesNothing() { + HostVolumeConfigure_nid_no_patch(nullptr, nullptr); + HostVolume after; + require(!ApplyHostVolumeRequests(Pad::InputRequests{}, &after), "an empty request set asks for nothing"); + require(HostVolumeGain_nid_no_patch() == HostVolume::UnityGain, "an empty request set leaves unity"); + require(after.Volume() == 100 && !after.Muted(), "the out parameter is untouched without a request"); +} + +void volumeRequestsMoveTheVolume() { + HostVolumeConfigure_nid_no_patch(nullptr, nullptr); + HostVolume after; + Pad::InputRequests down; + down.volumeDown = true; + require(ApplyHostVolumeRequests(down, &after), "a volume down request is handled"); + require(after.Volume() == 95 && HostVolumeGain_nid_no_patch() == after.Gain(), "volume down lowers the shared volume by one step"); + Pad::InputRequests up; + up.volumeUp = true; + require(ApplyHostVolumeRequests(up, &after), "a volume up request is handled"); + require(after.Volume() == 100 && HostVolumeGain_nid_no_patch() == HostVolume::UnityGain, "volume up returns to exactly unity"); + require(ApplyHostVolumeRequests(up, &after), "a volume up request at the top is still handled"); + require(after.Volume() == 100, "volume up at the top stays at 100"); +} + +void muteRequestToggles() { + HostVolumeConfigure_nid_no_patch(nullptr, nullptr); + HostVolume after; + Pad::InputRequests mute; + mute.toggleMute = true; + require(ApplyHostVolumeRequests(mute, &after) && after.Muted() && HostVolumeGain_nid_no_patch() == 0, "the first mute request silences the output"); + require(ApplyHostVolumeRequests(mute, &after) && !after.Muted() && HostVolumeGain_nid_no_patch() == HostVolume::UnityGain, "the second mute request restores the output"); +} + +void requestsRunInOrder() { + HostVolumeConfigure_nid_no_patch(nullptr, nullptr); + HostVolume after; + Pad::InputRequests all; + all.volumeUp = true; + all.volumeDown = true; + all.toggleMute = true; + require(ApplyHostVolumeRequests(all, &after), "a combined request is handled"); + require(after.Volume() == 95 && after.Muted(), "up, then down, then mute leaves 95 muted"); +} + +void otherRequestsAreIgnored() { + HostVolumeConfigure_nid_no_patch(nullptr, nullptr); + HostVolume after; + Pad::InputRequests other; + other.toggleFullscreen = true; + other.togglePerformanceOverlay = true; + other.screenshot = true; + other.toggleMouse = true; + other.releaseMouse = true; + require(!ApplyHostVolumeRequests(other, &after), "the other host requests are not volume requests"); + require(HostVolumeGain_nid_no_patch() == HostVolume::UnityGain, "the other host requests leave the volume alone"); +} + +void focusIsIgnoredByDefault() { + HostVolumeConfigure_nid_no_patch(nullptr, nullptr); + HostVolume after; + require(!ApplyHostFocusEvent(windowEvent(7, SDL_WINDOWEVENT_FOCUS_LOST), 7, &after), "losing focus changes nothing by default"); + require(HostVolumeGain_nid_no_patch() == HostVolume::UnityGain, "the gain stays at unity without the option"); + require(!ApplyHostFocusEvent(windowEvent(7, SDL_WINDOWEVENT_FOCUS_GAINED), 7, &after), "gaining focus changes nothing by default"); + require(HostVolumeGain_nid_no_patch() == HostVolume::UnityGain, "the gain is still unity"); +} + +void focusLossMutesAndGainRestores() { + HostVolumeConfigure_nid_no_patch(nullptr, "1"); + HostVolume after; + require(ApplyHostFocusEvent(windowEvent(7, SDL_WINDOWEVENT_FOCUS_LOST), 7, &after), "losing focus with the option on is a change"); + require(after.FocusMuted() && HostVolumeGain_nid_no_patch() == 0, "the output goes silent"); + require(!ApplyHostFocusEvent(windowEvent(7, SDL_WINDOWEVENT_FOCUS_LOST), 7, &after), "a second focus lost is not a change"); + require(ApplyHostFocusEvent(windowEvent(7, SDL_WINDOWEVENT_FOCUS_GAINED), 7, &after), "gaining focus is a change"); + require(!after.FocusMuted() && HostVolumeGain_nid_no_patch() == HostVolume::UnityGain, "the output returns to exactly unity"); +} + +void otherWindowEventsAreIgnored() { + HostVolumeConfigure_nid_no_patch(nullptr, "1"); + HostVolume after; + for (const Uint8 kind : {SDL_WINDOWEVENT_MINIMIZED, SDL_WINDOWEVENT_RESTORED, SDL_WINDOWEVENT_HIDDEN, SDL_WINDOWEVENT_SHOWN, SDL_WINDOWEVENT_CLOSE, SDL_WINDOWEVENT_RESIZED, SDL_WINDOWEVENT_ENTER, SDL_WINDOWEVENT_LEAVE}) { + require(!ApplyHostFocusEvent(windowEvent(7, kind), 7, &after), "a window event that is not a focus event changes nothing"); + } + require(HostVolumeGain_nid_no_patch() == HostVolume::UnityGain, "none of them silenced the output"); + require(!ApplyHostFocusEvent(windowEvent(8, SDL_WINDOWEVENT_FOCUS_LOST), 7, &after), "another window losing focus changes nothing"); + SDL_Event key{}; + key.type = SDL_KEYDOWN; + key.key.windowID = 7; + require(!ApplyHostFocusEvent(key, 7, &after), "a key event is not a focus event"); + require(HostVolumeGain_nid_no_patch() == HostVolume::UnityGain, "the output is still at unity"); +} + +void focusMuteKeepsTheUsersMute() { + HostVolumeConfigure_nid_no_patch(nullptr, "1"); + HostVolume after; + Pad::InputRequests mute; + mute.toggleMute = true; + ApplyHostVolumeRequests(mute, &after); + ApplyHostFocusEvent(windowEvent(7, SDL_WINDOWEVENT_FOCUS_LOST), 7, &after); + ApplyHostFocusEvent(windowEvent(7, SDL_WINDOWEVENT_FOCUS_GAINED), 7, &after); + require(after.Muted() && HostVolumeGain_nid_no_patch() == 0, "regaining focus does not undo the user's mute"); +} + +} + +int main() try { + noRequestChangesNothing(); + volumeRequestsMoveTheVolume(); + muteRequestToggles(); + requestsRunInOrder(); + otherRequestsAreIgnored(); + focusIsIgnoredByDefault(); + focusLossMutesAndGainRestores(); + otherWindowEventsAreIgnored(); + focusMuteKeepsTheUsersMute(); + HostVolumeConfigure_nid_no_patch(nullptr, nullptr); + std::puts("host volume input tests passed"); + return 0; +} catch (const std::exception& error) { + std::fprintf(stderr, "%s\n", error.what()); + return 1; +} diff --git a/core/libs/prx/libSceVideoOut/tests/InputMapping.cpp b/core/libs/prx/libSceVideoOut/tests/InputMapping.cpp index de5a498615..110347f749 100644 --- a/core/libs/prx/libSceVideoOut/tests/InputMapping.cpp +++ b/core/libs/prx/libSceVideoOut/tests/InputMapping.cpp @@ -1,4 +1,5 @@ #include "prx/libScePad/include/InputMapping.hpp" +#include #include #include #include @@ -9,6 +10,7 @@ #include #include #include +#include namespace { @@ -46,6 +48,18 @@ bool rejects(const std::string& text) { return false; } +std::vector keysFor(Pad::InputControl control) { + std::vector keys; + for (const auto& binding : Pad::LoadInputMapping().bindings) { + if (binding.control == control && binding.key != SDL_SCANCODE_UNKNOWN) keys.push_back(binding.key); + } + return keys; +} + +bool hasKey(const std::vector& keys, SDL_Scancode key) { + return std::find(keys.begin(), keys.end(), key) != keys.end(); +} + std::uint8_t plainStickByte(std::int16_t axis) { return static_cast(((static_cast(axis) + 32768) * 255 + 32767) / 65535); } @@ -132,7 +146,7 @@ void padStatusBinding() { } require(padStatus == 1, "the pad status has more than one default input"); require(onF9 == 1, "another default binding uses F9"); - require(Pad::InputMapping.size() == 40, "the default bindings changed besides the pad status key"); + require(Pad::InputMapping.size() == 43, "the default bindings changed besides the pad status and host volume keys"); useConfig("ShowPadStatus = KEY:F4\n"); const auto moved = Pad::LoadInputMapping(); require(padStatusBindingsOn(moved, SDL_SCANCODE_F4) == 1 && padStatusBindingsOn(moved, SDL_SCANCODE_F9) == 0, "the pad status key moves to another key"); @@ -167,15 +181,131 @@ void padStatusConflicts() { require(padStatusBindingsOn(swapped, SDL_SCANCODE_F4) == 1 && padStatusBindingsOn(swapped, SDL_SCANCODE_F9) == 0, "moving the pad status key off F9 keeps it off"); } +void volumeUpAction() { + useConfig("volumeup = KEY:F2\nVolumeUp = KEY:F3\n"); + const auto keys = keysFor(Pad::InputControl::VolumeUp); + require(keys.size() == 2 && hasKey(keys, SDL_SCANCODE_F2) && hasKey(keys, SDL_SCANCODE_F3), "VolumeUp takes a first key and an alternate, case-insensitively"); + useConfig("VolumeUp = KEY:F2\nVolumeUp = KEY:F2\n"); + const auto duplicated = keysFor(Pad::InputControl::VolumeUp); + require(duplicated.size() == 1 && duplicated[0] == SDL_SCANCODE_F2, "a duplicate VolumeUp line is ignored"); + require(rejects("VolumeUp = MOUSE:Left\n"), "VolumeUp refuses a mouse button"); + require(rejects("VolumeUp = MOUSE:X1\n"), "VolumeUp refuses another mouse button"); + require(rejects("VolumeUp = WHEEL:Up\n"), "VolumeUp refuses the mouse wheel"); + require(rejects("VolumeUp = KEY:NoSuchKey\n"), "VolumeUp refuses an unknown key name"); + require(rejects("VolumeUp =\n"), "VolumeUp refuses an empty source"); + require(rejects("VolumeUp = F2\n"), "VolumeUp refuses a source without a type"); +} + +void volumeDownAction() { + useConfig("volumedown = KEY:F2\nVolumeDown = KEY:F3\n"); + const auto keys = keysFor(Pad::InputControl::VolumeDown); + require(keys.size() == 2 && hasKey(keys, SDL_SCANCODE_F2) && hasKey(keys, SDL_SCANCODE_F3), "VolumeDown takes a first key and an alternate, case-insensitively"); + useConfig("VolumeDown = KEY:F2\nVolumeDown = KEY:F2\n"); + const auto duplicated = keysFor(Pad::InputControl::VolumeDown); + require(duplicated.size() == 1 && duplicated[0] == SDL_SCANCODE_F2, "a duplicate VolumeDown line is ignored"); + require(rejects("VolumeDown = MOUSE:Left\n"), "VolumeDown refuses a mouse button"); + require(rejects("VolumeDown = MOUSE:X1\n"), "VolumeDown refuses another mouse button"); + require(rejects("VolumeDown = WHEEL:Up\n"), "VolumeDown refuses the mouse wheel"); + require(rejects("VolumeDown = KEY:NoSuchKey\n"), "VolumeDown refuses an unknown key name"); + require(rejects("VolumeDown =\n"), "VolumeDown refuses an empty source"); + require(rejects("VolumeDown = F2\n"), "VolumeDown refuses a source without a type"); +} + +void toggleMuteAction() { + useConfig("togglemute = KEY:F2\nToggleMute = KEY:F3\n"); + const auto keys = keysFor(Pad::InputControl::ToggleMute); + require(keys.size() == 2 && hasKey(keys, SDL_SCANCODE_F2) && hasKey(keys, SDL_SCANCODE_F3), "ToggleMute takes a first key and an alternate, case-insensitively"); + useConfig("ToggleMute = KEY:F2\nToggleMute = KEY:F2\n"); + const auto duplicated = keysFor(Pad::InputControl::ToggleMute); + require(duplicated.size() == 1 && duplicated[0] == SDL_SCANCODE_F2, "a duplicate ToggleMute line is ignored"); + require(rejects("ToggleMute = MOUSE:Left\n"), "ToggleMute refuses a mouse button"); + require(rejects("ToggleMute = MOUSE:X1\n"), "ToggleMute refuses another mouse button"); + require(rejects("ToggleMute = WHEEL:Up\n"), "ToggleMute refuses the mouse wheel"); + require(rejects("ToggleMute = KEY:NoSuchKey\n"), "ToggleMute refuses an unknown key name"); + require(rejects("ToggleMute =\n"), "ToggleMute refuses an empty source"); + require(rejects("ToggleMute = F2\n"), "ToggleMute refuses a source without a type"); +} + +void volumeDownDefault() { + useConfig("Cross = KEY:F\n"); + const auto keys = keysFor(Pad::InputControl::VolumeDown); + require(keys.size() == 1 && keys[0] == SDL_SCANCODE_F5, "F5 is the only default VolumeDown key"); + useConfig("VolumeDown = KEY:F2\n"); + const auto moved = keysFor(Pad::InputControl::VolumeDown); + require(moved.size() == 1 && moved[0] == SDL_SCANCODE_F2, "a VolumeDown line replaces the built-in key"); +} + +void volumeUpDefault() { + useConfig("Cross = KEY:F\n"); + const auto keys = keysFor(Pad::InputControl::VolumeUp); + require(keys.size() == 1 && keys[0] == SDL_SCANCODE_F6, "F6 is the only default VolumeUp key"); + useConfig("VolumeUp = KEY:F2\n"); + const auto moved = keysFor(Pad::InputControl::VolumeUp); + require(moved.size() == 1 && moved[0] == SDL_SCANCODE_F2, "a VolumeUp line replaces the built-in key"); +} + +void toggleMuteDefault() { + useConfig("Cross = KEY:F\n"); + const auto keys = keysFor(Pad::InputControl::ToggleMute); + require(keys.size() == 1 && keys[0] == SDL_SCANCODE_F8, "F8 is the only default ToggleMute key"); + useConfig("ToggleMute = KEY:F2\n"); + const auto moved = keysFor(Pad::InputControl::ToggleMute); + require(moved.size() == 1 && moved[0] == SDL_SCANCODE_F2, "a ToggleMute line replaces the built-in key"); +} + +void hostVolumeDefaultsDoNotCollide() { + useConfig("MouseSensitivity = 1\n"); + std::vector seen; + for (const auto& binding : Pad::LoadInputMapping().bindings) { + if (binding.key == SDL_SCANCODE_UNKNOWN) continue; + require(!hasKey(seen, binding.key), "no built-in key is bound twice"); + seen.push_back(binding.key); + } + for (const auto key : {SDL_SCANCODE_F5, SDL_SCANCODE_F6, SDL_SCANCODE_F8}) require(hasKey(seen, key), "every host volume key is bound by default"); + for (const auto control : {Pad::InputControl::VolumeUp, Pad::InputControl::VolumeDown, Pad::InputControl::ToggleMute}) { + for (const auto& binding : Pad::LoadInputMapping().bindings) { + if (binding.control != control) continue; + require(binding.button == Pad::PadButton::None && binding.mouseButton == Pad::MouseButton::None && binding.wheelDirection == 0, "a host volume binding is a plain keyboard key"); + } + } +} + +void hostVolumeSharedKeysAreKept() { + useConfig("VolumeUp = KEY:F10\nToggleMute = KEY:Return\n"); + const auto configuration = Pad::LoadInputMapping(); + bool upOnF10 = false; + bool overlayOnF10 = false; + bool muteOnReturn = false; + bool crossOnReturn = false; + for (const auto& binding : configuration.bindings) { + upOnF10 = upOnF10 || (binding.control == Pad::InputControl::VolumeUp && binding.key == SDL_SCANCODE_F10); + overlayOnF10 = overlayOnF10 || (binding.control == Pad::InputControl::TogglePerformanceOverlay && binding.key == SDL_SCANCODE_F10); + muteOnReturn = muteOnReturn || (binding.control == Pad::InputControl::ToggleMute && binding.key == SDL_SCANCODE_RETURN); + crossOnReturn = crossOnReturn || (binding.control == Pad::InputControl::Button && binding.button == Pad::PadButton::Cross && binding.key == SDL_SCANCODE_RETURN); + } + require(upOnF10 && overlayOnF10, "a key shared with another host action keeps both bindings, as for the existing actions"); + require(muteOnReturn && crossOnReturn, "a key shared with a pad button keeps both bindings, as for the existing actions"); +} + +void hostVolumeActionNamesAreExact() { + require(rejects("VolumeMute = KEY:F2\n"), "an unknown volume action name is rejected"); + require(rejects("Volume = KEY:F2\n"), "a bare Volume action is rejected"); + require(rejects("Mute = KEY:F2\n"), "a bare Mute action is rejected"); + require(rejects("VolumeUp2 = KEY:F2\n"), "a suffixed volume action name is rejected"); + useConfig(" VOLUMEUP\t=\tKEY:F2 # louder\nvolumedown=KEY:F3;quieter\n"); + require(!keysFor(Pad::InputControl::VolumeUp).empty() && !keysFor(Pad::InputControl::VolumeDown).empty(), "names ignore case, spacing and trailing comments"); +} + void mouseLookDefault() { useConfig("Cross = KEY:F\n"); const auto settings = Pad::LoadInputMapping().settings; require(settings.mouseVerticalScale == 1.0 && settings.mouseCurve == 1.0 && settings.mouseMaxSpeed == 1.0, "mouse look scales default to 1"); require(settings.mouseDeadzoneOffset == 0.2 && settings.mouseSmoothingMs == 10.0 && settings.mouseDecayMs == 30.0, "mouse look timing and offset defaults"); + require(settings.mouseControlsRightStick, "mouse look targets the right stick by default"); } void mouseLookParse() { - useConfig("MouseCurve=0.7 ; softer start\nmousedeadzoneoffset = 0.15\nMouseMaxSpeed = 1.5\nMouseSmoothingMs = 0\nMouseDecayMs = 50\nMouseVerticalScale = 0.5\n"); + useConfig("MouseCurve=0.7 ; softer start\nmousedeadzoneoffset = 0.15\nMouseMaxSpeed = 1.5\nMouseSmoothingMs = 0\nMouseDecayMs = 50\nMouseVerticalScale = 0.5\nMouseStickTarget = Left\n"); const auto settings = Pad::LoadInputMapping().settings; require(settings.mouseCurve == 0.7, "mouse curve is read"); require(settings.mouseDeadzoneOffset == 0.15, "mouse deadzone offset is read case-insensitively"); @@ -183,6 +313,9 @@ void mouseLookParse() { require(settings.mouseSmoothingMs == 0.0, "a 0 smoothing is accepted"); require(settings.mouseDecayMs == 50.0, "mouse decay is read"); require(settings.mouseVerticalScale == 0.5, "mouse vertical scale is read"); + require(!settings.mouseControlsRightStick, "mouse stick target is read"); + useConfig("mousesticktarget = RIGHT\n"); + require(Pad::LoadInputMapping().settings.mouseControlsRightStick, "mouse stick target is read case-insensitively"); } void mouseLookReject() { @@ -195,6 +328,9 @@ void mouseLookReject() { require(rejects("MouseMaxSpeed = nan\n"), "a non-finite max speed is rejected"); require(rejects("MouseVerticalScale = 11\n"), "a vertical scale above 10 is rejected"); require(rejects("MouseDecayMs = 20\nmousedecayms = 30\n"), "a mouse setting given twice is rejected"); + require(rejects("MouseStickTarget = Center\n"), "an invalid stick target is rejected"); + require(rejects("MouseStickTarget =\n"), "an empty mouse stick target is rejected"); + require(rejects("MouseStickTarget = Left\nMouseStickTarget = Right\n"), "a mouse stick target given twice is rejected"); } void nonAsciiPaths() { @@ -332,6 +468,15 @@ int main() try { screenshotBinding(); padStatusBinding(); padStatusConflicts(); + toggleMuteAction(); + toggleMuteDefault(); + hostVolumeDefaultsDoNotCollide(); + hostVolumeSharedKeysAreKept(); + hostVolumeActionNamesAreExact(); + volumeDownAction(); + volumeDownDefault(); + volumeUpAction(); + volumeUpDefault(); mouseLookDefault(); mouseLookParse(); mouseLookReject(); diff --git a/core/libs/prx/libSceVideoOut/tests/KeyboardMouse.cpp b/core/libs/prx/libSceVideoOut/tests/KeyboardMouse.cpp index 4ec011cf4e..4ca8c6d956 100644 --- a/core/libs/prx/libSceVideoOut/tests/KeyboardMouse.cpp +++ b/core/libs/prx/libSceVideoOut/tests/KeyboardMouse.cpp @@ -503,6 +503,84 @@ void testShowPadStatus() { check(both.showPadStatus && both.togglePerformanceOverlay, "a key shared with the overlay does not do both"); } +void testVolumeUpRequest() { + auto configuration = defaults(); + configuration.bindings.push_back(Pad::InputBinding{SDL_SCANCODE_F5, Pad::MouseButton::None, Pad::InputControl::VolumeUp}); + Pad::KeyboardMouse keyboardMouse(configuration); + const auto now = Pad::KeyboardMouse::Clock::now(); + const auto down = keyboardMouse.HandleEvent(KeyEvent(SDL_SCANCODE_F5, true), now); + check(down.volumeUp && !down.toggleFullscreen && !down.togglePerformanceOverlay && !down.screenshot, "a bound key asks for volume up"); + auto repeated = KeyEvent(SDL_SCANCODE_F5, true); + repeated.key.repeat = 1; + check(!keyboardMouse.HandleEvent(repeated, now).volumeUp, "a repeated key asks for nothing"); + check(!keyboardMouse.HandleEvent(KeyEvent(SDL_SCANCODE_F5, false), now).volumeUp, "releasing the key asks for nothing"); + check(keyboardMouse.HandleEvent(KeyEvent(SDL_SCANCODE_F5, true), now).volumeUp, "pressing it again asks again"); + keyboardMouse.HandleEvent(KeyEvent(SDL_SCANCODE_F5, false), now); + const auto state = keyboardMouse.Compose(PadInputState{}); + check(state.buttons == PadInputState{}.buttons && state.sticks == PadInputState{}.sticks, "the key never reaches the title's pad state"); +} + +void testVolumeDownRequest() { + auto configuration = defaults(); + configuration.bindings.push_back(Pad::InputBinding{SDL_SCANCODE_F6, Pad::MouseButton::None, Pad::InputControl::VolumeDown}); + Pad::KeyboardMouse keyboardMouse(configuration); + const auto now = Pad::KeyboardMouse::Clock::now(); + const auto down = keyboardMouse.HandleEvent(KeyEvent(SDL_SCANCODE_F6, true), now); + check(down.volumeDown && !down.toggleFullscreen && !down.togglePerformanceOverlay && !down.screenshot, "a bound key asks for volume down"); + auto repeated = KeyEvent(SDL_SCANCODE_F6, true); + repeated.key.repeat = 1; + check(!keyboardMouse.HandleEvent(repeated, now).volumeDown, "a repeated key asks for nothing"); + check(!keyboardMouse.HandleEvent(KeyEvent(SDL_SCANCODE_F6, false), now).volumeDown, "releasing the key asks for nothing"); + check(keyboardMouse.HandleEvent(KeyEvent(SDL_SCANCODE_F6, true), now).volumeDown, "pressing it again asks again"); + keyboardMouse.HandleEvent(KeyEvent(SDL_SCANCODE_F6, false), now); + const auto state = keyboardMouse.Compose(PadInputState{}); + check(state.buttons == PadInputState{}.buttons && state.sticks == PadInputState{}.sticks, "the key never reaches the title's pad state"); +} + +void testToggleMuteRequest() { + auto configuration = defaults(); + configuration.bindings.push_back(Pad::InputBinding{SDL_SCANCODE_F8, Pad::MouseButton::None, Pad::InputControl::ToggleMute}); + Pad::KeyboardMouse keyboardMouse(configuration); + const auto now = Pad::KeyboardMouse::Clock::now(); + const auto down = keyboardMouse.HandleEvent(KeyEvent(SDL_SCANCODE_F8, true), now); + check(down.toggleMute && !down.toggleFullscreen && !down.togglePerformanceOverlay && !down.screenshot, "a bound key asks for toggle mute"); + auto repeated = KeyEvent(SDL_SCANCODE_F8, true); + repeated.key.repeat = 1; + check(!keyboardMouse.HandleEvent(repeated, now).toggleMute, "a repeated key asks for nothing"); + check(!keyboardMouse.HandleEvent(KeyEvent(SDL_SCANCODE_F8, false), now).toggleMute, "releasing the key asks for nothing"); + check(keyboardMouse.HandleEvent(KeyEvent(SDL_SCANCODE_F8, true), now).toggleMute, "pressing it again asks again"); + keyboardMouse.HandleEvent(KeyEvent(SDL_SCANCODE_F8, false), now); + const auto state = keyboardMouse.Compose(PadInputState{}); + check(state.buttons == PadInputState{}.buttons && state.sticks == PadInputState{}.sticks, "the key never reaches the title's pad state"); +} + +void testVolumeDownDefaultKey() { + Pad::KeyboardMouse keyboardMouse(defaults()); + const auto now = Pad::KeyboardMouse::Clock::now(); + check(keyboardMouse.HandleEvent(KeyEvent(SDL_SCANCODE_F5, true), now).volumeDown, "F5 asks for VolumeDown with the built-in bindings"); + keyboardMouse.HandleEvent(KeyEvent(SDL_SCANCODE_F5, false), now); + const auto state = keyboardMouse.Compose(PadInputState{}); + check(state.buttons == PadInputState{}.buttons && state.sticks == PadInputState{}.sticks, "F5 does not reach the title's pad state"); +} + +void testVolumeUpDefaultKey() { + Pad::KeyboardMouse keyboardMouse(defaults()); + const auto now = Pad::KeyboardMouse::Clock::now(); + check(keyboardMouse.HandleEvent(KeyEvent(SDL_SCANCODE_F6, true), now).volumeUp, "F6 asks for VolumeUp with the built-in bindings"); + keyboardMouse.HandleEvent(KeyEvent(SDL_SCANCODE_F6, false), now); + const auto state = keyboardMouse.Compose(PadInputState{}); + check(state.buttons == PadInputState{}.buttons && state.sticks == PadInputState{}.sticks, "F6 does not reach the title's pad state"); +} + +void testToggleMuteDefaultKey() { + Pad::KeyboardMouse keyboardMouse(defaults()); + const auto now = Pad::KeyboardMouse::Clock::now(); + check(keyboardMouse.HandleEvent(KeyEvent(SDL_SCANCODE_F8, true), now).toggleMute, "F8 asks for ToggleMute with the built-in bindings"); + keyboardMouse.HandleEvent(KeyEvent(SDL_SCANCODE_F8, false), now); + const auto state = keyboardMouse.Compose(PadInputState{}); + check(state.buttons == PadInputState{}.buttons && state.sticks == PadInputState{}.sticks, "F8 does not reach the title's pad state"); +} + void testDefaultL2() { const auto l2 = static_cast(Pad::PadButton::L2); const auto r2 = static_cast(Pad::PadButton::R2); @@ -564,6 +642,35 @@ void testTitleReadsMouse() { check(keyboardMouse.Compose(PadInputState{}).sticks[2] > 128, "motion in mouse mode no longer tilts the stick once the title stops reading the mouse"); } +void testMouseStickTarget() { + auto configuration = defaults(); + check(configuration.settings.mouseControlsRightStick, "mouse must target right stick by default"); + const auto now = Pad::KeyboardMouse::Clock::now(); + PadInputState controller{}; + controller.sticks = {40, 75, 60, 90}; + Pad::KeyboardMouse keyboardMouseRight(configuration); + keyboardMouseRight.SetMouseMode(true); + keyboardMouseRight.Advance(now); + keyboardMouseRight.HandleEvent(PadSimulation::MotionEvent(100, 50), now); + keyboardMouseRight.Advance(now + std::chrono::milliseconds(10)); + const auto stateRight = keyboardMouseRight.Compose(controller); + check(stateRight.sticks[0] == 40, "mouse must preserve left stick X when targeting right stick"); + check(stateRight.sticks[1] == 75, "mouse must preserve left stick Y when targeting right stick"); + check(stateRight.sticks[2] > 128, "mouse must tilt right stick X when targeting right stick"); + check(stateRight.sticks[3] > 128, "mouse must tilt right stick Y when targeting right stick"); + configuration.settings.mouseControlsRightStick = false; + Pad::KeyboardMouse keyboardMouseLeft(configuration); + keyboardMouseLeft.SetMouseMode(true); + keyboardMouseLeft.Advance(now); + keyboardMouseLeft.HandleEvent(PadSimulation::MotionEvent(100, 50), now); + keyboardMouseLeft.Advance(now + std::chrono::milliseconds(10)); + const auto stateLeft = keyboardMouseLeft.Compose(controller); + check(stateLeft.sticks[0] > 128, "mouse must tilt left stick X when targeting left stick"); + check(stateLeft.sticks[1] > 128, "mouse must tilt left stick Y when targeting left stick"); + check(stateLeft.sticks[2] == 60, "mouse must preserve right stick X when targeting left stick"); + check(stateLeft.sticks[3] == 90, "mouse must preserve right stick Y when targeting left stick"); +} + } int main() { @@ -591,8 +698,15 @@ int main() { {"shake", testShake}, {"toggle requests", testToggleRequests}, {"show pad status", testShowPadStatus}, + {"volume up request", testVolumeUpRequest}, + {"volume down request", testVolumeDownRequest}, + {"toggle mute request", testToggleMuteRequest}, + {"VolumeDown default key", testVolumeDownDefaultKey}, + {"VolumeUp default key", testVolumeUpDefaultKey}, + {"ToggleMute default key", testToggleMuteDefaultKey}, {"default L2", testDefaultL2}, {"title reads the mouse", testTitleReadsMouse}, + {"mouse stick target", testMouseStickTarget} }; for (const auto& [name, test] : tests) { test(); diff --git a/core/libs/prx/libSceVideoOut/tests/PadPort0.cpp b/core/libs/prx/libSceVideoOut/tests/PadPort0.cpp new file mode 100644 index 0000000000..743d5f8b03 --- /dev/null +++ b/core/libs/prx/libSceVideoOut/tests/PadPort0.cpp @@ -0,0 +1,178 @@ +#include "SDL_config.h" +#include "SDL.h" +#include "SDL_joystick.h" +#include "SDL_gamecontroller.h" +#include "prx/libSceVideoOut/include/PadInput.hpp" +#include "prx/libSceVideoOut/include/DisplayWindow.hpp" +#include "prx/libScePad/include/PadInputTypes.hpp" +#include "prx/libScePad/include/PadState.hpp" +#include "prx/libSceUserService/UserService.hpp" +#include +#include +#include +#include +#undef main + +namespace { + +void Require(bool condition, const char* message) { + if (condition) return; + std::fprintf(stderr, "pad_port0: %s\n", message); + std::exit(1); +} + +void SetPort0State(const char* value) { +#ifdef _WIN32 + _putenv_s("ANYPS5_PAD_PORT0_STATE", value == nullptr ? "" : value); +#else + if (value == nullptr) unsetenv("ANYPS5_PAD_PORT0_STATE"); + else setenv("ANYPS5_PAD_PORT0_STATE", value, 1); +#endif +} + +bool User0LoggedIn() { + UserServiceLoginUserIdList list{}; + Require(sceUserServiceGetLoginUserIdList(&list) == USER_SERVICE_OK, "login list query failed"); + return list.user_id[0] == USER_SERVICE_INITIAL_USER_ID; +} + +void Send(PadInput& pad, DisplayWindow& window, Uint32 type, int which) { + SDL_Event event{}; + event.type = type; + event.cdevice.which = which; + pad.HandleEvent(event, window); +} + +void SendKey(PadInput& pad, DisplayWindow& window, Uint32 type, SDL_Scancode key) { + SDL_Event event{}; + event.type = type; + event.key.keysym.scancode = key; + pad.HandleEvent(event, window); +} + +bool CrossPressed() { + return (Pad::ReadState(0).buttons & static_cast(Pad::PadButton::Cross)) != 0; +} + +void Pump(PadInput& pad, DisplayWindow& window, std::chrono::milliseconds duration) { + const auto end = std::chrono::steady_clock::now() + duration; + do { + pad.Update(window); + std::this_thread::sleep_for(std::chrono::milliseconds{10}); + } while (std::chrono::steady_clock::now() < end); +} + +template +std::chrono::milliseconds PumpUntil(PadInput& pad, DisplayWindow& window, std::chrono::milliseconds limit, Predicate done) { + const auto start = std::chrono::steady_clock::now(); + while (!done()) { + Require(std::chrono::steady_clock::now() - start < limit, "the pad state did not change in time"); + pad.Update(window); + std::this_thread::sleep_for(std::chrono::milliseconds{10}); + } + return std::chrono::duration_cast(std::chrono::steady_clock::now() - start); +} + +void CheckDefaultKeepsPort0(DisplayWindow& window, int index, SDL_JoystickID id) { + SetPort0State(nullptr); + PadInput pad; + Require(pad.SlotOccupied(0), "the attached controller is bound to slot 0"); + Require(Pad::IsConnected(0), "default port 0 is connected with a controller"); + Send(pad, window, SDL_CONTROLLERDEVICEREMOVED, id); + Require(!pad.SlotOccupied(0), "the removal unbinds slot 0"); + Pump(pad, window, std::chrono::milliseconds{800}); + Require(Pad::IsConnected(0), "default port 0 stays connected after its controller is removed"); + Require(User0LoggedIn(), "default user 0 stays logged in after its controller is removed"); + Require(Pad::ReadState(0).connected, "default port 0 reads as connected after its controller is removed"); + Send(pad, window, SDL_CONTROLLERDEVICEADDED, index); + Require(pad.SlotOccupied(0), "the controller is bound to slot 0 again"); +} + +void CheckControllerModeFollowsTheController(DisplayWindow& window, int index, SDL_JoystickID id) { + SetPort0State("controller"); + PadInput pad; + Require(pad.SlotOccupied(0), "the attached controller is bound to slot 0 in controller mode"); + Require(Pad::IsConnected(0) && User0LoggedIn(), "controller mode starts with the controller present"); + + Send(pad, window, SDL_CONTROLLERDEVICEREMOVED, id); + Require(Pad::IsConnected(0), "a removal is not committed at once"); + const auto removed = PumpUntil(pad, window, std::chrono::seconds{5}, [] { return !Pad::IsConnected(0); }); + Require(removed >= std::chrono::milliseconds{450}, "the removal is committed only after the hold"); + Require(!User0LoggedIn(), "user 0 logs out with its controller"); + const PadData gone = Pad::ReadState(0); + Require(!gone.connected && gone.buttons == 0 && gone.left_stick_x == 0 && gone.left_stick_y == 0, "a withdrawn port 0 reads zeroed"); + + Send(pad, window, SDL_CONTROLLERDEVICEADDED, index); + Require(pad.SlotOccupied(0), "the controller is bound to slot 0 again"); + PumpUntil(pad, window, std::chrono::seconds{5}, [] { return Pad::IsConnected(0); }); + Require(User0LoggedIn(), "user 0 logs in with its controller"); + + Send(pad, window, SDL_CONTROLLERDEVICEREMOVED, id); + Pump(pad, window, std::chrono::milliseconds{100}); + Send(pad, window, SDL_CONTROLLERDEVICEADDED, index); + const auto end = std::chrono::steady_clock::now() + std::chrono::milliseconds{800}; + do { + pad.Update(window); + Require(Pad::IsConnected(0), "a controller that returns inside the hold does not flap port 0"); + std::this_thread::sleep_for(std::chrono::milliseconds{10}); + } while (std::chrono::steady_clock::now() < end); + Require(User0LoggedIn(), "user 0 stays logged in across a brief removal"); +} + +void CheckKeyboardStaysOutOfWithdrawnPort0(DisplayWindow& window, int index, SDL_JoystickID id) { + SetPort0State("controller"); + PadInput pad; + Require(Pad::IsConnected(0), "controller mode starts with the controller present"); + SendKey(pad, window, SDL_KEYDOWN, SDL_SCANCODE_SPACE); + Require(CrossPressed(), "a bound key reaches port 0 while the controller is present"); + SendKey(pad, window, SDL_KEYUP, SDL_SCANCODE_SPACE); + Require(!CrossPressed(), "releasing the key clears it on port 0"); + + Send(pad, window, SDL_CONTROLLERDEVICEREMOVED, id); + PumpUntil(pad, window, std::chrono::seconds{5}, [] { return !Pad::IsConnected(0); }); + Send(pad, window, SDL_CONTROLLERDEVICEADDED, index); + Pump(pad, window, std::chrono::milliseconds{460}); + SendKey(pad, window, SDL_KEYDOWN, SDL_SCANCODE_SPACE); + SendKey(pad, window, SDL_KEYUP, SDL_SCANCODE_SPACE); + PumpUntil(pad, window, std::chrono::seconds{5}, [] { return Pad::IsConnected(0); }); + Require(!CrossPressed(), "a key pressed while port 0 was withdrawn is not given to it when the controller returns"); +} + +} + +int main() { + Require(SDL_Init(SDL_INIT_GAMECONTROLLER | SDL_INIT_JOYSTICK) == 0, "SDL init failed"); + const int hostJoysticks = SDL_NumJoysticks(); + if (hostJoysticks < 0) { + std::fprintf(stderr, "pad_port0: SDL_NumJoysticks failed: %s\n", SDL_GetError()); + SDL_QuitSubSystem(SDL_INIT_GAMECONTROLLER | SDL_INIT_JOYSTICK); + return 1; + } + if (hostJoysticks > 0) { + std::fprintf(stderr, "pad_port0: skipped, SDL sees %d host joysticks, which take the pad slots this test checks\n", hostJoysticks); + SDL_QuitSubSystem(SDL_INIT_GAMECONTROLLER | SDL_INIT_JOYSTICK); + return 77; + } + + SDL_VirtualJoystickDesc desc{}; + desc.version = SDL_VIRTUAL_JOYSTICK_DESC_VERSION; + desc.type = SDL_JOYSTICK_TYPE_GAMECONTROLLER; + desc.naxes = 6; + desc.nbuttons = 16; + desc.name = "Virtual Controller 0"; + const int device = SDL_JoystickAttachVirtualEx(&desc); + Require(device >= 0 && SDL_IsGameController(device), "virtual controller attach failed"); + const SDL_JoystickID id = SDL_JoystickGetDeviceInstanceID(device); + + Require(sceUserServiceInitialize(nullptr) == USER_SERVICE_OK, "user service init failed"); + Pad::Initialize(); + DisplayWindow window; + CheckDefaultKeepsPort0(window, device, id); + CheckControllerModeFollowsTheController(window, device, id); + CheckKeyboardStaysOutOfWithdrawnPort0(window, device, id); + + SetPort0State(nullptr); + Require(SDL_JoystickDetachVirtual(device) == 0, "virtual controller detach failed"); + SDL_QuitSubSystem(SDL_INIT_GAMECONTROLLER | SDL_INIT_JOYSTICK); + return 0; +} diff --git a/core/libs/prx/libSceVideoOut/tests/PadSdl.cpp b/core/libs/prx/libSceVideoOut/tests/PadSdl.cpp index 894b928bf8..655260d36e 100644 --- a/core/libs/prx/libSceVideoOut/tests/PadSdl.cpp +++ b/core/libs/prx/libSceVideoOut/tests/PadSdl.cpp @@ -7,15 +7,24 @@ #include "prx/libScePad/include/PadState.hpp" #include "prx/libSceIme/include/ImeInput.hpp" #include "prx/libSceIme/include/ModalDialog.hpp" +#include +#include +#include #include #include +#include +#include +#include +#include +#include #include #undef main namespace { -static void Require(bool condition) { +static void Require(bool condition, std::source_location where = std::source_location::current()) { if (!condition) { + std::fprintf(stderr, "pad_sdl: check failed at line %u\n", static_cast(where.line())); std::abort(); } } @@ -113,6 +122,89 @@ void HandOff(PadInput& padInput, const DisplayWindow& window, int device) { ModalDialogSetPresenter_nid_postfix(false); } +void InjectedAnswer(PadInput& padInput, const DisplayWindow& window, const std::filesystem::path& commandPath) { + constexpr std::uint32_t Cross = 0x4000; + constexpr std::uint32_t Intercepted = 0x80000000; + ModalDialogSetPresenter_nid_postfix(true); + ModalDialogRequest request; + request.message = u"Create new data?"; + request.buttons = {u"OK"}; + Require(ModalDialogOpen_nid_postfix(request)); + padInput.Update(window); + Require(Pad::ReadState(0).buttons == Intercepted); + std::ofstream(commandPath) << "1 16384 400\n"; + std::size_t chosen = 9; + ModalDialogState state = ModalDialogState::Showing; + for (int frame = 0; frame < 200 && state == ModalDialogState::Showing; ++frame) { + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + padInput.Update(window); + Require(Pad::ReadState(0).buttons == Intercepted); + state = ModalDialogPoll_nid_postfix(chosen); + } + Require(state == ModalDialogState::Answered && chosen == 0); + padInput.Update(window); + Require(Pad::ReadState(0).buttons == 0); + for (int frame = 0; frame < 50; ++frame) { + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + padInput.Update(window); + Require(Pad::ReadState(0).buttons == 0); + } + std::ofstream(commandPath) << "2 16384 400\n"; + bool reached = false; + for (int frame = 0; frame < 200 && !reached; ++frame) { + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + padInput.Update(window); + reached = Pad::ReadState(0).buttons == Cross; + } + Require(reached); + ModalDialogReset_nid_postfix(); + ModalDialogSetPresenter_nid_postfix(false); +} + +std::uint32_t TitleButtons(bool useRead) { + if (!useRead) return Pad::ReadState(0).buttons; + std::array data{}; + const int count = Pad::Read(data.data(), static_cast(data.size()), 0); + Require(count > 0); + return data[static_cast(count - 1)].buttons; +} + +void InjectedPressAfterUnreadRelease(PadInput& padInput, const DisplayWindow& window, const std::filesystem::path& commandPath, std::uint64_t sequence, bool useRead) { + constexpr std::uint32_t Cross = 0x4000; + constexpr std::uint32_t Intercepted = 0x80000000; + std::this_thread::sleep_for(std::chrono::milliseconds(500)); + padInput.Update(window); + Require(TitleButtons(useRead) == 0); + ModalDialogSetPresenter_nid_postfix(true); + ModalDialogRequest request; + request.message = u"Create new data?"; + request.buttons = {u"OK"}; + Require(ModalDialogOpen_nid_postfix(request)); + padInput.Update(window); + Require(TitleButtons(useRead) == Intercepted); + std::ofstream(commandPath) << "APS5_PAD_TIMELINE 1 " << sequence << " 2\n0 400 16384\n1000 400 16384\n"; + const auto written = std::chrono::steady_clock::now(); + std::size_t chosen = 9; + ModalDialogState state = ModalDialogState::Showing; + for (int frame = 0; frame < 30 && state == ModalDialogState::Showing; ++frame) { + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + padInput.Update(window); + state = ModalDialogPoll_nid_postfix(chosen); + } + Require(state == ModalDialogState::Answered && chosen == 0); + padInput.Update(window); + Require(TitleButtons(useRead) == 0); + Require(std::chrono::steady_clock::now() - written < std::chrono::milliseconds(350)); + std::this_thread::sleep_until(written + std::chrono::milliseconds(1150)); + padInput.Update(window); + Require(TitleButtons(useRead) == Cross); + std::this_thread::sleep_until(written + std::chrono::milliseconds(1700)); + padInput.Update(window); + Require(TitleButtons(useRead) == 0); + ModalDialogReset_nid_postfix(); + ModalDialogSetPresenter_nid_postfix(false); +} + } int main() { @@ -123,6 +215,17 @@ int main() { return 1; #endif + const auto commandPath = std::filesystem::temp_directory_path() / ("anyps5-pad-sdl-" + std::to_string(std::chrono::steady_clock::now().time_since_epoch().count())); + struct Cleanup { + std::filesystem::path path; + ~Cleanup() { std::error_code error; std::filesystem::remove(path, error); } + } cleanup{commandPath}; +#ifdef _WIN32 + Require(_wputenv_s(L"APS5_PAD_INPUT_FILE", commandPath.c_str()) == 0); +#else + Require(setenv("APS5_PAD_INPUT_FILE", commandPath.string().c_str(), 1) == 0); +#endif + Require(SDL_Init(SDL_INIT_GAMECONTROLLER | SDL_INIT_JOYSTICK) == 0); const int hostJoysticks = SDL_NumJoysticks(); @@ -199,6 +302,9 @@ int main() { padInput.HandleEvent(rem0, window); Require(!padInput.SlotOccupied(0)); Require(!padInput.SlotOccupied(1)); + InjectedAnswer(padInput, window, commandPath); + InjectedPressAfterUnreadRelease(padInput, window, commandPath, 3, false); + InjectedPressAfterUnreadRelease(padInput, window, commandPath, 4, true); Require(SDL_JoystickDetachVirtual(dev1) == 0); Require(SDL_JoystickDetachVirtual(dev0) == 0); diff --git a/core/libs/prx/libSceVideoOut/tests/Port0Presence.cpp b/core/libs/prx/libSceVideoOut/tests/Port0Presence.cpp new file mode 100644 index 0000000000..9c5b233a0a --- /dev/null +++ b/core/libs/prx/libSceVideoOut/tests/Port0Presence.cpp @@ -0,0 +1,107 @@ +#include "prx/libSceVideoOut/include/Port0Presence.hpp" + +#include +#include +#include + +namespace { + +void Require(bool condition, const char* message) { + if (condition) return; + std::fprintf(stderr, "video_out_port0_presence: %s\n", message); + std::exit(1); +} + +using Port0Presence::Mode; +using Port0Presence::Presence; +using Clock = Presence::Clock; + +Clock::time_point At(std::chrono::milliseconds offset) { + return Clock::time_point{} + offset; +} + +void ParsesOnlyTheTwoNames() { + Require(Port0Presence::ParseMode(nullptr) == Mode::Default, "an unset variable keeps the default"); + Require(Port0Presence::ParseMode("default") == Mode::Default, "default is accepted"); + Require(Port0Presence::ParseMode("controller") == Mode::Controller, "controller is accepted"); + for (const char* bad : {"", "Controller", "on", "1", " controller", "controller ", "pad"}) { + bool threw = false; + std::string message; + try { + Port0Presence::ParseMode(bad); + } catch (const std::runtime_error& error) { + threw = true; + message = error.what(); + } + Require(threw, "an invalid value must throw"); + Require(message.find("ANYPS5_PAD_PORT0_STATE") != std::string::npos, "the error must name the variable"); + } +} + +void DefaultStaysConnected() { + Presence unbound(Mode::Default, false); + Require(unbound.Connected(), "default mode starts connected without a controller"); + Require(!unbound.Observe(false, At(std::chrono::milliseconds{0})).has_value(), "default mode reports no change"); + Require(!unbound.Observe(false, At(std::chrono::seconds{10})).has_value(), "default mode never reports a change"); + Require(unbound.Connected(), "default mode stays connected"); + Presence bound(Mode::Default, true); + Require(bound.Connected() && !bound.Observe(true, At(std::chrono::milliseconds{0})).has_value(), "default mode with a controller"); +} + +void ControllerStartsFromTheController() { + Presence unbound(Mode::Controller, false); + Require(!unbound.Connected(), "controller mode without a controller starts disconnected"); + Require(!unbound.Observe(false, At(std::chrono::seconds{5})).has_value(), "no controller, no change"); + Presence bound(Mode::Controller, true); + Require(bound.Connected(), "controller mode with a controller starts connected"); +} + +void RemovalHoldsForTheHoldTime() { + Presence presence(Mode::Controller, true); + Require(!presence.Observe(false, At(std::chrono::seconds{1})).has_value(), "a removal starts the hold"); + Require(presence.Connected(), "still connected during the hold"); + Require(!presence.Observe(false, At(std::chrono::seconds{1}) + Port0Presence::kHold / 2).has_value(), "half way through the hold"); + Require(presence.Connected(), "still connected half way through the hold"); + Require(!presence.Observe(false, At(std::chrono::seconds{1}) + Port0Presence::kHold - std::chrono::milliseconds{1}).has_value(), "one millisecond short of the hold"); + Require(presence.Connected(), "still connected one millisecond short of the hold"); + const auto change = presence.Observe(false, At(std::chrono::seconds{1}) + Port0Presence::kHold); + Require(change.has_value() && !*change, "the removal is reported once the hold has passed"); + Require(!presence.Connected(), "disconnected after the hold"); + Require(!presence.Observe(false, At(std::chrono::seconds{9})).has_value(), "a second report of the same state is silent"); +} + +void FlapInsideTheHoldIsIgnored() { + Presence presence(Mode::Controller, true); + Require(!presence.Observe(false, At(std::chrono::seconds{1})).has_value(), "first removal sample"); + Require(!presence.Observe(true, At(std::chrono::seconds{1}) + std::chrono::milliseconds{100}).has_value(), "reattached inside the hold"); + Require(presence.Connected(), "a reattach inside the hold keeps the pad connected"); + Require(!presence.Observe(true, At(std::chrono::seconds{30})).has_value(), "no late report after a reattach"); + Require(presence.Connected(), "still connected after the late sample"); + Require(!presence.Observe(false, At(std::chrono::seconds{31})).has_value(), "the next removal starts a new hold"); + Require(presence.Connected(), "the new hold has not passed"); +} + +void ReconnectHoldsForTheHoldTime() { + Presence presence(Mode::Controller, false); + Require(!presence.Observe(true, At(std::chrono::seconds{2})).has_value(), "an attach starts the hold"); + Require(!presence.Connected(), "still disconnected during the hold"); + Require(!presence.Observe(true, At(std::chrono::seconds{2}) + Port0Presence::kHold / 2).has_value(), "half way through the reconnect hold"); + Require(!presence.Connected(), "still disconnected half way through the reconnect hold"); + Require(!presence.Observe(true, At(std::chrono::seconds{2}) + Port0Presence::kHold - std::chrono::milliseconds{1}).has_value(), "one millisecond short of the reconnect hold"); + const auto change = presence.Observe(true, At(std::chrono::seconds{2}) + Port0Presence::kHold); + Require(change.has_value() && *change, "the attach is reported once the hold has passed"); + Require(presence.Connected(), "connected after the hold"); +} + +} + +int main() { + ParsesOnlyTheTwoNames(); + DefaultStaysConnected(); + ControllerStartsFromTheController(); + RemovalHoldsForTheHoldTime(); + FlapInsideTheHoldIsIgnored(); + ReconnectHoldsForTheHoldTime(); + std::puts("video_out_port0_presence: all checks passed"); + return 0; +} diff --git a/core/libs/prx/libSceVideoOutSecondary/Export.cpp b/core/libs/prx/libSceVideoOutSecondary/Export.cpp index d81f4a5e32..340cbc7015 100644 --- a/core/libs/prx/libSceVideoOutSecondary/Export.cpp +++ b/core/libs/prx/libSceVideoOutSecondary/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceVideoOutSecondary/include/InventoryExports.hpp" #include #include #include "SceTypes.hpp" @@ -8,3 +10,17 @@ extern "C" { APS5_DUMMY_FUN } + +extern "C" { + +int APS5_VABI libSceVideoOutSecondaryUnknown_KJWkt9y7YC4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KJWkt9y7YC4", libSceVideoOutSecondaryUnknown_KJWkt9y7YC4_nid_no_patch); + +int APS5_VABI libSceVideoOutSecondaryUnknown_s_plus_isXKLpwS0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("s+isXKLpwS0", libSceVideoOutSecondaryUnknown_s_plus_isXKLpwS0_nid_no_patch); + +} diff --git a/core/libs/prx/libSceVideoOutSecondary/include/InventoryExports.hpp b/core/libs/prx/libSceVideoOutSecondary/include/InventoryExports.hpp new file mode 100644 index 0000000000..ac346d4631 --- /dev/null +++ b/core/libs/prx/libSceVideoOutSecondary/include/InventoryExports.hpp @@ -0,0 +1,10 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceVideoOutSecondaryUnknown_KJWkt9y7YC4_nid_no_patch(); +int APS5_VABI libSceVideoOutSecondaryUnknown_s_plus_isXKLpwS0_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceVideoOutSecondary/libSceVideoOutSecondary.hpp b/core/libs/prx/libSceVideoOutSecondary/libSceVideoOutSecondary.hpp index 6f70f09bee..bc8db66d0e 100644 --- a/core/libs/prx/libSceVideoOutSecondary/libSceVideoOutSecondary.hpp +++ b/core/libs/prx/libSceVideoOutSecondary/libSceVideoOutSecondary.hpp @@ -1 +1,3 @@ #pragma once + +#include "prx/libSceVideoOutSecondary/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceVideoStreamingEngineAudioOnly/Export.cpp b/core/libs/prx/libSceVideoStreamingEngineAudioOnly/Export.cpp new file mode 100644 index 0000000000..3dae414313 --- /dev/null +++ b/core/libs/prx/libSceVideoStreamingEngineAudioOnly/Export.cpp @@ -0,0 +1,33 @@ +#include "prx/libSceVideoStreamingEngineAudioOnly/include/Api.hpp" +#include +#include +#include "SceTypes.hpp" +#include "prx/libc/include/General.hpp" + +extern "C" { + +APS5_EXPORT("KAkO+-Xbfws", sceVideoStreamingEngineAudioOnlyUnknown00); +int APS5_VABI sceVideoStreamingEngineAudioOnlyUnknown00(void) { + NotImplemented_nid_no_patch("KAkO+-Xbfws"); + return 0; +} + +APS5_EXPORT("JOKi6pWGGAg", sceVideoStreamingEngineAudioOnlyUnknown01); +int APS5_VABI sceVideoStreamingEngineAudioOnlyUnknown01(void) { + NotImplemented_nid_no_patch("JOKi6pWGGAg"); + return 0; +} + +APS5_EXPORT("1dWjQLhvcIg", sceVideoStreamingEngineAudioOnlyUnknown02); +int APS5_VABI sceVideoStreamingEngineAudioOnlyUnknown02(void) { + NotImplemented_nid_no_patch("1dWjQLhvcIg"); + return 0; +} + +APS5_EXPORT("5Fg-EMN0TMw", sceVideoStreamingEngineAudioOnlyUnknown03); +int APS5_VABI sceVideoStreamingEngineAudioOnlyUnknown03(void) { + NotImplemented_nid_no_patch("5Fg-EMN0TMw"); + return 0; +} + +} diff --git a/core/libs/prx/libSceVideoStreamingEngineAudioOnly/include/Api.hpp b/core/libs/prx/libSceVideoStreamingEngineAudioOnly/include/Api.hpp new file mode 100644 index 0000000000..a3618dbab7 --- /dev/null +++ b/core/libs/prx/libSceVideoStreamingEngineAudioOnly/include/Api.hpp @@ -0,0 +1,12 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI sceVideoStreamingEngineAudioOnlyUnknown00(void); +int APS5_VABI sceVideoStreamingEngineAudioOnlyUnknown01(void); +int APS5_VABI sceVideoStreamingEngineAudioOnlyUnknown02(void); +int APS5_VABI sceVideoStreamingEngineAudioOnlyUnknown03(void); + +} diff --git a/core/libs/prx/libSceVideoStreamingEngineAudioOnly/libSceVideoStreamingEngineAudioOnly.hpp b/core/libs/prx/libSceVideoStreamingEngineAudioOnly/libSceVideoStreamingEngineAudioOnly.hpp new file mode 100644 index 0000000000..5cde7f7245 --- /dev/null +++ b/core/libs/prx/libSceVideoStreamingEngineAudioOnly/libSceVideoStreamingEngineAudioOnly.hpp @@ -0,0 +1,3 @@ +#pragma once + +#include "prx/libSceVideoStreamingEngineAudioOnly/include/Api.hpp" diff --git a/core/libs/prx/libSceVisionManager/Export.cpp b/core/libs/prx/libSceVisionManager/Export.cpp index e329980232..b19cf1ab2c 100644 --- a/core/libs/prx/libSceVisionManager/Export.cpp +++ b/core/libs/prx/libSceVisionManager/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceVisionManager/include/InventoryExports.hpp" #include "prx/libSceVisionManager/include/Api.hpp" #include #include @@ -276,3 +278,42 @@ int APS5_VABI sceVisionManagerWaitResponse() { } } + +extern "C" { + +int APS5_VABI libSceVisionManagerUnknown__minus_R5dI6KjYpY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-R5dI6KjYpY", libSceVisionManagerUnknown__minus_R5dI6KjYpY_nid_no_patch); + +int APS5_VABI libSceVisionManagerUnknown_0chNZ7GKUO0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0chNZ7GKUO0", libSceVisionManagerUnknown_0chNZ7GKUO0_nid_no_patch); + +int APS5_VABI libSceVisionManagerUnknown_9gGQMrf6sWg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9gGQMrf6sWg", libSceVisionManagerUnknown_9gGQMrf6sWg_nid_no_patch); + +int APS5_VABI libSceVisionManagerUnknown_ORAn12NcHYs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ORAn12NcHYs", libSceVisionManagerUnknown_ORAn12NcHYs_nid_no_patch); + +int APS5_VABI libSceVisionManagerUnknown_YQiB_minus_svtbcc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YQiB-svtbcc", libSceVisionManagerUnknown_YQiB_minus_svtbcc_nid_no_patch); + +int APS5_VABI libSceVisionManagerUnknown_dzN0VRFvA84_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dzN0VRFvA84", libSceVisionManagerUnknown_dzN0VRFvA84_nid_no_patch); + +int APS5_VABI libSceVisionManagerUnknown_wu4afKNlup4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wu4afKNlup4", libSceVisionManagerUnknown_wu4afKNlup4_nid_no_patch); + +} diff --git a/core/libs/prx/libSceVisionManager/include/InventoryExports.hpp b/core/libs/prx/libSceVisionManager/include/InventoryExports.hpp new file mode 100644 index 0000000000..6e7bf9ac85 --- /dev/null +++ b/core/libs/prx/libSceVisionManager/include/InventoryExports.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceVisionManagerUnknown__minus_R5dI6KjYpY_nid_no_patch(); +int APS5_VABI libSceVisionManagerUnknown_0chNZ7GKUO0_nid_no_patch(); +int APS5_VABI libSceVisionManagerUnknown_9gGQMrf6sWg_nid_no_patch(); +int APS5_VABI libSceVisionManagerUnknown_ORAn12NcHYs_nid_no_patch(); +int APS5_VABI libSceVisionManagerUnknown_YQiB_minus_svtbcc_nid_no_patch(); +int APS5_VABI libSceVisionManagerUnknown_dzN0VRFvA84_nid_no_patch(); +int APS5_VABI libSceVisionManagerUnknown_wu4afKNlup4_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceVisionManager/libSceVisionManager.hpp b/core/libs/prx/libSceVisionManager/libSceVisionManager.hpp index e2529647b8..4e2ef82362 100644 --- a/core/libs/prx/libSceVisionManager/libSceVisionManager.hpp +++ b/core/libs/prx/libSceVisionManager/libSceVisionManager.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceVisionManager/include/Api.hpp" +#include "prx/libSceVisionManager/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceVnaWebsocket/Export.cpp b/core/libs/prx/libSceVnaWebsocket/Export.cpp index d81f4a5e32..5c13882d47 100644 --- a/core/libs/prx/libSceVnaWebsocket/Export.cpp +++ b/core/libs/prx/libSceVnaWebsocket/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceVnaWebsocket/include/InventoryExports.hpp" #include #include #include "SceTypes.hpp" @@ -8,3 +10,117 @@ extern "C" { APS5_DUMMY_FUN } + +extern "C" { + +int APS5_VABI libSceVnaWebsocketUnknown__minus_IDFERYOJPs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-IDFERYOJPs", libSceVnaWebsocketUnknown__minus_IDFERYOJPs_nid_no_patch); + +int APS5_VABI libSceVnaWebsocketUnknown_8KzE01OyRog_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8KzE01OyRog", libSceVnaWebsocketUnknown_8KzE01OyRog_nid_no_patch); + +int APS5_VABI libSceVnaWebsocketUnknown_94G0OCEujjA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("94G0OCEujjA", libSceVnaWebsocketUnknown_94G0OCEujjA_nid_no_patch); + +int APS5_VABI libSceVnaWebsocketUnknown_Bw0_minus_YBkPNm4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Bw0-YBkPNm4", libSceVnaWebsocketUnknown_Bw0_minus_YBkPNm4_nid_no_patch); + +int APS5_VABI libSceVnaWebsocketUnknown_DP4477brt60_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DP4477brt60", libSceVnaWebsocketUnknown_DP4477brt60_nid_no_patch); + +int APS5_VABI libSceVnaWebsocketUnknown_J3fL2giuM_plus_0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("J3fL2giuM+0", libSceVnaWebsocketUnknown_J3fL2giuM_plus_0_nid_no_patch); + +int APS5_VABI libSceVnaWebsocketUnknown_J8_minus_VXNQySz0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("J8-VXNQySz0", libSceVnaWebsocketUnknown_J8_minus_VXNQySz0_nid_no_patch); + +int APS5_VABI libSceVnaWebsocketUnknown_JiBSw3cBh2g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JiBSw3cBh2g", libSceVnaWebsocketUnknown_JiBSw3cBh2g_nid_no_patch); + +int APS5_VABI libSceVnaWebsocketUnknown_K_minus_logS9LtFw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("K-logS9LtFw", libSceVnaWebsocketUnknown_K_minus_logS9LtFw_nid_no_patch); + +int APS5_VABI libSceVnaWebsocketUnknown_KGPZ_plus_BZgXn0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KGPZ+BZgXn0", libSceVnaWebsocketUnknown_KGPZ_plus_BZgXn0_nid_no_patch); + +int APS5_VABI libSceVnaWebsocketUnknown_MI6xIf_minus_bHXs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MI6xIf-bHXs", libSceVnaWebsocketUnknown_MI6xIf_minus_bHXs_nid_no_patch); + +int APS5_VABI libSceVnaWebsocketUnknown_NS_plus_C_plus_w391Aw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NS+C+w391Aw", libSceVnaWebsocketUnknown_NS_plus_C_plus_w391Aw_nid_no_patch); + +int APS5_VABI libSceVnaWebsocketUnknown_OUogBgTPp6E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OUogBgTPp6E", libSceVnaWebsocketUnknown_OUogBgTPp6E_nid_no_patch); + +int APS5_VABI libSceVnaWebsocketUnknown_PPt1uQ9zOb8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PPt1uQ9zOb8", libSceVnaWebsocketUnknown_PPt1uQ9zOb8_nid_no_patch); + +int APS5_VABI libSceVnaWebsocketUnknown_T4s2VWpD9_minus_g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("T4s2VWpD9-g", libSceVnaWebsocketUnknown_T4s2VWpD9_minus_g_nid_no_patch); + +int APS5_VABI libSceVnaWebsocketUnknown_es11O5Z1er4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("es11O5Z1er4", libSceVnaWebsocketUnknown_es11O5Z1er4_nid_no_patch); + +int APS5_VABI libSceVnaWebsocketUnknown_fxgYzL5aGyw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fxgYzL5aGyw", libSceVnaWebsocketUnknown_fxgYzL5aGyw_nid_no_patch); + +int APS5_VABI libSceVnaWebsocketUnknown_hSnmIgcBCMk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hSnmIgcBCMk", libSceVnaWebsocketUnknown_hSnmIgcBCMk_nid_no_patch); + +int APS5_VABI libSceVnaWebsocketUnknown_jtTGYZXUOqE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jtTGYZXUOqE", libSceVnaWebsocketUnknown_jtTGYZXUOqE_nid_no_patch); + +int APS5_VABI libSceVnaWebsocketUnknown_obO4IYwAPtg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("obO4IYwAPtg", libSceVnaWebsocketUnknown_obO4IYwAPtg_nid_no_patch); + +int APS5_VABI libSceVnaWebsocketUnknown_qUkQKyPORE8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qUkQKyPORE8", libSceVnaWebsocketUnknown_qUkQKyPORE8_nid_no_patch); + +int APS5_VABI libSceVnaWebsocketUnknown_t534VXlYZI8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("t534VXlYZI8", libSceVnaWebsocketUnknown_t534VXlYZI8_nid_no_patch); + +} diff --git a/core/libs/prx/libSceVnaWebsocket/include/InventoryExports.hpp b/core/libs/prx/libSceVnaWebsocket/include/InventoryExports.hpp new file mode 100644 index 0000000000..54ebf49f8c --- /dev/null +++ b/core/libs/prx/libSceVnaWebsocket/include/InventoryExports.hpp @@ -0,0 +1,30 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceVnaWebsocketUnknown__minus_IDFERYOJPs_nid_no_patch(); +int APS5_VABI libSceVnaWebsocketUnknown_8KzE01OyRog_nid_no_patch(); +int APS5_VABI libSceVnaWebsocketUnknown_94G0OCEujjA_nid_no_patch(); +int APS5_VABI libSceVnaWebsocketUnknown_Bw0_minus_YBkPNm4_nid_no_patch(); +int APS5_VABI libSceVnaWebsocketUnknown_DP4477brt60_nid_no_patch(); +int APS5_VABI libSceVnaWebsocketUnknown_J3fL2giuM_plus_0_nid_no_patch(); +int APS5_VABI libSceVnaWebsocketUnknown_J8_minus_VXNQySz0_nid_no_patch(); +int APS5_VABI libSceVnaWebsocketUnknown_JiBSw3cBh2g_nid_no_patch(); +int APS5_VABI libSceVnaWebsocketUnknown_K_minus_logS9LtFw_nid_no_patch(); +int APS5_VABI libSceVnaWebsocketUnknown_KGPZ_plus_BZgXn0_nid_no_patch(); +int APS5_VABI libSceVnaWebsocketUnknown_MI6xIf_minus_bHXs_nid_no_patch(); +int APS5_VABI libSceVnaWebsocketUnknown_NS_plus_C_plus_w391Aw_nid_no_patch(); +int APS5_VABI libSceVnaWebsocketUnknown_OUogBgTPp6E_nid_no_patch(); +int APS5_VABI libSceVnaWebsocketUnknown_PPt1uQ9zOb8_nid_no_patch(); +int APS5_VABI libSceVnaWebsocketUnknown_T4s2VWpD9_minus_g_nid_no_patch(); +int APS5_VABI libSceVnaWebsocketUnknown_es11O5Z1er4_nid_no_patch(); +int APS5_VABI libSceVnaWebsocketUnknown_fxgYzL5aGyw_nid_no_patch(); +int APS5_VABI libSceVnaWebsocketUnknown_hSnmIgcBCMk_nid_no_patch(); +int APS5_VABI libSceVnaWebsocketUnknown_jtTGYZXUOqE_nid_no_patch(); +int APS5_VABI libSceVnaWebsocketUnknown_obO4IYwAPtg_nid_no_patch(); +int APS5_VABI libSceVnaWebsocketUnknown_qUkQKyPORE8_nid_no_patch(); +int APS5_VABI libSceVnaWebsocketUnknown_t534VXlYZI8_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceVnaWebsocket/libSceVnaWebsocket.hpp b/core/libs/prx/libSceVnaWebsocket/libSceVnaWebsocket.hpp index 6f70f09bee..21e36b4f85 100644 --- a/core/libs/prx/libSceVnaWebsocket/libSceVnaWebsocket.hpp +++ b/core/libs/prx/libSceVnaWebsocket/libSceVnaWebsocket.hpp @@ -1 +1,2 @@ #pragma once +#include "prx/libSceVnaWebsocket/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceVrTracker/Export.cpp b/core/libs/prx/libSceVrTracker/Export.cpp index 7e66fd197e..0f9005af70 100644 --- a/core/libs/prx/libSceVrTracker/Export.cpp +++ b/core/libs/prx/libSceVrTracker/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceVrTracker/include/InventoryExports.hpp" #include "prx/libSceVrTracker/include/Api.hpp" #include #include @@ -228,3 +230,52 @@ int APS5_VABI sceVrTrackerUpdateMotionSensorData(const void* param) { } } + +extern "C" { + +int APS5_VABI libSceVrTrackerUnknown_5ucmy8hcSPk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5ucmy8hcSPk", libSceVrTrackerUnknown_5ucmy8hcSPk_nid_no_patch); + +int APS5_VABI libSceVrTrackerUnknown_9kB_plus_RsZt84M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9kB+RsZt84M", libSceVrTrackerUnknown_9kB_plus_RsZt84M_nid_no_patch); + +int APS5_VABI libSceVrTrackerUnknown_D6TJSfjTAk4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("D6TJSfjTAk4", libSceVrTrackerUnknown_D6TJSfjTAk4_nid_no_patch); + +int APS5_VABI libSceVrTrackerUnknown_ERmwvjmfN_plus_c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ERmwvjmfN+c", libSceVrTrackerUnknown_ERmwvjmfN_plus_c_nid_no_patch); + +int APS5_VABI libSceVrTrackerUnknown_KFxq_minus_AnEL34_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KFxq-AnEL34", libSceVrTrackerUnknown_KFxq_minus_AnEL34_nid_no_patch); + +int APS5_VABI libSceVrTrackerUnknown_SSi0OBa8RA0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SSi0OBa8RA0", libSceVrTrackerUnknown_SSi0OBa8RA0_nid_no_patch); + +int APS5_VABI libSceVrTrackerUnknown_hj7zLvyw_plus_pw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hj7zLvyw+pw", libSceVrTrackerUnknown_hj7zLvyw_plus_pw_nid_no_patch); + +int APS5_VABI libSceVrTrackerUnknown_mmzbIQNmT4o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mmzbIQNmT4o", libSceVrTrackerUnknown_mmzbIQNmT4o_nid_no_patch); + +int APS5_VABI libSceVrTrackerUnknown_tNJrfYsY3wY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tNJrfYsY3wY", libSceVrTrackerUnknown_tNJrfYsY3wY_nid_no_patch); + +} diff --git a/core/libs/prx/libSceVrTracker/include/InventoryExports.hpp b/core/libs/prx/libSceVrTracker/include/InventoryExports.hpp new file mode 100644 index 0000000000..8228f057da --- /dev/null +++ b/core/libs/prx/libSceVrTracker/include/InventoryExports.hpp @@ -0,0 +1,17 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceVrTrackerUnknown_5ucmy8hcSPk_nid_no_patch(); +int APS5_VABI libSceVrTrackerUnknown_9kB_plus_RsZt84M_nid_no_patch(); +int APS5_VABI libSceVrTrackerUnknown_D6TJSfjTAk4_nid_no_patch(); +int APS5_VABI libSceVrTrackerUnknown_ERmwvjmfN_plus_c_nid_no_patch(); +int APS5_VABI libSceVrTrackerUnknown_KFxq_minus_AnEL34_nid_no_patch(); +int APS5_VABI libSceVrTrackerUnknown_SSi0OBa8RA0_nid_no_patch(); +int APS5_VABI libSceVrTrackerUnknown_hj7zLvyw_plus_pw_nid_no_patch(); +int APS5_VABI libSceVrTrackerUnknown_mmzbIQNmT4o_nid_no_patch(); +int APS5_VABI libSceVrTrackerUnknown_tNJrfYsY3wY_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceVrTracker/libSceVrTracker.hpp b/core/libs/prx/libSceVrTracker/libSceVrTracker.hpp index 81621f7084..5831e89f25 100644 --- a/core/libs/prx/libSceVrTracker/libSceVrTracker.hpp +++ b/core/libs/prx/libSceVrTracker/libSceVrTracker.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceVrTracker/include/Api.hpp" +#include "prx/libSceVrTracker/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceVsePlugin/Export.cpp b/core/libs/prx/libSceVsePlugin/Export.cpp new file mode 100644 index 0000000000..9a43597ab5 --- /dev/null +++ b/core/libs/prx/libSceVsePlugin/Export.cpp @@ -0,0 +1,213 @@ +#include "prx/libSceVsePlugin/include/Api.hpp" +#include +#include +#include "SceTypes.hpp" +#include "prx/libc/include/General.hpp" + +extern "C" { + +APS5_EXPORT("mC7fLsPRPBg", sceVsePluginUnknown00); +int APS5_VABI sceVsePluginUnknown00(void) { + NotImplemented_nid_no_patch("mC7fLsPRPBg"); + return 0; +} + +APS5_EXPORT("ULm+3jhjCd0", sceVsePluginUnknown01); +int APS5_VABI sceVsePluginUnknown01(void) { + NotImplemented_nid_no_patch("ULm+3jhjCd0"); + return 0; +} + +APS5_EXPORT("yG55s7UyQpU", sceVsePluginUnknown02); +int APS5_VABI sceVsePluginUnknown02(void) { + NotImplemented_nid_no_patch("yG55s7UyQpU"); + return 0; +} + +APS5_EXPORT("8BGZuI9sqVA", sceVsePluginUnknown03); +int APS5_VABI sceVsePluginUnknown03(void) { + NotImplemented_nid_no_patch("8BGZuI9sqVA"); + return 0; +} + +APS5_EXPORT("s4dJPPRz8iY", sceVsePluginUnknown04); +int APS5_VABI sceVsePluginUnknown04(void) { + NotImplemented_nid_no_patch("s4dJPPRz8iY"); + return 0; +} + +APS5_EXPORT("++19RoA+N+g", sceVsePluginUnknown05); +int APS5_VABI sceVsePluginUnknown05(void) { + NotImplemented_nid_no_patch("++19RoA+N+g"); + return 0; +} + +APS5_EXPORT("m1PiBuvY3Dw", sceVsePluginUnknown06); +int APS5_VABI sceVsePluginUnknown06(void) { + NotImplemented_nid_no_patch("m1PiBuvY3Dw"); + return 0; +} + +APS5_EXPORT("hXa3nLcCDBg", sceVsePluginUnknown07); +int APS5_VABI sceVsePluginUnknown07(void) { + NotImplemented_nid_no_patch("hXa3nLcCDBg"); + return 0; +} + +APS5_EXPORT("F7KYONYDPWM", sceVsePluginUnknown08); +int APS5_VABI sceVsePluginUnknown08(void) { + NotImplemented_nid_no_patch("F7KYONYDPWM"); + return 0; +} + +APS5_EXPORT("5-Mb1Shpav8", sceVsePluginUnknown09); +int APS5_VABI sceVsePluginUnknown09(void) { + NotImplemented_nid_no_patch("5-Mb1Shpav8"); + return 0; +} + +APS5_EXPORT("W6YYq+zKzv8", sceVsePluginUnknown10); +int APS5_VABI sceVsePluginUnknown10(void) { + NotImplemented_nid_no_patch("W6YYq+zKzv8"); + return 0; +} + +APS5_EXPORT("HqQ0l0DKfIc", sceVsePluginUnknown11); +int APS5_VABI sceVsePluginUnknown11(void) { + NotImplemented_nid_no_patch("HqQ0l0DKfIc"); + return 0; +} + +APS5_EXPORT("ce8N8Yio7HM", sceVsePluginUnknown12); +int APS5_VABI sceVsePluginUnknown12(void) { + NotImplemented_nid_no_patch("ce8N8Yio7HM"); + return 0; +} + +APS5_EXPORT("0pSTdYWJC-Q", sceVsePluginUnknown13); +int APS5_VABI sceVsePluginUnknown13(void) { + NotImplemented_nid_no_patch("0pSTdYWJC-Q"); + return 0; +} + +APS5_EXPORT("DXpB-esTdFw", sceVsePluginUnknown14); +int APS5_VABI sceVsePluginUnknown14(void) { + NotImplemented_nid_no_patch("DXpB-esTdFw"); + return 0; +} + +APS5_EXPORT("2FXkRWRCBbI", sceVsePluginUnknown15); +int APS5_VABI sceVsePluginUnknown15(void) { + NotImplemented_nid_no_patch("2FXkRWRCBbI"); + return 0; +} + +APS5_EXPORT("IQiYUjmGspE", sceVsePluginUnknown16); +int APS5_VABI sceVsePluginUnknown16(void) { + NotImplemented_nid_no_patch("IQiYUjmGspE"); + return 0; +} + +APS5_EXPORT("M+jgTnnPFhg", sceVsePluginUnknown17); +int APS5_VABI sceVsePluginUnknown17(void) { + NotImplemented_nid_no_patch("M+jgTnnPFhg"); + return 0; +} + +APS5_EXPORT("PGbZLXen8Ss", sceVsePluginUnknown18); +int APS5_VABI sceVsePluginUnknown18(void) { + NotImplemented_nid_no_patch("PGbZLXen8Ss"); + return 0; +} + +APS5_EXPORT("otn9+iYaT60", sceVsePluginUnknown19); +int APS5_VABI sceVsePluginUnknown19(void) { + NotImplemented_nid_no_patch("otn9+iYaT60"); + return 0; +} + +APS5_EXPORT("iNzNGGTVeDg", sceVsePluginUnknown20); +int APS5_VABI sceVsePluginUnknown20(void) { + NotImplemented_nid_no_patch("iNzNGGTVeDg"); + return 0; +} + +APS5_EXPORT("ncbBf4PQglI", sceVsePluginUnknown21); +int APS5_VABI sceVsePluginUnknown21(void) { + NotImplemented_nid_no_patch("ncbBf4PQglI"); + return 0; +} + +APS5_EXPORT("T6eBeJRB9P8", sceVsePluginUnknown22); +int APS5_VABI sceVsePluginUnknown22(void) { + NotImplemented_nid_no_patch("T6eBeJRB9P8"); + return 0; +} + +APS5_EXPORT("tz7Z-B3AowM", sceVsePluginUnknown23); +int APS5_VABI sceVsePluginUnknown23(void) { + NotImplemented_nid_no_patch("tz7Z-B3AowM"); + return 0; +} + +APS5_EXPORT("GAEESzgy+ZU", sceVsePluginUnknown24); +int APS5_VABI sceVsePluginUnknown24(void) { + NotImplemented_nid_no_patch("GAEESzgy+ZU"); + return 0; +} + +APS5_EXPORT("DnxtFacfAWI", sceVsePluginUnknown25); +int APS5_VABI sceVsePluginUnknown25(void) { + NotImplemented_nid_no_patch("DnxtFacfAWI"); + return 0; +} + +APS5_EXPORT("rptJ6gzveJM", sceVsePluginUnknown26); +int APS5_VABI sceVsePluginUnknown26(void) { + NotImplemented_nid_no_patch("rptJ6gzveJM"); + return 0; +} + +APS5_EXPORT("xat+wsiq6Zg", sceVsePluginUnknown27); +int APS5_VABI sceVsePluginUnknown27(void) { + NotImplemented_nid_no_patch("xat+wsiq6Zg"); + return 0; +} + +APS5_EXPORT("Uq2VYlP2USs", sceVsePluginUnknown28); +int APS5_VABI sceVsePluginUnknown28(void) { + NotImplemented_nid_no_patch("Uq2VYlP2USs"); + return 0; +} + +APS5_EXPORT("sCsPKsUMRY8", sceVsePluginUnknown29); +int APS5_VABI sceVsePluginUnknown29(void) { + NotImplemented_nid_no_patch("sCsPKsUMRY8"); + return 0; +} + +APS5_EXPORT("XyUQo2i-128", sceVsePluginUnknown30); +int APS5_VABI sceVsePluginUnknown30(void) { + NotImplemented_nid_no_patch("XyUQo2i-128"); + return 0; +} + +APS5_EXPORT("CJ+YoG2tH6s", sceVsePluginUnknown31); +int APS5_VABI sceVsePluginUnknown31(void) { + NotImplemented_nid_no_patch("CJ+YoG2tH6s"); + return 0; +} + +APS5_EXPORT("tr3-U4EF8x0", sceVsePluginUnknown32); +int APS5_VABI sceVsePluginUnknown32(void) { + NotImplemented_nid_no_patch("tr3-U4EF8x0"); + return 0; +} + +APS5_EXPORT("hNSIc+rQivE", sceVsePluginUnknown33); +int APS5_VABI sceVsePluginUnknown33(void) { + NotImplemented_nid_no_patch("hNSIc+rQivE"); + return 0; +} + +} diff --git a/core/libs/prx/libSceVsePlugin/include/Api.hpp b/core/libs/prx/libSceVsePlugin/include/Api.hpp new file mode 100644 index 0000000000..73d3597819 --- /dev/null +++ b/core/libs/prx/libSceVsePlugin/include/Api.hpp @@ -0,0 +1,42 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI sceVsePluginUnknown00(void); +int APS5_VABI sceVsePluginUnknown01(void); +int APS5_VABI sceVsePluginUnknown02(void); +int APS5_VABI sceVsePluginUnknown03(void); +int APS5_VABI sceVsePluginUnknown04(void); +int APS5_VABI sceVsePluginUnknown05(void); +int APS5_VABI sceVsePluginUnknown06(void); +int APS5_VABI sceVsePluginUnknown07(void); +int APS5_VABI sceVsePluginUnknown08(void); +int APS5_VABI sceVsePluginUnknown09(void); +int APS5_VABI sceVsePluginUnknown10(void); +int APS5_VABI sceVsePluginUnknown11(void); +int APS5_VABI sceVsePluginUnknown12(void); +int APS5_VABI sceVsePluginUnknown13(void); +int APS5_VABI sceVsePluginUnknown14(void); +int APS5_VABI sceVsePluginUnknown15(void); +int APS5_VABI sceVsePluginUnknown16(void); +int APS5_VABI sceVsePluginUnknown17(void); +int APS5_VABI sceVsePluginUnknown18(void); +int APS5_VABI sceVsePluginUnknown19(void); +int APS5_VABI sceVsePluginUnknown20(void); +int APS5_VABI sceVsePluginUnknown21(void); +int APS5_VABI sceVsePluginUnknown22(void); +int APS5_VABI sceVsePluginUnknown23(void); +int APS5_VABI sceVsePluginUnknown24(void); +int APS5_VABI sceVsePluginUnknown25(void); +int APS5_VABI sceVsePluginUnknown26(void); +int APS5_VABI sceVsePluginUnknown27(void); +int APS5_VABI sceVsePluginUnknown28(void); +int APS5_VABI sceVsePluginUnknown29(void); +int APS5_VABI sceVsePluginUnknown30(void); +int APS5_VABI sceVsePluginUnknown31(void); +int APS5_VABI sceVsePluginUnknown32(void); +int APS5_VABI sceVsePluginUnknown33(void); + +} diff --git a/core/libs/prx/libSceVsePlugin/libSceVsePlugin.hpp b/core/libs/prx/libSceVsePlugin/libSceVsePlugin.hpp new file mode 100644 index 0000000000..a21cf7699d --- /dev/null +++ b/core/libs/prx/libSceVsePlugin/libSceVsePlugin.hpp @@ -0,0 +1,3 @@ +#pragma once + +#include "prx/libSceVsePlugin/include/Api.hpp" diff --git a/core/libs/prx/libSceWebBrowserDialog/CMakeLists.txt b/core/libs/prx/libSceWebBrowserDialog/CMakeLists.txt index 641f60463e..3e3933240a 100644 --- a/core/libs/prx/libSceWebBrowserDialog/CMakeLists.txt +++ b/core/libs/prx/libSceWebBrowserDialog/CMakeLists.txt @@ -1,15 +1,16 @@ add_library(libSceWebBrowserDialog SHARED EXCLUDE_FROM_ALL Export.cpp) +target_link_libraries(libSceWebBrowserDialog PRIVATE libSceIme) target_include_directories(libSceWebBrowserDialog PRIVATE ${LIBS_INCLUDE_DIR}) configure_windows_unwind(libSceWebBrowserDialog) if(BUILD_TESTING) add_test_executable(guest_web_browser_dialog_tests ${LIBS_INCLUDE_DIR}/tests/GuestWebBrowserDialog.cpp) target_include_directories(guest_web_browser_dialog_tests PRIVATE ${LIBS_INCLUDE_DIR}) - target_link_libraries(guest_web_browser_dialog_tests PRIVATE libSceWebBrowserDialog) + target_link_libraries(guest_web_browser_dialog_tests PRIVATE libSceWebBrowserDialog libSceIme) add_test(NAME guest_web_browser_dialog COMMAND guest_web_browser_dialog_tests) if(WIN32) set_tests_properties(guest_web_browser_dialog PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") + "PATH=path_list_prepend:$;PATH=path_list_prepend:$") endif() endif() diff --git a/core/libs/prx/libSceWebBrowserDialog/Export.cpp b/core/libs/prx/libSceWebBrowserDialog/Export.cpp index d5961d6211..758a568017 100644 --- a/core/libs/prx/libSceWebBrowserDialog/Export.cpp +++ b/core/libs/prx/libSceWebBrowserDialog/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceWebBrowserDialog/include/InventoryExports.hpp" #include "prx/libSceWebBrowserDialog/include/Api.hpp" #include #include @@ -6,6 +8,7 @@ #include "SceTypes.hpp" #include "prx/libSceCommonDialog/CommonDialog.hpp" #include "prx/libc/include/General.hpp" +#include "prx/libSceIme/include/PsnDialogNotice.hpp" static_assert(sizeof(WebBrowserDialogCookieParam) == 280); static_assert(offsetof(WebBrowserDialogCookieParam, address) == 8); @@ -100,6 +103,7 @@ int APS5_VABI sceWebBrowserDialogOpen(const void* param) { if (param == nullptr) return COMMON_DIALOG_ERROR_ARG_NULL; g_status = COMMON_DIALOG_STATUS_FINISHED; g_open = true; + PsnDialogNoticeOffer_nid_postfix(PsnDialogNoticeKind::GenericFeature); return 0; } @@ -137,6 +141,7 @@ int APS5_VABI sceWebBrowserDialogOpenForPredeterminedContent(const void* param, if (status == COMMON_DIALOG_STATUS_RUNNING) return COMMON_DIALOG_ERROR_BUSY; g_status = COMMON_DIALOG_STATUS_FINISHED; g_open = true; + PsnDialogNoticeOffer_nid_postfix(PsnDialogNoticeKind::GenericFeature); return 0; } @@ -164,3 +169,12 @@ int APS5_VABI sceWebBrowserDialogSetZoom() { } } + +extern "C" { + +int APS5_VABI libSceWebBrowserDialogUnknown_8r4EJ3FiX4w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8r4EJ3FiX4w", libSceWebBrowserDialogUnknown_8r4EJ3FiX4w_nid_no_patch); + +} diff --git a/core/libs/prx/libSceWebBrowserDialog/include/InventoryExports.hpp b/core/libs/prx/libSceWebBrowserDialog/include/InventoryExports.hpp new file mode 100644 index 0000000000..67d06f7736 --- /dev/null +++ b/core/libs/prx/libSceWebBrowserDialog/include/InventoryExports.hpp @@ -0,0 +1,9 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceWebBrowserDialogUnknown_8r4EJ3FiX4w_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceWebBrowserDialog/libSceWebBrowserDialog.hpp b/core/libs/prx/libSceWebBrowserDialog/libSceWebBrowserDialog.hpp index d9b740e440..9d181d1a9a 100644 --- a/core/libs/prx/libSceWebBrowserDialog/libSceWebBrowserDialog.hpp +++ b/core/libs/prx/libSceWebBrowserDialog/libSceWebBrowserDialog.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceWebBrowserDialog/include/Api.hpp" +#include "prx/libSceWebBrowserDialog/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceWebRtc/Export.cpp b/core/libs/prx/libSceWebRtc/Export.cpp new file mode 100644 index 0000000000..9fd9f62f7f --- /dev/null +++ b/core/libs/prx/libSceWebRtc/Export.cpp @@ -0,0 +1,31 @@ +#include "prx/libSceWebRtc/include/InventoryExports.hpp" +#include "prx/libc/include/General.hpp" +#include "prx/libc/include/general/ExportMacros.hpp" + +extern "C" { + +int APS5_VABI _ZN3sce2np3rtc9TerminateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI libSceWebRtcUnknown_SRJUfO0JINA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SRJUfO0JINA", libSceWebRtcUnknown_SRJUfO0JINA_nid_no_patch); + +int APS5_VABI libSceWebRtcUnknown_Z7F8YLISPDI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Z7F8YLISPDI", libSceWebRtcUnknown_Z7F8YLISPDI_nid_no_patch); + +int APS5_VABI libSceWebRtcUnknown_ZZV_plus_i_plus__minus_wetM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZZV+i+-wetM", libSceWebRtcUnknown_ZZV_plus_i_plus__minus_wetM_nid_no_patch); + +int APS5_VABI libSceWebRtcUnknown_z1bMECaLQhM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("z1bMECaLQhM", libSceWebRtcUnknown_z1bMECaLQhM_nid_no_patch); + +} diff --git a/core/libs/prx/libSceWebRtc/include/InventoryExports.hpp b/core/libs/prx/libSceWebRtc/include/InventoryExports.hpp new file mode 100644 index 0000000000..97c4280a39 --- /dev/null +++ b/core/libs/prx/libSceWebRtc/include/InventoryExports.hpp @@ -0,0 +1,13 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI _ZN3sce2np3rtc9TerminateEv(); +int APS5_VABI libSceWebRtcUnknown_SRJUfO0JINA_nid_no_patch(); +int APS5_VABI libSceWebRtcUnknown_Z7F8YLISPDI_nid_no_patch(); +int APS5_VABI libSceWebRtcUnknown_ZZV_plus_i_plus__minus_wetM_nid_no_patch(); +int APS5_VABI libSceWebRtcUnknown_z1bMECaLQhM_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceWebRtc/libSceWebRtc.hpp b/core/libs/prx/libSceWebRtc/libSceWebRtc.hpp new file mode 100644 index 0000000000..0b7625db0a --- /dev/null +++ b/core/libs/prx/libSceWebRtc/libSceWebRtc.hpp @@ -0,0 +1,3 @@ +#pragma once + +#include "prx/libSceWebRtc/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceWebTransport/Export.cpp b/core/libs/prx/libSceWebTransport/Export.cpp new file mode 100644 index 0000000000..a676546277 --- /dev/null +++ b/core/libs/prx/libSceWebTransport/Export.cpp @@ -0,0 +1,327 @@ +#include "prx/libSceWebTransport/include/Api.hpp" +#include +#include +#include "SceTypes.hpp" +#include "prx/libc/include/General.hpp" + +extern "C" { + +APS5_EXPORT("yDQLZ5vLNAo", sceWebTransportUnknown00); +int APS5_VABI sceWebTransportUnknown00(void) { + NotImplemented_nid_no_patch("yDQLZ5vLNAo"); + return 0; +} + +APS5_EXPORT("aRuF-dyJTf0", sceWebTransportUnknown01); +int APS5_VABI sceWebTransportUnknown01(void) { + NotImplemented_nid_no_patch("aRuF-dyJTf0"); + return 0; +} + +APS5_EXPORT("sO-Qj8LdN0w", sceWebTransportUnknown02); +int APS5_VABI sceWebTransportUnknown02(void) { + NotImplemented_nid_no_patch("sO-Qj8LdN0w"); + return 0; +} + +APS5_EXPORT("7dZ6MtRYlxk", sceWebTransportUnknown03); +int APS5_VABI sceWebTransportUnknown03(void) { + NotImplemented_nid_no_patch("7dZ6MtRYlxk"); + return 0; +} + +APS5_EXPORT("RZ7msPQyMrw", sceWebTransportUnknown04); +int APS5_VABI sceWebTransportUnknown04(void) { + NotImplemented_nid_no_patch("RZ7msPQyMrw"); + return 0; +} + +APS5_EXPORT("FuwKcReb9Qs", sceWebTransportUnknown05); +int APS5_VABI sceWebTransportUnknown05(void) { + NotImplemented_nid_no_patch("FuwKcReb9Qs"); + return 0; +} + +APS5_EXPORT("gpxgv3ZGouY", sceWebTransportUnknown06); +int APS5_VABI sceWebTransportUnknown06(void) { + NotImplemented_nid_no_patch("gpxgv3ZGouY"); + return 0; +} + +APS5_EXPORT("yFXDNq00zdw", sceWebTransportUnknown07); +int APS5_VABI sceWebTransportUnknown07(void) { + NotImplemented_nid_no_patch("yFXDNq00zdw"); + return 0; +} + +APS5_EXPORT("IF1M6OsaPxE", sceWebTransportUnknown08); +int APS5_VABI sceWebTransportUnknown08(void) { + NotImplemented_nid_no_patch("IF1M6OsaPxE"); + return 0; +} + +APS5_EXPORT("8baUEaMS3w4", sceWebTransportUnknown09); +int APS5_VABI sceWebTransportUnknown09(void) { + NotImplemented_nid_no_patch("8baUEaMS3w4"); + return 0; +} + +APS5_EXPORT("3rFEpghOT7g", sceWebTransportUnknown10); +int APS5_VABI sceWebTransportUnknown10(void) { + NotImplemented_nid_no_patch("3rFEpghOT7g"); + return 0; +} + +APS5_EXPORT("QDaDbEh27pc", sceWebTransportUnknown11); +int APS5_VABI sceWebTransportUnknown11(void) { + NotImplemented_nid_no_patch("QDaDbEh27pc"); + return 0; +} + +APS5_EXPORT("LuKemyYcbYA", sceWebTransportUnknown12); +int APS5_VABI sceWebTransportUnknown12(void) { + NotImplemented_nid_no_patch("LuKemyYcbYA"); + return 0; +} + +APS5_EXPORT("Dj9-Bo1dPQY", sceWebTransportUnknown13); +int APS5_VABI sceWebTransportUnknown13(void) { + NotImplemented_nid_no_patch("Dj9-Bo1dPQY"); + return 0; +} + +APS5_EXPORT("F1waH8GrH5c", sceWebTransportUnknown14); +int APS5_VABI sceWebTransportUnknown14(void) { + NotImplemented_nid_no_patch("F1waH8GrH5c"); + return 0; +} + +APS5_EXPORT("HNbe4GmHVoE", sceWebTransportUnknown15); +int APS5_VABI sceWebTransportUnknown15(void) { + NotImplemented_nid_no_patch("HNbe4GmHVoE"); + return 0; +} + +APS5_EXPORT("YWjYfs3Y6AQ", sceWebTransportUnknown16); +int APS5_VABI sceWebTransportUnknown16(void) { + NotImplemented_nid_no_patch("YWjYfs3Y6AQ"); + return 0; +} + +APS5_EXPORT("g0VYmAgyKCo", sceWebTransportUnknown17); +int APS5_VABI sceWebTransportUnknown17(void) { + NotImplemented_nid_no_patch("g0VYmAgyKCo"); + return 0; +} + +APS5_EXPORT("8qhovA7ewGo", sceWebTransportUnknown18); +int APS5_VABI sceWebTransportUnknown18(void) { + NotImplemented_nid_no_patch("8qhovA7ewGo"); + return 0; +} + +APS5_EXPORT("a5Kvg7QX0Tk", sceWebTransportUnknown19); +int APS5_VABI sceWebTransportUnknown19(void) { + NotImplemented_nid_no_patch("a5Kvg7QX0Tk"); + return 0; +} + +APS5_EXPORT("CG4Vqer++Fk", sceWebTransportUnknown20); +int APS5_VABI sceWebTransportUnknown20(void) { + NotImplemented_nid_no_patch("CG4Vqer++Fk"); + return 0; +} + +APS5_EXPORT("dBA3C0BvxZs", sceWebTransportUnknown21); +int APS5_VABI sceWebTransportUnknown21(void) { + NotImplemented_nid_no_patch("dBA3C0BvxZs"); + return 0; +} + +APS5_EXPORT("iTqKfqqRYHU", sceWebTransportUnknown22); +int APS5_VABI sceWebTransportUnknown22(void) { + NotImplemented_nid_no_patch("iTqKfqqRYHU"); + return 0; +} + +APS5_EXPORT("MOAg2IAVJpo", sceWebTransportUnknown23); +int APS5_VABI sceWebTransportUnknown23(void) { + NotImplemented_nid_no_patch("MOAg2IAVJpo"); + return 0; +} + +APS5_EXPORT("jvJFNpJiiVA", sceWebTransportUnknown24); +int APS5_VABI sceWebTransportUnknown24(void) { + NotImplemented_nid_no_patch("jvJFNpJiiVA"); + return 0; +} + +APS5_EXPORT("Ghb9UWG20hE", sceWebTransportUnknown25); +int APS5_VABI sceWebTransportUnknown25(void) { + NotImplemented_nid_no_patch("Ghb9UWG20hE"); + return 0; +} + +APS5_EXPORT("vlYUVlW76Ow", sceWebTransportUnknown26); +int APS5_VABI sceWebTransportUnknown26(void) { + NotImplemented_nid_no_patch("vlYUVlW76Ow"); + return 0; +} + +APS5_EXPORT("KihuM8ez8MM", sceWebTransportUnknown27); +int APS5_VABI sceWebTransportUnknown27(void) { + NotImplemented_nid_no_patch("KihuM8ez8MM"); + return 0; +} + +APS5_EXPORT("OSA7vqVi-jM", sceWebTransportUnknown28); +int APS5_VABI sceWebTransportUnknown28(void) { + NotImplemented_nid_no_patch("OSA7vqVi-jM"); + return 0; +} + +APS5_EXPORT("dP3Qm8xDt0A", sceWebTransportUnknown29); +int APS5_VABI sceWebTransportUnknown29(void) { + NotImplemented_nid_no_patch("dP3Qm8xDt0A"); + return 0; +} + +APS5_EXPORT("GtIbnZITTDI", sceWebTransportUnknown30); +int APS5_VABI sceWebTransportUnknown30(void) { + NotImplemented_nid_no_patch("GtIbnZITTDI"); + return 0; +} + +APS5_EXPORT("Fr0-n+3Tq-U", sceWebTransportUnknown31); +int APS5_VABI sceWebTransportUnknown31(void) { + NotImplemented_nid_no_patch("Fr0-n+3Tq-U"); + return 0; +} + +APS5_EXPORT("+Qna9X-+lvw", sceWebTransportUnknown32); +int APS5_VABI sceWebTransportUnknown32(void) { + NotImplemented_nid_no_patch("+Qna9X-+lvw"); + return 0; +} + +APS5_EXPORT("f4Se8M9P5bg", sceWebTransportUnknown33); +int APS5_VABI sceWebTransportUnknown33(void) { + NotImplemented_nid_no_patch("f4Se8M9P5bg"); + return 0; +} + +APS5_EXPORT("Sgpyj6wMFos", sceWebTransportUnknown34); +int APS5_VABI sceWebTransportUnknown34(void) { + NotImplemented_nid_no_patch("Sgpyj6wMFos"); + return 0; +} + +APS5_EXPORT("jJnQEEW7-Yo", sceWebTransportUnknown35); +int APS5_VABI sceWebTransportUnknown35(void) { + NotImplemented_nid_no_patch("jJnQEEW7-Yo"); + return 0; +} + +APS5_EXPORT("R4-TLIrDf8A", sceWebTransportUnknown36); +int APS5_VABI sceWebTransportUnknown36(void) { + NotImplemented_nid_no_patch("R4-TLIrDf8A"); + return 0; +} + +APS5_EXPORT("Pr-kbxNLmKU", sceWebTransportUnknown37); +int APS5_VABI sceWebTransportUnknown37(void) { + NotImplemented_nid_no_patch("Pr-kbxNLmKU"); + return 0; +} + +APS5_EXPORT("ZdjsEa5FfsQ", sceWebTransportUnknown38); +int APS5_VABI sceWebTransportUnknown38(void) { + NotImplemented_nid_no_patch("ZdjsEa5FfsQ"); + return 0; +} + +APS5_EXPORT("x2YzXDecgB8", sceWebTransportUnknown39); +int APS5_VABI sceWebTransportUnknown39(void) { + NotImplemented_nid_no_patch("x2YzXDecgB8"); + return 0; +} + +APS5_EXPORT("3fFqxhwfC2o", sceWebTransportUnknown40); +int APS5_VABI sceWebTransportUnknown40(void) { + NotImplemented_nid_no_patch("3fFqxhwfC2o"); + return 0; +} + +APS5_EXPORT("8Fv0htSKkaE", sceWebTransportUnknown41); +int APS5_VABI sceWebTransportUnknown41(void) { + NotImplemented_nid_no_patch("8Fv0htSKkaE"); + return 0; +} + +APS5_EXPORT("HrzL1GZ4pfM", sceWebTransportUnknown42); +int APS5_VABI sceWebTransportUnknown42(void) { + NotImplemented_nid_no_patch("HrzL1GZ4pfM"); + return 0; +} + +APS5_EXPORT("vkq466ZVpbE", sceWebTransportUnknown43); +int APS5_VABI sceWebTransportUnknown43(void) { + NotImplemented_nid_no_patch("vkq466ZVpbE"); + return 0; +} + +APS5_EXPORT("-q1hzjCUx1s", sceWebTransportUnknown44); +int APS5_VABI sceWebTransportUnknown44(void) { + NotImplemented_nid_no_patch("-q1hzjCUx1s"); + return 0; +} + +APS5_EXPORT("KyZxudPoVVc", sceWebTransportUnknown45); +int APS5_VABI sceWebTransportUnknown45(void) { + NotImplemented_nid_no_patch("KyZxudPoVVc"); + return 0; +} + +APS5_EXPORT("178NfAAq3Gw", sceWebTransportUnknown46); +int APS5_VABI sceWebTransportUnknown46(void) { + NotImplemented_nid_no_patch("178NfAAq3Gw"); + return 0; +} + +APS5_EXPORT("+ZTz1325V6k", sceWebTransportUnknown47); +int APS5_VABI sceWebTransportUnknown47(void) { + NotImplemented_nid_no_patch("+ZTz1325V6k"); + return 0; +} + +APS5_EXPORT("79NNBScLv2Y", sceWebTransportUnknown48); +int APS5_VABI sceWebTransportUnknown48(void) { + NotImplemented_nid_no_patch("79NNBScLv2Y"); + return 0; +} + +APS5_EXPORT("LYJaqTy-6dE", sceWebTransportUnknown49); +int APS5_VABI sceWebTransportUnknown49(void) { + NotImplemented_nid_no_patch("LYJaqTy-6dE"); + return 0; +} + +APS5_EXPORT("L0qjFMFFq7I", sceWebTransportUnknown50); +int APS5_VABI sceWebTransportUnknown50(void) { + NotImplemented_nid_no_patch("L0qjFMFFq7I"); + return 0; +} + +APS5_EXPORT("2BXQTf6fkB8", sceWebTransportUnknown51); +int APS5_VABI sceWebTransportUnknown51(void) { + NotImplemented_nid_no_patch("2BXQTf6fkB8"); + return 0; +} + +APS5_EXPORT("QoyAAWe9z4c", sceWebTransportUnknown52); +int APS5_VABI sceWebTransportUnknown52(void) { + NotImplemented_nid_no_patch("QoyAAWe9z4c"); + return 0; +} + +} diff --git a/core/libs/prx/libSceWebTransport/include/Api.hpp b/core/libs/prx/libSceWebTransport/include/Api.hpp new file mode 100644 index 0000000000..30b702b1e3 --- /dev/null +++ b/core/libs/prx/libSceWebTransport/include/Api.hpp @@ -0,0 +1,61 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI sceWebTransportUnknown00(void); +int APS5_VABI sceWebTransportUnknown01(void); +int APS5_VABI sceWebTransportUnknown02(void); +int APS5_VABI sceWebTransportUnknown03(void); +int APS5_VABI sceWebTransportUnknown04(void); +int APS5_VABI sceWebTransportUnknown05(void); +int APS5_VABI sceWebTransportUnknown06(void); +int APS5_VABI sceWebTransportUnknown07(void); +int APS5_VABI sceWebTransportUnknown08(void); +int APS5_VABI sceWebTransportUnknown09(void); +int APS5_VABI sceWebTransportUnknown10(void); +int APS5_VABI sceWebTransportUnknown11(void); +int APS5_VABI sceWebTransportUnknown12(void); +int APS5_VABI sceWebTransportUnknown13(void); +int APS5_VABI sceWebTransportUnknown14(void); +int APS5_VABI sceWebTransportUnknown15(void); +int APS5_VABI sceWebTransportUnknown16(void); +int APS5_VABI sceWebTransportUnknown17(void); +int APS5_VABI sceWebTransportUnknown18(void); +int APS5_VABI sceWebTransportUnknown19(void); +int APS5_VABI sceWebTransportUnknown20(void); +int APS5_VABI sceWebTransportUnknown21(void); +int APS5_VABI sceWebTransportUnknown22(void); +int APS5_VABI sceWebTransportUnknown23(void); +int APS5_VABI sceWebTransportUnknown24(void); +int APS5_VABI sceWebTransportUnknown25(void); +int APS5_VABI sceWebTransportUnknown26(void); +int APS5_VABI sceWebTransportUnknown27(void); +int APS5_VABI sceWebTransportUnknown28(void); +int APS5_VABI sceWebTransportUnknown29(void); +int APS5_VABI sceWebTransportUnknown30(void); +int APS5_VABI sceWebTransportUnknown31(void); +int APS5_VABI sceWebTransportUnknown32(void); +int APS5_VABI sceWebTransportUnknown33(void); +int APS5_VABI sceWebTransportUnknown34(void); +int APS5_VABI sceWebTransportUnknown35(void); +int APS5_VABI sceWebTransportUnknown36(void); +int APS5_VABI sceWebTransportUnknown37(void); +int APS5_VABI sceWebTransportUnknown38(void); +int APS5_VABI sceWebTransportUnknown39(void); +int APS5_VABI sceWebTransportUnknown40(void); +int APS5_VABI sceWebTransportUnknown41(void); +int APS5_VABI sceWebTransportUnknown42(void); +int APS5_VABI sceWebTransportUnknown43(void); +int APS5_VABI sceWebTransportUnknown44(void); +int APS5_VABI sceWebTransportUnknown45(void); +int APS5_VABI sceWebTransportUnknown46(void); +int APS5_VABI sceWebTransportUnknown47(void); +int APS5_VABI sceWebTransportUnknown48(void); +int APS5_VABI sceWebTransportUnknown49(void); +int APS5_VABI sceWebTransportUnknown50(void); +int APS5_VABI sceWebTransportUnknown51(void); +int APS5_VABI sceWebTransportUnknown52(void); + +} diff --git a/core/libs/prx/libSceWebTransport/libSceWebTransport.hpp b/core/libs/prx/libSceWebTransport/libSceWebTransport.hpp new file mode 100644 index 0000000000..164307b2b5 --- /dev/null +++ b/core/libs/prx/libSceWebTransport/libSceWebTransport.hpp @@ -0,0 +1,3 @@ +#pragma once + +#include "prx/libSceWebTransport/include/Api.hpp" diff --git a/core/libs/prx/libSceWebmParserMdrw/Export.cpp b/core/libs/prx/libSceWebmParserMdrw/Export.cpp index d81f4a5e32..85bef6edfc 100644 --- a/core/libs/prx/libSceWebmParserMdrw/Export.cpp +++ b/core/libs/prx/libSceWebmParserMdrw/Export.cpp @@ -1,10 +1,47 @@ -#include -#include -#include "SceTypes.hpp" +#include "prx/libSceWebmParserMdrw/include/LegacyExports.hpp" +#include "prx/libSceWebmParserMdrw/include/Api.hpp" #include "prx/libc/include/General.hpp" +#include "prx/libc/include/general/ExportMacros.hpp" extern "C" { -APS5_DUMMY_FUN +int APS5_VABI libSceWebmParserMdrwUnknown_wVIrSj9g_minus__minus_M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wVIrSj9g--M", libSceWebmParserMdrwUnknown_wVIrSj9g_minus__minus_M_nid_no_patch); + +} + +extern "C" { + +int APS5_VABI webmParserLegacyUnknown_8XGTsRfNvNs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8XGTsRfNvNs", webmParserLegacyUnknown_8XGTsRfNvNs_nid_no_patch); + +int APS5_VABI webmParserLegacyUnknown_AUzGCnIU8WM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AUzGCnIU8WM", webmParserLegacyUnknown_AUzGCnIU8WM_nid_no_patch); + +int APS5_VABI webmParserLegacyUnknown_NZQ5869nvfY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NZQ5869nvfY", webmParserLegacyUnknown_NZQ5869nvfY_nid_no_patch); + +int APS5_VABI webmParserLegacyUnknown_gq8g9It0U_minus_w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gq8g9It0U-w", webmParserLegacyUnknown_gq8g9It0U_minus_w_nid_no_patch); + +int APS5_VABI webmParserLegacyUnknown_vL4eBeS8uNs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vL4eBeS8uNs", webmParserLegacyUnknown_vL4eBeS8uNs_nid_no_patch); + +int APS5_VABI webmParserLegacyUnknown_xnVMgJstTL4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xnVMgJstTL4", webmParserLegacyUnknown_xnVMgJstTL4_nid_no_patch); } diff --git a/core/libs/prx/libSceWebmParserMdrw/include/Api.hpp b/core/libs/prx/libSceWebmParserMdrw/include/Api.hpp new file mode 100644 index 0000000000..f41474417f --- /dev/null +++ b/core/libs/prx/libSceWebmParserMdrw/include/Api.hpp @@ -0,0 +1,9 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceWebmParserMdrwUnknown_wVIrSj9g_minus__minus_M_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceWebmParserMdrw/include/LegacyExports.hpp b/core/libs/prx/libSceWebmParserMdrw/include/LegacyExports.hpp new file mode 100644 index 0000000000..c17442a686 --- /dev/null +++ b/core/libs/prx/libSceWebmParserMdrw/include/LegacyExports.hpp @@ -0,0 +1,14 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI webmParserLegacyUnknown_8XGTsRfNvNs_nid_no_patch(); +int APS5_VABI webmParserLegacyUnknown_AUzGCnIU8WM_nid_no_patch(); +int APS5_VABI webmParserLegacyUnknown_NZQ5869nvfY_nid_no_patch(); +int APS5_VABI webmParserLegacyUnknown_gq8g9It0U_minus_w_nid_no_patch(); +int APS5_VABI webmParserLegacyUnknown_vL4eBeS8uNs_nid_no_patch(); +int APS5_VABI webmParserLegacyUnknown_xnVMgJstTL4_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceWebmParserMdrw/libSceWebmParserMdrw.hpp b/core/libs/prx/libSceWebmParserMdrw/libSceWebmParserMdrw.hpp index 6f70f09bee..614bf8b954 100644 --- a/core/libs/prx/libSceWebmParserMdrw/libSceWebmParserMdrw.hpp +++ b/core/libs/prx/libSceWebmParserMdrw/libSceWebmParserMdrw.hpp @@ -1 +1,4 @@ #pragma once + +#include "prx/libSceWebmParserMdrw/include/Api.hpp" +#include "prx/libSceWebmParserMdrw/include/LegacyExports.hpp" diff --git a/core/libs/prx/libSceXml/Export.cpp b/core/libs/prx/libSceXml/Export.cpp index 6459243e92..9515d73682 100644 --- a/core/libs/prx/libSceXml/Export.cpp +++ b/core/libs/prx/libSceXml/Export.cpp @@ -3,23 +3,45 @@ #include #include "SceTypes.hpp" #include "prx/libc/include/General.hpp" +#include + +namespace { + +void AssignNodeId(XmlNodeId* self, const XmlNodeId& value) { + self->first = value.first; + self->second = value.second; + self->flag = value.flag; +} + +void CopyNode(XmlNode* self, const XmlNode* other) { + AssignNodeId(&self->id, other->id); + self->document = other->document; + self->node = other->node; + for (int i = 0; i < 3; ++i) self->state[i] = other->state[i]; +} + +} extern "C" { -int APS5_VABI _ZN3sce3Xml10SimpleDataC1EPKcm() { - NotImplemented_nid_no_patch(__func__); +void APS5_VABI _ZN3sce3Xml10SimpleDataC1EPKcm(XmlSimpleData* self, const char* data, std::size_t size) { + self->data = data; + self->size = size; } -int APS5_VABI _ZN3sce3Xml10SimpleDataC1Ev() { - NotImplemented_nid_no_patch(__func__); +void APS5_VABI _ZN3sce3Xml10SimpleDataC1Ev(XmlSimpleData* self) { + self->data = nullptr; + self->size = 0; } -int APS5_VABI _ZN3sce3Xml10SimpleDataC2EPKcm() { - NotImplemented_nid_no_patch(__func__); +void APS5_VABI _ZN3sce3Xml10SimpleDataC2EPKcm(XmlSimpleData* self, const char* data, std::size_t size) { + self->data = data; + self->size = size; } -int APS5_VABI _ZN3sce3Xml10SimpleDataC2Ev() { - NotImplemented_nid_no_patch(__func__); +void APS5_VABI _ZN3sce3Xml10SimpleDataC2Ev(XmlSimpleData* self) { + self->data = nullptr; + self->size = 0; } int APS5_VABI _ZN3sce3Xml11Initializer10initializeEPKNS0_13InitParameterE() { @@ -30,12 +52,12 @@ int APS5_VABI _ZN3sce3Xml11Initializer9terminateEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3sce3Xml11InitializerC1Ev() { - NotImplemented_nid_no_patch(__func__); +void APS5_VABI _ZN3sce3Xml11InitializerC1Ev(XmlHandle* self) { + self->impl = nullptr; } -int APS5_VABI _ZN3sce3Xml11InitializerC2Ev() { - NotImplemented_nid_no_patch(__func__); +void APS5_VABI _ZN3sce3Xml11InitializerC2Ev(XmlHandle* self) { + self->impl = nullptr; } int APS5_VABI _ZN3sce3Xml11InitializerD1Ev() { @@ -54,12 +76,10 @@ int APS5_VABI _ZN3sce3Xml12MemAllocatorD0Ev() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3sce3Xml12MemAllocatorD1Ev() { - NotImplemented_nid_no_patch(__func__); +void APS5_VABI _ZN3sce3Xml12MemAllocatorD1Ev(void*) { } -int APS5_VABI _ZN3sce3Xml12MemAllocatorD2Ev() { - NotImplemented_nid_no_patch(__func__); +void APS5_VABI _ZN3sce3Xml12MemAllocatorD2Ev(void*) { } int APS5_VABI _ZN3sce3Xml13AttributeList10initializeEPKNS0_11InitializerE() { @@ -82,16 +102,16 @@ int APS5_VABI _ZN3sce3Xml13AttributeListC1ERKS1_() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3sce3Xml13AttributeListC1Ev() { - NotImplemented_nid_no_patch(__func__); +void APS5_VABI _ZN3sce3Xml13AttributeListC1Ev(XmlHandle* self) { + self->impl = nullptr; } int APS5_VABI _ZN3sce3Xml13AttributeListC2ERKS1_() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3sce3Xml13AttributeListC2Ev() { - NotImplemented_nid_no_patch(__func__); +void APS5_VABI _ZN3sce3Xml13AttributeListC2Ev(XmlHandle* self) { + self->impl = nullptr; } int APS5_VABI _ZN3sce3Xml13AttributeListD1Ev() { @@ -102,12 +122,16 @@ int APS5_VABI _ZN3sce3Xml13AttributeListD2Ev() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3sce3Xml18SerializeParameterC1Ev() { - NotImplemented_nid_no_patch(__func__); +void APS5_VABI _ZN3sce3Xml18SerializeParameterC1Ev(XmlSerializeParameter* self) { + self->first = 0; + self->second = 0; + self->third = 0; } -int APS5_VABI _ZN3sce3Xml18SerializeParameterC2Ev() { - NotImplemented_nid_no_patch(__func__); +void APS5_VABI _ZN3sce3Xml18SerializeParameterC2Ev(XmlSerializeParameter* self) { + self->first = 0; + self->second = 0; + self->third = 0; } int APS5_VABI _ZN3sce3Xml3Dom15DocumentBuilder10initializeEPKNS0_11InitializerE() { @@ -138,12 +162,12 @@ int APS5_VABI _ZN3sce3Xml3Dom15DocumentBuilder9terminateEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3sce3Xml3Dom15DocumentBuilderC1Ev() { - NotImplemented_nid_no_patch(__func__); +void APS5_VABI _ZN3sce3Xml3Dom15DocumentBuilderC1Ev(XmlHandle* self) { + self->impl = nullptr; } -int APS5_VABI _ZN3sce3Xml3Dom15DocumentBuilderC2Ev() { - NotImplemented_nid_no_patch(__func__); +void APS5_VABI _ZN3sce3Xml3Dom15DocumentBuilderC2Ev(XmlHandle* self) { + self->impl = nullptr; } int APS5_VABI _ZN3sce3Xml3Dom15DocumentBuilderD1Ev() { @@ -170,16 +194,16 @@ int APS5_VABI _ZN3sce3Xml3Dom4NodeC1ENS1_6NodeIdE() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3sce3Xml3Dom4NodeC1ERKS2_() { - NotImplemented_nid_no_patch(__func__); +void APS5_VABI _ZN3sce3Xml3Dom4NodeC1ERKS2_(XmlNode* self, const XmlNode* other) { + CopyNode(self, other); } int APS5_VABI _ZN3sce3Xml3Dom4NodeC2ENS1_6NodeIdE() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3sce3Xml3Dom4NodeC2ERKS2_() { - NotImplemented_nid_no_patch(__func__); +void APS5_VABI _ZN3sce3Xml3Dom4NodeC2ERKS2_(XmlNode* self, const XmlNode* other) { + CopyNode(self, other); } int APS5_VABI _ZN3sce3Xml3Dom4NodeD1Ev() { @@ -190,44 +214,56 @@ int APS5_VABI _ZN3sce3Xml3Dom4NodeD2Ev() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3sce3Xml3Dom4NodeaSERKS2_() { - NotImplemented_nid_no_patch(__func__); +XmlNode* APS5_VABI _ZN3sce3Xml3Dom4NodeaSERKS2_(XmlNode* self, const XmlNode* other) { + if (self != other) CopyNode(self, other); + return self; } -int APS5_VABI _ZN3sce3Xml3Dom6NodeIdC1EPvS3_b() { - NotImplemented_nid_no_patch(__func__); +void APS5_VABI _ZN3sce3Xml3Dom6NodeIdC1EPvS3_b(XmlNodeId* self, void* first, void* second, std::uint8_t flag) { + self->first = first; + self->second = second; + self->flag = flag; } -int APS5_VABI _ZN3sce3Xml3Dom6NodeIdC1Ev() { - NotImplemented_nid_no_patch(__func__); +void APS5_VABI _ZN3sce3Xml3Dom6NodeIdC1Ev(XmlNodeId* self) { + self->first = nullptr; + self->second = nullptr; + self->flag = 0; } -int APS5_VABI _ZN3sce3Xml3Dom6NodeIdC2EPvS3_b() { - NotImplemented_nid_no_patch(__func__); +void APS5_VABI _ZN3sce3Xml3Dom6NodeIdC2EPvS3_b(XmlNodeId* self, void* first, void* second, std::uint8_t flag) { + self->first = first; + self->second = second; + self->flag = flag; } -int APS5_VABI _ZN3sce3Xml3Dom6NodeIdC2Ev() { - NotImplemented_nid_no_patch(__func__); +void APS5_VABI _ZN3sce3Xml3Dom6NodeIdC2Ev(XmlNodeId* self) { + self->first = nullptr; + self->second = nullptr; + self->flag = 0; } -int APS5_VABI _ZN3sce3Xml3Dom6NodeIdaSES2_() { - NotImplemented_nid_no_patch(__func__); +XmlNodeId APS5_VABI _ZN3sce3Xml3Dom6NodeIdaSES2_(XmlNodeId* self, XmlNodeId value) { + AssignNodeId(self, value); + XmlNodeId result; + std::memcpy(&result, self, sizeof(result)); + return result; } -int APS5_VABI _ZN3sce3Xml3Dom6NodeIdcvPvEv() { - NotImplemented_nid_no_patch(__func__); +void* APS5_VABI _ZN3sce3Xml3Dom6NodeIdcvPvEv(XmlNodeId*) { + return nullptr; } -int APS5_VABI _ZN3sce3Xml3Dom6NodeIdeqES2_() { - NotImplemented_nid_no_patch(__func__); +bool APS5_VABI _ZN3sce3Xml3Dom6NodeIdeqES2_(const XmlNodeId* self, XmlNodeId other) { + return other.first == self->first && other.second == self->second && other.flag == self->flag; } int APS5_VABI _ZN3sce3Xml3Dom6NodeIdeqEi() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3sce3Xml3Dom6NodeIdneES2_() { - NotImplemented_nid_no_patch(__func__); +bool APS5_VABI _ZN3sce3Xml3Dom6NodeIdneES2_(const XmlNodeId* self, XmlNodeId other) { + return other.first != self->first || other.second != self->second || other.flag != self->flag; } int APS5_VABI _ZN3sce3Xml3Dom6NodeIdneEi() { @@ -318,16 +354,16 @@ int APS5_VABI _ZN3sce3Xml3Dom8DocumentC1ERKS2_() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3sce3Xml3Dom8DocumentC1Ev() { - NotImplemented_nid_no_patch(__func__); +void APS5_VABI _ZN3sce3Xml3Dom8DocumentC1Ev(XmlHandle* self) { + self->impl = nullptr; } int APS5_VABI _ZN3sce3Xml3Dom8DocumentC2ERKS2_() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3sce3Xml3Dom8DocumentC2Ev() { - NotImplemented_nid_no_patch(__func__); +void APS5_VABI _ZN3sce3Xml3Dom8DocumentC2Ev(XmlHandle* self) { + self->impl = nullptr; } int APS5_VABI _ZN3sce3Xml3Dom8DocumentD1Ev() { @@ -370,16 +406,16 @@ int APS5_VABI _ZN3sce3Xml3Dom8NodeListC1ERKS2_() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3sce3Xml3Dom8NodeListC1Ev() { - NotImplemented_nid_no_patch(__func__); +void APS5_VABI _ZN3sce3Xml3Dom8NodeListC1Ev(XmlHandle* self) { + self->impl = nullptr; } int APS5_VABI _ZN3sce3Xml3Dom8NodeListC2ERKS2_() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3sce3Xml3Dom8NodeListC2Ev() { - NotImplemented_nid_no_patch(__func__); +void APS5_VABI _ZN3sce3Xml3Dom8NodeListC2Ev(XmlHandle* self) { + self->impl = nullptr; } int APS5_VABI _ZN3sce3Xml3Dom8NodeListD1Ev() { @@ -422,12 +458,12 @@ int APS5_VABI _ZN3sce3Xml3Sax6Parser9terminateEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3sce3Xml3Sax6ParserC1Ev() { - NotImplemented_nid_no_patch(__func__); +void APS5_VABI _ZN3sce3Xml3Sax6ParserC1Ev(XmlHandle* self) { + self->impl = nullptr; } -int APS5_VABI _ZN3sce3Xml3Sax6ParserC2Ev() { - NotImplemented_nid_no_patch(__func__); +void APS5_VABI _ZN3sce3Xml3Sax6ParserC2Ev(XmlHandle* self) { + self->impl = nullptr; } int APS5_VABI _ZN3sce3Xml3Sax6ParserD1Ev() { @@ -458,16 +494,16 @@ int APS5_VABI _ZN3sce3Xml4AttrC1ERKS1_() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3sce3Xml4AttrC1Ev() { - NotImplemented_nid_no_patch(__func__); +void APS5_VABI _ZN3sce3Xml4AttrC1Ev(XmlHandle* self) { + self->impl = nullptr; } int APS5_VABI _ZN3sce3Xml4AttrC2ERKS1_() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3sce3Xml4AttrC2Ev() { - NotImplemented_nid_no_patch(__func__); +void APS5_VABI _ZN3sce3Xml4AttrC2Ev(XmlHandle* self) { + self->impl = nullptr; } int APS5_VABI _ZN3sce3Xml4AttrD1Ev() { @@ -486,40 +522,50 @@ int APS5_VABI _ZN3sce3Xml4Util9strResultEi() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZN3sce3Xml6StringC1EPKc() { - NotImplemented_nid_no_patch(__func__); +void APS5_VABI _ZN3sce3Xml6StringC1EPKc(XmlString* self, const char* buffer) { + self->buffer = buffer; + self->size = buffer != nullptr ? std::strlen(buffer) : 0; } -int APS5_VABI _ZN3sce3Xml6StringC1EPKcm() { - NotImplemented_nid_no_patch(__func__); +void APS5_VABI _ZN3sce3Xml6StringC1EPKcm(XmlString* self, const char* buffer, std::size_t size) { + self->buffer = buffer; + self->size = size; } -int APS5_VABI _ZN3sce3Xml6StringC1ERKS1_() { - NotImplemented_nid_no_patch(__func__); +void APS5_VABI _ZN3sce3Xml6StringC1ERKS1_(XmlString* self, const XmlString* other) { + self->buffer = other->buffer; + self->size = other->size; } -int APS5_VABI _ZN3sce3Xml6StringC1Ev() { - NotImplemented_nid_no_patch(__func__); +void APS5_VABI _ZN3sce3Xml6StringC1Ev(XmlString* self) { + self->buffer = nullptr; + self->size = 0; } -int APS5_VABI _ZN3sce3Xml6StringC2EPKc() { - NotImplemented_nid_no_patch(__func__); +void APS5_VABI _ZN3sce3Xml6StringC2EPKc(XmlString* self, const char* buffer) { + self->buffer = buffer; + self->size = buffer != nullptr ? std::strlen(buffer) : 0; } -int APS5_VABI _ZN3sce3Xml6StringC2EPKcm() { - NotImplemented_nid_no_patch(__func__); +void APS5_VABI _ZN3sce3Xml6StringC2EPKcm(XmlString* self, const char* buffer, std::size_t size) { + self->buffer = buffer; + self->size = size; } -int APS5_VABI _ZN3sce3Xml6StringC2ERKS1_() { - NotImplemented_nid_no_patch(__func__); +void APS5_VABI _ZN3sce3Xml6StringC2ERKS1_(XmlString* self, const XmlString* other) { + self->buffer = other->buffer; + self->size = other->size; } -int APS5_VABI _ZN3sce3Xml6StringC2Ev() { - NotImplemented_nid_no_patch(__func__); +void APS5_VABI _ZN3sce3Xml6StringC2Ev(XmlString* self) { + self->buffer = nullptr; + self->size = 0; } -int APS5_VABI _ZN3sce3Xml6StringaSERKS1_() { - NotImplemented_nid_no_patch(__func__); +XmlString* APS5_VABI _ZN3sce3Xml6StringaSERKS1_(XmlString* self, const XmlString* other) { + self->buffer = other->buffer; + self->size = other->size; + return self; } int APS5_VABI _ZNK3sce3Xml13AttributeList11isAvailableEv() { @@ -546,8 +592,8 @@ int APS5_VABI _ZNK3sce3Xml3Dom4Node11getNodeTypeEv() { NotImplemented_nid_no_patch(__func__); } -int APS5_VABI _ZNK3sce3Xml3Dom4Node11isAvailableEv() { - NotImplemented_nid_no_patch(__func__); +bool APS5_VABI _ZNK3sce3Xml3Dom4Node11isAvailableEv(const XmlNode* self) { + return self->document != nullptr && self->node != nullptr; } int APS5_VABI _ZNK3sce3Xml3Dom4Node12getLastChildEv() { diff --git a/core/libs/prx/libSceXml/include/Api.hpp b/core/libs/prx/libSceXml/include/Api.hpp index 1db2bcd2dd..777a60e2ac 100644 --- a/core/libs/prx/libSceXml/include/Api.hpp +++ b/core/libs/prx/libSceXml/include/Api.hpp @@ -1,35 +1,73 @@ #pragma once #include "SceTypes.hpp" +#include +#include + +struct XmlHandle { + void* impl; +}; + +struct XmlString { + const char* buffer; + std::size_t size; +}; + +struct XmlSimpleData { + const char* data; + std::size_t size; +}; + +struct XmlSerializeParameter { + std::uint64_t first; + std::uint64_t second; + std::uint32_t third; +}; + +struct XmlNodeId { + void* first; + void* second; + std::uint8_t flag; +}; + +struct XmlNode { + XmlNodeId id; + void* document; + void* node; + std::uint64_t state[3]; +}; + +static_assert(sizeof(XmlNodeId) == 0x18); +static_assert(sizeof(XmlNode) == 0x40); extern "C" { -int APS5_VABI _ZN3sce3Xml10SimpleDataC1EPKcm(); -int APS5_VABI _ZN3sce3Xml10SimpleDataC1Ev(); -int APS5_VABI _ZN3sce3Xml10SimpleDataC2EPKcm(); -int APS5_VABI _ZN3sce3Xml10SimpleDataC2Ev(); +void APS5_VABI _ZN3sce3Xml10SimpleDataC1EPKcm(XmlSimpleData* self, const char* data, std::size_t size); +void APS5_VABI _ZN3sce3Xml10SimpleDataC1Ev(XmlSimpleData* self); +void APS5_VABI _ZN3sce3Xml10SimpleDataC2EPKcm(XmlSimpleData* self, const char* data, std::size_t size); +void APS5_VABI _ZN3sce3Xml10SimpleDataC2Ev(XmlSimpleData* self); int APS5_VABI _ZN3sce3Xml11Initializer10initializeEPKNS0_13InitParameterE(); int APS5_VABI _ZN3sce3Xml11Initializer9terminateEv(); -int APS5_VABI _ZN3sce3Xml11InitializerC1Ev(); -int APS5_VABI _ZN3sce3Xml11InitializerC2Ev(); +void APS5_VABI _ZN3sce3Xml11InitializerC1Ev(XmlHandle* self); +void APS5_VABI _ZN3sce3Xml11InitializerC2Ev(XmlHandle* self); int APS5_VABI _ZN3sce3Xml11InitializerD1Ev(); int APS5_VABI _ZN3sce3Xml11InitializerD2Ev(); int APS5_VABI _ZN3sce3Xml12MemAllocatorC2Ev(); int APS5_VABI _ZN3sce3Xml12MemAllocatorD0Ev(); -int APS5_VABI _ZN3sce3Xml12MemAllocatorD1Ev(); -int APS5_VABI _ZN3sce3Xml12MemAllocatorD2Ev(); +void APS5_VABI _ZN3sce3Xml12MemAllocatorD1Ev(void*); +void APS5_VABI _ZN3sce3Xml12MemAllocatorD2Ev(void*); int APS5_VABI _ZN3sce3Xml13AttributeList10initializeEPKNS0_11InitializerE(); int APS5_VABI _ZN3sce3Xml13AttributeList12addAttributeEPKNS0_6StringES4_(); int APS5_VABI _ZN3sce3Xml13AttributeList5clearEv(); int APS5_VABI _ZN3sce3Xml13AttributeList9terminateEv(); int APS5_VABI _ZN3sce3Xml13AttributeListC1ERKS1_(); -int APS5_VABI _ZN3sce3Xml13AttributeListC1Ev(); +void APS5_VABI _ZN3sce3Xml13AttributeListC1Ev(XmlHandle* self); int APS5_VABI _ZN3sce3Xml13AttributeListC2ERKS1_(); -int APS5_VABI _ZN3sce3Xml13AttributeListC2Ev(); +void APS5_VABI _ZN3sce3Xml13AttributeListC2Ev(XmlHandle* self); int APS5_VABI _ZN3sce3Xml13AttributeListD1Ev(); int APS5_VABI _ZN3sce3Xml13AttributeListD2Ev(); -int APS5_VABI _ZN3sce3Xml18SerializeParameterC1Ev(); -int APS5_VABI _ZN3sce3Xml18SerializeParameterC2Ev(); +void APS5_VABI _ZN3sce3Xml18SerializeParameterC1Ev(XmlSerializeParameter* self); +void APS5_VABI _ZN3sce3Xml18SerializeParameterC2Ev(XmlSerializeParameter* self); int APS5_VABI _ZN3sce3Xml3Dom15DocumentBuilder10initializeEPKNS0_11InitializerE(); int APS5_VABI _ZN3sce3Xml3Dom15DocumentBuilder11getDocumentEv(); int APS5_VABI _ZN3sce3Xml3Dom15DocumentBuilder16setResolveEntityEb(); @@ -37,29 +75,29 @@ int APS5_VABI _ZN3sce3Xml3Dom15DocumentBuilder20setSkipIgnorableTextEb(); int APS5_VABI _ZN3sce3Xml3Dom15DocumentBuilder26setSkipIgnorableWhiteSpaceEb(); int APS5_VABI _ZN3sce3Xml3Dom15DocumentBuilder5parseEPKNS0_6StringEb(); int APS5_VABI _ZN3sce3Xml3Dom15DocumentBuilder9terminateEv(); -int APS5_VABI _ZN3sce3Xml3Dom15DocumentBuilderC1Ev(); -int APS5_VABI _ZN3sce3Xml3Dom15DocumentBuilderC2Ev(); +void APS5_VABI _ZN3sce3Xml3Dom15DocumentBuilderC1Ev(XmlHandle* self); +void APS5_VABI _ZN3sce3Xml3Dom15DocumentBuilderC2Ev(XmlHandle* self); int APS5_VABI _ZN3sce3Xml3Dom15DocumentBuilderD1Ev(); int APS5_VABI _ZN3sce3Xml3Dom15DocumentBuilderD2Ev(); int APS5_VABI _ZN3sce3Xml3Dom4Node11appendChildENS1_6NodeIdE(); int APS5_VABI _ZN3sce3Xml3Dom4Node11removeChildENS1_6NodeIdE(); int APS5_VABI _ZN3sce3Xml3Dom4Node12insertBeforeENS1_6NodeIdES3_(); int APS5_VABI _ZN3sce3Xml3Dom4NodeC1ENS1_6NodeIdE(); -int APS5_VABI _ZN3sce3Xml3Dom4NodeC1ERKS2_(); +void APS5_VABI _ZN3sce3Xml3Dom4NodeC1ERKS2_(XmlNode* self, const XmlNode* other); int APS5_VABI _ZN3sce3Xml3Dom4NodeC2ENS1_6NodeIdE(); -int APS5_VABI _ZN3sce3Xml3Dom4NodeC2ERKS2_(); +void APS5_VABI _ZN3sce3Xml3Dom4NodeC2ERKS2_(XmlNode* self, const XmlNode* other); int APS5_VABI _ZN3sce3Xml3Dom4NodeD1Ev(); int APS5_VABI _ZN3sce3Xml3Dom4NodeD2Ev(); -int APS5_VABI _ZN3sce3Xml3Dom4NodeaSERKS2_(); -int APS5_VABI _ZN3sce3Xml3Dom6NodeIdC1EPvS3_b(); -int APS5_VABI _ZN3sce3Xml3Dom6NodeIdC1Ev(); -int APS5_VABI _ZN3sce3Xml3Dom6NodeIdC2EPvS3_b(); -int APS5_VABI _ZN3sce3Xml3Dom6NodeIdC2Ev(); -int APS5_VABI _ZN3sce3Xml3Dom6NodeIdaSES2_(); -int APS5_VABI _ZN3sce3Xml3Dom6NodeIdcvPvEv(); -int APS5_VABI _ZN3sce3Xml3Dom6NodeIdeqES2_(); +XmlNode* APS5_VABI _ZN3sce3Xml3Dom4NodeaSERKS2_(XmlNode* self, const XmlNode* other); +void APS5_VABI _ZN3sce3Xml3Dom6NodeIdC1EPvS3_b(XmlNodeId* self, void* first, void* second, std::uint8_t flag); +void APS5_VABI _ZN3sce3Xml3Dom6NodeIdC1Ev(XmlNodeId* self); +void APS5_VABI _ZN3sce3Xml3Dom6NodeIdC2EPvS3_b(XmlNodeId* self, void* first, void* second, std::uint8_t flag); +void APS5_VABI _ZN3sce3Xml3Dom6NodeIdC2Ev(XmlNodeId* self); +XmlNodeId APS5_VABI _ZN3sce3Xml3Dom6NodeIdaSES2_(XmlNodeId* self, XmlNodeId value); +void* APS5_VABI _ZN3sce3Xml3Dom6NodeIdcvPvEv(XmlNodeId*); +bool APS5_VABI _ZN3sce3Xml3Dom6NodeIdeqES2_(const XmlNodeId* self, XmlNodeId other); int APS5_VABI _ZN3sce3Xml3Dom6NodeIdeqEi(); -int APS5_VABI _ZN3sce3Xml3Dom6NodeIdneES2_(); +bool APS5_VABI _ZN3sce3Xml3Dom6NodeIdneES2_(const XmlNodeId* self, XmlNodeId other); int APS5_VABI _ZN3sce3Xml3Dom6NodeIdneEi(); int APS5_VABI _ZN3sce3Xml3Dom6NodeIdntEv(); int APS5_VABI _ZN3sce3Xml3Dom8Document10importNodeENS1_6NodeIdES3_PKS2_S3_(); @@ -82,9 +120,9 @@ int APS5_VABI _ZN3sce3Xml3Dom8Document7setTextENS1_6NodeIdEPKNS0_6StringE(); int APS5_VABI _ZN3sce3Xml3Dom8Document9serializeEPKNS0_18SerializeParameterEPNS0_6StringE(); int APS5_VABI _ZN3sce3Xml3Dom8Document9terminateEv(); int APS5_VABI _ZN3sce3Xml3Dom8DocumentC1ERKS2_(); -int APS5_VABI _ZN3sce3Xml3Dom8DocumentC1Ev(); +void APS5_VABI _ZN3sce3Xml3Dom8DocumentC1Ev(XmlHandle* self); int APS5_VABI _ZN3sce3Xml3Dom8DocumentC2ERKS2_(); -int APS5_VABI _ZN3sce3Xml3Dom8DocumentC2Ev(); +void APS5_VABI _ZN3sce3Xml3Dom8DocumentC2Ev(XmlHandle* self); int APS5_VABI _ZN3sce3Xml3Dom8DocumentD1Ev(); int APS5_VABI _ZN3sce3Xml3Dom8DocumentD2Ev(); int APS5_VABI _ZN3sce3Xml3Dom8DocumentaSERKS2_(); @@ -95,9 +133,9 @@ int APS5_VABI _ZN3sce3Xml3Dom8NodeList11insertFirstENS1_6NodeIdE(); int APS5_VABI _ZN3sce3Xml3Dom8NodeList5clearEv(); int APS5_VABI _ZN3sce3Xml3Dom8NodeList9terminateEv(); int APS5_VABI _ZN3sce3Xml3Dom8NodeListC1ERKS2_(); -int APS5_VABI _ZN3sce3Xml3Dom8NodeListC1Ev(); +void APS5_VABI _ZN3sce3Xml3Dom8NodeListC1Ev(XmlHandle* self); int APS5_VABI _ZN3sce3Xml3Dom8NodeListC2ERKS2_(); -int APS5_VABI _ZN3sce3Xml3Dom8NodeListC2Ev(); +void APS5_VABI _ZN3sce3Xml3Dom8NodeListC2Ev(XmlHandle* self); int APS5_VABI _ZN3sce3Xml3Dom8NodeListD1Ev(); int APS5_VABI _ZN3sce3Xml3Dom8NodeListD2Ev(); int APS5_VABI _ZN3sce3Xml3Sax6Parser10initializeEPKNS0_11InitializerE(); @@ -108,8 +146,8 @@ int APS5_VABI _ZN3sce3Xml3Sax6Parser26setSkipIgnorableWhiteSpaceEb(); int APS5_VABI _ZN3sce3Xml3Sax6Parser5parseEPKNS0_6StringEb(); int APS5_VABI _ZN3sce3Xml3Sax6Parser5resetEv(); int APS5_VABI _ZN3sce3Xml3Sax6Parser9terminateEv(); -int APS5_VABI _ZN3sce3Xml3Sax6ParserC1Ev(); -int APS5_VABI _ZN3sce3Xml3Sax6ParserC2Ev(); +void APS5_VABI _ZN3sce3Xml3Sax6ParserC1Ev(XmlHandle* self); +void APS5_VABI _ZN3sce3Xml3Sax6ParserC2Ev(XmlHandle* self); int APS5_VABI _ZN3sce3Xml3Sax6ParserD1Ev(); int APS5_VABI _ZN3sce3Xml3Sax6ParserD2Ev(); int APS5_VABI _ZN3sce3Xml4Attr10initializeEPKNS0_11InitializerE(); @@ -117,29 +155,29 @@ int APS5_VABI _ZN3sce3Xml4Attr7setNameEPKNS0_6StringE(); int APS5_VABI _ZN3sce3Xml4Attr8setValueEPKNS0_6StringE(); int APS5_VABI _ZN3sce3Xml4Attr9terminateEv(); int APS5_VABI _ZN3sce3Xml4AttrC1ERKS1_(); -int APS5_VABI _ZN3sce3Xml4AttrC1Ev(); +void APS5_VABI _ZN3sce3Xml4AttrC1Ev(XmlHandle* self); int APS5_VABI _ZN3sce3Xml4AttrC2ERKS1_(); -int APS5_VABI _ZN3sce3Xml4AttrC2Ev(); +void APS5_VABI _ZN3sce3Xml4AttrC2Ev(XmlHandle* self); int APS5_VABI _ZN3sce3Xml4AttrD1Ev(); int APS5_VABI _ZN3sce3Xml4AttrD2Ev(); int APS5_VABI _ZN3sce3Xml4AttraSERKS1_(); int APS5_VABI _ZN3sce3Xml4Util9strResultEi(); -int APS5_VABI _ZN3sce3Xml6StringC1EPKc(); -int APS5_VABI _ZN3sce3Xml6StringC1EPKcm(); -int APS5_VABI _ZN3sce3Xml6StringC1ERKS1_(); -int APS5_VABI _ZN3sce3Xml6StringC1Ev(); -int APS5_VABI _ZN3sce3Xml6StringC2EPKc(); -int APS5_VABI _ZN3sce3Xml6StringC2EPKcm(); -int APS5_VABI _ZN3sce3Xml6StringC2ERKS1_(); -int APS5_VABI _ZN3sce3Xml6StringC2Ev(); -int APS5_VABI _ZN3sce3Xml6StringaSERKS1_(); +void APS5_VABI _ZN3sce3Xml6StringC1EPKc(XmlString* self, const char* buffer); +void APS5_VABI _ZN3sce3Xml6StringC1EPKcm(XmlString* self, const char* buffer, std::size_t size); +void APS5_VABI _ZN3sce3Xml6StringC1ERKS1_(XmlString* self, const XmlString* other); +void APS5_VABI _ZN3sce3Xml6StringC1Ev(XmlString* self); +void APS5_VABI _ZN3sce3Xml6StringC2EPKc(XmlString* self, const char* buffer); +void APS5_VABI _ZN3sce3Xml6StringC2EPKcm(XmlString* self, const char* buffer, std::size_t size); +void APS5_VABI _ZN3sce3Xml6StringC2ERKS1_(XmlString* self, const XmlString* other); +void APS5_VABI _ZN3sce3Xml6StringC2Ev(XmlString* self); +XmlString* APS5_VABI _ZN3sce3Xml6StringaSERKS1_(XmlString* self, const XmlString* other); int APS5_VABI _ZNK3sce3Xml13AttributeList11isAvailableEv(); int APS5_VABI _ZNK3sce3Xml13AttributeList12getAttributeEPKNS0_6StringE(); int APS5_VABI _ZNK3sce3Xml13AttributeList12getAttributeEj(); int APS5_VABI _ZNK3sce3Xml13AttributeList9getLengthEv(); int APS5_VABI _ZNK3sce3Xml3Dom4Node11getNodeNameEv(); int APS5_VABI _ZNK3sce3Xml3Dom4Node11getNodeTypeEv(); -int APS5_VABI _ZNK3sce3Xml3Dom4Node11isAvailableEv(); +bool APS5_VABI _ZNK3sce3Xml3Dom4Node11isAvailableEv(const XmlNode* self); int APS5_VABI _ZNK3sce3Xml3Dom4Node12getLastChildEv(); int APS5_VABI _ZNK3sce3Xml3Dom4Node12getNodeValueEv(); int APS5_VABI _ZNK3sce3Xml3Dom4Node13getAttributesEPNS1_8NodeListE(); diff --git a/core/libs/prx/libc/CMakeLists.txt b/core/libs/prx/libc/CMakeLists.txt index 176bc416d1..a65adb325e 100644 --- a/core/libs/prx/libc/CMakeLists.txt +++ b/core/libs/prx/libc/CMakeLists.txt @@ -262,6 +262,16 @@ if(BUILD_TESTING) "PATH=path_list_prepend:$") endif() + add_test_executable(guest_memccpy_bounds_tests ${LIBS_INCLUDE_DIR}/tests/GuestMemccpyBounds.cpp) + target_include_directories(guest_memccpy_bounds_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_memccpy_bounds_tests PRIVATE libc) + configure_windows_unwind(guest_memccpy_bounds_tests) + add_test(NAME guest_memccpy_bounds COMMAND guest_memccpy_bounds_tests) + set_tests_properties(guest_memccpy_bounds PROPERTIES TIMEOUT 20) + if(WIN32) + set_tests_properties(guest_memccpy_bounds PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() add_test_executable(guest_allocating_strings_tests ${LIBS_INCLUDE_DIR}/tests/GuestAllocatingStrings.cpp) target_include_directories(guest_allocating_strings_tests PRIVATE ${LIBS_INCLUDE_DIR}) target_link_libraries(guest_allocating_strings_tests PRIVATE libc libkernel) diff --git a/core/libs/prx/libc/src/DinkumwareInternals.cpp b/core/libs/prx/libc/src/DinkumwareInternals.cpp index b0b0f6ee43..c7156b0902 100644 --- a/core/libs/prx/libc/src/DinkumwareInternals.cpp +++ b/core/libs/prx/libc/src/DinkumwareInternals.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -32,6 +33,170 @@ bool Hexadecimal(const char* text) { return text[0] == '0' && (text[1] == 'x' || text[1] == 'X'); } +int HexadecimalDigit(char value) { + if (value >= '0' && value <= '9') return value - '0'; + if (value >= 'a' && value <= 'f') return value - 'a' + 10; + if (value >= 'A' && value <= 'F') return value - 'A' + 10; + return -1; +} + +template +TFloat ScaleHexadecimal(TFloat value, std::int64_t power) { + constexpr unsigned Precision = std::numeric_limits::digits; + static_assert(Precision == 24 || Precision == 53 || Precision == 64); + constexpr auto Hidden = std::uint64_t{1} << (Precision - 1); + constexpr int MaximumExponent = 2 * std::numeric_limits::max_exponent - 1; + std::uint64_t mantissa; + int exponent; + if constexpr (sizeof(TFloat) == 4) { + const auto bits = std::bit_cast(value); + mantissa = (bits & (Hidden - 1)) | Hidden; + exponent = (bits >> (Precision - 1)) & MaximumExponent; + } else if constexpr (sizeof(TFloat) == 8) { + const auto bits = std::bit_cast(value); + mantissa = (bits & (Hidden - 1)) | Hidden; + exponent = (bits >> (Precision - 1)) & MaximumExponent; + } else { + static_assert(Precision == 64 && sizeof(TFloat) >= 10 && std::endian::native == std::endian::little); + std::uint16_t encoded; + std::memcpy(&mantissa, &value, sizeof(mantissa)); + std::memcpy(&encoded, reinterpret_cast(&value) + 8, sizeof(encoded)); + exponent = encoded & MaximumExponent; + } + auto adjusted = exponent + power; + if (adjusted >= MaximumExponent) return std::numeric_limits::infinity(); + if (adjusted <= 0) { + const auto shift = 1 - adjusted; + if (shift > Precision) return static_cast(0); + const auto remainder = shift == 64 ? mantissa : mantissa & ((std::uint64_t{1} << shift) - 1); + mantissa = shift == 64 ? 0 : mantissa >> shift; + if (remainder != 0) { + GuestFloatingPointEnvironment environment; + if (fegetenv_nid_postfix(&environment) != 0) throw std::runtime_error("cannot read hexadecimal binary rounding"); + const auto rounding = (environment.control >> 10u) & 3u; + const auto half = std::uint64_t{1} << (shift - 1); + if (rounding == 2u || (rounding == 0u && (remainder > half || (remainder == half && (mantissa & 1u) != 0)))) ++mantissa; + } + adjusted = (mantissa & Hidden) != 0 ? 1 : 0; + } + if constexpr (sizeof(TFloat) == 4) { + return std::bit_cast(static_cast((static_cast(adjusted) << (Precision - 1)) | (mantissa & (Hidden - 1)))); + } else if constexpr (sizeof(TFloat) == 8) { + return std::bit_cast((static_cast(adjusted) << (Precision - 1)) | (mantissa & (Hidden - 1))); + } else { + const auto encoded = static_cast(adjusted); + std::memcpy(&value, &mantissa, sizeof(mantissa)); + std::memcpy(reinterpret_cast(&value) + 8, &encoded, sizeof(encoded)); + return value; + } +} + +template +std::optional UnscaledHexadecimal(const char* text, char** end) { + const char* cursor = text; + while (std::isspace(static_cast(*cursor))) ++cursor; + const bool negative = *cursor == '-'; + if (*cursor == '+' || *cursor == '-') ++cursor; + cursor += 2; + constexpr std::size_t Capacity = 7 * ((std::numeric_limits::digits + 27) / 28); + static_assert(Capacity * 4 < std::numeric_limits::max_exponent); + constexpr auto CountLimit = std::numeric_limits::max() / 16; + std::string digits; + bool point = false; + bool any = false; + bool significant = false; + std::int64_t fractional = 0; + std::int64_t discarded = 0; + int carry = 0; + for (;;) { + const int digit = HexadecimalDigit(*cursor); + if (digit < 0) { + if (*cursor == '.' && !point) { point = true; ++cursor; continue; } + break; + } + any = true; + if (point) { + if (fractional == CountLimit) throw std::length_error("hexadecimal floating input is too long"); + ++fractional; + } + significant |= digit != 0; + if (significant) { + if (digits.size() < Capacity) digits += "0123456789abcdef"[digit]; + else { + if (discarded == 0) carry = digit >= 8; + if (discarded == CountLimit) throw std::length_error("hexadecimal floating input is too long"); + ++discarded; + } + } + ++cursor; + } + if (!any) return std::nullopt; + const auto adjustment = 4 * (discarded - fractional); + const auto bound = std::abs(adjustment) + 2 * std::numeric_limits::max_exponent + static_cast(Capacity * 4 + 1); + std::int64_t exponent = 0; + if (*cursor == 'p' || *cursor == 'P') { + const char* first = cursor + 1; + const bool minus = *first == '-'; + if (*first == '+' || *first == '-') ++first; + if (std::isdigit(static_cast(*first))) { + do { + const int digit = *first++ - '0'; + exponent = exponent > (bound - digit) / 10 ? bound : exponent * 10 + digit; + } while (std::isdigit(static_cast(*first))); + if (minus) exponent = -exponent; + cursor = first; + } + } + if (end != nullptr) *end = const_cast(cursor); + if (digits.empty()) return std::copysign(static_cast(0), negative ? static_cast(-1) : static_cast(1)); + exponent += adjustment; + if (carry == 0) while (digits.back() == '0') { digits.pop_back(); exponent += 4; } + std::uint64_t high = 0; + std::uint64_t low = 0; + for (const char digit : digits) { + high = (high << 4u) | (low >> 60u); + low = (low << 4u) | static_cast(HexadecimalDigit(digit)); + } + TFloat value; + if constexpr (std::numeric_limits::digits <= 53) value = static_cast(low + carry); + else { + const auto top = static_cast((high << 8u) | (low >> 56u)); + const auto middle = static_cast((low >> 28u) & 0xfffffffu); + const auto bottom = static_cast(low & 0xfffffffu) + carry; + constexpr TFloat Radix = static_cast(0x1p28L); + constexpr unsigned LimbBits = std::numeric_limits::digits / 2; + TFloat limbs[3]{}; + const auto add = [&](TFloat word) { + for (auto& part : limbs) { + if (word == 0) return; + if (part == 0) { part = word; return; } + std::uint16_t partExponent, wordExponent; + std::memcpy(&partExponent, reinterpret_cast(&part) + 8, sizeof(partExponent)); + std::memcpy(&wordExponent, reinterpret_cast(&word) + 8, sizeof(wordExponent)); + if (static_cast(partExponent) - static_cast(wordExponent) >= static_cast(LimbBits)) continue; + const TFloat sum = part + word; + std::uint64_t mantissa; + std::memcpy(&mantissa, &sum, sizeof(mantissa)); + mantissa &= ~((std::uint64_t{1} << LimbBits) - 1); + TFloat upper = sum; + std::memcpy(&upper, &mantissa, sizeof(mantissa)); + part = upper; + word = sum - upper; + } + if (word != 0) throw std::runtime_error("coefficient expansion exceeded capacity"); + }; + add(static_cast(top)); + for (auto& part : limbs) part *= Radix; + add(static_cast(middle)); + for (auto& part : limbs) part *= Radix; + add(static_cast(bottom)); + value = 0; + for (int index = 2; index >= 0; --index) if (limbs[index] != 0) { if (value == 0) value = limbs[index]; else value += limbs[index]; } + } + if (exponent != 0) value = ScaleHexadecimal(value, exponent); + return std::copysign(value, negative ? static_cast(-1) : static_cast(1)); +} + template TFloat ScaledFloat(const char* text, char** end, std::int64_t pten, int* error, TFloat (APS5_VABI *parse)(const char*, char**), const char* function) { int& guestErrno = *__error_nid_postfix(); @@ -42,6 +207,12 @@ TFloat ScaledFloat(const char* text, char** end, std::int64_t pten, int* error, return std::numeric_limits::quiet_NaN(); } guestErrno = 0; + if (pten == 0 && text != nullptr && Hexadecimal(text)) { + if (const auto value = UnscaledHexadecimal(text, end)) { + guestErrno = saved; + return *value; + } + } char* stop = nullptr; TFloat value = parse(text, &stop); if (end != nullptr) *end = stop; diff --git a/core/libs/prx/libc/src/Formatting.cpp b/core/libs/prx/libc/src/Formatting.cpp index 0ddde07db8..087f3b15b7 100644 --- a/core/libs/prx/libc/src/Formatting.cpp +++ b/core/libs/prx/libc/src/Formatting.cpp @@ -102,6 +102,7 @@ const char* CutAtQuadScanDirective(const char* format, std::string& head) { #endif std::string HostLength(const std::string& length, char conversion) { + if (std::strchr("sc[", conversion) && length != "l") return {}; #ifdef _WIN32 if (length == "l" && std::strchr("diouxXn", conversion) != nullptr) return "ll"; #else @@ -110,7 +111,46 @@ std::string HostLength(const std::string& length, char conversion) { return length; } +const char* ScanLengthEnd(const char* cursor) { + if (*cursor == 'h' || *cursor == 'l') { + const char first = *cursor++; + if (*cursor == first) ++cursor; + } else if (*cursor != '\0' && std::strchr("jztL", *cursor)) ++cursor; + return cursor; +} + +const char* HostScanFormat(const char* format, std::string& normalized) { + if (format == nullptr) return format; + const char* copied = format; + const char* cursor = format; + while ((cursor = std::strchr(cursor, '%')) != nullptr) { + ++cursor; + if (*cursor == '%') { ++cursor; continue; } + while (*cursor && std::strchr("-+ #0'0123456789.*$", *cursor)) ++cursor; + const char* const length = cursor; + cursor = ScanLengthEnd(cursor); + const bool wide = cursor == length + 1 && *length == 'l'; + if (cursor != length && !wide && *cursor && std::strchr("sc[", *cursor)) { + normalized.append(copied, length); + copied = cursor; + } + if (*cursor == '[') { + ++cursor; + if (*cursor == '^') ++cursor; + if (*cursor == ']') ++cursor; + while (*cursor && *cursor != ']') ++cursor; + } + if (*cursor) ++cursor; + else break; + } + if (copied == format) return format; + normalized.append(copied); + return normalized.c_str(); +} + int HostVsscanf(const char* input, const char* format, std::va_list args) { + std::string normalized; + format = HostScanFormat(format, normalized); #if defined(__GLIBC__) const int savedError = errno; const int result = __isoc99_vsscanf(input, format, args); @@ -131,8 +171,13 @@ int HostSscanf(const char* input, const char* format, ...) { #ifndef _WIN32 int HostVfscanf(std::FILE* stream, const char* format, std::va_list args) { + std::string normalized; + format = HostScanFormat(format, normalized); #if defined(__GLIBC__) - return __isoc99_vfscanf(stream, format, args); + const int savedError = errno; + const int result = __isoc99_vfscanf(stream, format, args); + if (result == EOF && errno == 0) errno = savedError; + return result; #else return std::vfscanf(stream, format, args); #endif diff --git a/core/libs/prx/libfreetype/Export.cpp b/core/libs/prx/libfreetype/Export.cpp new file mode 100644 index 0000000000..b8064f6b90 --- /dev/null +++ b/core/libs/prx/libfreetype/Export.cpp @@ -0,0 +1,132 @@ +#include "prx/libfreetype/include/LegacyExports.hpp" +#include "prx/libfreetype/include/InventoryExports.hpp" +#include "prx/libc/include/General.hpp" +#include "prx/libc/include/general/ExportMacros.hpp" + +extern "C" { + +int APS5_VABI libfreetypeUnknown__plus_AF9KH7aZbc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+AF9KH7aZbc", libfreetypeUnknown__plus_AF9KH7aZbc_nid_no_patch); + +int APS5_VABI libfreetypeUnknown__plus_sDVkl3aAR8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+sDVkl3aAR8", libfreetypeUnknown__plus_sDVkl3aAR8_nid_no_patch); + +int APS5_VABI libfreetypeUnknown_iuebdW9Mi0U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iuebdW9Mi0U", libfreetypeUnknown_iuebdW9Mi0U_nid_no_patch); + +int APS5_VABI libfreetypeUnknown_qCyybpSyZzI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qCyybpSyZzI", libfreetypeUnknown_qCyybpSyZzI_nid_no_patch); + +int APS5_VABI libfreetypeUnknown_ypZKJwPSVgQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ypZKJwPSVgQ", libfreetypeUnknown_ypZKJwPSVgQ_nid_no_patch); + +} + +extern "C" { + +int APS5_VABI freetypeLegacyUnknown_4kVFLShKGkQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4kVFLShKGkQ", freetypeLegacyUnknown_4kVFLShKGkQ_nid_no_patch); + +int APS5_VABI freetypeLegacyUnknown_C3_minus_qsnriefE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("C3-qsnriefE", freetypeLegacyUnknown_C3_minus_qsnriefE_nid_no_patch); + +int APS5_VABI freetypeLegacyUnknown_DYbLD_minus_s1oiQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DYbLD-s1oiQ", freetypeLegacyUnknown_DYbLD_minus_s1oiQ_nid_no_patch); + +int APS5_VABI freetypeLegacyUnknown_EPNrOPQ5B14_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EPNrOPQ5B14", freetypeLegacyUnknown_EPNrOPQ5B14_nid_no_patch); + +int APS5_VABI freetypeLegacyUnknown_JuHk_minus_xDmRmI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JuHk-xDmRmI", freetypeLegacyUnknown_JuHk_minus_xDmRmI_nid_no_patch); + +int APS5_VABI freetypeLegacyUnknown_K9ZOPLPOqbY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("K9ZOPLPOqbY", freetypeLegacyUnknown_K9ZOPLPOqbY_nid_no_patch); + +int APS5_VABI freetypeLegacyUnknown_KVRW5HPnbgU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KVRW5HPnbgU", freetypeLegacyUnknown_KVRW5HPnbgU_nid_no_patch); + +int APS5_VABI freetypeLegacyUnknown_MDsMjUGulyY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MDsMjUGulyY", freetypeLegacyUnknown_MDsMjUGulyY_nid_no_patch); + +int APS5_VABI freetypeLegacyUnknown_NbFQEYieSS0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NbFQEYieSS0", freetypeLegacyUnknown_NbFQEYieSS0_nid_no_patch); + +int APS5_VABI freetypeLegacyUnknown_OGVR5us9otU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OGVR5us9otU", freetypeLegacyUnknown_OGVR5us9otU_nid_no_patch); + +int APS5_VABI freetypeLegacyUnknown_PS_minus_iwpPa2tc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PS-iwpPa2tc", freetypeLegacyUnknown_PS_minus_iwpPa2tc_nid_no_patch); + +int APS5_VABI freetypeLegacyUnknown_V476bsxEylk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("V476bsxEylk", freetypeLegacyUnknown_V476bsxEylk_nid_no_patch); + +int APS5_VABI freetypeLegacyUnknown_VKuZXhyjtoo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VKuZXhyjtoo", freetypeLegacyUnknown_VKuZXhyjtoo_nid_no_patch); + +int APS5_VABI freetypeLegacyUnknown_Xxtq_plus_Qr5lzI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Xxtq+Qr5lzI", freetypeLegacyUnknown_Xxtq_plus_Qr5lzI_nid_no_patch); + +int APS5_VABI freetypeLegacyUnknown_boXwTAWsas0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("boXwTAWsas0", freetypeLegacyUnknown_boXwTAWsas0_nid_no_patch); + +int APS5_VABI freetypeLegacyUnknown_ctqkAfkma_minus_k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ctqkAfkma-k", freetypeLegacyUnknown_ctqkAfkma_minus_k_nid_no_patch); + +int APS5_VABI freetypeLegacyUnknown_hKvvpNeUdKo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hKvvpNeUdKo", freetypeLegacyUnknown_hKvvpNeUdKo_nid_no_patch); + +int APS5_VABI freetypeLegacyUnknown_sZq9oSwMGSs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sZq9oSwMGSs", freetypeLegacyUnknown_sZq9oSwMGSs_nid_no_patch); + +int APS5_VABI freetypeLegacyUnknown_suWwpZzQl00_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("suWwpZzQl00", freetypeLegacyUnknown_suWwpZzQl00_nid_no_patch); + +} diff --git a/core/libs/prx/libfreetype/include/InventoryExports.hpp b/core/libs/prx/libfreetype/include/InventoryExports.hpp new file mode 100644 index 0000000000..032458af25 --- /dev/null +++ b/core/libs/prx/libfreetype/include/InventoryExports.hpp @@ -0,0 +1,13 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libfreetypeUnknown__plus_AF9KH7aZbc_nid_no_patch(); +int APS5_VABI libfreetypeUnknown__plus_sDVkl3aAR8_nid_no_patch(); +int APS5_VABI libfreetypeUnknown_iuebdW9Mi0U_nid_no_patch(); +int APS5_VABI libfreetypeUnknown_qCyybpSyZzI_nid_no_patch(); +int APS5_VABI libfreetypeUnknown_ypZKJwPSVgQ_nid_no_patch(); + +} diff --git a/core/libs/prx/libfreetype/include/LegacyExports.hpp b/core/libs/prx/libfreetype/include/LegacyExports.hpp new file mode 100644 index 0000000000..a3aaf7c301 --- /dev/null +++ b/core/libs/prx/libfreetype/include/LegacyExports.hpp @@ -0,0 +1,27 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI freetypeLegacyUnknown_4kVFLShKGkQ_nid_no_patch(); +int APS5_VABI freetypeLegacyUnknown_C3_minus_qsnriefE_nid_no_patch(); +int APS5_VABI freetypeLegacyUnknown_DYbLD_minus_s1oiQ_nid_no_patch(); +int APS5_VABI freetypeLegacyUnknown_EPNrOPQ5B14_nid_no_patch(); +int APS5_VABI freetypeLegacyUnknown_JuHk_minus_xDmRmI_nid_no_patch(); +int APS5_VABI freetypeLegacyUnknown_K9ZOPLPOqbY_nid_no_patch(); +int APS5_VABI freetypeLegacyUnknown_KVRW5HPnbgU_nid_no_patch(); +int APS5_VABI freetypeLegacyUnknown_MDsMjUGulyY_nid_no_patch(); +int APS5_VABI freetypeLegacyUnknown_NbFQEYieSS0_nid_no_patch(); +int APS5_VABI freetypeLegacyUnknown_OGVR5us9otU_nid_no_patch(); +int APS5_VABI freetypeLegacyUnknown_PS_minus_iwpPa2tc_nid_no_patch(); +int APS5_VABI freetypeLegacyUnknown_V476bsxEylk_nid_no_patch(); +int APS5_VABI freetypeLegacyUnknown_VKuZXhyjtoo_nid_no_patch(); +int APS5_VABI freetypeLegacyUnknown_Xxtq_plus_Qr5lzI_nid_no_patch(); +int APS5_VABI freetypeLegacyUnknown_boXwTAWsas0_nid_no_patch(); +int APS5_VABI freetypeLegacyUnknown_ctqkAfkma_minus_k_nid_no_patch(); +int APS5_VABI freetypeLegacyUnknown_hKvvpNeUdKo_nid_no_patch(); +int APS5_VABI freetypeLegacyUnknown_sZq9oSwMGSs_nid_no_patch(); +int APS5_VABI freetypeLegacyUnknown_suWwpZzQl00_nid_no_patch(); + +} diff --git a/core/libs/prx/libfreetype/libfreetype.hpp b/core/libs/prx/libfreetype/libfreetype.hpp new file mode 100644 index 0000000000..1789f4e069 --- /dev/null +++ b/core/libs/prx/libfreetype/libfreetype.hpp @@ -0,0 +1,4 @@ +#pragma once + +#include "prx/libfreetype/include/InventoryExports.hpp" +#include "prx/libfreetype/include/LegacyExports.hpp" diff --git a/core/libs/prx/libkernel/CMakeLists.txt b/core/libs/prx/libkernel/CMakeLists.txt index db4512f3ec..92d099e756 100644 --- a/core/libs/prx/libkernel/CMakeLists.txt +++ b/core/libs/prx/libkernel/CMakeLists.txt @@ -776,6 +776,16 @@ if(BUILD_TESTING) set_tests_properties(guest_pthread_mutex_errors PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") endif() + add_test_executable(guest_pthread_mutex_spin_tests ${LIBS_INCLUDE_DIR}/tests/GuestPthreadMutexSpin.cpp) + target_include_directories(guest_pthread_mutex_spin_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_pthread_mutex_spin_tests PRIVATE libkernel libc) + configure_windows_unwind(guest_pthread_mutex_spin_tests) + add_test(NAME guest_pthread_mutex_spin COMMAND guest_pthread_mutex_spin_tests) + set_tests_properties(guest_pthread_mutex_spin PROPERTIES TIMEOUT 20) + if(WIN32) + set_tests_properties(guest_pthread_mutex_spin PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() add_test_executable(guest_pthread_start_tests ${LIBS_INCLUDE_DIR}/tests/PthreadStart.cpp) target_include_directories(guest_pthread_start_tests PRIVATE ${LIBS_INCLUDE_DIR}) target_link_libraries(guest_pthread_start_tests PRIVATE libkernel libc) @@ -969,7 +979,7 @@ if(BUILD_TESTING) add_test(NAME guest_timed_wait_cpu COMMAND guest_timed_wait_cpu_tests) set_tests_properties(guest_timed_wait_cpu PROPERTIES TIMEOUT 30) if(WIN32) - set_tests_properties(guest_timed_wait_cpu PROPERTIES ENVIRONMENT_MODIFICATION + set_tests_properties(guest_timed_wait_cpu PROPERTIES RUN_SERIAL TRUE ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") endif() add_test_executable(guest_pthread_sem_tests ${LIBS_INCLUDE_DIR}/tests/GuestPthreadSem.cpp) @@ -2276,6 +2286,16 @@ if(BUILD_TESTING) add_test(NAME guest_raise_leaves_host_code COMMAND guest_raise_leaves_host_code_tests) set_tests_properties(guest_raise_leaves_host_code PROPERTIES TIMEOUT 60 ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + add_test_executable(guest_raise_short_sleep_tests ${LIBS_INCLUDE_DIR}/tests/GuestRaiseShortSleep.cpp) + target_include_directories(guest_raise_short_sleep_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_raise_short_sleep_tests PRIVATE libkernel libc) + configure_windows_unwind(guest_raise_short_sleep_tests) + add_test(NAME guest_raise_short_sleep COMMAND guest_raise_short_sleep_tests) + set_tests_properties(guest_raise_short_sleep PROPERTIES TIMEOUT 30 ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + add_test(NAME guest_raise_short_sleep_without_wake COMMAND guest_raise_short_sleep_tests) + set_tests_properties(guest_raise_short_sleep_without_wake PROPERTIES TIMEOUT 30 ENVIRONMENT "APS5_NO_SLEEP_WAKE=1" ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") add_test_executable(guest_mutex_contention_tests ${LIBS_INCLUDE_DIR}/tests/GuestMutexContention.cpp) target_include_directories(guest_mutex_contention_tests PRIVATE ${LIBS_INCLUDE_DIR}) target_link_libraries(guest_mutex_contention_tests PRIVATE libkernel libc) diff --git a/core/libs/prx/libkernel/DirectMemory/DirectMemory.cpp b/core/libs/prx/libkernel/DirectMemory/DirectMemory.cpp index fd6e14827b..7eb7903cd0 100644 --- a/core/libs/prx/libkernel/DirectMemory/DirectMemory.cpp +++ b/core/libs/prx/libkernel/DirectMemory/DirectMemory.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -623,19 +624,24 @@ void ErasePhysMappings(std::uint64_t first, std::uint64_t last) { } } -void ValidatePhysicalRange(std::uint64_t phys, std::size_t len) { +std::optional FirstUnallocatedPage(std::uint64_t phys, std::size_t len) { const auto last = phys + len; auto it = g_physBlocks.upper_bound(phys); if (it != g_physBlocks.begin()) --it; for (auto cursor = phys; cursor < last;) { - if (it == g_physBlocks.end() || it->first > cursor || it->second.end <= cursor) { - char message[160]; - std::snprintf(message, sizeof(message), "direct memory range 0x%llx+0x%zx references unallocated physical page 0x%llx", static_cast(phys), len, static_cast(cursor)); - throw std::invalid_argument(message); - } + if (it == g_physBlocks.end() || it->first > cursor || it->second.end <= cursor) return cursor; cursor = std::min(last, it->second.end); ++it; } + return std::nullopt; +} + +void ValidatePhysicalRange(std::uint64_t phys, std::size_t len) { + const auto missing = FirstUnallocatedPage(phys, len); + if (!missing) return; + char message[160]; + std::snprintf(message, sizeof(message), "direct memory range 0x%llx+0x%zx references unallocated physical page 0x%llx", static_cast(phys), len, static_cast(*missing)); + throw std::invalid_argument(message); } #if defined(__linux__) @@ -1075,6 +1081,10 @@ int DoMapDirect(void** addr, size_t len, int prot, int flags, int64_t physStart, return SCE_KERNEL_ERROR_EINVAL; } if ((prot & ~0x3F7) == 0 && (prot & GuestProtCpuExecute) != 0) return SCE_KERNEL_ERROR_EINVAL; + { + std::lock_guard lock(g_directLock); + if (FirstUnallocatedPage(static_cast(physStart), len)) return SCE_KERNEL_ERROR_ENOMEM; + } GuestAllocations::Mutation mutation; flags = PlaceHintInReservation(*addr, len, flags); if (FixedNoOverwriteConflict(mutation, *addr, len, flags)) return SCE_KERNEL_ERROR_ENOMEM; diff --git a/core/libs/prx/libkernel/DirectMemory/Export.cpp b/core/libs/prx/libkernel/DirectMemory/Export.cpp index 619cf83633..ef0324cf29 100644 --- a/core/libs/prx/libkernel/DirectMemory/Export.cpp +++ b/core/libs/prx/libkernel/DirectMemory/Export.cpp @@ -241,8 +241,8 @@ int APS5_VABI sceKernelAvailableDirectMemorySize(int64_t search_start, int64_t s size_t size = 0; const int result = DirectMemoryLargestFree(search_start, search_end, alignment, &start, &size); if (result != 0) return result; - if (phys_addr_out) *phys_addr_out = start; - if (size_out) *size_out = size; + if (phys_addr_out && !GuestCopyOut_nid_no_patch(phys_addr_out, &start, sizeof(start))) return SCE_KERNEL_ERROR_EFAULT; + if (size_out && !GuestCopyOut_nid_no_patch(size_out, &size, sizeof(size))) return SCE_KERNEL_ERROR_EFAULT; return 0; } @@ -251,8 +251,9 @@ int APS5_VABI sceKernelDirectMemoryQuery(int64_t offset, int flags, void* info, if (!info || offset < 0) return SCE_KERNEL_ERROR_EINVAL; struct DirectMemoryQueryInfo { int64_t start; int64_t end; int memory_type; }; if (info_size < sizeof(DirectMemoryQueryInfo)) return SCE_KERNEL_ERROR_EINVAL; - auto* q = static_cast(info); - if (!DirectMemoryFind(offset, (flags & SCE_KERNEL_DMQ_FIND_NEXT) != 0, &q->start, &q->end, &q->memory_type)) return SCE_KERNEL_ERROR_EACCES; + DirectMemoryQueryInfo q{}; + if (!DirectMemoryFind(offset, (flags & SCE_KERNEL_DMQ_FIND_NEXT) != 0, &q.start, &q.end, &q.memory_type)) return SCE_KERNEL_ERROR_EACCES; + if (!GuestCopyOut_nid_no_patch(info, &q, sizeof(q))) return SCE_KERNEL_ERROR_EFAULT; return 0; } @@ -262,9 +263,9 @@ int APS5_VABI sceKernelGetDirectMemoryType(int64_t offset, int* memory_type, int int64_t blockEnd = 0; int blockType = 0; if (!DirectMemoryFind(offset, false, &blockStart, &blockEnd, &blockType)) return SCE_KERNEL_ERROR_ENOENT; - *memory_type = blockType; - *start = blockStart; - *end = blockEnd; + if (!GuestCopyOut_nid_no_patch(memory_type, &blockType, sizeof(blockType))) return SCE_KERNEL_ERROR_EFAULT; + if (!GuestCopyOut_nid_no_patch(start, &blockStart, sizeof(blockStart))) return SCE_KERNEL_ERROR_EFAULT; + if (!GuestCopyOut_nid_no_patch(end, &blockEnd, sizeof(blockEnd))) return SCE_KERNEL_ERROR_EFAULT; return 0; } @@ -503,13 +504,15 @@ int APS5_VABI sceKernelAvailableFlexibleMemorySize(size_t* size) { const size_t configured = _configuredFlexibleSize(); const size_t images = GuestImageSegmentBytes_nid_no_patch(); std::lock_guard lock(g_flexibleLock); - *size = configured - std::min(configured, images + _flexibleUsedLocked()); + const size_t available = configured - std::min(configured, images + _flexibleUsedLocked()); + if (!GuestCopyOut_nid_no_patch(size, &available, sizeof(available))) return SCE_KERNEL_ERROR_EFAULT; return 0; } int APS5_VABI sceKernelConfiguredFlexibleMemorySize(size_t* size) { if (!size) return SCE_KERNEL_ERROR_EINVAL; - *size = _configuredFlexibleSize(); + const size_t configured = _configuredFlexibleSize(); + if (!GuestCopyOut_nid_no_patch(size, &configured, sizeof(configured))) return SCE_KERNEL_ERROR_EFAULT; return 0; } @@ -520,7 +523,8 @@ int APS5_VABI sceKernelInternalMemoryGetAvailableSize(std::size_t* size) { int APS5_VABI sceKernelSetVirtualRangeName(const void* addr, uint64_t len, const char* name) { const auto start = reinterpret_cast(addr); - if (!addr || len == 0 || !name || len > UINTPTR_MAX - start) return SCE_KERNEL_ERROR_EINVAL; + if (!name) return SCE_KERNEL_ERROR_EFAULT; + if (!addr || len == 0 || len > UINTPTR_MAX - start) return SCE_KERNEL_ERROR_EINVAL; std::lock_guard lock(g_rangeNameLock); EraseRangeNames(start, start + len); g_rangeNames.emplace(start, NamedRange{start + len, std::string(name, strnlen(name, 31))}); @@ -542,24 +546,30 @@ int APS5_VABI sceKernelGetPageTableStats(int* cpu_total, int* cpu_available, int std::uint64_t cpuUsed = 0; std::uint64_t gpuUsed = 0; GuestPageTableUsage(PageTableGranularity, &cpuUsed, &gpuUsed); - *cpu_total = static_cast(PageTablePoolEntries); - *gpu_total = static_cast(PageTablePoolEntries); - *cpu_available = static_cast(cpuUsed >= PageTablePoolEntries ? 0 : PageTablePoolEntries - cpuUsed); - *gpu_available = static_cast(gpuUsed >= PageTablePoolEntries ? 0 : PageTablePoolEntries - gpuUsed); + const int total = static_cast(PageTablePoolEntries); + const int cpuAvail = static_cast(cpuUsed >= PageTablePoolEntries ? 0 : PageTablePoolEntries - cpuUsed); + const int gpuAvail = static_cast(gpuUsed >= PageTablePoolEntries ? 0 : PageTablePoolEntries - gpuUsed); + if (!GuestCopyOut_nid_no_patch(cpu_total, &total, sizeof(total)) || + !GuestCopyOut_nid_no_patch(gpu_total, &total, sizeof(total)) || + !GuestCopyOut_nid_no_patch(cpu_available, &cpuAvail, sizeof(cpuAvail)) || + !GuestCopyOut_nid_no_patch(gpu_available, &gpuAvail, sizeof(gpuAvail))) + return SCE_KERNEL_ERROR_EFAULT; return 0; } int APS5_VABI sceKernelGetTraceMemoryStats(std::uint64_t* first, std::uint64_t* second) { - if (first) *first = 0; - if (second) *second = 0; + constexpr std::uint64_t zero = 0; + if (first != nullptr && !GuestCopyOut_nid_no_patch(first, &zero, sizeof(zero))) return SCE_KERNEL_ERROR_EFAULT; + if (second != nullptr && !GuestCopyOut_nid_no_patch(second, &zero, sizeof(zero))) return SCE_KERNEL_ERROR_EFAULT; return 0; } int APS5_VABI sceKernelGetPrtAperture(int index, void** addr, size_t* len) { if (index < 0 || index >= PRT_APERTURE_COUNT || !addr || !len) return SCE_KERNEL_ERROR_EINVAL; std::lock_guard lock(g_prtLock); - *addr = g_prtApertures[index].address; - *len = g_prtApertures[index].length; + if (!GuestCopyOut_nid_no_patch(addr, &g_prtApertures[index].address, sizeof(void*)) || + !GuestCopyOut_nid_no_patch(len, &g_prtApertures[index].length, sizeof(size_t))) + return SCE_KERNEL_ERROR_EFAULT; return 0; } diff --git a/core/libs/prx/libkernel/Equeue/Equeue.cpp b/core/libs/prx/libkernel/Equeue/Equeue.cpp index 981708e905..fca356d296 100644 --- a/core/libs/prx/libkernel/Equeue/Equeue.cpp +++ b/core/libs/prx/libkernel/Equeue/Equeue.cpp @@ -936,19 +936,28 @@ KernelEqueueEvent EqueueDescriptorEvent(int descriptor, int16_t filter, uint16_t return event; } -static std::mutex g_closeObserverMutex; -static std::vector g_closeObservers; +struct CloseObserverRegistry { + std::mutex mutex; + std::vector observers; +}; + +static CloseObserverRegistry& GetCloseObserverRegistry() { + static auto* registry = new CloseObserverRegistry; + return *registry; +} extern "C" void RegisterDescriptorCloseObserver_nid_no_patch(void (*observer)(int descriptor)) { - std::lock_guard lock(g_closeObserverMutex); - g_closeObservers.push_back(observer); + auto& registry = GetCloseObserverRegistry(); + std::lock_guard lock(registry.mutex); + registry.observers.push_back(observer); } static void NotifyDescriptorCloseObservers(int descriptor) { + auto& registry = GetCloseObserverRegistry(); std::vector observers; { - std::lock_guard lock(g_closeObserverMutex); - observers = g_closeObservers; + std::lock_guard lock(registry.mutex); + observers = registry.observers; } for (const auto observer : observers) observer(descriptor); } diff --git a/core/libs/prx/libkernel/File/src/Stdio.cpp b/core/libs/prx/libkernel/File/src/Stdio.cpp index 34550ba737..a0d6f80550 100644 --- a/core/libs/prx/libkernel/File/src/Stdio.cpp +++ b/core/libs/prx/libkernel/File/src/Stdio.cpp @@ -1212,11 +1212,8 @@ int APS5_VABI sceKernelFdatasync(int fd) { } int APS5_VABI sceKernelWriteThrottlingStatus(std::uint64_t* status) { - if (status == nullptr) return SceErrorFromErrno(GUEST_EFAULT); - status[0] = std::numeric_limits::max(); - status[1] = 0; - status[2] = 0; - status[3] = 0; + const std::uint64_t values[4]{std::numeric_limits::max(), 0, 0, 0}; + if (!GuestCopyOut_nid_no_patch(status, values, sizeof(values))) return SceErrorFromErrno(GUEST_EFAULT); return 0; } diff --git a/core/libs/prx/libkernel/Pthread/Posix/Thread.cpp b/core/libs/prx/libkernel/Pthread/Posix/Thread.cpp index cb7cb58ff1..3030699cf3 100644 --- a/core/libs/prx/libkernel/Pthread/Posix/Thread.cpp +++ b/core/libs/prx/libkernel/Pthread/Posix/Thread.cpp @@ -189,11 +189,23 @@ int APS5_VABI pthread_getschedparam_nid_postfix(Pthread thread, int* policy, Ker return PosixThread::ToErrno(scePthreadGetschedparam(thread, policy, param)); } -static Pthread SchedTarget(int pid, const char* function) { - if (pid == 0) return scePthreadSelf(); - if (pid != getpid_nid_postfix()) return nullptr; - if (IsInitialPthread_nid_no_patch()) return scePthreadSelf(); - throw std::runtime_error(std::string(function) + ": the main thread is selected by the own pid from another thread, which is not modelled"); +static std::unique_lock SchedTarget(int pid, Pthread& thread, const char* function) { + if (pid == 0) { + thread = scePthreadSelf(); + return LockLiveGuestThread(thread); + } + if (pid != getpid_nid_postfix()) return {}; + if (IsInitialPthread_nid_no_patch()) { + thread = scePthreadSelf(); + return LockLiveGuestThread(thread); + } +#ifndef __APPLE__ + auto lock = LockMainGuestThread_nid_no_patch(thread); + if (lock.owns_lock()) return lock; + throw std::runtime_error(std::string(function) + ": the own pid selects the main thread, which has not called scePthreadSelf or has exited"); +#else + throw std::runtime_error(std::string(function) + ": the own pid selects the guest main thread, which is not identified on macOS"); +#endif } static int SchedFailure(int error) { @@ -206,31 +218,30 @@ static bool InSchedRange(int policy, int priority) { } int APS5_VABI sched_getparam_nid_postfix(int pid, KernelSchedParam* param) { - const Pthread thread = SchedTarget(pid, "sched_getparam"); - if (!thread) return SchedFailure(PosixThread::GUEST_ESRCH); - int policy = 0; KernelSchedParam current{}; - if (const int error = PosixThread::ToErrno(scePthreadGetschedparam(thread, &policy, ¤t))) return SchedFailure(error); + { + Pthread thread = nullptr; + const auto live = SchedTarget(pid, thread, "sched_getparam"); + if (!live.owns_lock()) return SchedFailure(PosixThread::GUEST_ESRCH); + current.sched_priority = thread->priority.load(std::memory_order_relaxed); + } if (!param || !GuestCopyOut_nid_no_patch(param, ¤t, sizeof(current))) return SchedFailure(PosixThread::GUEST_EFAULT); return 0; } int APS5_VABI sched_getscheduler_nid_postfix(int pid) { - const Pthread thread = SchedTarget(pid, "sched_getscheduler"); - if (!thread) return SchedFailure(PosixThread::GUEST_ESRCH); - int policy = 0; - KernelSchedParam current{}; - if (const int error = PosixThread::ToErrno(scePthreadGetschedparam(thread, &policy, ¤t))) return SchedFailure(error); - return policy; + Pthread thread = nullptr; + const auto live = SchedTarget(pid, thread, "sched_getscheduler"); + if (!live.owns_lock()) return SchedFailure(PosixThread::GUEST_ESRCH); + return thread->schedPolicy.load(std::memory_order_relaxed); } int APS5_VABI sched_setparam_nid_postfix(int pid, const KernelSchedParam* param) { if (!param) return SchedFailure(PosixThread::GUEST_EFAULT); KernelSchedParam requested{}; if (!GuestCopyIn_nid_no_patch(&requested, param, sizeof(requested))) return SchedFailure(PosixThread::GUEST_EFAULT); - const Pthread thread = SchedTarget(pid, "sched_setparam"); - if (!thread) return SchedFailure(PosixThread::GUEST_ESRCH); - const auto live = LockLiveGuestThread(thread); + Pthread thread = nullptr; + const auto live = SchedTarget(pid, thread, "sched_setparam"); if (!live.owns_lock()) return SchedFailure(PosixThread::GUEST_ESRCH); const int policy = thread->schedPolicy.load(std::memory_order_relaxed); if (policy != GUEST_SCHED_FIFO && policy != GUEST_SCHED_RR) diff --git a/core/libs/prx/libkernel/Pthread/include/Mutex.hpp b/core/libs/prx/libkernel/Pthread/include/Mutex.hpp index a994a1b5c3..9f32d35350 100644 --- a/core/libs/prx/libkernel/Pthread/include/Mutex.hpp +++ b/core/libs/prx/libkernel/Pthread/include/Mutex.hpp @@ -2,11 +2,31 @@ #define CORE_LIBS_PRX_LIBKERNEL_PTHREAD_MUTEX_HPP #include "SceTypes.hpp" +#include class MutexOperations { public: static int Timedlock(PthreadMutex* mutex, const KernelTimespec* abstime); static bool IsOwned(const PthreadMutex* mutex); + static bool SpinAcquire(PthreadMutex mutex, std::timed_mutex& native); + static bool SpinAcquire(PthreadMutex mutex, std::recursive_timed_mutex& native); + + template + static bool SpinAcquire(int spins, int yields, TTry tryAcquire, TPause pause, TYield yield) { + if (tryAcquire()) + return true; + for (int spin = 0; spin < spins; ++spin) { + if (tryAcquire()) + return true; + pause(); + } + for (int round = 0; round < yields; ++round) { + yield(); + if (tryAcquire()) + return true; + } + return false; + } }; extern "C" { diff --git a/core/libs/prx/libkernel/Pthread/include/Pthread.hpp b/core/libs/prx/libkernel/Pthread/include/Pthread.hpp index 801de7bfd3..8bc33af5c0 100644 --- a/core/libs/prx/libkernel/Pthread/include/Pthread.hpp +++ b/core/libs/prx/libkernel/Pthread/include/Pthread.hpp @@ -46,8 +46,8 @@ struct PthreadMutexPrivate { MutexType _type; std::atomic _owner; int _count; - int _spinloops = 0; - int _yieldloops = 0; + std::atomic _spinloops = 0; + std::atomic _yieldloops = 0; std::string _name; bool _named = false; @@ -150,6 +150,7 @@ struct PthreadPrivate { std::atomic priority{DEFAULT_THREAD_PRIORITY}; int scope = GUEST_SCOPE_SYSTEM; int cpuClockThread = 0; + std::atomic initialThread{false}; #ifndef _WIN32 clockid_t hostCpuClock{}; bool hostCpuClockBound = false; @@ -190,6 +191,7 @@ bool GuestThreadCpuNanos(int cpuClockThread, std::uint64_t* nanos); void SetLiveGuestThreadsAffinity(KernelCpumask mask); KernelCpumask LiveGuestThreadsAffinity(); bool GuestThreadIsLive(const PthreadPrivate* thread); +std::unique_lock LockMainGuestThread_nid_no_patch(PthreadPrivate*& thread); std::unique_lock LockLiveGuestThread(const PthreadPrivate* thread); extern "C" int ResumeGuestThread_nid_no_patch(PthreadPrivate* thread); #ifdef _WIN32 diff --git a/core/libs/prx/libkernel/Pthread/src/Cond.cpp b/core/libs/prx/libkernel/Pthread/src/Cond.cpp index 812809cbb7..674cc86cff 100644 --- a/core/libs/prx/libkernel/Pthread/src/Cond.cpp +++ b/core/libs/prx/libkernel/Pthread/src/Cond.cpp @@ -106,7 +106,10 @@ template struct WakingLock { PthreadMutex mutex; TNative& native; - void lock() { native.lock(); } + void lock() { + if (!MutexOperations::SpinAcquire(mutex, native)) + native.lock(); + } void unlock() { native.unlock(); #ifdef _WIN32 diff --git a/core/libs/prx/libkernel/Pthread/src/Mutex.cpp b/core/libs/prx/libkernel/Pthread/src/Mutex.cpp index 3c3b7b8b89..4ae1b0cf56 100644 --- a/core/libs/prx/libkernel/Pthread/src/Mutex.cpp +++ b/core/libs/prx/libkernel/Pthread/src/Mutex.cpp @@ -12,6 +12,10 @@ #include #include #include +#include +#if defined(__x86_64__) || defined(_M_X64) +#include +#endif namespace { @@ -59,6 +63,24 @@ PthreadMutex resolveMutex(PthreadMutex* mutex, bool initialize) { return created; } +std::atomic g_mutexYields{0}; + +template +bool spinAcquire(PthreadMutex mutex, TNative& native) { + static const bool multiprocessor = std::thread::hardware_concurrency() > 1; + const int spins = multiprocessor ? mutex->_spinloops.load(std::memory_order_relaxed) : 0; + return MutexOperations::SpinAcquire(spins, mutex->_yieldloops.load(std::memory_order_relaxed), [&] { + return mutex->_owner.load(std::memory_order_relaxed) == std::thread::id{} && native.try_lock(); + }, [] { +#if defined(__x86_64__) || defined(_M_X64) + _mm_pause(); +#endif + }, [] { + g_mutexYields.fetch_add(1, std::memory_order_relaxed); + std::this_thread::yield(); + }); +} + template int acquireMutex(PthreadMutex mutex, TAcquire acquire, int unavailable, bool tryOnly) { if (!mutex) @@ -74,12 +96,15 @@ int acquireMutex(PthreadMutex mutex, TAcquire acquire, int unavailable, bool try } if (owned && mutex->_count == std::numeric_limits::max()) throw std::overflow_error("Recursive mutex lock count overflow"); + const auto take = [&](auto& native) { + return (!tryOnly && !owned && spinAcquire(mutex, native)) || acquire(native); + }; if (mutex->_type == MutexType::Recursive) { - if (!acquire(mutex->_rmtx)) + if (!take(mutex->_rmtx)) return unavailable; ++mutex->_count; } else { - if (!acquire(mutex->_mtx)) + if (!take(mutex->_mtx)) return unavailable; } mutex->_owner.store(thread, std::memory_order_release); @@ -88,6 +113,14 @@ int acquireMutex(PthreadMutex mutex, TAcquire acquire, int unavailable, bool try } +bool MutexOperations::SpinAcquire(PthreadMutex mutex, std::timed_mutex& native) { + return spinAcquire(mutex, native); +} + +bool MutexOperations::SpinAcquire(PthreadMutex mutex, std::recursive_timed_mutex& native) { + return spinAcquire(mutex, native); +} + bool MutexOperations::IsOwned(const PthreadMutex* mutex) { if (!mutex) throw std::invalid_argument("Mutex pointer is null"); @@ -283,6 +316,10 @@ int APS5_VABI scePthreadMutexSetyieldloops(PthreadMutex* mutex, int count) { return 0; } +std::uint64_t MutexYieldsForTest_nid_no_patch() { + return g_mutexYields.load(std::memory_order_relaxed); +} + int APS5_VABI pthread_mutex_setname_np_nid_postfix(PthreadMutex* mutex, const char* name) { if (!mutex) throw std::invalid_argument("pthread_mutex_setname_np: null mutex"); diff --git a/core/libs/prx/libkernel/Pthread/src/Thread.cpp b/core/libs/prx/libkernel/Pthread/src/Thread.cpp index db3a42e3ab..f96e2fb430 100644 --- a/core/libs/prx/libkernel/Pthread/src/Thread.cpp +++ b/core/libs/prx/libkernel/Pthread/src/Thread.cpp @@ -501,6 +501,17 @@ PthreadPrivate::PthreadPrivate(const PthreadAttrPrivate* attr) : _finished(false registry.threads.emplace(cpuClockThread, this); } +std::unique_lock LockMainGuestThread_nid_no_patch(PthreadPrivate*& thread) { + auto& registry = CpuClocks(); + std::unique_lock lock(registry.lock); + for (const auto& [id, candidate] : registry.threads) { + if (!candidate->initialThread.load(std::memory_order_acquire) || candidate->_finished.load(std::memory_order_acquire)) continue; + thread = candidate; + return lock; + } + return {}; +} + PthreadPrivate::~PthreadPrivate() { auto& registry = CpuClocks(); std::lock_guard lock(registry.lock); @@ -1179,6 +1190,7 @@ Pthread APS5_VABI scePthreadSelf() { if (!DuplicateHandle(GetCurrentProcess(), GetCurrentThread(), GetCurrentProcess(), &handle, 0, FALSE, DUPLICATE_SAME_ACCESS)) throw std::system_error(GetLastError(), std::system_category(), "Adopting guest thread"); adopted->nativeHandle = handle; + adopted->initialThread.store(IsInitialPthread_nid_no_patch(), std::memory_order_release); adopted->threadId = std::this_thread::get_id(); adopted->_detached = true; adopted->references.store(1, std::memory_order_relaxed); @@ -1191,6 +1203,7 @@ Pthread APS5_VABI scePthreadSelf() { adoptedThread = std::make_unique(); adoptedThread->_detached = true; adoptedThread->_adopted = true; + adoptedThread->initialThread.store(IsInitialPthread_nid_no_patch(), std::memory_order_release); BindHostCpuClock(adoptedThread.get()); adoptedThread->threadId = std::this_thread::get_id(); adoptedThread->hostThread = pthread_self(); diff --git a/core/libs/prx/libkernel/Semaphore/src/Semaphore.cpp b/core/libs/prx/libkernel/Semaphore/src/Semaphore.cpp index 96d8588896..c02cac3109 100644 --- a/core/libs/prx/libkernel/Semaphore/src/Semaphore.cpp +++ b/core/libs/prx/libkernel/Semaphore/src/Semaphore.cpp @@ -28,11 +28,7 @@ int APS5_VABI sceKernelCreateSema(KernelSema* sem, const char* name, uint32_t at if ((attr & ~0x103u) != 0 || (attr & 3u) == 3u || name == nullptr || init < 0 || max <= 0 || init > max) { return SCE_KERNEL_ERROR_EINVAL; } - if ((attr & 0x100u) != 0) { - NotImplemented_nid_no_patch("sceKernelCreateSema with attribute bit 0x100"); - } - - *sem = new KernelSemaPrivate(init, max, std::string(name), attr == 1); + *sem = new KernelSemaPrivate(init, max, std::string(name), (attr & 3u) == 1u); if (TraceSync()) std::fprintf(stderr, "[sema] create %p '%s' attr=0x%x init=%d max=%d\n", static_cast(*sem), name, attr, init, max); return KERNEL_SEMA_OK; } diff --git a/core/libs/prx/libkernel/Socket/src/Udp.cpp b/core/libs/prx/libkernel/Socket/src/Udp.cpp index 71a3ada8b0..6920274f66 100644 --- a/core/libs/prx/libkernel/Socket/src/Udp.cpp +++ b/core/libs/prx/libkernel/Socket/src/Udp.cpp @@ -1317,9 +1317,6 @@ int APS5_VABI socketpair_nid_postfix(int family, int type, int protocol, int* de } if (protocol != 0) return Fail(43); if (plainType != 1 && plainType != 2 && plainType != 5) return Fail(41); - if (!descriptors) return Fail(14); - const GuestArena::HostWrite destination(descriptors, 2 * sizeof(int)); - if (!destination.Open()) return Fail(14); NativeSocket native[2]; if (const int error = NativePair(plainType, native)) return Fail(error); Socket firstGuard(native[0], GuestUnix, plainType); @@ -1340,13 +1337,30 @@ int APS5_VABI socketpair_nid_postfix(int family, int type, int protocol, int* de GuestSockets::Close(firstDescriptor); return Fail(error); } + struct InstalledPair { + int first; + int second; + bool release = true; + ~InstalledPair() { + if (!release) return; + const int error = *__error_nid_postfix(); + for (const int number : {first, second}) { + try { + GuestSockets::Close(number); + } catch (...) { + } + } + *__error_nid_postfix() = error; + } + } installedPair{firstDescriptor, secondDescriptor}; + const int installed[2] = {firstDescriptor, secondDescriptor}; + if (!GuestCopyOut_nid_no_patch(descriptors, installed, sizeof(installed))) return Fail(14); if ((type & GuestCloseOnExec) != 0) { std::lock_guard registry(socketsMutex); closeOnExecDescriptors.insert(firstDescriptor); closeOnExecDescriptors.insert(secondDescriptor); } - descriptors[0] = firstDescriptor; - descriptors[1] = secondDescriptor; + installedPair.release = false; return 0; } catch (const std::bad_alloc&) { return Fail(12); @@ -1858,11 +1872,41 @@ int APS5_VABI sendfile_nid_postfix(int file, int descriptor, std::int64_t offset const GuestSendfileHeaders* headers, std::int64_t* sbytes, int flags) { (void)flags; if (offset < 0) return Fail(22); - if (headers && (!SendfileIovecs(headers->headers, headers->headerCount) || !SendfileIovecs(headers->trailers, headers->trailerCount))) - return Fail(22); + GuestSendfileHeaders localHeaders{}; + std::vector headerIovecs; + std::vector trailerIovecs; + if (headers != nullptr) { + if (!GuestCopyIn_nid_no_patch(&localHeaders, headers, sizeof(localHeaders))) return Fail(14); + if (localHeaders.headers != nullptr) { + if (localHeaders.headerCount < 0 || localHeaders.headerCount > 1024) return Fail(22); + if (localHeaders.headerCount > 0) { + try { + headerIovecs.resize(localHeaders.headerCount); + } catch (const std::bad_alloc&) { + return Fail(12); + } + if (!GuestCopyIn_nid_no_patch(headerIovecs.data(), localHeaders.headers, headerIovecs.size() * sizeof(KernelIovec))) + return Fail(14); + if (!SendfileIovecs(headerIovecs.data(), localHeaders.headerCount)) return Fail(22); + } + } + if (localHeaders.trailers != nullptr) { + if (localHeaders.trailerCount < 0 || localHeaders.trailerCount > 1024) return Fail(22); + if (localHeaders.trailerCount > 0) { + try { + trailerIovecs.resize(localHeaders.trailerCount); + } catch (const std::bad_alloc&) { + return Fail(12); + } + if (!GuestCopyIn_nid_no_patch(trailerIovecs.data(), localHeaders.trailers, trailerIovecs.size() * sizeof(KernelIovec))) + return Fail(14); + if (!SendfileIovecs(trailerIovecs.data(), localHeaders.trailerCount)) return Fail(22); + } + } + } std::int64_t sent = 0; const auto finish = [&](int error) { - if (sbytes) *sbytes = sent; + if (sbytes != nullptr) GuestCopyOut_nid_no_patch(sbytes, &sent, sizeof(sent)); return error ? Fail(error) : 0; }; if (DescriptorIsOpen_nid_no_patch(file) && !File::IsVnode(file) && !File::IsSharedMemoryDescriptor_nid_no_patch(file)) return finish(22); @@ -1886,8 +1930,8 @@ int APS5_VABI sendfile_nid_postfix(int file, int descriptor, std::int64_t offset sockaddr_storage peer{}; socklen_t size = sizeof(peer); if (::getpeername(socket->value, reinterpret_cast(&peer), &size)) return finish(57); - if (headers) - if (const int error = SendIovecs(*socket, headers->headers, headers->headerCount, sent)) return finish(error); + if (!headerIovecs.empty()) + if (const int error = SendIovecs(*socket, headerIovecs.data(), static_cast(headerIovecs.size()), sent)) return finish(error); while (received > 0) { if (const int error = SendAll(*socket, chunk.data(), static_cast(received), sent)) return finish(error); offset += received; @@ -1896,8 +1940,8 @@ int APS5_VABI sendfile_nid_postfix(int file, int descriptor, std::int64_t offset received = read(offset, remaining); if (received < 0) return finish(static_cast(-received)); } - if (headers) - if (const int error = SendIovecs(*socket, headers->trailers, headers->trailerCount, sent)) return finish(error); + if (!trailerIovecs.empty()) + if (const int error = SendIovecs(*socket, trailerIovecs.data(), static_cast(trailerIovecs.size()), sent)) return finish(error); return finish(0); } static int PollDescriptors(GuestPollDescriptor* descriptors, std::uint32_t count, int timeout) { diff --git a/core/libs/prx/libkernel/System/src/Exception.cpp b/core/libs/prx/libkernel/System/src/Exception.cpp index 7e380e3919..e26b1e26f2 100644 --- a/core/libs/prx/libkernel/System/src/Exception.cpp +++ b/core/libs/prx/libkernel/System/src/Exception.cpp @@ -532,8 +532,8 @@ constexpr DWORD64 ReturnBreakBits = 0xf0003ull; struct ReturnBreak { std::atomic thread{0}; - DWORD64 at = 0; - QueuedDelivery* queued = nullptr; + std::atomic at{0}; + std::atomic queued{nullptr}; }; std::atomic& ReturnBreaksInstalled() { @@ -589,11 +589,10 @@ bool DisarmedReturnBreak(const EXCEPTION_POINTERS& info) { return at == context.Rip && ArmedOnThread(GetCurrentThreadId(), at); } -QueuedDelivery* ClaimReturnBreak(ReturnBreak& entry, DWORD thread) { - DWORD expected = thread; - if (!entry.thread.compare_exchange_strong(expected, ReservedThread, std::memory_order_acq_rel)) return nullptr; - auto* queued = entry.queued; - entry.thread.store(0, std::memory_order_release); +QueuedDelivery* ClaimReturnBreak(ReturnBreak& entry, QueuedDelivery* queued) { + if (queued == nullptr) return nullptr; + auto* expected = queued; + if (!entry.queued.compare_exchange_strong(expected, nullptr, std::memory_order_acq_rel)) return nullptr; return queued; } @@ -619,8 +618,8 @@ LONG CALLBACK ReturnBreakHandler(EXCEPTION_POINTERS* info) { const DWORD self = GetCurrentThreadId(); QueuedDelivery* queued = nullptr; for (auto& entry : ReturnBreaks()) { - if (entry.thread.load(std::memory_order_acquire) != self || entry.at != at) continue; - queued = ClaimReturnBreak(entry, self); + if (entry.thread.load(std::memory_order_acquire) != self || entry.at.load(std::memory_order_acquire) != at) continue; + queued = ClaimReturnBreak(entry, entry.queued.load(std::memory_order_acquire)); if (queued != nullptr) break; } if (queued == nullptr && !ArmedOnThread(self, at)) return EXCEPTION_CONTINUE_SEARCH; @@ -663,34 +662,42 @@ bool SetReturnBreak(HANDLE native, DWORD64 at, bool armed) { struct ReturnArm { ReturnBreak* entry = nullptr; - DWORD thread = 0; + QueuedDelivery* queued = nullptr; DWORD64 at = 0; }; +void RetireReturnBreak(HANDLE native, ReturnArm& arm, bool suspended) { + if (auto* queued = ClaimReturnBreak(*arm.entry, arm.queued)) { + if (suspended && !Exited(native)) static_cast(SetReturnBreak(native, arm.at, false)); + ReleaseQueued(queued); + } + arm.entry->thread.store(0, std::memory_order_release); + arm = {}; +} + void ArmReturnBreak(HANDLE native, const CONTEXT& context, QueuedDelivery* queued, ReturnArm& arm, DWORD64& unknown) { if (!ReturnBreaksInstalled().load(std::memory_order_acquire) || queued == nullptr) return; DWORD64 at = 0; if (!GuestReturn(context, at, unknown)) return; if (arm.entry != nullptr && arm.at == at) return; if (arm.entry != nullptr) { - static_cast(SetReturnBreak(native, arm.at, false)); - ReleaseQueued(ClaimReturnBreak(*arm.entry, arm.thread)); - arm = {}; + RetireReturnBreak(native, arm, true); } const DWORD thread = GetThreadId(native); for (auto& entry : ReturnBreaks()) { DWORD expected = 0; if (!entry.thread.compare_exchange_strong(expected, ReservedThread, std::memory_order_acq_rel)) continue; - entry.at = at; - entry.queued = queued; + entry.at.store(at, std::memory_order_relaxed); + entry.queued.store(queued, std::memory_order_release); queued->references.fetch_add(1, std::memory_order_relaxed); entry.thread.store(thread, std::memory_order_release); NoteArmedBreak(thread, at); if (!SetReturnBreak(native, at, true)) { - ReleaseQueued(ClaimReturnBreak(entry, thread)); + ReleaseQueued(ClaimReturnBreak(entry, queued)); + entry.thread.store(0, std::memory_order_release); return; } - arm = {&entry, thread, at}; + arm = {&entry, queued, at}; return; } } @@ -698,10 +705,8 @@ void ArmReturnBreak(HANDLE native, const CONTEXT& context, QueuedDelivery* queue void DisarmReturnBreak(HANDLE native, ReturnArm& arm) { if (arm.entry == nullptr) return; const bool suspended = SuspendThread(native) != static_cast(-1); - if (suspended && !Exited(native)) static_cast(SetReturnBreak(native, arm.at, false)); - ReleaseQueued(ClaimReturnBreak(*arm.entry, arm.thread)); + RetireReturnBreak(native, arm, suspended); if (suspended) ResumeThread(native); - arm = {}; } Attempt TryDeliver(Pthread thread, HANDLE native, GuestExceptionHandler handler, int signum, QueuedDelivery*& queued, ReturnArm* arm = nullptr) { diff --git a/core/libs/prx/libkernel/System/src/Login.cpp b/core/libs/prx/libkernel/System/src/Login.cpp index d25e16d5b2..9997e97bc0 100644 --- a/core/libs/prx/libkernel/System/src/Login.cpp +++ b/core/libs/prx/libkernel/System/src/Login.cpp @@ -1,5 +1,6 @@ #include "prx/libkernel/include/Api.hpp" #include "prx/libc/include/general/VabiMacros.hpp" +#include "prx/libc/include/General.hpp" #include #include #include @@ -84,12 +85,25 @@ extern "C" int APS5_VABI getlogin_r_nid_postfix(char* output, int size) { std::lock_guard lock(sessionMutex); if (sessionLogin) { if (sessionLogin->size() + 1 > static_cast(size)) return 34; - std::memcpy(output, sessionLogin->c_str(), sessionLogin->size() + 1); - return 0; + const int saved = errno; + const bool copied = GuestCopyOut_nid_no_patch(output, sessionLogin->c_str(), sessionLogin->size() + 1); + errno = saved; + return copied ? 0 : 14; } } + char buffer[512]{}; const int saved = errno; - const int result = ReadLogin(output, size); + const int result = ReadLogin(buffer, static_cast(sizeof(buffer))); + if (result != 0) { + errno = saved; + return result; + } + const std::size_t length = std::strlen(buffer) + 1; + if (length > static_cast(size)) { + errno = saved; + return 34; + } + const bool copied = GuestCopyOut_nid_no_patch(output, buffer, length); errno = saved; - return result; + return copied ? 0 : 14; } diff --git a/core/libs/prx/libkernel/System/src/Process.cpp b/core/libs/prx/libkernel/System/src/Process.cpp index f288fbcd59..ec1de2cc9d 100644 --- a/core/libs/prx/libkernel/System/src/Process.cpp +++ b/core/libs/prx/libkernel/System/src/Process.cpp @@ -962,7 +962,7 @@ int APS5_VABI sceKernelUuidCreate(std::uint32_t* uuid) { HostEntropy_nid_no_patch(value.data(), sizeof(value)); value[1] = (value[1] & 0x0fffffffu) | 0x40000000u; value[2] = (value[2] & 0xffffff3fu) | 0x80u; - std::memcpy(uuid, value.data(), sizeof(value)); + if (!GuestCopyOut_nid_no_patch(uuid, value.data(), sizeof(value))) return SCE_KERNEL_ERROR_EFAULT; return 0; } @@ -972,7 +972,7 @@ int APS5_VABI sceKernelCreateUuidV4(std::uint8_t* uuid) { HostEntropy_nid_no_patch(value.data(), value.size()); value[6] = static_cast((value[6] & 0x0fu) | 0x40u); value[8] = static_cast((value[8] & 0x3fu) | 0x80u); - std::memcpy(uuid, value.data(), value.size()); + if (!GuestCopyOut_nid_no_patch(uuid, value.data(), value.size())) return SCE_KERNEL_ERROR_EFAULT; return 0; } diff --git a/core/libs/prx/libkernel/System/src/Signals.cpp b/core/libs/prx/libkernel/System/src/Signals.cpp index c3cbccd2e1..56f806e9ec 100644 --- a/core/libs/prx/libkernel/System/src/Signals.cpp +++ b/core/libs/prx/libkernel/System/src/Signals.cpp @@ -334,11 +334,12 @@ int WaitForPendingInSet(const GuestSignalSet& set, bool waitForever, const Kerne } } -void FillSiginfo(GuestSiginfo* info, int guest) { - *info = {}; - info->signo = guest; - info->code = GuestSiuser; - info->pid = getpid_nid_postfix(); +bool FillSiginfo(GuestSiginfo* info, int guest) { + GuestSiginfo local{}; + local.signo = guest; + local.code = GuestSiuser; + local.pid = getpid_nid_postfix(); + return GuestCopyOut_nid_no_patch(info, &local, sizeof(local)); } void WaitForDeliverableSignal() { @@ -737,32 +738,65 @@ int APS5_VABI pthread_sigmask_nid_postfix(int how, const GuestSignalSet* set, Gu } int APS5_VABI sigtimedwait_nid_postfix(const GuestSignalSet* set, void* info, const KernelTimespec* timeout) { - if (set == nullptr || !SetHasSignal(*set)) { *__error_nid_postfix() = 22; return -1; } - if (timeout != nullptr && (timeout->tv_nsec < 0 || timeout->tv_nsec >= 1000000000) && !PendingInSetPresent(*set)) { - *__error_nid_postfix() = 22; - return -1; + if (set == nullptr) { *__error_nid_postfix() = 22; return -1; } + GuestSignalSet requestedSet{}; + if (!GuestCopyIn_nid_no_patch(&requestedSet, set, sizeof(requestedSet))) { *__error_nid_postfix() = 14; return -1; } + if (!SetHasSignal(requestedSet)) { *__error_nid_postfix() = 22; return -1; } + KernelTimespec requestedTimeout{}; + if (timeout != nullptr) { + if (!GuestCopyIn_nid_no_patch(&requestedTimeout, timeout, sizeof(requestedTimeout))) { *__error_nid_postfix() = 14; return -1; } + if ((requestedTimeout.tv_nsec < 0 || requestedTimeout.tv_nsec >= 1000000000) && !PendingInSetPresent(requestedSet)) { + *__error_nid_postfix() = 22; + return -1; + } } int guest = 0; - const int result = WaitForPendingInSet(*set, timeout == nullptr, timeout, &guest); + const int result = WaitForPendingInSet(requestedSet, timeout == nullptr, timeout != nullptr ? &requestedTimeout : nullptr, &guest); if (result != 0) { *__error_nid_postfix() = result; return -1; } - if (info != nullptr) FillSiginfo(static_cast(info), guest); + if (info != nullptr && !FillSiginfo(static_cast(info), guest)) { + *__error_nid_postfix() = 14; + return -1; + } return guest; } int APS5_VABI sigwaitinfo_nid_postfix(const GuestSignalSet* set, void* info) { - if (set == nullptr || !SetHasSignal(*set)) { *__error_nid_postfix() = 22; return -1; } + if (set == nullptr) { *__error_nid_postfix() = 22; return -1; } + GuestSignalSet requestedSet{}; + if (!GuestCopyIn_nid_no_patch(&requestedSet, set, sizeof(requestedSet))) { *__error_nid_postfix() = 14; return -1; } + if (!SetHasSignal(requestedSet)) { *__error_nid_postfix() = 22; return -1; } int guest = 0; - if (WaitForPendingInSet(*set, true, nullptr, &guest) != 0) { *__error_nid_postfix() = GuestEagain; return -1; } - if (info != nullptr) FillSiginfo(static_cast(info), guest); + if (WaitForPendingInSet(requestedSet, true, nullptr, &guest) != 0) { *__error_nid_postfix() = GuestEagain; return -1; } + if (info != nullptr && !FillSiginfo(static_cast(info), guest)) { + *__error_nid_postfix() = 14; + return -1; + } return guest; } int APS5_VABI sigwait_nid_postfix(const GuestSignalSet* set, int* received) { - if (set == nullptr || received == nullptr || !SetHasSignal(*set)) return 22; + if (set == nullptr || received == nullptr) return 22; + GuestSignalSet requestedSet{}; + const int saved = *__error_nid_postfix(); + if (!GuestCopyIn_nid_no_patch(&requestedSet, set, sizeof(requestedSet))) { + *__error_nid_postfix() = saved; + return 14; + } + if (!SetHasSignal(requestedSet)) { + *__error_nid_postfix() = saved; + return 22; + } int guest = 0; - const int result = WaitForPendingInSet(*set, true, nullptr, &guest); - if (result != 0) return result; - *received = guest; + const int result = WaitForPendingInSet(requestedSet, true, nullptr, &guest); + if (result != 0) { + *__error_nid_postfix() = saved; + return result; + } + if (!GuestCopyOut_nid_no_patch(received, &guest, sizeof(guest))) { + *__error_nid_postfix() = saved; + return 14; + } + *__error_nid_postfix() = saved; return 0; } diff --git a/core/libs/prx/libkernel/System/src/SystemConfiguration.cpp b/core/libs/prx/libkernel/System/src/SystemConfiguration.cpp index f44560a5de..a92a356a7a 100644 --- a/core/libs/prx/libkernel/System/src/SystemConfiguration.cpp +++ b/core/libs/prx/libkernel/System/src/SystemConfiguration.cpp @@ -205,6 +205,15 @@ struct GuestKinfoProc { }; static_assert(offsetof(GuestKinfoProc, pid) == 72 && offsetof(GuestKinfoProc, parentPid) == 76 && offsetof(GuestKinfoProc, flag) == 368 && offsetof(GuestKinfoProc, command) == 447 && sizeof(GuestKinfoProc) == 1088); +GuestKinfoProc GuestProcessRecord() { + GuestKinfoProc process{}; + process.structSize = sizeof(process); + process.pid = getpid_nid_postfix(); + process.parentPid = getppid_nid_postfix(); + std::memcpy(process.command, "eboot.bin", sizeof("eboot.bin")); + return process; +} + std::vector GuestVmEntries() { std::vector entries; std::uintptr_t start = 0; @@ -454,6 +463,18 @@ int APS5_VABI sysctl_nid_postfix(const int* name, std::uint32_t nameLength, void static constexpr char path[] = "/app0/eboot.bin"; return CopyOut(path, sizeof(path), oldValue, oldLength); } + if (nameLength >= 3 && name[0] == 1 && name[1] == 14 && name[2] == 8) { + if (newValue != nullptr) { + *__error_nid_postfix() = 1; + return -1; + } + if (nameLength > 4) { + *__error_nid_postfix() = 22; + return -1; + } + const GuestKinfoProc process = GuestProcessRecord(); + return CopyOut(&process, sizeof(process), oldValue, oldLength); + } if (nameLength >= 3 && name[0] == 1 && name[1] == 14 && name[2] == 1) { if (newValue != nullptr) { *__error_nid_postfix() = 1; @@ -467,11 +488,7 @@ int APS5_VABI sysctl_nid_postfix(const int* name, std::uint32_t nameLength, void *__error_nid_postfix() = 3; return -1; } - GuestKinfoProc process{}; - process.structSize = sizeof(process); - process.pid = name[3]; - process.parentPid = getppid_nid_postfix(); - std::memcpy(process.command, "eboot.bin", sizeof("eboot.bin")); + const GuestKinfoProc process = GuestProcessRecord(); return CopyOut(&process, sizeof(process), oldValue, oldLength); } if (nameLength >= 3 && name[0] == 1 && name[1] == 14 && name[2] == 35) { @@ -684,9 +701,13 @@ int APS5_VABI sceKernelGetSystemSwVersion_nid_postfix(SceKernelSystemSwVersion* if (version == nullptr) { return 0; } - std::memset(version->versionString, 0, sizeof(version->versionString)); - std::memcpy(version->versionString, "01.000.000", sizeof("01.000.000")); - version->version = 0x01000000; + char versionString[sizeof(version->versionString)] = {}; + std::memcpy(versionString, "01.000.000", sizeof("01.000.000")); + constexpr std::uint32_t packedVersion = 0x01000000; + if (!GuestCopyOut_nid_no_patch(version->versionString, versionString, sizeof(versionString)) || + !GuestCopyOut_nid_no_patch(&version->version, &packedVersion, sizeof(packedVersion))) { + return SCE_KERNEL_ERROR_EFAULT; + } return 0; } @@ -694,8 +715,11 @@ int APS5_VABI sceKernelGetSystemExVersion(char* first, char* second) { if (first == nullptr || second == nullptr) { return 22; } - *first = '\0'; - *second = '\0'; + constexpr char zero = '\0'; + if (!GuestCopyOut_nid_no_patch(first, &zero, sizeof(zero)) || + !GuestCopyOut_nid_no_patch(second, &zero, sizeof(zero))) { + return 14; + } return 0; } @@ -703,7 +727,10 @@ int APS5_VABI sysKernelGetLowerLimitSysexVersion_nid_postfix(char* version) { if (version == nullptr) { return SCE_KERNEL_ERROR_EINVAL; } - *version = '\0'; + constexpr char zero = '\0'; + if (!GuestCopyOut_nid_no_patch(version, &zero, sizeof(zero))) { + return SCE_KERNEL_ERROR_EFAULT; + } return 0; } @@ -711,7 +738,10 @@ int APS5_VABI sysKernelGetLowerLimitUpdVersion_nid_postfix(std::uint32_t* versio if (version == nullptr) { return SCE_KERNEL_ERROR_EINVAL; } - *version = 0; + constexpr std::uint32_t zero = 0; + if (!GuestCopyOut_nid_no_patch(version, &zero, sizeof(zero))) { + return SCE_KERNEL_ERROR_EFAULT; + } return 0; } diff --git a/core/libs/prx/libkernel/System/src/ThermalSensors.cpp b/core/libs/prx/libkernel/System/src/ThermalSensors.cpp index 056399d642..35909af0a1 100644 --- a/core/libs/prx/libkernel/System/src/ThermalSensors.cpp +++ b/core/libs/prx/libkernel/System/src/ThermalSensors.cpp @@ -1,5 +1,6 @@ #include "prx/libkernel/include/Api.hpp" #include "prx/libc/include/Api.hpp" +#include "prx/libc/include/General.hpp" #include "prx/libkernel/System/include/ThermalSensors.hpp" #include "prx/libkernel/KernelErrors.hpp" #include "prx/libc/include/general/VabiMacros.hpp" @@ -265,7 +266,7 @@ int APS5_VABI sceKernelGetCpuTemperature(int* outCelsius) { int celsius[3]; ReadHostSensors(celsius); if (celsius[0] < 0) return Fail(22); - *outCelsius = celsius[0]; + if (!GuestCopyOut_nid_no_patch(outCelsius, &celsius[0], sizeof(int))) return Fail(14); return 0; } @@ -273,14 +274,15 @@ int APS5_VABI sceKernelGetSocSensorTemperature(int sensorId, int* outCelsius) { if (sensorId < 0 || sensorId > 64) return Fail(22); if (outCelsius == nullptr) return Fail(14); if (sensorId == 64) { - *outCelsius = -49; + const int value = -49; + if (!GuestCopyOut_nid_no_patch(outCelsius, &value, sizeof(value))) return Fail(14); return 0; } if (sensorId >= 3) throw std::runtime_error("sceKernelGetSocSensorTemperature: channels 3 to 63 have no host sensor"); int celsius[3]; ReadHostSensors(celsius); if (celsius[sensorId] < 0) return Fail(22); - *outCelsius = celsius[sensorId]; + if (!GuestCopyOut_nid_no_patch(outCelsius, &celsius[sensorId], sizeof(int))) return Fail(14); return 0; } diff --git a/core/libs/prx/libkernel/Time/TimedWait.cpp b/core/libs/prx/libkernel/Time/TimedWait.cpp index d79399e8e4..e49b8d43de 100644 --- a/core/libs/prx/libkernel/Time/TimedWait.cpp +++ b/core/libs/prx/libkernel/Time/TimedWait.cpp @@ -65,6 +65,11 @@ using NtTestAlertFunction = LONG(NTAPI*)(); void DrainApcs() { static const auto testAlert = reinterpret_cast(reinterpret_cast(GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "NtTestAlert"))); + auto* state = WaitState().bound; + state->fetch_add(1, std::memory_order_seq_cst); + if (testAlert) testAlert(); + else SleepEx(0, TRUE); + state->fetch_sub(1, std::memory_order_seq_cst); if (testAlert) testAlert(); else SleepEx(0, TRUE); } @@ -530,10 +535,14 @@ void SleepUntil(std::uint64_t deadlineNanos) { if (!TimerWait(timer, deadlineNanos - now - LEAD_NANOS)) AlertableSleep(WholeMilliseconds(deadlineNanos - now - LEAD_NANOS)); now = NowNanos(); } - while (now < deadlineNanos) { - YieldProcessor(); - now = NowNanos(); + { + DeliveryDeferral deferral; + while (now < deadlineNanos) { + YieldProcessor(); + now = NowNanos(); + } } + DrainApcs(); #else const std::uint64_t now = NowNanos(); if (deadlineNanos > now) SleepNanos(deadlineNanos - now); @@ -580,12 +589,20 @@ bool SleepNanosUnlessChanged(std::uint64_t nanos, const std::atomic protections, const std: return 0; } +constexpr std::uint64_t GuestAddressMask = 0xFFFFFFFFFFFFull; +constexpr std::uint64_t AmmPageMask = 0x3FFFu; +constexpr std::uint64_t AmmSizeMask = 0x1FFFFFFC000ull; +constexpr std::uint64_t EqueueLimit = 1ull << 48u; + +bool InsideAmmMapRange(std::uint64_t address, std::uint64_t size) { + std::uint64_t start = 0, end = 0, multimapStart = 0, multimapEnd = 0; + AmmVirtualAddressRanges_nid_no_patch(&start, &end, &multimapStart, &multimapEnd); + return size != 0u && ((address | size) & AmmPageMask) == 0u && address >= start && address + size <= end; +} + +template +int WriteCommand(void* dst, const TCommand& command, std::uint64_t* outSize) { + if (dst) std::memcpy(dst, &command, sizeof(command)); + if (outSize) *outSize = sizeof(command); + return 0; +} + +constexpr std::uint32_t AmmPriorities = 3; +constexpr std::uint64_t MapperGranuleMask = 0x1FFFFF; +constexpr std::uint64_t MapperParamBytes = 0x38; +constexpr std::uint64_t MapperKnownBytes = 0x28; + +std::uint32_t CallIndirectBuffer(const char* function, std::uint32_t priority, void* base, std::uint64_t bytes) { + if (priority >= AmmPriorities || !base) NotImplemented_nid_no_patch(function); + const std::uint64_t submitted = std::uint64_t{static_cast(bytes >> 2u)} << 2u; + if (submitted > 0xFFFFFFFFull) NotImplemented_nid_no_patch(function); + return AmmSubmit_nid_no_patch(base, static_cast(submitted)); +} + } extern "C" { @@ -95,8 +126,7 @@ int APS5_VABI get_self_auth_info_nid_postfix(void) { } int APS5_VABI get_vm_map_timestamp_nid_postfix(void) { - NotImplemented_nid_no_patch(__func__); - return 0; + return static_cast(static_cast(GuestAllocations::GuestAllocationsGeneration_nid_postfix())); } int APS5_VABI getfsstat_nid_postfix(void) { @@ -447,13 +477,21 @@ int APS5_VABI sceKernelBeginAppMount2(void) { return 0; } -int APS5_VABI sceKernelCallIndirectBuffer(void) { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI sceKernelCallIndirectBuffer(std::uint32_t priority, void* base, std::uint64_t bytes) { + CallIndirectBuffer(__func__, priority, base, bytes); return 0; } -int APS5_VABI sceKernelCallIndirectBuffer2(void) { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI sceKernelCallIndirectBuffer2(std::uint32_t priority, void* base, std::uint64_t bytes, KernelMapperSubmitResult* result, std::uint32_t* id) { + const auto submitted = CallIndirectBuffer(__func__, priority, base, bytes); + if (result) *result = {0, 0}; + if (id) *id = submitted; + return 0; +} + +int APS5_VABI sceKernelCallIndirectBuffer3(std::uint32_t priority, void* base, std::uint64_t bytes, std::uint32_t* id) { + const auto submitted = CallIndirectBuffer(__func__, priority, base, bytes); + if (id) *id = submitted; return 0; } @@ -1091,9 +1129,9 @@ int APS5_VABI sceKernelGetVrCaptureSize(void) { return 0; } -int APS5_VABI sceKernelGiveDirectMemoryToMapper(void) { - NotImplemented_nid_no_patch(__func__); - return 0; +int APS5_VABI sceKernelGiveDirectMemoryToMapper(std::int64_t searchStart, std::int64_t searchEnd, std::size_t size, std::size_t alignment, int usage, std::int64_t* offset) { + if (size == 0u || ((size | alignment) & MapperGranuleMask) != 0u) return SCE_KERNEL_ERROR_EINVAL; + return AmmGiveDirectMemory_nid_no_patch(searchStart, searchEnd, size, alignment, usage, offset); } int APS5_VABI sceKernelHasNeoMode(void) { @@ -1325,11 +1363,6 @@ int APS5_VABI sceKernelIsMainOnStandbyMode(void) { return 0; } -int APS5_VABI sceKernelIsModuleLoaded(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI sceKernelIsNeoMode(void) { std::uint32_t attribute = 0; if (!GetAppParamSfoAttribute_nid_no_patch(&attribute)) NotImplemented_nid_no_patch(__func__); @@ -1391,8 +1424,13 @@ int APS5_VABI sceKernelMapTraceMemory(void) { return static_cast(0x8002004e); } -int APS5_VABI sceKernelMapperGetParam(void) { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI sceKernelMapperGetParam(std::uint64_t* param) { + if (!param || *param > MapperParamBytes) return SCE_KERNEL_ERROR_EINVAL; + const auto bytes = *param; + if (bytes > MapperKnownBytes) NotImplemented_nid_no_patch(__func__); + std::uint64_t values[5]{MapperParamBytes}; + AmmVirtualAddressRanges_nid_no_patch(&values[1], &values[2], &values[3], &values[4]); + std::memcpy(param, values, static_cast(bytes)); return 0; } @@ -1806,11 +1844,6 @@ int APS5_VABI sceKernelTerminateSysCore(void) { return 0; } -int APS5_VABI sceKernelTitleWorkdaroundIsEnabled(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI sceKernelTraceMemoryTypeProtect(void) { return static_cast(0x8002004e); } @@ -1828,18 +1861,20 @@ int APS5_VABI sceKernelWaitCommandBufferCompletion(std::uint32_t id) { return AmmSubmitted_nid_no_patch(id) ? 0 : SCE_KERNEL_ERROR_ESRCH; } -int APS5_VABI sceKernelWriteEventQueueOnCompletionCommand(void) { - NotImplemented_nid_no_patch(__func__); - return 0; +int APS5_VABI sceKernelWriteEventQueueOnCompletionCommand(void* dst, std::uint64_t equeue, std::int32_t ident, std::uint64_t data, std::uint64_t* outSize) { + if (equeue > EqueueLimit) return SCE_KERNEL_ERROR_EINVAL; + return WriteCommand(dst, Apr::WriteKernelEventQueueCommand{{Apr::Opcode::WriteKernelEventQueue, sizeof(Apr::WriteKernelEventQueueCommand)}, equeue & GuestAddressMask, static_cast(ident), data, 0}, outSize); } int APS5_VABI sceKernelWriteMapCommand(void* dst, std::uint64_t address, std::uint64_t size, std::uint64_t type, std::uint64_t protection, std::uint64_t* outSize) { return WriteAmmCommand({protection}, Apr::EncodeAmmMap(Apr::Opcode::AmmMap, address, 0, size, static_cast(type), static_cast(protection)), dst, outSize); } -int APS5_VABI sceKernelWriteMapCommand2(void) { - NotImplemented_nid_no_patch(__func__); - return 0; +int APS5_VABI sceKernelWriteMapCommand2(void* dst, std::uint64_t address, std::uint64_t size, std::int32_t type, std::int32_t protection, std::int32_t prt, std::uint64_t* outSize) { + if (prt == 0) return sceKernelWriteMapCommand(dst, address, size, static_cast(type), static_cast(protection), outSize); + if (!InsideAmmMapRange(address, size)) return SCE_KERNEL_ERROR_EINVAL; + if (type != 0 || protection != 0) NotImplemented_nid_no_patch("sceKernelWriteMapCommand2: a PRT map with a type or protection"); + return WriteCommand(dst, Apr::AmmUnmapCommand{{Apr::Opcode::AmmMapAsPrt, sizeof(Apr::AmmUnmapCommand)}, address & GuestAddressMask, size & AmmSizeMask}, outSize); } int APS5_VABI sceKernelWriteMapDirectCommand(void* dst, std::uint64_t address, std::uint64_t directOffset, std::uint64_t size, std::uint64_t type, std::uint64_t protection, std::uint64_t* outSize) { @@ -1902,24 +1937,30 @@ int APS5_VABI sceKernelWriteUnmapCommand(void* dst, std::uint64_t address, std:: return WriteAmmCommand({}, Apr::EncodeAmmUnmap(address, size), dst, outSize); } -int APS5_VABI sceKernelWriteWaitOnAddressCommand(void) { - NotImplemented_nid_no_patch(__func__); - return 0; +int APS5_VABI sceKernelWriteUnmapToPrtCommand(void* dst, std::uint64_t address, std::uint64_t size, std::uint64_t* outSize) { + if (!InsideAmmMapRange(address, size)) return SCE_KERNEL_ERROR_EINVAL; + return WriteCommand(dst, Apr::AmmUnmapCommand{{Apr::Opcode::AmmUnmapToPrt, sizeof(Apr::AmmUnmapCommand)}, address & GuestAddressMask, size & AmmSizeMask}, outSize); } -int APS5_VABI sceKernelWriteWaitOnCounterCommand(void) { - NotImplemented_nid_no_patch(__func__); - return 0; +int APS5_VABI sceKernelWriteWaitOnAddressCommand(void* dst, std::uint64_t address, std::uint64_t reference, std::int32_t compare, std::int32_t flush, std::uint64_t* outSize) { + (void)flush; + if (compare > 3) return SCE_KERNEL_ERROR_EINVAL; + if (dst && (address & 7u) != 0u) NotImplemented_nid_no_patch("sceKernelWriteWaitOnAddressCommand: a wait on an unaligned address"); + return WriteCommand(dst, Apr::WaitCommand{{Apr::Opcode::WaitOnAddress, sizeof(Apr::WaitCommand)}, address & GuestAddressMask, reference, ~0ull, 0, static_cast(compare & 7), Apr::CounterAccess::Size8, 0}, outSize); } -int APS5_VABI sceKernelWriteWriteAddressCommand(void) { - NotImplemented_nid_no_patch(__func__); - return 0; +int APS5_VABI sceKernelWriteWaitOnCounterCommand(void* dst, std::uint8_t counter, std::uint32_t reference, std::int32_t compare, std::int32_t flush, std::uint64_t* outSize) { + (void)flush; + if (compare > 3) return SCE_KERNEL_ERROR_EINVAL; + return WriteCommand(dst, Apr::WaitCommand{{Apr::Opcode::WaitOnCounter, sizeof(Apr::WaitCommand)}, 0, reference, ~0ull, counter, static_cast(compare & 7), Apr::CounterAccess::Size4, 0}, outSize); } -int APS5_VABI sceKernelWriteWriteCounterCommand(void) { - NotImplemented_nid_no_patch(__func__); - return 0; +int APS5_VABI sceKernelWriteWriteAddressCommand(void* dst, std::uint64_t address, std::uint64_t value, std::uint64_t* outSize) { + return WriteCommand(dst, Apr::WriteAddressCommand{{Apr::Opcode::WriteAddress, sizeof(Apr::WriteAddressCommand)}, address & GuestAddressMask & ~std::uint64_t{7}, value, 0, 0}, outSize); +} + +int APS5_VABI sceKernelWriteWriteCounterCommand(void* dst, std::uint8_t counter, std::uint32_t value, std::uint64_t* outSize) { + return WriteCommand(dst, Apr::WriteCounterCommand{{Apr::Opcode::WriteCounter, sizeof(Apr::WriteCounterCommand)}, counter, Apr::CounterAccess::Size4, Apr::CounterOperation::Store, 0, value}, outSize); } int APS5_VABI sceKernelYieldCpumode(void) { diff --git a/core/libs/prx/libkernel_sys/Export.cpp b/core/libs/prx/libkernel_sys/Export.cpp index a26fd1347f..bd135b5f96 100644 --- a/core/libs/prx/libkernel_sys/Export.cpp +++ b/core/libs/prx/libkernel_sys/Export.cpp @@ -350,7 +350,7 @@ extern "C" { int APS5_VABI sceKernelGetCompiledSdkVersion(std::int32_t* version) { if (version == nullptr) return SCE_KERNEL_ERROR_EINVAL; static const auto* parameters = static_cast(ApplicationProcessParameters_nid_no_patch()); - std::memcpy(version, parameters + 0x10, sizeof(*version)); + if (!GuestCopyOut_nid_no_patch(version, parameters + 0x10, sizeof(*version))) return SCE_KERNEL_ERROR_EFAULT; return 0; } @@ -535,6 +535,19 @@ KernelModule APS5_VABI sceKernelLoadStartModuleForSysmodule(const char* moduleFi return sceKernelLoadStartModule(moduleFileName, args, argp, flags, opt, res); } +int APS5_VABI sceKernelIsModuleLoaded(const char* name) { + if (!name) throw std::invalid_argument("sceKernelIsModuleLoaded: null name"); + KernelModule handles[0x300]; + std::size_t count = 0; + if (const int result = sceKernelGetModuleListInternal(handles, std::size(handles), &count)) return result; + for (std::size_t i = 0; i < count; ++i) { + ModuleInfo info{}; + info.st_size = sizeof(info); + if (sceKernelGetModuleInfo(handles[i], &info) == 0 && std::strncmp(info.name, name, sizeof(info.name)) == 0) return 0; + } + return SCE_KERNEL_ERROR_ESRCH; +} + int APS5_VABI fstat_nid_postfix(int d, FileStat* sb) { return static_cast(_fstat_nid_postfix(d, sb)); } @@ -1224,11 +1237,15 @@ void APS5_VABI scePthreadSetName(Pthread thread, const char* name) { int APS5_VABI sceKernelTitleWorkaroundIsEnabled(const KernelTitleWorkaround* workaround, std::int32_t bit, std::int32_t* enabled) { if (!workaround || !enabled) return static_cast(0x8002000E); - if (static_cast(bit) >= 0x3A) return static_cast(0x80020016); + if (static_cast(bit) > 0x7F) return static_cast(0x80020016); *enabled = static_cast((workaround->ids[bit >> 6] >> (bit & 0x3F)) & 1); return 0; } +int APS5_VABI sceKernelTitleWorkdaroundIsEnabled(const KernelTitleWorkaround* workaround, std::int32_t bit, std::int32_t* enabled) { + return sceKernelTitleWorkaroundIsEnabled(workaround, bit, enabled); +} + int APS5_VABI sceKernelGetProcessType(int pid) { if (pid != getpid_nid_postfix() && pid != -1 && pid != 0) return static_cast(0x80020003); return 0; diff --git a/core/libs/prx/libkernel_sys/include/AdditionalExports.hpp b/core/libs/prx/libkernel_sys/include/AdditionalExports.hpp index e5634b6744..93087dfeae 100644 --- a/core/libs/prx/libkernel_sys/include/AdditionalExports.hpp +++ b/core/libs/prx/libkernel_sys/include/AdditionalExports.hpp @@ -254,7 +254,6 @@ int APS5_VABI mmap2_nid_postfix(); int APS5_VABI pthread_setschedother_np_nid_postfix(); int APS5_VABI sceKernelAddDynlibEvent(); int APS5_VABI sceKernelAddFGCInfo(); -int APS5_VABI sceKernelCallIndirectBuffer3(); int APS5_VABI sceKernelCreateUuidV1(); int APS5_VABI sceKernelCreateUuidV7(); int APS5_VABI sceKernelDeleteDynlibEvent(); @@ -330,7 +329,6 @@ int APS5_VABI sceKernelTraceAutoCaptureStore(); int APS5_VABI sceKernelTraceAutoCaptureUnmap(); int APS5_VABI sceKernelUseCronosKura(); int APS5_VABI sceKernelUseCronosStreaming(); -int APS5_VABI sceKernelWriteUnmapToPrtCommand(); int APS5_VABI scePthreadRegisterThreadDeathHook(); } diff --git a/core/libs/prx/libkernel_sys/include/Api.hpp b/core/libs/prx/libkernel_sys/include/Api.hpp index ef0c27e4f3..c1fa1576d4 100644 --- a/core/libs/prx/libkernel_sys/include/Api.hpp +++ b/core/libs/prx/libkernel_sys/include/Api.hpp @@ -3,6 +3,11 @@ #include "prx/libkernel/include/Api.hpp" #include "SceTypes.hpp" +struct KernelMapperSubmitResult { + std::int32_t result; + std::uint32_t errorOffset; +}; + struct GuestAiocb { int fildes; std::int64_t offset; @@ -184,8 +189,9 @@ int APS5_VABI sceKernelAvailableToolMemorySize(void); int APS5_VABI sceKernelBacktraceSelf(void); int APS5_VABI sceKernelBeginAppMount(void); int APS5_VABI sceKernelBeginAppMount2(void); -int APS5_VABI sceKernelCallIndirectBuffer(void); -int APS5_VABI sceKernelCallIndirectBuffer2(void); +int APS5_VABI sceKernelCallIndirectBuffer(std::uint32_t priority, void* base, std::uint64_t bytes); +int APS5_VABI sceKernelCallIndirectBuffer2(std::uint32_t priority, void* base, std::uint64_t bytes, KernelMapperSubmitResult* result, std::uint32_t* id); +int APS5_VABI sceKernelCallIndirectBuffer3(std::uint32_t priority, void* base, std::uint64_t bytes, std::uint32_t* id); int APS5_VABI sceKernelClearBootReqNotifyCount(void); int APS5_VABI sceKernelClearGameDirectMemory(void); int APS5_VABI sceKernelCloseEport(void); @@ -316,7 +322,7 @@ int APS5_VABI sceKernelGetUtokenUseSoftwagnerForAcmgr(void); int APS5_VABI sceKernelGetUtokenUseSoftwagnerForRcmgr(void); int APS5_VABI sceKernelGetUtokenWeakenedPortRestrictionForRcmgr(void); int APS5_VABI sceKernelGetVrCaptureSize(void); -int APS5_VABI sceKernelGiveDirectMemoryToMapper(void); +int APS5_VABI sceKernelGiveDirectMemoryToMapper(std::int64_t searchStart, std::int64_t searchEnd, std::size_t size, std::size_t alignment, int usage, std::int64_t* offset); int APS5_VABI sceKernelHasNeoMode(void); int APS5_VABI sceKernelHwGetBdDriveInfo(void); int APS5_VABI sceKernelHwHasOpticalOut(void); @@ -370,7 +376,7 @@ int APS5_VABI sceKernelIsKratos(void); int APS5_VABI sceKernelIsM2DeviceAttached(void); int APS5_VABI sceKernelIsMainOnStanbyMode(void); int APS5_VABI sceKernelIsMainOnStandbyMode(void); -int APS5_VABI sceKernelIsModuleLoaded(void); +int APS5_VABI sceKernelIsModuleLoaded(const char* name); int APS5_VABI sceKernelIsNeoMode(void); int APS5_VABI sceKernelIsProspero(void); int APS5_VABI sceKernelIsPs4Process(void); @@ -386,7 +392,7 @@ int64_t APS5_VABI sceKernelLwfsWrite(int32_t fd, const void* data, std::size_t s int APS5_VABI sceKernelMapSanitizerShadowMemory(void); int APS5_VABI sceKernelMapToolMemory(void); int APS5_VABI sceKernelMapTraceMemory(void); -int APS5_VABI sceKernelMapperGetParam(void); +int APS5_VABI sceKernelMapperGetParam(std::uint64_t* param); int APS5_VABI sceKernelMemoryPoolMove(void); int APS5_VABI sceKernelMlockall(void); int APS5_VABI sceKernelMsync(void* address, std::size_t length, int flags); @@ -471,14 +477,14 @@ int APS5_VABI sceKernelSwitchToNativeMode(void); int APS5_VABI sceKernelSwitchToNeoMode(void); int APS5_VABI sceKernelTerminateProcess(void); int APS5_VABI sceKernelTerminateSysCore(void); -int APS5_VABI sceKernelTitleWorkdaroundIsEnabled(void); +int APS5_VABI sceKernelTitleWorkdaroundIsEnabled(const KernelTitleWorkaround* workaround, std::int32_t bit, std::int32_t* enabled); int APS5_VABI sceKernelTraceMemoryTypeProtect(void); int APS5_VABI sceKernelTriggerEport(void); int APS5_VABI sceKernelVirtualQueryAll(void); int APS5_VABI sceKernelWaitCommandBufferCompletion(std::uint32_t id); -int APS5_VABI sceKernelWriteEventQueueOnCompletionCommand(void); +int APS5_VABI sceKernelWriteEventQueueOnCompletionCommand(void* dst, std::uint64_t equeue, std::int32_t ident, std::uint64_t data, std::uint64_t* outSize); int APS5_VABI sceKernelWriteMapCommand(void* dst, std::uint64_t address, std::uint64_t size, std::uint64_t type, std::uint64_t protection, std::uint64_t* outSize); -int APS5_VABI sceKernelWriteMapCommand2(void); +int APS5_VABI sceKernelWriteMapCommand2(void* dst, std::uint64_t address, std::uint64_t size, std::int32_t type, std::int32_t protection, std::int32_t prt, std::uint64_t* outSize); int APS5_VABI sceKernelWriteMapDirectCommand(void* dst, std::uint64_t address, std::uint64_t directOffset, std::uint64_t size, std::uint64_t type, std::uint64_t protection, std::uint64_t* outSize); int APS5_VABI sceKernelWriteMapDirectWithGpuMaskIdCommand(void* dst, std::uint64_t address, std::uint64_t directOffset, std::uint64_t size, std::uint64_t type, std::uint64_t protection, std::uint64_t gpuMaskId, std::uint64_t* outSize); int APS5_VABI sceKernelWriteMapWithGpuMaskIdCommand(void* dst, std::uint64_t address, std::uint64_t size, std::uint64_t type, std::uint64_t protection, std::uint64_t gpuMaskId, std::uint64_t* outSize); @@ -492,10 +498,11 @@ int APS5_VABI sceKernelWriteRemapWithGpuMaskIdCommand(void* dst, std::uint64_t a int APS5_VABI sceKernelWriteSdkEventLog(void); int APS5_VABI sceKernelWriteSdkEventLogV(void); int APS5_VABI sceKernelWriteUnmapCommand(void* dst, std::uint64_t address, std::uint64_t size, std::uint64_t* outSize); -int APS5_VABI sceKernelWriteWaitOnAddressCommand(void); -int APS5_VABI sceKernelWriteWaitOnCounterCommand(void); -int APS5_VABI sceKernelWriteWriteAddressCommand(void); -int APS5_VABI sceKernelWriteWriteCounterCommand(void); +int APS5_VABI sceKernelWriteUnmapToPrtCommand(void* dst, std::uint64_t address, std::uint64_t size, std::uint64_t* outSize); +int APS5_VABI sceKernelWriteWaitOnAddressCommand(void* dst, std::uint64_t address, std::uint64_t reference, std::int32_t compare, std::int32_t flush, std::uint64_t* outSize); +int APS5_VABI sceKernelWriteWaitOnCounterCommand(void* dst, std::uint8_t counter, std::uint32_t reference, std::int32_t compare, std::int32_t flush, std::uint64_t* outSize); +int APS5_VABI sceKernelWriteWriteAddressCommand(void* dst, std::uint64_t address, std::uint64_t value, std::uint64_t* outSize); +int APS5_VABI sceKernelWriteWriteCounterCommand(void* dst, std::uint8_t counter, std::uint32_t value, std::uint64_t* outSize); int APS5_VABI sceKernelYieldCpumode(void); int APS5_VABI sceLibcMspaceCreateForMonoMutex(void); int APS5_VABI scePthreadAtfork(void (APS5_VABI* prepare)(), void (APS5_VABI* parent)(), void (APS5_VABI* child)()); diff --git a/core/libs/prx/libkernel_web/Export.cpp b/core/libs/prx/libkernel_web/Export.cpp index 3192e02863..c753713bec 100644 --- a/core/libs/prx/libkernel_web/Export.cpp +++ b/core/libs/prx/libkernel_web/Export.cpp @@ -2,232 +2,196 @@ #include #include "SceTypes.hpp" #include "prx/libc/include/General.hpp" +#include "prx/libkernel_web/include/Api.hpp" extern "C" { APS5_DUMMY_FUN -int APS5_VABI sceKernelWebUnknown_001_nid_no_patch() { +int APS5_VABI __freeze_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("nSSPVGJLMjE", sceKernelWebUnknown_001_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_002_nid_no_patch() { +int APS5_VABI __sceKernelGetGPI_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("3JYhkiIHkJc", sceKernelWebUnknown_002_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_003_nid_no_patch() { +int APS5_VABI __sys_debug_init_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("zdaF5N-Xe2M", sceKernelWebUnknown_003_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_004_nid_no_patch() { +int APS5_VABI __sys_dl_get_info_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("YbAunrti+54", sceKernelWebUnknown_004_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_005_nid_no_patch() { +int APS5_VABI __sys_dl_get_info_2_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("lCp17SqY3Nc", sceKernelWebUnknown_005_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_006_nid_no_patch() { +int APS5_VABI __sys_dl_get_list_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("XujojypwYYc", sceKernelWebUnknown_006_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_007_nid_no_patch() { +int APS5_VABI __sys_dl_get_metadata_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("7OpNDDNMJyo", sceKernelWebUnknown_007_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_008_nid_no_patch() { +int APS5_VABI __sys_dynlib_get_info2_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("nTc+tFajGqQ", sceKernelWebUnknown_008_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_009_nid_no_patch() { +int APS5_VABI __sys_dynlib_get_info_for_libdbg_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("K7xiuldOPKw", sceKernelWebUnknown_009_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_010_nid_no_patch() { +int APS5_VABI __sys_dynlib_get_list2_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("P0jjY6bxakI", sceKernelWebUnknown_010_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_011_nid_no_patch() { +int APS5_VABI __sys_dynlib_get_list_for_libdbg_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("vpo3SbGFuEk", sceKernelWebUnknown_011_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_012_nid_no_patch() { +int APS5_VABI __sys_dynlib_load_prx_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("nZHk+lpqwVQ", sceKernelWebUnknown_012_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_013_nid_no_patch() { +int APS5_VABI __sys_get_proc_type_info_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("nG-FYqFutUo", sceKernelWebUnknown_013_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_014_nid_no_patch() { +int APS5_VABI __sys_is_development_mode_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("O-hEvSnv2o4", sceKernelWebUnknown_014_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_015_nid_no_patch() { +int APS5_VABI __sys_kqueueex_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("2M+dFM8Wmq4", sceKernelWebUnknown_015_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_016_nid_no_patch() { +int APS5_VABI __sys_namedobj_create_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("3CNY4Z0Luc8", sceKernelWebUnknown_016_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_017_nid_no_patch() { +int APS5_VABI __sys_namedobj_delete_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("E7CmfLfeSuQ", sceKernelWebUnknown_017_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_018_nid_no_patch() { +int APS5_VABI __sys_netabort_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("UTR6wAkajxk", sceKernelWebUnknown_018_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_019_nid_no_patch() { +int APS5_VABI __sys_netcontrol_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("zsTvhCDrOjQ", sceKernelWebUnknown_019_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_020_nid_no_patch() { +int APS5_VABI __sys_netgetiflist_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("X86Q0qQJ1m0", sceKernelWebUnknown_020_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_021_nid_no_patch() { +int APS5_VABI __sys_netgetsockinfo_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("Wx2+2t1mX1E", sceKernelWebUnknown_021_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_022_nid_no_patch() { +int APS5_VABI __sys_opmc_disable_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("iZFJYJJoZS8", sceKernelWebUnknown_022_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_023_nid_no_patch() { +int APS5_VABI __sys_opmc_enable_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("MGrj20+EK+U", sceKernelWebUnknown_023_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_024_nid_no_patch() { +int APS5_VABI __sys_opmc_get_ctr_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("h+4DJpAXs4I", sceKernelWebUnknown_024_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_025_nid_no_patch() { +int APS5_VABI __sys_opmc_get_hw_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("IglowNcOePQ", sceKernelWebUnknown_025_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_026_nid_no_patch() { +int APS5_VABI __sys_opmc_set_ctl_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("vS-RnoD1BSY", sceKernelWebUnknown_026_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_027_nid_no_patch() { +int APS5_VABI __sys_opmc_set_ctr_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("ztNqqNCl1Tw", sceKernelWebUnknown_027_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_028_nid_no_patch() { +int APS5_VABI __sys_opmc_set_hw_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("PIt9WYaoBqU", sceKernelWebUnknown_028_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_029_nid_no_patch() { +int APS5_VABI __sys_osem_close_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("raO+bB7q2cY", sceKernelWebUnknown_029_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_030_nid_no_patch() { +int APS5_VABI __sys_osem_open_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("kPGXeSQeoWc", sceKernelWebUnknown_030_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_031_nid_no_patch() { +int APS5_VABI __sys_randomized_path_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("n0ErFZ2hmKs", sceKernelWebUnknown_031_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_032_nid_no_patch() { +int APS5_VABI __sys_rdup_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("9Iem9Wk07xU", sceKernelWebUnknown_032_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_033_nid_no_patch() { +int APS5_VABI __sys_regmgr_call_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("7NwggrWJ5cA", sceKernelWebUnknown_033_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_034_nid_no_patch() { +int APS5_VABI __sys_set_uevt_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("ByogDrS-Xw8", sceKernelWebUnknown_034_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_035_nid_no_patch() { +int APS5_VABI __sys_socketclose_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("t+rTx5NW+qU", sceKernelWebUnknown_035_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_036_nid_no_patch() { +int APS5_VABI __sys_test_debug_rwmem_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("EeVthQocE3Y", sceKernelWebUnknown_036_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_037_nid_no_patch() { +int APS5_VABI __sys_workaround8849_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("jTPE1AS7uak", sceKernelWebUnknown_037_nid_no_patch); int APS5_VABI sceKernelWebUnknown_038_nid_no_patch() { NotImplemented_nid_no_patch(__func__); @@ -235,34 +199,29 @@ int APS5_VABI sceKernelWebUnknown_038_nid_no_patch() { } APS5_EXPORT("W8f1adVl+48", sceKernelWebUnknown_038_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_039_nid_no_patch() { +int APS5_VABI _execve_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("-3nj+K1elI0", sceKernelWebUnknown_039_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_040_nid_no_patch() { +int APS5_VABI _execvpe_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("ScfDTOqLOMw", sceKernelWebUnknown_040_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_041_nid_no_patch() { +int APS5_VABI _wait4_nid_disambig1_nid_postfix() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("RFlsu7nfopM", sceKernelWebUnknown_041_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_042_nid_no_patch() { +int APS5_VABI sceKernelGetPrefixVersion() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("BDGc8ohuveU", sceKernelWebUnknown_042_nid_no_patch); -int APS5_VABI sceKernelWebUnknown_043_nid_no_patch() { +int APS5_VABI sceKernelIccGetThermalAlert() { NotImplemented_nid_no_patch(__func__); return 0; } -APS5_EXPORT("zEmi6zvei2k", sceKernelWebUnknown_043_nid_no_patch); } diff --git a/core/libs/prx/libkernel_web/include/Api.hpp b/core/libs/prx/libkernel_web/include/Api.hpp new file mode 100644 index 0000000000..e1dbd43230 --- /dev/null +++ b/core/libs/prx/libkernel_web/include/Api.hpp @@ -0,0 +1,50 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI __freeze_nid_disambig1_nid_postfix(); +int APS5_VABI __sceKernelGetGPI_nid_disambig1_nid_postfix(); +int APS5_VABI __sys_debug_init_nid_disambig1_nid_postfix(); +int APS5_VABI __sys_dl_get_info_nid_disambig1_nid_postfix(); +int APS5_VABI __sys_dl_get_info_2_nid_disambig1_nid_postfix(); +int APS5_VABI __sys_dl_get_list_nid_disambig1_nid_postfix(); +int APS5_VABI __sys_dl_get_metadata_nid_disambig1_nid_postfix(); +int APS5_VABI __sys_dynlib_get_info2_nid_disambig1_nid_postfix(); +int APS5_VABI __sys_dynlib_get_info_for_libdbg_nid_disambig1_nid_postfix(); +int APS5_VABI __sys_dynlib_get_list2_nid_disambig1_nid_postfix(); +int APS5_VABI __sys_dynlib_get_list_for_libdbg_nid_disambig1_nid_postfix(); +int APS5_VABI __sys_dynlib_load_prx_nid_disambig1_nid_postfix(); +int APS5_VABI __sys_get_proc_type_info_nid_disambig1_nid_postfix(); +int APS5_VABI __sys_is_development_mode_nid_disambig1_nid_postfix(); +int APS5_VABI __sys_kqueueex_nid_disambig1_nid_postfix(); +int APS5_VABI __sys_namedobj_create_nid_disambig1_nid_postfix(); +int APS5_VABI __sys_namedobj_delete_nid_disambig1_nid_postfix(); +int APS5_VABI __sys_netabort_nid_disambig1_nid_postfix(); +int APS5_VABI __sys_netcontrol_nid_disambig1_nid_postfix(); +int APS5_VABI __sys_netgetiflist_nid_disambig1_nid_postfix(); +int APS5_VABI __sys_netgetsockinfo_nid_disambig1_nid_postfix(); +int APS5_VABI __sys_opmc_disable_nid_disambig1_nid_postfix(); +int APS5_VABI __sys_opmc_enable_nid_disambig1_nid_postfix(); +int APS5_VABI __sys_opmc_get_ctr_nid_disambig1_nid_postfix(); +int APS5_VABI __sys_opmc_get_hw_nid_disambig1_nid_postfix(); +int APS5_VABI __sys_opmc_set_ctl_nid_disambig1_nid_postfix(); +int APS5_VABI __sys_opmc_set_ctr_nid_disambig1_nid_postfix(); +int APS5_VABI __sys_opmc_set_hw_nid_disambig1_nid_postfix(); +int APS5_VABI __sys_osem_close_nid_disambig1_nid_postfix(); +int APS5_VABI __sys_osem_open_nid_disambig1_nid_postfix(); +int APS5_VABI __sys_randomized_path_nid_disambig1_nid_postfix(); +int APS5_VABI __sys_rdup_nid_disambig1_nid_postfix(); +int APS5_VABI __sys_regmgr_call_nid_disambig1_nid_postfix(); +int APS5_VABI __sys_set_uevt_nid_disambig1_nid_postfix(); +int APS5_VABI __sys_socketclose_nid_disambig1_nid_postfix(); +int APS5_VABI __sys_test_debug_rwmem_nid_disambig1_nid_postfix(); +int APS5_VABI __sys_workaround8849_nid_disambig1_nid_postfix(); +int APS5_VABI _execve_nid_disambig1_nid_postfix(); +int APS5_VABI _execvpe_nid_disambig1_nid_postfix(); +int APS5_VABI _wait4_nid_disambig1_nid_postfix(); +int APS5_VABI sceKernelGetPrefixVersion(); +int APS5_VABI sceKernelIccGetThermalAlert(); + +} diff --git a/core/libs/prx/libkernel_web/libkernel_web.hpp b/core/libs/prx/libkernel_web/libkernel_web.hpp index 6f70f09bee..425dbf9288 100644 --- a/core/libs/prx/libkernel_web/libkernel_web.hpp +++ b/core/libs/prx/libkernel_web/libkernel_web.hpp @@ -1 +1,3 @@ #pragma once + +#include "prx/libkernel_web/include/Api.hpp" diff --git a/core/libs/prx/libmdbg_syscore/Export.cpp b/core/libs/prx/libmdbg_syscore/Export.cpp index 3135318157..378c303e41 100644 --- a/core/libs/prx/libmdbg_syscore/Export.cpp +++ b/core/libs/prx/libmdbg_syscore/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libmdbg_syscore/include/InventoryExports.hpp" #include "prx/libmdbg_syscore/include/Api.hpp" #include #include @@ -740,3 +742,122 @@ int APS5_VABI sceMdbgSetResult() { } } + +extern "C" { + +int APS5_VABI libmdbg_syscoreUnknown__minus_Os5MER7Z6w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-Os5MER7Z6w", libmdbg_syscoreUnknown__minus_Os5MER7Z6w_nid_no_patch); + +int APS5_VABI libmdbg_syscoreUnknown_63yQzeKlH74_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("63yQzeKlH74", libmdbg_syscoreUnknown_63yQzeKlH74_nid_no_patch); + +int APS5_VABI libmdbg_syscoreUnknown_9Z4GhOWZL6U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9Z4GhOWZL6U", libmdbg_syscoreUnknown_9Z4GhOWZL6U_nid_no_patch); + +int APS5_VABI libmdbg_syscoreUnknown_AOE76xS3KE8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AOE76xS3KE8", libmdbg_syscoreUnknown_AOE76xS3KE8_nid_no_patch); + +int APS5_VABI libmdbg_syscoreUnknown_HAuOlaAs6n0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HAuOlaAs6n0", libmdbg_syscoreUnknown_HAuOlaAs6n0_nid_no_patch); + +int APS5_VABI libmdbg_syscoreUnknown_KSF5BlhhUwA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KSF5BlhhUwA", libmdbg_syscoreUnknown_KSF5BlhhUwA_nid_no_patch); + +int APS5_VABI libmdbg_syscoreUnknown_KnjWLw4OOEg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KnjWLw4OOEg", libmdbg_syscoreUnknown_KnjWLw4OOEg_nid_no_patch); + +int APS5_VABI libmdbg_syscoreUnknown_MOLL_minus_OygpCA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MOLL-OygpCA", libmdbg_syscoreUnknown_MOLL_minus_OygpCA_nid_no_patch); + +int APS5_VABI libmdbg_syscoreUnknown_Wlgt1fK0WIg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Wlgt1fK0WIg", libmdbg_syscoreUnknown_Wlgt1fK0WIg_nid_no_patch); + +int APS5_VABI libmdbg_syscoreUnknown_Y4XKdJ9yi9w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Y4XKdJ9yi9w", libmdbg_syscoreUnknown_Y4XKdJ9yi9w_nid_no_patch); + +int APS5_VABI libmdbg_syscoreUnknown_g0xdmqI4Kfo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("g0xdmqI4Kfo", libmdbg_syscoreUnknown_g0xdmqI4Kfo_nid_no_patch); + +int APS5_VABI libmdbg_syscoreUnknown_gRIqTUqqQmo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gRIqTUqqQmo", libmdbg_syscoreUnknown_gRIqTUqqQmo_nid_no_patch); + +int APS5_VABI libmdbg_syscoreUnknown_h3hpY6kIB3c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("h3hpY6kIB3c", libmdbg_syscoreUnknown_h3hpY6kIB3c_nid_no_patch); + +int APS5_VABI libmdbg_syscoreUnknown_hAZNCht1_plus_T0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hAZNCht1+T0", libmdbg_syscoreUnknown_hAZNCht1_plus_T0_nid_no_patch); + +int APS5_VABI libmdbg_syscoreUnknown_iJTmUN3_plus_2A8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iJTmUN3+2A8", libmdbg_syscoreUnknown_iJTmUN3_plus_2A8_nid_no_patch); + +int APS5_VABI libmdbg_syscoreUnknown_iLMtKDbkQwM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iLMtKDbkQwM", libmdbg_syscoreUnknown_iLMtKDbkQwM_nid_no_patch); + +int APS5_VABI libmdbg_syscoreUnknown_irUK9RMoEQo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("irUK9RMoEQo", libmdbg_syscoreUnknown_irUK9RMoEQo_nid_no_patch); + +int APS5_VABI libmdbg_syscoreUnknown_mORgO8Woq_plus_E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mORgO8Woq+E", libmdbg_syscoreUnknown_mORgO8Woq_plus_E_nid_no_patch); + +int APS5_VABI libmdbg_syscoreUnknown_oNkb_plus_v3gFg0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oNkb+v3gFg0", libmdbg_syscoreUnknown_oNkb_plus_v3gFg0_nid_no_patch); + +int APS5_VABI libmdbg_syscoreUnknown_oSQ_plus_lkHQhI8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oSQ+lkHQhI8", libmdbg_syscoreUnknown_oSQ_plus_lkHQhI8_nid_no_patch); + +int APS5_VABI libmdbg_syscoreUnknown_og6sdu_minus_o9GE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("og6sdu-o9GE", libmdbg_syscoreUnknown_og6sdu_minus_o9GE_nid_no_patch); + +int APS5_VABI libmdbg_syscoreUnknown_qi6vA_plus_rh1K4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qi6vA+rh1K4", libmdbg_syscoreUnknown_qi6vA_plus_rh1K4_nid_no_patch); + +int APS5_VABI libmdbg_syscoreUnknown_wrKerXOBJ8U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wrKerXOBJ8U", libmdbg_syscoreUnknown_wrKerXOBJ8U_nid_no_patch); + +} diff --git a/core/libs/prx/libmdbg_syscore/include/InventoryExports.hpp b/core/libs/prx/libmdbg_syscore/include/InventoryExports.hpp new file mode 100644 index 0000000000..77fefb0415 --- /dev/null +++ b/core/libs/prx/libmdbg_syscore/include/InventoryExports.hpp @@ -0,0 +1,31 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libmdbg_syscoreUnknown__minus_Os5MER7Z6w_nid_no_patch(); +int APS5_VABI libmdbg_syscoreUnknown_63yQzeKlH74_nid_no_patch(); +int APS5_VABI libmdbg_syscoreUnknown_9Z4GhOWZL6U_nid_no_patch(); +int APS5_VABI libmdbg_syscoreUnknown_AOE76xS3KE8_nid_no_patch(); +int APS5_VABI libmdbg_syscoreUnknown_HAuOlaAs6n0_nid_no_patch(); +int APS5_VABI libmdbg_syscoreUnknown_KSF5BlhhUwA_nid_no_patch(); +int APS5_VABI libmdbg_syscoreUnknown_KnjWLw4OOEg_nid_no_patch(); +int APS5_VABI libmdbg_syscoreUnknown_MOLL_minus_OygpCA_nid_no_patch(); +int APS5_VABI libmdbg_syscoreUnknown_Wlgt1fK0WIg_nid_no_patch(); +int APS5_VABI libmdbg_syscoreUnknown_Y4XKdJ9yi9w_nid_no_patch(); +int APS5_VABI libmdbg_syscoreUnknown_g0xdmqI4Kfo_nid_no_patch(); +int APS5_VABI libmdbg_syscoreUnknown_gRIqTUqqQmo_nid_no_patch(); +int APS5_VABI libmdbg_syscoreUnknown_h3hpY6kIB3c_nid_no_patch(); +int APS5_VABI libmdbg_syscoreUnknown_hAZNCht1_plus_T0_nid_no_patch(); +int APS5_VABI libmdbg_syscoreUnknown_iJTmUN3_plus_2A8_nid_no_patch(); +int APS5_VABI libmdbg_syscoreUnknown_iLMtKDbkQwM_nid_no_patch(); +int APS5_VABI libmdbg_syscoreUnknown_irUK9RMoEQo_nid_no_patch(); +int APS5_VABI libmdbg_syscoreUnknown_mORgO8Woq_plus_E_nid_no_patch(); +int APS5_VABI libmdbg_syscoreUnknown_oNkb_plus_v3gFg0_nid_no_patch(); +int APS5_VABI libmdbg_syscoreUnknown_oSQ_plus_lkHQhI8_nid_no_patch(); +int APS5_VABI libmdbg_syscoreUnknown_og6sdu_minus_o9GE_nid_no_patch(); +int APS5_VABI libmdbg_syscoreUnknown_qi6vA_plus_rh1K4_nid_no_patch(); +int APS5_VABI libmdbg_syscoreUnknown_wrKerXOBJ8U_nid_no_patch(); + +} diff --git a/core/libs/prx/libmdbg_syscore/libmdbg_syscore.hpp b/core/libs/prx/libmdbg_syscore/libmdbg_syscore.hpp index 8a0fe08e5f..2d6984528d 100644 --- a/core/libs/prx/libmdbg_syscore/libmdbg_syscore.hpp +++ b/core/libs/prx/libmdbg_syscore/libmdbg_syscore.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libmdbg_syscore/include/Api.hpp" +#include "prx/libmdbg_syscore/include/InventoryExports.hpp" diff --git a/core/libs/prx/libwebrtc/CMakeLists.txt b/core/libs/prx/libwebrtc/CMakeLists.txt new file mode 100644 index 0000000000..13f569935a --- /dev/null +++ b/core/libs/prx/libwebrtc/CMakeLists.txt @@ -0,0 +1,51 @@ +add_library(libwebrtc SHARED EXCLUDE_FROM_ALL ${CMAKE_CURRENT_SOURCE_DIR}/Export.cpp) +target_include_directories(libwebrtc PRIVATE ${LIBS_INCLUDE_DIR}) +configure_windows_unwind(libwebrtc) + +target_sources(libwebrtc PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/ExpFilter.cpp) +target_sources(libwebrtc PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/RtcpCommonHeader.cpp) +target_sources(libwebrtc PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/Opus.cpp) +target_link_libraries(libwebrtc PRIVATE opus) + +if(BUILD_TESTING) + add_test_executable(guest_webrtc_fast_int_to_buffer_tests ${CMAKE_CURRENT_SOURCE_DIR}/tests/FastIntToBuffer.cpp) + target_include_directories(guest_webrtc_fast_int_to_buffer_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_webrtc_fast_int_to_buffer_tests PRIVATE libwebrtc libc) + configure_windows_unwind(guest_webrtc_fast_int_to_buffer_tests) + add_test(NAME guest_webrtc_fast_int_to_buffer COMMAND guest_webrtc_fast_int_to_buffer_tests) + set_tests_properties(guest_webrtc_fast_int_to_buffer PROPERTIES TIMEOUT 20) + if(WIN32) + set_tests_properties(guest_webrtc_fast_int_to_buffer PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test_executable(guest_webrtc_exp_filter_tests ${CMAKE_CURRENT_SOURCE_DIR}/tests/ExpFilter.cpp) + target_include_directories(guest_webrtc_exp_filter_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_webrtc_exp_filter_tests PRIVATE libwebrtc libc) + configure_windows_unwind(guest_webrtc_exp_filter_tests) + add_test(NAME guest_webrtc_exp_filter COMMAND guest_webrtc_exp_filter_tests) + set_tests_properties(guest_webrtc_exp_filter PROPERTIES TIMEOUT 20) + if(WIN32) + set_tests_properties(guest_webrtc_exp_filter PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test_executable(guest_webrtc_rtcp_common_header_tests ${CMAKE_CURRENT_SOURCE_DIR}/tests/RtcpCommonHeader.cpp) + target_include_directories(guest_webrtc_rtcp_common_header_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_webrtc_rtcp_common_header_tests PRIVATE libwebrtc libc) + configure_windows_unwind(guest_webrtc_rtcp_common_header_tests) + add_test(NAME guest_webrtc_rtcp_common_header COMMAND guest_webrtc_rtcp_common_header_tests) + set_tests_properties(guest_webrtc_rtcp_common_header PROPERTIES TIMEOUT 20) + if(WIN32) + set_tests_properties(guest_webrtc_rtcp_common_header PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test_executable(guest_webrtc_opus_tests ${CMAKE_CURRENT_SOURCE_DIR}/tests/Opus.cpp) + target_include_directories(guest_webrtc_opus_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_webrtc_opus_tests PRIVATE libwebrtc libc opus) + configure_windows_unwind(guest_webrtc_opus_tests) + add_test(NAME guest_webrtc_opus COMMAND guest_webrtc_opus_tests) + set_tests_properties(guest_webrtc_opus PROPERTIES TIMEOUT 20) + if(WIN32) + set_tests_properties(guest_webrtc_opus PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libwebrtc/Export.cpp b/core/libs/prx/libwebrtc/Export.cpp new file mode 100644 index 0000000000..0e9e8bfe5f --- /dev/null +++ b/core/libs/prx/libwebrtc/Export.cpp @@ -0,0 +1,2047 @@ +#include "prx/libwebrtc/include/Api.hpp" +#include +#include +#include +#include +#include +#include "SceTypes.hpp" +#include "prx/libc/include/General.hpp" + +extern "C" { + +APS5_EXPORT("kSchJ+SgltQ", libwebrtcUnknown00); +int APS5_VABI libwebrtcUnknown00(void) { + NotImplemented_nid_no_patch("kSchJ+SgltQ"); + return 0; +} + +APS5_EXPORT("Bq9Waszdevs", libwebrtcUnknown01); +int APS5_VABI libwebrtcUnknown01(void) { + NotImplemented_nid_no_patch("Bq9Waszdevs"); + return 0; +} + +int APS5_VABI _ZN6webrtc11EnableMediaERNS_33PeerConnectionFactoryDependenciesE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("tb7+sc1+V88", libwebrtcUnknown02); +int APS5_VABI libwebrtcUnknown02(void) { + NotImplemented_nid_no_patch("tb7+sc1+V88"); + return 0; +} + +int APS5_VABI _ZN6webrtc10CallConfigD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("DdAZMMuUzBg", libwebrtcUnknown03); +int APS5_VABI libwebrtcUnknown03(void) { + NotImplemented_nid_no_patch("DdAZMMuUzBg"); + return 0; +} + +char* APS5_VABI _ZN4absl16numbers_internal15FastIntToBufferEiPc_nid_postfix(int value, char* buffer) { + if (!buffer) + throw std::invalid_argument("FastIntToBuffer requires a buffer"); + std::uint32_t magnitude = static_cast(value); + if (value < 0) { + *buffer++ = '-'; + magnitude = 0u - magnitude; + } + if (magnitude >= 10u && magnitude < 100000000u) + std::memset(buffer, 0, 8); + buffer = std::to_chars(buffer, buffer + 10, magnitude).ptr; + *buffer = '\0'; + return buffer; +} + +int APS5_VABI _ZN3rtc18webrtc_checks_impl8FatalLogEPKciS2_PKNS0_12CheckArgTypeEz_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc18callback_list_impl21CallbackListReceiversC1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc19webrtc_logging_impl3LogEPKNS0_10LogArgTypeEz_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc10LogMessage6IsNoopENS_15LoggingSeverityE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc13SocketAddressC1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc13SocketAddressaSERKS0__nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3rtc13SocketAddress6ipaddrEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc13SocketAddressC1ERKNS_9IPAddressEi_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3rtc13SocketAddress4portEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3rtc9IPAddress12ipv4_addressEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3rtc9IPAddress12ipv6_addressEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc8RmsLevel7AnalyzeEN3rtc9ArrayViewIKsLln4711EEE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc8RmsLevel7AverageEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc8RmsLevelC1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc8RmsLevelD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc34CreateModularPeerConnectionFactoryENS_33PeerConnectionFactoryDependenciesE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc33PeerConnectionFactoryDependenciesC1EOS0__nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc33PeerConnectionFactoryDependenciesD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK6webrtc18EnvironmentFactory6CreateEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc12RtpExtensionD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc11FileWrapper5CloseEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc26PeerConnectionDependenciesC1EOS0__nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc26PeerConnectionDependenciesD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN7cricket18BasicPortAllocatorC1EPN3rtc14NetworkManagerEPNS1_19PacketSocketFactoryEPN6webrtc14TurnCustomizerEPNS_25RelayPortFactoryInterfaceEPKNS6_15FieldTrialsViewE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc10CallConfigC1ERKNS_11EnvironmentEPNS_13TaskQueueBaseE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc23PeerConnectionInterface16RTCConfigurationC1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc23PeerConnectionInterface16RTCConfigurationD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc13CryptoOptionsC1ERKS0__nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc23PeerConnectionInterface9IceServerC1ERKS1__nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc23PeerConnectionInterface9IceServerD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc14RTCCertificateD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK6webrtc20AudioSourceInterface7optionsEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3rtc9IPAddresseqERKS0__nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK6webrtc8RTCError7messageEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc21PendingTaskSafetyFlag6CreateEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN7cricket5CodecD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc21PendingTaskSafetyFlag11SetNotAliveEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc18RtpTransceiverInitC1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc18RtpTransceiverInitD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("RVMa2ePsZR8", libwebrtcUnknown04); +int APS5_VABI libwebrtcUnknown04(void) { + NotImplemented_nid_no_patch("RVMa2ePsZR8"); + return 0; +} + +int APS5_VABI _ZNK6webrtc21PendingTaskSafetyFlag5aliveEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("Sr1wSrhjO3E", libwebrtcUnknown05); +int APS5_VABI libwebrtcUnknown05(void) { + NotImplemented_nid_no_patch("Sr1wSrhjO3E"); + return 0; +} + +int APS5_VABI _ZN3rtc17CopyOnWriteBufferC1ERKS0__nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc17CopyOnWriteBufferD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc17RtpPacketReceivedC1ERKS0__nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc17RtpPacketReceivedD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc17CopyOnWriteBuffer24UnshareAndEnsureCapacityEm_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc17CopyOnWriteBufferC1Emm_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc13TaskQueueBase7CurrentEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc10PacketInfoD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc21RtpHeaderExtensionMapC1EN3rtc9ArrayViewIKNS_12RtpExtensionELln4711EEE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc17RtpPacketReceivedC1EPKNS_21RtpHeaderExtensionMapENS_9TimestampE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc6Thread7CurrentEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc10TimeMillisEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("qFYB-adjVIM", libwebrtcUnknown06); +int APS5_VABI libwebrtcUnknown06(void) { + NotImplemented_nid_no_patch("qFYB-adjVIM"); + return 0; +} + +int APS5_VABI _ZNK6webrtc14RTCStatsReport5beginEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK6webrtc14RTCStatsReport3endEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK6webrtc14RTCStatsReport13ConstIteratorneERKS1__nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc14RTCStatsReport13ConstIteratorppEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK6webrtc14RTCStatsReport13ConstIteratordeEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc14RTCStatsReport13ConstIteratorD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc10TimeMicrosEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("AEjxDisAkPE", libwebrtcUnknown07); +int APS5_VABI libwebrtcUnknown07(void) { + NotImplemented_nid_no_patch("AEjxDisAkPE"); + return 0; +} + +int APS5_VABI _ZN3rtc13SocketAddressC1ERKS0__nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("ftP-2ZTa94E", libwebrtcUnknown08); +int APS5_VABI libwebrtcUnknown08(void) { + NotImplemented_nid_no_patch("ftP-2ZTa94E"); + return 0; +} + +int APS5_VABI _ZNK3rtc13SocketAddress5IsNilEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("uWpaQ5UuMwQ", libwebrtcUnknown09); +int APS5_VABI libwebrtcUnknown09(void) { + NotImplemented_nid_no_patch("uWpaQ5UuMwQ"); + return 0; +} + +APS5_EXPORT("BRiFWS8-Khk", libwebrtcUnknown10); +int APS5_VABI libwebrtcUnknown10(void) { + NotImplemented_nid_no_patch("BRiFWS8-Khk"); + return 0; +} + +APS5_EXPORT("s+XzpKPY7JA", libwebrtcUnknown11); +int APS5_VABI libwebrtcUnknown11(void) { + NotImplemented_nid_no_patch("s+XzpKPY7JA"); + return 0; +} + +int APS5_VABI _ZN3rtc9KeyParamsC1ENS_7KeyTypeE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc23PeerConnectionInterface9IceServerC1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc26PeerConnectionDependenciesC1EPNS_22PeerConnectionObserverE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc33PeerConnectionFactoryDependenciesC1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("IEo8FXYcE8c", libwebrtcUnknown12); +int APS5_VABI libwebrtcUnknown12(void) { + NotImplemented_nid_no_patch("IEo8FXYcE8c"); + return 0; +} + +APS5_EXPORT("U373Sdo7lsw", libwebrtcUnknown13); +int APS5_VABI libwebrtcUnknown13(void) { + NotImplemented_nid_no_patch("U373Sdo7lsw"); + return 0; +} + +int APS5_VABI _ZN6webrtc32webrtc_sequence_checker_internal19SequenceCheckerImplC2Eb_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc15CurrentThreadIdEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc13TaskQueueBase22CurrentTaskQueueSetterC1EPS0__nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc13TaskQueueBase22CurrentTaskQueueSetterD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc18EncodedImageBuffer6CreateEPKhm_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc10ColorSpaceC1ERKS0__nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc10ColorSpaceaSERKS0__nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc12EncodedImageC1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc12EncodedImageD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc10I420Buffer6CreateEiiiii_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc10I420Buffer12MutableDataYEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc10I420Buffer12MutableDataUEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc10I420Buffer12MutableDataVEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc19I420BufferInterface6ToI420Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK6webrtc19I420BufferInterface7GetI420Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc16VideoFrameBuffer12CropAndScaleEiiiiii_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc16VideoFrameBuffer20GetMappedFrameBufferEN3rtc9ArrayViewINS0_4TypeELln4711EEE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("R+hhR9jq4sU", libwebrtcUnknown14); +int APS5_VABI libwebrtcUnknown14(void) { + NotImplemented_nid_no_patch("R+hhR9jq4sU"); + return 0; +} + +int APS5_VABI _ZNK6webrtc19I420BufferInterface11ChromaWidthEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK6webrtc19I420BufferInterface12ChromaHeightEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK6webrtc16VideoFrameBuffer7GetI420Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc10VideoFrame7Builder5buildEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc10VideoFrame7Builder22set_video_frame_bufferERKNS_13scoped_refptrINS_16VideoFrameBufferEEE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc10VideoFrame7Builder16set_timestamp_msEl_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc10VideoFrame7Builder17set_timestamp_rtpEj_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc10VideoFrame7Builder15set_ntp_time_msEl_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc10VideoFrame7Builder6set_idEt_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK6webrtc10VideoFrame5widthEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK6webrtc10VideoFrame6heightEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK6webrtc10VideoFrame18video_frame_bufferEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK6webrtc10VideoFrame14render_time_msEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc10VideoFrame7BuilderC1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc10VideoFrame7BuilderD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc10VideoFrameC1ERKNS_13scoped_refptrINS_16VideoFrameBufferEEEjlNS_13VideoRotationE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc10VideoFrameD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc14VideoSinkWantsC1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc14VideoSinkWantsC1ERKS0__nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc14VideoSinkWantsD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc10LogMessage6streamEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc10LogMessage17GetMinLogSeverityEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc10LogMessage13GetLogToDebugEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc10LogMessage10LogThreadsEb_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc10LogMessage13LogTimestampsEb_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc10LogMessage10LogToDebugENS_15LoggingSeverityE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc10LogMessage14SetLogToStderrEb_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc10LogMessage14AddLogToStreamEPNS_7LogSinkENS_15LoggingSeverityE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc10LogMessage17RemoveLogToStreamEPNS_7LogSinkE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc7LogSink12OnLogMessageERKNS_10LogLineRefE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("pMv17ToRoH8", libwebrtcUnknown15); +int APS5_VABI libwebrtcUnknown15(void) { + NotImplemented_nid_no_patch("pMv17ToRoH8"); + return 0; +} + +APS5_EXPORT("Z9NAPHRBMEI", libwebrtcUnknown16); +int APS5_VABI libwebrtcUnknown16(void) { + NotImplemented_nid_no_patch("Z9NAPHRBMEI"); + return 0; +} + +APS5_EXPORT("SsXGM-KrjHo", libwebrtcUnknown17); +int APS5_VABI libwebrtcUnknown17(void) { + NotImplemented_nid_no_patch("SsXGM-KrjHo"); + return 0; +} + +APS5_EXPORT("DqwPN50HkI4", libwebrtcUnknown18); +int APS5_VABI libwebrtcUnknown18(void) { + NotImplemented_nid_no_patch("DqwPN50HkI4"); + return 0; +} + +int APS5_VABI _ZN3rtc10LogMessageC1EPKciNS_15LoggingSeverityE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc10LogMessageD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3rtc13SocketAddress10IsCompleteEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3rtc9IPAddress27v4AddressAsHostOrderIntegerEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("z-b1v5cik7s", libwebrtcUnknown19); +int APS5_VABI libwebrtcUnknown19(void) { + NotImplemented_nid_no_patch("z-b1v5cik7s"); + return 0; +} + +int APS5_VABI _ZNK3rtc13SocketAddress7IsAnyIPEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc10TruncateIPERKNS_9IPAddressEi_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc15CountIPMaskBitsERKNS_9IPAddressE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc17AsyncPacketSocketD2Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc17AsyncPacketSocket20NotifyPacketReceivedERKNS_14ReceivedPacketE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("t2C2h5xmnms", libwebrtcUnknown20); +int APS5_VABI libwebrtcUnknown20(void) { + NotImplemented_nid_no_patch("t2C2h5xmnms"); + return 0; +} + +APS5_EXPORT("GGzOuMbXsGw", libwebrtcUnknown21); +int APS5_VABI libwebrtcUnknown21(void) { + NotImplemented_nid_no_patch("GGzOuMbXsGw"); + return 0; +} + +int APS5_VABI _ZN3rtc10SentPacketC1Ell_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc10SentPacketC1EllRKNS_10PacketInfoE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3rtc14RTCCertificate10HasExpiredEm_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc17CopyOnWriteBufferC1Em_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc17CodecSpecificInfoD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc17CodecSpecificInfoC1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("0Uh0ycY9nog", libwebrtcUnknown22); +int APS5_VABI libwebrtcUnknown22(void) { + NotImplemented_nid_no_patch("0Uh0ycY9nog"); + return 0; +} + +int APS5_VABI _ZNK6webrtc14SdpVideoFormat13IsCodecInListEN3rtc9ArrayViewIKS0_Lln4711EEE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("EhpYIe91V44", libwebrtcUnknown23); +int APS5_VABI libwebrtcUnknown23(void) { + NotImplemented_nid_no_patch("EhpYIe91V44"); + return 0; +} + +int APS5_VABI _ZN6webrtc14SdpVideoFormatC1ERKS0__nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc14SdpVideoFormatC1EOS0__nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc14SdpVideoFormatD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK6webrtc12VideoDecoder14GetDecoderInfoEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK6webrtc19VideoDecoderFactory17QueryCodecSupportERKNS_14SdpVideoFormatEb_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc12VideoEncoder24SetFecControllerOverrideEPNS_21FecControllerOverrideE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc12VideoEncoder10InitEncodeEPKNS_10VideoCodecEim_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc12VideoEncoder11EncoderInfoC1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc12VideoEncoder11EncoderInfoD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc12VideoEncoder21RateControlParametersD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("P+3Zbh6lqCo", libwebrtcUnknown24); +int APS5_VABI libwebrtcUnknown24(void) { + NotImplemented_nid_no_patch("P+3Zbh6lqCo"); + return 0; +} + +int APS5_VABI _ZN3rtc11RaceCheckerC1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("oPJkGGMqNaw", libwebrtcUnknown25); +int APS5_VABI libwebrtcUnknown25(void) { + NotImplemented_nid_no_patch("oPJkGGMqNaw"); + return 0; +} + +int APS5_VABI _ZN3rtc14PlatformThreadaSEOS0__nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc14PlatformThreadD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc14PlatformThread8FinalizeEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("SGDTMkzQm78", libwebrtcUnknown26); +int APS5_VABI libwebrtcUnknown26(void) { + NotImplemented_nid_no_patch("SGDTMkzQm78"); + return 0; +} + +int APS5_VABI _ZN6webrtc11field_trial25InitFieldTrialsFromStringEPKc_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("pH5oyjlfrL0", libwebrtcUnknown27); +int APS5_VABI libwebrtcUnknown27(void) { + NotImplemented_nid_no_patch("pH5oyjlfrL0"); + return 0; +} + +int APS5_VABI _ZN3rtc10SSLAdapter6CreateEPNS_6SocketE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("QI9yvWEMEbs", libwebrtcUnknown28); +int APS5_VABI libwebrtcUnknown28(void) { + NotImplemented_nid_no_patch("QI9yvWEMEbs"); + return 0; +} + +int APS5_VABI _ZN6webrtc16AsyncDnsResolverC1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc9CritScopeC1EPKNS_24RecursiveCriticalSectionE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc9CritScopeD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc24RecursiveCriticalSectionC1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc24RecursiveCriticalSectionD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc13ThreadManager8InstanceEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc6Thread15ProcessMessagesEi_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc13ThreadManager13CurrentThreadEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc13ThreadManager16SetCurrentThreadEPNS_6ThreadE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("uBpjHIuzumQ", libwebrtcUnknown29); +int APS5_VABI libwebrtcUnknown29(void) { + NotImplemented_nid_no_patch("uBpjHIuzumQ"); + return 0; +} + +APS5_EXPORT("TmP5kmKawgA", libwebrtcUnknown30); +int APS5_VABI libwebrtcUnknown30(void) { + NotImplemented_nid_no_patch("TmP5kmKawgA"); + return 0; +} + +APS5_EXPORT("ogpyBO3hYSY", libwebrtcUnknown31); +int APS5_VABI libwebrtcUnknown31(void) { + NotImplemented_nid_no_patch("ogpyBO3hYSY"); + return 0; +} + +int APS5_VABI _ZN3rtc6Thread6DoInitEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc6ThreadD2Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc6Thread9DoDestroyEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc6Thread12socketserverEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc6Thread4QuitEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc6Thread10IsQuittingEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc6Thread7RestartEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc6Thread12PostTaskImplEN4absl12AnyInvocableIFvvOEEERKN6webrtc13TaskQueueBase14PostTaskTraitsERKNS5_8LocationE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc6Thread19PostDelayedTaskImplEN4absl12AnyInvocableIFvvOEEEN6webrtc9TimeDeltaERKNS5_13TaskQueueBase21PostDelayedTaskTraitsERKNS5_8LocationE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc6Thread8GetDelayEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3rtc6Thread9IsCurrentEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("Y18cti5zQig", libwebrtcUnknown32); +int APS5_VABI libwebrtcUnknown32(void) { + NotImplemented_nid_no_patch("Y18cti5zQig"); + return 0; +} + +int APS5_VABI _ZN3rtc16NullSocketServerC1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc6Thread5StartEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("IBOheohLw3g", libwebrtcUnknown33); +int APS5_VABI libwebrtcUnknown33(void) { + NotImplemented_nid_no_patch("IBOheohLw3g"); + return 0; +} + +int APS5_VABI _ZN3rtc6Thread3RunEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc6Thread4StopEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc6Thread16BlockingCallImplENS_12FunctionViewIFvvEEERKN6webrtc8LocationE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc6Thread6DeleteEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc6Thread30IsProcessingMessagesForTestingEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc6ThreadC1EPNS_12SocketServerE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3rtc24RecursiveCriticalSection5EnterEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3rtc24RecursiveCriticalSection5LeaveEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK6webrtc4rtcp10RtcpPacket5BuildEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc4rtcp3App5ParseERKNS0_12CommonHeaderE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc4rtcp3AppC1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc4rtcp3AppD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("PEV9t77ljzc", libwebrtcUnknown34); +int APS5_VABI libwebrtcUnknown34(void) { + NotImplemented_nid_no_patch("PEV9t77ljzc"); + return 0; +} + +int APS5_VABI _ZN6webrtc4rtcp14CompoundPacketC1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc4rtcp14CompoundPacketD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc4rtcp4Nack5ParseERKNS0_12CommonHeaderE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc4rtcp4NackC1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc4rtcp4NackD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc4rtcp3Pli5ParseERKNS0_12CommonHeaderE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc4rtcp3PliC1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc4rtcp3PliD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc4rtcp14ReceiverReportC1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc4rtcp4Remb5ParseERKNS0_12CommonHeaderE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc4rtcp4RembC1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc4rtcp4RembD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK6webrtc4rtcp17TransportFeedback15GetBaseSequenceEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc4rtcp17TransportFeedback5ParseERKNS0_12CommonHeaderE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc4rtcp17TransportFeedbackC1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc4rtcp17TransportFeedbackD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc9RtpPacket5ParseEPKhm_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc12AudioDecoder6DecodeEPKhmimPsPNS0_10SpeechTypeE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc12AudioDecoder15DecodeRedundantEPKhmimPsPNS0_10SpeechTypeE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK6webrtc12AudioDecoder12HasDecodePlcEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc12AudioDecoder9DecodePlcEmPs_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc12AudioDecoder11GeneratePlcEmPN3rtc7BufferTIsLb0EEE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc12AudioDecoder9ErrorCodeEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc12AudioDecoder11ParseResultC1EOS1__nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("vzyzE1cN1b8", libwebrtcUnknown35); +int APS5_VABI libwebrtcUnknown35(void) { + NotImplemented_nid_no_patch("vzyzE1cN1b8"); + return 0; +} + +int APS5_VABI _ZN6webrtc12AudioDecoder11ParseResultD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc12AudioEncoder11EncodedInfoaSERKS1__nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc12AudioEncoder6EncodeEjN3rtc9ArrayViewIKsLln4711EEEPNS1_7BufferTIhLb0EEE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK6webrtc12AudioEncoder6GetDtxEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc12AudioEncoder16SetTargetBitrateEi_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("qli1Cjz9UIo", libwebrtcUnknown36); +int APS5_VABI libwebrtcUnknown36(void) { + NotImplemented_nid_no_patch("qli1Cjz9UIo"); + return 0; +} + +APS5_EXPORT("Vf6lJz4-bEU", libwebrtcUnknown37); +int APS5_VABI libwebrtcUnknown37(void) { + NotImplemented_nid_no_patch("Vf6lJz4-bEU"); + return 0; +} + +int APS5_VABI _ZN6webrtc12AudioEncoder26DisableAudioNetworkAdaptorEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc12AudioEncoder45OnReceivedUplinkRecoverablePacketLossFractionEf_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc12AudioEncoder28OnReceivedTargetAudioBitrateEi_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc12AudioEncoder26OnReceivedUplinkAllocationENS_23BitrateAllocationUpdateE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc12AudioEncoder13OnReceivedRttEi_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc12AudioEncoder18OnReceivedOverheadEm_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc12AudioEncoder27SetReceiverFrameLengthRangeEii_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK6webrtc12AudioEncoder11GetANAStatsEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc8ANAStatsC1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc12AudioEncoder11EncodedInfoC1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc12AudioEncoder11EncodedInfoC1ERKS1__nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc12AudioEncoder11EncodedInfoD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc14SdpAudioFormataSERKS0__nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc14SdpAudioFormatC1ERKS0__nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc14SdpAudioFormatC1EOS0__nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("qGXgWFIHHgk", libwebrtcUnknown38); +int APS5_VABI libwebrtcUnknown38(void) { + NotImplemented_nid_no_patch("qGXgWFIHHgk"); + return 0; +} + +APS5_EXPORT("VfqMb0eRCr0", libwebrtcUnknown39); +int APS5_VABI libwebrtcUnknown39(void) { + NotImplemented_nid_no_patch("VfqMb0eRCr0"); + return 0; +} + +APS5_EXPORT("OnkJ4kSZYkk", libwebrtcUnknown40); +int APS5_VABI libwebrtcUnknown40(void) { + NotImplemented_nid_no_patch("OnkJ4kSZYkk"); + return 0; +} + +int APS5_VABI _ZN6webrtc14SdpAudioFormatD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc14AudioCodecInfoC1Eimiii_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN7cricket16CreateVideoCodecERKN6webrtc14SdpVideoFormatE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc13PacketOptionsC1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc13PacketOptionsC1ERKS0__nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc13PacketOptionsD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc27AudioReceiveStreamInterface5StatsD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc27AudioReceiveStreamInterface6ConfigC1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc27AudioReceiveStreamInterface6ConfigD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc10AudioState6ConfigC1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc10AudioState6ConfigD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc15AudioSendStream5StatsD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc15AudioSendStream6ConfigC1EPNS_9TransportE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc15AudioSendStream6ConfigD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc15AudioSendStream6Config13SendCodecSpecC1EiRKNS_14SdpAudioFormatE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc15AudioSendStream6Config13SendCodecSpecD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc10AudioFrame11UpdateFrameEjPKsmiNS0_10SpeechTypeENS0_11VADActivityEm_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc10AudioFrame8CopyFromERKS0__nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK6webrtc10AudioFrame5mutedEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK6webrtc10AudioFrame9data_viewEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK6webrtc10AudioFrame4dataEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc10AudioFrame12mutable_dataEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc10AudioFrame4MuteEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc10AudioFrameC1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc20EchoCanceller3ConfigaSERKS0__nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc20EchoCanceller3ConfigC1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc20EchoCanceller3ConfigC1ERKS0__nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("3hzqH2yWvjU", libwebrtcUnknown41); +int APS5_VABI libwebrtcUnknown41(void) { + NotImplemented_nid_no_patch("3hzqH2yWvjU"); + return 0; +} + +int APS5_VABI _ZN6webrtc11FileWrapper5FlushEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc11FileWrapper5WriteEPKvm_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc11FileWrapperC1EOS0__nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc17AudioDeviceModule6CreateENS0_10AudioLayerEPNS_16TaskQueueFactoryE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc17AudioDeviceBufferC1EPNS_16TaskQueueFactoryEb_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc17AudioDeviceBuffer20SetRecordingChannelsEm_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc17AudioDeviceBuffer18SetPlayoutChannelsEm_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc17AudioDeviceBuffer12StartPlayoutEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc17AudioDeviceBuffer11StopPlayoutEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc17AudioDeviceBuffer14StartRecordingEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc17AudioDeviceBuffer13StopRecordingEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc17AudioDeviceBuffer21RegisterAudioCallbackEPNS_14AudioTransportE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc17AudioDeviceBuffer20SetPlayoutSampleRateEj_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc17AudioDeviceBuffer22SetRecordingSampleRateEj_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI WebRtcVad_Create_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI WebRtcVad_Free_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI WebRtcVad_Init_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI WebRtcVad_set_mode_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI WebRtcVad_Process_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK6webrtc18AudioDeviceGeneric21BuiltInAECIsAvailableEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK6webrtc18AudioDeviceGeneric21BuiltInAGCIsAvailableEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK6webrtc18AudioDeviceGeneric20BuiltInNSIsAvailableEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc18AudioDeviceGeneric16EnableBuiltInAECEb_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc18AudioDeviceGeneric16EnableBuiltInAGCEb_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc18AudioDeviceGeneric15EnableBuiltInNSEb_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK6webrtc18AudioDeviceGeneric23GetPlayoutUnderrunCountEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc17PushSincResamplerC1Emm_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc17PushSincResampler8ResampleEPKfmPfm_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc13PushResamplerIsEC1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc13PushResamplerIsEC1Emmm_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc13PushResamplerIsED1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc13PushResamplerIsE8ResampleENS_15InterleavedViewIKsEENS2_IsEE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc13PushResamplerIsE8ResampleEN3rtc9ArrayViewIKsLln4711EEENS3_IsLln4711EEE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc17PushSincResamplerD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc19SmoothingFilterImplC1Ei_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc19SmoothingFilterImplD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc9WavReader5ResetEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc9WavReader11ReadSamplesEmPs_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc9WavReader5CloseEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("QbtLnp-i47c", libwebrtcUnknown42); +int APS5_VABI libwebrtcUnknown42(void) { + NotImplemented_nid_no_patch("QbtLnp-i47c"); + return 0; +} + +int APS5_VABI _ZN6webrtc11AudioBufferC1Emmmmmm_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc11AudioBuffer8CopyFromEPKsRKNS_12StreamConfigE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc11AudioBuffer6CopyToERKNS_12StreamConfigEPs_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc23GetAvailableCpuFeaturesEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc7rnn_vad17FeaturesExtractorC1ERKNS_20AvailableCpuFeaturesE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc7rnn_vad6RnnVadC1ERKNS_20AvailableCpuFeaturesE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc7rnn_vad6RnnVadD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc7rnn_vad17FeaturesExtractorD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("lQyI5UWffS8", libwebrtcUnknown43); +int APS5_VABI libwebrtcUnknown43(void) { + NotImplemented_nid_no_patch("lQyI5UWffS8"); + return 0; +} + +int APS5_VABI _ZN6webrtc7rnn_vad6RnnVad21ComputeVadProbabilityEN3rtc9ArrayViewIKfLl42EEEb_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc20AudioFrameOperations4MuteEPNS_10AudioFrameE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("GMnT0UEJDZY", libwebrtcUnknown44); +int APS5_VABI libwebrtcUnknown44(void) { + NotImplemented_nid_no_patch("GMnT0UEJDZY"); + return 0; +} + +APS5_EXPORT("sGIEeW5HLOg", libwebrtcUnknown45); +int APS5_VABI libwebrtcUnknown45(void) { + NotImplemented_nid_no_patch("sGIEeW5HLOg"); + return 0; +} + +int APS5_VABI _ZN3rtc11RateTrackerC1Elm_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("OGFO5SAL9Sg", libwebrtcUnknown46); +int APS5_VABI libwebrtcUnknown46(void) { + NotImplemented_nid_no_patch("OGFO5SAL9Sg"); + return 0; +} + +int APS5_VABI _ZN3rtc11RateTrackerD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc11RateTracker10AddSamplesEl_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3rtc11RateTracker22ComputeRateForIntervalEl_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("0FWPqLUBGmw", libwebrtcUnknown47); +int APS5_VABI libwebrtcUnknown47(void) { + NotImplemented_nid_no_patch("0FWPqLUBGmw"); + return 0; +} + +int APS5_VABI _ZNK3rtc14NetworkManager16GetMdnsResponderEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZThn8_NK3rtc14NetworkManager16GetMdnsResponderEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("01K7H6PnH5g", libwebrtcUnknown48); +int APS5_VABI libwebrtcUnknown48(void) { + NotImplemented_nid_no_patch("01K7H6PnH5g"); + return 0; +} + +int APS5_VABI _ZNK3rtc18NetworkManagerBase22enumeration_permissionEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("CwWvzQchcdk", libwebrtcUnknown49); +int APS5_VABI libwebrtcUnknown49(void) { + NotImplemented_nid_no_patch("CwWvzQchcdk"); + return 0; +} + +APS5_EXPORT("GUP93yoyxE0", libwebrtcUnknown50); +int APS5_VABI libwebrtcUnknown50(void) { + NotImplemented_nid_no_patch("GUP93yoyxE0"); + return 0; +} + +APS5_EXPORT("57abazv-Yts", libwebrtcUnknown51); +int APS5_VABI libwebrtcUnknown51(void) { + NotImplemented_nid_no_patch("57abazv-Yts"); + return 0; +} + +int APS5_VABI _ZN3rtc18NetworkManagerBase27set_default_local_addressesERKNS_9IPAddressES3__nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3rtc18NetworkManagerBase22GetDefaultLocalAddressEiPNS_9IPAddressE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3rtc18NetworkManagerBase21GetNetworkFromAddressERKNS_9IPAddressE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("QPwI2zGqqxI", libwebrtcUnknown52); +int APS5_VABI libwebrtcUnknown52(void) { + NotImplemented_nid_no_patch("QPwI2zGqqxI"); + return 0; +} + +int APS5_VABI _ZN3rtc7NetworkD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN7cricket18AsyncStunTCPSocketC1EPN3rtc6SocketE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3rtc14AsyncTCPSocketC1EPNS_6SocketE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("X8ypYWKrUXE", libwebrtcUnknown53); +int APS5_VABI libwebrtcUnknown53(void) { + NotImplemented_nid_no_patch("X8ypYWKrUXE"); + return 0; +} + +int APS5_VABI _ZN3rtc14AsyncSSLSocketC1EPNS_6SocketE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("EoYFZeImOJo", libwebrtcUnknown54); +int APS5_VABI libwebrtcUnknown54(void) { + NotImplemented_nid_no_patch("EoYFZeImOJo"); + return 0; +} + +int APS5_VABI _ZN6webrtc22AudioReceiveStreamImpl22SetMinimumPlayoutDelayEi_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc10AudioState6CreateERKNS0_6ConfigE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc3voe16RemixAndResampleENS_15InterleavedViewIKsEEiPNS_13PushResamplerIsEEPNS_10AudioFrameE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc21EchoCanceller3FactoryC1ERKNS_20EchoCanceller3ConfigE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc25AudioEncoderRuntimeConfigD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc14AudioMixerImpl6CreateEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc13FrameCombinerC1Eb_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc13FrameCombinerD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc13FrameCombiner7CombineEN3rtc9ArrayViewIKPNS_10AudioFrameELln4711EEEmimS4__nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc29BuiltinAudioProcessingBuilder5BuildERKNS_11EnvironmentE_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc32CreateBuiltinAudioDecoderFactoryEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("7OP9jmeBYaM", libwebrtcUnknown55); +int APS5_VABI libwebrtcUnknown55(void) { + NotImplemented_nid_no_patch("7OP9jmeBYaM"); + return 0; +} + +APS5_EXPORT("ratmuLethas", libwebrtcUnknown56); +int APS5_VABI libwebrtcUnknown56(void) { + NotImplemented_nid_no_patch("ratmuLethas"); + return 0; +} + +int APS5_VABI _ZN6webrtc20AudioDecoderOpusImplC1ERKNS_15FieldTrialsViewEmi_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc20AudioDecoderOpusImplD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc23AudioNetworkAdaptorImpl6ConfigC1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("Jq-CaqgT024", libwebrtcUnknown57); +int APS5_VABI libwebrtcUnknown57(void) { + NotImplemented_nid_no_patch("Jq-CaqgT024"); + return 0; +} + +APS5_EXPORT("HLZgnt-VWOg", libwebrtcUnknown58); +int APS5_VABI libwebrtcUnknown58(void) { + NotImplemented_nid_no_patch("HLZgnt-VWOg"); + return 0; +} + +int APS5_VABI _ZN6webrtc23AudioNetworkAdaptorImpl6ConfigD1Ev_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN6webrtc32CreateBuiltinAudioEncoderFactoryEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("e9ZbbX3j1iM", libwebrtcUnknown59); +int APS5_VABI libwebrtcUnknown59(void) { + NotImplemented_nid_no_patch("e9ZbbX3j1iM"); + return 0; +} + +int APS5_VABI _ZN6webrtc14RTCStatsReport13ConstIteratorppEi_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK6webrtc14RTCStatsReport13ConstIteratorptEv_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +} diff --git a/core/libs/prx/libwebrtc/include/Api.hpp b/core/libs/prx/libwebrtc/include/Api.hpp new file mode 100644 index 0000000000..60334c5ff9 --- /dev/null +++ b/core/libs/prx/libwebrtc/include/Api.hpp @@ -0,0 +1,423 @@ +#pragma once + +#include "SceTypes.hpp" +#include "prx/libwebrtc/include/ExpFilter.hpp" +#include "prx/libwebrtc/include/RtcpCommonHeader.hpp" +#include "prx/libwebrtc/include/Opus.hpp" + +extern "C" { + +int APS5_VABI libwebrtcUnknown00(void); +int APS5_VABI libwebrtcUnknown01(void); +int APS5_VABI _ZN6webrtc11EnableMediaERNS_33PeerConnectionFactoryDependenciesE_nid_postfix(void); +int APS5_VABI libwebrtcUnknown02(void); +int APS5_VABI _ZN6webrtc10CallConfigD1Ev_nid_postfix(void); +int APS5_VABI libwebrtcUnknown03(void); +char* APS5_VABI _ZN4absl16numbers_internal15FastIntToBufferEiPc_nid_postfix(int value, char* buffer); +int APS5_VABI _ZN3rtc18webrtc_checks_impl8FatalLogEPKciS2_PKNS0_12CheckArgTypeEz_nid_postfix(void); +int APS5_VABI _ZN6webrtc18callback_list_impl21CallbackListReceiversC1Ev_nid_postfix(void); +int APS5_VABI _ZN3rtc19webrtc_logging_impl3LogEPKNS0_10LogArgTypeEz_nid_postfix(void); +int APS5_VABI _ZN3rtc10LogMessage6IsNoopENS_15LoggingSeverityE_nid_postfix(void); +int APS5_VABI _ZN3rtc13SocketAddressC1Ev_nid_postfix(void); +int APS5_VABI _ZN3rtc13SocketAddressaSERKS0__nid_postfix(void); +int APS5_VABI _ZNK3rtc13SocketAddress6ipaddrEv_nid_postfix(void); +int APS5_VABI _ZN3rtc13SocketAddressC1ERKNS_9IPAddressEi_nid_postfix(void); +int APS5_VABI _ZNK3rtc13SocketAddress4portEv_nid_postfix(void); +int APS5_VABI _ZNK3rtc9IPAddress12ipv4_addressEv_nid_postfix(void); +int APS5_VABI _ZNK3rtc9IPAddress12ipv6_addressEv_nid_postfix(void); +int APS5_VABI _ZN6webrtc8RmsLevel7AnalyzeEN3rtc9ArrayViewIKsLln4711EEE_nid_postfix(void); +int APS5_VABI _ZN6webrtc8RmsLevel7AverageEv_nid_postfix(void); +int APS5_VABI _ZN6webrtc8RmsLevelC1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc8RmsLevelD1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc34CreateModularPeerConnectionFactoryENS_33PeerConnectionFactoryDependenciesE_nid_postfix(void); +int APS5_VABI _ZN6webrtc33PeerConnectionFactoryDependenciesC1EOS0__nid_postfix(void); +int APS5_VABI _ZN6webrtc33PeerConnectionFactoryDependenciesD1Ev_nid_postfix(void); +int APS5_VABI _ZNK6webrtc18EnvironmentFactory6CreateEv_nid_postfix(void); +int APS5_VABI _ZN6webrtc12RtpExtensionD1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc11FileWrapper5CloseEv_nid_postfix(void); +int APS5_VABI _ZN6webrtc26PeerConnectionDependenciesC1EOS0__nid_postfix(void); +int APS5_VABI _ZN6webrtc26PeerConnectionDependenciesD1Ev_nid_postfix(void); +int APS5_VABI _ZN7cricket18BasicPortAllocatorC1EPN3rtc14NetworkManagerEPNS1_19PacketSocketFactoryEPN6webrtc14TurnCustomizerEPNS_25RelayPortFactoryInterfaceEPKNS6_15FieldTrialsViewE_nid_postfix(void); +int APS5_VABI _ZN6webrtc10CallConfigC1ERKNS_11EnvironmentEPNS_13TaskQueueBaseE_nid_postfix(void); +int APS5_VABI _ZN6webrtc23PeerConnectionInterface16RTCConfigurationC1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc23PeerConnectionInterface16RTCConfigurationD1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc13CryptoOptionsC1ERKS0__nid_postfix(void); +int APS5_VABI _ZN6webrtc23PeerConnectionInterface9IceServerC1ERKS1__nid_postfix(void); +int APS5_VABI _ZN6webrtc23PeerConnectionInterface9IceServerD1Ev_nid_postfix(void); +int APS5_VABI _ZN3rtc14RTCCertificateD1Ev_nid_postfix(void); +int APS5_VABI _ZNK6webrtc20AudioSourceInterface7optionsEv_nid_postfix(void); +int APS5_VABI _ZNK3rtc9IPAddresseqERKS0__nid_postfix(void); +int APS5_VABI _ZNK6webrtc8RTCError7messageEv_nid_postfix(void); +int APS5_VABI _ZN6webrtc21PendingTaskSafetyFlag6CreateEv_nid_postfix(void); +int APS5_VABI _ZN7cricket5CodecD1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc21PendingTaskSafetyFlag11SetNotAliveEv_nid_postfix(void); +int APS5_VABI _ZN6webrtc18RtpTransceiverInitC1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc18RtpTransceiverInitD1Ev_nid_postfix(void); +int APS5_VABI libwebrtcUnknown04(void); +int APS5_VABI _ZNK6webrtc21PendingTaskSafetyFlag5aliveEv_nid_postfix(void); +int APS5_VABI libwebrtcUnknown05(void); +int APS5_VABI _ZN3rtc17CopyOnWriteBufferC1ERKS0__nid_postfix(void); +int APS5_VABI _ZN3rtc17CopyOnWriteBufferD1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc17RtpPacketReceivedC1ERKS0__nid_postfix(void); +int APS5_VABI _ZN6webrtc17RtpPacketReceivedD1Ev_nid_postfix(void); +int APS5_VABI _ZN3rtc17CopyOnWriteBuffer24UnshareAndEnsureCapacityEm_nid_postfix(void); +int APS5_VABI _ZN3rtc17CopyOnWriteBufferC1Emm_nid_postfix(void); +int APS5_VABI _ZN6webrtc13TaskQueueBase7CurrentEv_nid_postfix(void); +int APS5_VABI _ZN3rtc10PacketInfoD1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc21RtpHeaderExtensionMapC1EN3rtc9ArrayViewIKNS_12RtpExtensionELln4711EEE_nid_postfix(void); +int APS5_VABI _ZN6webrtc17RtpPacketReceivedC1EPKNS_21RtpHeaderExtensionMapENS_9TimestampE_nid_postfix(void); +int APS5_VABI _ZN3rtc6Thread7CurrentEv_nid_postfix(void); +int APS5_VABI _ZN3rtc10TimeMillisEv_nid_postfix(void); +int APS5_VABI libwebrtcUnknown06(void); +int APS5_VABI _ZNK6webrtc14RTCStatsReport5beginEv_nid_postfix(void); +int APS5_VABI _ZNK6webrtc14RTCStatsReport3endEv_nid_postfix(void); +int APS5_VABI _ZNK6webrtc14RTCStatsReport13ConstIteratorneERKS1__nid_postfix(void); +int APS5_VABI _ZN6webrtc14RTCStatsReport13ConstIteratorppEv_nid_postfix(void); +int APS5_VABI _ZNK6webrtc14RTCStatsReport13ConstIteratordeEv_nid_postfix(void); +int APS5_VABI _ZN6webrtc14RTCStatsReport13ConstIteratorD1Ev_nid_postfix(void); +int APS5_VABI _ZN3rtc10TimeMicrosEv_nid_postfix(void); +int APS5_VABI libwebrtcUnknown07(void); +int APS5_VABI _ZN3rtc13SocketAddressC1ERKS0__nid_postfix(void); +int APS5_VABI libwebrtcUnknown08(void); +int APS5_VABI _ZNK3rtc13SocketAddress5IsNilEv_nid_postfix(void); +int APS5_VABI libwebrtcUnknown09(void); +int APS5_VABI libwebrtcUnknown10(void); +int APS5_VABI libwebrtcUnknown11(void); +int APS5_VABI _ZN3rtc9KeyParamsC1ENS_7KeyTypeE_nid_postfix(void); +int APS5_VABI _ZN6webrtc23PeerConnectionInterface9IceServerC1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc26PeerConnectionDependenciesC1EPNS_22PeerConnectionObserverE_nid_postfix(void); +int APS5_VABI _ZN6webrtc33PeerConnectionFactoryDependenciesC1Ev_nid_postfix(void); +int APS5_VABI libwebrtcUnknown12(void); +int APS5_VABI libwebrtcUnknown13(void); +int APS5_VABI _ZN6webrtc32webrtc_sequence_checker_internal19SequenceCheckerImplC2Eb_nid_postfix(void); +int APS5_VABI _ZN3rtc15CurrentThreadIdEv_nid_postfix(void); +int APS5_VABI _ZN6webrtc13TaskQueueBase22CurrentTaskQueueSetterC1EPS0__nid_postfix(void); +int APS5_VABI _ZN6webrtc13TaskQueueBase22CurrentTaskQueueSetterD1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc18EncodedImageBuffer6CreateEPKhm_nid_postfix(void); +int APS5_VABI _ZN6webrtc10ColorSpaceC1ERKS0__nid_postfix(void); +int APS5_VABI _ZN6webrtc10ColorSpaceaSERKS0__nid_postfix(void); +int APS5_VABI _ZN6webrtc12EncodedImageC1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc12EncodedImageD1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc10I420Buffer6CreateEiiiii_nid_postfix(void); +int APS5_VABI _ZN6webrtc10I420Buffer12MutableDataYEv_nid_postfix(void); +int APS5_VABI _ZN6webrtc10I420Buffer12MutableDataUEv_nid_postfix(void); +int APS5_VABI _ZN6webrtc10I420Buffer12MutableDataVEv_nid_postfix(void); +int APS5_VABI _ZN6webrtc19I420BufferInterface6ToI420Ev_nid_postfix(void); +int APS5_VABI _ZNK6webrtc19I420BufferInterface7GetI420Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc16VideoFrameBuffer12CropAndScaleEiiiiii_nid_postfix(void); +int APS5_VABI _ZN6webrtc16VideoFrameBuffer20GetMappedFrameBufferEN3rtc9ArrayViewINS0_4TypeELln4711EEE_nid_postfix(void); +int APS5_VABI libwebrtcUnknown14(void); +int APS5_VABI _ZNK6webrtc19I420BufferInterface11ChromaWidthEv_nid_postfix(void); +int APS5_VABI _ZNK6webrtc19I420BufferInterface12ChromaHeightEv_nid_postfix(void); +int APS5_VABI _ZNK6webrtc16VideoFrameBuffer7GetI420Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc10VideoFrame7Builder5buildEv_nid_postfix(void); +int APS5_VABI _ZN6webrtc10VideoFrame7Builder22set_video_frame_bufferERKNS_13scoped_refptrINS_16VideoFrameBufferEEE_nid_postfix(void); +int APS5_VABI _ZN6webrtc10VideoFrame7Builder16set_timestamp_msEl_nid_postfix(void); +int APS5_VABI _ZN6webrtc10VideoFrame7Builder17set_timestamp_rtpEj_nid_postfix(void); +int APS5_VABI _ZN6webrtc10VideoFrame7Builder15set_ntp_time_msEl_nid_postfix(void); +int APS5_VABI _ZN6webrtc10VideoFrame7Builder6set_idEt_nid_postfix(void); +int APS5_VABI _ZNK6webrtc10VideoFrame5widthEv_nid_postfix(void); +int APS5_VABI _ZNK6webrtc10VideoFrame6heightEv_nid_postfix(void); +int APS5_VABI _ZNK6webrtc10VideoFrame18video_frame_bufferEv_nid_postfix(void); +int APS5_VABI _ZNK6webrtc10VideoFrame14render_time_msEv_nid_postfix(void); +int APS5_VABI _ZN6webrtc10VideoFrame7BuilderC1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc10VideoFrame7BuilderD1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc10VideoFrameC1ERKNS_13scoped_refptrINS_16VideoFrameBufferEEEjlNS_13VideoRotationE_nid_postfix(void); +int APS5_VABI _ZN6webrtc10VideoFrameD1Ev_nid_postfix(void); +int APS5_VABI _ZN3rtc14VideoSinkWantsC1Ev_nid_postfix(void); +int APS5_VABI _ZN3rtc14VideoSinkWantsC1ERKS0__nid_postfix(void); +int APS5_VABI _ZN3rtc14VideoSinkWantsD1Ev_nid_postfix(void); +int APS5_VABI _ZN3rtc10LogMessage6streamEv_nid_postfix(void); +int APS5_VABI _ZN3rtc10LogMessage17GetMinLogSeverityEv_nid_postfix(void); +int APS5_VABI _ZN3rtc10LogMessage13GetLogToDebugEv_nid_postfix(void); +int APS5_VABI _ZN3rtc10LogMessage10LogThreadsEb_nid_postfix(void); +int APS5_VABI _ZN3rtc10LogMessage13LogTimestampsEb_nid_postfix(void); +int APS5_VABI _ZN3rtc10LogMessage10LogToDebugENS_15LoggingSeverityE_nid_postfix(void); +int APS5_VABI _ZN3rtc10LogMessage14SetLogToStderrEb_nid_postfix(void); +int APS5_VABI _ZN3rtc10LogMessage14AddLogToStreamEPNS_7LogSinkENS_15LoggingSeverityE_nid_postfix(void); +int APS5_VABI _ZN3rtc10LogMessage17RemoveLogToStreamEPNS_7LogSinkE_nid_postfix(void); +int APS5_VABI _ZN3rtc7LogSink12OnLogMessageERKNS_10LogLineRefE_nid_postfix(void); +int APS5_VABI libwebrtcUnknown15(void); +int APS5_VABI libwebrtcUnknown16(void); +int APS5_VABI libwebrtcUnknown17(void); +int APS5_VABI libwebrtcUnknown18(void); +int APS5_VABI _ZN3rtc10LogMessageC1EPKciNS_15LoggingSeverityE_nid_postfix(void); +int APS5_VABI _ZN3rtc10LogMessageD1Ev_nid_postfix(void); +int APS5_VABI _ZNK3rtc13SocketAddress10IsCompleteEv_nid_postfix(void); +int APS5_VABI _ZNK3rtc9IPAddress27v4AddressAsHostOrderIntegerEv_nid_postfix(void); +int APS5_VABI libwebrtcUnknown19(void); +int APS5_VABI _ZNK3rtc13SocketAddress7IsAnyIPEv_nid_postfix(void); +int APS5_VABI _ZN3rtc10TruncateIPERKNS_9IPAddressEi_nid_postfix(void); +int APS5_VABI _ZN3rtc15CountIPMaskBitsERKNS_9IPAddressE_nid_postfix(void); +int APS5_VABI _ZN3rtc17AsyncPacketSocketD2Ev_nid_postfix(void); +int APS5_VABI _ZN3rtc17AsyncPacketSocket20NotifyPacketReceivedERKNS_14ReceivedPacketE_nid_postfix(void); +int APS5_VABI libwebrtcUnknown20(void); +int APS5_VABI libwebrtcUnknown21(void); +int APS5_VABI _ZN3rtc10SentPacketC1Ell_nid_postfix(void); +int APS5_VABI _ZN3rtc10SentPacketC1EllRKNS_10PacketInfoE_nid_postfix(void); +int APS5_VABI _ZNK3rtc14RTCCertificate10HasExpiredEm_nid_postfix(void); +int APS5_VABI _ZN3rtc17CopyOnWriteBufferC1Em_nid_postfix(void); +int APS5_VABI _ZN6webrtc17CodecSpecificInfoD1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc17CodecSpecificInfoC1Ev_nid_postfix(void); +int APS5_VABI libwebrtcUnknown22(void); +int APS5_VABI _ZNK6webrtc14SdpVideoFormat13IsCodecInListEN3rtc9ArrayViewIKS0_Lln4711EEE_nid_postfix(void); +int APS5_VABI libwebrtcUnknown23(void); +int APS5_VABI _ZN6webrtc14SdpVideoFormatC1ERKS0__nid_postfix(void); +int APS5_VABI _ZN6webrtc14SdpVideoFormatC1EOS0__nid_postfix(void); +int APS5_VABI _ZN6webrtc14SdpVideoFormatD1Ev_nid_postfix(void); +int APS5_VABI _ZNK6webrtc12VideoDecoder14GetDecoderInfoEv_nid_postfix(void); +int APS5_VABI _ZNK6webrtc19VideoDecoderFactory17QueryCodecSupportERKNS_14SdpVideoFormatEb_nid_postfix(void); +int APS5_VABI _ZN6webrtc12VideoEncoder24SetFecControllerOverrideEPNS_21FecControllerOverrideE_nid_postfix(void); +int APS5_VABI _ZN6webrtc12VideoEncoder10InitEncodeEPKNS_10VideoCodecEim_nid_postfix(void); +int APS5_VABI _ZN6webrtc12VideoEncoder11EncoderInfoC1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc12VideoEncoder11EncoderInfoD1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc12VideoEncoder21RateControlParametersD1Ev_nid_postfix(void); +int APS5_VABI libwebrtcUnknown24(void); +int APS5_VABI _ZN3rtc11RaceCheckerC1Ev_nid_postfix(void); +int APS5_VABI libwebrtcUnknown25(void); +int APS5_VABI _ZN3rtc14PlatformThreadaSEOS0__nid_postfix(void); +int APS5_VABI _ZN3rtc14PlatformThreadD1Ev_nid_postfix(void); +int APS5_VABI _ZN3rtc14PlatformThread8FinalizeEv_nid_postfix(void); +int APS5_VABI libwebrtcUnknown26(void); +int APS5_VABI _ZN6webrtc11field_trial25InitFieldTrialsFromStringEPKc_nid_postfix(void); +int APS5_VABI libwebrtcUnknown27(void); +int APS5_VABI _ZN3rtc10SSLAdapter6CreateEPNS_6SocketE_nid_postfix(void); +int APS5_VABI libwebrtcUnknown28(void); +int APS5_VABI _ZN6webrtc16AsyncDnsResolverC1Ev_nid_postfix(void); +int APS5_VABI _ZN3rtc9CritScopeC1EPKNS_24RecursiveCriticalSectionE_nid_postfix(void); +int APS5_VABI _ZN3rtc9CritScopeD1Ev_nid_postfix(void); +int APS5_VABI _ZN3rtc24RecursiveCriticalSectionC1Ev_nid_postfix(void); +int APS5_VABI _ZN3rtc24RecursiveCriticalSectionD1Ev_nid_postfix(void); +int APS5_VABI _ZN3rtc13ThreadManager8InstanceEv_nid_postfix(void); +int APS5_VABI _ZN3rtc6Thread15ProcessMessagesEi_nid_postfix(void); +int APS5_VABI _ZN3rtc13ThreadManager13CurrentThreadEv_nid_postfix(void); +int APS5_VABI _ZN3rtc13ThreadManager16SetCurrentThreadEPNS_6ThreadE_nid_postfix(void); +int APS5_VABI libwebrtcUnknown29(void); +int APS5_VABI libwebrtcUnknown30(void); +int APS5_VABI libwebrtcUnknown31(void); +int APS5_VABI _ZN3rtc6Thread6DoInitEv_nid_postfix(void); +int APS5_VABI _ZN3rtc6ThreadD2Ev_nid_postfix(void); +int APS5_VABI _ZN3rtc6Thread9DoDestroyEv_nid_postfix(void); +int APS5_VABI _ZN3rtc6Thread12socketserverEv_nid_postfix(void); +int APS5_VABI _ZN3rtc6Thread4QuitEv_nid_postfix(void); +int APS5_VABI _ZN3rtc6Thread10IsQuittingEv_nid_postfix(void); +int APS5_VABI _ZN3rtc6Thread7RestartEv_nid_postfix(void); +int APS5_VABI _ZN3rtc6Thread12PostTaskImplEN4absl12AnyInvocableIFvvOEEERKN6webrtc13TaskQueueBase14PostTaskTraitsERKNS5_8LocationE_nid_postfix(void); +int APS5_VABI _ZN3rtc6Thread19PostDelayedTaskImplEN4absl12AnyInvocableIFvvOEEEN6webrtc9TimeDeltaERKNS5_13TaskQueueBase21PostDelayedTaskTraitsERKNS5_8LocationE_nid_postfix(void); +int APS5_VABI _ZN3rtc6Thread8GetDelayEv_nid_postfix(void); +int APS5_VABI _ZNK3rtc6Thread9IsCurrentEv_nid_postfix(void); +int APS5_VABI libwebrtcUnknown32(void); +int APS5_VABI _ZN3rtc16NullSocketServerC1Ev_nid_postfix(void); +int APS5_VABI _ZN3rtc6Thread5StartEv_nid_postfix(void); +int APS5_VABI libwebrtcUnknown33(void); +int APS5_VABI _ZN3rtc6Thread3RunEv_nid_postfix(void); +int APS5_VABI _ZN3rtc6Thread4StopEv_nid_postfix(void); +int APS5_VABI _ZN3rtc6Thread16BlockingCallImplENS_12FunctionViewIFvvEEERKN6webrtc8LocationE_nid_postfix(void); +int APS5_VABI _ZN3rtc6Thread6DeleteEv_nid_postfix(void); +int APS5_VABI _ZN3rtc6Thread30IsProcessingMessagesForTestingEv_nid_postfix(void); +int APS5_VABI _ZN3rtc6ThreadC1EPNS_12SocketServerE_nid_postfix(void); +int APS5_VABI _ZNK3rtc24RecursiveCriticalSection5EnterEv_nid_postfix(void); +int APS5_VABI _ZNK3rtc24RecursiveCriticalSection5LeaveEv_nid_postfix(void); +void APS5_VABI _ZN3rtc9ExpFilter5ResetEf_nid_postfix(WebRtcExpFilter* filter, float alpha); +float APS5_VABI _ZN3rtc9ExpFilter5ApplyEff_nid_postfix(WebRtcExpFilter* filter, float exponent, float sample); +int APS5_VABI _ZNK6webrtc4rtcp10RtcpPacket5BuildEv_nid_postfix(void); +int APS5_VABI _ZN6webrtc4rtcp3App5ParseERKNS0_12CommonHeaderE_nid_postfix(void); +int APS5_VABI _ZN6webrtc4rtcp3AppC1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc4rtcp3AppD1Ev_nid_postfix(void); +bool APS5_VABI _ZN6webrtc4rtcp12CommonHeader5ParseEPKhm_nid_postfix(WebRtcRtcpCommonHeader* header, const std::uint8_t* buffer, std::size_t size); +int APS5_VABI libwebrtcUnknown34(void); +int APS5_VABI _ZN6webrtc4rtcp14CompoundPacketC1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc4rtcp14CompoundPacketD1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc4rtcp4Nack5ParseERKNS0_12CommonHeaderE_nid_postfix(void); +int APS5_VABI _ZN6webrtc4rtcp4NackC1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc4rtcp4NackD1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc4rtcp3Pli5ParseERKNS0_12CommonHeaderE_nid_postfix(void); +int APS5_VABI _ZN6webrtc4rtcp3PliC1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc4rtcp3PliD1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc4rtcp14ReceiverReportC1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc4rtcp4Remb5ParseERKNS0_12CommonHeaderE_nid_postfix(void); +int APS5_VABI _ZN6webrtc4rtcp4RembC1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc4rtcp4RembD1Ev_nid_postfix(void); +int APS5_VABI _ZNK6webrtc4rtcp17TransportFeedback15GetBaseSequenceEv_nid_postfix(void); +int APS5_VABI _ZN6webrtc4rtcp17TransportFeedback5ParseERKNS0_12CommonHeaderE_nid_postfix(void); +int APS5_VABI _ZN6webrtc4rtcp17TransportFeedbackC1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc4rtcp17TransportFeedbackD1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc9RtpPacket5ParseEPKhm_nid_postfix(void); +int APS5_VABI _ZN6webrtc12AudioDecoder6DecodeEPKhmimPsPNS0_10SpeechTypeE_nid_postfix(void); +int APS5_VABI _ZN6webrtc12AudioDecoder15DecodeRedundantEPKhmimPsPNS0_10SpeechTypeE_nid_postfix(void); +int APS5_VABI _ZNK6webrtc12AudioDecoder12HasDecodePlcEv_nid_postfix(void); +int APS5_VABI _ZN6webrtc12AudioDecoder9DecodePlcEmPs_nid_postfix(void); +int APS5_VABI _ZN6webrtc12AudioDecoder11GeneratePlcEmPN3rtc7BufferTIsLb0EEE_nid_postfix(void); +int APS5_VABI _ZN6webrtc12AudioDecoder9ErrorCodeEv_nid_postfix(void); +int APS5_VABI _ZN6webrtc12AudioDecoder11ParseResultC1EOS1__nid_postfix(void); +int APS5_VABI libwebrtcUnknown35(void); +int APS5_VABI _ZN6webrtc12AudioDecoder11ParseResultD1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc12AudioEncoder11EncodedInfoaSERKS1__nid_postfix(void); +int APS5_VABI _ZN6webrtc12AudioEncoder6EncodeEjN3rtc9ArrayViewIKsLln4711EEEPNS1_7BufferTIhLb0EEE_nid_postfix(void); +int APS5_VABI _ZNK6webrtc12AudioEncoder6GetDtxEv_nid_postfix(void); +int APS5_VABI _ZN6webrtc12AudioEncoder16SetTargetBitrateEi_nid_postfix(void); +int APS5_VABI libwebrtcUnknown36(void); +int APS5_VABI libwebrtcUnknown37(void); +int APS5_VABI _ZN6webrtc12AudioEncoder26DisableAudioNetworkAdaptorEv_nid_postfix(void); +int APS5_VABI _ZN6webrtc12AudioEncoder45OnReceivedUplinkRecoverablePacketLossFractionEf_nid_postfix(void); +int APS5_VABI _ZN6webrtc12AudioEncoder28OnReceivedTargetAudioBitrateEi_nid_postfix(void); +int APS5_VABI _ZN6webrtc12AudioEncoder26OnReceivedUplinkAllocationENS_23BitrateAllocationUpdateE_nid_postfix(void); +int APS5_VABI _ZN6webrtc12AudioEncoder13OnReceivedRttEi_nid_postfix(void); +int APS5_VABI _ZN6webrtc12AudioEncoder18OnReceivedOverheadEm_nid_postfix(void); +int APS5_VABI _ZN6webrtc12AudioEncoder27SetReceiverFrameLengthRangeEii_nid_postfix(void); +int APS5_VABI _ZNK6webrtc12AudioEncoder11GetANAStatsEv_nid_postfix(void); +int APS5_VABI _ZN6webrtc8ANAStatsC1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc12AudioEncoder11EncodedInfoC1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc12AudioEncoder11EncodedInfoC1ERKS1__nid_postfix(void); +int APS5_VABI _ZN6webrtc12AudioEncoder11EncodedInfoD1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc14SdpAudioFormataSERKS0__nid_postfix(void); +int APS5_VABI _ZN6webrtc14SdpAudioFormatC1ERKS0__nid_postfix(void); +int APS5_VABI _ZN6webrtc14SdpAudioFormatC1EOS0__nid_postfix(void); +int APS5_VABI libwebrtcUnknown38(void); +int APS5_VABI libwebrtcUnknown39(void); +int APS5_VABI libwebrtcUnknown40(void); +int APS5_VABI _ZN6webrtc14SdpAudioFormatD1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc14AudioCodecInfoC1Eimiii_nid_postfix(void); +int APS5_VABI _ZN7cricket16CreateVideoCodecERKN6webrtc14SdpVideoFormatE_nid_postfix(void); +int APS5_VABI _ZN6webrtc13PacketOptionsC1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc13PacketOptionsC1ERKS0__nid_postfix(void); +int APS5_VABI _ZN6webrtc13PacketOptionsD1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc27AudioReceiveStreamInterface5StatsD1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc27AudioReceiveStreamInterface6ConfigC1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc27AudioReceiveStreamInterface6ConfigD1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc10AudioState6ConfigC1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc10AudioState6ConfigD1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc15AudioSendStream5StatsD1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc15AudioSendStream6ConfigC1EPNS_9TransportE_nid_postfix(void); +int APS5_VABI _ZN6webrtc15AudioSendStream6ConfigD1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc15AudioSendStream6Config13SendCodecSpecC1EiRKNS_14SdpAudioFormatE_nid_postfix(void); +int APS5_VABI _ZN6webrtc15AudioSendStream6Config13SendCodecSpecD1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc10AudioFrame11UpdateFrameEjPKsmiNS0_10SpeechTypeENS0_11VADActivityEm_nid_postfix(void); +int APS5_VABI _ZN6webrtc10AudioFrame8CopyFromERKS0__nid_postfix(void); +int APS5_VABI _ZNK6webrtc10AudioFrame5mutedEv_nid_postfix(void); +int APS5_VABI _ZNK6webrtc10AudioFrame9data_viewEv_nid_postfix(void); +int APS5_VABI _ZNK6webrtc10AudioFrame4dataEv_nid_postfix(void); +int APS5_VABI _ZN6webrtc10AudioFrame12mutable_dataEv_nid_postfix(void); +int APS5_VABI _ZN6webrtc10AudioFrame4MuteEv_nid_postfix(void); +int APS5_VABI _ZN6webrtc10AudioFrameC1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc20EchoCanceller3ConfigaSERKS0__nid_postfix(void); +int APS5_VABI _ZN6webrtc20EchoCanceller3ConfigC1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc20EchoCanceller3ConfigC1ERKS0__nid_postfix(void); +int APS5_VABI libwebrtcUnknown41(void); +int APS5_VABI _ZN6webrtc11FileWrapper5FlushEv_nid_postfix(void); +int APS5_VABI _ZN6webrtc11FileWrapper5WriteEPKvm_nid_postfix(void); +int APS5_VABI _ZN6webrtc11FileWrapperC1EOS0__nid_postfix(void); +int APS5_VABI _ZN6webrtc17AudioDeviceModule6CreateENS0_10AudioLayerEPNS_16TaskQueueFactoryE_nid_postfix(void); +int APS5_VABI _ZN6webrtc17AudioDeviceBufferC1EPNS_16TaskQueueFactoryEb_nid_postfix(void); +int APS5_VABI _ZN6webrtc17AudioDeviceBuffer20SetRecordingChannelsEm_nid_postfix(void); +int APS5_VABI _ZN6webrtc17AudioDeviceBuffer18SetPlayoutChannelsEm_nid_postfix(void); +int APS5_VABI _ZN6webrtc17AudioDeviceBuffer12StartPlayoutEv_nid_postfix(void); +int APS5_VABI _ZN6webrtc17AudioDeviceBuffer11StopPlayoutEv_nid_postfix(void); +int APS5_VABI _ZN6webrtc17AudioDeviceBuffer14StartRecordingEv_nid_postfix(void); +int APS5_VABI _ZN6webrtc17AudioDeviceBuffer13StopRecordingEv_nid_postfix(void); +int APS5_VABI _ZN6webrtc17AudioDeviceBuffer21RegisterAudioCallbackEPNS_14AudioTransportE_nid_postfix(void); +int APS5_VABI _ZN6webrtc17AudioDeviceBuffer20SetPlayoutSampleRateEj_nid_postfix(void); +int APS5_VABI _ZN6webrtc17AudioDeviceBuffer22SetRecordingSampleRateEj_nid_postfix(void); +int APS5_VABI WebRtcVad_Create_nid_postfix(void); +int APS5_VABI WebRtcVad_Free_nid_postfix(void); +int APS5_VABI WebRtcVad_Init_nid_postfix(void); +int APS5_VABI WebRtcVad_set_mode_nid_postfix(void); +int APS5_VABI WebRtcVad_Process_nid_postfix(void); +int APS5_VABI _ZNK6webrtc18AudioDeviceGeneric21BuiltInAECIsAvailableEv_nid_postfix(void); +int APS5_VABI _ZNK6webrtc18AudioDeviceGeneric21BuiltInAGCIsAvailableEv_nid_postfix(void); +int APS5_VABI _ZNK6webrtc18AudioDeviceGeneric20BuiltInNSIsAvailableEv_nid_postfix(void); +int APS5_VABI _ZN6webrtc18AudioDeviceGeneric16EnableBuiltInAECEb_nid_postfix(void); +int APS5_VABI _ZN6webrtc18AudioDeviceGeneric16EnableBuiltInAGCEb_nid_postfix(void); +int APS5_VABI _ZN6webrtc18AudioDeviceGeneric15EnableBuiltInNSEb_nid_postfix(void); +int APS5_VABI _ZNK6webrtc18AudioDeviceGeneric23GetPlayoutUnderrunCountEv_nid_postfix(void); +int APS5_VABI _ZN6webrtc17PushSincResamplerC1Emm_nid_postfix(void); +int APS5_VABI _ZN6webrtc17PushSincResampler8ResampleEPKfmPfm_nid_postfix(void); +int APS5_VABI _ZN6webrtc13PushResamplerIsEC1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc13PushResamplerIsEC1Emmm_nid_postfix(void); +int APS5_VABI _ZN6webrtc13PushResamplerIsED1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc13PushResamplerIsE8ResampleENS_15InterleavedViewIKsEENS2_IsEE_nid_postfix(void); +int APS5_VABI _ZN6webrtc13PushResamplerIsE8ResampleEN3rtc9ArrayViewIKsLln4711EEENS3_IsLln4711EEE_nid_postfix(void); +int APS5_VABI _ZN6webrtc17PushSincResamplerD1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc19SmoothingFilterImplC1Ei_nid_postfix(void); +int APS5_VABI _ZN6webrtc19SmoothingFilterImplD1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc9WavReader5ResetEv_nid_postfix(void); +int APS5_VABI _ZN6webrtc9WavReader11ReadSamplesEmPs_nid_postfix(void); +int APS5_VABI _ZN6webrtc9WavReader5CloseEv_nid_postfix(void); +int APS5_VABI libwebrtcUnknown42(void); +int APS5_VABI _ZN6webrtc11AudioBufferC1Emmmmmm_nid_postfix(void); +int APS5_VABI _ZN6webrtc11AudioBuffer8CopyFromEPKsRKNS_12StreamConfigE_nid_postfix(void); +int APS5_VABI _ZN6webrtc11AudioBuffer6CopyToERKNS_12StreamConfigEPs_nid_postfix(void); +int APS5_VABI _ZN6webrtc23GetAvailableCpuFeaturesEv_nid_postfix(void); +int APS5_VABI _ZN6webrtc7rnn_vad17FeaturesExtractorC1ERKNS_20AvailableCpuFeaturesE_nid_postfix(void); +int APS5_VABI _ZN6webrtc7rnn_vad6RnnVadC1ERKNS_20AvailableCpuFeaturesE_nid_postfix(void); +int APS5_VABI _ZN6webrtc7rnn_vad6RnnVadD1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc7rnn_vad17FeaturesExtractorD1Ev_nid_postfix(void); +int APS5_VABI libwebrtcUnknown43(void); +int APS5_VABI _ZN6webrtc7rnn_vad6RnnVad21ComputeVadProbabilityEN3rtc9ArrayViewIKfLl42EEEb_nid_postfix(void); +int APS5_VABI _ZN6webrtc20AudioFrameOperations4MuteEPNS_10AudioFrameE_nid_postfix(void); +int APS5_VABI libwebrtcUnknown44(void); +int APS5_VABI libwebrtcUnknown45(void); +int APS5_VABI _ZN3rtc11RateTrackerC1Elm_nid_postfix(void); +int APS5_VABI libwebrtcUnknown46(void); +int APS5_VABI _ZN3rtc11RateTrackerD1Ev_nid_postfix(void); +int APS5_VABI _ZN3rtc11RateTracker10AddSamplesEl_nid_postfix(void); +int APS5_VABI _ZNK3rtc11RateTracker22ComputeRateForIntervalEl_nid_postfix(void); +int APS5_VABI libwebrtcUnknown47(void); +int APS5_VABI _ZNK3rtc14NetworkManager16GetMdnsResponderEv_nid_postfix(void); +int APS5_VABI _ZThn8_NK3rtc14NetworkManager16GetMdnsResponderEv_nid_postfix(void); +int APS5_VABI libwebrtcUnknown48(void); +int APS5_VABI _ZNK3rtc18NetworkManagerBase22enumeration_permissionEv_nid_postfix(void); +int APS5_VABI libwebrtcUnknown49(void); +int APS5_VABI libwebrtcUnknown50(void); +int APS5_VABI libwebrtcUnknown51(void); +int APS5_VABI _ZN3rtc18NetworkManagerBase27set_default_local_addressesERKNS_9IPAddressES3__nid_postfix(void); +int APS5_VABI _ZNK3rtc18NetworkManagerBase22GetDefaultLocalAddressEiPNS_9IPAddressE_nid_postfix(void); +int APS5_VABI _ZNK3rtc18NetworkManagerBase21GetNetworkFromAddressERKNS_9IPAddressE_nid_postfix(void); +int APS5_VABI libwebrtcUnknown52(void); +int APS5_VABI _ZN3rtc7NetworkD1Ev_nid_postfix(void); +int APS5_VABI _ZN7cricket18AsyncStunTCPSocketC1EPN3rtc6SocketE_nid_postfix(void); +int APS5_VABI _ZN3rtc14AsyncTCPSocketC1EPNS_6SocketE_nid_postfix(void); +int APS5_VABI libwebrtcUnknown53(void); +int APS5_VABI _ZN3rtc14AsyncSSLSocketC1EPNS_6SocketE_nid_postfix(void); +int APS5_VABI libwebrtcUnknown54(void); +int APS5_VABI _ZN6webrtc22AudioReceiveStreamImpl22SetMinimumPlayoutDelayEi_nid_postfix(void); +int APS5_VABI _ZN6webrtc10AudioState6CreateERKNS0_6ConfigE_nid_postfix(void); +int APS5_VABI _ZN6webrtc3voe16RemixAndResampleENS_15InterleavedViewIKsEEiPNS_13PushResamplerIsEEPNS_10AudioFrameE_nid_postfix(void); +int APS5_VABI _ZN6webrtc21EchoCanceller3FactoryC1ERKNS_20EchoCanceller3ConfigE_nid_postfix(void); +int APS5_VABI _ZN6webrtc25AudioEncoderRuntimeConfigD1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc14AudioMixerImpl6CreateEv_nid_postfix(void); +int APS5_VABI _ZN6webrtc13FrameCombinerC1Eb_nid_postfix(void); +int APS5_VABI _ZN6webrtc13FrameCombinerD1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc13FrameCombiner7CombineEN3rtc9ArrayViewIKPNS_10AudioFrameELln4711EEEmimS4__nid_postfix(void); +int APS5_VABI _ZN6webrtc29BuiltinAudioProcessingBuilder5BuildERKNS_11EnvironmentE_nid_postfix(void); +int APS5_VABI _ZN6webrtc32CreateBuiltinAudioDecoderFactoryEv_nid_postfix(void); +int APS5_VABI libwebrtcUnknown55(void); +int APS5_VABI libwebrtcUnknown56(void); +std::int16_t APS5_VABI WebRtcOpus_EncoderFree_nid_postfix(WebRtcOpusEncInst* inst); +std::int16_t APS5_VABI WebRtcOpus_SetBitRate_nid_postfix(WebRtcOpusEncInst* inst, std::int32_t rate); +std::int16_t APS5_VABI WebRtcOpus_EnableFec_nid_postfix(WebRtcOpusEncInst* inst); +std::int16_t APS5_VABI WebRtcOpus_DisableFec_nid_postfix(WebRtcOpusEncInst* inst); +std::int16_t APS5_VABI WebRtcOpus_SetMaxPlaybackRate_nid_postfix(WebRtcOpusEncInst* inst, std::int32_t frequencyHz); +std::int16_t APS5_VABI WebRtcOpus_SetComplexity_nid_postfix(WebRtcOpusEncInst* inst, std::int32_t complexity); +std::int16_t APS5_VABI WebRtcOpus_EnableDtx_nid_postfix(WebRtcOpusEncInst* inst); +std::int16_t APS5_VABI WebRtcOpus_DisableDtx_nid_postfix(WebRtcOpusEncInst* inst); +std::int16_t APS5_VABI WebRtcOpus_EnableCbr_nid_postfix(WebRtcOpusEncInst* inst); +std::int16_t APS5_VABI WebRtcOpus_DisableCbr_nid_postfix(WebRtcOpusEncInst* inst); +int APS5_VABI WebRtcOpus_Encode_nid_postfix(WebRtcOpusEncInst* inst, const std::int16_t* audioIn, std::size_t samples, std::size_t lengthEncodedBuffer, std::uint8_t* encoded); +std::int16_t APS5_VABI WebRtcOpus_EncoderCreate_nid_postfix(WebRtcOpusEncInst** inst, std::size_t channels, std::int32_t application, int sampleRateHz); +std::int16_t APS5_VABI WebRtcOpus_SetPacketLossRate_nid_postfix(WebRtcOpusEncInst* inst, std::int32_t lossRate); +std::int32_t APS5_VABI WebRtcOpus_GetBandwidth_nid_postfix(WebRtcOpusEncInst* inst); +std::int16_t APS5_VABI WebRtcOpus_SetBandwidth_nid_postfix(WebRtcOpusEncInst* inst, std::int32_t bandwidth); +std::int16_t APS5_VABI WebRtcOpus_SetForceChannels_nid_postfix(WebRtcOpusEncInst* inst, std::size_t numChannels); +int APS5_VABI _ZN6webrtc20AudioDecoderOpusImplC1ERKNS_15FieldTrialsViewEmi_nid_postfix(void); +int APS5_VABI _ZN6webrtc20AudioDecoderOpusImplD1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc23AudioNetworkAdaptorImpl6ConfigC1Ev_nid_postfix(void); +int APS5_VABI libwebrtcUnknown57(void); +int APS5_VABI libwebrtcUnknown58(void); +int APS5_VABI _ZN6webrtc23AudioNetworkAdaptorImpl6ConfigD1Ev_nid_postfix(void); +int APS5_VABI _ZN6webrtc32CreateBuiltinAudioEncoderFactoryEv_nid_postfix(void); +int APS5_VABI libwebrtcUnknown59(void); +int APS5_VABI _ZN6webrtc14RTCStatsReport13ConstIteratorppEi_nid_postfix(void); +int APS5_VABI _ZNK6webrtc14RTCStatsReport13ConstIteratorptEv_nid_postfix(void); + +} diff --git a/core/libs/prx/libwebrtc/include/ExpFilter.hpp b/core/libs/prx/libwebrtc/include/ExpFilter.hpp new file mode 100644 index 0000000000..600327c779 --- /dev/null +++ b/core/libs/prx/libwebrtc/include/ExpFilter.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include + +constexpr float WebRtcExpFilterValueUndefined = -1.0f; + +struct WebRtcExpFilter { + float alpha; + float filtered; + float max; +}; + +static_assert(sizeof(WebRtcExpFilter) == 12); +static_assert(offsetof(WebRtcExpFilter, filtered) == 4); +static_assert(offsetof(WebRtcExpFilter, max) == 8); diff --git a/core/libs/prx/libwebrtc/include/Opus.hpp b/core/libs/prx/libwebrtc/include/Opus.hpp new file mode 100644 index 0000000000..593ed38add --- /dev/null +++ b/core/libs/prx/libwebrtc/include/Opus.hpp @@ -0,0 +1,3 @@ +#pragma once + +struct WebRtcOpusEncInst; diff --git a/core/libs/prx/libwebrtc/include/RtcpCommonHeader.hpp b/core/libs/prx/libwebrtc/include/RtcpCommonHeader.hpp new file mode 100644 index 0000000000..15e9280434 --- /dev/null +++ b/core/libs/prx/libwebrtc/include/RtcpCommonHeader.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include +#include + +constexpr std::size_t WebRtcRtcpCommonHeaderSize = 4; + +struct WebRtcRtcpCommonHeader { + std::uint8_t packetType; + std::uint8_t countOrFormat; + std::uint8_t paddingSize; + std::uint32_t payloadSize; + const std::uint8_t* payload; +}; + +static_assert(sizeof(WebRtcRtcpCommonHeader) == 16); +static_assert(offsetof(WebRtcRtcpCommonHeader, paddingSize) == 2); +static_assert(offsetof(WebRtcRtcpCommonHeader, payloadSize) == 4); +static_assert(offsetof(WebRtcRtcpCommonHeader, payload) == 8); diff --git a/core/libs/prx/libwebrtc/libwebrtc.hpp b/core/libs/prx/libwebrtc/libwebrtc.hpp new file mode 100644 index 0000000000..57c9e66223 --- /dev/null +++ b/core/libs/prx/libwebrtc/libwebrtc.hpp @@ -0,0 +1,3 @@ +#pragma once + +#include "prx/libwebrtc/include/Api.hpp" diff --git a/core/libs/prx/libwebrtc/src/ExpFilter.cpp b/core/libs/prx/libwebrtc/src/ExpFilter.cpp new file mode 100644 index 0000000000..fe97b83424 --- /dev/null +++ b/core/libs/prx/libwebrtc/src/ExpFilter.cpp @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +/* + * Copyright (c) 2011, The WebRTC project authors. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Google nor the names of its contributors may + * be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "prx/libwebrtc/libwebrtc.hpp" + +#include +#include + +extern "C" { + +void APS5_VABI _ZN3rtc9ExpFilter5ResetEf_nid_postfix(WebRtcExpFilter* filter, float alpha) { + if (!filter) + throw std::invalid_argument("ExpFilter::Reset requires a filter"); + filter->alpha = alpha; + filter->filtered = WebRtcExpFilterValueUndefined; +} + +float APS5_VABI _ZN3rtc9ExpFilter5ApplyEff_nid_postfix(WebRtcExpFilter* filter, float exponent, float sample) { + if (!filter) + throw std::invalid_argument("ExpFilter::Apply requires a filter"); + if (filter->filtered == WebRtcExpFilterValueUndefined) { + filter->filtered = sample; + } else if (exponent == 1.0f) { + filter->filtered = filter->alpha * filter->filtered + (1 - filter->alpha) * sample; + } else { + float alpha = std::pow(filter->alpha, exponent); + filter->filtered = alpha * filter->filtered + (1 - alpha) * sample; + } + if (filter->max != WebRtcExpFilterValueUndefined && filter->filtered > filter->max) + filter->filtered = filter->max; + return filter->filtered; +} + +} diff --git a/core/libs/prx/libwebrtc/src/Opus.cpp b/core/libs/prx/libwebrtc/src/Opus.cpp new file mode 100644 index 0000000000..0a43b95e19 --- /dev/null +++ b/core/libs/prx/libwebrtc/src/Opus.cpp @@ -0,0 +1,220 @@ +/* + * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +/* + * Copyright (c) 2011, The WebRTC project authors. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Google nor the names of its contributors may + * be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "prx/libwebrtc/libwebrtc.hpp" + +#include +#include +#include +#include + +struct WebRtcOpusEncInst { + OpusEncoder* encoder; + std::size_t channels; + int inDtxMode; + int sampleRateHz; +}; + +namespace { + +constexpr std::size_t SamplesPerMillisecondAt48Khz = 48; +constexpr std::size_t MaxFrameMillisecondsWithout120Ms = 60; +constexpr std::size_t MaxFrameMillisecondsWith120Ms = 120; + +} + +extern "C" { + +std::int16_t APS5_VABI WebRtcOpus_EncoderFree_nid_postfix(WebRtcOpusEncInst* inst) { + if (!inst) + return -1; + if (inst->encoder) + opus_encoder_destroy(inst->encoder); + delete inst; + return 0; +} + +std::int16_t APS5_VABI WebRtcOpus_EncoderCreate_nid_postfix(WebRtcOpusEncInst** inst, std::size_t channels, std::int32_t application, int sampleRateHz) { + if (!inst) + return -1; + int opusApplication = 0; + switch (application) { + case 0: + opusApplication = OPUS_APPLICATION_VOIP; + break; + case 1: + opusApplication = OPUS_APPLICATION_AUDIO; + break; + default: + return -1; + } + auto* state = new WebRtcOpusEncInst {}; + int error = OPUS_OK; + state->encoder = opus_encoder_create(sampleRateHz, static_cast(channels), opusApplication, &error); + if (error != OPUS_OK || !state->encoder) { + WebRtcOpus_EncoderFree_nid_postfix(state); + return -1; + } + state->inDtxMode = 0; + state->channels = channels; + state->sampleRateHz = sampleRateHz; + *inst = state; + return 0; +} + +int APS5_VABI WebRtcOpus_Encode_nid_postfix(WebRtcOpusEncInst* inst, const std::int16_t* audioIn, std::size_t samples, std::size_t lengthEncodedBuffer, std::uint8_t* encoded) { + if (!inst) + throw std::invalid_argument("WebRtcOpus_Encode requires an encoder"); + if (samples > SamplesPerMillisecondAt48Khz * MaxFrameMillisecondsWith120Ms) + return -1; + if (samples > SamplesPerMillisecondAt48Khz * MaxFrameMillisecondsWithout120Ms) + throw std::runtime_error("WebRtcOpus_Encode: frames over 60 ms depend on WEBRTC_OPUS_SUPPORT_120MS_PTIME, which is unknown for this module"); + if (!audioIn || !encoded) + throw std::invalid_argument("WebRtcOpus_Encode requires input and output buffers"); + const int result = opus_encode(inst->encoder, audioIn, static_cast(samples), encoded, static_cast(lengthEncodedBuffer)); + if (result <= 0) + return -1; + if (result <= 2) { + if (inst->inDtxMode) + return 0; + inst->inDtxMode = 1; + return result; + } + inst->inDtxMode = 0; + return result; +} + +std::int16_t APS5_VABI WebRtcOpus_SetBitRate_nid_postfix(WebRtcOpusEncInst* inst, std::int32_t rate) { + if (!inst) + return -1; + return static_cast(opus_encoder_ctl(inst->encoder, OPUS_SET_BITRATE(rate))); +} + +std::int16_t APS5_VABI WebRtcOpus_SetPacketLossRate_nid_postfix(WebRtcOpusEncInst* inst, std::int32_t lossRate) { + if (!inst) + return -1; + return static_cast(opus_encoder_ctl(inst->encoder, OPUS_SET_PACKET_LOSS_PERC(lossRate))); +} + +std::int16_t APS5_VABI WebRtcOpus_SetMaxPlaybackRate_nid_postfix(WebRtcOpusEncInst* inst, std::int32_t frequencyHz) { + if (!inst) + return -1; + opus_int32 bandwidth = OPUS_BANDWIDTH_FULLBAND; + if (frequencyHz <= 8000) + bandwidth = OPUS_BANDWIDTH_NARROWBAND; + else if (frequencyHz <= 12000) + bandwidth = OPUS_BANDWIDTH_MEDIUMBAND; + else if (frequencyHz <= 16000) + bandwidth = OPUS_BANDWIDTH_WIDEBAND; + else if (frequencyHz <= 24000) + bandwidth = OPUS_BANDWIDTH_SUPERWIDEBAND; + return static_cast(opus_encoder_ctl(inst->encoder, OPUS_SET_MAX_BANDWIDTH(bandwidth))); +} + +std::int16_t APS5_VABI WebRtcOpus_EnableFec_nid_postfix(WebRtcOpusEncInst* inst) { + if (!inst) + return -1; + return static_cast(opus_encoder_ctl(inst->encoder, OPUS_SET_INBAND_FEC(1))); +} + +std::int16_t APS5_VABI WebRtcOpus_DisableFec_nid_postfix(WebRtcOpusEncInst* inst) { + if (!inst) + return -1; + return static_cast(opus_encoder_ctl(inst->encoder, OPUS_SET_INBAND_FEC(0))); +} + +std::int16_t APS5_VABI WebRtcOpus_EnableDtx_nid_postfix(WebRtcOpusEncInst* inst) { + if (!inst) + return -1; + return static_cast(opus_encoder_ctl(inst->encoder, OPUS_SET_DTX(1))); +} + +std::int16_t APS5_VABI WebRtcOpus_DisableDtx_nid_postfix(WebRtcOpusEncInst* inst) { + if (!inst) + return -1; + return static_cast(opus_encoder_ctl(inst->encoder, OPUS_SET_DTX(0))); +} + +std::int16_t APS5_VABI WebRtcOpus_EnableCbr_nid_postfix(WebRtcOpusEncInst* inst) { + if (!inst) + return -1; + return static_cast(opus_encoder_ctl(inst->encoder, OPUS_SET_VBR(0))); +} + +std::int16_t APS5_VABI WebRtcOpus_DisableCbr_nid_postfix(WebRtcOpusEncInst* inst) { + if (!inst) + return -1; + return static_cast(opus_encoder_ctl(inst->encoder, OPUS_SET_VBR(1))); +} + +std::int16_t APS5_VABI WebRtcOpus_SetComplexity_nid_postfix(WebRtcOpusEncInst* inst, std::int32_t complexity) { + if (!inst) + return -1; + return static_cast(opus_encoder_ctl(inst->encoder, OPUS_SET_COMPLEXITY(complexity))); +} + +std::int32_t APS5_VABI WebRtcOpus_GetBandwidth_nid_postfix(WebRtcOpusEncInst* inst) { + if (!inst) + return -1; + opus_int32 bandwidth = 0; + if (opus_encoder_ctl(inst->encoder, OPUS_GET_BANDWIDTH(&bandwidth)) == OPUS_OK) + return bandwidth; + return -1; +} + +std::int16_t APS5_VABI WebRtcOpus_SetBandwidth_nid_postfix(WebRtcOpusEncInst* inst, std::int32_t bandwidth) { + if (!inst) + return -1; + return static_cast(opus_encoder_ctl(inst->encoder, OPUS_SET_BANDWIDTH(bandwidth))); +} + +std::int16_t APS5_VABI WebRtcOpus_SetForceChannels_nid_postfix(WebRtcOpusEncInst* inst, std::size_t numChannels) { + if (!inst) + return -1; + if (numChannels == 0) + return static_cast(opus_encoder_ctl(inst->encoder, OPUS_SET_FORCE_CHANNELS(OPUS_AUTO))); + if (numChannels == 1 || numChannels == 2) + return static_cast(opus_encoder_ctl(inst->encoder, OPUS_SET_FORCE_CHANNELS(static_cast(numChannels)))); + return -1; +} + +} diff --git a/core/libs/prx/libwebrtc/src/RtcpCommonHeader.cpp b/core/libs/prx/libwebrtc/src/RtcpCommonHeader.cpp new file mode 100644 index 0000000000..e4f85d3ce1 --- /dev/null +++ b/core/libs/prx/libwebrtc/src/RtcpCommonHeader.cpp @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +/* + * Copyright (c) 2011, The WebRTC project authors. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Google nor the names of its contributors may + * be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "prx/libwebrtc/libwebrtc.hpp" + +#include +#include +#include + +extern "C" { + +bool APS5_VABI _ZN6webrtc4rtcp12CommonHeader5ParseEPKhm_nid_postfix(WebRtcRtcpCommonHeader* header, const std::uint8_t* buffer, std::size_t size) { + if (!header) + throw std::invalid_argument("CommonHeader::Parse requires a header"); + if (size < WebRtcRtcpCommonHeaderSize) + return false; + if (!buffer) + throw std::invalid_argument("CommonHeader::Parse requires a buffer"); + if ((buffer[0] >> 6) != 2) + return false; + bool hasPadding = (buffer[0] & 0x20) != 0; + header->countOrFormat = buffer[0] & 0x1F; + header->packetType = buffer[1]; + header->payloadSize = ((static_cast(buffer[2]) << 8) | buffer[3]) * 4u; + header->payload = buffer + WebRtcRtcpCommonHeaderSize; + header->paddingSize = 0; + if (size < WebRtcRtcpCommonHeaderSize + header->payloadSize) + return false; + if (hasPadding) { + if (header->payloadSize == 0) + return false; + header->paddingSize = header->payload[header->payloadSize - 1]; + if (header->paddingSize == 0) + return false; + if (header->paddingSize > header->payloadSize) + return false; + header->payloadSize -= header->paddingSize; + } + return true; +} + +} diff --git a/core/libs/prx/libwebrtc/tests/ExpFilter.cpp b/core/libs/prx/libwebrtc/tests/ExpFilter.cpp new file mode 100644 index 0000000000..8bb5b3cc32 --- /dev/null +++ b/core/libs/prx/libwebrtc/tests/ExpFilter.cpp @@ -0,0 +1,86 @@ +#include "prx/libwebrtc/libwebrtc.hpp" + +#include +#include +#include +#include +#include + +namespace { + +void Require(bool condition, std::source_location location = std::source_location::current()) { + if (condition) return; + std::fprintf(stderr, "libwebrtc ExpFilter check failed at line %u\n", location.line()); + std::abort(); +} + +template void RequireInvalidArgument(TAction action, std::source_location location = std::source_location::current()) { + try { + action(); + } catch (const std::invalid_argument&) { + return; + } + Require(false, location); +} + +void Reset(WebRtcExpFilter& filter, float alpha) { + _ZN3rtc9ExpFilter5ResetEf_nid_postfix(&filter, alpha); +} + +float Apply(WebRtcExpFilter& filter, float exponent, float sample) { + return _ZN3rtc9ExpFilter5ApplyEff_nid_postfix(&filter, exponent, sample); +} + +void TestReset() { + WebRtcExpFilter filter {0.25f, 7.0f, 3.0f}; + Reset(filter, 0.5f); + Require(filter.alpha == 0.5f); + Require(filter.filtered == WebRtcExpFilterValueUndefined); + Require(filter.max == 3.0f); +} + +void TestApply() { + WebRtcExpFilter filter {0.0f, 0.0f, WebRtcExpFilterValueUndefined}; + Reset(filter, 0.5f); + Require(Apply(filter, 1.0f, 4.0f) == 4.0f); + Require(Apply(filter, 1.0f, 8.0f) == 6.0f); + Require(Apply(filter, 2.0f, 10.0f) == 9.0f); + Require(filter.filtered == 9.0f); + float alpha = std::pow(0.5f, 0.5f); + float expected = alpha * 9.0f + (1 - alpha) * 1.0f; + Require(Apply(filter, 0.5f, 1.0f) == expected); + Require(Apply(filter, 1.0f, 1000.0f) > 400.0f); +} + +void TestUndefinedOutputRestarts() { + WebRtcExpFilter filter {0.0f, 0.0f, WebRtcExpFilterValueUndefined}; + Reset(filter, 0.5f); + Require(Apply(filter, 1.0f, 0.0f) == 0.0f); + Require(Apply(filter, 1.0f, -2.0f) == -1.0f); + Require(Apply(filter, 1.0f, 10.0f) == 10.0f); +} + +void TestMax() { + WebRtcExpFilter filter {0.0f, 0.0f, 5.0f}; + Reset(filter, 0.5f); + Require(Apply(filter, 1.0f, 9.0f) == 5.0f); + Require(Apply(filter, 1.0f, 1.0f) == 3.0f); + Require(Apply(filter, 1.0f, 5.0f) == 4.0f); + Require(filter.max == 5.0f); +} + +void TestNullFilter() { + RequireInvalidArgument([] { _ZN3rtc9ExpFilter5ResetEf_nid_postfix(nullptr, 0.5f); }); + RequireInvalidArgument([] { _ZN3rtc9ExpFilter5ApplyEff_nid_postfix(nullptr, 1.0f, 1.0f); }); +} + +} + +int main() { + TestReset(); + TestApply(); + TestUndefinedOutputRestarts(); + TestMax(); + TestNullFilter(); + std::puts("libwebrtc ExpFilter tests passed"); +} diff --git a/core/libs/prx/libwebrtc/tests/FastIntToBuffer.cpp b/core/libs/prx/libwebrtc/tests/FastIntToBuffer.cpp new file mode 100644 index 0000000000..c72cb0ee50 --- /dev/null +++ b/core/libs/prx/libwebrtc/tests/FastIntToBuffer.cpp @@ -0,0 +1,72 @@ +#include "prx/libwebrtc/libwebrtc.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { + +void Require(bool condition, std::source_location location = std::source_location::current()) { + if (condition) return; + std::fprintf(stderr, "libwebrtc FastIntToBuffer check failed at line %u\n", location.line()); + std::abort(); +} + +constexpr char Fill = 'x'; + +std::array Filled() { + std::array buffer; + buffer.fill(Fill); + return buffer; +} + +void Check(int value, std::string_view text, std::size_t zeroedTo) { + std::array buffer = Filled(); + char* end = _ZN4absl16numbers_internal15FastIntToBufferEiPc_nid_postfix(value, buffer.data()); + Require(end == buffer.data() + text.size()); + Require(std::string_view(buffer.data(), text.size()) == text); + for (std::size_t index = text.size(); index < zeroedTo; ++index) + Require(buffer[index] == '\0'); + for (std::size_t index = zeroedTo; index < buffer.size(); ++index) + Require(buffer[index] == Fill); +} + +void TestDigits() { + Check(0, "0", 2); + Check(7, "7", 2); + Check(-7, "-7", 3); + Check(10, "10", 8); + Check(-10, "-10", 9); + Check(123, "123", 8); + Check(-4567, "-4567", 9); + Check(1234567, "1234567", 8); + Check(99999999, "99999999", 9); + Check(-99999999, "-99999999", 10); + Check(100000000, "100000000", 10); + Check(1234567890, "1234567890", 11); + Check(std::numeric_limits::max(), "2147483647", 11); + Check(std::numeric_limits::min(), "-2147483648", 12); +} + +void TestNullBuffer() { + try { + _ZN4absl16numbers_internal15FastIntToBufferEiPc_nid_postfix(1, nullptr); + } catch (const std::invalid_argument&) { + return; + } + Require(false); +} + +} + +int main() { + TestDigits(); + TestNullBuffer(); + std::puts("libwebrtc FastIntToBuffer tests passed"); +} diff --git a/core/libs/prx/libwebrtc/tests/Opus.cpp b/core/libs/prx/libwebrtc/tests/Opus.cpp new file mode 100644 index 0000000000..60915b2173 --- /dev/null +++ b/core/libs/prx/libwebrtc/tests/Opus.cpp @@ -0,0 +1,265 @@ +#include "prx/libwebrtc/libwebrtc.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { + +constexpr int SampleRate = 48000; +constexpr std::size_t FrameSamples = 960; +constexpr std::size_t PacketCapacity = 1500; +constexpr std::int32_t Voip = 0; +constexpr std::int32_t Audio = 1; + +void Require(bool condition, std::source_location location = std::source_location::current()) { + if (condition) return; + std::fprintf(stderr, "libwebrtc Opus check failed at line %u\n", location.line()); + std::abort(); +} + +WebRtcOpusEncInst* Create(std::size_t channels, std::int32_t application) { + WebRtcOpusEncInst* inst = nullptr; + Require(WebRtcOpus_EncoderCreate_nid_postfix(&inst, channels, application, SampleRate) == 0); + Require(inst != nullptr); + return inst; +} + +std::int16_t Tone(std::size_t index, double frequency, double amplitude) { + return static_cast(std::lround(amplitude * std::sin(2.0 * 3.14159265358979323846 * frequency * static_cast(index) / SampleRate))); +} + +struct Noise { + std::uint32_t state = 12345; + + std::int16_t Next(int amplitude) { + state = state * 1664525u + 1013904223u; + return static_cast(static_cast(state >> 16) % (2 * amplitude + 1) - amplitude); + } +}; + +std::vector ToneFrame(std::size_t frame, double frequency) { + std::vector pcm(FrameSamples); + for (std::size_t i = 0; i < FrameSamples; ++i) pcm[i] = Tone(frame * FrameSamples + i, frequency, 8000.0); + return pcm; +} + +std::vector NoiseFrame(Noise& noise, int amplitude) { + std::vector pcm(FrameSamples); + for (auto& sample : pcm) sample = noise.Next(amplitude); + return pcm; +} + +int Encode(WebRtcOpusEncInst* inst, const std::vector& pcm, std::size_t samples, std::array& packet) { + return WebRtcOpus_Encode_nid_postfix(inst, pcm.data(), samples, packet.size(), packet.data()); +} + +void TestRoundTrip() { + auto* inst = Create(1, Voip); + Require(WebRtcOpus_SetBitRate_nid_postfix(inst, 32000) == 0); + Require(WebRtcOpus_SetComplexity_nid_postfix(inst, 5) == 0); + int error = OPUS_OK; + OpusDecoder* decoder = opus_decoder_create(SampleRate, 1, &error); + Require(error == OPUS_OK && decoder != nullptr); + constexpr std::size_t Frames = 50; + std::vector input; + std::vector output; + std::array packet {}; + for (std::size_t frame = 0; frame < Frames; ++frame) { + const auto pcm = ToneFrame(frame, 440.0); + input.insert(input.end(), pcm.begin(), pcm.end()); + const int size = Encode(inst, pcm, FrameSamples, packet); + Require(size > 2 && size <= static_cast(PacketCapacity)); + std::array decoded {}; + Require(opus_decode(decoder, packet.data(), size, decoded.data(), static_cast(FrameSamples), 0) == static_cast(FrameSamples)); + output.insert(output.end(), decoded.begin(), decoded.end()); + } + const std::size_t start = 10 * FrameSamples; + const std::size_t length = 30 * FrameSamples; + double best = 0.0; + double inputEnergy = 0.0; + double outputEnergy = 0.0; + for (std::size_t lag = 0; lag < FrameSamples; ++lag) { + double cross = 0.0; + double in = 0.0; + double out = 0.0; + for (std::size_t i = start; i < start + length; ++i) { + cross += static_cast(input[i]) * output[i + lag]; + in += static_cast(input[i]) * input[i]; + out += static_cast(output[i + lag]) * output[i + lag]; + } + const double correlation = cross / std::sqrt(in * out); + if (correlation > best) { + best = correlation; + inputEnergy = in; + outputEnergy = out; + } + } + Require(best > 0.9); + const double gain = std::sqrt(outputEnergy / inputEnergy); + Require(gain > 0.7 && gain < 1.3); + opus_decoder_destroy(decoder); + Require(WebRtcOpus_EncoderFree_nid_postfix(inst) == 0); +} + +void TestForceChannels() { + auto* inst = Create(2, Audio); + Require(WebRtcOpus_SetBitRate_nid_postfix(inst, 64000) == 0); + std::vector pcm(FrameSamples * 2); + std::array packet {}; + auto encodeStereo = [&](std::size_t frame) { + for (std::size_t i = 0; i < FrameSamples; ++i) { + pcm[i * 2] = Tone(frame * FrameSamples + i, 440.0, 8000.0); + pcm[i * 2 + 1] = Tone(frame * FrameSamples + i, 660.0, 8000.0); + } + const int size = WebRtcOpus_Encode_nid_postfix(inst, pcm.data(), FrameSamples, packet.size(), packet.data()); + Require(size > 2); + return opus_packet_get_nb_channels(packet.data()); + }; + Require(WebRtcOpus_SetForceChannels_nid_postfix(inst, 1) == 0); + for (std::size_t frame = 0; frame < 10; ++frame) Require(encodeStereo(frame) == 1); + Require(WebRtcOpus_SetForceChannels_nid_postfix(inst, 0) == 0); + int channels = 0; + for (std::size_t frame = 10; frame < 20; ++frame) channels = encodeStereo(frame); + Require(channels == 2); + Require(WebRtcOpus_SetForceChannels_nid_postfix(inst, 2) == 0); + Require(WebRtcOpus_SetForceChannels_nid_postfix(inst, 3) == -1); + Require(WebRtcOpus_EncoderFree_nid_postfix(inst) == 0); +} + +void TestConstantBitrate() { + auto* inst = Create(1, Voip); + Noise noise; + std::array packet {}; + Require(WebRtcOpus_EnableCbr_nid_postfix(inst) == 0); + for (const std::int32_t rate : {16000, 32000, 64000}) { + Require(WebRtcOpus_SetBitRate_nid_postfix(inst, rate) == 0); + const int expected = rate / 8 / 50; + for (std::size_t frame = 0; frame < 10; ++frame) { + const auto pcm = frame % 2 == 0 ? ToneFrame(frame, 300.0) : NoiseFrame(noise, 12000); + Require(Encode(inst, pcm, FrameSamples, packet) == expected); + } + } + Require(WebRtcOpus_DisableCbr_nid_postfix(inst) == 0); + Require(WebRtcOpus_SetBitRate_nid_postfix(inst, 32000) == 0); + std::vector sizes; + for (std::size_t frame = 0; frame < 20; ++frame) { + const auto pcm = frame % 2 == 0 ? ToneFrame(frame, 300.0) : NoiseFrame(noise, 12000); + sizes.push_back(Encode(inst, pcm, FrameSamples, packet)); + } + Require(std::all_of(sizes.begin(), sizes.end(), [](int size) { return size > 2; })); + Require(*std::min_element(sizes.begin(), sizes.end()) != *std::max_element(sizes.begin(), sizes.end())); + Require(WebRtcOpus_EncoderFree_nid_postfix(inst) == 0); +} + +void TestDtx() { + auto* inst = Create(1, Voip); + Require(WebRtcOpus_SetBitRate_nid_postfix(inst, 32000) == 0); + Require(WebRtcOpus_EnableDtx_nid_postfix(inst) == 0); + std::array packet {}; + const std::vector silence(FrameSamples, 0); + std::vector results; + for (std::size_t frame = 0; frame < 100; ++frame) results.push_back(Encode(inst, silence, FrameSamples, packet)); + Require(std::none_of(results.begin(), results.end(), [](int result) { return result < 0; })); + const auto entered = std::find_if(results.begin(), results.end(), [](int result) { return result == 1 || result == 2; }); + Require(entered != results.end()); + Require(std::find(entered + 1, results.end(), 0) != results.end()); + Require(std::find(results.begin(), entered, 0) == entered); + Noise noise; + bool active = false; + for (std::size_t frame = 0; frame < 5 && !active; ++frame) active = Encode(inst, NoiseFrame(noise, 12000), FrameSamples, packet) > 2; + Require(active); + Require(WebRtcOpus_DisableDtx_nid_postfix(inst) == 0); + Require(WebRtcOpus_EncoderFree_nid_postfix(inst) == 0); +} + +void TestBandwidth() { + auto* inst = Create(1, Voip); + Require(WebRtcOpus_SetBitRate_nid_postfix(inst, 32000) == 0); + Noise noise; + std::array packet {}; + Require(WebRtcOpus_SetMaxPlaybackRate_nid_postfix(inst, 8000) == 0); + for (std::size_t frame = 0; frame < 10; ++frame) Require(Encode(inst, NoiseFrame(noise, 8000), FrameSamples, packet) > 2); + Require(WebRtcOpus_GetBandwidth_nid_postfix(inst) == OPUS_BANDWIDTH_NARROWBAND); + Require(WebRtcOpus_SetMaxPlaybackRate_nid_postfix(inst, 48000) == 0); + Require(WebRtcOpus_SetBandwidth_nid_postfix(inst, OPUS_BANDWIDTH_WIDEBAND) == 0); + for (std::size_t frame = 0; frame < 10; ++frame) Require(Encode(inst, NoiseFrame(noise, 8000), FrameSamples, packet) > 2); + Require(WebRtcOpus_GetBandwidth_nid_postfix(inst) == OPUS_BANDWIDTH_WIDEBAND); + Require(WebRtcOpus_SetBandwidth_nid_postfix(inst, 5) == OPUS_BAD_ARG); + Require(WebRtcOpus_EncoderFree_nid_postfix(inst) == 0); +} + +void TestFec() { + auto* inst = Create(1, Voip); + Require(WebRtcOpus_SetBitRate_nid_postfix(inst, 32000) == 0); + Require(WebRtcOpus_EnableFec_nid_postfix(inst) == 0); + Require(WebRtcOpus_SetPacketLossRate_nid_postfix(inst, 20) == 0); + Noise noise; + std::array packet {}; + int withLbrr = 0; + for (std::size_t frame = 0; frame < 30; ++frame) { + const int size = Encode(inst, NoiseFrame(noise, 8000), FrameSamples, packet); + Require(size > 2); + withLbrr += opus_packet_has_lbrr(packet.data(), size) == 1; + } + Require(withLbrr > 0); + Require(WebRtcOpus_DisableFec_nid_postfix(inst) == 0); + for (std::size_t frame = 0; frame < 5; ++frame) Require(Encode(inst, NoiseFrame(noise, 8000), FrameSamples, packet) > 2); + for (std::size_t frame = 0; frame < 20; ++frame) { + const int size = Encode(inst, NoiseFrame(noise, 8000), FrameSamples, packet); + Require(size > 2 && opus_packet_has_lbrr(packet.data(), size) == 0); + } + Require(WebRtcOpus_EncoderFree_nid_postfix(inst) == 0); +} + +void TestErrors() { + Require(WebRtcOpus_EncoderCreate_nid_postfix(nullptr, 1, Voip, SampleRate) == -1); + auto* const untouched = reinterpret_cast(static_cast(0x10)); + WebRtcOpusEncInst* inst = untouched; + Require(WebRtcOpus_EncoderCreate_nid_postfix(&inst, 1, 2, SampleRate) == -1 && inst == untouched); + Require(WebRtcOpus_EncoderCreate_nid_postfix(&inst, 1, Voip, 44100) == -1 && inst == untouched); + Require(WebRtcOpus_EncoderCreate_nid_postfix(&inst, 3, Audio, SampleRate) == -1 && inst == untouched); + Require(WebRtcOpus_EncoderFree_nid_postfix(nullptr) == -1); + Require(WebRtcOpus_SetBitRate_nid_postfix(nullptr, 32000) == -1); + Require(WebRtcOpus_SetPacketLossRate_nid_postfix(nullptr, 10) == -1); + Require(WebRtcOpus_SetMaxPlaybackRate_nid_postfix(nullptr, 8000) == -1); + Require(WebRtcOpus_EnableFec_nid_postfix(nullptr) == -1 && WebRtcOpus_DisableFec_nid_postfix(nullptr) == -1); + Require(WebRtcOpus_EnableDtx_nid_postfix(nullptr) == -1 && WebRtcOpus_DisableDtx_nid_postfix(nullptr) == -1); + Require(WebRtcOpus_EnableCbr_nid_postfix(nullptr) == -1 && WebRtcOpus_DisableCbr_nid_postfix(nullptr) == -1); + Require(WebRtcOpus_SetComplexity_nid_postfix(nullptr, 5) == -1); + Require(WebRtcOpus_GetBandwidth_nid_postfix(nullptr) == -1); + Require(WebRtcOpus_SetBandwidth_nid_postfix(nullptr, OPUS_BANDWIDTH_WIDEBAND) == -1); + Require(WebRtcOpus_SetForceChannels_nid_postfix(nullptr, 1) == -1); + + inst = Create(1, Audio); + Require(WebRtcOpus_SetComplexity_nid_postfix(inst, 11) == OPUS_BAD_ARG); + Require(WebRtcOpus_SetBitRate_nid_postfix(inst, -5) == OPUS_BAD_ARG); + Require(WebRtcOpus_SetPacketLossRate_nid_postfix(inst, 101) == OPUS_BAD_ARG); + std::vector pcm(48 * 120 + 1, 0); + std::array packet {}; + Require(Encode(inst, pcm, 48 * 120 + 1, packet) == -1); + Require(Encode(inst, pcm, 100, packet) == -1); + Require(WebRtcOpus_Encode_nid_postfix(inst, pcm.data(), FrameSamples, 0, packet.data()) == -1); + Require(Encode(inst, pcm, 48 * 60, packet) > 0); + Require(WebRtcOpus_EncoderFree_nid_postfix(inst) == 0); +} + +} + +int main() { + TestRoundTrip(); + TestForceChannels(); + TestConstantBitrate(); + TestDtx(); + TestBandwidth(); + TestFec(); + TestErrors(); + std::puts("libwebrtc Opus tests passed"); +} diff --git a/core/libs/prx/libwebrtc/tests/RtcpCommonHeader.cpp b/core/libs/prx/libwebrtc/tests/RtcpCommonHeader.cpp new file mode 100644 index 0000000000..d7c331b9e9 --- /dev/null +++ b/core/libs/prx/libwebrtc/tests/RtcpCommonHeader.cpp @@ -0,0 +1,144 @@ +#include "prx/libwebrtc/libwebrtc.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { + +void Require(bool condition, std::source_location location = std::source_location::current()) { + if (condition) return; + std::fprintf(stderr, "libwebrtc rtcp::CommonHeader check failed at line %u\n", location.line()); + std::abort(); +} + +template void RequireInvalidArgument(TAction action, std::source_location location = std::source_location::current()) { + try { + action(); + } catch (const std::invalid_argument&) { + return; + } + Require(false, location); +} + +WebRtcRtcpCommonHeader Filled() { + WebRtcRtcpCommonHeader header; + std::memset(&header, 0xA5, sizeof(header)); + return header; +} + +bool Parse(WebRtcRtcpCommonHeader& header, const std::vector& packet, std::size_t size) { + return _ZN6webrtc4rtcp12CommonHeader5ParseEPKhm_nid_postfix(&header, packet.data(), size); +} + +bool Unchanged(const WebRtcRtcpCommonHeader& header) { + WebRtcRtcpCommonHeader filled = Filled(); + return header.packetType == filled.packetType && header.countOrFormat == filled.countOrFormat && header.paddingSize == filled.paddingSize && + header.payloadSize == filled.payloadSize && header.payload == filled.payload; +} + +void TestReceiverReport() { + std::vector packet {0x81, 201, 0x00, 0x07}; + packet.resize(32, 0x11); + WebRtcRtcpCommonHeader header = Filled(); + Require(Parse(header, packet, packet.size())); + Require(header.countOrFormat == 1); + Require(header.packetType == 201); + Require(header.payloadSize == 28); + Require(header.paddingSize == 0); + Require(header.payload == packet.data() + 4); +} + +void TestFeedbackFormatAndEmptyPayload() { + std::vector packet {0x9F, 206, 0x00, 0x00}; + WebRtcRtcpCommonHeader header = Filled(); + Require(Parse(header, packet, packet.size())); + Require(header.countOrFormat == 31); + Require(header.packetType == 206); + Require(header.payloadSize == 0); + Require(header.paddingSize == 0); +} + +void TestPadding() { + std::vector packet {0xA0, 200, 0x00, 0x02, 1, 2, 3, 4, 5, 0, 0, 3}; + WebRtcRtcpCommonHeader header = Filled(); + Require(Parse(header, packet, packet.size())); + Require(header.countOrFormat == 0); + Require(header.paddingSize == 3); + Require(header.payloadSize == 5); + Require(header.payload == packet.data() + 4); + + packet[11] = 8; + header = Filled(); + Require(Parse(header, packet, packet.size())); + Require(header.paddingSize == 8); + Require(header.payloadSize == 0); +} + +void TestRejectsBeforeReading() { + std::vector packet {0x80, 200, 0x00, 0x00}; + WebRtcRtcpCommonHeader header = Filled(); + Require(!Parse(header, packet, 3)); + Require(Unchanged(header)); + Require(!_ZN6webrtc4rtcp12CommonHeader5ParseEPKhm_nid_postfix(&header, nullptr, 3)); + Require(Unchanged(header)); + for (std::uint8_t first : {0x00, 0x41, 0xC1}) { + packet[0] = first; + Require(!Parse(header, packet, packet.size())); + Require(Unchanged(header)); + } +} + +void TestRejectsAfterReading() { + std::vector packet {0x81, 201, 0x00, 0x02, 1, 2, 3, 4, 5, 6, 7}; + WebRtcRtcpCommonHeader header = Filled(); + Require(!Parse(header, packet, packet.size())); + Require(header.countOrFormat == 1); + Require(header.packetType == 201); + Require(header.payloadSize == 8); + Require(header.paddingSize == 0); + Require(header.payload == packet.data() + 4); + + std::vector empty {0xA0, 200, 0x00, 0x00}; + header = Filled(); + Require(!Parse(header, empty, empty.size())); + Require(header.payloadSize == 0); + Require(header.paddingSize == 0); + + std::vector zeroPadding {0xA0, 200, 0x00, 0x01, 1, 2, 3, 0}; + header = Filled(); + Require(!Parse(header, zeroPadding, zeroPadding.size())); + Require(header.payloadSize == 4); + Require(header.paddingSize == 0); + + std::vector tooMuchPadding {0xA0, 200, 0x00, 0x01, 1, 2, 3, 5}; + header = Filled(); + Require(!Parse(header, tooMuchPadding, tooMuchPadding.size())); + Require(header.payloadSize == 4); + Require(header.paddingSize == 5); +} + +void TestNullArguments() { + std::array packet {0x80, 200, 0x00, 0x00}; + RequireInvalidArgument([&] { _ZN6webrtc4rtcp12CommonHeader5ParseEPKhm_nid_postfix(nullptr, packet.data(), packet.size()); }); + WebRtcRtcpCommonHeader header = Filled(); + RequireInvalidArgument([&] { _ZN6webrtc4rtcp12CommonHeader5ParseEPKhm_nid_postfix(&header, nullptr, 4); }); + Require(Unchanged(header)); +} + +} + +int main() { + TestReceiverReport(); + TestFeedbackFormatAndEmptyPayload(); + TestPadding(); + TestRejectsBeforeReading(); + TestRejectsAfterReading(); + TestNullArguments(); + std::puts("libwebrtc rtcp::CommonHeader tests passed"); +} diff --git a/core/libs/prx/libwvoec/Export.cpp b/core/libs/prx/libwvoec/Export.cpp new file mode 100644 index 0000000000..dbd2451fc9 --- /dev/null +++ b/core/libs/prx/libwvoec/Export.cpp @@ -0,0 +1,471 @@ +#include "prx/libwvoec/include/Api.hpp" +#include +#include +#include "SceTypes.hpp" +#include "prx/libc/include/General.hpp" + +extern "C" { + +APS5_EXPORT("prq0CjcPh3Q", libwvoecUnknown00); +int APS5_VABI libwvoecUnknown00(void) { + NotImplemented_nid_no_patch("prq0CjcPh3Q"); + return 0; +} + +APS5_EXPORT("mmXShlLMvks", libwvoecUnknown01); +int APS5_VABI libwvoecUnknown01(void) { + NotImplemented_nid_no_patch("mmXShlLMvks"); + return 0; +} + +APS5_EXPORT("D3huzt4RyjA", libwvoecUnknown02); +int APS5_VABI libwvoecUnknown02(void) { + NotImplemented_nid_no_patch("D3huzt4RyjA"); + return 0; +} + +APS5_EXPORT("e4UGvUCHBuY", libwvoecUnknown03); +int APS5_VABI libwvoecUnknown03(void) { + NotImplemented_nid_no_patch("e4UGvUCHBuY"); + return 0; +} + +APS5_EXPORT("lvwcVFhXoFI", libwvoecUnknown04); +int APS5_VABI libwvoecUnknown04(void) { + NotImplemented_nid_no_patch("lvwcVFhXoFI"); + return 0; +} + +APS5_EXPORT("UcHpPtk8aAs", libwvoecUnknown05); +int APS5_VABI libwvoecUnknown05(void) { + NotImplemented_nid_no_patch("UcHpPtk8aAs"); + return 0; +} + +APS5_EXPORT("-wcU9j03NsM", libwvoecUnknown06); +int APS5_VABI libwvoecUnknown06(void) { + NotImplemented_nid_no_patch("-wcU9j03NsM"); + return 0; +} + +APS5_EXPORT("s4Q8CYH5Vr8", libwvoecUnknown07); +int APS5_VABI libwvoecUnknown07(void) { + NotImplemented_nid_no_patch("s4Q8CYH5Vr8"); + return 0; +} + +APS5_EXPORT("0shtaDEAgME", libwvoecUnknown08); +int APS5_VABI libwvoecUnknown08(void) { + NotImplemented_nid_no_patch("0shtaDEAgME"); + return 0; +} + +APS5_EXPORT("MQDotbhrQ+g", libwvoecUnknown09); +int APS5_VABI libwvoecUnknown09(void) { + NotImplemented_nid_no_patch("MQDotbhrQ+g"); + return 0; +} + +APS5_EXPORT("P+eYm6Z3cwU", libwvoecUnknown10); +int APS5_VABI libwvoecUnknown10(void) { + NotImplemented_nid_no_patch("P+eYm6Z3cwU"); + return 0; +} + +APS5_EXPORT("BTU9OXMVxCQ", libwvoecUnknown11); +int APS5_VABI libwvoecUnknown11(void) { + NotImplemented_nid_no_patch("BTU9OXMVxCQ"); + return 0; +} + +APS5_EXPORT("UgwoxzLcpeo", libwvoecUnknown12); +int APS5_VABI libwvoecUnknown12(void) { + NotImplemented_nid_no_patch("UgwoxzLcpeo"); + return 0; +} + +APS5_EXPORT("bQvO6RzSmNU", libwvoecUnknown13); +int APS5_VABI libwvoecUnknown13(void) { + NotImplemented_nid_no_patch("bQvO6RzSmNU"); + return 0; +} + +APS5_EXPORT("WPkerdXskhI", libwvoecUnknown14); +int APS5_VABI libwvoecUnknown14(void) { + NotImplemented_nid_no_patch("WPkerdXskhI"); + return 0; +} + +APS5_EXPORT("iSgO8YVSuM4", libwvoecUnknown15); +int APS5_VABI libwvoecUnknown15(void) { + NotImplemented_nid_no_patch("iSgO8YVSuM4"); + return 0; +} + +APS5_EXPORT("lC6KMC4B+y0", libwvoecUnknown16); +int APS5_VABI libwvoecUnknown16(void) { + NotImplemented_nid_no_patch("lC6KMC4B+y0"); + return 0; +} + +APS5_EXPORT("nX4uzkvGzYI", libwvoecUnknown17); +int APS5_VABI libwvoecUnknown17(void) { + NotImplemented_nid_no_patch("nX4uzkvGzYI"); + return 0; +} + +APS5_EXPORT("bZqgnnNa22c", libwvoecUnknown18); +int APS5_VABI libwvoecUnknown18(void) { + NotImplemented_nid_no_patch("bZqgnnNa22c"); + return 0; +} + +APS5_EXPORT("oeWZm8-U1gw", libwvoecUnknown19); +int APS5_VABI libwvoecUnknown19(void) { + NotImplemented_nid_no_patch("oeWZm8-U1gw"); + return 0; +} + +APS5_EXPORT("r7xDkk5xLdI", libwvoecUnknown20); +int APS5_VABI libwvoecUnknown20(void) { + NotImplemented_nid_no_patch("r7xDkk5xLdI"); + return 0; +} + +APS5_EXPORT("CDIN-FvbQSg", libwvoecUnknown21); +int APS5_VABI libwvoecUnknown21(void) { + NotImplemented_nid_no_patch("CDIN-FvbQSg"); + return 0; +} + +APS5_EXPORT("hSFn8QUSvCU", libwvoecUnknown22); +int APS5_VABI libwvoecUnknown22(void) { + NotImplemented_nid_no_patch("hSFn8QUSvCU"); + return 0; +} + +APS5_EXPORT("BGZzogSJRxU", libwvoecUnknown23); +int APS5_VABI libwvoecUnknown23(void) { + NotImplemented_nid_no_patch("BGZzogSJRxU"); + return 0; +} + +APS5_EXPORT("NshhytJGPD4", libwvoecUnknown24); +int APS5_VABI libwvoecUnknown24(void) { + NotImplemented_nid_no_patch("NshhytJGPD4"); + return 0; +} + +APS5_EXPORT("0CA-PN7E1fM", libwvoecUnknown25); +int APS5_VABI libwvoecUnknown25(void) { + NotImplemented_nid_no_patch("0CA-PN7E1fM"); + return 0; +} + +APS5_EXPORT("BHF3YlqkctM", libwvoecUnknown26); +int APS5_VABI libwvoecUnknown26(void) { + NotImplemented_nid_no_patch("BHF3YlqkctM"); + return 0; +} + +APS5_EXPORT("pLY4SEerlg0", libwvoecUnknown27); +int APS5_VABI libwvoecUnknown27(void) { + NotImplemented_nid_no_patch("pLY4SEerlg0"); + return 0; +} + +APS5_EXPORT("6TGQjt1WeZo", libwvoecUnknown28); +int APS5_VABI libwvoecUnknown28(void) { + NotImplemented_nid_no_patch("6TGQjt1WeZo"); + return 0; +} + +APS5_EXPORT("cBpzJltZFuA", libwvoecUnknown29); +int APS5_VABI libwvoecUnknown29(void) { + NotImplemented_nid_no_patch("cBpzJltZFuA"); + return 0; +} + +APS5_EXPORT("fq4fGfTW6O4", libwvoecUnknown30); +int APS5_VABI libwvoecUnknown30(void) { + NotImplemented_nid_no_patch("fq4fGfTW6O4"); + return 0; +} + +APS5_EXPORT("Dm2BCh2mVDk", libwvoecUnknown31); +int APS5_VABI libwvoecUnknown31(void) { + NotImplemented_nid_no_patch("Dm2BCh2mVDk"); + return 0; +} + +APS5_EXPORT("pzkRuNp+kmY", libwvoecUnknown32); +int APS5_VABI libwvoecUnknown32(void) { + NotImplemented_nid_no_patch("pzkRuNp+kmY"); + return 0; +} + +APS5_EXPORT("MoB5Tb8a9mo", libwvoecUnknown33); +int APS5_VABI libwvoecUnknown33(void) { + NotImplemented_nid_no_patch("MoB5Tb8a9mo"); + return 0; +} + +APS5_EXPORT("LMdXFonitRk", libwvoecUnknown34); +int APS5_VABI libwvoecUnknown34(void) { + NotImplemented_nid_no_patch("LMdXFonitRk"); + return 0; +} + +APS5_EXPORT("5oBY1cK2UsQ", libwvoecUnknown35); +int APS5_VABI libwvoecUnknown35(void) { + NotImplemented_nid_no_patch("5oBY1cK2UsQ"); + return 0; +} + +APS5_EXPORT("zBlS1dR2FGQ", libwvoecUnknown36); +int APS5_VABI libwvoecUnknown36(void) { + NotImplemented_nid_no_patch("zBlS1dR2FGQ"); + return 0; +} + +APS5_EXPORT("OjbK6YxSFXo", libwvoecUnknown37); +int APS5_VABI libwvoecUnknown37(void) { + NotImplemented_nid_no_patch("OjbK6YxSFXo"); + return 0; +} + +APS5_EXPORT("AkeLNBcal+U", libwvoecUnknown38); +int APS5_VABI libwvoecUnknown38(void) { + NotImplemented_nid_no_patch("AkeLNBcal+U"); + return 0; +} + +APS5_EXPORT("Z3ZA7x9a4tw", libwvoecUnknown39); +int APS5_VABI libwvoecUnknown39(void) { + NotImplemented_nid_no_patch("Z3ZA7x9a4tw"); + return 0; +} + +APS5_EXPORT("VLprdt-0Aao", libwvoecUnknown40); +int APS5_VABI libwvoecUnknown40(void) { + NotImplemented_nid_no_patch("VLprdt-0Aao"); + return 0; +} + +APS5_EXPORT("aLi8N-N4kNk", libwvoecUnknown41); +int APS5_VABI libwvoecUnknown41(void) { + NotImplemented_nid_no_patch("aLi8N-N4kNk"); + return 0; +} + +APS5_EXPORT("7vsNQoBvo74", libwvoecUnknown42); +int APS5_VABI libwvoecUnknown42(void) { + NotImplemented_nid_no_patch("7vsNQoBvo74"); + return 0; +} + +APS5_EXPORT("FK6Qr-bCNj0", libwvoecUnknown43); +int APS5_VABI libwvoecUnknown43(void) { + NotImplemented_nid_no_patch("FK6Qr-bCNj0"); + return 0; +} + +APS5_EXPORT("kDS5mER73ic", libwvoecUnknown44); +int APS5_VABI libwvoecUnknown44(void) { + NotImplemented_nid_no_patch("kDS5mER73ic"); + return 0; +} + +APS5_EXPORT("P-YXR6fzK5A", libwvoecUnknown45); +int APS5_VABI libwvoecUnknown45(void) { + NotImplemented_nid_no_patch("P-YXR6fzK5A"); + return 0; +} + +APS5_EXPORT("0rbBF7nqXew", libwvoecUnknown46); +int APS5_VABI libwvoecUnknown46(void) { + NotImplemented_nid_no_patch("0rbBF7nqXew"); + return 0; +} + +APS5_EXPORT("Tv9ZTo8IGFg", libwvoecUnknown47); +int APS5_VABI libwvoecUnknown47(void) { + NotImplemented_nid_no_patch("Tv9ZTo8IGFg"); + return 0; +} + +APS5_EXPORT("FCEFhIbzqEs", libwvoecUnknown48); +int APS5_VABI libwvoecUnknown48(void) { + NotImplemented_nid_no_patch("FCEFhIbzqEs"); + return 0; +} + +APS5_EXPORT("rNeKba16DaM", libwvoecUnknown49); +int APS5_VABI libwvoecUnknown49(void) { + NotImplemented_nid_no_patch("rNeKba16DaM"); + return 0; +} + +APS5_EXPORT("kAkhR+RPjQE", libwvoecUnknown50); +int APS5_VABI libwvoecUnknown50(void) { + NotImplemented_nid_no_patch("kAkhR+RPjQE"); + return 0; +} + +APS5_EXPORT("-z5ztb80zaE", libwvoecUnknown51); +int APS5_VABI libwvoecUnknown51(void) { + NotImplemented_nid_no_patch("-z5ztb80zaE"); + return 0; +} + +APS5_EXPORT("Byi-A+lb0hA", libwvoecUnknown52); +int APS5_VABI libwvoecUnknown52(void) { + NotImplemented_nid_no_patch("Byi-A+lb0hA"); + return 0; +} + +APS5_EXPORT("6Z4FHLOZepk", libwvoecUnknown53); +int APS5_VABI libwvoecUnknown53(void) { + NotImplemented_nid_no_patch("6Z4FHLOZepk"); + return 0; +} + +APS5_EXPORT("ySlRgaNjjFA", libwvoecUnknown54); +int APS5_VABI libwvoecUnknown54(void) { + NotImplemented_nid_no_patch("ySlRgaNjjFA"); + return 0; +} + +APS5_EXPORT("o737y0mbCHA", libwvoecUnknown55); +int APS5_VABI libwvoecUnknown55(void) { + NotImplemented_nid_no_patch("o737y0mbCHA"); + return 0; +} + +APS5_EXPORT("CxShaqMVqoQ", libwvoecUnknown56); +int APS5_VABI libwvoecUnknown56(void) { + NotImplemented_nid_no_patch("CxShaqMVqoQ"); + return 0; +} + +APS5_EXPORT("-osjYV1Uf4c", libwvoecUnknown57); +int APS5_VABI libwvoecUnknown57(void) { + NotImplemented_nid_no_patch("-osjYV1Uf4c"); + return 0; +} + +APS5_EXPORT("JYtE-rz6tqQ", libwvoecUnknown58); +int APS5_VABI libwvoecUnknown58(void) { + NotImplemented_nid_no_patch("JYtE-rz6tqQ"); + return 0; +} + +APS5_EXPORT("admHY7-DdfM", libwvoecUnknown59); +int APS5_VABI libwvoecUnknown59(void) { + NotImplemented_nid_no_patch("admHY7-DdfM"); + return 0; +} + +APS5_EXPORT("qqLs3qcv0E4", libwvoecUnknown60); +int APS5_VABI libwvoecUnknown60(void) { + NotImplemented_nid_no_patch("qqLs3qcv0E4"); + return 0; +} + +APS5_EXPORT("nrXx1ceEYJw", libwvoecUnknown61); +int APS5_VABI libwvoecUnknown61(void) { + NotImplemented_nid_no_patch("nrXx1ceEYJw"); + return 0; +} + +APS5_EXPORT("qrcnLk13+YE", libwvoecUnknown62); +int APS5_VABI libwvoecUnknown62(void) { + NotImplemented_nid_no_patch("qrcnLk13+YE"); + return 0; +} + +APS5_EXPORT("cIgfFv5Ic9o", libwvoecUnknown63); +int APS5_VABI libwvoecUnknown63(void) { + NotImplemented_nid_no_patch("cIgfFv5Ic9o"); + return 0; +} + +APS5_EXPORT("0coHZeBzV+g", libwvoecUnknown64); +int APS5_VABI libwvoecUnknown64(void) { + NotImplemented_nid_no_patch("0coHZeBzV+g"); + return 0; +} + +APS5_EXPORT("uIKei3uZEaw", libwvoecUnknown65); +int APS5_VABI libwvoecUnknown65(void) { + NotImplemented_nid_no_patch("uIKei3uZEaw"); + return 0; +} + +APS5_EXPORT("GRxL6xQTVXU", libwvoecUnknown66); +int APS5_VABI libwvoecUnknown66(void) { + NotImplemented_nid_no_patch("GRxL6xQTVXU"); + return 0; +} + +APS5_EXPORT("gMJlV+Ux00Q", libwvoecUnknown67); +int APS5_VABI libwvoecUnknown67(void) { + NotImplemented_nid_no_patch("gMJlV+Ux00Q"); + return 0; +} + +APS5_EXPORT("EZ0XkpUyfAQ", libwvoecUnknown68); +int APS5_VABI libwvoecUnknown68(void) { + NotImplemented_nid_no_patch("EZ0XkpUyfAQ"); + return 0; +} + +APS5_EXPORT("J4MquGepYbA", libwvoecUnknown69); +int APS5_VABI libwvoecUnknown69(void) { + NotImplemented_nid_no_patch("J4MquGepYbA"); + return 0; +} + +APS5_EXPORT("iA0-DsNw4ro", libwvoecUnknown70); +int APS5_VABI libwvoecUnknown70(void) { + NotImplemented_nid_no_patch("iA0-DsNw4ro"); + return 0; +} + +APS5_EXPORT("a7Uh2ufp0aU", libwvoecUnknown71); +int APS5_VABI libwvoecUnknown71(void) { + NotImplemented_nid_no_patch("a7Uh2ufp0aU"); + return 0; +} + +APS5_EXPORT("TfYgAmW8p3g", libwvoecUnknown72); +int APS5_VABI libwvoecUnknown72(void) { + NotImplemented_nid_no_patch("TfYgAmW8p3g"); + return 0; +} + +APS5_EXPORT("gN9IbyVDLtE", libwvoecUnknown73); +int APS5_VABI libwvoecUnknown73(void) { + NotImplemented_nid_no_patch("gN9IbyVDLtE"); + return 0; +} + +APS5_EXPORT("ibCRnWIZpfY", libwvoecUnknown74); +int APS5_VABI libwvoecUnknown74(void) { + NotImplemented_nid_no_patch("ibCRnWIZpfY"); + return 0; +} + +APS5_EXPORT("GoFHl8EySJ8", libwvoecUnknown75); +int APS5_VABI libwvoecUnknown75(void) { + NotImplemented_nid_no_patch("GoFHl8EySJ8"); + return 0; +} + +APS5_EXPORT("dDdHLl1jZjk", libwvoecUnknown76); +int APS5_VABI libwvoecUnknown76(void) { + NotImplemented_nid_no_patch("dDdHLl1jZjk"); + return 0; +} + +} diff --git a/core/libs/prx/libwvoec/include/Api.hpp b/core/libs/prx/libwvoec/include/Api.hpp new file mode 100644 index 0000000000..311df5480d --- /dev/null +++ b/core/libs/prx/libwvoec/include/Api.hpp @@ -0,0 +1,85 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libwvoecUnknown00(void); +int APS5_VABI libwvoecUnknown01(void); +int APS5_VABI libwvoecUnknown02(void); +int APS5_VABI libwvoecUnknown03(void); +int APS5_VABI libwvoecUnknown04(void); +int APS5_VABI libwvoecUnknown05(void); +int APS5_VABI libwvoecUnknown06(void); +int APS5_VABI libwvoecUnknown07(void); +int APS5_VABI libwvoecUnknown08(void); +int APS5_VABI libwvoecUnknown09(void); +int APS5_VABI libwvoecUnknown10(void); +int APS5_VABI libwvoecUnknown11(void); +int APS5_VABI libwvoecUnknown12(void); +int APS5_VABI libwvoecUnknown13(void); +int APS5_VABI libwvoecUnknown14(void); +int APS5_VABI libwvoecUnknown15(void); +int APS5_VABI libwvoecUnknown16(void); +int APS5_VABI libwvoecUnknown17(void); +int APS5_VABI libwvoecUnknown18(void); +int APS5_VABI libwvoecUnknown19(void); +int APS5_VABI libwvoecUnknown20(void); +int APS5_VABI libwvoecUnknown21(void); +int APS5_VABI libwvoecUnknown22(void); +int APS5_VABI libwvoecUnknown23(void); +int APS5_VABI libwvoecUnknown24(void); +int APS5_VABI libwvoecUnknown25(void); +int APS5_VABI libwvoecUnknown26(void); +int APS5_VABI libwvoecUnknown27(void); +int APS5_VABI libwvoecUnknown28(void); +int APS5_VABI libwvoecUnknown29(void); +int APS5_VABI libwvoecUnknown30(void); +int APS5_VABI libwvoecUnknown31(void); +int APS5_VABI libwvoecUnknown32(void); +int APS5_VABI libwvoecUnknown33(void); +int APS5_VABI libwvoecUnknown34(void); +int APS5_VABI libwvoecUnknown35(void); +int APS5_VABI libwvoecUnknown36(void); +int APS5_VABI libwvoecUnknown37(void); +int APS5_VABI libwvoecUnknown38(void); +int APS5_VABI libwvoecUnknown39(void); +int APS5_VABI libwvoecUnknown40(void); +int APS5_VABI libwvoecUnknown41(void); +int APS5_VABI libwvoecUnknown42(void); +int APS5_VABI libwvoecUnknown43(void); +int APS5_VABI libwvoecUnknown44(void); +int APS5_VABI libwvoecUnknown45(void); +int APS5_VABI libwvoecUnknown46(void); +int APS5_VABI libwvoecUnknown47(void); +int APS5_VABI libwvoecUnknown48(void); +int APS5_VABI libwvoecUnknown49(void); +int APS5_VABI libwvoecUnknown50(void); +int APS5_VABI libwvoecUnknown51(void); +int APS5_VABI libwvoecUnknown52(void); +int APS5_VABI libwvoecUnknown53(void); +int APS5_VABI libwvoecUnknown54(void); +int APS5_VABI libwvoecUnknown55(void); +int APS5_VABI libwvoecUnknown56(void); +int APS5_VABI libwvoecUnknown57(void); +int APS5_VABI libwvoecUnknown58(void); +int APS5_VABI libwvoecUnknown59(void); +int APS5_VABI libwvoecUnknown60(void); +int APS5_VABI libwvoecUnknown61(void); +int APS5_VABI libwvoecUnknown62(void); +int APS5_VABI libwvoecUnknown63(void); +int APS5_VABI libwvoecUnknown64(void); +int APS5_VABI libwvoecUnknown65(void); +int APS5_VABI libwvoecUnknown66(void); +int APS5_VABI libwvoecUnknown67(void); +int APS5_VABI libwvoecUnknown68(void); +int APS5_VABI libwvoecUnknown69(void); +int APS5_VABI libwvoecUnknown70(void); +int APS5_VABI libwvoecUnknown71(void); +int APS5_VABI libwvoecUnknown72(void); +int APS5_VABI libwvoecUnknown73(void); +int APS5_VABI libwvoecUnknown74(void); +int APS5_VABI libwvoecUnknown75(void); +int APS5_VABI libwvoecUnknown76(void); + +} diff --git a/core/libs/prx/libwvoec/libwvoec.hpp b/core/libs/prx/libwvoec/libwvoec.hpp new file mode 100644 index 0000000000..d625c15ef3 --- /dev/null +++ b/core/libs/prx/libwvoec/libwvoec.hpp @@ -0,0 +1,3 @@ +#pragma once + +#include "prx/libwvoec/include/Api.hpp" diff --git a/core/libs/prx/ulobjmgr/Export.cpp b/core/libs/prx/ulobjmgr/Export.cpp index 31328f15db..c9e84b289b 100644 --- a/core/libs/prx/ulobjmgr/Export.cpp +++ b/core/libs/prx/ulobjmgr/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/ulobjmgr/include/InventoryExports.hpp" #include "prx/ulobjmgr/include/Api.hpp" #include #include @@ -33,3 +35,17 @@ int APS5_VABI _sceUlobjmgrUnregisterObject_nid_postfix(std::uint32_t id) { } } + +extern "C" { + +int APS5_VABI ulobjmgrUnknown_HZ9Q2c_plus_4BU4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HZ9Q2c+4BU4", ulobjmgrUnknown_HZ9Q2c_plus_4BU4_nid_no_patch); + +int APS5_VABI ulobjmgrUnknown_SweJO7t3pkk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SweJO7t3pkk", ulobjmgrUnknown_SweJO7t3pkk_nid_no_patch); + +} diff --git a/core/libs/prx/ulobjmgr/include/InventoryExports.hpp b/core/libs/prx/ulobjmgr/include/InventoryExports.hpp new file mode 100644 index 0000000000..ca85db1a5c --- /dev/null +++ b/core/libs/prx/ulobjmgr/include/InventoryExports.hpp @@ -0,0 +1,10 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI ulobjmgrUnknown_HZ9Q2c_plus_4BU4_nid_no_patch(); +int APS5_VABI ulobjmgrUnknown_SweJO7t3pkk_nid_no_patch(); + +} diff --git a/core/libs/prx/ulobjmgr/ulobjmgr.hpp b/core/libs/prx/ulobjmgr/ulobjmgr.hpp index 3a6f8594df..90b9841f69 100644 --- a/core/libs/prx/ulobjmgr/ulobjmgr.hpp +++ b/core/libs/prx/ulobjmgr/ulobjmgr.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/ulobjmgr/include/Api.hpp" +#include "prx/ulobjmgr/include/InventoryExports.hpp" diff --git a/core/libs/tests/FilePosition.cpp b/core/libs/tests/FilePosition.cpp index 9bd695cc15..50fcb3006c 100644 --- a/core/libs/tests/FilePosition.cpp +++ b/core/libs/tests/FilePosition.cpp @@ -1,6 +1,7 @@ #include "prx/libc/include/Api.hpp" #include "prx/libc/include/FileStream.hpp" #include "prx/libc/include/general/VabiMacros.hpp" +#include "tests/TemporaryFile.hpp" #include #include #include @@ -21,8 +22,23 @@ static void Check(bool value, int line) { } #define Require(value) Check((value), __LINE__) +static void CheckFseekBounds() { + FileStream file(TemporaryFile::Open()); + Require(fwrite_nid_postfix("0123456789", 1, 10, &file) == 10); + rewind_nid_postfix(&file); + errno = 0; + Require(fseek_nid_postfix(&file, -1, SEEK_SET) == -1 && errno == EINVAL); + Require(ftello_nid_postfix(&file) == 0); + Require(fseek_nid_postfix(&file, -3, SEEK_END) == 0 && ftello_nid_postfix(&file) == 7); + Require(fgetc_nid_postfix(&file) == '7'); + Require(fseek_nid_postfix(&file, 100, SEEK_SET) == 0 && ftello_nid_postfix(&file) == 100); + Require(fgetc_nid_postfix(&file) == EOF && feof_nid_postfix(&file) != 0); + file.Close(); +} + int main() { - FileStream file(std::tmpfile()); + CheckFseekBounds(); + FileStream file(TemporaryFile::Open()); Require(std::fputs("position", file.GetHandle()) >= 0); std::int64_t position = -1; Require(fgetpos_nid_postfix(&file, &position) == 0); diff --git a/core/libs/tests/FileStreamStatus.cpp b/core/libs/tests/FileStreamStatus.cpp index edf8b3efd8..ac9fc5bf2e 100644 --- a/core/libs/tests/FileStreamStatus.cpp +++ b/core/libs/tests/FileStreamStatus.cpp @@ -1,4 +1,5 @@ #include "prx/libc/include/FileStream.hpp" +#include "tests/TemporaryFile.hpp" #include #include #include @@ -6,7 +7,7 @@ #include int main() { - auto* native = std::tmpfile(); + auto* native = TemporaryFile::Open(); if (!native) return 1; FileStream stream(native); stream.MarkDirectory(); diff --git a/core/libs/tests/FileStreams.cpp b/core/libs/tests/FileStreams.cpp index 597b166790..8a0603b2e0 100644 --- a/core/libs/tests/FileStreams.cpp +++ b/core/libs/tests/FileStreams.cpp @@ -1,7 +1,10 @@ #include "prx/libc/include/Api.hpp" #include "prx/libc/include/FileStream.hpp" #include "prx/libc/include/general/VabiMacros.hpp" +#include "tests/TemporaryFile.hpp" #include +#include +#include #include #include #include @@ -128,7 +131,7 @@ static void CheckShortCharacterScanLocking() { constexpr std::size_t bytes = 1u << 20; using Scanner = int (APS5_VABI*)(FileStream*, const char*, ...); for (const Scanner scan : {fscanf_s_nid_postfix, ScanShortCharacterList}) { - auto* native = std::tmpfile(); + auto* native = TemporaryFile::Open(); Require(native != nullptr); const std::vector input(bytes, 'a'); Require(std::fwrite(input.data(), 1, input.size(), native) == input.size()); @@ -177,7 +180,7 @@ static void CheckShortCharacterScans() { for (const unsigned width : {1u, 2u, 8u}) { const auto taken = std::min(input.size(), width); for (const bool suppress : {false, true}) { - auto* native = std::tmpfile(); + auto* native = TemporaryFile::Open(); Require(native != nullptr && std::fwrite(input.data(), 1, input.size(), native) == input.size()); std::rewind(native); FileStream stream(native); @@ -217,6 +220,53 @@ static int APS5_VABI ScanList(FileStream* stream, const char* format, ...) { return result; } +static void CheckScanInputFailureErrno(const std::string& path) { + const int savedError = errno; + for (const bool variadicList : {false, true}) { + for (const int seed : {0, 22, 97}) { + for (const char* input : {"", " "}) { + for (const char* format : {"%d", "%*d"}) { + auto* native = TemporaryFile::Open(); + Require(native != nullptr); + Require(std::fwrite(input, 1, std::strlen(input), native) == std::strlen(input)); + std::rewind(native); + FileStream stream(native); + int value = 123; + errno = seed; + const int result = variadicList ? ScanList(&stream, format, &value) : fscanf_nid_postfix(&stream, format, &value); + Require(result == EOF && errno == seed, "Stream scan input exhaustion changed errno"); + Require(value == 123 && feof_nid_postfix(&stream) != 0 && ferror_nid_postfix(&stream) == 0); + Require(std::fclose(native) == 0); + } + } + } +#if defined(__GLIBC__) + auto* errorNative = TemporaryFile::Open(); + Require(errorNative != nullptr); + const int writeOnly = ::open(path.c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0600); + Require(writeOnly >= 0); + Require(::dup2(writeOnly, ::fileno(errorNative)) >= 0 && ::close(writeOnly) == 0); + FileStream readError(errorNative); + int unchanged = 123; + errno = 97; + const int failed = variadicList ? ScanList(&readError, "%d", &unchanged) : fscanf_nid_postfix(&readError, "%d", &unchanged); + Require(failed == EOF && errno != 97, "Stream scan lost its read error"); + Require(unchanged == 123 && ferror_nid_postfix(&readError) != 0, "Stream scan did not keep its read error indicator"); + Require(std::fclose(errorNative) == 0 && std::remove(path.c_str()) == 0); +#endif + auto* native = TemporaryFile::Open(); + Require(native != nullptr && std::fputs("1e99999", native) >= 0); + std::rewind(native); + FileStream stream(native); + float value = 0; + errno = 97; + const int result = variadicList ? ScanList(&stream, "%f", &value) : fscanf_nid_postfix(&stream, "%f", &value); + Require(result == 1 && errno == ERANGE, "Stream scan lost its conversion range error"); + Require(std::fclose(native) == 0); + } + errno = savedError; +} + static std::string ReadWhole(const std::string& path) { auto* stream = fopen_nid_postfix(path.c_str(), "rb"); Require(stream != nullptr); @@ -226,6 +276,49 @@ static std::string ReadWhole(const std::string& path) { return std::string(buffer.data(), size); } +#if defined(__clang__) && !defined(_WIN32) +#define __builtin_sysv_va_list va_list +#define __builtin_sysv_va_start va_start +#define __builtin_sysv_va_end va_end +#endif + +static int APS5_VABI ScanSafeList(FileStream* stream, const char* format, ...) { + __builtin_sysv_va_list args; + __builtin_sysv_va_start(args, format); + const int result = vfscanf_s_nid_postfix(stream, format, reinterpret_cast(args)); + __builtin_sysv_va_end(args); + return result; +} + +static void CheckCharacterScanLengths() { + using Scanner = int (APS5_VABI*)(FileStream*, const char*, ...); + const Scanner scanners[]{fscanf_nid_postfix, ScanList, fscanf_s_nid_postfix, ScanSafeList}; + for (std::size_t api = 0; api < std::size(scanners); ++api) { +#ifdef _WIN32 + if (api < 2) continue; +#endif + for (const char* length : {"hh", "h", "ll", "j", "z", "t", "L"}) { + for (const char* conversion : {"s", "c", "[a-z]"}) { + auto* native = TemporaryFile::Open(); + Require(native != nullptr && std::fputs("ab", native) >= 0); + std::rewind(native); + FileStream stream(native); + std::array output; + output.fill('Z'); + int consumed = -1; + const std::string format = std::string("%2") + length + conversion + "%n"; + const auto scan = scanners[api]; + const int result = api >= 2 ? scan(&stream, format.c_str(), output.data(), 32u, &consumed) : scan(&stream, format.c_str(), output.data(), &consumed); + Require(result == 1 && consumed == 2, "Stream character scan ignored-length consumption"); + const bool single = conversion[0] == 'c'; + Require(output[0] == 'a' && output[1] == 'b' && (single || output[2] == 0), "Stream character scan ignored length stored wide data"); + Require(std::all_of(output.begin() + (single ? 2 : 3), output.end(), [](char value) { return value == 'Z'; })); + Require(std::fclose(native) == 0); + } + } + } +} + template static void CheckReadAfterWrite(const std::string& path, const char* mode, const char* expected, TRead read) { auto* stream = fopen_nid_postfix(path.c_str(), "wb"); @@ -239,6 +332,7 @@ static void CheckReadAfterWrite(const std::string& path, const char* mode, const } static void CheckUpdateStreamReadsAfterWrites(const std::string& base) { + CheckScanInputFailureErrno(base + ".scan-error"); const std::string path = base + ".update"; constexpr char overwritten[] = "AB23456789"; CheckReadAfterWrite(path, "r+b", overwritten, [](FileStream* stream) { @@ -307,6 +401,7 @@ static void CheckWriteAfterRead(const std::string& path, const char* mode, const } static void CheckStreamWritesAfterReads(const std::string& base) { + CheckCharacterScanLengths(); const std::string path = base + ".written"; constexpr char appended[] = "0123456789XY"; #if defined(__GLIBC__) @@ -425,7 +520,7 @@ int main(int argc, char** argv) { Require(fclose_nid_postfix(stream) == 0); ExpectException([] { fputs_nid_postfix("invalid stream", nullptr); }); ExpectException([] { fopen_nid_postfix(nullptr, "r"); }); - FileStream closed(std::tmpfile()); + FileStream closed(TemporaryFile::Open()); closed.Close(); Require(fflush_nid_postfix(&closed) == -1 && errno == 9); Require(std::remove(argv[1]) == 0); diff --git a/core/libs/tests/Formatting.cpp b/core/libs/tests/Formatting.cpp index 468005d4d2..87e27c19cd 100644 --- a/core/libs/tests/Formatting.cpp +++ b/core/libs/tests/Formatting.cpp @@ -5,6 +5,8 @@ #include "prx/libc/include/ScanQuadLength.hpp" #include #include +#include +#include #include #include #include @@ -67,6 +69,41 @@ static int APS5_VABI ScanListS(const char* buffer, const char* format, ...) { return result; } +static void CheckCharacterScanLengths() { + const auto check = [](bool condition, const char* message = "Character scan length check failed") { + if (!condition) throw std::runtime_error(message); + }; + using Scanner = int (APS5_VABI*)(const char*, const char*, ...); + const Scanner scanners[]{sscanf_nid_postfix, ScanList, sscanf_s_nid_postfix, ScanListS}; + for (std::size_t api = 0; api < std::size(scanners); ++api) { + const auto scan = scanners[api]; + const bool secure = api >= 2; +#ifdef _WIN32 + if (!secure) continue; +#endif + for (const char* length : {"hh", "h", "ll", "j", "z", "t", "L"}) { + for (const char* conversion : {"s", "c", "[a-z]"}) { + const std::string format = std::string("%2") + length + conversion + "%n"; + std::array output; + output.fill('Z'); + int consumed = -1; + const int result = secure ? scan("ab", format.c_str(), output.data(), 32u, &consumed) : scan("ab", format.c_str(), output.data(), &consumed); + check(result == 1 && consumed == 2, "Character scan ignored-length consumption"); + const bool single = conversion[0] == 'c'; + check(output[0] == 'a' && output[1] == 'b' && (single || output[2] == '\0'), "Character scan ignored length stored wide data"); + check(std::all_of(output.begin() + (single ? 2 : 3), output.end(), [](char value) { return value == 'Z'; }), "Character scan changed its destination guard"); + } + } + for (const auto& example : {std::pair{"%lls", "%5[%lls]%n"}, std::pair{"% ab", "%% %2lls%n"}}) { + std::array output{}; + int consumed = -1; + const int result = secure ? scan(example.first, example.second, output.data(), 32u, &consumed) : scan(example.first, example.second, output.data(), &consumed); + check(result == 1 && consumed == 4); + check(std::strcmp(output.data(), example.first[1] == ' ' ? "ab" : "%lls") == 0, "Character scan normalization changed a literal or scanset"); + } + } +} + static int APS5_VABI PrintList(const char* format, ...) { __builtin_sysv_va_list args; __builtin_sysv_va_start(args, format); @@ -78,6 +115,7 @@ static int APS5_VABI PrintList(const char* format, ...) { } static void CheckIgnoredLengths() { + CheckCharacterScanLengths(); char output[96]; Require(snprintf_nid_postfix(output, sizeof(output), "%Ld|%Lx|%Lu|%Lo", -1985229329, 0x89abcdefu, 0x89abcdefu, 0x89abcdefu) == 43 && std::strcmp(output, "-1985229329|89abcdef|2309737967|21152746757") == 0); diff --git a/core/libs/tests/GuestAcm.cpp b/core/libs/tests/GuestAcm.cpp index bce7fb869e..366cf3764b 100644 --- a/core/libs/tests/GuestAcm.cpp +++ b/core/libs/tests/GuestAcm.cpp @@ -288,6 +288,25 @@ int main() { outputA.channelCount = 3; Require(reverb(1, reverbFilters, reverbOutputs) == BadPointer); Require(reverbBatch.offset == 0 && reverbBatch.buffer_size == sizeof(reverbCommands)); + commandBatch = {commands, 0, sizeof(commands)}; + std::memset(commands, 0xCC, sizeof(commands)); + Require(sceAcmBatchJobPriority(nullptr, 0) == BadPointer); + Require(sceAcmBatchJobPriority(&commandBatch, 4) == BadPointer && commandBatch.offset == 0); + Require(sceAcmBatchJobPriority(&commandBatch, 0xFFFFFFFFu) == BadPointer && commandBatch.offset == 0); + Require(sceAcmBatchJobPriority(&commandBatch, 3) == 0 && commandBatch.offset == 8); + Require(sceAcmBatchJobPriority(&commandBatch, 0) == 0 && commandBatch.offset == 16 && commandBatch.buffer_size == sizeof(commands)); + std::uint64_t priorityWords[3]; + std::memcpy(priorityWords, commands, sizeof(priorityWords)); + Require(priorityWords[0] == 0x310 && priorityWords[1] == 0x10 && priorityWords[2] == 0xCCCCCCCCCCCCCCCCull); + commandBatch = {commands, sizeof(commands) - 7, sizeof(commands)}; + Require(sceAcmBatchJobPriority(&commandBatch, 1) == static_cast(0x81940009) && commandBatch.offset == sizeof(commands) - 7); + Require(sceAcmBatchJobPriority(&commandBatch, 4) == BadPointer && commandBatch.offset == sizeof(commands) - 7); + commandBatch = {commands, sizeof(commands) + 8, sizeof(commands)}; + Require(sceAcmBatchJobPriority(&commandBatch, 1) == static_cast(0x81940009) && commandBatch.offset == sizeof(commands) + 8); + commandBatch = {commands, sizeof(commands) - 8, sizeof(commands)}; + Require(sceAcmBatchJobPriority(&commandBatch, 1) == 0 && commandBatch.offset == sizeof(commands)); + std::memcpy(priorityWords, commands + sizeof(commands) - 8, sizeof(std::uint64_t)); + Require(priorityWords[0] == 0x110); Require(sceAcmContextDestroy(context1) == 0); Require(sceAcmContextDestroy(context1) == BadContext); diff --git a/core/libs/tests/GuestAllocatorFailures.cpp b/core/libs/tests/GuestAllocatorFailures.cpp index f38e1a1e2d..7e808ea040 100644 --- a/core/libs/tests/GuestAllocatorFailures.cpp +++ b/core/libs/tests/GuestAllocatorFailures.cpp @@ -84,6 +84,56 @@ void* expectBlock(const char* what, TCall call) { } +static void CheckCallocAndReallocContents() { + auto* dirty = static_cast(malloc_nid_postfix(64)); + if (dirty == nullptr) { + report("malloc(64)", "returned NULL"); + return; + } + std::memset(dirty, 0xab, 64); + free_nid_postfix(dirty); + const auto zeroed = [](const char* what, std::size_t count, std::size_t size) { + auto* block = static_cast(calloc_nid_postfix(count, size)); + if (block == nullptr) { + report(what, "returned NULL"); + return; + } + if (std::any_of(block, block + count * size, [](unsigned char byte) { return byte != 0; })) report(what, "returned bytes that are not zero"); + free_nid_postfix(block); + }; + zeroed("calloc(8, 8)", 8, 8); + zeroed("calloc(16, 4)", 16, 4); + + auto* block = static_cast(malloc_nid_postfix(24)); + if (block == nullptr) { + report("malloc(24)", "returned NULL"); + return; + } + for (std::size_t index = 0; index < 24; ++index) block[index] = static_cast(index + 1); + auto* grown = static_cast(realloc_nid_postfix(block, 200)); + if (grown == nullptr) { + report("realloc(block, 200)", "returned NULL"); + free_nid_postfix(block); + return; + } + for (std::size_t index = 0; index < 24; ++index) { + if (grown[index] != index + 1) report("realloc(block, 200)", "did not keep the first 24 bytes"); + } + auto* shrunk = static_cast(realloc_nid_postfix(grown, 8)); + if (shrunk == nullptr) { + report("realloc(block, 8)", "returned NULL"); + free_nid_postfix(grown); + return; + } + for (std::size_t index = 0; index < 8; ++index) { + if (shrunk[index] != index + 1) report("realloc(block, 8)", "did not keep the first 8 bytes"); + } + free_nid_postfix(shrunk); + void* fresh = realloc_nid_postfix(nullptr, 32); + if (fresh == nullptr || malloc_usable_size_nid_postfix(fresh) < 32) report("realloc(NULL, 32)", "did not return a block of at least 32 bytes"); + free_nid_postfix(fresh); +} + int main() { void* api[10]{}; ApplicationHeapRegister_nid_no_patch(api); @@ -250,6 +300,7 @@ int main() { free_nid_postfix(expectBlock("calloc(3, 5)", [] { return calloc_nid_postfix(3, 5); })); free_nid_postfix(expectBlock("calloc(0, 5)", [] { return calloc_nid_postfix(0, 5); })); + CheckCallocAndReallocContents(); free_nid_postfix(expectBlock("aligned_alloc(128, 1)", [] { return aligned_alloc_nid_postfix(128, 1); })); free_nid_postfix(expectBlock("memalign(4096, 1)", [] { return memalign_nid_postfix(4096, 1); })); void* first = expectBlock("malloc(0)", [] { return malloc_nid_postfix(0); }); diff --git a/core/libs/tests/GuestAmprDivAndBufferSize.cpp b/core/libs/tests/GuestAmprDivAndBufferSize.cpp new file mode 100644 index 0000000000..8d3d4376d5 --- /dev/null +++ b/core/libs/tests/GuestAmprDivAndBufferSize.cpp @@ -0,0 +1,23 @@ +#include "prx/libSceAmpr/include/Api.hpp" + +#include +#include +#include +#include + +static void Require(bool value) { + if (value) return; + std::fputs("Ampr command buffer size check failed\n", stderr); + std::abort(); +} + +int main() { + Require(sceAmprCommandBufferGetSize(nullptr) == 0); + + alignas(64) std::array storage{}; + Apr::CommandBufferObject buffer{}; + Require(sceAmprCommandBufferConstructor(&buffer) == 0); + Require(sceAmprCommandBufferSetBuffer(&buffer, storage.data(), storage.size()) == 0); + Require(sceAmprCommandBufferGetSize(&buffer) == storage.size()); + return 0; +} diff --git a/core/libs/tests/GuestAppContentLicense.cpp b/core/libs/tests/GuestAppContentLicense.cpp new file mode 100644 index 0000000000..5da2765a3c --- /dev/null +++ b/core/libs/tests/GuestAppContentLicense.cpp @@ -0,0 +1,108 @@ +#include "prx/libSceAppContent/include/Api.hpp" +#include "SceTypes.hpp" +#include "ProcessParametersFixture.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#else +#include +#endif + +namespace { + +constexpr int NotInitialized = static_cast(0x80D90001u); +constexpr int Parameter = static_cast(0x80D90002u); +constexpr int NotFound = static_cast(0x80D90005u); +constexpr std::uint32_t Untouched = 0x5a5a5a5au; + +using CheckBundleLicenseFn = int (APS5_VABI*)(std::uint32_t, const NpUnifiedEntitlementLabel*); +using GetGameTrialsFlagFn = int (APS5_VABI*)(std::uint32_t*); +using GetPlayableStatusFn = int (APS5_VABI*)(std::uint32_t, const NpUnifiedEntitlementLabel*, std::uint32_t*); + +template +Function Resolve(const char* name) { +#ifdef _WIN32 + void* symbol = reinterpret_cast(GetProcAddress(LoadLibraryA("libSceAppContent.prx"), name)); +#else + void* symbol = dlsym(RTLD_DEFAULT, name); +#endif + if (!symbol) { + std::fprintf(stderr, "%s is not exported by libSceAppContent\n", name); + std::abort(); + } + return reinterpret_cast(symbol); +} + +void Require(bool condition, const char* message) { + if (condition) return; + std::fprintf(stderr, "AppContent license: %s\n", message); + std::abort(); +} + +} + +int main() { + static std::array process{}; + Require(ProcessParametersFixture::Install(process.data(), process.size()), "the process parameters could not be installed"); + std::uint32_t sdkVersion = 0x03500000; + std::memcpy(process.data() + 16, &sdkVersion, sizeof(sdkVersion)); + + const auto checkBundleLicense = Resolve("sceAppContentCheckBundleLicenseOnDisc"); + const auto getGameTrialsFlag = Resolve("sceAppContentGetGameTrialsFlag"); + const auto getPlayableStatus = Resolve("sceAppContentGetPlayableStatus"); + + NpUnifiedEntitlementLabel label{}; + std::memcpy(label.data, "TESTADDON0000001", 17); + std::uint32_t flag = Untouched; + std::uint32_t status = Untouched; + Require(checkBundleLicense(0, &label) == NotInitialized, "the bundle license was checked before initialization"); + Require(getGameTrialsFlag(&flag) == NotInitialized && flag == Untouched, "the game trials flag was read before initialization"); + Require(getPlayableStatus(0, &label, &status) == NotInitialized && status == Untouched, "the playable status was read before initialization"); + + const auto original = std::filesystem::current_path(); + const auto directory = original / ("appcontent-license-test-" + std::to_string(std::chrono::steady_clock::now().time_since_epoch().count())); + Require(std::filesystem::create_directory(directory), "the test directory could not be created"); + std::filesystem::current_path(directory); + std::filesystem::create_directories("app0/sce_sys"); + { + std::ofstream param("app0/sce_sys/param.json", std::ios::binary); + param << R"({"titleId":"PPSA00000","localizedParameters":{"en-US":{"titleName":"Example"}},"downloadDataSize":0})"; + Require(static_cast(param), "param.json could not be written"); + } + AppContentInitParam init{}; + AppContentBootParam boot{}; + Require(sceAppContentInitialize(&init, &boot) == 0, "the library could not be initialized"); + + Require(checkBundleLicense(0, &label) == NotFound && checkBundleLicense(7, &label) == NotFound, "a bundle license was found for unknown content"); + Require(checkBundleLicense(0, nullptr) == Parameter, "a null label was taken by the bundle license check"); + Require(getGameTrialsFlag(&flag) == 0 && flag == 0, "the game trials flag was not 0"); + Require(getGameTrialsFlag(nullptr) == Parameter, "a null game trials flag was taken"); + Require(getPlayableStatus(0, &label, &status) == NotFound && getPlayableStatus(7, &label, &status) == NotFound && status == Untouched, "a playable status was given for unknown content"); + Require(getPlayableStatus(0, nullptr, &status) == Parameter && getPlayableStatus(0, &label, nullptr) == Parameter && status == Untouched, "a null argument was taken by the playable status"); + + for (const std::uint32_t version : {0x014fffffu, 0x01500000u, 0x034fffffu, 0x03500000u}) { + std::memcpy(process.data() + 16, &version, sizeof(version)); + for (char& padding : label.padding) { + padding = 1; + Require(checkBundleLicense(0, &label) == (version >= 0x03500000 ? Parameter : NotFound), "a padded label was not checked from SDK 0x03500000 by the bundle license check"); + Require(getPlayableStatus(0, &label, &status) == (version >= 0x03500000 ? Parameter : NotFound) && status == Untouched, "a padded label was not checked from SDK 0x03500000 by the playable status"); + padding = 0; + } + } + + std::filesystem::current_path(original); + std::filesystem::remove_all(directory); + std::puts("AppContent license and trials tests passed"); + return 0; +} diff --git a/core/libs/tests/GuestAppInfo.cpp b/core/libs/tests/GuestAppInfo.cpp index cc0566661d..59c07bcff8 100644 --- a/core/libs/tests/GuestAppInfo.cpp +++ b/core/libs/tests/GuestAppInfo.cpp @@ -113,6 +113,7 @@ int main(int argc, char** argv) { std::filesystem::remove_all(sfo); Require(sceKernelUuidCreate(nullptr) == SCE_KERNEL_ERROR_EINVAL); + Require(sceKernelUuidCreate(reinterpret_cast(0x10)) == SCE_KERNEL_ERROR_EFAULT); std::uint32_t first[4]{}; std::uint32_t second[4]{}; Require(sceKernelUuidCreate(first) == 0 && sceKernelUuidCreate(second) == 0); @@ -120,6 +121,7 @@ int main(int argc, char** argv) { Require(std::memcmp(first, second, sizeof(first)) != 0); Require(sceKernelCreateUuidV4(nullptr) == SCE_KERNEL_ERROR_EINVAL); + Require(sceKernelCreateUuidV4(reinterpret_cast(0x10)) == SCE_KERNEL_ERROR_EFAULT); std::uint8_t third[16]{}; std::uint8_t fourth[16]{}; Require(sceKernelCreateUuidV4(third) == 0 && sceKernelCreateUuidV4(fourth) == 0); diff --git a/core/libs/tests/GuestAudio3dPort.cpp b/core/libs/tests/GuestAudio3dPort.cpp index df94affd4a..5dea9e7bdd 100644 --- a/core/libs/tests/GuestAudio3dPort.cpp +++ b/core/libs/tests/GuestAudio3dPort.cpp @@ -5,9 +5,15 @@ #include #include #include +#include #include +#include +#include #include -#include +#include +#include +#include +#include #include #include @@ -16,8 +22,11 @@ namespace { constexpr int INVALID_PORT = static_cast(0x80EA0002); constexpr int INVALID_OBJECT = static_cast(0x80EA0003); constexpr int INVALID_PARAMETER = static_cast(0x80EA0004); +constexpr int OUT_OF_MEMORY = static_cast(0x80EA0005); constexpr int OUT_OF_RESOURCES = static_cast(0x80EA0006); constexpr int NOT_READY = static_cast(0x80EA0007); +constexpr int AUDIO_OUT_INVALID_FORMAT = static_cast(0x80260007); +constexpr int AUDIO_OUT_INVALID_PORT_TYPE = static_cast(0x8026000A); constexpr int SYSTEM_USER = 0xFF; constexpr std::uint32_t OBJECT_INVALID = 0xFFFFFFFF; @@ -55,25 +64,6 @@ void RequireLevel(std::uint32_t level, std::uint32_t available, const char* mess Require(got_level == level && got_available == available, message); } -template -std::optional OpenOutcome(F open, std::uint32_t& id, const char* message) { - id = 7; - std::optional result; - try { - result = open(); - } catch (const std::exception&) { - } - if (result == 0) { - Require(id == 0, message); - Require(sceAudio3dPortClose(0) == 0, message); - return result; - } - std::uint32_t level = 0; - Require(id == 7, message); - Require(sceAudio3dPortGetQueueLevel(0, &level, nullptr) == INVALID_PORT, message); - return result; -} - void CheckBeforeInitialize() { std::uint32_t id = 7; Audio3dOpenParameters parameters = Defaults(); @@ -88,13 +78,20 @@ void CheckBeforeInitialize() { std::uint32_t attributes[3]{}; Require(sceAudio3dPortGetAttributesSupported(0, attributes, &num_attributes) == INVALID_PORT, "supported attributes need an open port"); Require(sceAudio3dPortClose(0) == INVALID_PORT, "close needs an open port"); + Require(sceAudio3dPortDestroy(0) == INVALID_PORT, "destroy needs an open port"); + std::uint32_t status = 7; + Require(sceAudio3dPortGetStatus(0, &status, nullptr, 0) == INVALID_PORT && status == 7, "status needs an open port"); + Require(sceAudio3dPortOpenEx(SYSTEM_USER, ¶meters, &id) == NOT_READY && id == 7, "open ex before initialize must be NOT_READY"); + Require(sceAudio3dPortCreate(0x100, 0, 0, &id) == NOT_READY && id == 7, "create before initialize must be NOT_READY"); + Require(sceAudio3dPortCreate(0x100, 0, 1, &id) == INVALID_PARAMETER && id == 7, "create checks the reserved argument first"); + Require(sceAudio3dPortCreate(0x100, 0, 0, nullptr) == NOT_READY, "create checks the initialization before the port id"); + auto* const inaccessible = reinterpret_cast(std::uintptr_t{0x10}); + Require(Open(parameters, inaccessible) == NOT_READY, "a failed open without report handlers does not read the port id"); + Require(sceAudio3dPortCreate(0x100, 0, 1, inaccessible) == INVALID_PARAMETER, "a failed create without report handlers does not read the port id"); Require(sceAudio3dPortAdvance(0) == INVALID_PORT, "advance needs an open port"); Require(sceAudio3dPortPush(0, 0) == INVALID_PORT, "push needs an open port"); float value = 0.0f; Require(sceAudio3dPortSetAttribute(0, 0x10001, &value, sizeof(value)) == INVALID_PORT, "set attribute needs an open port"); - Require(sceAudio3dPortCreate(0x100, 0, 0, &id) == NOT_READY && id == 7, "create before initialize must be NOT_READY"); - Require(sceAudio3dPortCreate(0x100, 0, 1, &id) == INVALID_PARAMETER && id == 7, "create checks reserved before the initialization"); - Require(sceAudio3dPortCreate(0x100, 0, 0, nullptr) == INVALID_PARAMETER, "create checks the port id before the initialization"); Require(sceAudio3dInitialize(0) == 0, "initialize"); RequireThrows([] { sceAudio3dInitialize(0); }, "repeated initialize must throw"); } @@ -119,55 +116,18 @@ void CheckOpenParameters() { rejects([](auto& p) { p.max_objects = 0; }, "zero objects"); rejects([](auto& p) { p.queue_depth = 0; }, "zero queue depth"); rejects([](auto& p) { p.buffer_mode = 3; }, "buffer mode above 2"); - rejects([](auto& p) { p.size_this = 0x28; p.num_beds = 4; }, "4 beds"); - rejects([](auto& p) { p.size_this = 0x28; p.num_beds = 1; }, "1 bed"); - rejects([](auto& p) { p.size_this = 0x10; p.rate = 1; }, "0x10 parameters check the rate"); - rejects([](auto& p) { p.size_this = 0x10; p.granularity = 0x180; }, "0x10 parameters check the granularity"); - rejects([](auto& p) { p.size_this = 0x18; p.max_objects = 0; }, "0x18 parameters check the object count"); - rejects([](auto& p) { p.size_this = 0x18; p.queue_depth = 0; }, "0x18 parameters check the queue depth"); - auto outcome = [&](auto change, const char* message) { + rejects([](auto& p) { p.buffer_mode = 0; }, "a PS5 process cannot use buffer mode 0"); + rejects([](auto& p) { p.buffer_mode = 1; }, "a PS5 process cannot use buffer mode 1"); + rejects([](auto& p) { p.size_this = 0x10; }, "0x10 parameters select buffer mode 0"); + rejects([](auto& p) { p.size_this = 0x18; }, "0x18 parameters select buffer mode 1"); + for (const std::uint32_t beds : {0u, 1u, 3u, 4u, 0xFFFFFFFFu}) { Audio3dOpenParameters parameters = defaults; - change(parameters); - return OpenOutcome([&] { return Open(parameters, &id); }, id, message); - }; - const std::optional legacy = outcome([](auto& p) { p.size_this = 0x10; }, "a 0x10 block opens port 0 or leaves no port"); - const std::optional legacy_tail = outcome([](auto& p) { p.size_this = 0x10; p.max_objects = 0; p.queue_depth = 0; p.buffer_mode = 3; }, "a 0x10 block opens port 0 or leaves no port"); - Require(legacy_tail == legacy, "0x10 parameters end at the rate"); - const std::optional short_block = outcome([](auto& p) { p.size_this = 0x18; }, "a 0x18 block opens port 0 or leaves no port"); - const std::optional short_tail = outcome([](auto& p) { p.size_this = 0x18; p.buffer_mode = 3; p.num_beds = 4; }, "a 0x18 block opens port 0 or leaves no port"); - Require(short_tail == short_block, "0x18 parameters end at the queue depth"); - outcome([](auto& p) { p.buffer_mode = 1; }, "buffer mode 1 opens port 0 or leaves no port"); - outcome([](auto& p) { p.size_this = 0x28; p.num_beds = 3; }, "3 beds open port 0 or leave no port"); -} - -void CheckPortCreate() { - std::uint32_t id = 7; - Require(sceAudio3dPortCreate(0x100, 0, 0, nullptr) == INVALID_PARAMETER, "create needs a port id"); - Require(sceAudio3dPortCreate(0x100, 0, 1, &id) == INVALID_PARAMETER && id == 7, "create needs a zero reserved argument"); - Require(sceAudio3dPortCreate(0x100, 0, -1, &id) == INVALID_PARAMETER && id == 7, "create rejects a negative reserved argument"); - Require(sceAudio3dPortCreate(0x100, 1, 0, &id) == INVALID_PARAMETER && id == 7, "create only at 48 kHz"); - Require(sceAudio3dPortCreate(0x80, 0, 0, &id) == INVALID_PARAMETER && id == 7, "create granularity below 256"); - Require(sceAudio3dPortCreate(0x180, 0, 0, &id) == INVALID_PARAMETER && id == 7, "create granularity not a multiple of 256"); - Audio3dOpenParameters block = Defaults(); - block.size_this = 0x10; - for (const std::uint32_t granularity : {0x100u, 0x400u}) { - block.granularity = granularity; - const std::optional created = OpenOutcome([&] { return sceAudio3dPortCreate(granularity, 0, 0, &id); }, id, "create opens port 0 or leaves no port"); - const std::optional opened = OpenOutcome([&] { return Open(block, &id); }, id, "a 0x10 block opens port 0 or leaves no port"); - Require(created == opened, "create opens like a 0x10 block with its granularity"); + parameters.size_this = 0x28; + parameters.num_beds = beds; + id = 7; + Require(Open(parameters, &id) == 0 && id == 0, "a PS5 process ignores the bed count"); + Require(sceAudio3dPortClose(0) == 0, "close after any bed count"); } - Require(Open(Defaults(), &id) == 0 && id == 0, "open after create"); - std::uint32_t second = 7; - Require(sceAudio3dPortCreate(0x100, 1, 0, &second) == INVALID_PARAMETER && second == 7, "create checks its arguments while a port is open"); - std::optional again; - try { - again = sceAudio3dPortCreate(0x100, 0, 0, &second); - } catch (const std::exception&) { - } - Require(again != 0 && second == 7, "create opens no second port"); - RequireLevel(0, 2, "create leaves the open port as it was"); - Require(sceAudio3dPortClose(0) == 0, "close the port from open"); - Require(sceAudio3dPortClose(0) == INVALID_PORT, "create opened no second port"); } void CheckOpenClose() { @@ -186,6 +146,47 @@ void CheckOpenClose() { Require(sceAudio3dPortGetQueueLevel(0, &level, nullptr) == INVALID_PORT, "closed port"); } +void CheckPortWrappers() { + Require(std::strcmp(sceAudio3dStrError(INVALID_PORT), "port does not exist") == 0, "invalid port text"); + Require(std::strcmp(sceAudio3dStrError(INVALID_OBJECT), "object does not exist") == 0, "invalid object text"); + Require(std::strcmp(sceAudio3dStrError(INVALID_PARAMETER), "invalid parameter") == 0, "invalid parameter text"); + Require(std::strcmp(sceAudio3dStrError(OUT_OF_MEMORY), "out of memory") == 0, "out of memory text"); + Require(std::strcmp(sceAudio3dStrError(OUT_OF_RESOURCES), "out of resources") == 0, "out of resources text"); + Require(std::strcmp(sceAudio3dStrError(NOT_READY), "not ready") == 0, "not ready text"); + for (const int error : {0, -1, static_cast(0x80EA0001), static_cast(0x80EA0008), static_cast(0x80260002)}) { + Require(std::strcmp(sceAudio3dStrError(error), "(unknown)") == 0, "other codes are unknown"); + } + std::uint32_t id = 7; + std::uint32_t status = 7; + Require(sceAudio3dPortCreate(0x100, 0, 1, &id) == INVALID_PARAMETER && id == 7, "create needs a zero reserved argument"); + Require(sceAudio3dPortCreate(0x100, 0, 0, &id) == INVALID_PARAMETER && id == 7, "create selects buffer mode 0"); + Require(sceAudio3dPortCreate(0x100, 0, 0, nullptr) == INVALID_PARAMETER, "create without a port id"); + const Audio3dOpenParameters parameters = Defaults(); + Require(sceAudio3dPortOpenEx(1, ¶meters, &id) == INVALID_PARAMETER && id == 7, "open ex checks like open"); + Require(sceAudio3dPortOpenEx(SYSTEM_USER, ¶meters, &id) == 0 && id == 0, "open ex hands out port 0"); + id = 7; + Require(Open(parameters, &id) == OUT_OF_RESOURCES && id == 7, "open ex takes the only port"); + Require(sceAudio3dPortCreate(0x100, 0, 0, &id) == INVALID_PARAMETER && id == 7, "create is checked before the port count"); + Require(sceAudio3dPortGetStatus(1, &status, nullptr, 0) == INVALID_PORT && status == 7, "status of port 1"); + Require(sceAudio3dPortGetStatus(0, nullptr, nullptr, 0) == 0, "status without outputs"); + char description[32]; + std::memset(description, 'x', sizeof(description)); + Require(sceAudio3dPortGetStatus(0, &status, description, sizeof(description)) == 0, "status"); + Require(status == 1 && std::strcmp(description, "Downmix ()") == 0, "the port reports a downmix"); + std::memset(description, 'x', sizeof(description)); + Require(sceAudio3dPortGetStatus(0, nullptr, description, 4) == 0, "status into a short buffer"); + Require(std::strcmp(description, "Dow") == 0 && description[4] == 'x', "the description is truncated"); + std::memset(description, 'x', sizeof(description)); + Require(sceAudio3dPortGetStatus(0, nullptr, description, 0) == 0 && description[0] == 'x', "a zero size writes nothing"); + std::memset(description, 'x', sizeof(description)); + Require(sceAudio3dPortGetStatus(0, nullptr, description, SIZE_MAX) == 0, "status with an unbounded size"); + Require(std::strcmp(description, "Downmix ()") == 0 && description[11] == 'x', "an unbounded size still writes the description"); + Require(sceAudio3dPortDestroy(1) == INVALID_PORT, "destroy of port 1"); + Require(sceAudio3dPortDestroy(0) == 0, "destroy"); + Require(sceAudio3dPortDestroy(0) == INVALID_PORT, "double destroy"); + Require(sceAudio3dPortClose(0) == INVALID_PORT, "destroy closes the port"); +} + void CheckAttributes() { float value = 0.5f; int flag = 1; @@ -205,24 +206,36 @@ void CheckAttributes() { Require(std::equal(std::begin(all), std::end(all), std::begin(supported)), "the reported attributes match the port setter"); Require(sceAudio3dPortSetAttribute(0, 0x10001, nullptr, 4) == INVALID_PARAMETER, "null attribute"); Require(sceAudio3dPortSetAttribute(1, 0x10001, &value, 4) == INVALID_PORT, "attribute on port 1"); + Require(sceAudio3dPortSetAttribute(1, 0x10004, &value, 4) == INVALID_PORT, "the port is checked before the attribute id"); Require(sceAudio3dPortSetAttribute(0, 0x10001, &value, 4) == 0, "late reverb level"); Require(sceAudio3dPortSetAttribute(0, 0x10002, &value, 4) == 0, "downmix spread radius"); Require(sceAudio3dPortSetAttribute(0, 0x10003, &flag, 4) == 0, "downmix spread height aware"); - RequireThrows([&] { sceAudio3dPortSetAttribute(0, 0x10004, &value, 4); }, "unknown attribute must throw"); - RequireThrows([&] { sceAudio3dPortSetAttribute(0, 0x10001, &value, 8); }, "wrong attribute size must throw"); + Require(sceAudio3dPortSetAttribute(0, 0x10003, &flag, 8) == 0, "height aware ignores the size"); + Require(sceAudio3dPortSetAttribute(0, 0x10003, nullptr, 4) == INVALID_PARAMETER, "height aware needs a value"); + Require(sceAudio3dPortSetAttribute(0, 0x10004, &value, 4) == INVALID_PARAMETER, "unknown attribute"); + Require(sceAudio3dPortSetAttribute(0, 0x10001, &value, 8) == INVALID_PARAMETER, "a float attribute is 4 bytes"); + const auto set_float = [](std::uint32_t attribute_id, float level) { + return sceAudio3dPortSetAttribute(0, attribute_id, &level, sizeof(level)); + }; + Require(set_float(0x10001, 0.0f) == 0 && set_float(0x10001, 1.0f) == 0, "late reverb level accepts 0 to 1"); + Require(set_float(0x10001, -0.25f) == INVALID_PARAMETER && set_float(0x10001, 1.5f) == INVALID_PARAMETER, "late reverb level outside 0 to 1"); + Require(set_float(0x10001, std::numeric_limits::quiet_NaN()) == INVALID_PARAMETER, "late reverb level must be finite"); + Require(set_float(0x10002, 0.1f) == 0 && set_float(0x10002, 2.0f) == 0, "downmix spread radius accepts 0.1 to 2"); + Require(set_float(0x10002, 0.05f) == INVALID_PARAMETER && set_float(0x10002, 2.5f) == INVALID_PARAMETER, "downmix spread radius outside 0.1 to 2"); + Require(set_float(0x10002, std::numeric_limits::infinity()) == INVALID_PARAMETER, "downmix spread radius must be finite"); } void CheckObjects() { std::uint32_t object = 7; - Require(sceAudio3dObjectReserve(0, nullptr) == INVALID_PARAMETER, "null object id"); - Require(sceAudio3dObjectReserve(0, &object) == INVALID_PORT && object == OBJECT_INVALID, "reserve needs an open port"); + Require(sceAudio3dObjectReserve(0, nullptr) == INVALID_PORT, "the port is checked before the object pointer"); + Require(sceAudio3dObjectReserve(0, &object) == INVALID_PORT && object == 7, "reserve needs an open port and leaves the id"); Require(sceAudio3dObjectUnreserve(0, 1) == INVALID_PORT, "unreserve needs an open port"); Audio3dOpenParameters parameters = Defaults(); parameters.max_objects = 2; std::uint32_t id = 7; Require(Open(parameters, &id) == 0 && id == 0, "open"); - object = 7; - Require(sceAudio3dObjectReserve(1, &object) == INVALID_PORT && object == OBJECT_INVALID, "reserve on port 1"); + Require(sceAudio3dObjectReserve(0, nullptr) == INVALID_PARAMETER, "null object id"); + Require(sceAudio3dObjectReserve(1, &object) == INVALID_PORT && object == 7, "reserve on port 1"); Require(sceAudio3dObjectReserve(0, &object) == 0 && object == 1, "first object is 1"); Require(sceAudio3dObjectReserve(0, &object) == 0 && object == 2, "second object is 2"); Require(sceAudio3dObjectReserve(0, &object) == OUT_OF_RESOURCES && object == OBJECT_INVALID, "max_objects is the limit"); @@ -324,40 +337,51 @@ void CheckFlush() { void CheckAudioOutPorts() { const std::uint32_t granularity = Defaults().granularity; - Require(sceAudio3dAudioOutOpen(0, SYSTEM_USER, 126, 0, granularity, 48000, 1) == INVALID_PORT, "audio out open needs an open port"); + Require(sceAudio3dAudioOutOpen(0, SYSTEM_USER, 0, 0, granularity, 48000, 1) == INVALID_PORT, "audio out open needs an open port"); Audio3dOpenParameters parameters = Defaults(); std::uint32_t id = 7; Require(Open(parameters, &id) == 0 && id == 0, "open"); - Require(sceAudio3dAudioOutOpen(1, SYSTEM_USER, 126, 0, granularity, 48000, 1) == INVALID_PORT, "audio out open on port 1"); - Require(sceAudio3dAudioOutOpen(0, SYSTEM_USER, 126, 0, granularity + 0x100, 48000, 1) == INVALID_PARAMETER, "len must equal the granularity"); - Require(sceAudio3dAudioOutOpen(0, SYSTEM_USER, 126, 1, granularity, 48000, 1) == INVALID_PARAMETER, "index must be 0"); - Require(sceAudio3dAudioOutOpen(0, SYSTEM_USER, 126, 0, granularity, 48000, 8) == INVALID_PARAMETER, "unknown format"); - const int handle = sceAudio3dAudioOutOpen(0, SYSTEM_USER, 126, 0, granularity, 48000, 1); + Require(sceAudio3dAudioOutOpen(1, SYSTEM_USER, 0, 0, granularity, 48000, 1) == INVALID_PORT, "audio out open on port 1"); + Require(sceAudio3dAudioOutOpen(0, SYSTEM_USER, 0, 0, granularity + 0x100, 48000, 1) == INVALID_PARAMETER, "len must equal the granularity"); + Require(sceAudio3dAudioOutOpen(0, SYSTEM_USER, -1, 0, granularity, 48000, 1) == INVALID_PARAMETER, "a negative type"); + Require(sceAudio3dAudioOutOpen(0, SYSTEM_USER, 5, 0, granularity, 48000, 8) == AUDIO_OUT_INVALID_PORT_TYPE, "the type is checked before the format"); + Require(sceAudio3dAudioOutOpen(0, SYSTEM_USER, 126, 0, granularity, 48000, 1) == AUDIO_OUT_INVALID_PORT_TYPE, "the Audio3d port type is not open to callers"); + Require(sceAudio3dAudioOutOpen(0, SYSTEM_USER, 0, 0, granularity, 48000, 8) == AUDIO_OUT_INVALID_FORMAT, "unknown format"); + const int handle = sceAudio3dAudioOutOpen(0, SYSTEM_USER, 0, 0, granularity, 48000, 1); Require(handle > 0, "audio out open returns a handle"); const std::vector block(static_cast(granularity) * 2, 256); + Require(sceAudio3dAudioOutOutput(0x1234, nullptr) == INVALID_PARAMETER, "the block is checked before the handle"); for (std::uint32_t i = 0; i < parameters.queue_depth; ++i) { - Require(sceAudio3dAudioOutOutput(handle, block.data()) == static_cast(granularity), "audio out output returns the sample count"); + Require(sceAudio3dAudioOutOutput(handle, block.data()) == 0, "audio out output"); } Require(sceAudio3dAudioOutOutput(handle, block.data()) == NOT_READY, "a full pending queue must be NOT_READY"); Require(sceAudio3dPortPush(0, 1) == 0, "sync push drains the associated ports"); - Require(sceAudio3dAudioOutOutput(handle, block.data()) == static_cast(granularity), "push drains the pending queue"); + Require(sceAudio3dAudioOutOutput(handle, block.data()) == 0, "push drains the pending queue"); Require(sceAudio3dPortFlush(0) == 0, "flush drains the associated ports"); - Require(sceAudio3dAudioOutOutput(handle, block.data()) == static_cast(granularity), "flush resets the pending queue"); + Require(sceAudio3dAudioOutOutput(handle, block.data()) == 0, "flush resets the pending queue"); Require(sceAudio3dAudioOutOutputs(nullptr, 0) == INVALID_PARAMETER, "outputs rejects an empty batch"); + Require(sceAudio3dPortFlush(0) == 0, "flush before outputs"); + AudioOutOutputParam batch[2] = {{handle, block.data()}, {0x1234, block.data()}}; + Require(sceAudio3dAudioOutOutputs(batch, 1) == 0, "outputs one block"); + Require(sceAudio3dAudioOutOutputs(batch, 2) == INVALID_PORT, "outputs stops at an unknown handle"); + Require(sceAudio3dAudioOutOutput(handle, block.data()) == NOT_READY, "outputs queued both blocks for the known handle"); Require(sceAudio3dAudioOutClose(handle) == 0, "audio out close"); Require(sceAudio3dAudioOutClose(handle) == INVALID_PORT, "audio out double close"); Require(sceAudio3dAudioOutOutput(handle, block.data()) == INVALID_PORT, "output on a closed handle"); - const int open_handle = sceAudio3dAudioOutOpen(0, SYSTEM_USER, 126, 0, granularity, 48000, 1); + const int open_handle = sceAudio3dAudioOutOpen(0, SYSTEM_USER, 0, 0, granularity, 48000, 1); Require(open_handle > 0, "audio out reopen"); Require(sceAudio3dPortClose(0) == 0, "close"); Require(sceAudio3dAudioOutOutput(open_handle, block.data()) == INVALID_PORT, "port close clears the associated ports"); - Require(sceAudio3dAudioOutClose(open_handle) == INVALID_PORT, "port close closes the associated ports"); + Require(sceAudio3dAudioOutClose(open_handle) == 0, "port close leaves the audio out handle open"); + Require(sceAudio3dAudioOutClose(open_handle) == INVALID_PORT, "audio out double close after port close"); } void CheckObjectAttributes() { float value = 0.5f; - Audio3dAttribute attribute{0x10001, 0, &value, sizeof(value)}; + Audio3dAttribute attribute{5, 0, &value, sizeof(value)}; Require(sceAudio3dObjectSetAttributes(0, 1, 1, &attribute) == INVALID_PORT, "attributes need an open port"); + Require(sceAudio3dObjectSetAttributes(0, 1, 0, &attribute) == INVALID_PARAMETER, "the count is checked before the port"); + Require(sceAudio3dObjectSetAttributes(0, 1, 1, nullptr) == INVALID_PARAMETER, "the array is checked before the port"); Audio3dOpenParameters parameters = Defaults(); std::uint32_t id = 7; Require(Open(parameters, &id) == 0 && id == 0, "open"); @@ -368,10 +392,30 @@ void CheckObjectAttributes() { Require(sceAudio3dObjectSetAttributes(0, 1, 1, nullptr) == INVALID_PARAMETER, "null array"); Require(sceAudio3dObjectSetAttributes(0, 2, 1, &attribute) == INVALID_OBJECT, "unreserved object"); Require(sceAudio3dObjectSetAttributes(0, 1, 1, &attribute) == 0, "set one attribute"); - Audio3dAttribute reset{0x20000, 0, nullptr, 0}; + Require(sceAudio3dObjectSetAttributes(0, 0x80000001, 1, &attribute) == 0, "the top bit of the object id is ignored"); + for (const std::uint32_t attribute_id : {0u, 12u, 0x10001u, 0x20000u}) { + Audio3dAttribute unknown{attribute_id, 0, &value, sizeof(value)}; + Require(sceAudio3dObjectSetAttributes(0, 1, 1, &unknown) == INVALID_PARAMETER, "object attribute ids are 1 to 11"); + Require(sceAudio3dObjectSetAttributes(0, 2, 1, &unknown) == INVALID_PARAMETER, "the ids are checked before the object"); + } + Audio3dAttribute reset{7, 0, nullptr, 0}; Require(sceAudio3dObjectSetAttributes(0, 1, 1, &reset) == 0, "reset state takes a null value"); - Audio3dAttribute missing{0x10001, 0, nullptr, 0}; + Audio3dAttribute missing{5, 0, nullptr, 0}; Require(sceAudio3dObjectSetAttributes(0, 1, 1, &missing) == INVALID_PARAMETER, "a value is required"); + Require(sceAudio3dObjectSetAttributes(0, 2, 1, &missing) == INVALID_OBJECT, "the object is checked before the values"); + const std::int16_t samples[4] = {}; + Audio3dPcm pcm{0, samples, 4}; + Audio3dAttribute block{1, 0, &pcm, sizeof(pcm)}; + Require(sceAudio3dObjectSetAttributes(0, 1, 1, &block) == 0, "s16 pcm"); + pcm.format = 1; + Require(sceAudio3dObjectSetAttributes(0, 1, 1, &block) == 0, "float pcm"); + pcm.format = 2; + Require(sceAudio3dObjectSetAttributes(0, 1, 1, &block) == INVALID_PARAMETER, "unknown pcm format"); + pcm = Audio3dPcm{0, samples, 0}; + Require(sceAudio3dObjectSetAttributes(0, 1, 1, &block) == INVALID_PARAMETER, "pcm needs samples"); + Require(sceAudio3dObjectSetAttributes(0, 2, 1, &block) == INVALID_PARAMETER, "pcm is checked before the object"); + Audio3dAttribute no_pcm{1, 0, nullptr, 0}; + Require(sceAudio3dObjectSetAttributes(0, 1, 1, &no_pcm) == INVALID_PARAMETER, "pcm needs a block"); Require(sceAudio3dObjectUnreserve(0, 1) == 0, "unreserve"); Require(sceAudio3dPortClose(0) == 0, "close"); } @@ -393,10 +437,8 @@ void CheckBed() { Require(sceAudio3dBedWrite(0, 2, 0, nullptr, 4) == INVALID_PARAMETER, "null bed buffer"); Require(sceAudio3dBedWrite2(0, 2, 0, samples, 4, 0, false) == 0, "bed write2 route both"); consume(); - Require(sceAudio3dBedWrite2(0, 2, 0, samples, 4, 1, false) == 0, "bed write2 route hmu only"); - consume(); - Require(sceAudio3dBedWrite2(0, 2, 0, samples, 4, 2, false) == 0, "bed write2 route tv only"); - consume(); + Require(sceAudio3dBedWrite2(0, 2, 0, samples, 4, 1, false) == INVALID_PARAMETER, "bed write2 route hmu only is a PS4 route"); + Require(sceAudio3dBedWrite2(0, 2, 0, samples, 4, 2, false) == INVALID_PARAMETER, "bed write2 route tv only is a PS4 route"); Require(sceAudio3dBedWrite2(0, 2, 0, samples, 4, 3, false) == INVALID_PARAMETER, "bed write2 unknown route"); Require(sceAudio3dBedWrite(0, 2, 2, samples, 4) == INVALID_PARAMETER, "unknown bed format"); Require(sceAudio3dBedWrite(0, 2, 0, samples, 0) == INVALID_PARAMETER, "zero bed samples"); @@ -432,6 +474,115 @@ void CheckBedQueue() { Require(sceAudio3dPortClose(0) == 0, "close"); } +struct ReportCopy { + Audio3dReport report; + std::string function; + std::string argument_types; + std::vector arguments; + void* user_data; +}; + +std::vector g_reports; + +void APS5_VABI RecordReport(const Audio3dReport* report, void* user_data) { + ReportCopy copy{*report, report->function, report->argument_types, {}, user_data}; + std::size_t count = 0; + for (const char* type = report->argument_types; *type != '\0'; ++type) { + if (*type == '&') continue; + count += *type == 'A' || *type == 'M' ? 2 : 1; + } + const auto* overflow = static_cast(report->arguments.overflow_arg_area); + copy.arguments.assign(overflow, overflow + count); + g_reports.push_back(std::move(copy)); +} + +void RequireReport(const ReportCopy& copy, const char* function, const char* types, std::uint32_t port_id, std::uint32_t object_id, int result, + const std::vector& arguments, const char* message) { + Require(copy.report.size == 0x40 && copy.report.type == 0, message); + Require(copy.function == function && copy.argument_types == types, message); + Require(copy.report.port_id == port_id && copy.report.object_id == object_id && copy.report.result == result, message); + Require(copy.report.arguments.gp_offset == 0x30 && copy.report.arguments.fp_offset == 0x30 && copy.report.arguments.reg_save_area != nullptr, message); + Require(copy.arguments == arguments, message); +} + +std::uint64_t Address(const void* pointer) { + return reinterpret_cast(pointer); +} + +void CheckReportHandlers() { + std::uint64_t handle = 7; + Require(sceAudio3dReportRegisterHandler(4, RecordReport, nullptr, &handle) == -4 && handle == 7, "report type 4 is out of range"); + Require(sceAudio3dReportRegisterHandler(0, nullptr, nullptr, &handle) == -2 && handle == 7, "a report handler is required"); + std::uint64_t handles[8]; + for (std::uint64_t& slot : handles) Require(sceAudio3dReportRegisterHandler(3, RecordReport, nullptr, &slot) == 0, "8 handlers fit in a type"); + for (int i = 1; i < 8; ++i) Require(handles[i] == handles[0] + 0x10 * i, "handles are consecutive slots"); + Require(sceAudio3dReportRegisterHandler(3, RecordReport, nullptr, &handle) == -3 && handle == 0xFFFFFFFF, "a full type writes the invalid handle"); + Require(sceAudio3dReportRegisterHandler(3, RecordReport, nullptr, nullptr) == -3, "a full type without a handle pointer"); + for (const std::uint64_t slot : handles) Require(sceAudio3dReportUnregisterHandler(slot) == 0, "unregister"); + Require(sceAudio3dReportUnregisterHandler(handles[0]) == -1, "double unregister"); + Require(sceAudio3dReportUnregisterHandler(0xFFFFFFFF) == -1, "unregister the invalid handle"); + Require(sceAudio3dReportUnregisterHandler(handles[0] + 1) == -1, "unregister an address inside a slot"); + Require(sceAudio3dReportRegisterHandler(3, RecordReport, nullptr, nullptr) == 0, "register without a handle pointer"); + Require(sceAudio3dReportRegisterHandler(3, RecordReport, nullptr, &handle) == 0 && handle == handles[1], "the first free slot is reused"); + Require(sceAudio3dReportUnregisterHandler(handles[0]) == 0 && sceAudio3dReportUnregisterHandler(handles[1]) == 0, "unregister type 3"); + + std::uint64_t other = 0; + Require(sceAudio3dReportRegisterHandler(1, RecordReport, nullptr, &other) == 0, "register a type 1 handler"); + Audio3dOpenParameters parameters = Defaults(); + std::uint32_t id = 7; + Require(Open(parameters, &id) == 0, "open without a call handler"); + Require(g_reports.empty(), "only type 0 handlers receive call reports"); + Require(sceAudio3dPortClose(0) == 0, "close without a call handler"); + + int user = 0; + Require(sceAudio3dReportRegisterHandler(0, RecordReport, &user, &handle) == 0, "register a call handler"); + id = 7; + Require(Open(parameters, &id) == 0 && id == 0, "open with a call handler"); + Require(g_reports.size() == 1 && g_reports[0].user_data == &user, "the open is reported with the user data"); + RequireReport(g_reports[0], "sceAudio3dPortOpen", "I&HD", 0, OBJECT_INVALID, 0, {0xFF, Address(&id), Address(¶meters)}, "open report"); + g_reports.clear(); + Require(sceAudio3dPortGetStatus(1, nullptr, nullptr, 0) == INVALID_PORT, "status of port 1"); + RequireReport(g_reports.at(0), "sceAudio3dPortGetStatus", "H", 1, OBJECT_INVALID, INVALID_PORT, {1}, "failed status report"); + g_reports.clear(); + std::uint32_t object = 0; + Require(sceAudio3dObjectReserve(0, &object) == 0, "reserve"); + RequireReport(g_reports.at(0), "sceAudio3dObjectReserve", "H&O", 0, object, 0, {0, Address(&object)}, "reserve report"); + g_reports.clear(); + const std::int16_t samples[8] = {}; + Require(sceAudio3dBedWrite(0, 2, 0, samples, 4) == 0, "bed write"); + Require(g_reports.size() == 2, "bed write reports itself and bed write2"); + RequireReport(g_reports[0], "sceAudio3dBedWrite2", "HUUPU", 0, OBJECT_INVALID, 0, {0, 2, 1, Address(samples), 4}, "bed write2 reports the AudioOut2 format"); + RequireReport(g_reports[1], "sceAudio3dBedWrite", "HUUPU", 0, OBJECT_INVALID, 0, {0, 2, 0, Address(samples), 4}, "bed write report"); + g_reports.clear(); + Require(sceAudio3dBedWrite2(0, 2, 0, samples, 4, 1, false) == INVALID_PARAMETER, "bed write2 with a PS4 route"); + RequireReport(g_reports.at(0), "sceAudio3dBedWrite2", "HUUPU", 0, OBJECT_INVALID, INVALID_PARAMETER, {0, 2, 0, Address(samples), 4}, "a rejected bed keeps its format"); + g_reports.clear(); + Require(sceAudio3dAudioOutOutputs(nullptr, 0) == INVALID_PARAMETER, "outputs without parameters"); + RequireReport(g_reports.at(0), "sceAudio3dAudioOutOutputs", "PU", 0xFFFFFFFF, OBJECT_INVALID, INVALID_PARAMETER, {0, 0}, "outputs without parameters reports a null pointer"); + const int out_handle = sceAudio3dAudioOutOpen(0, SYSTEM_USER, 0, 0, parameters.granularity, 48000, 1); + Require(out_handle > 0, "audio out open with a call handler"); + g_reports.clear(); + const std::vector block(static_cast(parameters.granularity) * 2, 0); + AudioOutOutputParam batch[2] = {{out_handle, block.data()}, {0x1234, block.data()}}; + Require(sceAudio3dAudioOutOutputs(batch, 2) == INVALID_PORT, "outputs with an unknown second handle"); + Require(g_reports.size() == 3, "outputs reports each output and itself"); + RequireReport(g_reports[0], "sceAudio3dAudioOutOutput", "IP", 0xFFFFFFFF, OBJECT_INVALID, 0, {static_cast(out_handle), Address(block.data())}, "first output report"); + RequireReport(g_reports[1], "sceAudio3dAudioOutOutput", "IP", 0xFFFFFFFF, OBJECT_INVALID, INVALID_PORT, {0x1234, Address(block.data())}, "failed output report"); + RequireReport(g_reports[2], "sceAudio3dAudioOutOutputs", "PU", 0xFFFFFFFF, OBJECT_INVALID, INVALID_PORT, {Address(batch + 1), 2}, "outputs reports the element where it stopped"); + Require(sceAudio3dAudioOutClose(out_handle) == 0, "close the audio out handle"); + g_reports.clear(); + Require(sceAudio3dAudioOutClose(0x1234) == INVALID_PORT && g_reports.empty(), "closing an unknown audio out port is not reported"); + Require(sceAudio3dPortDestroy(0) == 0, "destroy"); + Require(g_reports.size() == 2, "destroy reports itself and the close"); + RequireReport(g_reports[0], "sceAudio3dPortClose", "H", 0, OBJECT_INVALID, 0, {0}, "close report"); + RequireReport(g_reports[1], "sceAudio3dPortDestroy", "H", 0, OBJECT_INVALID, 0, {0}, "destroy report"); + g_reports.clear(); + Require(sceAudio3dPortDestroy(0) == INVALID_PORT && g_reports.size() == 1, "destroying a closed port does not close it again"); + g_reports.clear(); + Require(sceAudio3dReportUnregisterHandler(handle) == 0 && sceAudio3dReportUnregisterHandler(other) == 0, "unregister the handlers"); + Require(sceAudio3dPortGetStatus(0, nullptr, nullptr, 0) == INVALID_PORT && g_reports.empty(), "no reports without a call handler"); +} + void CheckTerminate() { std::uint32_t id = 7; const Audio3dOpenParameters parameters = Defaults(); @@ -448,13 +599,82 @@ void CheckTerminate() { Require(sceAudio3dTerminate() == 0, "terminate after reinitialize"); } +void CheckPs4Process() { + Require(sceAudio3dInitialize(0) == 0, "initialize in a PS4 process"); + Require(sceAudio3dInitialize(1) == NOT_READY, "a repeated initialize in a PS4 process is NOT_READY before the reserved check"); + Require(sceAudio3dInitialize(0) == NOT_READY, "a repeated initialize in a PS4 process is NOT_READY"); + const Audio3dOpenParameters defaults = Defaults(); + std::uint32_t id = 7; + auto open = [&](auto change) { + Audio3dOpenParameters parameters = defaults; + change(parameters); + return Open(parameters, &id); + }; + RequireThrows([&] { open([](auto& p) { p.size_this = 0x10; }); }, "a PS4 process with 0x10 parameters selects the unsupported buffer mode 0"); + RequireThrows([&] { open([](auto& p) { p.size_this = 0x18; }); }, "a PS4 process with 0x18 parameters selects the unsupported buffer mode 1"); + RequireThrows([&] { open([](auto& p) { p.buffer_mode = 0; }); }, "a PS4 process with buffer mode 0 is unsupported"); + RequireThrows([&] { open([](auto& p) { p.buffer_mode = 1; }); }, "a PS4 process with buffer mode 1 is unsupported"); + RequireThrows([&] { open([](auto& p) { p.size_this = 0x28; p.num_beds = 3; }); }, "a PS4 process with 3 beds is unsupported"); + for (const std::uint32_t beds : {0u, 1u, 4u}) { + Require(open([&](auto& p) { p.size_this = 0x28; p.num_beds = beds; }) == INVALID_PARAMETER && id == 7, "a PS4 process needs 2 or 3 beds"); + } + Require(sceAudio3dPortOpenEx(1, &defaults, &id) == INVALID_PARAMETER && id == 7, "open ex in a PS4 process checks like open"); + Require(sceAudio3dPortOpenEx(SYSTEM_USER, &defaults, &id) == 0 && id == 0, "open ex in a PS4 process opens the port"); + id = 7; + Require(open([](auto& p) { p.buffer_mode = 0; }) == OUT_OF_RESOURCES && id == 7, "a PS4 process reports the open port before an unsupported buffer mode"); + Require(sceAudio3dPortClose(0) == 0, "close after open ex in a PS4 process"); + Require(sceAudio3dPortCreate(0x100, 0, 1, &id) == INVALID_PARAMETER && id == 7, "create in a PS4 process needs a zero reserved argument"); + RequireThrows([&] { sceAudio3dPortCreate(0x100, 0, 0, &id); }, "create in a PS4 process selects the unsupported buffer mode 0"); + Require(open([](auto& p) { p.size_this = 0x28; p.num_beds = 2; }) == 0 && id == 0, "a PS4 process opens with 2 beds"); + const std::int16_t samples[8] = {}; + Require(sceAudio3dBedWrite2(0, 2, 0, samples, 4, 1, false) == INVALID_PARAMETER, "a PS4 process rejects the hmu only route on a 2-bed port"); + Require(sceAudio3dBedWrite2(0, 2, 0, samples, 4, 2, false) == 0, "a PS4 process accepts the tv only route"); + Require(sceAudio3dBedWrite2(0, 2, 0, samples, 4, 3, false) == INVALID_PARAMETER, "a PS4 process rejects an unknown route"); + const std::uint32_t granularity = defaults.granularity; + Require(sceAudio3dAudioOutOpen(0, SYSTEM_USER, 3, 0, granularity, 48000, 1 | (1u << 17)) == AUDIO_OUT_INVALID_FORMAT, "a PS4 process rejects param bit 17 on port type 3"); + Require(sceAudio3dAudioOutOpen(0, SYSTEM_USER, 5, 0, granularity, 48000, 1) == AUDIO_OUT_INVALID_PORT_TYPE, "a PS4 process checks the port type"); + Require(sceAudio3dAudioOutOpen(0, SYSTEM_USER, 0, 0, granularity, 48000, 8) == AUDIO_OUT_INVALID_FORMAT, "a PS4 process rejects an unknown format"); + RequireThrows([&] { sceAudio3dAudioOutOpen(0, SYSTEM_USER, 0, 0, granularity, 48000, 6); }, "a PS4 process with format 6 depends on the SDK version"); + RequireThrows([&] { sceAudio3dAudioOutOpen(0, SYSTEM_USER, 0, 0, granularity, 48000, 7); }, "a PS4 process with format 7 depends on the SDK version"); + const int handle = sceAudio3dAudioOutOpen(0, SYSTEM_USER, 3, 0, granularity, 48000, 1); + Require(handle > 0 && sceAudio3dAudioOutClose(handle) == 0, "a PS4 process opens port type 3 without bit 17"); + Require(sceAudio3dPortClose(0) == 0, "close in a PS4 process"); + Require(sceAudio3dTerminate() == 0, "terminate in a PS4 process"); } -int main() { +int RunAsPs4Process(const char* program) { + const auto directory = std::filesystem::temp_directory_path() / ("audio3d-ps4-test-" + std::to_string(std::random_device{}())); + std::filesystem::create_directories(directory / "app0" / "sce_sys"); + struct Entry { std::uint16_t key, format; std::uint32_t length, maximum, offset; }; + const std::uint32_t header[5] = {0x46535000, 0x0101, 52, 72, 2}; + const Entry entries[2] = {{0, 0x0204, 8, 8, 0}, {6, 0x0204, 10, 12, 8}}; + { + std::ofstream file(directory / "app0/sce_sys/param.sfo", std::ios::binary); + file.write(reinterpret_cast(header), sizeof(header)); + file.write(reinterpret_cast(entries), sizeof(entries)); + file << std::string("TITLE\0TITLE_ID\0\0\0\0\0\0", 20) << std::string("Example\0", 8) << "CUSA00000" << std::string("\0\0\0", 3); + } +#ifdef _WIN32 + const std::string command = "\"cd /d \"" + directory.string() + "\" && \"" + program + "\" ps4-process\""; +#else + const std::string command = "cd \"" + directory.string() + "\" && \"" + program + "\" ps4-process"; +#endif + const int status = std::system(command.c_str()); + std::filesystem::remove_all(directory); + return status; +} + +} + +int main(int argc, char** argv) { + if (argc == 2 && std::string_view(argv[1]) == "ps4-process") { + CheckPs4Process(); + return 0; + } CheckBeforeInitialize(); CheckOpenParameters(); CheckOpenClose(); - CheckPortCreate(); + CheckPortWrappers(); CheckObjects(); CheckQueue(); CheckMixAndPush(); @@ -464,5 +684,7 @@ int main() { CheckObjectAttributes(); CheckBed(); CheckBedQueue(); + CheckReportHandlers(); CheckTerminate(); + Require(RunAsPs4Process(argv[0]) == 0, "the PS4 process checks must pass"); } diff --git a/core/libs/tests/GuestAudiodecAjmContext.cpp b/core/libs/tests/GuestAudiodecAjmContext.cpp new file mode 100644 index 0000000000..a8ae6deb3f --- /dev/null +++ b/core/libs/tests/GuestAudiodecAjmContext.cpp @@ -0,0 +1,66 @@ +#include "prx/libSceAudiodec.native/include/Api.hpp" +#include "SceTypes.hpp" + +#include +#include +#include +#include +#ifdef _WIN32 +#include +#else +#include +#endif + +namespace { + +constexpr int InvalidArgument = static_cast(0x807F0002u); +constexpr std::uint32_t Untouched = 0x5a5a5a5au; + +using GetAjmContextFn = int (APS5_VABI*)(const void*, std::uint32_t*, std::uint32_t*); + +GetAjmContextFn Resolve() { +#ifdef _WIN32 + void* symbol = reinterpret_cast(GetProcAddress(LoadLibraryA("libSceAudiodec.native.prx"), "sceAudiodecGetAjmContext")); +#else + void* symbol = dlsym(RTLD_DEFAULT, "sceAudiodecGetAjmContext"); +#endif + if (!symbol) { + std::fprintf(stderr, "sceAudiodecGetAjmContext is not exported by libSceAudiodec.native\n"); + std::abort(); + } + return reinterpret_cast(symbol); +} + +void Require(bool condition, const char* message) { + if (condition) return; + std::fprintf(stderr, "Audiodec GetAjmContext: %s\n", message); + std::abort(); +} + +} + +int main() { + const auto getAjmContext = Resolve(); + alignas(8) unsigned char context[0x40]; + std::memset(context, 0xee, sizeof(context)); + const std::uint32_t ids[2] = {0x12345678u, 0x9abcdef0u}; + std::memcpy(context, ids, sizeof(ids)); + + std::uint32_t ajmi = Untouched; + std::uint32_t ajm = Untouched; + Require(getAjmContext(nullptr, &ajmi, &ajm) == InvalidArgument && ajmi == Untouched && ajm == Untouched, "a null context was taken"); + Require(getAjmContext(context, &ajmi, &ajm) == 0 && ajmi == ids[0] && ajm == ids[1], "the two ids were not read from offsets 0 and 4"); + + ajmi = Untouched; + ajm = Untouched; + Require(getAjmContext(context, nullptr, &ajm) == 0 && ajm == ids[1], "a null Ajmi output was not skipped"); + Require(getAjmContext(context, &ajmi, nullptr) == 0 && ajmi == ids[0], "a null Ajm output was not skipped"); + Require(getAjmContext(context, nullptr, nullptr) == 0, "two null outputs were not skipped"); + + unsigned char before[sizeof(context)]; + std::memcpy(before, context, sizeof(context)); + Require(getAjmContext(context, &ajmi, &ajm) == 0 && std::memcmp(before, context, sizeof(context)) == 0, "the context was written"); + + std::puts("Audiodec GetAjmContext tests passed"); + return 0; +} diff --git a/core/libs/tests/GuestAudiodecStandardExports.cpp b/core/libs/tests/GuestAudiodecStandardExports.cpp new file mode 100644 index 0000000000..dcec0a0aa2 --- /dev/null +++ b/core/libs/tests/GuestAudiodecStandardExports.cpp @@ -0,0 +1,40 @@ +#include "prx/libSceAudiodec/include/Api.hpp" +#include "SceTypes.hpp" + +#include +#include +#include +#ifdef _WIN32 +#include +#else +#include +#endif + +namespace { + +void* Find(const char* name) { +#ifdef _WIN32 + return reinterpret_cast(GetProcAddress(LoadLibraryA("libSceAudiodec.prx"), name)); +#else + return dlsym(RTLD_DEFAULT, name); +#endif +} + +} + +int main() { + static int32_t (APS5_VABI* volatile initLibrary)(uint32_t) = &sceAudiodecInitLibrary; + if (Find("sceAudiodecInitLibrary") == nullptr) { + std::fprintf(stderr, "libSceAudiodec is not loaded or does not export sceAudiodecInitLibrary\n"); + return EXIT_FAILURE; + } + static_cast(initLibrary); + for (const char* name : {"sceAudiodecGetAjmContext", "sceAudiodecUnregisterCodec"}) { + if (Find(name) != nullptr) { + std::fprintf(stderr, "%s is exported by libSceAudiodec, which only the native module exports on the console\n", name); + return EXIT_FAILURE; + } + } + std::puts("Audiodec standard exports tests passed"); + return 0; +} diff --git a/core/libs/tests/GuestAvPlayer.cpp b/core/libs/tests/GuestAvPlayer.cpp index a06a85b42e..66cf4737fc 100644 --- a/core/libs/tests/GuestAvPlayer.cpp +++ b/core/libs/tests/GuestAvPlayer.cpp @@ -758,7 +758,7 @@ void CheckStreamInfo(AvPlayerInternal* player) { Check(std::strcmp(info.details.video.language_code, "eng") == 0, "unexpected video language"); } else { const bool english = index == EnglishAudioStream; - Check(info.type == 0, "audio stream type"); + Check(info.type == 2, "audio stream type"); Check(info.details.audio.channel_count == (english ? 2 : 1) && info.details.audio.sample_rate == SampleRate, "unexpected audio stream"); Check(std::strcmp(info.details.audio.language_code, english ? "eng" : "fra") == 0, "unexpected audio language"); } @@ -786,7 +786,7 @@ void CheckStreamInfoEx(AvPlayerInternal* player) { } else { const bool english = index == EnglishAudioStream; const auto& audio = info.details.audio; - Check(info.type == 0, "extended audio stream type"); + Check(info.type == 2, "extended audio stream type"); Check(audio.channel_count == (english ? 2 : 1) && audio.sample_rate == SampleRate, "unexpected extended audio stream"); Check(std::memcmp(audio.language_code, english ? "eng" : "fra", 4) == 0, "unexpected extended audio language"); } @@ -947,7 +947,7 @@ void TestVp9OpusPlayback() { AvPlayerStreamInfo video{}; Check(sceAvPlayerGetStreamInfo(player, 0, &video) == 0 && video.type == 1 && video.details.video.width == 112 && video.details.video.height == 64, "unexpected VP9 stream"); AvPlayerStreamInfo audio{}; - Check(sceAvPlayerGetStreamInfo(player, 1, &audio) == 0 && audio.type == 0 && audio.details.audio.channel_count == 2 && audio.details.audio.sample_rate == SampleRate, "unexpected Opus stream"); + Check(sceAvPlayerGetStreamInfo(player, 1, &audio) == 0 && audio.type == 2 && audio.details.audio.channel_count == 2 && audio.details.audio.sample_rate == SampleRate, "unexpected Opus stream"); Check(sceAvPlayerEnableStream(player, 0) == 0 && (!withAudio || sceAvPlayerEnableStream(player, 1) == 0), "enable WebM streams failed"); if (!withAudio) Check(sceAvPlayerSetAvSyncMode(player, 1) == 0, "WebM no-sync mode rejected"); Check(sceAvPlayerStart(player) == 0, "WebM start failed"); diff --git a/core/libs/tests/GuestBinaryWord.cpp b/core/libs/tests/GuestBinaryWord.cpp index cfb2f004f0..a9ac191b2f 100644 --- a/core/libs/tests/GuestBinaryWord.cpp +++ b/core/libs/tests/GuestBinaryWord.cpp @@ -1,6 +1,7 @@ #include "prx/libc/include/Api.hpp" #include "prx/libc/include/FileStream.hpp" #include "prx/libc/include/general/VabiMacros.hpp" +#include "tests/TemporaryFile.hpp" #include #include #include @@ -77,7 +78,7 @@ void CheckErrors(const char* path) { Require(putw_nid_postfix(0x12345678, reader) == -1, "write on read-only stream fails"); Require((reader->GuestState().flags & 0x60) == 0x40, "publish write error"); Require(fclose_nid_postfix(reader) == 0, "close read-only file"); - FileStream closed(std::tmpfile()); + FileStream closed(TemporaryFile::Open()); Require(closed.Close() == 0, "close temporary stream"); errno = 0; Require(getw_nid_postfix(&closed) == -1 && errno == 9, "closed read reports EBADF"); diff --git a/core/libs/tests/GuestContentDelete.cpp b/core/libs/tests/GuestContentDelete.cpp index d41135e1cd..ae3bf7b27c 100644 --- a/core/libs/tests/GuestContentDelete.cpp +++ b/core/libs/tests/GuestContentDelete.cpp @@ -31,8 +31,10 @@ int main() { Require(sceContentDeleteByPath(nullptr) == static_cast(0x809D5002u)); ContentDeleteInitParam param{}; - param.heap_size = 0x10000; - Require(sceContentDeleteInitialize(¶m) == static_cast(0x809D5001u)); + for (const std::uint32_t badHeap : {0u, 0x1000u, 0x3fffu, 0x4001u, 0x10000u}) { + param.heap_size = badHeap; + Require(sceContentDeleteInitialize(¶m) == static_cast(0x809D5001u)); + } param.heap_size = 0x4000; Require(sceContentDeleteInitialize(¶m) == 0); Require(sceContentDeleteInitialize(¶m) == static_cast(0x809D5003u)); diff --git a/core/libs/tests/GuestDinkumwareInternals.cpp b/core/libs/tests/GuestDinkumwareInternals.cpp index e5695e1f82..5f081681e9 100644 --- a/core/libs/tests/GuestDinkumwareInternals.cpp +++ b/core/libs/tests/GuestDinkumwareInternals.cpp @@ -10,6 +10,7 @@ #include #include #include +#include namespace { @@ -66,6 +67,104 @@ void TestHexRange() { Require(std::fesetenv(&saved) == 0, "restore hexadecimal range test environment"); } +template +void CheckUnscaledHexadecimal(TFloat (APS5_VABI *parse)(const char*, char**, std::int64_t, int*), const char* text, TFloat expected, int expectedFlags) { + *__error_nid_postfix() = 7; + std::feclearexcept(FE_ALL_EXCEPT); + std::feraiseexcept(FE_DIVBYZERO); + const unsigned control = _mm_getcsr() & ~0x3fu; + unsigned short rounding; + asm volatile("fnstcw %0" : "=m"(rounding)); + int error = 123; + char* end = nullptr; + const auto value = parse(text, &end, 0, &error); + const int flags = std::fetestexcept(FloatingExceptions); + unsigned short after; + asm volatile("fnstcw %0" : "=m"(after)); + constexpr std::size_t Bytes = std::numeric_limits::digits == 64 ? 10 : sizeof(TFloat); + Require(std::memcmp(&value, &expected, Bytes) == 0, "unscaled hexadecimal value bits"); + Require(end == text + std::strlen(text) - 4 && error == 0 && *__error_nid_postfix() == 7, "unscaled hexadecimal end and errors"); + Require(flags == (FE_DIVBYZERO | expectedFlags), "unscaled hexadecimal floating flags"); + Require((_mm_getcsr() & ~0x3fu) == control && after == rounding, "unscaled hexadecimal preserves floating controls"); +} + +void TestUnscaledHexadecimal() { + GuestFloatingPointEnvironment saved; + Require(fegetenv_nid_postfix(&saved) == 0, "save unscaled hexadecimal test environment"); + for (const unsigned flushing : {0u, 0x40u, 0x8000u, 0x8040u}) { + for (unsigned rounding = 0; rounding < 4u; ++rounding) { + for (unsigned sse = 0; sse < 4u; ++sse) { + const auto x87 = static_cast(0x37fu | (rounding << 10u)); + asm volatile("fnclex\n\tfldcw %0" : : "m"(x87)); + _mm_setcsr(0x1f80u | (sse << 13u) | flushing); + CheckUnscaledHexadecimal(_Stofx_nid_postfix, "0x1.0000011p0tail", sse == 2u ? 0x1.000002p0f : 1.0f, FE_INEXACT); + CheckUnscaledHexadecimal(_Stofx_nid_postfix, "0x1.0000018p0tail", 0x1.000002p0f, 0); + CheckUnscaledHexadecimal(_Stodx_nid_postfix, "0x1.00000000000008p0tail", 0x1.0000000000001p0, 0); + CheckUnscaledHexadecimal(_Stodx_nid_postfix, "0x1.00000000000007p0tail", 1.0, 0); + CheckUnscaledHexadecimal(_Stoldx_nid_postfix, "0x1.00000000000000011p0tail", rounding == 2u || rounding == 0u ? 0x1.0000000000000002p0L : 1.0L, FE_INEXACT); + CheckUnscaledHexadecimal(_Stoldx_nid_postfix, "0x1.000000000000000100001p0tail", rounding == 2u ? 0x1.0000000000000002p0L : 1.0L, FE_INEXACT); + const bool up = rounding == 2u; + CheckUnscaledHexadecimal(_Stofx_nid_postfix, "-0x1p-150tail", up ? -std::numeric_limits::denorm_min() : -0.0f, 0); + CheckUnscaledHexadecimal(_Stodx_nid_postfix, "-0x1p-1075tail", up ? -std::numeric_limits::denorm_min() : -0.0, 0); + CheckUnscaledHexadecimal(_Stoldx_nid_postfix, "-0x1p-16446tail", up ? -std::numeric_limits::denorm_min() : -0.0L, 0); + CheckUnscaledHexadecimal(_Stofx_nid_postfix, "0x1p128tail", std::numeric_limits::infinity(), 0); + CheckUnscaledHexadecimal(_Stodx_nid_postfix, "0x1p1024tail", std::numeric_limits::infinity(), 0); + CheckUnscaledHexadecimal(_Stoldx_nid_postfix, "0x1p16384tail", std::numeric_limits::infinity(), 0); + CheckUnscaledHexadecimal(_Stodx_nid_postfix, " \t-0X0001.800000p+2tail", -6.0, 0); + CheckUnscaledHexadecimal(_Stodx_nid_postfix, "0x100000000000000000000000000000000p-128tail", 1.0, 0); + CheckUnscaledHexadecimal(_Stodx_nid_postfix, "-0x0p999999999999999999999999999999tail", -0.0, 0); + } + } + } + asm volatile("fldenv %0" : : "m"(saved) : "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)"); + _mm_setcsr(saved.mxcsr); +} + +void TestLongDoubleHexadecimalPrecision() { + constexpr long double Expected[3][4]{ + {0x91a2b40000000000p+17L, 0x91a2b30000000000p+17L, 0x91a2b60000000000p+17L, 0x91a2b30000000000p+17L}, + {0x91a2b3c4d5e6f800p+17L, 0x91a2b3c4d5e6f000p+17L, 0x91a2b3c4d5e6f800p+17L, 0x91a2b3c4d5e6f000p+17L}, + {0x91a2b3c4d5e6f789p+17L, 0x91a2b3c4d5e6f789p+17L, 0x91a2b3c4d5e6f78ap+17L, 0x91a2b3c4d5e6f789p+17L} + }; + const struct { const char* text; long double expected[3][4]; int flags[3]; } limbCases[]{ + {"-0xea74e640d964730d42e210c725d6d1d20d18364f9a40.437efcca2p100tail", { + {-0xea74e60000000000p+212L, -0xea74e60000000000p+212L, -0xea74e80000000000p+212L, -0xea74e60000000000p+212L}, + {-0xea74e640d9647000p+212L, -0xea74e640d9647000p+212L, -0xea74e640d9647800p+212L, -0xea74e640d9647000p+212L}, + {-0xea74e640d964730dp+212L, -0xea74e640d964730dp+212L, -0xea74e640d964730ep+212L, -0xea74e640d964730dp+212L} + }, {FE_INEXACT, FE_INEXACT, FE_INEXACT}}, + {"0x1fffffffffffffffffffffp0tail", { + {0x8000000000000000p+22L, 0xffffff0000000000p+21L, 0x8000020000000000p+22L, 0xffffff0000000000p+21L}, + {0x8000000000000000p+22L, 0x8000000000000000p+22L, 0x8000000000000000p+22L, 0x8000000000000000p+22L}, + {0x8000000000000000p+22L, 0x8000000000000000p+22L, 0x8000000000000000p+22L, 0x8000000000000000p+22L} + }, {FE_INEXACT, 0, 0}}, + {"+0xe.926f9e67ffffffffffffff8p128tail", { + {0xe926fa0000000000p+68L, 0xe926f90000000000p+68L, 0xe926fc0000000000p+68L, 0xe926f90000000000p+68L}, + {0xe926f9e680000000p+68L, 0xe926f9e67ffff800p+68L, 0xe926f9e680000800p+68L, 0xe926f9e67ffff800p+68L}, + {0xe926f9e680000000p+68L, 0xe926f9e680000000p+68L, 0xe926f9e680000000p+68L, 0xe926f9e680000000p+68L} + }, {FE_INEXACT, FE_INEXACT, 0}}, + }; + GuestFloatingPointEnvironment saved; + Require(fegetenv_nid_postfix(&saved) == 0, "save hexadecimal precision environment"); + unsigned index = 0; + for (const unsigned precision : {0u, 0x200u, 0x300u}) { + for (unsigned rounding = 0; rounding != 4; ++rounding) { + for (unsigned sse = 0; sse != 4; ++sse) { + for (const unsigned flushing : {0u, 0x40u, 0x8000u, 0x8040u}) { + const auto control = static_cast(0x7fu | precision | (rounding << 10u)); + asm volatile("fnclex\n\tfldcw %0" : : "m"(control)); + _mm_setcsr(0x1f80u | (sse << 13u) | flushing); + CheckUnscaledHexadecimal(_Stoldx_nid_postfix, "0x1.000001p0tail", 0x1.000001p0L, 0); + CheckUnscaledHexadecimal(_Stoldx_nid_postfix, "0x123456789abcdef123456p0tail", Expected[index][rounding], FE_INEXACT); + for (const auto& item : limbCases) CheckUnscaledHexadecimal(_Stoldx_nid_postfix, item.text, item.expected[index][rounding], item.flags[index]); + } + } + } + ++index; + } + asm volatile("fldenv %0" : : "m"(saved) : "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)"); + _mm_setcsr(saved.mxcsr); +} + void CheckExp(double x, double y, short offset, double expected, short expectedKind, int expectedErrno, int expectedFlags, const char* message) { errno = 0; std::feclearexcept(FE_ALL_EXCEPT); @@ -596,6 +695,8 @@ void TestLongLogAt53Bits() { int main() { TestStod(); TestHexRange(); + TestUnscaledHexadecimal(); + TestLongDoubleHexadecimalPrecision(); TestStoll(); TestDoubleHelpers(); TestFloatingRounds(); diff --git a/core/libs/tests/GuestEntitlements.cpp b/core/libs/tests/GuestEntitlements.cpp index 6268c9dc84..2bf1b61c4e 100644 --- a/core/libs/tests/GuestEntitlements.cpp +++ b/core/libs/tests/GuestEntitlements.cpp @@ -69,6 +69,33 @@ int main(int argc, char** argv) { NpEntitlementAccessAddcontEntitlementInfo info{}; Require(sceNpEntitlementAccessGetAddcontEntitlementInfo(0, &label, &info) == 0); Require(std::strcmp(info.entitlement_label.data, "SECONDADDON") == 0 && info.package_type == 3 && info.download_status == 4); + for (std::int32_t userId : {1, 0x10000000, std::numeric_limits::min()}) { + NpEntitlementAccessAddcontEntitlementInfo individual{}; + Require(sceNpEntitlementAccessGetAddcontEntitlementInfoIndividual(userId, 0, &label, &individual) == 0); + Require(std::memcmp(&individual, &info, sizeof(info)) == 0); + } + NpEntitlementAccessAddcontEntitlementInfo untouched{}; + std::memset(&untouched, 0x5a, sizeof(untouched)); + const auto original = untouched; + NpUnifiedEntitlementLabel unlisted{}; + std::memcpy(unlisted.data, "UNLISTEDADDON", 13); + Require(sceNpEntitlementAccessGetAddcontEntitlementInfoIndividual(1, 0, &unlisted, &untouched) == static_cast(0x80558007)); + Require(sceNpEntitlementAccessGetAddcontEntitlementInfoIndividual(-1, 0, &label, &untouched) == static_cast(0x80558003)); + Require(sceNpEntitlementAccessGetAddcontEntitlementInfoIndividual(-1, 0, nullptr, nullptr) == static_cast(0x80558003)); + Require(std::memcmp(&untouched, &original, sizeof(original)) == 0); + Require(sceNpEntitlementAccessGetAddcontEntitlementInfoIndividual(1, 0, nullptr, &untouched) == static_cast(0x80558003)); + Require(sceNpEntitlementAccessGetAddcontEntitlementInfoIndividual(1, 0, &label, nullptr) == static_cast(0x80558003)); + NpUnifiedEntitlementLabel empty{}; + Require(sceNpEntitlementAccessGetAddcontEntitlementInfoIndividual(1, 0, &empty, &untouched) == static_cast(0x80558007)); + NpUnifiedEntitlementLabel unterminated{}; + std::memset(unterminated.data, 'A', sizeof(unterminated.data)); + Require(sceNpEntitlementAccessGetAddcontEntitlementInfoIndividual(1, 0, &unterminated, &untouched) == static_cast(0x80558007)); + Require(std::memcmp(&untouched, &original, sizeof(original)) == 0); + auto padded = label; + std::memset(padded.padding, 0x5a, sizeof(padded.padding)); + NpEntitlementAccessAddcontEntitlementInfo paddedInfo{}; + Require(sceNpEntitlementAccessGetAddcontEntitlementInfoIndividual(1, 0, &padded, &paddedInfo) == 0); + Require(std::memcmp(&paddedInfo, &info, sizeof(info)) == 0); NpEntitlementAccessEntitlementKey key{}; Require(sceNpEntitlementAccessGetEntitlementKey(0, nullptr, &key) == static_cast(0x817D0002)); Require(sceNpEntitlementAccessGetEntitlementKey(0, &label, nullptr) == static_cast(0x817D0002)); diff --git a/core/libs/tests/GuestErr.cpp b/core/libs/tests/GuestErr.cpp index 570a1c1d85..c4314d31cd 100644 --- a/core/libs/tests/GuestErr.cpp +++ b/core/libs/tests/GuestErr.cpp @@ -3,6 +3,7 @@ #include "prx/libc/include/FileStream.hpp" #include "prx/libc/include/general/VabiMacros.hpp" #include "SceTypes.hpp" +#include "tests/TemporaryFile.hpp" #include #include #include @@ -45,7 +46,7 @@ class Capture { long consumed = 0; public: - Capture() : stream(std::tmpfile()) { err_set_file_nid_postfix(&stream); } + Capture() : stream(TemporaryFile::Open()) { err_set_file_nid_postfix(&stream); } ~Capture() { err_set_file_nid_postfix(nullptr); @@ -67,7 +68,7 @@ public: template std::string DescriptorTwoOutput(TCall call) { std::fflush(stderr); - std::FILE* capture = std::tmpfile(); + std::FILE* capture = TemporaryFile::Open(); const int saved = dup(2); dup2(fileno(capture), 2); call(); diff --git a/core/libs/tests/GuestExecHost.cpp b/core/libs/tests/GuestExecHost.cpp index 959a1f35c6..82faaf1b6b 100644 --- a/core/libs/tests/GuestExecHost.cpp +++ b/core/libs/tests/GuestExecHost.cpp @@ -90,18 +90,36 @@ void Arguments(const std::uintptr_t* block, const std::vector& expe Require(argv[expected.size()] == nullptr && kernel[expected.size()] == nullptr, "argument terminator"); } +bool Utf8Environment(const char* name, std::string& value) { +#ifdef _WIN32 + const std::wstring wideName = std::filesystem::path(name).wstring(); + std::wstring wide(32768, L'\0'); + const auto length = GetEnvironmentVariableW(wideName.c_str(), wide.data(), static_cast(wide.size())); + if (length == 0 || length >= wide.size()) return false; + wide.resize(length); + const auto converted = std::filesystem::path(wide).u8string(); + value.assign(reinterpret_cast(converted.data()), converted.size()); + return true; +#else + const auto* found = std::getenv(name); + if (found == nullptr) return false; + value = found; + return true; +#endif +} + std::string LoaderEnvironment() { - const auto* value = std::getenv("LD_LIBRARY_PATH"); - return value != nullptr ? std::string("LD_LIBRARY_PATH=") + value : std::string(); + std::string value; + return Utf8Environment("LD_LIBRARY_PATH", value) ? "LD_LIBRARY_PATH=" + value : std::string(); } std::vector SecondEnvironment() { std::vector entries{"EXEC_SECOND=stage2"}; auto loader = LoaderEnvironment(); if (!loader.empty()) entries.push_back(loader); - const auto* root = std::getenv("ANYPS5_LOADEXEC_TEST_ROOT"); - Require(root != nullptr, "missing fixture directory for the environment"); - entries.emplace_back(std::string("ANYPS5_LOADEXEC_TEST_ROOT=") + root); + std::string root; + Require(Utf8Environment("ANYPS5_LOADEXEC_TEST_ROOT", root), "missing fixture directory for the environment"); + entries.emplace_back("ANYPS5_LOADEXEC_TEST_ROOT=" + root); return entries; } diff --git a/core/libs/tests/GuestFilesystem.cpp b/core/libs/tests/GuestFilesystem.cpp index fd05fc56e8..f284609395 100644 --- a/core/libs/tests/GuestFilesystem.cpp +++ b/core/libs/tests/GuestFilesystem.cpp @@ -8,6 +8,7 @@ #include "prx/libkernel/File/include/File.hpp" #include "prx/libkernel/File/include/NativeStat.hpp" #include "prx/libkernel/KernelErrors.hpp" +#include "tests/TemporaryFile.hpp" #include #include #include @@ -78,7 +79,7 @@ static bool FchflagsThrows(int descriptor, std::uint64_t flags, const char* name } static std::string CaptureStderr(const std::function& action) { - std::FILE* capture = std::tmpfile(); + std::FILE* capture = TemporaryFile::Open(); Require(capture != nullptr); std::fflush(stderr); #ifdef _WIN32 @@ -445,8 +446,9 @@ int main() { Require(sceKernelWriteThrottlingStatus(throttling) == 0); Require(throttling[0] == 0xffffffffu && throttling[1] == 0 && throttling[2] == 0 && throttling[3] == 0); Require(sceKernelWriteThrottlingStatus(nullptr) == static_cast(0x8002000eu)); + Require(sceKernelWriteThrottlingStatus(reinterpret_cast(0x10)) == static_cast(0x8002000eu)); Require(sceKernelDebugOutText(0, nullptr) == static_cast(0x8002000eu)); - auto* captured = std::tmpfile(); + auto* captured = TemporaryFile::Open(); Require(captured != nullptr); #ifdef _WIN32 const int saved = ::_dup(::_fileno(stderr)); @@ -517,7 +519,7 @@ int main() { } } Require(close_nid_postfix(descriptors[0]) == 0); - auto* hostCapture = std::tmpfile(); + auto* hostCapture = TemporaryFile::Open(); Require(hostCapture != nullptr && pipe_nid_postfix(descriptors) == 0); #ifdef _WIN32 const int hostError = ::_dup(2); @@ -542,7 +544,7 @@ int main() { Require(std::fclose(hostCapture) == 0); #ifdef _WIN32 for (const bool reopen : {false, true}) { - auto* hostCapture = std::tmpfile(); + auto* hostCapture = TemporaryFile::Open(); const int hostError = ::_dup(2); Require(hostCapture != nullptr && hostError >= 0); int redirect[2] = {-1, -1}; diff --git a/core/libs/tests/GuestFloatBuiltins.cpp b/core/libs/tests/GuestFloatBuiltins.cpp index 5595a78ecc..5ecaa9c33e 100644 --- a/core/libs/tests/GuestFloatBuiltins.cpp +++ b/core/libs/tests/GuestFloatBuiltins.cpp @@ -65,6 +65,18 @@ static void CheckComparisons() { Require(__ledf2_nid_postfix(Double(0x0000000000000001ull), 0.) == 1); } +static void CheckSingleComparisonsAndAddition() { + Require(__lesf2_nid_postfix(1.f, 2.f) <= 0 && __lesf2_nid_postfix(2.f, 2.f) <= 0 && __lesf2_nid_postfix(2.f, 1.f) > 0); + Require(__lesf2_nid_postfix(NAN, 1.f) > 0 && __lesf2_nid_postfix(1.f, NAN) > 0); + Require(__gtsf2_nid_postfix(-1.f, -2.f) > 0 && __gtsf2_nid_postfix(-2.f, -1.f) <= 0 && __gtsf2_nid_postfix(2.f, 2.f) <= 0); + Require(__gtsf2_nid_postfix(1.f, NAN) <= 0 && __gtsf2_nid_postfix(NAN, NAN) <= 0); + Require(__nesf2_nid_postfix(1.f, -1.f) != 0 && __nesf2_nid_postfix(NAN, 0.f) != 0 && __nesf2_nid_postfix(0.f, -0.f) == 0); + Require(__addsf3_nid_postfix(1.f, 2.f) == 3.f && __addsf3_nid_postfix(-1.5f, .25f) == -1.25f); + Require(__addsf3_nid_postfix(0x1p-149f, 0x1p-149f) == 0x1p-148f); + Require(__addsf3_nid_postfix(0x1.fffffep127f, 0x1.fffffep127f) == INFINITY); + Require(Bits(__addsf3_nid_postfix(1.f, -1.f)) == 0u); +} + static void CheckFloatConversions() { Require(Bits(__extendsfdf2_nid_postfix(Float(0x7f800001u))) == 0x7ff0000000000001ull); Require(Bits(__extendsfdf2_nid_postfix(Float(0xffc00001u))) == 0xfff8000000000001ull); @@ -150,6 +162,7 @@ static void CheckComplex() { int main() { CheckArithmetic(); CheckComparisons(); + CheckSingleComparisonsAndAddition(); CheckFloatConversions(); CheckFloatToInteger(); CheckIntegerToFloat(); diff --git a/core/libs/tests/GuestFreeTypeCorner.cpp b/core/libs/tests/GuestFreeTypeCorner.cpp index 3dab54335a..da989a8122 100644 --- a/core/libs/tests/GuestFreeTypeCorner.cpp +++ b/core/libs/tests/GuestFreeTypeCorner.cpp @@ -128,6 +128,36 @@ void CheckVectorTransformScaled() { "FT_Vector_Transform_Scaled checks 0x10000 * scaling before the null test"); } +void CheckSqrtFixed() { + Require(FT_SqrtFixed_nid_postfix(0) == 0, "FT_SqrtFixed of 0 is 0"); + Require(FT_SqrtFixed_nid_postfix(-1) == 0 && FT_SqrtFixed_nid_postfix(-0x10000) == 0 && FT_SqrtFixed_nid_postfix(INT32_MIN) == 0, + "FT_SqrtFixed returns 0 for negative inputs"); + Require(FT_SqrtFixed_nid_postfix(1) == 256, "FT_SqrtFixed scales the least positive fixed unit by 256"); + Require(FT_SqrtFixed_nid_postfix(0x10000) == 0x10000 && FT_SqrtFixed_nid_postfix(0x40000) == 0x20000 && FT_SqrtFixed_nid_postfix(0x90000) == 0x30000 && + FT_SqrtFixed_nid_postfix(0x24000) == 0x18000, + "FT_SqrtFixed computes exact 16.16 roots"); + Require(FT_SqrtFixed_nid_postfix(2) == 362 && FT_SqrtFixed_nid_postfix(3) == 443 && FT_SqrtFixed_nid_postfix(12) == 886 && + FT_SqrtFixed_nid_postfix(0xFFFE) == 0xFFFE && FT_SqrtFixed_nid_postfix(0xFFFF) == 0xFFFF && FT_SqrtFixed_nid_postfix(0x10001) == 0x10000, + "FT_SqrtFixed truncates non-square roots"); + Require(FT_SqrtFixed_nid_postfix(INT32_MAX) == 0xB504F3, "FT_SqrtFixed handles INT32_MAX"); +} + +void CheckSqrt32() { + Require(FT_Sqrt32_nid_postfix(0) == 0 && FT_Sqrt32_nid_postfix(1) == 1, "FT_Sqrt32 handles 0 and 1"); + Require(FT_Sqrt32_nid_postfix(4) == 2 && FT_Sqrt32_nid_postfix(9) == 3 && FT_Sqrt32_nid_postfix(0x10000) == 256 && + FT_Sqrt32_nid_postfix(46340 * 46340) == 46340, + "FT_Sqrt32 computes exact integer roots"); + Require(FT_Sqrt32_nid_postfix(3) == 1 && FT_Sqrt32_nid_postfix(8) == 2 && FT_Sqrt32_nid_postfix(15) == 3 && + FT_Sqrt32_nid_postfix(46340 * 46340 - 1) == 46339 && FT_Sqrt32_nid_postfix(INT32_MAX) == 46340, + "FT_Sqrt32 truncates non-square positive inputs"); + Require(FT_Sqrt32_nid_postfix(INT32_MIN) == 46340 && + FT_Sqrt32_nid_postfix(static_cast(46341u * 46341u - 1u)) == 46340 && + FT_Sqrt32_nid_postfix(static_cast(46341u * 46341u)) == 46341 && + FT_Sqrt32_nid_postfix(static_cast(65535u * 65535u - 1u)) == 65534 && + FT_Sqrt32_nid_postfix(static_cast(65535u * 65535u)) == 65535 && FT_Sqrt32_nid_postfix(-1) == 65535, + "FT_Sqrt32 treats negative inputs as unsigned 32-bit values"); +} + void CheckHighPow2() { Require(ft_highpow2_nid_postfix(0) == 0, "ft_highpow2 of 0 is 0"); Require(ft_highpow2_nid_postfix(1) == 1 && ft_highpow2_nid_postfix(2) == 2 && ft_highpow2_nid_postfix(0x10) == 0x10, "ft_highpow2 keeps a power of two"); @@ -166,6 +196,8 @@ int main() { CheckMulDivNoRound(); CheckMatrixMultiplyScaled(); CheckVectorTransformScaled(); + CheckSqrtFixed(); + CheckSqrt32(); CheckHighPow2(); std::puts("Guest FreeType corner tests passed"); diff --git a/core/libs/tests/GuestFreeTypeModuleProperties.cpp b/core/libs/tests/GuestFreeTypeModuleProperties.cpp index 74534f2974..b4bedc4822 100644 --- a/core/libs/tests/GuestFreeTypeModuleProperties.cpp +++ b/core/libs/tests/GuestFreeTypeModuleProperties.cpp @@ -154,12 +154,12 @@ static void Run(const Api& api) { for (const auto* property : {"fallback-script", "default-script"}) { Query(api, library, native, "autofitter", property); for (const auto script : { + 999u, + 0xFFFFFFFFu, static_cast(FT_AUTOHINTER_SCRIPT_NONE), static_cast(FT_AUTOHINTER_SCRIPT_LATIN), static_cast(FT_AUTOHINTER_SCRIPT_CJK), - static_cast(FT_AUTOHINTER_SCRIPT_INDIC), - 999u, - 0xFFFFFFFFu + static_cast(FT_AUTOHINTER_SCRIPT_INDIC) }) { Change(api, library, native, other, nativeOther, "autofitter", property, script); } diff --git a/core/libs/tests/GuestGetlogin.cpp b/core/libs/tests/GuestGetlogin.cpp index 5071c786c9..000e9d827c 100644 --- a/core/libs/tests/GuestGetlogin.cpp +++ b/core/libs/tests/GuestGetlogin.cpp @@ -88,6 +88,8 @@ int main() { Require(*__error_nid_postfix() == 12345 && output == untouched); } Require(getlogin_r_nid_postfix(nullptr, 1) == 14); + Require(getlogin_r_nid_postfix(reinterpret_cast(0x10), 1) == 34); + Require(getlogin_r_nid_postfix(reinterpret_cast(0x10), static_cast(output.size())) == 14); Require(*__error_nid_postfix() == 12345); const std::string expected = HostLogin(); *__error_nid_postfix() = 12345; @@ -121,6 +123,7 @@ int main() { Require(setlogin_nid_postfix(pageEnd - 33) == 0); RequireLogin(std::string(32, 'p')); Require(setlogin_nid_postfix("guest") == 0); + Require(getlogin_r_nid_postfix(reinterpret_cast(0x10), static_cast(output.size())) == 14); RequireLogin("guest"); Require(setlogin_nid_postfix(longest.c_str()) == 0); RequireLogin(longest); diff --git a/core/libs/tests/GuestGetloginNoSession.cpp b/core/libs/tests/GuestGetloginNoSession.cpp index fc31313d74..7bcc7e298d 100644 --- a/core/libs/tests/GuestGetloginNoSession.cpp +++ b/core/libs/tests/GuestGetloginNoSession.cpp @@ -11,6 +11,12 @@ static int loginError = ENXIO; +extern "C" bool GuestCopyOut_nid_no_patch(void* destination, const void* source, std::size_t bytes) { + if (destination == nullptr) return false; + std::memcpy(destination, source, bytes); + return true; +} + extern "C" int getlogin_r(char* output, std::size_t size) { if (loginError != 0) return loginError; constexpr char sessionName[] = "anyps5-other-login-session"; diff --git a/core/libs/tests/GuestGetopt.cpp b/core/libs/tests/GuestGetopt.cpp index 13db14bc90..92fbb1e1e9 100644 --- a/core/libs/tests/GuestGetopt.cpp +++ b/core/libs/tests/GuestGetopt.cpp @@ -2,6 +2,7 @@ #include "prx/libSceLibcInternal/include/Api.hpp" #include "prx/libc/include/FileStream.hpp" #include "prx/libc/include/general/VabiMacros.hpp" +#include "tests/TemporaryFile.hpp" #include #include #include @@ -56,7 +57,7 @@ class StderrCapture { FileStream stream; public: - StderrCapture() : previous(__stderrp_nid_postfix), stream(std::tmpfile()) { __stderrp_nid_postfix = &stream; } + StderrCapture() : previous(__stderrp_nid_postfix), stream(TemporaryFile::Open()) { __stderrp_nid_postfix = &stream; } ~StderrCapture() { __stderrp_nid_postfix = previous; stream.Close(); diff --git a/core/libs/tests/GuestGets.cpp b/core/libs/tests/GuestGets.cpp index 4862729c19..804eed957a 100644 --- a/core/libs/tests/GuestGets.cpp +++ b/core/libs/tests/GuestGets.cpp @@ -1,6 +1,7 @@ #include "prx/libc/include/Api.hpp" #include "prx/libc/include/FileStream.hpp" #include "prx/libc/include/general/VabiMacros.hpp" +#include "tests/TemporaryFile.hpp" #include #include #include @@ -38,7 +39,7 @@ class Input { public: explicit Input(std::FILE* handle) : stream(handle) { __stdinp_nid_postfix = &stream; } - Input(const void* bytes, std::size_t size) : stream(std::tmpfile()) { + Input(const void* bytes, std::size_t size) : stream(TemporaryFile::Open()) { Require(std::fwrite(bytes, 1, size, stream.GetHandle()) == size, "seed input"); std::rewind(stream.GetHandle()); __stdinp_nid_postfix = &stream; diff --git a/core/libs/tests/GuestGnmNeoContextStateInternal.cpp b/core/libs/tests/GuestGnmNeoContextStateInternal.cpp new file mode 100644 index 0000000000..efe6173f22 --- /dev/null +++ b/core/libs/tests/GuestGnmNeoContextStateInternal.cpp @@ -0,0 +1,77 @@ +#include "prx/libSceGnmDriverForNeoMode/include/Api.hpp" +#include "prx/libc/include/general/VabiMacros.hpp" +#include "ProcessParametersFixture.hpp" +#include +#include +#include +#include +#include +#include +#include + +namespace { + +constexpr std::uint32_t Untouched = 0xa5a5a5a5u; +constexpr std::array ContextStateBefore400{ + 0xc0012800u, 0x80000000u, 0x80000000u, 0xc0001200u, 0x00000000u, 0xc0002f00u, 0x00000001u, 0xc0016900u, + 0x00000102u, 0x00000000u, 0xc0016900u, 0x00000202u, 0x00cc0010u, 0xc0026900u, 0x000000ebu, 0xff00ff00u, + 0x0000ff00u, 0xc00d1000u, 0x00000000u, +}; +constexpr std::size_t BufferWords = 0x110; + +using Buffer = std::array; + +void Require(bool condition, const char* message) { + if (condition) return; + std::fprintf(stderr, "GnmNeo InternalCommand: %s\n", message); + std::abort(); +} + +Buffer Fresh() { + Buffer buffer; + buffer.fill(Untouched); + return buffer; +} + +void CheckSize(std::uint32_t sdkVersion, int (APS5_VABI* expected)(std::uint32_t*, std::uint32_t), std::uint32_t size) { + Buffer internal = Fresh(); + Buffer reference = Fresh(); + const int internalResult = sceGnmDrawInitToDefaultContextStateInternalCommand(internal.data(), size); + const int referenceResult = expected(reference.data(), size); + if (internalResult != referenceResult || internal != reference) { + std::fprintf(stderr, "SDK 0x%08x, size 0x%x: %d against %d\n", sdkVersion, size, internalResult, referenceResult); + Require(false, "the result or the written words differ from the matching context state call"); + } +} + +} + +int main() { + static std::array process{}; + Require(ProcessParametersFixture::Install(process.data(), process.size()), "the process parameters could not be installed"); + + for (const std::uint32_t sdkVersion : {0x03500000u, 0x03ffffffu}) { + std::memcpy(process.data() + 0x10, &sdkVersion, sizeof(sdkVersion)); + Buffer words = Fresh(); + Require(sceGnmDrawInitToDefaultContextStateInternalCommand(words.data(), 0x20) == 0x20, "size 0x20 was not taken before SDK 0x04000000"); + for (std::size_t index = 0; index < BufferWords; ++index) + Require(words[index] == (index < ContextStateBefore400.size() ? ContextStateBefore400[index] : Untouched), "the words before SDK 0x04000000 differ from firmware 13.42's"); + for (const std::uint32_t size : {0u, 0x1fu, 0x21u, 0xffu, 0x100u, 0x101u}) { + Buffer refused = Fresh(); + Require(sceGnmDrawInitToDefaultContextStateInternalCommand(refused.data(), size) == 0 && refused == Fresh(), "a size other than 0x20 was taken before SDK 0x04000000"); + } + } + + for (const std::uint32_t sdkVersion : {0x04000000u, 0x09000000u}) { + std::memcpy(process.data() + 0x10, &sdkVersion, sizeof(sdkVersion)); + Buffer words = Fresh(); + Require(sceGnmDrawInitToDefaultContextStateInternalCommand(words.data(), 0x100) == 0x100, "size 0x100 was not taken from SDK 0x04000000"); + std::size_t written = 0; + while (written < BufferWords && words[written] != Untouched) ++written; + Require(written == 102, "size 0x100 did not write 102 words from SDK 0x04000000"); + for (const std::uint32_t size : {0u, 0x20u, 0xffu, 0x100u, 0x101u}) CheckSize(sdkVersion, sceGnmDrawInitToDefaultContextState400, size); + } + + std::puts("GnmNeo InternalCommand tests passed"); + return 0; +} diff --git a/core/libs/tests/GuestHttp2.cpp b/core/libs/tests/GuestHttp2.cpp index 8bd6b7e26e..69cf99710a 100644 --- a/core/libs/tests/GuestHttp2.cpp +++ b/core/libs/tests/GuestHttp2.cpp @@ -48,10 +48,9 @@ int main() { Require(Throws([&] { sceHttp2SetMinSslVersion(id, 99); })); Require(Throws([&] { sceHttp2SslEnableOption(id, 0x80000000); })); } - for (const int id : {context, box}) { - Require(Throws([&] { sceHttp2SslEnableOption(id, 0x3d); })); - Require(Throws([&] { sceHttp2SslDisableOption(id, 0x20); })); - } + Require(sceHttp2SslEnableOption(context, 0x3d) == 0); + Require(sceHttp2SslDisableOption(context, 0x20) == 0); + Require(Throws([&] { sceHttp2SslEnableOption(context, 0x80000000); })); Http2MemoryPoolStats stats{1, 2, 3, 4}; Require(sceHttp2GetMemoryPoolStats(context, &stats) == 0); Require(stats.pool_size == 0x10000 && stats.max_inuse_size == 0 && stats.current_inuse_size == 0 && stats.reserved == 0); @@ -83,6 +82,7 @@ int main() { Require(sceHttp2DeleteRequest(child) == InvalidId); Require(sceHttp2DeleteTemplate(sibling) == InvalidId); Require(sceHttp2SetMinSslVersion(context, 0) == InvalidId); + Require(sceHttp2SslEnableOption(context, 0x3d) == InvalidId); Require(sceHttp2DeleteCookieBox(box) == 0); Require(sceHttp2DeleteCookieBox(box) == InvalidId); Require(sceHttp2Term(context) == InvalidId); diff --git a/core/libs/tests/GuestHttp2Transport.cpp b/core/libs/tests/GuestHttp2Transport.cpp index 1c25112829..4aab31e278 100644 --- a/core/libs/tests/GuestHttp2Transport.cpp +++ b/core/libs/tests/GuestHttp2Transport.cpp @@ -52,9 +52,41 @@ bool Throws(TCall call) { return false; } -enum class Mode { Normal, Large, NoLength, Head, NotFound, Redirect, Auth, Reset, Truncate, StallHandshake, StallHeaders, StallBody, NoAlpn, Informational, StallUpload, EarlyFinal, EarlyReset, EarlyEmpty, EarlyLarge, EarlyResetIncomplete }; +enum class Mode { Normal, Large, NoLength, Head, NotFound, Redirect, Auth, Reset, Truncate, Gzip, GzipSplit, GzipTruncated, GzipChecksum, GzipConcat, GzipLarge, StallHandshake, StallHeaders, StallBody, NoAlpn, Informational, StallUpload, EarlyFinal, EarlyReset, EarlyEmpty, EarlyLarge, EarlyResetIncomplete }; const char* Protocols[] = {"h2", nullptr}; +std::string GzipPayload() { + std::string payload(70000, '\0'); + for (std::size_t i = 0; i < payload.size(); ++i) payload[i] = static_cast((i * 31 + 7) & 0xff); + return payload; +} + +std::string StoredGzip(const std::string& payload) { + static const unsigned char header[] = {0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff}; + std::string body(reinterpret_cast(header), sizeof(header)); + std::size_t offset = 0; + while (offset < payload.size()) { + const std::size_t count = std::min(payload.size() - offset, 65535); + body.push_back(static_cast(offset + count == payload.size() ? 1 : 0)); + body.push_back(static_cast(count & 0xff)); + body.push_back(static_cast((count >> 8) & 0xff)); + body.push_back(static_cast(~count & 0xff)); + body.push_back(static_cast((~count >> 8) & 0xff)); + body.append(payload, offset, count); + offset += count; + } + std::uint32_t crc = 0xffffffffu; + for (const unsigned char byte : payload) { + crc ^= byte; + for (int bit = 0; bit < 8; ++bit) crc = (crc >> 1) ^ (0xedb88320u & (0u - (crc & 1u))); + } + crc = ~crc; + const std::uint32_t size = static_cast(payload.size()); + for (int shift = 0; shift < 32; shift += 8) body.push_back(static_cast((crc >> shift) & 0xff)); + for (int shift = 0; shift < 32; shift += 8) body.push_back(static_cast((size >> shift) & 0xff)); + return body; +} + class Server { public: explicit Server(Mode mode) : mode(mode) { @@ -137,6 +169,8 @@ private: std::size_t offset = 0; bool responded = false; bool ended = false; + bool splitSent = false; + bool splitResumed = false; void Stage(int value) { { std::lock_guard lock(mutex); stage = value; } @@ -176,7 +210,12 @@ private: std::uint32_t* flags, nghttp2_data_source*, void* data) { auto& server = *static_cast(data); if (server.mode == Mode::StallBody || server.mode == Mode::EarlyResetIncomplete) return NGHTTP2_ERR_DEFERRED; + if (server.mode == Mode::GzipSplit && server.splitSent && !server.splitResumed) return NGHTTP2_ERR_DEFERRED; size = std::min(size, server.body.size() - server.offset); + if (server.mode == Mode::GzipSplit && !server.splitSent) { + size = std::min(size, 8); + server.splitSent = true; + } if (size) std::memcpy(bytes, server.body.data() + server.offset, size); server.offset += size; if (server.offset == server.body.size()) *flags |= NGHTTP2_DATA_FLAG_EOF; @@ -194,6 +233,21 @@ private: auto length = std::to_string(body.size()); if (mode == Mode::Head) body.clear(); if (mode == Mode::Truncate) body = "short"; + if (mode == Mode::Gzip || mode == Mode::GzipSplit || mode == Mode::GzipTruncated || mode == Mode::GzipChecksum || mode == Mode::GzipConcat) { + static const unsigned char compressed[] = { + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x2b, 0x4a, 0x2d, 0x2e, 0xc8, 0xcf, + 0x2b, 0x4e, 0x55, 0x48, 0xca, 0x4f, 0xa9, 0x04, 0x00, 0x36, 0x76, 0x8b, 0x0c, 0x0d, 0x00, 0x00, 0x00, + }; + body.assign(reinterpret_cast(compressed), sizeof(compressed)); + if (mode == Mode::GzipTruncated) body.resize(body.size() - 4); + if (mode == Mode::GzipChecksum) body[body.size() - 8] ^= 0xff; + if (mode == Mode::GzipConcat) { const std::string member = body; body += member; } + length = std::to_string(body.size()); + } + if (mode == Mode::GzipLarge) { + body = StoredGzip(GzipPayload()); + length = std::to_string(body.size()); + } if (mode == Mode::Informational) { nghttp2_nv early{reinterpret_cast(const_cast(":status")), reinterpret_cast(const_cast("103")), 7, 3, 0}; Require(nghttp2_submit_headers(session, 0, stream, nullptr, &early, 1, nullptr) == 0, "server informational response"); @@ -201,6 +255,7 @@ private: std::vector> fields{{":status", status}, {"x-loopback", "yes"}}; if (mode != Mode::NoLength) fields.emplace_back("content-length", length); if (mode == Mode::Redirect) fields.emplace_back("location", "/another"); + if (mode == Mode::Gzip || mode == Mode::GzipSplit || mode == Mode::GzipTruncated || mode == Mode::GzipChecksum || mode == Mode::GzipConcat || mode == Mode::GzipLarge) fields.emplace_back("content-encoding", "gzip"); std::vector response; for (auto& [name, value] : fields) response.push_back({reinterpret_cast(name.data()), reinterpret_cast(value.data()), name.size(), value.size(), 0}); nghttp2_data_provider2 provider{}; @@ -259,6 +314,12 @@ private: } if (!sent) break; } + if (mode == Mode::GzipSplit && splitSent && !splitResumed) { + std::this_thread::sleep_for(std::chrono::milliseconds(200)); + Require(nghttp2_session_resume_data(session, 1) == 0, "resume split gzip body"); + splitResumed = true; + continue; + } if (IsEarly() && responded && sent) { Stage(2); if (!resetSent && (mode == Mode::EarlyReset || mode == Mode::EarlyResetIncomplete)) { @@ -355,6 +416,94 @@ void Success(int ssl, Mode mode, bool disableCa = false) { Require(Throws([&] { sceHttp2SendRequest(client.request, nullptr, 0); }), "unsupported reuse throws"); } +void Gzip(int ssl) { + std::fprintf(stderr, "HTTP2 gzip scenario\n"); + for (const int enabled : {1, 0}) { + Server server(Mode::Gzip); + Client client(ssl); + Require(sceHttp2SetInflateGZIPEnabled(client.tmpl, enabled) == 0, "gzip option"); + client.Create(server.Url()); + Require(sceHttp2SendRequest(client.request, nullptr, 0) == 0, "gzip send"); + int kind = -1; + std::uint64_t length = 0; + Require(sceHttp2GetResponseContentLength(client.request, &kind, &length) == 0, "gzip length"); + std::array buffer{}; + const int count = sceHttp2ReadData(client.request, buffer.data(), buffer.size()); + if (enabled) { + Require(kind == 0 && length == 13 && count == 13 && std::string(buffer.data(), 13) == "response body", "gzip inflated body"); + } else { + Require(kind == 0 && length == 33 && count == 33 && static_cast(buffer[0]) == 0x1f && + static_cast(buffer[1]) == 0x8b, "gzip passthrough body"); + } + server.Join(); + } +} + +void GzipSplit(int ssl) { + std::fprintf(stderr, "HTTP2 gzip split scenario\n"); + Server server(Mode::GzipSplit); + Client client(ssl); + Require(sceHttp2SetInflateGZIPEnabled(client.tmpl, 1) == 0, "gzip split option"); + client.Create(server.Url()); + Require(sceHttp2SendRequest(client.request, nullptr, 0) == 0, "gzip split send"); + std::string body; + std::array buffer; + while (body.size() < 12) { + const int count = sceHttp2ReadData(client.request, buffer.data(), buffer.size()); + Require(count > 0 && count <= static_cast(buffer.size()), "gzip split read count"); + body.append(buffer.data(), static_cast(count)); + } + int kind = -1; + std::uint64_t length = 0; + Require(sceHttp2GetResponseContentLength(client.request, &kind, &length) == 0, "gzip split length"); + Require(kind == 0 && length == 13, "gzip split inflated length"); + for (;;) { + const int count = sceHttp2ReadData(client.request, buffer.data(), buffer.size()); + Require(count >= 0 && count <= static_cast(buffer.size()), "gzip split read count"); + if (!count) break; + body.append(buffer.data(), static_cast(count)); + } + Require(body == "response body", "gzip split inflated body"); + server.Join(); +} + +void GzipLarge(int ssl) { + std::fprintf(stderr, "HTTP2 gzip large scenario\n"); + Server server(Mode::GzipLarge); + Client client(ssl); + Require(sceHttp2SetInflateGZIPEnabled(client.tmpl, 1) == 0, "gzip large option"); + client.Create(server.Url()); + Require(sceHttp2SendRequest(client.request, nullptr, 0) == 0, "gzip large send"); + int kind = -1; + std::uint64_t length = 0; + Require(sceHttp2GetResponseContentLength(client.request, &kind, &length) == 0, "gzip large length"); + Require(kind == 0 && length == 70000, "gzip large inflated length"); + std::string body; + std::array buffer; + for (;;) { + const int count = sceHttp2ReadData(client.request, buffer.data(), buffer.size()); + Require(count >= 0 && count <= static_cast(buffer.size()), "gzip large read count"); + if (!count) break; + body.append(buffer.data(), static_cast(count)); + } + Require(body == GzipPayload(), "gzip large inflated body"); + server.Join(); +} + +void GzipFailure(int ssl, Mode mode, const char* message) { + std::fprintf(stderr, "HTTP2 gzip failure scenario %d\n", static_cast(mode)); + Server server(mode); + Client client(ssl); + Require(sceHttp2SetInflateGZIPEnabled(client.tmpl, 1) == 0, "gzip failure option"); + client.Create(server.Url()); + Require(Throws([&] { + sceHttp2SendRequest(client.request, nullptr, 0); + std::array buffer; + sceHttp2ReadData(client.request, buffer.data(), buffer.size()); + }), message); + server.Join(); +} + void Failure(int ssl, Mode mode, bool verifyName = false) { std::fprintf(stderr, "HTTP2 failure scenario %d\n", static_cast(mode)); Server server(mode); @@ -586,6 +735,12 @@ int main(int argc, char** argv) { } else { Require(argc == 1, "test arguments"); for (const auto mode : {Mode::Normal, Mode::Large, Mode::NoLength, Mode::Head, Mode::NotFound, Mode::Redirect, Mode::Auth, Mode::Informational}) Success(ssl, mode); + Gzip(ssl); + GzipSplit(ssl); + GzipLarge(ssl); + GzipFailure(ssl, Mode::GzipTruncated, "truncated gzip throws"); + GzipFailure(ssl, Mode::GzipChecksum, "gzip checksum mismatch throws"); + GzipFailure(ssl, Mode::GzipConcat, "concatenated gzip members throw"); for (const auto mode : {Mode::NoAlpn, Mode::Reset, Mode::Truncate, Mode::Redirect, Mode::Auth}) Failure(ssl, mode); Failure(ssl, Mode::Normal, true); for (const auto mode : {Mode::StallHandshake, Mode::StallHeaders, Mode::StallBody, Mode::StallUpload}) { diff --git a/core/libs/tests/GuestInvitationDialog.cpp b/core/libs/tests/GuestInvitationDialog.cpp index 37978bac59..f7caafb0fc 100644 --- a/core/libs/tests/GuestInvitationDialog.cpp +++ b/core/libs/tests/GuestInvitationDialog.cpp @@ -1,4 +1,6 @@ #include "prx/libSceInvitationDialog/include/Api.hpp" +#include "prx/libSceIme/include/ModalDialog.hpp" +#include "prx/libSceIme/include/PsnDialogNotice.hpp" #include "prx/libSceCommonDialog/include/Api.hpp" #include "prx/libSceCommonDialog/include/DialogUse.hpp" #include "prx/libc/include/general/VabiMacros.hpp" @@ -173,6 +175,36 @@ void TestStatusAndPending() { Require(sceInvitationDialogGetStatus_nid_postfix() == StatusNone, "status after terminate"); } + +bool PsnNoticeShown() { + ModalDialogView view; + if (!ModalDialogReadView_nid_postfix(view)) return false; + return view.message == PsnDialogNoticeRequest(PsnDialogNoticeKind::PsnFeature).message; +} + +void RequireNotices() { + const InvitationDialogParam send = MakeParam(ModeSend, nullptr); + ModalDialogSetPresenter_nid_postfix(true); + Require(sceInvitationDialogInitialize() == 0, "initialize for the notice check"); + + PsnDialogNoticeSetMode_nid_postfix(PsnDialogNoticeMode::Silent); + ModalDialogReset_nid_postfix(ModalDialogAnyOwner); + Require(sceInvitationDialogOpen(&send) == 0, "silent open"); + Require(!PsnNoticeShown() && !ModalDialogCapturesInput_nid_postfix(), "silent mode showed a notice"); + + PsnDialogNoticeSetMode_nid_postfix(PsnDialogNoticeMode::Show); + ModalDialogReset_nid_postfix(ModalDialogAnyOwner); + Require(sceInvitationDialogOpen(nullptr) == ArgNull, "null open"); + Require(!PsnNoticeShown(), "a refused open showed the notice"); + Require(sceInvitationDialogOpen(&send) == 0, "show open"); + Require(PsnNoticeShown(), "open did not show the PSN notice"); + + ModalDialogReset_nid_postfix(ModalDialogAnyOwner); + ModalDialogSetPresenter_nid_postfix(false); + PsnDialogNoticeSetMode_nid_postfix(PsnDialogNoticeMode::Silent); + Require(sceInvitationDialogTerminate() == 0, "terminate after the notice check"); +} + } int main() { @@ -181,5 +213,6 @@ int main() { TestOpenChecks(); TestCanceled(); TestStatusAndPending(); + RequireNotices(); return 0; } diff --git a/core/libs/tests/GuestJscString.cpp b/core/libs/tests/GuestJscString.cpp index 779be13872..7100b450b8 100644 --- a/core/libs/tests/GuestJscString.cpp +++ b/core/libs/tests/GuestJscString.cpp @@ -49,26 +49,26 @@ static void Unicode() { utf16.data(), utf16.data() + utf16.size(), writtenUnits) == std::codecvt_base::ok); Require(readBytes == utf8.data() + utf8.size()); utf16.resize(writtenUnits - utf16.data()); - auto* string = JSStringCreateWithUTF8CString(utf8.c_str()); - Require(JSStringGetLength(string) == utf16.size()); - const auto* characters = JSStringGetCharactersPtr(string); + auto* string = JSStringCreateWithUTF8CString_nid_postfix(utf8.c_str()); + Require(JSStringGetLength_nid_postfix(string) == utf16.size()); + const auto* characters = JSStringGetCharactersPtr_nid_postfix(string); Require(std::equal(utf16.begin(), utf16.end(), characters)); const std::vector units(utf16.begin(), utf16.end()); - auto* other = JSStringCreateWithCharacters(units.data(), units.size()); + auto* other = JSStringCreateWithCharacters_nid_postfix(units.data(), units.size()); Require(JSStringIsEqual(string, other)); - Require(JSStringGetMaximumUTF8CStringSize(string) == utf16.size() * 3 + 1); + Require(JSStringGetMaximumUTF8CStringSize_nid_postfix(string) == utf16.size() * 3 + 1); std::vector buffer(utf8.size() + 2, '?'); - Require(JSStringGetUTF8CString(string, buffer.data(), buffer.size() - 1) == utf8.size() + 1); + Require(JSStringGetUTF8CString_nid_postfix(string, buffer.data(), buffer.size() - 1) == utf8.size() + 1); Require(std::memcmp(buffer.data(), utf8.c_str(), utf8.size() + 1) == 0); Require(buffer.back() == '?'); - JSStringRelease(other); - JSStringRelease(string); + JSStringRelease_nid_postfix(other); + JSStringRelease_nid_postfix(string); } static void Boundaries() { const char text[] = "A\xC2\xA2\xE2\x82\xAC\xF0\x9F\x98\x80Z"; - auto* string = JSStringCreateWithUTF8CString(text); - Require(JSStringGetLength(string) == 6); + auto* string = JSStringCreateWithUTF8CString_nid_postfix(text); + Require(JSStringGetLength_nid_postfix(string) == 6); const std::array complete{0, 1, 3, 6, 10, 11}; for (std::size_t capacity = 1; capacity <= sizeof(text) + 1; ++capacity) { std::array buffer; @@ -77,19 +77,19 @@ static void Boundaries() { for (const auto length : complete) { if (length < capacity) expected = length; } - Require(JSStringGetUTF8CString(string, buffer.data(), capacity) == expected + 1); + Require(JSStringGetUTF8CString_nid_postfix(string, buffer.data(), capacity) == expected + 1); Require(std::memcmp(buffer.data(), text, expected) == 0 && buffer[expected] == '\0'); for (auto index = expected + 1; index < buffer.size(); ++index) Require(buffer[index] == '?'); } char unchanged = '!'; - Require(JSStringGetUTF8CString(string, &unchanged, 0) == 0 && unchanged == '!'); - Require(JSStringGetUTF8CString(string, nullptr, 10) == 0); - Require(JSStringGetUTF8CString(nullptr, &unchanged, 1) == 0 && unchanged == '!'); - Require(JSStringGetLength(nullptr) == 0 && JSStringGetCharactersPtr(nullptr) == nullptr); + Require(JSStringGetUTF8CString_nid_postfix(string, &unchanged, 0) == 0 && unchanged == '!'); + Require(JSStringGetUTF8CString_nid_postfix(string, nullptr, 10) == 0); + Require(JSStringGetUTF8CString_nid_postfix(nullptr, &unchanged, 1) == 0 && unchanged == '!'); + Require(JSStringGetLength_nid_postfix(nullptr) == 0 && JSStringGetCharactersPtr_nid_postfix(nullptr) == nullptr); Require(JSStringIsEqual(nullptr, nullptr) && !JSStringIsEqual(nullptr, string)); Require(JSStringIsEqualToUTF8CString(string, text)); Require(!JSStringIsEqualToUTF8CString(string, "a")); - JSStringRelease(string); + JSStringRelease_nid_postfix(string); } static void Invalid() { @@ -100,61 +100,61 @@ static void Invalid() { std::numeric_limits::max()}) { bool threw = false; try { - JSStringCreateWithCharacters(unavailable, count); + JSStringCreateWithCharacters_nid_postfix(unavailable, count); } catch (const std::length_error&) { threw = true; } Require(threw); - auto* nullCharacters = JSStringCreateWithCharacters(nullptr, count); - Require(JSStringGetLength(nullCharacters) == 0 && JSStringGetCharactersPtr(nullCharacters) == nullptr); + auto* nullCharacters = JSStringCreateWithCharacters_nid_postfix(nullptr, count); + Require(JSStringGetLength_nid_postfix(nullCharacters) == 0 && JSStringGetCharactersPtr_nid_postfix(nullCharacters) == nullptr); Require(JSStringIsEqualToUTF8CString(nullCharacters, nullptr)); - JSStringRelease(nullCharacters); + JSStringRelease_nid_postfix(nullCharacters); } - auto* empty = JSStringCreateWithUTF8CString(""); - Require(JSStringGetLength(empty) == 0); - auto* nullString = JSStringCreateWithCharacters(nullptr, 0); - Require(JSStringGetLength(nullString) == 0 && JSStringGetCharactersPtr(nullString) == nullptr); + auto* empty = JSStringCreateWithUTF8CString_nid_postfix(""); + Require(JSStringGetLength_nid_postfix(empty) == 0); + auto* nullString = JSStringCreateWithCharacters_nid_postfix(nullptr, 0); + Require(JSStringGetLength_nid_postfix(nullString) == 0 && JSStringGetCharactersPtr_nid_postfix(nullString) == nullptr); Require(!JSStringIsEqual(empty, nullString)); Require(JSStringIsEqualToUTF8CString(nullString, "\xFF")); - JSStringRelease(nullString); + JSStringRelease_nid_postfix(nullString); for (const auto* invalid : {"\x80", "\xC0\x80", "\xC1\xBF", "\xE0\x80\x80", "\xED\xA0\x80", "\xF0\x80\x80\x80", "\xF4\x90\x80\x80", "\xF5\x80\x80\x80", "\xFF", "x\xC2", "x\xE2\x82", "x\xF0\x9F\x98", "\xE2!"}) { - auto* string = JSStringCreateWithUTF8CString(invalid); - Require(JSStringGetLength(string) == 0 && JSStringGetCharactersPtr(string) == nullptr); + auto* string = JSStringCreateWithUTF8CString_nid_postfix(invalid); + Require(JSStringGetLength_nid_postfix(string) == 0 && JSStringGetCharactersPtr_nid_postfix(string) == nullptr); Require(!JSStringIsEqual(string, empty)); Require(JSStringIsEqualToUTF8CString(string, "\xFF")); char buffer = '!'; - Require(JSStringGetUTF8CString(string, &buffer, 1) == 1 && buffer == '\0'); - JSStringRelease(string); + Require(JSStringGetUTF8CString_nid_postfix(string, &buffer, 1) == 1 && buffer == '\0'); + JSStringRelease_nid_postfix(string); } for (const auto& units : std::vector>{{0xD800}, {0xDC00}, {'x', 0xD800}, {'x', 0xDC00, 'y'}, {'x', 0xD800, 'y'}}) { - auto* string = JSStringCreateWithCharacters(units.data(), units.size()); - Require(JSStringGetLength(string) == units.size()); - Require(std::equal(units.begin(), units.end(), JSStringGetCharactersPtr(string))); + auto* string = JSStringCreateWithCharacters_nid_postfix(units.data(), units.size()); + Require(JSStringGetLength_nid_postfix(string) == units.size()); + Require(std::equal(units.begin(), units.end(), JSStringGetCharactersPtr_nid_postfix(string))); std::array buffer; buffer.fill('?'); const std::size_t prefix = units[0] == 'x' ? 1 : 0; - Require(JSStringGetUTF8CString(string, buffer.data(), buffer.size()) == prefix + 1); + Require(JSStringGetUTF8CString_nid_postfix(string, buffer.data(), buffer.size()) == prefix + 1); Require(buffer[prefix] == '\0' && buffer[prefix + 1] == '?'); - JSStringRelease(string); + JSStringRelease_nid_postfix(string); } - JSStringRelease(empty); + JSStringRelease_nid_postfix(empty); } static void NullText() { - auto* nullText = JSStringCreateWithUTF8CString(nullptr); - Require(JSStringGetLength(nullText) == 0 && JSStringGetCharactersPtr(nullText) == nullptr); - Require(JSStringGetMaximumUTF8CStringSize(nullText) == 1); + auto* nullText = JSStringCreateWithUTF8CString_nid_postfix(nullptr); + Require(JSStringGetLength_nid_postfix(nullText) == 0 && JSStringGetCharactersPtr_nid_postfix(nullText) == nullptr); + Require(JSStringGetMaximumUTF8CStringSize_nid_postfix(nullText) == 1); char buffer = '!'; - Require(JSStringGetUTF8CString(nullText, &buffer, 1) == 1 && buffer == '\0'); - auto* malformed = JSStringCreateWithUTF8CString("\xFF"); - auto* nullCharacters = JSStringCreateWithCharacters(nullptr, 0); - auto* empty = JSStringCreateWithUTF8CString(""); + Require(JSStringGetUTF8CString_nid_postfix(nullText, &buffer, 1) == 1 && buffer == '\0'); + auto* malformed = JSStringCreateWithUTF8CString_nid_postfix("\xFF"); + auto* nullCharacters = JSStringCreateWithCharacters_nid_postfix(nullptr, 0); + auto* empty = JSStringCreateWithUTF8CString_nid_postfix(""); const std::array unit{'x'}; - auto* emptyCharacters = JSStringCreateWithCharacters(unit.data(), 0); - auto* text = JSStringCreateWithUTF8CString("null"); + auto* emptyCharacters = JSStringCreateWithCharacters_nid_postfix(unit.data(), 0); + auto* text = JSStringCreateWithUTF8CString_nid_postfix("null"); Require(JSStringIsEqual(nullText, malformed) && JSStringIsEqual(nullText, nullCharacters)); Require(!JSStringIsEqual(nullText, empty) && !JSStringIsEqual(nullText, emptyCharacters)); - Require(JSStringGetCharactersPtr(emptyCharacters) != nullptr && JSStringIsEqual(empty, emptyCharacters)); + Require(JSStringGetCharactersPtr_nid_postfix(emptyCharacters) != nullptr && JSStringIsEqual(empty, emptyCharacters)); Require(JSStringIsEqualToUTF8CString(nullText, nullptr)); Require(JSStringIsEqualToUTF8CString(malformed, nullptr)); Require(JSStringIsEqualToUTF8CString(nullCharacters, nullptr)); @@ -165,7 +165,7 @@ static void NullText() { Require(!JSStringIsEqualToUTF8CString(nullptr, "")); Require(JSStringIsEqualToUTF8CString(nullText, "\xC0\x80")); Require(!JSStringIsEqualToUTF8CString(nullText, "")); - for (auto* string : {nullText, malformed, nullCharacters, empty, emptyCharacters, text}) JSStringRelease(string); + for (auto* string : {nullText, malformed, nullCharacters, empty, emptyCharacters, text}) JSStringRelease_nid_postfix(string); } template static bool Faults(Call call) { @@ -178,24 +178,24 @@ template static bool Faults(Call call) { } static void NullHandles() { - Require(Faults([] { JSStringRetain(nullptr); })); - Require(Faults([] { JSStringRelease(nullptr); })); - Require(Faults([] { JSStringGetMaximumUTF8CStringSize(nullptr); })); + Require(Faults([] { JSStringRetain_nid_postfix(nullptr); })); + Require(Faults([] { JSStringRelease_nid_postfix(nullptr); })); + Require(Faults([] { JSStringGetMaximumUTF8CStringSize_nid_postfix(nullptr); })); } static void References() { - auto* string = JSStringCreateWithUTF8CString("wrap"); + auto* string = JSStringCreateWithUTF8CString_nid_postfix("wrap"); Require(string->references.load() == 1); - Require(JSStringRetain(string) == string && string->references.load() == 2); - JSStringRelease(string); + Require(JSStringRetain_nid_postfix(string) == string && string->references.load() == 2); + JSStringRelease_nid_postfix(string); Require(string->references.load() == 1); string->references.store(std::numeric_limits::max()); - Require(JSStringRetain(string) == string && string->references.load() == 0); - JSStringRelease(string); + Require(JSStringRetain_nid_postfix(string) == string && string->references.load() == 0); + JSStringRelease_nid_postfix(string); Require(string->references.load() == std::numeric_limits::max()); Require(JSStringIsEqualToUTF8CString(string, "wrap")); string->references.store(1); - JSStringRelease(string); + JSStringRelease_nid_postfix(string); } static void Limits() { @@ -218,42 +218,42 @@ static void Limits() { static void MaximumSize() { for (const auto* text : {"", "a", "\xC2\xA2", "\xE2\x82\xAC", "\xF0\x9F\x98\x80", "abc\xF0\x9F\x98\x80"}) { - auto* string = JSStringCreateWithUTF8CString(text); - Require(JSStringGetMaximumUTF8CStringSize(string) == JSStringGetLength(string) * 3 + 1); - JSStringRelease(string); + auto* string = JSStringCreateWithUTF8CString_nid_postfix(text); + Require(JSStringGetMaximumUTF8CStringSize_nid_postfix(string) == JSStringGetLength_nid_postfix(string) * 3 + 1); + JSStringRelease_nid_postfix(string); } std::vector units(1000, 'u'); - auto* string = JSStringCreateWithCharacters(units.data(), units.size()); - Require(JSStringGetMaximumUTF8CStringSize(string) == 3001); - JSStringRelease(string); + auto* string = JSStringCreateWithCharacters_nid_postfix(units.data(), units.size()); + Require(JSStringGetMaximumUTF8CStringSize_nid_postfix(string) == 3001); + JSStringRelease_nid_postfix(string); } static void Ownership() { std::array units{'A', 0, 0x03A9, 'B'}; - auto* string = JSStringCreateWithCharacters(units.data(), units.size()); + auto* string = JSStringCreateWithCharacters_nid_postfix(units.data(), units.size()); units.fill('?'); - const auto* pointer = JSStringGetCharactersPtr(string); + const auto* pointer = JSStringGetCharactersPtr_nid_postfix(string); Require(pointer[0] == 'A' && pointer[1] == 0 && pointer[2] == 0x03A9 && pointer[3] == 'B'); std::array buffer{}; - Require(JSStringGetUTF8CString(string, buffer.data(), buffer.size()) == 6); + Require(JSStringGetUTF8CString_nid_postfix(string, buffer.data(), buffer.size()) == 6); const std::array expected{'A', 0, static_cast(0xCE), static_cast(0xA9), 'B', 0}; Require(std::equal(expected.begin(), expected.end(), buffer.begin())); - auto* retained = JSStringRetain(string); + auto* retained = JSStringRetain_nid_postfix(string); Require(retained == string); - JSStringRelease(string); - Require(JSStringGetCharactersPtr(retained) == pointer && JSStringGetLength(retained) == 4); + JSStringRelease_nid_postfix(string); + Require(JSStringGetCharactersPtr_nid_postfix(retained) == pointer && JSStringGetLength_nid_postfix(retained) == 4); std::vector threads; for (unsigned index = 0; index < 4; ++index) { threads.emplace_back([retained] { for (unsigned count = 0; count < 5000; ++count) { - Require(JSStringRetain(retained) == retained); - Require(JSStringGetLength(retained) == 4); - JSStringRelease(retained); + Require(JSStringRetain_nid_postfix(retained) == retained); + Require(JSStringGetLength_nid_postfix(retained) == 4); + JSStringRelease_nid_postfix(retained); } }); } for (auto& thread : threads) thread.join(); - JSStringRelease(retained); + JSStringRelease_nid_postfix(retained); } int main() { diff --git a/core/libs/tests/GuestJxrLookup.cpp b/core/libs/tests/GuestJxrLookup.cpp index fea9861f98..5b1b53b757 100644 --- a/core/libs/tests/GuestJxrLookup.cpp +++ b/core/libs/tests/GuestJxrLookup.cpp @@ -263,6 +263,49 @@ int main(int argc, char** argv) { const auto query = reinterpret_cast(dlsym(library, name)); #endif Require(query != nullptr, "missing lookup export"); + struct InterfaceIdCase { + const char* nid; + const char* rawName; + std::uint32_t value; + }; + const InterfaceIdCase interfaceIds[] = { + {"k+4-1XDjo9w", "k+4-1XDjo9w_nid_no_patch_cut", 1}, + {"HCxT7mELyYA", "HCxT7mELyYA_nid_no_patch_cut", 2}, + {"qpgXDRp+K6M", "qpgXDRp+K6M_nid_no_patch_cut", 101}, + {"ggCncb0pD6w", "ggCncb0pD6w_nid_no_patch_cut", 201}, + }; + const void* interfaceAddresses[4]{}; + for (std::size_t i = 0; i < 4; ++i) { + const char* idName = std::strcmp(argv[2], "patched") == 0 ? interfaceIds[i].nid : interfaceIds[i].rawName; +#ifdef _WIN32 + const auto id = reinterpret_cast(GetProcAddress(library, idName)); +#else + const auto id = dlsym(library, idName); +#endif + Require(id != nullptr && reinterpret_cast(id) % alignof(std::uint32_t) == 0, + "missing or unaligned interface identifier"); + std::uint32_t value = 0; + std::memcpy(&value, id, sizeof(value)); + Require(value == interfaceIds[i].value, "incorrect interface identifier"); + for (std::size_t j = 0; j < i; ++j) { + Require(id != interfaceAddresses[j], "interface identifiers share storage"); + } + interfaceAddresses[i] = id; + } + const char* guidName = std::strcmp(argv[2], "patched") == 0 ? "SPdQvn+6-IA" : "SPdQvn+6-IA_nid_no_patch_cut"; +#ifdef _WIN32 + const auto guid = reinterpret_cast(GetProcAddress(library, guidName)); +#else + const auto guid = dlsym(library, guidName); +#endif + Require(guid != nullptr && reinterpret_cast(guid) % 16 == 0, "missing or unaligned Gray8 GUID"); + Reference gray; + Require(ReadReference(8, false, false, gray), "Gray8 reference missing"); + Require(std::memcmp(guid, gray.guid.data(), gray.guid.size()) == 0, "exported Gray8 GUID differs from native reference"); + JxrPixelInfo exportedGuid{}; + exportedGuid.guid = guid; + Require(query(&exportedGuid, 0) == 0, "lookup with exported Gray8 GUID"); + CheckValue(exportedGuid, gray); if (argc == 4) { Require(std::strcmp(argv[3], "forward") == 0 || std::strcmp(argv[3], "reverse") == 0, "padding direction"); PaddingCases(query, std::strcmp(argv[3], "reverse") == 0); diff --git a/core/libs/tests/GuestKernelSys.cpp b/core/libs/tests/GuestKernelSys.cpp index 1c0fe74f80..25969b5a01 100644 --- a/core/libs/tests/GuestKernelSys.cpp +++ b/core/libs/tests/GuestKernelSys.cpp @@ -591,6 +591,180 @@ void CheckAmmWaitCompletion() { Require(sceKernelWaitCommandBufferCompletion(id + 1) == SCE_KERNEL_ERROR_ESRCH && sceAmprAmmWaitCommandBufferCompletion(id + 1) == SCE_KERNEL_ERROR_ESRCH); } +template +void CheckRecordedCommand(TWrite write, const TCommand& expected) { + std::uint64_t measured = ~std::uint64_t{0}; + Require(write(nullptr, &measured) == 0 && measured == sizeof(TCommand)); + std::array written{}; + written.fill(0xCC); + std::uint64_t reported = ~std::uint64_t{0}; + Require(write(written.data(), &reported) == 0 && reported == sizeof(TCommand)); + Require(std::memcmp(written.data(), &expected, sizeof(TCommand)) == 0 && written[sizeof(TCommand)] == 0xCC); + written.fill(0xCC); + Require(write(written.data(), nullptr) == 0 && std::memcmp(written.data(), &expected, sizeof(TCommand)) == 0); +} + +template +void CheckRejectedCommand(TWrite write) { + std::array written{}; + written.fill(0xCC); + std::uint64_t reported = ~std::uint64_t{0}; + Require(write(written.data(), &reported) == SCE_KERNEL_ERROR_EINVAL && reported == ~std::uint64_t{0}); + Require(std::all_of(written.begin(), written.end(), [](std::uint8_t byte) { return byte == 0xCC; })); +} + +template +bool CommandThrows(TWrite write) { + std::array written{}; + std::uint64_t reported = 0; + try { + write(written.data(), &reported); + } catch (const std::exception&) { + return true; + } + return false; +} + +void CheckAmmCommandWriters() { + using Apr::Opcode; + constexpr std::uint64_t page = 0x4000; + std::uint64_t start = 0; + std::uint64_t end = 0; + std::uint64_t multimapStart = 0; + std::uint64_t multimapEnd = 0; + Require(sceAmprAmmGetVirtualAddressRanges(&start, &end, &multimapStart, &multimapEnd) == 0); + const std::uint64_t prt = start + 0x400000; + + CheckRecordedCommand([&](void* dst, std::uint64_t* size) { return sceKernelWriteUnmapToPrtCommand(dst, prt, 2 * page, size); }, Apr::AmmUnmapCommand{{Opcode::AmmUnmapToPrt, sizeof(Apr::AmmUnmapCommand)}, prt, 2 * page}); + CheckRecordedCommand([&](void* dst, std::uint64_t* size) { return sceKernelWriteMapCommand2(dst, prt, page, 0, 0, 1, size); }, Apr::AmmUnmapCommand{{Opcode::AmmMapAsPrt, sizeof(Apr::AmmUnmapCommand)}, prt, page}); + constexpr std::uint64_t top = std::uint64_t{0} - page; + CheckRecordedCommand([&](void* dst, std::uint64_t* size) { return sceKernelWriteUnmapToPrtCommand(dst, top, page, size); }, Apr::AmmUnmapCommand{{Opcode::AmmUnmapToPrt, sizeof(Apr::AmmUnmapCommand)}, top & 0xFFFFFFFFFFFFull, page}); + CheckRecordedCommand([&](void* dst, std::uint64_t* size) { return sceKernelWriteMapCommand2(dst, top, page, 0, 0, 1, size); }, Apr::AmmUnmapCommand{{Opcode::AmmMapAsPrt, sizeof(Apr::AmmUnmapCommand)}, top & 0xFFFFFFFFFFFFull, page}); + CheckRejectedCommand([&](void* dst, std::uint64_t* size) { return sceKernelWriteUnmapToPrtCommand(dst, top - page, page, size); }); + CheckRejectedCommand([&](void* dst, std::uint64_t* size) { return sceKernelWriteMapCommand2(dst, top - page, page, 0, 0, 1, size); }); + for (const std::uint64_t wrapped : {std::uint64_t{0} - page, std::uint64_t{0} - 0x800000}) { + CheckRecordedCommand([&](void* dst, std::uint64_t* size) { return sceKernelWriteUnmapToPrtCommand(dst, prt, wrapped, size); }, Apr::AmmUnmapCommand{{Opcode::AmmUnmapToPrt, sizeof(Apr::AmmUnmapCommand)}, prt, wrapped & 0x1FFFFFFC000ull}); + CheckRecordedCommand([&](void* dst, std::uint64_t* size) { return sceKernelWriteMapCommand2(dst, prt, wrapped, 0, 0, 1, size); }, Apr::AmmUnmapCommand{{Opcode::AmmMapAsPrt, sizeof(Apr::AmmUnmapCommand)}, prt, wrapped & 0x1FFFFFFC000ull}); + } + for (const auto [address, size] : {std::pair{prt, std::uint64_t{0}}, std::pair{prt + 8, page}, std::pair{end - page, 2 * page}, std::pair{start - page, page}}) { + CheckRejectedCommand([&](void* dst, std::uint64_t* outSize) { return sceKernelWriteUnmapToPrtCommand(dst, address, size, outSize); }); + CheckRejectedCommand([&](void* dst, std::uint64_t* outSize) { return sceKernelWriteMapCommand2(dst, address, size, 0, 0, 1, outSize); }); + } + Require(CommandThrows([&](void* dst, std::uint64_t* size) { return sceKernelWriteMapCommand2(dst, prt, page, 3, 0, 1, size); })); + Require(CommandThrows([&](void* dst, std::uint64_t* size) { return sceKernelWriteMapCommand2(dst, prt, page, 0, 0x03, 1, size); })); + std::array map{}; + std::array map2{}; + std::uint64_t mapBytes = 0; + std::uint64_t map2Bytes = 0; + Require(sceKernelWriteMapCommand(map.data(), prt, page, 0, 0x03, &mapBytes) == 0); + Require(sceKernelWriteMapCommand2(map2.data(), prt, page, 0, 0x03, 0, &map2Bytes) == 0 && map2Bytes == mapBytes && map2 == map); + CheckRejectedCommand([&](void* dst, std::uint64_t* size) { return sceKernelWriteMapCommand2(dst, prt + 8, page, 0, 0x03, 0, size); }); + + CheckRecordedCommand([&](void* dst, std::uint64_t* size) { return sceKernelWriteWriteAddressCommand(dst, 0xFFFF123456789AB7ull, 0x1122334455667788ull, size); }, Apr::WriteAddressCommand{{Opcode::WriteAddress, sizeof(Apr::WriteAddressCommand)}, 0x123456789AB0ull, 0x1122334455667788ull, 0, 0}); + CheckRecordedCommand([&](void* dst, std::uint64_t* size) { return sceKernelWriteWriteCounterCommand(dst, 7, 0xDEADBEEFu, size); }, Apr::WriteCounterCommand{{Opcode::WriteCounter, sizeof(Apr::WriteCounterCommand)}, 7, Apr::CounterAccess::Size4, Apr::CounterOperation::Store, 0, 0xDEADBEEFu}); + + CheckRecordedCommand([&](void* dst, std::uint64_t* size) { return sceKernelWriteWaitOnAddressCommand(dst, 0xFFFF000000001000ull, 42, 2, 1, size); }, Apr::WaitCommand{{Opcode::WaitOnAddress, sizeof(Apr::WaitCommand)}, 0x1000, 42, ~std::uint64_t{0}, 0, 2, Apr::CounterAccess::Size8, 0}); + CheckRecordedCommand([&](void* dst, std::uint64_t* size) { return sceKernelWriteWaitOnAddressCommand(dst, 0x1000, 42, -1, 0, size); }, Apr::WaitCommand{{Opcode::WaitOnAddress, sizeof(Apr::WaitCommand)}, 0x1000, 42, ~std::uint64_t{0}, 0, 7, Apr::CounterAccess::Size8, 0}); + CheckRejectedCommand([&](void* dst, std::uint64_t* size) { return sceKernelWriteWaitOnAddressCommand(dst, 0x1000, 42, 4, 0, size); }); + Require(CommandThrows([&](void* dst, std::uint64_t* size) { return sceKernelWriteWaitOnAddressCommand(dst, 0x1004, 42, 2, 0, size); })); + std::uint64_t unalignedSize = 0; + Require(sceKernelWriteWaitOnAddressCommand(nullptr, 0x1004, 42, 2, 0, &unalignedSize) == 0 && unalignedSize == sizeof(Apr::WaitCommand)); + CheckRecordedCommand([&](void* dst, std::uint64_t* size) { return sceKernelWriteWaitOnCounterCommand(dst, 9, 100, 3, 1, size); }, Apr::WaitCommand{{Opcode::WaitOnCounter, sizeof(Apr::WaitCommand)}, 0, 100, ~std::uint64_t{0}, 9, 3, Apr::CounterAccess::Size4, 0}); + CheckRejectedCommand([&](void* dst, std::uint64_t* size) { return sceKernelWriteWaitOnCounterCommand(dst, 9, 100, 4, 0, size); }); + + CheckRecordedCommand([&](void* dst, std::uint64_t* size) { return sceKernelWriteEventQueueOnCompletionCommand(dst, 0x1234, -2, 0xABCD, size); }, Apr::WriteKernelEventQueueCommand{{Opcode::WriteKernelEventQueue, sizeof(Apr::WriteKernelEventQueueCommand)}, 0x1234, 0xFFFFFFFFFFFFFFFEull, 0xABCD, 0}); + CheckRecordedCommand([&](void* dst, std::uint64_t* size) { return sceKernelWriteEventQueueOnCompletionCommand(dst, std::uint64_t{1} << 48u, 1, 2, size); }, Apr::WriteKernelEventQueueCommand{{Opcode::WriteKernelEventQueue, sizeof(Apr::WriteKernelEventQueueCommand)}, 0, 1, 2, 0}); + CheckRejectedCommand([&](void* dst, std::uint64_t* size) { return sceKernelWriteEventQueueOnCompletionCommand(dst, (std::uint64_t{1} << 48u) + 1, 1, 2, size); }); +} + +void CheckAmmWrittenWaitsRun() { + alignas(8) static std::uint64_t ready = 5; + alignas(8) static std::uint64_t done = 0; + std::array commands{}; + std::uint64_t used = 0; + const auto append = [&](auto write) { + std::uint64_t bytes = 0; + Require(write(commands.data() + used, &bytes) == 0); + used += bytes; + }; + append([&](void* dst, std::uint64_t* size) { return sceKernelWriteWriteCounterCommand(dst, 3, 9, size); }); + append([&](void* dst, std::uint64_t* size) { return sceKernelWriteWaitOnCounterCommand(dst, 3, 9, 0, 0, size); }); + append([&](void* dst, std::uint64_t* size) { return sceKernelWriteWaitOnAddressCommand(dst, reinterpret_cast(&ready), 5, 0, 0, size); }); + append([&](void* dst, std::uint64_t* size) { return sceKernelWriteWaitOnAddressCommand(dst, reinterpret_cast(&ready), 5, -4, 0, size); }); + append([&](void* dst, std::uint64_t* size) { return sceKernelWriteWriteAddressCommand(dst, reinterpret_cast(&done), 0x1234, size); }); + Require(used <= commands.size()); + std::uint32_t id = 0; + Require(sceAmprAmmSubmitCommandBuffer3(commands.data(), static_cast(used), 0, &id) == 0 && id != 0); + Require(sceKernelWaitCommandBufferCompletion(id) == 0); + Require(std::atomic_ref(done).load(std::memory_order_acquire) == 0x1234); +} + +template +bool MapperCallThrows(TCall call) { + try { + call(); + } catch (const std::exception&) { + return true; + } + return false; +} + +void CheckAmmMapperCalls() { + constexpr std::uint64_t page = 0x4000; + constexpr std::uint64_t granule = 0x200000; + constexpr std::int32_t cpuReadWrite = 0x03; + std::uint64_t start = 0; + std::uint64_t end = 0; + std::uint64_t multimapStart = 0; + std::uint64_t multimapEnd = 0; + Require(sceAmprAmmGetVirtualAddressRanges(&start, &end, &multimapStart, &multimapEnd) == 0); + + const std::int64_t memoryEnd = static_cast(sceKernelGetDirectMemorySize()); + std::int64_t offset = -1; + Require(sceKernelGiveDirectMemoryToMapper(0, memoryEnd, 0, granule, 1, &offset) == SCE_KERNEL_ERROR_EINVAL && offset == -1); + Require(sceKernelGiveDirectMemoryToMapper(0, memoryEnd, page, granule, 1, &offset) == SCE_KERNEL_ERROR_EINVAL && offset == -1); + Require(sceKernelGiveDirectMemoryToMapper(0, memoryEnd, granule, page, 1, &offset) == SCE_KERNEL_ERROR_EINVAL && offset == -1); + Require(sceKernelGiveDirectMemoryToMapper(0, memoryEnd, granule, granule, 1, &offset) == 0 && offset >= 0); + + std::array param{}; + param.fill(0xAAAAAAAAAAAAAAAAull); + Require(sceKernelMapperGetParam(nullptr) == SCE_KERNEL_ERROR_EINVAL); + param[0] = 0x39; + Require(sceKernelMapperGetParam(param.data()) == SCE_KERNEL_ERROR_EINVAL && param[0] == 0x39 && param[1] == 0xAAAAAAAAAAAAAAAAull); + param[0] = 0x28; + Require(sceKernelMapperGetParam(param.data()) == 0 && param[0] == 0x38 && param[1] == start && param[2] == end && param[3] == multimapStart && param[4] == multimapEnd + && param[5] == 0xAAAAAAAAAAAAAAAAull); + param.fill(0xAAAAAAAAAAAAAAAAull); + param[0] = 0x10; + Require(sceKernelMapperGetParam(param.data()) == 0 && param[0] == 0x38 && param[1] == start && param[2] == 0xAAAAAAAAAAAAAAAAull); + param[0] = 0x30; + Require(MapperCallThrows([&] { sceKernelMapperGetParam(param.data()); })); + + std::array commands{}; + std::uint64_t bytes = 0; + const std::uint64_t first = start + 0x800000; + Require(sceKernelWriteMapDirectCommand(commands.data(), first, static_cast(offset), page, 0, cpuReadWrite, &bytes) == 0); + Require(sceKernelCallIndirectBuffer(0, commands.data(), bytes) == 0); + const std::uint64_t second = first + page; + Require(sceKernelWriteMapDirectCommand(commands.data(), second, static_cast(offset) + page, page, 0, cpuReadWrite, &bytes) == 0); + KernelMapperSubmitResult result{7, 7}; + std::uint32_t id = 0; + Require(sceKernelCallIndirectBuffer2(1, commands.data(), bytes, &result, &id) == 0 && result.result == 0 && result.errorOffset == 0 && id != 0); + Require(sceKernelWaitCommandBufferCompletion(id) == 0); + const std::uint64_t third = second + page; + Require(sceKernelWriteMapDirectCommand(commands.data(), third, static_cast(offset) + 2 * page, page, 0, cpuReadWrite, &bytes) == 0); + std::uint32_t thirdId = 0; + Require(sceKernelCallIndirectBuffer3(2, commands.data(), bytes, &thirdId) == 0 && thirdId > id); + Require(sceKernelWaitCommandBufferCompletion(thirdId) == 0); + for (const std::uint64_t mapped : {first, second, third}) { + auto* byte = reinterpret_cast(mapped); + *byte = 0x5A; + Require(*byte == 0x5A); + } + Require(MapperCallThrows([&] { sceKernelCallIndirectBuffer(3, commands.data(), bytes); })); + Require(MapperCallThrows([&] { sceKernelCallIndirectBuffer3(0, nullptr, bytes, &thirdId); })); +} + void CheckAmmWaitConcurrentSubmits() { constexpr int submitters = 4; constexpr int submissions = 4000; @@ -792,17 +966,24 @@ void DirectoryRenameTests(const std::filesystem::path& parent) { } static void CheckProcessQueries() { - KernelTitleWorkaround workaround{1, 0, {(1ull << 3) | (1ull << 0x39), ~0ull}}; - std::int32_t enabled = -1; - Require(sceKernelTitleWorkaroundIsEnabled(nullptr, 3, &enabled) == static_cast(0x8002000E)); - Require(sceKernelTitleWorkaroundIsEnabled(&workaround, 3, nullptr) == static_cast(0x8002000E)); - Require(sceKernelTitleWorkaroundIsEnabled(&workaround, 0x3A, &enabled) == static_cast(0x80020016) && enabled == -1); - Require(sceKernelTitleWorkaroundIsEnabled(&workaround, -1, &enabled) == static_cast(0x80020016) && enabled == -1); - Require(sceKernelTitleWorkaroundIsEnabled(&workaround, 3, &enabled) == 0 && enabled == 1); - Require(sceKernelTitleWorkaroundIsEnabled(&workaround, 4, &enabled) == 0 && enabled == 0); - Require(sceKernelTitleWorkaroundIsEnabled(&workaround, 63, &enabled) == static_cast(0x80020016)); - Require(sceKernelTitleWorkaroundIsEnabled(&workaround, 0x39, &enabled) == 0 && enabled == 1); - Require(sceKernelTitleWorkaroundIsEnabled(&workaround, 0x38, &enabled) == 0 && enabled == 0); + KernelTitleWorkaround workaround{1, 0, {(1ull << 3) | (1ull << 0x39) | (1ull << 63), (1ull << 0) | (1ull << 0x3F)}}; + for (auto query : {sceKernelTitleWorkaroundIsEnabled, sceKernelTitleWorkdaroundIsEnabled}) { + std::int32_t enabled = -1; + Require(query(nullptr, 3, &enabled) == static_cast(0x8002000E)); + Require(query(&workaround, 3, nullptr) == static_cast(0x8002000E)); + Require(query(nullptr, 0x80, &enabled) == static_cast(0x8002000E)); + Require(query(&workaround, 0x80, &enabled) == static_cast(0x80020016) && enabled == -1); + Require(query(&workaround, -1, &enabled) == static_cast(0x80020016) && enabled == -1); + Require(query(&workaround, 3, &enabled) == 0 && enabled == 1); + Require(query(&workaround, 4, &enabled) == 0 && enabled == 0); + Require(query(&workaround, 0x39, &enabled) == 0 && enabled == 1); + Require(query(&workaround, 0x3A, &enabled) == 0 && enabled == 0); + Require(query(&workaround, 63, &enabled) == 0 && enabled == 1); + Require(query(&workaround, 64, &enabled) == 0 && enabled == 1); + Require(query(&workaround, 65, &enabled) == 0 && enabled == 0); + Require(query(&workaround, 0x7E, &enabled) == 0 && enabled == 0); + Require(query(&workaround, 0x7F, &enabled) == 0 && enabled == 1); + } Require(sceKernelGetProcessType(getpid_nid_postfix()) == 0); Require(sceKernelGetProcessType(-1) == 0 && sceKernelGetProcessType(0) == 0); Require(sceKernelGetProcessType(getpid_nid_postfix() + 1) == static_cast(0x80020003)); @@ -965,6 +1146,9 @@ int main() { CheckCondattrClock(); CheckAmmWriteCommands(); CheckAmmWaitCompletion(); + CheckAmmCommandWriters(); + CheckAmmWrittenWaitsRun(); + CheckAmmMapperCalls(); CheckAmmWaitConcurrentSubmits(); CheckSchedSetscheduler(); CheckSigreturn(); @@ -1009,6 +1193,11 @@ int main() { CheckUnsupportedPathconf(_fpathconf_nid_postfix, sharedMemoryDescriptor); Require(close_nid_postfix(sharedMemoryDescriptor) == 0); Require(shm_unlink_nid_postfix(namedSharedMemory.c_str()) == 0); + const int anonymousSharedMemoryDescriptor = shm_open_nid_postfix(reinterpret_cast(1), SCE_KERNEL_O_RDWR, 0600); + Require(anonymousSharedMemoryDescriptor >= 0); + CheckUnsupportedPathconf(fpathconf_nid_postfix, anonymousSharedMemoryDescriptor); + CheckUnsupportedPathconf(_fpathconf_nid_postfix, anonymousSharedMemoryDescriptor); + Require(close_nid_postfix(anonymousSharedMemoryDescriptor) == 0); Require(close_nid_postfix(descriptor) == 0); Require(fstatfs_nid_postfix(-1, reinterpret_cast(viaPublic)) == -1 && Error() == 9); Require(fstat_nid_postfix(descriptor, &viaFstat) == -1 && Error() == 9); diff --git a/core/libs/tests/GuestKernelSysModuleInternal.cpp b/core/libs/tests/GuestKernelSysModuleInternal.cpp index 34741ddc33..84dc88f295 100644 --- a/core/libs/tests/GuestKernelSysModuleInternal.cpp +++ b/core/libs/tests/GuestKernelSysModuleInternal.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -87,11 +88,30 @@ static void CheckLoadStartSysmodule() { Require(res == 0); } +static void CheckIsModuleLoaded() { + std::set names; + for (const auto handle : List(sceKernelGetModuleListInternal)) { + ModuleInfo info{}; + info.st_size = sizeof(ModuleInfo); + Require(sceKernelGetModuleInfo(handle, &info) == 0); + names.insert(info.name); + } + const auto expected = [&](const std::string& name) { return names.count(name) ? 0 : SCE_KERNEL_ERROR_ESRCH; }; + for (const auto& name : names) { + Require(sceKernelIsModuleLoaded(name.c_str()) == 0); + Require(sceKernelIsModuleLoaded((name + "x").c_str()) == expected(name + "x")); + Require(sceKernelIsModuleLoaded(name.substr(0, name.size() - 1).c_str()) == expected(name.substr(0, name.size() - 1))); + } + Require(sceKernelIsModuleLoaded("libSceNoSuchModule.sprx") == SCE_KERNEL_ERROR_ESRCH); + Require(sceKernelIsModuleLoaded("") == expected("")); +} + int main() { CheckList(); CheckEachModule(); CheckMatchesAddressLookup(); CheckRefusals(); CheckLoadStartSysmodule(); + CheckIsModuleLoaded(); return 0; } diff --git a/core/libs/tests/GuestKernelSysSdkVersion.cpp b/core/libs/tests/GuestKernelSysSdkVersion.cpp index dc20a51ac8..0dc451e8f9 100644 --- a/core/libs/tests/GuestKernelSysSdkVersion.cpp +++ b/core/libs/tests/GuestKernelSysSdkVersion.cpp @@ -34,6 +34,7 @@ int main() { Require(ProcessParametersFixture::Install(process.data(), process.size()), "process parameters were not installed"); Require(sceKernelGetCompiledSdkVersion(nullptr) == static_cast(0x80020016), "null output is not EINVAL"); + Require(sceKernelGetCompiledSdkVersion(reinterpret_cast(0x10)) == static_cast(0x8002000e), "unwritable output is not EFAULT"); std::array output{-1, 0x5a5a5a5a}; Require(sceKernelGetCompiledSdkVersion(output.data()) == 0, "query failed"); Require(output[0] == 0x07008001, "version is not the 32-bit field at offset 0x10 of the process parameters"); diff --git a/core/libs/tests/GuestKernelSysVmMapTimestamp.cpp b/core/libs/tests/GuestKernelSysVmMapTimestamp.cpp new file mode 100644 index 0000000000..2befc1e362 --- /dev/null +++ b/core/libs/tests/GuestKernelSysVmMapTimestamp.cpp @@ -0,0 +1,40 @@ +#include "prx/libkernel/DirectMemory/DirectMemory.hpp" +#include "prx/libkernel/include/Api.hpp" +#include "prx/libkernel_sys/include/Api.hpp" +#include "prx/libc/include/GuestAllocations.hpp" +#include "prx/libc/include/general/VabiMacros.hpp" + +#include +#include +#include +#include + +static void Require(bool condition, std::source_location location = std::source_location::current()) { + if (!condition) { + std::fprintf(stderr, "VM map timestamp check failed at %s:%u\n", location.file_name(), static_cast(location.line())); + std::abort(); + } +} + +int main() { + constexpr std::size_t page = 0x4000; + constexpr std::size_t reserveBytes = 2 * page; + + void* reserved = nullptr; + Require(sceKernelReserveVirtualRange(&reserved, reserveBytes, 0, page) == 0); + + const auto reservedTimestamp = get_vm_map_timestamp_nid_postfix(); + Require(get_vm_map_timestamp_nid_postfix() == reservedTimestamp); + + void* mapped = reserved; + Require(sceKernelMapFlexibleMemory(&mapped, page, 3, 0x10) == 0 && mapped == reserved); + const auto mappedTimestamp = get_vm_map_timestamp_nid_postfix(); + Require(mappedTimestamp != reservedTimestamp); + Require(get_vm_map_timestamp_nid_postfix() == mappedTimestamp); + + Require(sceKernelMunmap(reinterpret_cast(reserved), reserveBytes) == 0); + Require(get_vm_map_timestamp_nid_postfix() != mappedTimestamp); + Require(static_cast(get_vm_map_timestamp_nid_postfix()) == + static_cast(GuestAllocations::GuestAllocationsGeneration_nid_postfix())); + return 0; +} diff --git a/core/libs/tests/GuestLibreSsl3KeyReference.cpp b/core/libs/tests/GuestLibreSsl3KeyReference.cpp index ca69aceb4e..1f814a8d68 100644 --- a/core/libs/tests/GuestLibreSsl3KeyReference.cpp +++ b/core/libs/tests/GuestLibreSsl3KeyReference.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include static void Require(bool condition, const char* message) { @@ -33,6 +34,25 @@ static void CheckKey(TRetain retain, std::size_t referenceOffset) { Require(retain(&guarded.key) == (next > 1), "retain return value"); Require(std::memcmp(&guarded, expected.data(), sizeof(guarded)) == 0, "retain changed bytes outside reference count"); } + std::memset(&guarded, 0x3C, sizeof(guarded)); + guarded.key.references = std::numeric_limits::max(); + std::array unchanged; + std::memcpy(unchanged.data(), &guarded, sizeof(guarded)); + bool overflowThrown = false; + try { + retain(&guarded.key); + } catch (const std::overflow_error&) { + overflowThrown = true; + } + Require(overflowThrown, "retain at maximum count did not throw"); + Require(std::memcmp(&guarded, unchanged.data(), sizeof(guarded)) == 0, "overflowing retain changed bytes"); + bool nullThrown = false; + try { + retain(nullptr); + } catch (const std::invalid_argument&) { + nullThrown = true; + } + Require(nullThrown, "retain of null did not throw"); std::memset(&guarded, 0x5A, sizeof(guarded)); guarded.key.references = 1; std::array expected; @@ -64,5 +84,7 @@ int main(int argc, char** argv) { CheckKey(EVP_PKEY_up_ref_nid_postfix, 4); if (argc == 1 || std::strcmp(argv[1], "ec") == 0) CheckKey(EC_KEY_up_ref_nid_postfix, 48); + if (argc == 1 || std::strcmp(argv[1], "rsa") == 0) + CheckKey(RSA_up_ref_nid_postfix, 104); return 0; } diff --git a/core/libs/tests/GuestLibreSslProtocol.cpp b/core/libs/tests/GuestLibreSslProtocol.cpp index e4ced5478f..f14e7f3c6f 100644 --- a/core/libs/tests/GuestLibreSslProtocol.cpp +++ b/core/libs/tests/GuestLibreSslProtocol.cpp @@ -4,10 +4,13 @@ #include #include #include +#include #include #include #include +#include #include +#include #include #include #include @@ -16,6 +19,8 @@ #include #else #include +#include +#include #endif using SelectProtocol = int (APS5_VABI*)(unsigned char**, unsigned char*, const unsigned char*, std::uint32_t, const unsigned char*, std::uint32_t); @@ -29,6 +34,55 @@ void Require(bool condition, std::source_location location = std::source_locatio } } +template void RequireThrows(TAction action, std::source_location location = std::source_location::current()) { + try { action(); } catch (const std::exception&) { return; } + Require(false, location); +} + +class GuardedPages { +public: + GuardedPages() { +#ifdef _WIN32 + SYSTEM_INFO info{}; + GetSystemInfo(&info); + page_ = info.dwPageSize; + base_ = static_cast(VirtualAlloc(nullptr, 2 * page_, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE)); + Require(base_ != nullptr); + DWORD previous = 0; + Require(VirtualProtect(base_ + page_, page_, PAGE_NOACCESS, &previous) != 0); +#else + page_ = static_cast(sysconf(_SC_PAGESIZE)); + void* const mapped = mmap(nullptr, 2 * page_, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + Require(mapped != MAP_FAILED); + base_ = static_cast(mapped); + Require(mprotect(base_ + page_, page_, PROT_NONE) == 0); +#endif + } + + ~GuardedPages() { +#ifdef _WIN32 + VirtualFree(base_, 0, MEM_RELEASE); +#else + munmap(base_, 2 * page_); +#endif + } + + GuardedPages(const GuardedPages&) = delete; + GuardedPages& operator=(const GuardedPages&) = delete; + + unsigned char* End() const { return base_ + page_; } + + unsigned char* Place(std::initializer_list bytes) { + unsigned char* const start = End() - bytes.size(); + std::copy(bytes.begin(), bytes.end(), start); + return start; + } + +private: + unsigned char* base_ = nullptr; + std::size_t page_ = 0; +}; + Protocol Encode(const Protocols& names) { Protocol result; for (const auto& name : names) { @@ -66,7 +120,16 @@ void CheckSelection(SelectProtocol select, const Protocols& peerNames, const Pro Require(peer == peerCopy && supported == supportedCopy); } -void Run(SelectProtocol select) { +void CheckRaw(SelectProtocol select, const unsigned char* peer, std::uint32_t peerLength, const unsigned char* supported, + std::uint32_t supportedLength, int expectedStatus, const unsigned char* expectedOutput, unsigned char expectedLength, + std::source_location location = std::source_location::current()) { + unsigned char* output = nullptr; + unsigned char length = 0xA5; + Require(select(&output, &length, peer, peerLength, supported, supportedLength) == expectedStatus, location); + Require(output == expectedOutput && length == expectedLength, location); +} + +void RunValid(SelectProtocol select) { const Protocol http{'h', 't', 't', 'p', '/', '1', '.', '1'}; const Protocol h2{'h', '2'}; const Protocol h3{'h', '3'}; @@ -98,8 +161,56 @@ void Run(SelectProtocol select) { large.push_back(h2); CheckSelection(select, large, {h2}); CheckSelection(select, {h2}, large); +} - std::printf("LibreSSL protocol selection: 7056 generated pairs, and valid-list boundaries passed\n"); +void RunReported(SelectProtocol select) { + GuardedPages peerPages; + GuardedPages supportedPages; + { + const auto* peer = peerPages.Place({0, 2, 'h', '2'}); + const auto* supported = supportedPages.Place({0}); + CheckRaw(select, peer, 4, supported, 1, 1, peer + 1, 0); + } + { + const auto* peer = peerPages.Place({0, 2, 'h', '2'}); + const auto* supported = supportedPages.Place({2, 'h', '2'}); + CheckRaw(select, peer, 4, supported, 3, 1, peer + 2, 2); + } + { + const auto* peer = peerPages.Place({5, 'a', 'b'}); + const auto* supported = supportedPages.Place({2, 'a', 'b'}); + CheckRaw(select, peer, 3, supported, 3, 2, supported + 1, 2); + } + { + const auto* peer = peerPages.Place({2, 'h', '2'}); + const auto* supported = supportedPages.Place({5, 'a', 'b'}); + CheckRaw(select, peer, 3, supported, 3, 2, supported + 1, 5); + } + { + const auto* supported = supportedPages.Place({2, 'h', '2'}); + CheckRaw(select, peerPages.End(), 0, supported, 3, 2, supported + 1, 2); + CheckRaw(select, nullptr, 0, supported, 3, 2, supported + 1, 2); + } + { + const auto* peer = peerPages.Place({2, 'h', '2'}); + const auto* supported = supportedPages.Place({3, 'x', 'y', 'z'}); + CheckRaw(select, peer, 3, supported, 0, 2, supported + 1, 3); + } + unsigned char* output = nullptr; + unsigned char length = 0; + const unsigned char list[]{2, 'h', '2'}; + RequireThrows([&] { select(nullptr, &length, list, 3, list, 3); }); + RequireThrows([&] { select(&output, nullptr, list, 3, list, 3); }); + RequireThrows([&] { select(&output, &length, nullptr, 3, list, 3); }); + RequireThrows([&] { select(&output, &length, list, 3, nullptr, 3); }); + RequireThrows([&] { select(&output, &length, list, 3, nullptr, 0); }); + Require(output == nullptr && length == 0); +} + +void Run(SelectProtocol select) { + RunValid(select); + RunReported(select); + std::printf("LibreSSL protocol selection: 7056 generated pairs, valid-list boundaries and the reported unvalidated lists passed\n"); } int main(int argc, char** argv) { diff --git a/core/libs/tests/GuestMath.cpp b/core/libs/tests/GuestMath.cpp index 58c693c4c5..e7f9e65f6d 100644 --- a/core/libs/tests/GuestMath.cpp +++ b/core/libs/tests/GuestMath.cpp @@ -1532,6 +1532,16 @@ static void CheckTrigfConsoleBits() { } } +static void CheckRemainderf() { + Require(remainderf_nid_postfix(5.0f, 2.0f) == 1.0f && remainderf_nid_postfix(7.0f, 2.0f) == -1.0f); + Require(remainderf_nid_postfix(-5.0f, 2.0f) == -1.0f && remainderf_nid_postfix(5.5f, 2.0f) == -0.5f); + Require(remainderf_nid_postfix(6.0f, 3.0f) == 0.0f && !std::signbit(remainderf_nid_postfix(6.0f, 3.0f))); + Require(remainderf_nid_postfix(-6.0f, 3.0f) == 0.0f && std::signbit(remainderf_nid_postfix(-6.0f, 3.0f))); + Require(remainderf_nid_postfix(3.0f, INFINITY) == 3.0f); + Require(std::isnan(remainderf_nid_postfix(1.0f, 0.0f)) && std::isnan(remainderf_nid_postfix(INFINITY, 2.0f))); + Require(std::isnan(remainderf_nid_postfix(NAN, 2.0f)) && std::isnan(remainderf_nid_postfix(2.0f, NAN))); +} + static void CheckExtendedMath() { Require(ExtendedBits(atanl_nid_postfix(INFINITY), 0xc90fdaa22168c235ull, 0x3fff)); Require(std::fabs(atanl_nid_postfix(1.0L) - 0.785398163397448309616L) < 1e-18L); @@ -2600,6 +2610,7 @@ int main() { CheckExpm1ConsoleBits(); CheckLog1pConsoleBits(); CheckNextafterConsoleBits(); + CheckRemainderf(); CheckTanhConsoleBits(); CheckSinhMsunBits(); CheckSinhLargeArguments(); diff --git a/core/libs/tests/GuestMathExact.cpp b/core/libs/tests/GuestMathExact.cpp index 8c0d7d7389..c1075d499e 100644 --- a/core/libs/tests/GuestMathExact.cpp +++ b/core/libs/tests/GuestMathExact.cpp @@ -61,6 +61,19 @@ static void CheckRoundingAndScaling() { Require(__isinfl_nid_postfix(1.0L) == 0 && __isinfl_nid_postfix(static_cast(NAN)) == 0 && __isinfl_nid_postfix(0.0L) == 0); } +static void CheckLogblLroundl() { + Require(logbl_nid_postfix(8.0L) == 3.0L && logbl_nid_postfix(0.75L) == -1.0L && logbl_nid_postfix(-0.75L) == -1.0L); + Require(logbl_nid_postfix(0x1p-16445L) == -16445.0L); + Require(logbl_nid_postfix(0.0L) == -INFINITY && logbl_nid_postfix(-0.0L) == -INFINITY); + Require(logbl_nid_postfix(INFINITY) == INFINITY && logbl_nid_postfix(-INFINITY) == INFINITY); + Require(std::isnan(logbl_nid_postfix(NAN))); + Require(lroundl_nid_postfix(2.5L) == 3 && lroundl_nid_postfix(-2.5L) == -3); + Require(lroundl_nid_postfix(0.5L) == 1 && lroundl_nid_postfix(-0.5L) == -1); + Require(lroundl_nid_postfix(0.49999999999999999L) == 0); + Require(lroundl_nid_postfix(9007199254740993.0L) == INT64_C(9007199254740993)); + Require(lroundl_nid_postfix(0x1p62L) == (INT64_C(1) << 62)); +} + static void CheckSignalingNanPassThrough() { const long double signaling = Extended(0x7fff, 0x8000000000001234ull); Require(SameBits(fdiml_nid_postfix(signaling, 1.0L), signaling)); @@ -72,6 +85,13 @@ static void CheckSignalingNanPassThrough() { Require(SameBits(nanl_nid_postfix("123"), Extended(0x7fff, 0xc000000000000000ull))); } +static void CheckFiniteClassification() { + for (const float value : {1.0f, 0.0f, -0.0f, 0x1p-149f, 0x1.fffffep127f}) Require(finitef_nid_postfix(value) != 0); + for (const float value : {static_cast(INFINITY), -static_cast(INFINITY), static_cast(NAN)}) Require(finitef_nid_postfix(value) == 0); + for (const double value : {1.0, 0.0, -0.0, 0x1p-1074, 0x1.fffffffffffffp1023}) Require(__isfinite_nid_postfix(value) != 0); + for (const double value : {static_cast(INFINITY), -static_cast(INFINITY), static_cast(NAN)}) Require(__isfinite_nid_postfix(value) == 0); +} + static void CheckErrno() { errno = 0; Require(std::isnan(fmodl_nid_postfix(NAN, 1.0L)) && errno == EDOM); @@ -138,6 +158,22 @@ static void CheckRoundingModes() { Require(std::fesetround(saved) == 0); } +static void CheckRintTiesToEven() { + const int saved = std::fegetround(); + Require(std::fesetround(FE_TONEAREST) == 0); + Require(rint_nid_postfix(0.5) == 0.0 && !std::signbit(rint_nid_postfix(0.5))); + Require(rint_nid_postfix(-0.5) == 0.0 && std::signbit(rint_nid_postfix(-0.5))); + Require(rint_nid_postfix(2.5) == 2.0 && rint_nid_postfix(3.5) == 4.0 && rint_nid_postfix(-2.5) == -2.0); + Require(!std::signbit(rint_nid_postfix(0.0)) && std::signbit(rint_nid_postfix(-0.0))); + Require(rint_nid_postfix(INFINITY) == INFINITY && rint_nid_postfix(-INFINITY) == -INFINITY); + Require(std::isnan(rint_nid_postfix(NAN))); + Require(rint_nid_postfix(4503599627370497.0) == 4503599627370497.0); + Require(rintf_nid_postfix(2.5f) == 2.0f && rintf_nid_postfix(0.5f) == 0.0f && !std::signbit(rintf_nid_postfix(0.5f))); + Require(std::signbit(rintf_nid_postfix(-0.5f)) && rintf_nid_postfix(8388609.0f) == 8388609.0f); + Require(rintl_nid_postfix(2.5L) == 2.0L && rintl_nid_postfix(3.5L) == 4.0L && std::signbit(rintl_nid_postfix(-0.5L))); + Require(std::fesetround(saved) == 0); +} + static void CheckClassification() { const long double pseudoDenormal = Extended(0x0000, 0x8000000000000000ull); Require(_LDtest_nid_postfix(&pseudoDenormal) == -1 && __fpclassifyl_nid_postfix(pseudoDenormal) == -2); @@ -156,10 +192,13 @@ static void CheckClassification() { int main() { CheckRoundingAndScaling(); + CheckLogblLroundl(); CheckSignalingNanPassThrough(); CheckErrno(); + CheckFiniteClassification(); CheckConsoleQuirks(); CheckRoundingModes(); + CheckRintTiesToEven(); CheckClassification(); return 0; } diff --git a/core/libs/tests/GuestMbus.cpp b/core/libs/tests/GuestMbus.cpp index fa777d426a..1324294c49 100644 --- a/core/libs/tests/GuestMbus.cpp +++ b/core/libs/tests/GuestMbus.cpp @@ -19,6 +19,35 @@ void Require(bool condition, const char* message) { } } +void CheckDeviceIdConversion() { + std::uint32_t local = 7; + std::uint32_t deviceClass = 7; + Require(sceMbusConvertToLocalDeviceId(0x0020123456789ABCull, &local, &deviceClass) == 0, "local conversion failed"); + Require(local == 0x56789ABC && deviceClass == 0x20, "the local id is the low 32 bits and the class the top 16"); + Require(sceMbusConvertToLocalDeviceId(0xFFFF000000000001ull, nullptr, &deviceClass) == 0 && deviceClass == 0xFFFF, "class without a local output"); + Require(sceMbusConvertToLocalDeviceId(0xFFFF000000000001ull, &local, nullptr) == 0 && local == 1, "local id without a class output"); + Require(sceMbusConvertToLocalDeviceId(0, nullptr, nullptr) == 0, "conversion without outputs"); + std::uint64_t id = 7; + Require(sceMbusConvertToLocalDeviceId2(0x0010123456789ABCull, 0x10, &id) == 0 && id == 0x123456789ABCull, "the same class keeps the low 48 bits"); + Require(sceMbusConvertToLocalDeviceId2(0x0010123456789ABCull, 0x10, nullptr) == 0, "same class without an output"); + bool threw = false; + try { + sceMbusConvertToLocalDeviceId2(0x0010123456789ABCull, 0x20, &id); + } catch (const std::exception&) { + threw = true; + } + Require(threw && id == 0x123456789ABCull, "another class needs the Mbus service"); + Require(sceMbusConvertToMbusDeviceId(0x123456789ABCull, 0x20, &id) == 0 && id == 0x0020123456789ABCull, "class 0x20 is placed in the top 16 bits"); + Require(sceMbusConvertToMbusDeviceId(0xFFFF000000000001ull, 0x10, &id) == 0 && id == 0xFFFF000000000001ull, "the local id is not masked"); + Require(sceMbusConvertToMbusDeviceId(1, 0x10, nullptr) == 0, "conversion without an output"); + constexpr auto unconvertibleClass = static_cast(0x809B0008u); + for (const std::uint32_t other : {0u, 1u, 0x11u, 0x21u, 0x30u, 0x1000u, 0xFFFFFFFFu}) { + id = 7; + Require(sceMbusConvertToMbusDeviceId(1, other, &id) == unconvertibleClass && id == 0, "other classes are refused and clear the output"); + } + Require(sceMbusConvertToMbusDeviceId(1, 0, nullptr) == unconvertibleClass, "refusal without an output"); +} + } int main() { @@ -37,6 +66,7 @@ int main() { sceMbusEventCallbackFuncsInit_(reinterpret_cast(callbackBytes.data()), 0); for (const auto byte : callbackBytes) Require(byte == 0x5a, "zero-size callback initialization changed memory"); + CheckDeviceIdConversion(); DeviceServiceInitParam param{}; constexpr auto invalidArgument = static_cast(0x809B0080u); Require(sceDeviceServiceInitialize(3, ¶m) == invalidArgument, "invalid parameter size accepted"); diff --git a/core/libs/tests/GuestMemccpyBounds.cpp b/core/libs/tests/GuestMemccpyBounds.cpp new file mode 100644 index 0000000000..cfb89a8be1 --- /dev/null +++ b/core/libs/tests/GuestMemccpyBounds.cpp @@ -0,0 +1,85 @@ +#include "prx/libc/include/Api.hpp" +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#define WIN32_LEAN_AND_MEAN +#include +#else +#include +#include +#endif + +static void Check(bool condition, int line) { + if (!condition) { + std::fprintf(stderr, "memccpy check failed at line %d\n", line); + std::abort(); + } +} +#define Require(condition) Check((condition), __LINE__) + +class GuardedPage { +public: + std::size_t size; + unsigned char* data; + + GuardedPage() { +#ifdef _WIN32 + SYSTEM_INFO info{}; + GetSystemInfo(&info); + size = info.dwPageSize; + data = static_cast(VirtualAlloc(nullptr, size * 2, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE)); + Require(data != nullptr); + DWORD previous = 0; + Require(VirtualProtect(data + size, size, PAGE_NOACCESS, &previous) != 0); +#else + const long pageSize = sysconf(_SC_PAGESIZE); + Require(pageSize > 0); + size = static_cast(pageSize); + data = static_cast(mmap(nullptr, size * 2, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0)); + Require(data != MAP_FAILED); + Require(mprotect(data + size, size, PROT_NONE) == 0); +#endif + } + + ~GuardedPage() { +#ifdef _WIN32 + VirtualFree(data, 0, MEM_RELEASE); +#else + munmap(data, size * 2); +#endif + } +}; + +int main() { + GuardedPage source; + GuardedPage destination; + for (std::size_t count = 0; count <= 256; ++count) { + for (const std::size_t stop : {count, count / 2, std::size_t{0}}) { + std::memset(source.data, 0x35, source.size); + std::memset(destination.data, 0xA7, destination.size); + auto* input = source.data + source.size - std::max(count, std::size_t{1}); + auto* output = destination.data + destination.size - std::max(count, std::size_t{1}); + if (stop < count) input[stop] = 0xFF; + const std::vector before(source.data, source.data + source.size); + std::vector expected(destination.data, destination.data + destination.size); + const std::size_t copied = stop < count ? stop + 1 : count; + std::copy_n(input, copied, expected.data() + (output - destination.data)); + void* result = memccpy_nid_postfix(output, input, 0x1FF, count); + Require(result == (stop < count ? output + copied : nullptr)); + Require(std::memcmp(destination.data, expected.data(), destination.size) == 0); + Require(std::memcmp(source.data, before.data(), source.size) == 0); + } + } + for (const int character : {-1, 0xFF, 0x1FF}) { + source.data[source.size - 1] = 0xFF; + destination.data[destination.size - 1] = 0; + Require(memccpy_nid_postfix(destination.data + destination.size - 1, source.data + source.size - 1, + character, 256) == destination.data + destination.size); + Require(destination.data[destination.size - 1] == 0xFF); + } + std::puts("memccpy return values, stop bytes, guards and unsigned conversion passed"); +} diff --git a/core/libs/tests/GuestMemory.cpp b/core/libs/tests/GuestMemory.cpp index 0e4678ea42..82253b5cc0 100644 --- a/core/libs/tests/GuestMemory.cpp +++ b/core/libs/tests/GuestMemory.cpp @@ -108,6 +108,8 @@ static void CheckPrtApertures() { Require(address == reinterpret_cast(0x5a5a) && length == 0x5a5a); Require(sceKernelGetPrtAperture(0, nullptr, &length) == SCE_KERNEL_ERROR_EINVAL); Require(sceKernelGetPrtAperture(0, &address, nullptr) == SCE_KERNEL_ERROR_EINVAL); + Require(sceKernelGetPrtAperture(0, reinterpret_cast(0x10), &length) == SCE_KERNEL_ERROR_EFAULT); + Require(sceKernelGetPrtAperture(0, &address, reinterpret_cast(0x10)) == SCE_KERNEL_ERROR_EFAULT); for (int index = 0; index < 3; ++index) { void* const base = reinterpret_cast(0x1000000000 + 0x100000000 * index); const std::size_t size = 0x10000 << index; @@ -139,6 +141,12 @@ static void CheckFlexibleMappingIgnoresFlag8000() { try { sceKernelMapFlexibleMemory(&unknown, length, 3, 0x20000); } catch (const std::exception&) { rejected = true; } Require(rejected && unknown == nullptr); Require(sceKernelAvailableFlexibleMemorySize(&available) == 0 && available == before); + Require(sceKernelAvailableFlexibleMemorySize(nullptr) == SCE_KERNEL_ERROR_EINVAL); + Require(sceKernelAvailableFlexibleMemorySize(reinterpret_cast(0x10)) == SCE_KERNEL_ERROR_EFAULT); + std::size_t configured = 0; + Require(sceKernelConfiguredFlexibleMemorySize(&configured) == 0 && configured > 0); + Require(sceKernelConfiguredFlexibleMemorySize(nullptr) == SCE_KERNEL_ERROR_EINVAL); + Require(sceKernelConfiguredFlexibleMemorySize(reinterpret_cast(0x10)) == SCE_KERNEL_ERROR_EFAULT); } static void CheckPageTableStats() { @@ -151,6 +159,11 @@ static void CheckPageTableStats() { Require(sceKernelGetPageTableStats(&cpuTotal, nullptr, &gpuTotal, &gpuAvailable) == SCE_KERNEL_ERROR_EFAULT); Require(sceKernelGetPageTableStats(&cpuTotal, &cpuAvailable, nullptr, &gpuAvailable) == SCE_KERNEL_ERROR_EFAULT); Require(sceKernelGetPageTableStats(&cpuTotal, &cpuAvailable, &gpuTotal, nullptr) == SCE_KERNEL_ERROR_EFAULT); + auto* bad = reinterpret_cast(0x10); + Require(sceKernelGetPageTableStats(bad, &cpuAvailable, &gpuTotal, &gpuAvailable) == SCE_KERNEL_ERROR_EFAULT); + Require(sceKernelGetPageTableStats(&cpuTotal, bad, &gpuTotal, &gpuAvailable) == SCE_KERNEL_ERROR_EFAULT); + Require(sceKernelGetPageTableStats(&cpuTotal, &cpuAvailable, bad, &gpuAvailable) == SCE_KERNEL_ERROR_EFAULT); + Require(sceKernelGetPageTableStats(&cpuTotal, &cpuAvailable, &gpuTotal, bad) == SCE_KERNEL_ERROR_EFAULT); } static void CheckInternalMemoryAvailableSize() { @@ -194,6 +207,20 @@ static void CheckNamedAndHintedMappings() { Require(sceKernelMunmap(reinterpret_cast(first), length) == 0); } +static void CheckVirtualRangeNames() { + constexpr std::size_t length = 0x4000; + void* mapping = nullptr; + Require(sceKernelMapFlexibleMemory(&mapping, length, 3, 0) == 0); + Require(sceKernelSetVirtualRangeName(mapping, length, nullptr) == static_cast(0x8002000eu)); + Require(NameAt(mapping)[0] == '\0'); + Require(sceKernelSetVirtualRangeName(mapping, length, "first") == 0); + Require(sceKernelSetVirtualRangeName(mapping, length, "second") == 0); + Require(std::strcmp(NameAt(mapping), "second") == 0); + Require(sceKernelClearVirtualRangeName(mapping, length) == 0); + Require(NameAt(mapping)[0] == '\0'); + Require(sceKernelMunmap(reinterpret_cast(mapping), length) == 0); +} + static void CheckAudioCoprocessorProtection() { constexpr std::size_t length = 0x4000; void* writable = nullptr; @@ -920,6 +947,9 @@ static void CheckGetDirectMemoryType() { Require(sceKernelGetDirectMemoryType(first, nullptr, &start, &end) == SCE_KERNEL_ERROR_EINVAL); Require(sceKernelGetDirectMemoryType(first, &type, nullptr, &end) == SCE_KERNEL_ERROR_EINVAL); Require(sceKernelGetDirectMemoryType(first, &type, &start, nullptr) == SCE_KERNEL_ERROR_EINVAL); + Require(sceKernelGetDirectMemoryType(first, reinterpret_cast(0x10), &start, &end) == SCE_KERNEL_ERROR_EFAULT); + Require(sceKernelGetDirectMemoryType(first, &type, reinterpret_cast(0x10), &end) == SCE_KERNEL_ERROR_EFAULT); + Require(sceKernelGetDirectMemoryType(first, &type, &start, reinterpret_cast(0x10)) == SCE_KERNEL_ERROR_EFAULT); Require(sceKernelReleaseDirectMemory(first, page) == 0); type = -1; start = -1; @@ -961,6 +991,7 @@ static void CheckDirectMemoryQuery() { Require(info.start == second && info.end == second + page && info.memoryType == 1); info = {-1, -1, -1}; Require(sceKernelDirectMemoryQuery(first, 0, nullptr, sizeof(info)) == SCE_KERNEL_ERROR_EINVAL); + Require(sceKernelDirectMemoryQuery(first, 0, reinterpret_cast(0x10), sizeof(info)) == SCE_KERNEL_ERROR_EFAULT); Require(sceKernelDirectMemoryQuery(-1, 1, &info, sizeof(info)) == SCE_KERNEL_ERROR_EINVAL); Require(sceKernelDirectMemoryQuery(first, 0, &info, sizeof(info) - 1) == SCE_KERNEL_ERROR_EINVAL); Require(info.start == -1 && info.end == -1 && info.memoryType == -1); @@ -1082,6 +1113,22 @@ static void CheckMemoryPoolArguments() { Require(sceKernelReleaseDirectMemory(phys, page * 2) == 0); } +static void CheckMapUnallocatedDirectMemory() { + constexpr std::size_t page = 0x4000; + constexpr int enomem = static_cast(0x8002000cu); + std::int64_t phys = 0; + Require(sceKernelAllocateDirectMemory(0, 0x7fffffffffll, page * 2, 0, 0, &phys) == 0); + Require(sceKernelReleaseDirectMemory(phys + static_cast(page), page) == 0); + void* mapped = nullptr; + Require(sceKernelMapDirectMemory(&mapped, page * 2, 3, 0, phys, 0) == enomem); + Require(mapped == nullptr); + Require(sceKernelMapDirectMemory(&mapped, page, 3, 0, phys + static_cast(page), 0) == enomem); + Require(mapped == nullptr); + Require(sceKernelMapDirectMemory(&mapped, page, 3, 0, phys, 0) == 0 && mapped != nullptr); + Require(sceKernelMunmap(reinterpret_cast(mapped), page) == 0); + Require(sceKernelReleaseDirectMemory(phys, page) == 0); +} + static void CheckDirectMemoryGpuProtBits() { constexpr std::size_t page = 0x4000; std::int64_t phys = 0; @@ -3765,6 +3812,8 @@ static void CheckAvailableDirectMemoryIsLargestFreeBlock() { Require(sceKernelAvailableDirectMemorySize(top, top + window, 0, &start, nullptr) == 0 && start == run); Require(sceKernelAvailableDirectMemorySize(top, top + window, 0, nullptr, nullptr) == 0); Require(sceKernelAvailableDirectMemorySize(top, top + window, 3, nullptr, nullptr) == SCE_KERNEL_ERROR_EINVAL); + Require(sceKernelAvailableDirectMemorySize(top, top + window, 0, reinterpret_cast(0x10), &size) == SCE_KERNEL_ERROR_EFAULT); + Require(sceKernelAvailableDirectMemorySize(top, top + window, 0, &start, reinterpret_cast(0x10)) == SCE_KERNEL_ERROR_EFAULT); Require(sceKernelAvailableDirectMemorySize(-1, top + window, 0, &start, &size) == 0 && start >= 0 && static_cast(size) <= top + window - start); Require(sceKernelAvailableDirectMemorySize(std::numeric_limits::min(), top + window, 0, &start, &size) == 0 && start >= 0); Require(sceKernelAvailableDirectMemorySize(run, run + 0xfffff, 0, &start, &size) == 0 && start == run && size == 0xfffff); @@ -3860,6 +3909,7 @@ int main(int argc, char** argv) { CheckPageTableStats(); CheckVirtualQueryWireLayout(); CheckNamedAndHintedMappings(); + CheckVirtualRangeNames(); CheckInternalNamedFlexibleMapping(); CheckFlexibleFixedReplacement(); CheckMunmapScopedFlexibleRelease(); @@ -3899,6 +3949,7 @@ int main(int argc, char** argv) { CheckGetDirectMemoryType(); CheckDirectMemoryQuery(); CheckMtypeprotect(); + CheckMapUnallocatedDirectMemory(); CheckMemoryPoolArguments(); CheckHeapAlignment(); CheckHeapReallocWithinTheBlock(); diff --git a/core/libs/tests/GuestNKWebKitDates.cpp b/core/libs/tests/GuestNKWebKitDates.cpp new file mode 100644 index 0000000000..fb79701938 --- /dev/null +++ b/core/libs/tests/GuestNKWebKitDates.cpp @@ -0,0 +1,77 @@ +#include "prx/libSceNKWebKit/libSceNKWebKit.hpp" + +#include +#include +#include +#include +#include + +static void Check(bool value, int line) { + if (!value) { + std::fprintf(stderr, "WTF date parsing check failed at line %d\n", line); + std::abort(); + } +} +#define Require(value) Check((value), __LINE__) + +static bool Same(double first, double second) { + return std::memcmp(&first, &second, sizeof(double)) == 0; +} + +static void Date(const char* text, double expected, bool expectedLocal) { + bool isLocalTime = !expectedLocal; + Require(Same(_ZN3WTF37parseDateFromNullTerminatedCharactersEPKcRb(text, &isLocalTime), expected)); + Require(isLocalTime == expectedLocal); +} + +static void DateInvalid(const char* text) { + bool isLocalTime = false; + Require(std::isnan(_ZN3WTF37parseDateFromNullTerminatedCharactersEPKcRb(text, &isLocalTime))); +} + +template +static bool Throws(TFunction function) { + try { + function(); + } catch (const TException&) { + return true; + } + return false; +} + +static void LegacyDates() { + Date("Sat, 01 Jan 2000 08:00:00 GMT", 946713600000.0, false); + Date("Tuesday, 09-Nov-99 23:12:40 GMT", 942189160000.0, false); + Date("01 Jan 99 22:00 +0100", 915224400000.0, false); + Date("January 09 1999 23:12:40 GMT", 915923560000.0, false); + Date("Wednesday January 09 23:12:40 GMT 1999", 915923560000.0, false); + Date("12/25/2000", 977702400000.0, true); + Date("2000/12/25 10:30 pm EST", 977801400000.0, false); + Date("Jan 1 2000 12:30 am", 946686600000.0, true); + Date("Feb 29", 951782400000.0, true); + Date("Jan 1 49", 2493072000000.0, true); + Date("Jan 1 50", -631152000000.0, true); + Date("Mon Jan 1 2000 10:00:00 GMT+05:30", 946701000000.0, false); + Date("Jan 1 2000 (comment) 10:00 UTC", 946720800000.0, false); + Date("Jan 1 2000 GMT+05:2147483000", -127902313200000.0, false); + DateInvalid(""); + DateInvalid("foo"); + DateInvalid("Jan 1 2000 garbage"); + DateInvalid("Jan 32 2000"); + DateInvalid("13/01/2000"); + DateInvalid("Jan 1 2000 13:00 pm"); + DateInvalid("Jan 1 2000 GMT+9960"); +} + +static void UndefinedInWebKit() { + bool isLocalTime = false; + Require(Throws([&] { _ZN3WTF37parseDateFromNullTerminatedCharactersEPKcRb("2000/12/9223372036854775800", &isLocalTime); })); + Require(Throws([&] { _ZN3WTF37parseDateFromNullTerminatedCharactersEPKcRb("Jan 1 2000 GMT+05:2147483600", &isLocalTime); })); + Require(Throws([&] { _ZN3WTF37parseDateFromNullTerminatedCharactersEPKcRb(nullptr, &isLocalTime); })); + Require(Throws([&] { _ZN3WTF37parseDateFromNullTerminatedCharactersEPKcRb("2000", nullptr); })); +} + +int main() { + LegacyDates(); + UndefinedInWebKit(); +} diff --git a/core/libs/tests/GuestNKWebKitNumbers.cpp b/core/libs/tests/GuestNKWebKitNumbers.cpp new file mode 100644 index 0000000000..2f8f99ca00 --- /dev/null +++ b/core/libs/tests/GuestNKWebKitNumbers.cpp @@ -0,0 +1,249 @@ +#include "prx/libSceNKWebKit/libSceNKWebKit.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static void Check(bool value, int line) { + if (!value) { + std::fprintf(stderr, "WTF number parsing check failed at line %d\n", line); + std::abort(); + } +} +#define Require(value) Check((value), __LINE__) + +static bool Same(double first, double second) { + return std::memcmp(&first, &second, sizeof(double)) == 0; +} + +static bool Same(float first, float second) { + return std::memcmp(&first, &second, sizeof(float)) == 0; +} + +static std::u16string Wide(const std::string& text) { + return std::u16string(text.begin(), text.end()); +} + +static void Double(const std::string& text, double expected, bool expectedOk) { + const auto* latin1 = reinterpret_cast(text.data()); + bool ok = !expectedOk; + Require(Same(_ZN3WTF18charactersToDoubleEPKhmPb(latin1, text.size(), &ok), expected)); + Require(ok == expectedOk); + const auto wide = Wide(text); + ok = !expectedOk; + Require(Same(_ZN3WTF18charactersToDoubleEPKDsmPb(wide.data(), wide.size(), &ok), expected)); + Require(ok == expectedOk); + Require(Same(_ZN3WTF18charactersToDoubleEPKhmPb(latin1, text.size(), nullptr), expected)); +} + +static void Float(const std::string& text, float expected, bool expectedOk, std::size_t expectedLength) { + const auto* latin1 = reinterpret_cast(text.data()); + const auto wide = Wide(text); + bool ok = !expectedOk; + Require(Same(_ZN3WTF17charactersToFloatEPKhmPb(latin1, text.size(), &ok), expected)); + Require(ok == expectedOk); + ok = !expectedOk; + Require(Same(_ZN3WTF17charactersToFloatEPKDsmPb(wide.data(), wide.size(), &ok), expected)); + Require(ok == expectedOk); + std::size_t parsedLength = 12345; + Require(Same(_ZN3WTF17charactersToFloatEPKhmRm(latin1, text.size(), &parsedLength), expected)); + Require(parsedLength == expectedLength); + parsedLength = 12345; + Require(Same(_ZN3WTF17charactersToFloatEPKDsmRm(wide.data(), wide.size(), &parsedLength), expected)); + Require(parsedLength == expectedLength); +} + +static void Grammar() { + Double("1.5", 1.5, true); + Double(" \t\n\v\f\r-2.5e3", -2500.0, true); + Double("+5", 5.0, true); + Double("5.", 5.0, true); + Double(".5", 0.5, true); + Double("-0", -0.0, true); + Double("-.0e5", -0.0, true); + Double("2E-3", 0.002, true); + Double("1.5 ", 1.5, false); + Double("", 0.0, false); + Double(" ", 0.0, false); + Double("-", 0.0, false); + Double("- 5", 0.0, false); + Double(".", 0.0, false); + Double("-.e1", 0.0, false); + Double("Infinity", 0.0, false); + Double("NaN", 0.0, false); + Double("0x10", 0.0, false); + Float("1.5x", 1.5f, false, 3); + Float(" 12abc", 12.0f, false, 4); + Float("1e", 1.0f, false, 1); + Float("1e+", 1.0f, false, 1); + Float("1e-x", 1.0f, false, 1); + Float("7e2.", 700.0f, false, 3); + Float("0x10", 0.0f, false, 1); + Float("-", 0.0f, false, 0); + Float(" ", 0.0f, false, 0); + Float("-00.", -0.0f, true, 4); +} + +static void Range() { + const double infinity = std::numeric_limits::infinity(); + Double("1e400", infinity, true); + Double("-1e400", -infinity, true); + Double("1e-400", 0.0, true); + Double("1e99999999999999999999", infinity, true); + Double("0e99999999999", 0.0, true); + Double("1.7976931348623157e308", std::numeric_limits::max(), true); + Double("1.7976931348623158e308", std::numeric_limits::max(), true); + Double("1.7976931348623159e308", infinity, true); + Double("4.9406564584124654e-324", std::numeric_limits::denorm_min(), true); + Double("2.4703282292062328e-324", std::numeric_limits::denorm_min(), true); + Double("2.4703282292062327e-324", 0.0, true); + Float("3.4028235e38", std::numeric_limits::max(), true, 12); + Float("3.4028236e38", std::numeric_limits::infinity(), true, 12); + Float("1e-50", 0.0f, true, 5); +} + +static void Rounding() { + Float("1.0000000596046447755", 1.0f, true, 21); + Float("1.00000006", std::nextafter(1.0f, 2.0f), true, 10); + const std::string midpoint = "1.00000000000000011102230246251565404236316680908203125"; + Double(midpoint, 1.0, true); + Double(midpoint + std::string(800, '0'), 1.0, true); + Double(midpoint + std::string(800, '0') + "1", std::nextafter(1.0, 2.0), true); + Double("0." + std::string(400, '0') + "100000000000000011102230246251565404236316680908203125" + std::string(800, '0') + "1e401", std::nextafter(1.0, 2.0), true); + Double(std::string(900, '9') + "e-900", 1.0, true); +} + +static void Utf16() { + const std::u16string dotted = u"ı1.5"; + bool ok = true; + Require(Same(_ZN3WTF18charactersToDoubleEPKDsmPb(dotted.data(), dotted.size(), &ok), 0.0)); + Require(!ok); + const std::u16string arabic = u"2١"; + std::size_t parsedLength = 0; + Require(Same(_ZN3WTF17charactersToFloatEPKDsmRm(arabic.data(), arabic.size(), &parsedLength), 2.0f)); + Require(parsedLength == 1); + const std::u16string space = u" 1"; + ok = true; + Require(Same(_ZN3WTF17charactersToFloatEPKDsmPb(space.data(), space.size(), &ok), 0.0f)); + Require(!ok); + const std::u16string shifted = u"1ĵ"; + parsedLength = 0; + Require(Same(_ZN3WTF17charactersToFloatEPKDsmRm(shifted.data(), shifted.size(), &parsedLength), 1.0f)); + Require(parsedLength == 1); + std::u16string longer(70, u'0'); + longer += u"1.25"; + ok = false; + Require(Same(_ZN3WTF18charactersToDoubleEPKDsmPb(longer.data(), longer.size(), &ok), 1.25)); + Require(ok); + longer += u"ĵ"; + longer += u"5"; + parsedLength = 0; + Require(Same(_ZN3WTF17charactersToFloatEPKDsmRm(longer.data(), longer.size(), &parsedLength), 1.25f)); + Require(parsedLength == 74); +} + +static std::vector Units(const std::u16string& text) { + return std::vector(text.begin(), text.end()); +} + +static void Converter(const std::u16string& text, double expectedDouble, float expectedFloat, std::size_t expectedLength) { + const auto units = Units(text); + std::size_t processed = 12345; + Require(Same(_ZN3WTF17double_conversion23StringToDoubleConverter14StringToDoubleEPKtmPm(units.data(), units.size(), &processed), expectedDouble)); + Require(processed == expectedLength); + processed = 12345; + Require(Same(_ZN3WTF17double_conversion23StringToDoubleConverter13StringToFloatEPKtmPm(units.data(), units.size(), &processed), expectedFloat)); + Require(processed == expectedLength); + for (const auto unit : text) { + if (unit > 0xFF) return; + } + const std::string bytes(text.begin(), text.end()); + processed = 12345; + Require(Same(_ZN3WTF17double_conversion23StringToDoubleConverter14StringToDoubleEPKcmPm(bytes.data(), bytes.size(), &processed), expectedDouble)); + Require(processed == expectedLength); + processed = 12345; + Require(Same(_ZN3WTF17double_conversion23StringToDoubleConverter13StringToFloatEPKcmPm(bytes.data(), bytes.size(), &processed), expectedFloat)); + Require(processed == expectedLength); +} + +static void StringToDoubleConverter() { + Converter(u"1.5", 1.5, 1.5f, 3); + Converter(u"00012.50e-1z", 1.25, 1.25f, 11); + Converter(u" 1", 0.0, 0.0f, 0); + Converter(u"-", 0.0, 0.0f, 0); + Converter(u"-0", -0.0, -0.0f, 2); + Converter(u"-.0e5", -0.0, -0.0f, 5); + Converter(u"1e+x", 1.0, 1.0f, 1); + Converter(u"0x10", 0.0, 0.0f, 1); + Converter(u"1\u00B1", 1.0, 1.0f, 1); + Converter(u"1\u01315", 1.0, 1.0f, 1); + Converter(u"1e99999999999999", std::numeric_limits::infinity(), std::numeric_limits::infinity(), 16); + Converter(u"1.0000000596046447755", 1.0000000596046447755, std::nextafter(1.0f, 2.0f), 21); + Converter(u"1.000000059604644775390625", 1.000000059604644775390625, 1.0f, 26); + Converter(u"3.4028235677973366e38", 3.4028235677973366e38, std::numeric_limits::max(), 21); + Converter(u"3.4028235677973367e38", 3.4028235677973367e38, std::numeric_limits::infinity(), 21); + Converter(u"7.0064923216240854e-46", 7.0064923216240854e-46, std::numeric_limits::denorm_min(), 22); + Converter(u"7.006492321624085e-46", 7.006492321624085e-46, 0.0f, 21); + std::u16string longer(70, u'0'); + longer += u"1.25\u0135"; + Converter(longer, 1.25, 1.25f, 74); +} + +template +static void RequireInvalidArgument(TCall call, int line) { + try { + call(); + } catch (const std::invalid_argument&) { + return; + } + Check(false, line); +} + +static void NullPointers() { + bool ok = true; + Require(Same(_ZN3WTF18charactersToDoubleEPKhmPb(nullptr, 0, &ok), 0.0)); + Require(!ok); + ok = true; + Require(Same(_ZN3WTF17charactersToFloatEPKDsmPb(nullptr, 0, &ok), 0.0f)); + Require(!ok); + std::size_t parsedLength = 12345; + Require(Same(_ZN3WTF17charactersToFloatEPKhmRm(nullptr, 0, &parsedLength), 0.0f)); + Require(parsedLength == 0); + RequireInvalidArgument([] { _ZN3WTF18charactersToDoubleEPKhmPb(nullptr, 1, nullptr); }, __LINE__); + RequireInvalidArgument([] { _ZN3WTF18charactersToDoubleEPKDsmPb(nullptr, 1, nullptr); }, __LINE__); + RequireInvalidArgument([] { _ZN3WTF17charactersToFloatEPKhmPb(nullptr, 1, nullptr); }, __LINE__); + RequireInvalidArgument([] { _ZN3WTF17charactersToFloatEPKDsmPb(nullptr, 1, nullptr); }, __LINE__); + const unsigned char latin1[] = {'1'}; + const char16_t wide[] = {u'1'}; + RequireInvalidArgument([&] { _ZN3WTF17charactersToFloatEPKhmRm(latin1, 1, nullptr); }, __LINE__); + RequireInvalidArgument([&] { _ZN3WTF17charactersToFloatEPKDsmRm(wide, 1, nullptr); }, __LINE__); + RequireInvalidArgument([] { _ZN3WTF17charactersToFloatEPKhmRm(nullptr, 0, nullptr); }, __LINE__); + parsedLength = 12345; + Require(Same(_ZN3WTF17double_conversion23StringToDoubleConverter14StringToDoubleEPKcmPm(nullptr, 0, &parsedLength), 0.0)); + Require(parsedLength == 0); + parsedLength = 12345; + RequireInvalidArgument([&] { _ZN3WTF17double_conversion23StringToDoubleConverter13StringToFloatEPKtmPm(nullptr, 1, &parsedLength); }, __LINE__); + Require(parsedLength == 0); + const char bytes[] = {'1'}; + const std::uint16_t units[] = {u'1'}; + RequireInvalidArgument([&] { _ZN3WTF17double_conversion23StringToDoubleConverter14StringToDoubleEPKcmPm(bytes, 1, nullptr); }, __LINE__); + RequireInvalidArgument([&] { _ZN3WTF17double_conversion23StringToDoubleConverter14StringToDoubleEPKtmPm(units, 1, nullptr); }, __LINE__); + RequireInvalidArgument([&] { _ZN3WTF17double_conversion23StringToDoubleConverter13StringToFloatEPKcmPm(bytes, 1, nullptr); }, __LINE__); + RequireInvalidArgument([] { _ZN3WTF17double_conversion23StringToDoubleConverter13StringToFloatEPKtmPm(nullptr, 0, nullptr); }, __LINE__); +} + +int main() { + NullPointers(); + Grammar(); + Range(); + Rounding(); + Utf16(); + StringToDoubleConverter(); +} diff --git a/core/libs/tests/GuestNpAuthAuthorizedAppDialog.cpp b/core/libs/tests/GuestNpAuthAuthorizedAppDialog.cpp index 793b7cc3c5..e39943224a 100644 --- a/core/libs/tests/GuestNpAuthAuthorizedAppDialog.cpp +++ b/core/libs/tests/GuestNpAuthAuthorizedAppDialog.cpp @@ -1,4 +1,6 @@ #include "prx/libSceNpAuthAuthorizedAppDialog/include/Api.hpp" +#include "prx/libSceIme/include/ModalDialog.hpp" +#include "prx/libSceIme/include/PsnDialogNotice.hpp" #include "prx/libc/include/general/VabiMacros.hpp" #include #include @@ -19,6 +21,45 @@ constexpr int kErrNotFinished = static_cast(0x80B80005); constexpr int kErrArgNull = static_cast(0x80B8000D); constexpr int kResultUserCanceled = 1; + +bool PsnNoticeShown() { + ModalDialogView view; + if (!ModalDialogReadView_nid_postfix(view)) return false; + return view.message == PsnDialogNoticeRequest(PsnDialogNoticeKind::PsnFeature).message; +} + +void RequireNotices() { + NpAuthAuthorizedAppDialogParam param{}; + param.base.size = sizeof(param.base); + param.base.magic = static_cast(reinterpret_cast(¶m)) - 1060003575u; + param.size = sizeof(param); + param.userId = USER_SERVICE_INITIAL_USER_ID; + char application[136] = "test"; + std::string text(16, 'a'); + param.application = application; + param.text = text.c_str(); + + ModalDialogSetPresenter_nid_postfix(true); + Require(sceNpAuthAuthorizedAppDialogInitialize() == 0); + + PsnDialogNoticeSetMode_nid_postfix(PsnDialogNoticeMode::Silent); + ModalDialogReset_nid_postfix(ModalDialogAnyOwner); + Require(sceNpAuthAuthorizedAppDialogOpen(¶m) == 0); + Require(!PsnNoticeShown() && !ModalDialogCapturesInput_nid_postfix()); + + PsnDialogNoticeSetMode_nid_postfix(PsnDialogNoticeMode::Show); + ModalDialogReset_nid_postfix(ModalDialogAnyOwner); + Require(sceNpAuthAuthorizedAppDialogOpen(nullptr) == static_cast(0x80B8000Du)); + Require(!PsnNoticeShown()); + Require(sceNpAuthAuthorizedAppDialogOpen(¶m) == 0); + Require(PsnNoticeShown()); + + ModalDialogReset_nid_postfix(ModalDialogAnyOwner); + ModalDialogSetPresenter_nid_postfix(false); + PsnDialogNoticeSetMode_nid_postfix(PsnDialogNoticeMode::Silent); + Require(sceNpAuthAuthorizedAppDialogTerminate() == 0); +} + } int main() { @@ -138,6 +179,7 @@ int main() { Require(sceNpAuthAuthorizedAppDialogGetResult(result) == kErrNotFinished); Require(sceNpAuthAuthorizedAppDialogTerminate() == 0); Require(sceNpAuthAuthorizedAppDialogTerminate() == kErrNotInitialized); + RequireNotices(); Require(sceUserServiceTerminate() == 0); return 0; } diff --git a/core/libs/tests/GuestNpCommerceDialog.cpp b/core/libs/tests/GuestNpCommerceDialog.cpp index 28a329dd02..12cd7fa4bf 100644 --- a/core/libs/tests/GuestNpCommerceDialog.cpp +++ b/core/libs/tests/GuestNpCommerceDialog.cpp @@ -1,6 +1,8 @@ #include "prx/libSceNpCommerce/include/Api.hpp" #include "ProcessParametersFixture.hpp" #include "prx/libSceUserService/UserService.hpp" +#include "prx/libSceIme/include/ModalDialog.hpp" +#include "prx/libSceIme/include/PsnDialogNotice.hpp" #include #include #include "SceTypes.hpp" @@ -33,6 +35,58 @@ void RequireCanceledResult(std::uint64_t userData, bool clearsReserved) { for (const auto value : result.reserved) Require(value == (clearsReserved ? 0 : 0x33)); } + +bool PsnNoticeShown() { + ModalDialogView view; + if (!ModalDialogReadView_nid_postfix(view)) return false; + return view.message == PsnDialogNoticeRequest(PsnDialogNoticeKind::PsnFeature).message; +} + +void RequireNotices() { + std::uint32_t sdkVersion = 0x03500000; + std::memcpy(process.data() + 16, &sdkVersion, sizeof(sdkVersion)); + NpCommerceDialogParam param{}; + param.base.size = sizeof(param.base); + param.base.magic = static_cast(reinterpret_cast(¶m)) - 1060003575u; + param.size = sizeof(param); + param.userId = USER_SERVICE_INITIAL_USER_ID; + param.mode = 5; + param.argument = 1; + NpCommerceDialogParam2 param2{}; + param2.base.size = sizeof(param2.base); + param2.base.magic = static_cast(reinterpret_cast(¶m2)) - 1060003575u; + param2.size = sizeof(param2); + param2.userId = USER_SERVICE_INITIAL_USER_ID; + param2.mode = 5; + param2.argument = 1; + + ModalDialogSetPresenter_nid_postfix(true); + sceNpCommerceDialogTerminate(); + Require(sceNpCommerceDialogInitialize() == 0); + + PsnDialogNoticeSetMode_nid_postfix(PsnDialogNoticeMode::Silent); + ModalDialogReset_nid_postfix(ModalDialogAnyOwner); + Require(sceNpCommerceDialogOpen(¶m) == 0); + Require(!PsnNoticeShown() && !ModalDialogCapturesInput_nid_postfix()); + + PsnDialogNoticeSetMode_nid_postfix(PsnDialogNoticeMode::Show); + ModalDialogReset_nid_postfix(ModalDialogAnyOwner); + Require(sceNpCommerceDialogOpen(nullptr) == static_cast(0x80B8000Du)); + Require(!PsnNoticeShown()); + Require(sceNpCommerceDialogOpen(¶m) == 0); + Require(PsnNoticeShown()); + + PsnDialogNoticeSetMode_nid_postfix(PsnDialogNoticeMode::Show); + ModalDialogReset_nid_postfix(ModalDialogAnyOwner); + Require(sceNpCommerceDialogOpen2(¶m2) == 0); + Require(PsnNoticeShown()); + + ModalDialogReset_nid_postfix(ModalDialogAnyOwner); + ModalDialogSetPresenter_nid_postfix(false); + PsnDialogNoticeSetMode_nid_postfix(PsnDialogNoticeMode::Silent); + Require(sceNpCommerceDialogTerminate() == 0); +} + } int main() { @@ -204,6 +258,7 @@ int main() { Require(sceNpCommerceDialogGetResult(&result) == static_cast(0x80B80003u)); Require(sceNpCommerceDialogGetStatus() == statusNone); Require(sceNpCommerceDialogUpdateStatus() == statusNone); + RequireNotices(); Require(sceUserServiceTerminate() == 0); return 0; } diff --git a/core/libs/tests/GuestNpCommon.cpp b/core/libs/tests/GuestNpCommon.cpp index 21e7c42392..08313861e1 100644 --- a/core/libs/tests/GuestNpCommon.cpp +++ b/core/libs/tests/GuestNpCommon.cpp @@ -132,6 +132,9 @@ static int testClock() { bool ok = expect(sceNpGetSystemClockUsec(&usec) == 0, "the clock was not read"); sceKernelClockGettime(4, &after); + ok &= expect(sceNpGetSystemClockUsec(nullptr) == INVALID_ARGUMENT, "a null destination was not rejected"); + std::int64_t later = -1; + ok &= expect(sceNpGetSystemClockUsec(&later) == 0 && later >= usec && usec >= 0, "the clock went backwards"); ok &= expect(usec >= before.tv_sec * 1000000 + before.tv_nsec / 1000 && usec <= after.tv_sec * 1000000 + after.tv_nsec / 1000, "the clock is not the monotonic kernel clock in microseconds"); char version[12]; diff --git a/core/libs/tests/GuestNpCommonRuntime.cpp b/core/libs/tests/GuestNpCommonRuntime.cpp index 4d577b7c0b..5b2ca6ea88 100644 --- a/core/libs/tests/GuestNpCommonRuntime.cpp +++ b/core/libs/tests/GuestNpCommonRuntime.cpp @@ -9,7 +9,9 @@ #include #include #include +#include #include +#include namespace { @@ -31,10 +33,15 @@ constexpr int NpOutOfRange = static_cast(0x8055800E); constexpr int NpInvalidArgument = static_cast(0x80558009); constexpr int NpEventFlagBusy = static_cast(0x8055800C); constexpr int NpSemaBusy = static_cast(0x8055800D); +constexpr int NpStreamBufferTooSmall = static_cast(0x80559E0D); constexpr int NpTitleIdInvalid = static_cast(0x80559E11); +constexpr int NpUtilParseOutOfRange = static_cast(0x8055060A); constexpr int NpTitleIdBufferTooSmall = static_cast(0x80559E0D); +constexpr int NpStreamShort = static_cast(0x80559E10); constexpr int KernelNotPermitted = static_cast(0x80020001); constexpr int KernelNoSuchObject = static_cast(0x80020003); +constexpr int NpJsonTooDeep = static_cast(0x80550603); +constexpr int NpServerErrorBadCode = static_cast(0x80559C02); constexpr std::uint32_t EventFlagWaitAnd = 1; constexpr std::uint32_t EventFlagShared = 0x100; @@ -73,6 +80,73 @@ void TestSemaphoresAndFlags() { Require(sceNpDeleteEventFlag(flag) == 0, "the event flag is deleted"); } +void TestEventFlagClearAndCancel() { + KernelEventFlag flag {}; + Require(sceNpCreateEventFlag(&flag, "NpClearFlag", 0, 0) == 0, "an event flag is created"); + std::uint64_t result = 0; + Require(sceNpSetEventFlag(flag, 0b111) == 0 && sceNpClearEventFlag(flag, 0b101) == 0, "the pattern is set and masked"); + Require(sceNpPollEventFlag(flag, 0b010, EventFlagWaitAnd, &result) == NpEventFlagBusy, "a clear keeps only the bits of its pattern"); + Require(sceNpPollEventFlag(flag, 0b101, EventFlagWaitAnd, &result) == 0 && result == 0b101, "a clear leaves the masked bits set"); + int waiting = -1; + Require(sceNpCancelEventFlag(flag, 0b1000, &waiting) == 0 && waiting == 0, "a cancel reports no waiting thread"); + Require(sceNpPollEventFlag(flag, 0b101, EventFlagWaitAnd, &result) == NpEventFlagBusy, "a cancel replaces the old pattern"); + Require(sceNpPollEventFlag(flag, 0b1000, EventFlagWaitAnd, &result) == 0 && result == 0b1000, "a cancel sets its pattern"); + Require(sceNpDeleteEventFlag(flag) == 0, "the event flag is deleted"); +} + +struct CondWaiter { + PthreadMutex* mutex; + PthreadCond* cond; + int (APS5_VABI* wait)(PthreadCond*, PthreadMutex*); + bool ready = false; + bool released = false; +}; + +void* APS5_VABI WaitOnCondition(void* arg) { + auto* waiter = static_cast(arg); + Require(sceNpMutexLock(waiter->mutex) == 0, "the waiter locks the mutex"); + waiter->ready = true; + while (!waiter->released) Require(waiter->wait(waiter->cond, waiter->mutex) == 0, "the wait ends without an error"); + Require(sceNpMutexUnlock(waiter->mutex) == 0, "the waiter holds the mutex after the wait"); + return nullptr; +} + +template +void WakeWaiter(PthreadCond* cond, int (APS5_VABI* wait)(PthreadCond*, PthreadMutex*), TWake wake) { + PthreadMutex mutex {}; + Require(sceNpMutexInit(&mutex, "NpCondMutex", 0) == 0, "a mutex is created"); + CondWaiter waiter {&mutex, cond, wait}; + Pthread thread {}; + Require(sceNpCreateThread(&thread, WaitOnCondition, &waiter, 0, 0x10000, 0, "NpCondWaiter") == 0, "the waiter is created"); + for (bool ready = false; !ready;) { + Require(sceNpMutexLock(&mutex) == 0, "the main thread locks the mutex"); + ready = waiter.ready; + if (!ready) { + Require(sceNpMutexUnlock(&mutex) == 0, "the main thread unlocks the mutex"); + std::this_thread::yield(); + } + } + waiter.released = true; + Require(wake(thread) == 0, "the waiter is signalled"); + Require(sceNpMutexUnlock(&mutex) == 0, "the main thread unlocks the mutex"); + Require(sceNpJoinThread(thread, nullptr) == 0, "the woken waiter is joined"); + Require(sceNpMutexDestroy(&mutex) == 0, "the mutex is destroyed"); +} + +void TestConditionWakeups() { + PthreadCond cond {}; + Require(sceNpCondInit(&cond, "NpCond", 0) == 0, "a condition is created"); + WakeWaiter(&cond, sceNpCondWait, [&](Pthread) { return sceNpCondSignalAll(&cond); }); + WakeWaiter(&cond, sceNpCondWait, [&](Pthread thread) { return sceNpCondSignalTo(&cond, thread); }); + Require(sceNpCondDestroy(&cond) == 0, "the condition is destroyed"); + PthreadCond lightweight {}; + Require(sceNpLwCondInit(&lightweight, "NpLwCond") == 0, "a lightweight condition is created"); + WakeWaiter(&lightweight, sceNpLwCondWait, [&](Pthread) { return sceNpLwCondSignal(&lightweight); }); + WakeWaiter(&lightweight, sceNpLwCondWait, [&](Pthread) { return sceNpLwCondSignalAll(&lightweight); }); + WakeWaiter(&lightweight, sceNpLwCondWait, [&](Pthread thread) { return sceNpLwCondSignalTo(&lightweight, thread); }); + Require(sceNpLwCondDestroy(&lightweight) == 0, "the lightweight condition is destroyed"); +} + void TestSharedEventFlags() { KernelEventFlag creator {}; Require(sceNpCreateEventFlag(&creator, "NpSharedFlag", EventFlagShared, 0) == 0, "a shared event flag is created"); @@ -294,7 +368,7 @@ void TestTitleIdObjects() { auto* owned = static_cast(_ZN3sce2np6ObjectnwEmR14SceNpAllocator(sizeof(NpTitleIdObject), &allocator)); _ZN3sce2np9NpTitleIdC1Ev(owned); using Destructor = void APS5_VABI (*)(NpTitleIdObject*); - reinterpret_cast(owned->vtable[1])(owned); + reinterpret_cast(const_cast(owned->vtable[1]))(owned); Require(record.released == record.block.data(), "the deleting destructor frees through the stored allocator"); } @@ -455,6 +529,226 @@ void TestJsonText() { Require(sceNpUtilHttpUrlEncode(url, 3, "@", 1, &length) == NpUtilBufferTooSmall, "encoding needs room for the terminator"); } +int g_jsonVariant = 0; +int g_jsonFailAt = 0; +std::vector g_jsonEvents; + +int RecordJsonEvent(std::int32_t event, std::uint32_t depth, std::int32_t element, const char* key, const void* value, + std::int32_t arrayIndex, const std::string& offset) { + std::string text = std::to_string(event) + " " + std::to_string(depth) + " " + std::to_string(element) + " "; + text += key != nullptr ? key : "-"; + text += " "; + if (value == nullptr) { + text += "-"; + } else { + std::uint32_t type = 0; + std::memcpy(&type, value, sizeof(type)); + const char* valueText = static_cast(value) + sizeof(type); + if (g_jsonVariant != 0) std::memcpy(&valueText, static_cast(value) + 8, sizeof(valueText)); + text += std::to_string(type) + ":" + valueText; + if (g_jsonVariant == 2) { + std::uint32_t last = 0; + std::memcpy(&last, static_cast(value) + 16, sizeof(last)); + text += ":" + std::to_string(last); + } + } + text += " " + std::to_string(arrayIndex) + offset; + g_jsonEvents.push_back(text); + return static_cast(g_jsonEvents.size()) == g_jsonFailAt ? static_cast(0x80001234) : 0; +} + +int APS5_VABI OnJsonEvent(void*, std::int32_t event, std::uint32_t depth, std::int32_t element, const char* key, + const void* value, std::int32_t arrayIndex, void*) { + return RecordJsonEvent(event, depth, element, key, value, arrayIndex, ""); +} + +int APS5_VABI OnJsonExEvent(void*, std::int32_t event, std::uint32_t depth, std::int32_t element, const char* key, + const void* value, std::int32_t arrayIndex, std::uint32_t offset, void*) { + return RecordJsonEvent(event, depth, element, key, value, arrayIndex, " @" + std::to_string(offset)); +} + +bool SameEvents(const std::vector& expected) { + if (g_jsonEvents == expected) return true; + for (const std::string& event : g_jsonEvents) std::fprintf(stderr, " got %s\n", event.c_str()); + return false; +} + +int ParseJson(const NpJsonRuleSet* rules, const std::string& text, const std::vector& chunks = {}) { + alignas(16) static unsigned char context[0x760]; + g_jsonVariant = 0; + g_jsonEvents.clear(); + if (sceNpJsonParseInit(context, rules, OnJsonEvent, nullptr) != 0) return -1; + if (chunks.empty()) return sceNpJsonParse(context, text.data(), static_cast(text.size())); + std::size_t position = 0; + for (const std::size_t size : chunks) { + const int result = sceNpJsonParse(context, text.data() + position, static_cast(size)); + if (result != 0) return result; + position += size; + } + return 0; +} + +void TestJsonParser() { + const NpJsonRule topA[] = {{1, "a", 1}, {0, "", 0}}; + const NpJsonRule nestedB[] = {{1, "b", 0}, {0, "", 0}}; + const NpJsonRule* nestedLevels[] = {topA, nestedB}; + const NpJsonRuleSet nested{nestedLevels, 2}; + const std::string nestedText = R"({"a":{"b":"hello","c":1},"x":2})"; + const std::vector nestedEvents = {"5 0 0 a - -1", "1 0 0 - - -1", "5 1 0 b - -1", "6 1 0 b 4:hello -1", + "2 0 0 - - -1"}; + Require(ParseJson(&nested, nestedText) == 0 && SameEvents(nestedEvents), "matched keys report their object and values"); + Require(ParseJson(&nested, nestedText, std::vector(nestedText.size(), 1)) == 0 && SameEvents(nestedEvents), + "one byte at a time gives the same events"); + + const NpJsonRule flatA[] = {{1, "a", 0}, {0, "", 0}}; + const NpJsonRule* flatLevels[] = {flatA, nestedB}; + const NpJsonRuleSet flat{flatLevels, 2}; + Require(ParseJson(&flat, R"({"a":{"b":"hello"},"b":1})") == 0 && SameEvents({"5 0 0 a - -1", "1 0 0 - - -1"}), + "an object matched without descend is skipped, close included"); + + const NpJsonRule element[] = {{2, nullptr, 0}, {0, "", 0}}; + const NpJsonRule* arrayLevels[] = {flatA, element}; + const NpJsonRuleSet array{arrayLevels, 2}; + Require(ParseJson(&array, R"({"a":[1,"x",true,false,null,-1.5e+3]})") == 0 + && SameEvents({"5 0 0 a - -1", "3 0 0 - - -1", "6 1 0 - 3:1 0", "6 1 0 - 4:x 1", "6 1 0 - 1: 2", "6 1 0 - 2: 3", + "6 1 0 - 0: 4", "6 1 0 - 3:-1.5e+3 5", "4 0 0 - - -1"}), + "array elements report their index and value type"); + + const NpJsonRule topS[] = {{1, "s", 0}, {0, "", 0}}; + const NpJsonRule* stringLevels[] = {topS}; + const NpJsonRuleSet strings{stringLevels, 1}; + const std::string escaped = "{\"s\":\"\\u00e9\\ud83d\\ude00\\n\xC3\xA9\"}"; + const std::string decoded = "5 0 0 s - -1|6 0 0 s 4:\xC3\xA9\xF0\x9F\x98\x80\n\xC3\xA9 -1"; + const auto joined = [] { + std::string out; + for (const std::string& event : g_jsonEvents) out += (out.empty() ? "" : "|") + event; + return out; + }; + Require(ParseJson(&strings, escaped) == 0 && joined() == decoded, "escapes and surrogate pairs decode to UTF-8"); + const std::size_t cut = escaped.find("\\n") + 1; + Require(ParseJson(&strings, escaped, {cut, 2, escaped.size() - cut - 2}) == 0 && joined() == decoded, + "an escape and a UTF-8 sequence split between calls still decode"); + + const NpJsonRule anyElement[] = {{2, nullptr, 1}, {0, "", 0}}; + const NpJsonRule* deepLevels[] = {anyElement}; + const NpJsonRuleSet deep{deepLevels, 1}; + Require(ParseJson(&deep, std::string(20, '[')) == NpJsonTooDeep && SameEvents({"3 0 0 - - -1"}), + "nesting past 16 levels is refused"); + const NpJsonRule anyMember[] = {{1, nullptr, 1}, {0, "", 0}}; + const NpJsonRule* memberLevels[] = {anyMember}; + const NpJsonRuleSet members{memberLevels, 1}; + const auto objects = [](int depth) { + std::string text; + for (int i = 1; i < depth; ++i) text += "{\"k\":"; + text += "{\"k\":1,\"j\":2}"; + return text + std::string(depth - 1, '}'); + }; + const std::string sixteen = objects(16); + Require(ParseJson(&members, sixteen) == 0 && SameEvents({"1 0 0 - - -1", "2 0 0 - - -1"}), "16 nested objects in one call close"); + Require(ParseJson(&members, sixteen, {80, sixteen.size() - 80}) == 0 && SameEvents({"1 0 0 - - -1"}), + "a call that ends inside the 16th object loses the close, as in firmware 13.42"); + const std::string fifteen = objects(15); + Require(ParseJson(&members, fifteen, {75, fifteen.size() - 75}) == 0 && SameEvents({"1 0 0 - - -1", "2 0 0 - - -1"}), + "a call that ends inside the 15th object keeps the close"); + Require(ParseJson(&strings, "{\"s\":\"" + std::string(0x5FF, 'y') + "\"}") == 0 && g_jsonEvents.size() == 2, + "a 0x5ff byte string fits"); + Require(ParseJson(&strings, "{\"s\":\"" + std::string(0x600, 'y') + "\"}") == NpUtilBufferTooSmall + && SameEvents({"5 0 0 s - -1"}), + "a 0x600 byte string is refused"); + Require(ParseJson(&strings, "{\"s\":" + std::string(0x600, '1') + "}") == NpUtilBufferTooSmall, "a 0x600 digit number is refused"); + const std::string longKey(0x7F, 'k'); + const NpJsonRule topLong[] = {{1, longKey.c_str(), 0}, {0, "", 0}}; + const NpJsonRule* longLevels[] = {topLong}; + const NpJsonRuleSet longRules{longLevels, 1}; + Require(ParseJson(&longRules, "{\"" + std::string(0x90, 'k') + "\":1}") == 0 + && SameEvents({"5 0 0 " + longKey + " - -1", "6 0 0 " + longKey + " 3:1 -1"}), + "keys are cut to 0x7f bytes"); + g_jsonFailAt = 2; + Require(ParseJson(&nested, R"({"a":{"b":1}})") == static_cast(0x80001234) && SameEvents({"5 0 0 a - -1", "1 0 0 - - -1"}), + "a negative callback result stops the parse and is returned"); + g_jsonFailAt = 0; + Require(sceNpJsonParseInit(nullptr, &nested, OnJsonEvent, nullptr) == NpUtilInvalid, "a null context is refused"); + + alignas(16) unsigned char bufContext[0x108] = {}; + char key[0x100] = {}; + char value[0x100] = {}; + const NpJsonRule bufTop[] = {{1, "abc", 0}, {1, "t", 0}, {0, "", 0}}; + const NpJsonRule* bufLevels[] = {bufTop}; + const NpJsonRuleSet bufRules{bufLevels, 1}; + Require(sceNpJsonParseBufInit(bufContext, &bufRules, nullptr, 4, value, 0x20, OnJsonEvent, nullptr) == NpUtilInvalid, + "the buffered parser needs a key buffer"); + Require(sceNpJsonParseBufInit(bufContext, &bufRules, key, 0, value, 0x20, OnJsonEvent, nullptr) == NpUtilBufferTooSmall, + "the key buffer needs a size"); + Require(sceNpJsonParseBufInit(bufContext, &bufRules, key, 4, value, 0x1F, OnJsonEvent, nullptr) == NpUtilBufferTooSmall, + "the value buffer needs 0x20 bytes"); + Require(sceNpJsonParseBufInit(bufContext, &bufRules, key, 4, value, 0x20, OnJsonEvent, nullptr) == 0, "buffered init"); + g_jsonVariant = 1; + g_jsonEvents.clear(); + const std::string bufText = R"({"abcdef":1,"t":true,"abc":"0123456789012345678901234567890"})"; + Require(sceNpJsonParseBuf(bufContext, bufText.data(), static_cast(bufText.size())) == 0 + && SameEvents({"5 0 0 abc - -1", "6 0 0 abc 3:1 -1", "5 0 1 t - -1", "6 0 1 t 1: -1", "5 0 0 abc - -1", + "6 0 0 abc 4:0123456789012345678901234567890 -1"}), + "the caller buffers cut keys and hold values, literals have empty text"); + Require(sceNpJsonParseBufInit(bufContext, &strings, key, 4, value, 0x20, OnJsonEvent, nullptr) == 0, "buffered init again"); + g_jsonEvents.clear(); + const std::string tooLong = "{\"s\":\"" + std::string(0x20, 'y') + "\"}"; + Require(sceNpJsonParseBuf(bufContext, tooLong.data(), static_cast(tooLong.size())) == NpUtilBufferTooSmall, + "a string longer than the value buffer is refused"); + + alignas(16) unsigned char exContext[0x110] = {}; + Require(sceNpJsonParseExInit(exContext, nullptr, key, 0x10, value, 0x20, OnJsonExEvent, nullptr) == 0, "ex init"); + g_jsonVariant = 2; + g_jsonEvents.clear(); + const std::string everything = R"({"a":[1,{"b":"xy"}],"c":true})"; + Require(sceNpJsonParseEx(exContext, everything.data(), static_cast(everything.size())) == 0 + && SameEvents({"1 0 -1 - - -1 @0", "5 1 -1 a - -1 @1", "3 1 -1 - - -1 @5", "6 2 -1 - 3:1:1 0 @6", + "1 2 -1 - - 1 @8", "5 3 -1 b - -1 @9", "6 3 -1 b 4:xy:1 -1 @13", "2 2 -1 - - 1 @17", "4 1 -1 - - -1 @18", + "5 1 -1 c - -1 @20", "6 1 -1 c 1::1 -1 @24", "2 0 -1 - - -1 @28"}), + "without rules the extended parser reports everything with stream offsets"); + Require(sceNpJsonParseExInit(exContext, &strings, key, 0x10, value, 0x20, OnJsonExEvent, nullptr) == 0, "ex init again"); + g_jsonEvents.clear(); + const std::string pieces = "{\"s\":\"" + std::string("0123456789") + "0123456789" + "0123456789" + "0123456789\",\"n\":1}"; + Require(sceNpJsonParseEx(exContext, pieces.data(), static_cast(pieces.size())) == 0 + && SameEvents({"5 0 0 s - -1 @1", "6 0 0 s 4:0123456789012345678901234567890:0 -1 @5", + "6 0 0 s 4:123456789:1 -1 @5"}), + "a long string comes in pieces with the last one marked"); + Require(sceNpJsonParseExInit(exContext, &strings, key, 0x10, value, 0x20, OnJsonExEvent, nullptr) == 0, "ex init for numbers"); + g_jsonEvents.clear(); + const std::string digits = "{\"s\":" + std::string(40, '1') + "}"; + Require(sceNpJsonParseEx(exContext, digits.data(), static_cast(digits.size())) == 0 + && SameEvents({"5 0 0 s - -1 @1", "6 0 0 s 3:" + std::string(31, '1') + ":0 -1 @5", "6 0 0 s 3:111111111:1 -1 @5"}), + "a long number comes in pieces too"); + + const auto code = [](bool multi, std::int32_t http, const std::string& body) { + return multi ? sceNpServerErrorJsonMultiGetErrorCode(http, body.data(), body.size()) + : sceNpServerErrorJsonGetErrorCode(http, body.data(), body.size()); + }; + Require(code(false, 404, R"({"error":{"code":2097152}})") == static_cast(0x82200000), "a server error code is returned"); + Require(code(false, 404, R"({"error":{"code":12582912}})") == static_cast(0x82FFFFFF), "codes from 0xc00000 are unknown"); + Require(code(false, 404, R"({"error":{"code":"5"}})") == static_cast(0x82F00194), "a string code falls back to the status"); + Require(code(false, 600, R"({"error":{"code":"5"}})") == static_cast(0x82FFFFFF), "a status past 599 is unknown"); + Require(code(false, 404, R"({"code":7})") == static_cast(0x82F00194), "the single form needs error.code"); + Require(code(true, 404, R"({"code":7})") == static_cast(0x82000007), "the multi form also takes a top level code"); + Require(code(true, 404, R"({"error":{"code":8}})") == static_cast(0x82000008), "the multi form takes error.code"); + Require(code(false, 503, R"({"error":{"code":-1}})") == static_cast(0x82F001F7), "a negative code falls back to the status"); + Require(sceNpServerErrorJsonGetErrorCode(404, nullptr, 5) == static_cast(0x82F00194), "no body falls back to the status"); + alignas(16) unsigned char serverContext[0x760] = {}; + NpServerErrorJsonResult result{}; + Require(sceNpServerErrorJsonParseInit(serverContext, nullptr) == NpUtilInvalid, "the server error parser needs a result"); + std::memset(&result, 0xEE, sizeof(result)); + Require(sceNpServerErrorJsonParseInit(serverContext, &result) == 0 && result.found == 0 && result.code == -1, + "server error init clears the result"); + const std::string body = R"({"error":{"code":42}})"; + Require(sceNpServerErrorJsonParse(serverContext, body.data(), static_cast(body.size())) == 0 && result.found == 1 + && result.code == 42, + "the server error parser stores the code"); + const std::string badBody = R"({"error":{"code":"x"}})"; + Require(sceNpServerErrorJsonParseMultiInit(serverContext, &result) == 0, "multi server error init"); + Require(sceNpServerErrorJsonParse(serverContext, badBody.data(), static_cast(badBody.size())) == NpServerErrorBadCode + && result.found == 0, + "a code that is not a number stops the parse"); +} + void TestTitleIds() { NpTitleIdParts parts {{'A', 'B', 'C', 'D', '1', '2', '3', '4', '5'}, 0, 7}; char titleId[13] = {}; @@ -576,15 +870,277 @@ void TestHexAndCopies() { } +void TestMemoryStreams() { + using Read = int(APS5_VABI*)(NpMemoryStreamReader*, void*, void*, std::size_t, std::size_t*); + using Write = int(APS5_VABI*)(NpMemoryStreamWriter*, void*, const void*, std::size_t, std::size_t*); + using Destroy = void(APS5_VABI*)(void*); + + const char text[] = "abcdefgh"; + NpMemoryStreamReader reader; + std::memset(&reader, 0x77, sizeof(reader)); + _ZN3sce2np18MemoryStreamReaderC1EPKvm(&reader, text, 8); + Require(reader.data == text && reader.size == 8 && reader.position == 0, "a reader starts at the beginning of its buffer"); + std::array out {}; + std::size_t count = 99; + Require(reinterpret_cast(const_cast(reader.vtable[2]))(&reader, nullptr, out.data(), 5, &count) == 0 && count == 5 && + std::memcmp(out.data(), "abcde", 5) == 0 && reader.position == 5, + "a read through the vtable copies the requested bytes"); + out.fill(0); + Require(_ZN3sce2np18MemoryStreamReader4ReadEPNS0_6HandleEPvmPm(&reader, nullptr, out.data(), 8, &count) == 0 && count == 3 && + std::memcmp(out.data(), "fgh", 3) == 0 && out[3] == 0 && reader.position == 8, + "a read past the end is cut to what remains"); + count = 99; + Require(_ZN3sce2np18MemoryStreamReader4ReadEPNS0_6HandleEPvmPm(&reader, nullptr, out.data(), 8, &count) == 0 && count == 0, + "an exhausted reader reports 0 bytes"); + reader.position = 12; + Require(_ZN3sce2np18MemoryStreamReader4ReadEPNS0_6HandleEPvmPm(&reader, nullptr, out.data(), 8, &count) == 0 && count == 0 && + reader.position == 12, + "a position beyond the size reads nothing"); + + std::array buffer {}; + NpMemoryStreamWriter writer; + _ZN3sce2np18MemoryStreamWriterC2EPvm(&writer, buffer.data(), 6); + Require(reinterpret_cast(const_cast(writer.vtable[2]))(&writer, nullptr, "abcd", 4, &count) == 0 && count == 4 && writer.position == 4, + "a write through the vtable stores the bytes"); + count = 99; + Require(_ZN3sce2np18MemoryStreamWriter5WriteEPNS0_6HandleEPKvmPm(&writer, nullptr, "xyz", 3, &count) == NpStreamBufferTooSmall && + count == 99 && writer.position == 4, + "a write that does not fit is refused whole"); + Require(_ZN3sce2np18MemoryStreamWriter5WriteEPNS0_6HandleEPKvmPm(&writer, nullptr, "xy", 2, nullptr) == 0 && writer.position == 6 && + std::memcmp(buffer.data(), "abcdxy", 6) == 0, + "a write may fill the buffer exactly without a count pointer"); + _ZN3sce2np18MemoryStreamWriterC1EPvm(&writer, buffer.data(), 0); + writer.position = 3; + Require(_ZN3sce2np18MemoryStreamWriter5WriteEPNS0_6HandleEPKvmPm(&writer, nullptr, "a", 1, &count) == NpStreamBufferTooSmall && + _ZN3sce2np18MemoryStreamWriter5WriteEPNS0_6HandleEPKvmPm(&writer, nullptr, "", 0, &count) == 0 && writer.position == 3, + "a writer of size 0 has no room whatever its position"); + _ZN3sce2np18MemoryStreamWriterC1EPvm(&writer, nullptr, 2); + Require(_ZN3sce2np18MemoryStreamWriter5WriteEPNS0_6HandleEPKvmPm(&writer, nullptr, "abcdef", 6, &count) == 0 && count == 6 && + _ZN3sce2np18MemoryStreamWriter5WriteEPNS0_6HandleEPKvmPm(&writer, nullptr, "ab", 2, &count) == 0 && writer.position == 8, + "a writer without a buffer only counts"); + + reinterpret_cast(const_cast(reader.vtable[0]))(&reader); + _ZN3sce2np18MemoryStreamReaderD2Ev(&reader); + Require(reader.data == text && reader.size == 8 && reader.position == 12, "the reader destructors leave the object untouched"); + reinterpret_cast(const_cast(writer.vtable[0]))(&writer); + _ZN3sce2np18MemoryStreamWriterD2Ev(&writer); + Require(writer.data == nullptr && writer.size == 2 && writer.position == 8, "the writer destructors leave the object untouched"); +} + +struct ChunkReader { + NpStreamReader base; + const std::uint8_t* data; + std::size_t size; + std::size_t position; + std::size_t chunk; + int failAt; + int calls; +}; + +int APS5_VABI ChunkRead(NpStreamReader* self, void*, void* out, std::size_t size, std::size_t* read) { + auto* reader = reinterpret_cast(self); + if (++reader->calls == reader->failAt) { + *read = 0; + return -1; + } + const std::size_t count = std::min({size, reader->chunk, reader->size - reader->position}); + std::memcpy(out, reader->data + reader->position, count); + reader->position += count; + *read = count; + return 0; +} + +struct CollectWriter { + NpStreamWriter base; + std::array data; + std::size_t size; + std::size_t chunk; +}; + +int APS5_VABI CollectWrite(NpStreamWriter* self, void*, const void* data, std::size_t size, std::size_t* written) { + auto* writer = reinterpret_cast(self); + const std::size_t count = std::min(size, writer->chunk); + std::memcpy(writer->data.data() + writer->size, data, count); + writer->size += count; + *written = count; + return 0; +} + +struct SumContext { + NpStreamCtx base; + std::size_t bytes; + std::uint32_t sum; + int result; +}; + +int APS5_VABI SumNotify(NpStreamCtx* self, const void* data, std::size_t size) { + auto* context = reinterpret_cast(self); + for (std::size_t i = 0; i < size; ++i) context->sum += static_cast(data)[i]; + context->bytes += size; + return context->result; +} + +const void* const ChunkReaderVtable[] = {nullptr, nullptr, reinterpret_cast(&ChunkRead)}; +const void* const CollectWriterVtable[] = {nullptr, nullptr, reinterpret_cast(&CollectWrite)}; +const void* const SumContextVtable[] = {nullptr, nullptr, reinterpret_cast(&SumNotify)}; + +void TestStreamHelpers() { + std::array source {}; + std::uint32_t total = 0; + for (std::size_t i = 0; i < source.size(); ++i) total += source[i] = static_cast(i * 7 + 3); + auto reader = [&](std::size_t size, std::size_t chunk) { return ChunkReader {{ChunkReaderVtable}, source.data(), size, 0, chunk, 0, 0}; }; + std::array out {}; + std::size_t count = 0; + + ChunkReader stream = reader(600, 70); + SumContext context {{SumContextVtable}, 0, 0, 0}; + Require(_ZN3sce2np12StreamReader8ReadDataEPNS0_6HandleEPNS0_9StreamCtxEPvmPm(&stream.base, nullptr, &context.base, out.data(), 600, &count) == 0 && + count == 600 && out == source && context.bytes == 600 && context.sum == total, + "ReadData gathers short reads and shows every byte to the context"); + stream = reader(100, 70); + Require(_ZN3sce2np12StreamReader8ReadDataEPNS0_6HandleEPvmPm(&stream.base, nullptr, out.data(), 150, &count) == NpStreamShort && count == 100, + "ReadData reports a stream that ends early"); + stream = reader(100, 30); + Require(_ZN3sce2np12StreamReader7ReadAllEPNS0_6HandleEPvmPm(&stream.base, nullptr, out.data(), 150, &count) == 0 && count == 100, + "ReadAll accepts a stream shorter than the buffer"); + stream = reader(100, 30); + count = 7; + Require(_ZN3sce2np12StreamReader7ReadAllEPNS0_6HandleEPvmPm(&stream.base, nullptr, out.data(), 99, &count) == NpStreamBufferTooSmall && count == 7, + "ReadAll refuses a stream longer than the buffer"); + stream = reader(100, 30); + Require(_ZN3sce2np12StreamReader7ReadAllEPNS0_6HandleEPvmPm(&stream.base, nullptr, out.data(), 100, &count) == 0 && count == 100, + "ReadAll accepts a stream that fills the buffer exactly"); + + stream = reader(600, 100); + std::int64_t skipped = 5; + Require(_ZN3sce2np12StreamReader8SkipDataEPNS0_6HandleElPl(&stream.base, nullptr, 550, &skipped) == 0 && skipped == 555 && stream.position == 550, + "SkipData adds what it skipped"); + skipped = 0; + context = {{SumContextVtable}, 0, 0, 0}; + Require(_ZN3sce2np12StreamReader7SkipAllEPNS0_6HandleEPNS0_9StreamCtxEPl(&stream.base, nullptr, &context.base, &skipped) == 0 && skipped == 50 && + context.bytes == 50, + "SkipAll skips to the end"); + stream = reader(600, 100); + stream.failAt = 3; + skipped = 0; + Require(_ZN3sce2np12StreamReader7SkipAllEPNS0_6HandleEPl(&stream.base, nullptr, &skipped) == -1 && skipped == 200, + "SkipAll stops at a failed read"); + stream = reader(600, 100); + context = {{SumContextVtable}, 0, 0, -5}; + Require(_ZN3sce2np12StreamReader4ReadEPNS0_6HandleEPNS0_9StreamCtxEPvmPm(&stream.base, nullptr, &context.base, out.data(), 10, &count) == -5 && + count == 10, + "a failing context fails the read"); + context.result = 3; + Require(_ZN3sce2np12StreamReader4ReadEPNS0_6HandleEPNS0_9StreamCtxEPvmPm(&stream.base, nullptr, &context.base, out.data(), 10, &count) == 0, + "a positive context result counts as success"); + + CollectWriter writer {{CollectWriterVtable}, {}, 0, 90}; + context = {{SumContextVtable}, 0, 0, 0}; + Require(_ZN3sce2np12StreamWriter9WriteDataEPNS0_6HandleEPNS0_9StreamCtxEPKvmPm(&writer.base, nullptr, &context.base, source.data(), 600, &count) == 0 && + count == 600 && writer.size == 600 && std::memcmp(writer.data.data(), source.data(), 600) == 0 && context.sum == total, + "WriteData pushes everything through short writes"); + writer = {{CollectWriterVtable}, {}, 0, 1000}; + Require(_ZN3sce2np12StreamWriter15WriteFilledDataEPNS0_6HandleEcl(&writer.base, nullptr, 'x', 600) == 0 && writer.size == 600 && + std::all_of(writer.data.begin(), writer.data.begin() + 600, [](std::uint8_t b) { return b == 'x'; }), + "WriteFilledData writes the fill byte in chunks"); + writer = {{CollectWriterVtable}, {}, 0, 1000}; + Require(_ZN3sce2np12StreamWriter15WriteFilledDataEPNS0_6HandleEPNS0_9StreamCtxEcl(&writer.base, nullptr, nullptr, 'x', -4) == 0 && writer.size == 0, + "WriteFilledData of a negative size writes nothing"); + writer = {{CollectWriterVtable}, {}, 0, 4}; + Require(_ZN3sce2np12StreamWriter5WriteEPNS0_6HandleEPNS0_9StreamCtxEPKvmPm(&writer.base, nullptr, nullptr, source.data(), 10, &count) == 0 && count == 4, + "Write makes a single stream call"); +} + +void TestRefObjects() { + NpRefObject object {}; + std::memset(&object, 0x77, sizeof(object)); + _ZN3sce2np9RefObjectC1Ev(&object); + Require(object.vtable != nullptr && object.refCount == 0, "a new reference-counted object has no references"); + Require(_ZN3sce2np9RefObject6AddRefEv(&object) == 1 && _ZN3sce2np9RefObject6AddRefEv(&object) == 2 && object.refCount == 2, + "AddRef returns the new count"); + Require(_ZN3sce2np9RefObject7ReleaseEv(&object) == 1 && object.refCount == 1, "Release returns the new count"); + _ZN3sce2np9RefObjectD2Ev(&object); + Require(object.refCount == 1, "the destructor leaves the count alone"); + + AllocatorRecord record {}; + NpAllocator allocator {RecordAllocate, nullptr, RecordRelease, &record}; + auto* owned = static_cast(_ZN3sce2np6ObjectnwEmR14SceNpAllocator(sizeof(NpRefObject), &allocator)); + _ZN3sce2np9RefObjectC2Ev(owned); + Require(_ZN3sce2np9RefObject6AddRefEv(owned) == 1 && _ZN3sce2np9RefObject6AddRefEv(owned) == 2, "an allocated object takes references"); + Require(_ZN3sce2np9RefObject7ReleaseEv(owned) == 1 && record.released == nullptr, "releasing a reference that is not the last keeps the object"); + Require(_ZN3sce2np9RefObject7ReleaseEv(owned) == 0 && record.released == record.block.data(), + "releasing the last reference deletes the object through the stored allocator"); +} + +void TestCommIdObjects() { + NpCommunicationId parts {}; + std::memset(&parts, 0x77, sizeof(parts)); + Require(sceNpUtilParseTitleId(&parts, "WXYZ54321_07") == 0 && std::memcmp(parts.data, "WXYZ54321", 9) == 0 && parts.term == '\0' + && parts.num == 7 && parts.dummy == '\0', + "sceNpUtilParseTitleId splits the id and its number"); + Require(sceNpUtilParseTitleId(&parts, "WXYZ54321-07") == NpUtilParseOutOfRange && sceNpUtilParseTitleId(&parts, "WXYZ54321_007") == NpUtilParseOutOfRange + && sceNpUtilParseTitleId(&parts, "WXYZ") == NpUtilParseOutOfRange && sceNpUtilParseTitleId(&parts, nullptr) == NpUtilInvalid, + "sceNpUtilParseTitleId needs an underscore at index 9 and at most 12 characters"); + + NpCommIdObject commId {}; + std::memset(&commId, 0x77, sizeof(commId)); + _ZN3sce2np8NpCommIdC1Ev(&commId); + Require(commId.vtable != nullptr && _ZNK3sce2np8NpCommId7IsEmptyEv(&commId), "a default communication id is empty"); + Require(_ZN3sce2np8NpCommId5ParseEPS1_PKc(&commId, "WXYZ54321_42") == 0 && commId.commId.num == 42 && !_ZNK3sce2np8NpCommId7IsEmptyEv(&commId), + "parsing keeps the number"); + Require(_ZN3sce2np8NpCommId5ParseEPS1_PKc(&commId, "WXY154321_00") == NpTitleIdInvalid + && _ZN3sce2np8NpCommId5ParseEPS1_PKcm(&commId, "WXYZ54321_0", 11) == NpTitleIdInvalid && commId.commId.num == 42, + "a rejected communication id leaves the object as it was"); + Require(_ZN3sce2np8NpCommId5ParseEPS1_PKcm(&commId, "ABCD12345_09xyz", 12) == 0 && commId.commId.num == 9 + && std::memcmp(commId.commId.data, "ABCD12345", 9) == 0, + "the sized parse reads only the given length"); + + char text[16]; + std::memset(text, 'x', sizeof(text)); + Require(_ZN3sce2np8NpCommId5BuildERKS1_Pcm(&commId, text, 14) == 0 && std::strcmp(text, "ABCD12345_09") == 0 && text[13] == '\0' + && text[14] == 'x', + "building writes the id and clears the rest of the buffer"); + Require(_ZN3sce2np8NpCommId5BuildERKS1_Pcm(&commId, text, 12) == NpUtilBufferTooSmall && text[0] == '\0', "building needs 13 bytes"); + + NpCommIdObject copy {}; + _ZN3sce2np8NpCommIdC1ERKS1_(©, &commId); + NpCommunicationId plain = commId.commId; + plain.dummy = 'q'; + Require(_ZNK3sce2np8NpCommId6EqualsERKS1_(©, &commId) && _ZN3sce2npeqERKNS0_8NpCommIdERK20SceNpCommunicationId(©, &plain) + && _ZNK3sce2np8NpCommId6EqualsEPKc(©, "ABCD12345_09") && !_ZNK3sce2np8NpCommId6EqualsEPKc(©, "ABCD12345_9"), + "equal communication ids compare equal, ignoring the spare byte"); + plain.num = 10; + Require(_ZN3sce2npneERK20SceNpCommunicationIdRKNS0_8NpCommIdE(&plain, ©) && !_ZNK3sce2np8NpCommId6EqualsERK20SceNpCommunicationId(©, &plain), + "the number takes part in the comparison"); + _ZN3sce2np8NpCommIdC2ERK20SceNpCommunicationId(©, &plain); + Require(copy.commId.dummy == 'q', "constructing from a plain id copies all twelve bytes"); + _ZN3sce2np8NpCommId5ClearEv(©); + Require(_ZNK3sce2np8NpCommId7IsEmptyEv(©) && copy.commId.dummy == '\0', "clearing empties the communication id"); + + AllocatorRecord record {}; + NpAllocator allocator {RecordAllocate, nullptr, RecordRelease, &record}; + auto* owned = static_cast(_ZN3sce2np6ObjectnwEmR14SceNpAllocator(sizeof(NpCommIdObject), &allocator)); + _ZN3sce2np8NpCommIdC1Ev(owned); + using Destructor = void APS5_VABI (*)(NpCommIdObject*); + reinterpret_cast(const_cast(owned->vtable[1]))(owned); + Require(record.released == record.block.data(), "the deleting destructor frees through the stored allocator"); +} + int main() { TestAtomics(); TestSemaphoresAndFlags(); + TestEventFlagClearAndCancel(); TestSharedEventFlags(); TestThreads(); + TestConditionWakeups(); TestHeaps(); TestObjects(); TestObjectsThroughStoredAllocator(); + TestMemoryStreams(); TestTitleIdObjects(); + TestStreamHelpers(); + TestRefObjects(); + TestCommIdObjects(); TestBase64(); TestNumbers(); TestHexAndCopies(); @@ -592,6 +1148,7 @@ int main() { TestIds(); TestLanguagesAndDebugIds(); TestJsonText(); + TestJsonParser(); TestTitleIds(); std::puts("guest np common runtime: PASS"); } diff --git a/core/libs/tests/GuestNpCppWebApiIntrusivePtr.cpp b/core/libs/tests/GuestNpCppWebApiIntrusivePtr.cpp index 2d85fde51b..38dd085db7 100644 --- a/core/libs/tests/GuestNpCppWebApiIntrusivePtr.cpp +++ b/core/libs/tests/GuestNpCppWebApiIntrusivePtr.cpp @@ -209,6 +209,62 @@ static void TestSharedOwnership() { Require(_ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122RecordScoreRequestBodyEEptEv(&owner) == nullptr); } +static void TestMatchmakingSharedOwnership() { + alignas(8) unsigned char object[ObjectSize]; + std::memset(object, 0x5a, sizeof(object)); + WriteCount(object, 0, 1); + deleterCalls = 0; + deletedObject = nullptr; + + IntrusivePtr owner; + _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11Matchmaking2V123SubmitTicketRequestBodyEEC1Ev(&owner); + + owner.object = object; + owner.deleter = RecordDelete; + + IntrusivePtr argument; + _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11Matchmaking2V123SubmitTicketRequestBodyEEC1ERS7_(&argument, &owner); + + Require(_ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11Matchmaking2V123SubmitTicketRequestBodyEEptEv(&argument) == object); + Require(ReadCount(object, 0) == 2); + + _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11Matchmaking2V123SubmitTicketRequestBodyEED1Ev(&argument); + Require(ReadCount(object, 0) == 1); + Require(deleterCalls == 0); + + _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11Matchmaking2V123SubmitTicketRequestBodyEED1Ev(&owner); + Require(ReadCount(object, 0) == 0); + Require(deleterCalls == 1); + Require(deletedObject == object); + Require(_ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11Matchmaking2V123SubmitTicketRequestBodyEEptEv(&owner) == nullptr); +} + +static void TestMatchTeamVectorSize() { + int context = 0; + alignas(8) unsigned char object[ObjectSize]; + std::memset(object, 0x5a, sizeof(object)); + WriteCount(object, 0, 1); + deleterCalls = 0; + deletedObject = nullptr; + + IntrusivePtr vector; + _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V116RequestMatchTeamEEEEC1EPNS2_10LibContextE(&vector, &context); + Require(_ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V116RequestMatchTeamEEEE4sizeEv(&vector) == 0); + + IntrusivePtr filled{object, RecordDelete, &context}; + Require(_ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V116RequestMatchTeamEEEE8pushBackERKS8_(&vector, &filled) == 0); + Require(ReadCount(object, 0) == 2); + Require(_ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V116RequestMatchTeamEEEE4sizeEv(&vector) == 1); + + _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V116RequestMatchTeamEEEED1Ev(&vector); + Require(ReadCount(object, 0) == 1 && deleterCalls == 0); + + _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V116RequestMatchTeamEED1Ev(&filled); + Require(ReadCount(object, 0) == 0); + Require(deleterCalls == 1); + Require(deletedObject == object); +} + static void TestVectorPushBackReleasesElements() { int context = 0; alignas(8) unsigned char object[ObjectSize]; @@ -454,6 +510,8 @@ int main(int argc, char** argv) { for (const auto& testCase : destructors) TestDestroy(testCase); TestSharedOwnership(); + TestMatchmakingSharedOwnership(); + TestMatchTeamVectorSize(); TestVectorPushBackReleasesElements(); TestAdoptedVectorBodyDestroyedThroughDeleter(); TestUserProfileVectorAssign(); diff --git a/core/libs/tests/GuestNpCppWebApiMatchmaking.cpp b/core/libs/tests/GuestNpCppWebApiMatchmaking.cpp new file mode 100644 index 0000000000..a5a32c4aa4 --- /dev/null +++ b/core/libs/tests/GuestNpCppWebApiMatchmaking.cpp @@ -0,0 +1,153 @@ +#include "prx/libSceNpCppWebApi/include/Api.hpp" +#include "prx/libc/include/general/VabiMacros.hpp" +#include +#include +#include +#include +#include +#include + +namespace { + +void Require(bool value, std::source_location at = std::source_location::current()) { + if (!value) { + std::fprintf(stderr, "requirement failed at %s:%u\n", at.file_name(), at.line()); + std::abort(); + } +} + +constexpr int kNotSignedIn = static_cast(0x80552907); +constexpr int kParameterNotInitialized = static_cast(0x80553502); +constexpr int kInvalidArgument = static_cast(0x80553503); +constexpr int kAlreadyInitialized = static_cast(0x8055350f); +constexpr int kNotInitialized = static_cast(0x80553510); +constexpr int kBodyMissing = static_cast(0x80553512); +constexpr std::size_t kParameterSize = 0x10; +constexpr std::size_t kGuardSize = 0x10; +constexpr unsigned char kFill = 0xA5; + +struct Storage { + alignas(8) unsigned char bytes[kParameterSize + kGuardSize]; +}; + +bool GuardIntact(const Storage& storage) { + for (std::size_t index = kParameterSize; index < sizeof(storage.bytes); ++index) { + if (storage.bytes[index] != kFill) return false; + } + return true; +} + +using SimpleFn = int (APS5_VABI*)(void*); +using TextFn = int (APS5_VABI*)(void*, const char*); +using StringInitFn = int (APS5_VABI*)(void*, const std::uint64_t*, const char*); +using BodyInitFn = int (APS5_VABI*)(void*, const std::uint64_t*, const IntrusivePtr*); + +const SimpleFn kSignedOut[] = { + _ZN3sce2Np9CppWebApi11Matchmaking2V115LocationFactory6createEPNS1_6Common10LibContextEPNS5_12IntrusivePtrINS3_8LocationEEE, + _ZN3sce2Np9CppWebApi11Matchmaking2V116AttributeFactory6createEPNS1_6Common10LibContextEPKcNS3_13AttributeTypeES9_PNS5_12IntrusivePtrINS3_9AttributeEEE, + _ZN3sce2Np9CppWebApi11Matchmaking2V128PlayerForTicketCreateFactory6createEPNS1_6Common10LibContextERKmNS3_8PlatformEPNS5_12IntrusivePtrINS3_21PlayerForTicketCreateEEE, + _ZN3sce2Np9CppWebApi11Matchmaking2V130SubmitTicketRequestBodyFactory6createEPNS1_6Common10LibContextEPKcRKNS5_6VectorINS5_12IntrusivePtrINS3_21PlayerForTicketCreateEEEEEPNSB_INS3_23SubmitTicketRequestBodyEEE, + _ZN3sce2Np9CppWebApi11Matchmaking2V13Api12cancelTicketEiRKNS4_23ParameterToCancelTicketERNS1_6Common11TransactionINS8_15DefaultResponseENS8_12IntrusivePtrINS8_18ResponseHeaderBaseEEEEE, + _ZN3sce2Np9CppWebApi11Matchmaking2V13Api12submitTicketEiRKNS4_23ParameterToSubmitTicketERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_24SubmitTicketResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE, + _ZN3sce2Np9CppWebApi11Matchmaking2V13Api8getOfferEiRKNS4_19ParameterToGetOfferERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_20GetOfferResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE, + _ZN3sce2Np9CppWebApi11Matchmaking2V13Api9getTicketEiRKNS4_20ParameterToGetTicketERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_21GetTicketResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE, +}; +const SimpleFn kSetters[] = { + _ZN3sce2Np9CppWebApi11Matchmaking2V121PlayerForTicketCreate10setNatTypeERKi, + _ZN3sce2Np9CppWebApi11Matchmaking2V121PlayerForTicketCreate11setTeamNameEPKc, + _ZN3sce2Np9CppWebApi11Matchmaking2V121PlayerForTicketCreate19setPlayerAttributesERKNS1_6Common6VectorINS5_12IntrusivePtrINS3_9AttributeEEEEE, + _ZN3sce2Np9CppWebApi11Matchmaking2V123SubmitTicketRequestBody11setLocationERKNS1_6Common12IntrusivePtrINS3_8LocationEEE, + _ZN3sce2Np9CppWebApi11Matchmaking2V123SubmitTicketRequestBody19setTicketAttributesERKNS1_6Common6VectorINS5_12IntrusivePtrINS3_9AttributeEEEEE, + _ZN3sce2Np9CppWebApi11Matchmaking2V18Location16setGameSessionIdEPKc, +}; +const SimpleFn kConstructors[] = { + _ZN3sce2Np9CppWebApi11Matchmaking2V13Api19ParameterToGetOfferC1Ev, + _ZN3sce2Np9CppWebApi11Matchmaking2V13Api20ParameterToGetTicketC1Ev, + _ZN3sce2Np9CppWebApi11Matchmaking2V13Api23ParameterToCancelTicketC1Ev, + _ZN3sce2Np9CppWebApi11Matchmaking2V13Api23ParameterToSubmitTicketC1Ev, +}; +const SimpleFn kDestructors[] = { + _ZN3sce2Np9CppWebApi11Matchmaking2V13Api19ParameterToGetOfferD1Ev, + _ZN3sce2Np9CppWebApi11Matchmaking2V13Api20ParameterToGetTicketD1Ev, + _ZN3sce2Np9CppWebApi11Matchmaking2V13Api23ParameterToCancelTicketD1Ev, + _ZN3sce2Np9CppWebApi11Matchmaking2V13Api23ParameterToSubmitTicketD1Ev, +}; +const SimpleFn kTerminators[] = { + _ZN3sce2Np9CppWebApi11Matchmaking2V13Api19ParameterToGetOffer9terminateEv, + _ZN3sce2Np9CppWebApi11Matchmaking2V13Api20ParameterToGetTicket9terminateEv, + _ZN3sce2Np9CppWebApi11Matchmaking2V13Api23ParameterToCancelTicket9terminateEv, + _ZN3sce2Np9CppWebApi11Matchmaking2V13Api23ParameterToSubmitTicket9terminateEv, +}; +const StringInitFn kStringInitializers[] = { + _ZN3sce2Np9CppWebApi11Matchmaking2V13Api19ParameterToGetOffer10initializeEPNS1_6Common10LibContextEPKc, + _ZN3sce2Np9CppWebApi11Matchmaking2V13Api20ParameterToGetTicket10initializeEPNS1_6Common10LibContextEPKc, + _ZN3sce2Np9CppWebApi11Matchmaking2V13Api23ParameterToCancelTicket10initializeEPNS1_6Common10LibContextEPKc, +}; +const BodyInitFn kBodyInitializer = _ZN3sce2Np9CppWebApi11Matchmaking2V13Api23ParameterToSubmitTicket10initializeEPNS1_6Common10LibContextENS6_12IntrusivePtrINS3_23SubmitTicketRequestBodyEEE; +const TextFn kSetView = _ZN3sce2Np9CppWebApi11Matchmaking2V13Api20ParameterToGetTicket7setviewEPKc; + +} + +int main() { + for (const auto fn : kSignedOut) Require(fn(nullptr) == kNotSignedIn); + for (const auto fn : kSetters) Require(fn(nullptr) == 0); + + for (const auto fn : kConstructors) { + Storage storage; + std::memset(storage.bytes, kFill, sizeof(storage.bytes)); + Require(fn(storage.bytes) == 0); + Require(GuardIntact(storage)); + } + for (const auto fn : kDestructors) { + Storage storage; + std::memset(storage.bytes, kFill, sizeof(storage.bytes)); + Require(fn(storage.bytes) == 0); + Require(GuardIntact(storage)); + } + for (const auto fn : kTerminators) { + Storage storage; + std::memset(storage.bytes, 0, sizeof(storage.bytes)); + Require(fn(storage.bytes) == kNotInitialized); + } + for (std::size_t index = 0; index < sizeof(kStringInitializers) / sizeof(kStringInitializers[0]); ++index) { + Storage storage; + std::memset(storage.bytes, kFill, sizeof(storage.bytes)); + std::memset(storage.bytes, 0, kParameterSize); + std::uint64_t context = 1; + Require(kStringInitializers[index](storage.bytes, &context, nullptr) == kInvalidArgument); + Require(kStringInitializers[index](storage.bytes, &context, "id") == 0); + Require(kStringInitializers[index](storage.bytes, &context, "id") == kAlreadyInitialized); + Require(kTerminators[index](storage.bytes) == 0); + Require(kTerminators[index](storage.bytes) == kNotInitialized); + Require(GuardIntact(storage)); + } + { + Storage storage; + std::memset(storage.bytes, kFill, sizeof(storage.bytes)); + std::memset(storage.bytes, 0, kParameterSize); + std::uint64_t context = 1; + IntrusivePtr empty{}; + Require(kBodyInitializer(storage.bytes, &context, &empty) == kBodyMissing); + IntrusivePtr body{}; + body.object = storage.bytes; + Require(kBodyInitializer(storage.bytes, &context, &body) == 0); + Require(kBodyInitializer(storage.bytes, &context, &body) == kAlreadyInitialized); + Require(kTerminators[3](storage.bytes) == 0); + Require(kTerminators[3](storage.bytes) == kNotInitialized); + Require(GuardIntact(storage)); + } + { + Storage storage; + std::memset(storage.bytes, kFill, sizeof(storage.bytes)); + std::memset(storage.bytes, 0, kParameterSize); + std::uint64_t context = 1; + Require(kSetView(storage.bytes, "view") == kParameterNotInitialized); + Require(kStringInitializers[1](storage.bytes, &context, "id") == 0); + Require(kSetView(storage.bytes, "view") == 0); + Require(kSetView(storage.bytes, nullptr) == kInvalidArgument); + Require(kTerminators[1](storage.bytes) == 0); + Require(kSetView(storage.bytes, "view") == kParameterNotInitialized); + Require(GuardIntact(storage)); + } + return 0; +} diff --git a/core/libs/tests/GuestNpCppWebApiSignedOut.cpp b/core/libs/tests/GuestNpCppWebApiSignedOut.cpp index e03db6fa29..5d7ea3cf4f 100644 --- a/core/libs/tests/GuestNpCppWebApiSignedOut.cpp +++ b/core/libs/tests/GuestNpCppWebApiSignedOut.cpp @@ -50,6 +50,10 @@ static int InitializeCommunicationRestrictionStatus(void* parameter, std::uint64 return _ZN3sce2Np9CppWebApi30CommunicationRestrictionStatus2V333CommunicationRestrictionStatusApi44ParameterToGetCommunicationRestrictionStatus10initializeEPNS1_6Common10LibContextEm(parameter, context, 1); } +static int InitializeGetGameSessions(void* parameter, std::uint64_t* context) { + return _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi26ParameterToGetGameSessions10initializeEPNS1_6Common10LibContextEPKc(parameter, context, "me"); +} + static const RequestFlow flows[] = { { _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V118GetFriendsResponseEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev, @@ -121,6 +125,20 @@ static const RequestFlow flows[] = { _ZN3sce2Np9CppWebApi30CommunicationRestrictionStatus2V333CommunicationRestrictionStatusApi44ParameterToGetCommunicationRestrictionStatus9terminateEv, _ZN3sce2Np9CppWebApi30CommunicationRestrictionStatus2V333CommunicationRestrictionStatusApi33getCommunicationRestrictionStatusEiRKNS4_44ParameterToGetCommunicationRestrictionStatusERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_38CommunicationRestrictionStatusResponseEEENSA_INS8_18ResponseHeaderBaseEEEEE, }, + { + _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V127GetGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev, + _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V127GetGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev, + _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V127GetGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_, + _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V127GetGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption, + _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V127GetGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE, + _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V127GetGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv, + _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V127GetGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_, + _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi26ParameterToGetGameSessionsC1Ev, + _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi26ParameterToGetGameSessionsD1Ev, + InitializeGetGameSessions, + _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi26ParameterToGetGameSessions9terminateEv, + _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi15getGameSessionsEiRKNS4_26ParameterToGetGameSessionsERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_27GetGameSessionsResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE, + }, }; using Lifecycle = void (APS5_VABI*)(void*); diff --git a/core/libs/tests/GuestNpCppWebApiTitleCloudStorage.cpp b/core/libs/tests/GuestNpCppWebApiTitleCloudStorage.cpp new file mode 100644 index 0000000000..da9a621cb3 --- /dev/null +++ b/core/libs/tests/GuestNpCppWebApiTitleCloudStorage.cpp @@ -0,0 +1,191 @@ +#include "prx/libSceNpCppWebApi/include/Api.hpp" +#include "prx/libc/include/general/VabiMacros.hpp" +#include +#include +#include +#include +#include +#include + +namespace { + +void Require(bool value, std::source_location at = std::source_location::current()) { + if (!value) { + std::fprintf(stderr, "requirement failed at %s:%u\n", at.file_name(), at.line()); + std::abort(); + } +} + +constexpr int kNotSignedIn = static_cast(0x80552907); +constexpr int kParameterNotInitialized = static_cast(0x80553502); +constexpr int kInvalidArgument = static_cast(0x80553503); +constexpr int kAlreadyInitialized = static_cast(0x8055350f); +constexpr int kTerminatedUninitialized = static_cast(0x80553510); +constexpr int kBodyMissing = static_cast(0x80553512); +constexpr std::size_t kParameterSize = 0x10; +constexpr std::size_t kGuardSize = 0x10; +constexpr unsigned char kFill = 0xA5; + +struct Storage { + alignas(8) unsigned char bytes[kParameterSize + kGuardSize]; +}; + +bool GuardIntact(const Storage& storage) { + for (std::size_t index = kParameterSize; index < sizeof(storage.bytes); ++index) { + if (storage.bytes[index] != kFill) return false; + } + return true; +} + +void APS5_VABI NoopDelete(void*) {} + +using SimpleFn = int (APS5_VABI*)(void*); +using TextFn = int (APS5_VABI*)(void*, const char*); +using DataFn = int (APS5_VABI*)(void*, const void*, std::size_t); + +const SimpleFn kSignedOut[] = { + _ZN3sce2Np9CppWebApi17TitleCloudStorage2V129SetDataInfoRequestBodyFactory6createEPNS1_6Common10LibContextEPvmPNS5_12IntrusivePtrINS3_22SetDataInfoRequestBodyEEE, + _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi10uploadDataEiRKNS4_21ParameterToUploadDataERNS1_6Common19UpStreamTransactionINS8_12IntrusivePtrINS3_22UploadDataResponseBodyEEENSA_INS4_25UploadDataResponseHeadersEEEEE, + _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi10uploadDataEiRKNS4_42ParameterWithBinaryRequestBodyToUploadDataERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_22UploadDataResponseBodyEEENSA_INS4_25UploadDataResponseHeadersEEEEE, + _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi11setDataInfoEiRKNS4_22ParameterToSetDataInfoERNS1_6Common11TransactionINS8_15DefaultResponseENS8_12IntrusivePtrINS4_26SetDataInfoResponseHeadersEEEEE, + _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi12downloadDataEiRKNS4_23ParameterToDownloadDataERNS1_6Common11TransactionINS8_12IntrusivePtrINS8_6BinaryEEENSA_INS4_27DownloadDataResponseHeadersEEEEE, + _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi21deleteMultiDataByUserEiRKNS4_32ParameterToDeleteMultiDataByUserERNS1_6Common11TransactionINS8_15DefaultResponseENS8_12IntrusivePtrINS8_18ResponseHeaderBaseEEEEE, +}; +const SimpleFn kNumericSetters[] = { + _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi21ParameterToUploadData21setxPsnNpServiceLabelEj, + _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi21ParameterToUploadData22setxPsnAtomicOperationENS5_19XPsnAtomicOperationE, + _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi22ParameterToSetDataInfo22setxPsnAtomicOperationENS5_19XPsnAtomicOperationE, + _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi23ParameterToDownloadData17setnpServiceLabelEj, + _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi32ParameterToDeleteMultiDataByUser17setnpServiceLabelEj, + _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi37ParameterToGetMultiDataStatusesByUser17setnpServiceLabelEj, +}; +const TextFn kTextSetters[] = { + _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi22ParameterToSetDataInfo24setxPsnAtomicOperationIdEPKc, +}; +const DataFn kDataSetters[] = { + _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi42ParameterWithBinaryRequestBodyToUploadData14setRequestBodyEPKhm, +}; +const SimpleFn kConstructors[] = { + _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi21ParameterToUploadDataC1Ev, + _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi22ParameterToSetDataInfoC1Ev, + _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi32ParameterToDeleteMultiDataByUserC1Ev, + _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi42ParameterWithBinaryRequestBodyToUploadDataC1Ev, +}; +const SimpleFn kDestructors[] = { + _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi21ParameterToUploadDataD1Ev, + _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi22ParameterToSetDataInfoD1Ev, + _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi32ParameterToDeleteMultiDataByUserD1Ev, + _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi42ParameterWithBinaryRequestBodyToUploadDataD1Ev, +}; +const SimpleFn kTerminators[] = { + _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi21ParameterToUploadData9terminateEv, + _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi22ParameterToSetDataInfo9terminateEv, + _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi32ParameterToDeleteMultiDataByUser9terminateEv, + _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi42ParameterWithBinaryRequestBodyToUploadData9terminateEv, +}; + +bool Constructed(SimpleFn constructor) { + Storage storage; + std::memset(storage.bytes, kFill, sizeof(storage.bytes)); + if (constructor(storage.bytes) != 0) return false; + if (!GuardIntact(storage)) return false; + for (std::size_t index = 0; index < kParameterSize; ++index) { + if (storage.bytes[index] != 0) return false; + } + return true; +} + +void TestInitializers() { + const std::uint64_t uninitialized = 0; + std::uint64_t context = 1; + + { + Storage parameter; + std::memset(parameter.bytes, kFill, sizeof(parameter.bytes)); + Require(kConstructors[0](parameter.bytes) == 0 && GuardIntact(parameter)); + Require(_ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi21ParameterToUploadData10initializeEPNS1_6Common10LibContextEPKci(parameter.bytes, nullptr, "label", 0) == kInvalidArgument); + Require(_ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi21ParameterToUploadData10initializeEPNS1_6Common10LibContextEPKci(parameter.bytes, &uninitialized, "label", 0) == kParameterNotInitialized); + Require(_ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi21ParameterToUploadData10initializeEPNS1_6Common10LibContextEPKci(parameter.bytes, &context, nullptr, 0) == kInvalidArgument); + Require(_ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi21ParameterToUploadData10initializeEPNS1_6Common10LibContextEPKci(parameter.bytes, &context, "label", 0) == 0); + Require(_ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi21ParameterToUploadData10initializeEPNS1_6Common10LibContextEPKci(parameter.bytes, &context, "label", 0) == kAlreadyInitialized); + Require(kTerminators[0](parameter.bytes) == 0); + Require(kTerminators[0](parameter.bytes) == kTerminatedUninitialized); + Require(kDestructors[0](parameter.bytes) == 0 && GuardIntact(parameter)); + } + { + Storage parameter; + std::memset(parameter.bytes, kFill, sizeof(parameter.bytes)); + Require(kConstructors[1](parameter.bytes) == 0 && GuardIntact(parameter)); + IntrusivePtr missing{}; + IntrusivePtr body{parameter.bytes, NoopDelete, nullptr}; + Require(_ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi22ParameterToSetDataInfo10initializeEPNS1_6Common10LibContextEPKciNS6_12IntrusivePtrINS3_22SetDataInfoRequestBodyEEE(parameter.bytes, &context, "label", 0, &missing) == kBodyMissing); + Require(_ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi22ParameterToSetDataInfo10initializeEPNS1_6Common10LibContextEPKciNS6_12IntrusivePtrINS3_22SetDataInfoRequestBodyEEE(parameter.bytes, &context, "label", 0, &body) == 0); + Require(kTerminators[1](parameter.bytes) == 0); + Require(kDestructors[1](parameter.bytes) == 0 && GuardIntact(parameter)); + } + { + Storage parameter; + std::memset(parameter.bytes, kFill, sizeof(parameter.bytes)); + Require(kConstructors[2](parameter.bytes) == 0 && GuardIntact(parameter)); + Require(_ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi32ParameterToDeleteMultiDataByUser10initializeEPNS1_6Common10LibContextEPKcSA_(parameter.bytes, &context, "slot", nullptr) == kInvalidArgument); + Require(_ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi32ParameterToDeleteMultiDataByUser10initializeEPNS1_6Common10LibContextEPKcSA_(parameter.bytes, &context, "slot", "me") == 0); + Require(kTerminators[2](parameter.bytes) == 0); + Require(kDestructors[2](parameter.bytes) == 0 && GuardIntact(parameter)); + } + { + Storage parameter; + std::memset(parameter.bytes, kFill, sizeof(parameter.bytes)); + Require(kConstructors[3](parameter.bytes) == 0 && GuardIntact(parameter)); + Require(_ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi42ParameterWithBinaryRequestBodyToUploadData10initializeEPNS1_6Common10LibContextEPKci(parameter.bytes, &context, nullptr, 0) == kInvalidArgument); + Require(_ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi42ParameterWithBinaryRequestBodyToUploadData10initializeEPNS1_6Common10LibContextEPKci(parameter.bytes, &context, "slot", 0) == 0); + Require(kTerminators[3](parameter.bytes) == 0); + Require(kDestructors[3](parameter.bytes) == 0 && GuardIntact(parameter)); + } +} + +void TestSetters() { + for (const auto setter : kNumericSetters) Require(setter(nullptr) == 0); + Storage parameter; + std::memset(parameter.bytes, kFill, sizeof(parameter.bytes)); + Require(kConstructors[1](parameter.bytes) == 0); + for (const auto setter : kTextSetters) Require(setter(parameter.bytes, "id") == kParameterNotInitialized); + std::uint64_t context = 1; + IntrusivePtr missing{}; + Require(_ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi22ParameterToSetDataInfo10initializeEPNS1_6Common10LibContextEPKciNS6_12IntrusivePtrINS3_22SetDataInfoRequestBodyEEE(parameter.bytes, &context, "label", 0, &missing) == kBodyMissing); + IntrusivePtr body{parameter.bytes, NoopDelete, nullptr}; + Require(_ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi22ParameterToSetDataInfo10initializeEPNS1_6Common10LibContextEPKciNS6_12IntrusivePtrINS3_22SetDataInfoRequestBodyEEE(parameter.bytes, &context, "label", 0, &body) == 0); + Require(kTextSetters[0](parameter.bytes, nullptr) == kInvalidArgument); + Require(kTextSetters[0](parameter.bytes, "id") == 0); + Require(kTerminators[1](parameter.bytes) == 0); + + Storage binary; + std::memset(binary.bytes, kFill, sizeof(binary.bytes)); + Require(kConstructors[3](binary.bytes) == 0); + for (const auto setter : kDataSetters) Require(setter(binary.bytes, nullptr, 0) == kParameterNotInitialized); + Require(_ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi42ParameterWithBinaryRequestBodyToUploadData10initializeEPNS1_6Common10LibContextEPKci(binary.bytes, &context, "slot", 0) == 0); + Require(kDataSetters[0](binary.bytes, nullptr, 1) == kInvalidArgument); + const unsigned char data[] = {1, 2, 3}; + Require(kDataSetters[0](binary.bytes, data, sizeof(data)) == 0); + Require(kTerminators[3](binary.bytes) == 0); +} + +} + +int main() { + for (const auto fn : kSignedOut) Require(fn(nullptr) == kNotSignedIn); + for (const auto constructor : kConstructors) Require(Constructed(constructor)); + for (const auto destructor : kDestructors) { + Storage storage; + std::memset(storage.bytes, kFill, sizeof(storage.bytes)); + Require(destructor(storage.bytes) == 0); + Require(GuardIntact(storage)); + } + for (const auto terminator : kTerminators) { + Storage storage; + std::memset(storage.bytes, 0, sizeof(storage.bytes)); + Require(terminator(storage.bytes) == kTerminatedUninitialized); + } + TestInitializers(); + TestSetters(); + return 0; +} diff --git a/core/libs/tests/GuestNpFriendListDialog.cpp b/core/libs/tests/GuestNpFriendListDialog.cpp index 897d26ebe2..b71297ccdc 100644 --- a/core/libs/tests/GuestNpFriendListDialog.cpp +++ b/core/libs/tests/GuestNpFriendListDialog.cpp @@ -1,5 +1,7 @@ #include "prx/libSceNpFriendListDialog/include/Api.hpp" #include "prx/libc/include/general/VabiMacros.hpp" +#include "prx/libSceIme/include/ModalDialog.hpp" +#include "prx/libSceIme/include/PsnDialogNotice.hpp" #include #include @@ -16,6 +18,35 @@ constexpr int kErrNotFinished = static_cast(0x80B80005); constexpr int kErrArgNull = static_cast(0x80B8000D); constexpr int kResultUserCanceled = 1; +bool PsnNoticeShown() { + ModalDialogView view; + if (!ModalDialogReadView_nid_postfix(view)) return false; + return view.message == PsnDialogNoticeRequest(PsnDialogNoticeKind::PsnFeature).message; +} + +void RequireNotices() { + std::uint64_t param = 0; + ModalDialogSetPresenter_nid_postfix(true); + Require(sceNpFriendListDialogInitialize() == 0); + + PsnDialogNoticeSetMode_nid_postfix(PsnDialogNoticeMode::Silent); + ModalDialogReset_nid_postfix(ModalDialogAnyOwner); + Require(sceNpFriendListDialogOpenA(¶m) == 0); + Require(!PsnNoticeShown() && !ModalDialogCapturesInput_nid_postfix()); + + PsnDialogNoticeSetMode_nid_postfix(PsnDialogNoticeMode::Show); + ModalDialogReset_nid_postfix(ModalDialogAnyOwner); + Require(sceNpFriendListDialogOpenA(nullptr) == kErrArgNull); + Require(!PsnNoticeShown()); + Require(sceNpFriendListDialogOpenA(¶m) == 0); + Require(PsnNoticeShown()); + + ModalDialogReset_nid_postfix(ModalDialogAnyOwner); + ModalDialogSetPresenter_nid_postfix(false); + PsnDialogNoticeSetMode_nid_postfix(PsnDialogNoticeMode::Silent); + Require(sceNpFriendListDialogTerminate() == 0); +} + } int main() { @@ -75,4 +106,5 @@ int main() { Require(sceNpFriendListDialogGetResultA(result) == kErrNotInitialized); Require(sceNpFriendListDialogGetStatus() == kStatusNone); Require(sceNpFriendListDialogUpdateStatus() == kStatusNone); + RequireNotices(); } diff --git a/core/libs/tests/GuestNpParty.cpp b/core/libs/tests/GuestNpParty.cpp index 2ee253c2b5..80d5022a1d 100644 --- a/core/libs/tests/GuestNpParty.cpp +++ b/core/libs/tests/GuestNpParty.cpp @@ -17,10 +17,27 @@ bool check(bool value, const char* message) { return value; } +bool uninitializedTests() { + std::uint16_t state = 0xa5a5; + std::uint8_t out[64]; + std::memset(out, 0xa5, sizeof(out)); + bool ok = check(sceNpPartyGetState(&state) == kNotInitialized && sceNpPartyGetState(nullptr) == kNotInitialized, "get state before initialize did not fail") + && check(sceNpPartyGetStateAsUserA(1, &state) == kNotInitialized && sceNpPartyGetStateAsUserA(-1, nullptr) == kNotInitialized, "get user state before initialize did not fail") + && check(state == 0xa5a5, "a state was written before initialize") + && check(sceNpPartyGetId(out) == kNotInitialized && sceNpPartyGetId(nullptr) == kNotInitialized, "get id before initialize did not fail") + && check(sceNpPartyGetMembers(out) == kNotInitialized && sceNpPartyGetMembersA(out) == kNotInitialized, "get members before initialize did not fail") + && check(sceNpPartyGetMemberInfo(1, out) == kNotInitialized && sceNpPartyGetMemberInfoA(1, nullptr) == kNotInitialized, "get member info before initialize did not fail") + && check(sceNpPartyGetMemberSessionInfo(1, out) == kNotInitialized && sceNpPartyGetMemberVoiceInfo(1, 2, out) == kNotInitialized, "get session or voice info before initialize did not fail") + && check(sceNpPartySendBinaryMessage(out) == kNotInitialized && sceNpPartySendBinaryMessage(nullptr) == kNotInitialized, "send before initialize did not fail"); + for (std::uint8_t byte : out) ok = ok && check(byte == 0xa5, "a call before initialize wrote its output"); + return ok; +} + bool stateTests() { std::uint16_t states[3]; std::memset(states, 0xa5, sizeof(states)); - return check(sceNpPartyGetState(nullptr) == kInvalidArgument, "a null state was not refused with INVALID_ARGUMENT") + return check(sceNpPartyGetStateAsUserA(-1, &states[1]) == kInvalidArgument && states[1] == 0xa5a5, "user -1 was not refused with INVALID_ARGUMENT") + && check(sceNpPartyGetState(nullptr) == kInvalidArgument, "a null state was not refused with INVALID_ARGUMENT") && check(sceNpPartyGetState(&states[1]) == 0 && states[1] == 2, "the state is not NOT_IN_PARTY") && check(states[0] == 0xa5a5 && states[2] == 0xa5a5, "sceNpPartyGetState wrote past its 16-bit state") && check(sceNpPartyGetStateAsUserA(1, nullptr) == kInvalidArgument, "a null user state was not refused with INVALID_ARGUMENT") @@ -75,7 +92,11 @@ bool notInPartyTests() { } int main() { - if (!stateTests() || !lifecycleTests() || !notInPartyTests()) return 1; + std::uint64_t param[4] = {}; + if (!uninitializedTests() || !lifecycleTests()) return 1; + if (!check(sceNpPartyInitialize(param) == 0, "initialize for the state checks failed")) return 1; + if (!stateTests() || !notInPartyTests()) return 1; + if (!check(sceNpPartyTerminate() == 0, "terminate after the state checks failed") || !uninitializedTests()) return 1; std::puts("NpParty tests passed"); return 0; } diff --git a/core/libs/tests/GuestNpProfileDialog.cpp b/core/libs/tests/GuestNpProfileDialog.cpp index 0295a28ba9..49ba4eb805 100644 --- a/core/libs/tests/GuestNpProfileDialog.cpp +++ b/core/libs/tests/GuestNpProfileDialog.cpp @@ -1,4 +1,6 @@ #include "prx/libSceNpProfileDialog/include/Api.hpp" +#include "prx/libSceIme/include/ModalDialog.hpp" +#include "prx/libSceIme/include/PsnDialogNotice.hpp" #include "prx/libc/include/general/VabiMacros.hpp" #include #include @@ -67,6 +69,56 @@ void RequireCanceled(const std::uint8_t* result, void* userData) { for (std::size_t i = kResultSize; i < kResultSize + 16; ++i) Require(result[i] == kSentinel); } +bool PsnNoticeShown() { + ModalDialogView view; + if (!ModalDialogReadView_nid_postfix(view)) return false; + return view.message == PsnDialogNoticeRequest(PsnDialogNoticeKind::PsnFeature).message; +} + +void RequireNotices(std::uint8_t* param, std::uint8_t* paramA) { + ModalDialogSetPresenter_nid_postfix(true); + Require(sceNpProfileDialogInitialize() == 0); + + PsnDialogNoticeSetMode_nid_postfix(PsnDialogNoticeMode::Silent); + ModalDialogReset_nid_postfix(ModalDialogAnyOwner); + Require(sceNpProfileDialogOpen(reinterpret_cast(param)) == 0); + Require(!PsnNoticeShown() && !ModalDialogCapturesInput_nid_postfix()); + Require(sceNpProfileDialogGetStatus() == kStatusFinished); + + PsnDialogNoticeSetMode_nid_postfix(PsnDialogNoticeMode::Show); + ModalDialogReset_nid_postfix(ModalDialogAnyOwner); + Require(sceNpProfileDialogOpen(reinterpret_cast(param)) == 0); + Require(PsnNoticeShown()); + Require(sceNpProfileDialogGetStatus() == kStatusFinished); + + PsnDialogNoticeSetMode_nid_postfix(PsnDialogNoticeMode::Show); + ModalDialogReset_nid_postfix(ModalDialogAnyOwner); + Require(sceNpProfileDialogOpenA(reinterpret_cast(paramA)) == 0); + Require(PsnNoticeShown()); + + PsnDialogNoticeSetMode_nid_postfix(PsnDialogNoticeMode::Show); + ModalDialogReset_nid_postfix(ModalDialogAnyOwner); + Require(sceNpProfileDialogOpen(nullptr) == kErrArgNull); + Require(!PsnNoticeShown()); + + Store(param, 56, 9); + PsnDialogNoticeSetMode_nid_postfix(PsnDialogNoticeMode::Show); + ModalDialogReset_nid_postfix(ModalDialogAnyOwner); + RequireThrows([&] { sceNpProfileDialogOpen(reinterpret_cast(param)); }); + Require(!PsnNoticeShown()); + Store(param, 56, 1); + + ModalDialogSetPresenter_nid_postfix(false); + PsnDialogNoticeSetMode_nid_postfix(PsnDialogNoticeMode::Show); + ModalDialogReset_nid_postfix(ModalDialogAnyOwner); + Require(sceNpProfileDialogOpen(reinterpret_cast(param)) == 0); + Require(!PsnNoticeShown() && !ModalDialogCapturesInput_nid_postfix()); + + PsnDialogNoticeSetMode_nid_postfix(PsnDialogNoticeMode::Silent); + ModalDialogReset_nid_postfix(ModalDialogAnyOwner); + Require(sceNpProfileDialogTerminate() == 0); +} + } int main() { @@ -164,5 +216,6 @@ int main() { Require(sceNpProfileDialogGetResult(nullptr) == kErrNotInitialized); Require(sceNpProfileDialogGetStatus() == kStatusNone); Require(sceNpProfileDialogUpdateStatus() == kStatusNone); + RequireNotices(param, paramA); return 0; } diff --git a/core/libs/tests/GuestNpSessionSignaling.cpp b/core/libs/tests/GuestNpSessionSignaling.cpp index d69593f7e5..cd5d5c0943 100644 --- a/core/libs/tests/GuestNpSessionSignaling.cpp +++ b/core/libs/tests/GuestNpSessionSignaling.cpp @@ -160,4 +160,5 @@ int main() { Require(sceNpSessionSignalingInitialize(reinterpret_cast(initializeParam)) == 0, "reinitialize"); Require(sceNpSessionSignalingRequestPrepare(contextId, &requestId) == ContextNotFound, "reinitialize retained a context"); Require(sceNpSessionSignalingTerminate() == 0, "final terminate"); + Require(sceNpSessionSignalingCreateContext(reinterpret_cast(1), &contextId) == NotInitialized, "create context post-terminate"); } diff --git a/core/libs/tests/GuestNpSnsFacebookDialog.cpp b/core/libs/tests/GuestNpSnsFacebookDialog.cpp index 507569039f..ce6f93b7d2 100644 --- a/core/libs/tests/GuestNpSnsFacebookDialog.cpp +++ b/core/libs/tests/GuestNpSnsFacebookDialog.cpp @@ -1,5 +1,7 @@ #include "prx/libSceNpSnsFacebookDialog/include/Api.hpp" #include "prx/libc/include/general/VabiMacros.hpp" +#include "prx/libSceIme/include/ModalDialog.hpp" +#include "prx/libSceIme/include/PsnDialogNotice.hpp" #include #include @@ -16,6 +18,36 @@ constexpr int kErrNotFinished = static_cast(0x80B80005); constexpr int kErrArgNull = static_cast(0x80B8000D); constexpr int kResultUserCanceled = 1; + +bool PsnNoticeShown() { + ModalDialogView view; + if (!ModalDialogReadView_nid_postfix(view)) return false; + return view.message == PsnDialogNoticeRequest(PsnDialogNoticeKind::PsnFeature).message; +} + +void RequireNotices() { + std::uint64_t param = 0; + ModalDialogSetPresenter_nid_postfix(true); + Require(sceNpSnsFacebookDialogInitialize() == 0); + + PsnDialogNoticeSetMode_nid_postfix(PsnDialogNoticeMode::Silent); + ModalDialogReset_nid_postfix(ModalDialogAnyOwner); + Require(sceNpSnsFacebookDialogOpen(¶m) == 0); + Require(!PsnNoticeShown() && !ModalDialogCapturesInput_nid_postfix()); + + PsnDialogNoticeSetMode_nid_postfix(PsnDialogNoticeMode::Show); + ModalDialogReset_nid_postfix(ModalDialogAnyOwner); + Require(sceNpSnsFacebookDialogOpen(nullptr) == kErrArgNull); + Require(!PsnNoticeShown()); + Require(sceNpSnsFacebookDialogOpen(¶m) == 0); + Require(PsnNoticeShown()); + + ModalDialogReset_nid_postfix(ModalDialogAnyOwner); + ModalDialogSetPresenter_nid_postfix(false); + PsnDialogNoticeSetMode_nid_postfix(PsnDialogNoticeMode::Silent); + Require(sceNpSnsFacebookDialogTerminate() == 0); +} + } int main() { @@ -75,4 +107,5 @@ int main() { Require(sceNpSnsFacebookDialogGetResult(result) == kErrNotInitialized); Require(sceNpSnsFacebookDialogGetStatus() == kStatusNone); Require(sceNpSnsFacebookDialogUpdateStatus() == kStatusNone); + RequireNotices(); } diff --git a/core/libs/tests/GuestNpTrophyStats.cpp b/core/libs/tests/GuestNpTrophyStats.cpp index 35511ae5b6..6fb19c20e1 100644 --- a/core/libs/tests/GuestNpTrophyStats.cpp +++ b/core/libs/tests/GuestNpTrophyStats.cpp @@ -3,6 +3,7 @@ #include "prx/libc/include/general/VabiMacros.hpp" #include "prx/libSceNpTrophy2/include/NpTrophy2Types.hpp" #include "prx/libSceNpTrophy2/include/TrophyStore.hpp" +#include "tests/TemporaryFile.hpp" #include #include @@ -128,7 +129,7 @@ class StderrCapture { public: StderrCapture() { std::fflush(stderr); - file = std::tmpfile(); + file = TemporaryFile::Open(); Require(file != nullptr, "cannot open a temporary file for stderr"); #ifdef _WIN32 saved = _dup(_fileno(stderr)); diff --git a/core/libs/tests/GuestNpTus.cpp b/core/libs/tests/GuestNpTus.cpp index b80d87fa8b..a644360031 100644 --- a/core/libs/tests/GuestNpTus.cpp +++ b/core/libs/tests/GuestNpTus.cpp @@ -49,6 +49,31 @@ static void CheckTssTitleContexts() { for (const int context : contexts) Require(sceNpTusDeleteNpTitleCtx(context) == 0); } +static void CheckNpIdTitleContexts() { + NpId npId{}; + Require(sceNpTusCreateNpTitleCtx(0, nullptr) == INSUFFICIENT_ARGUMENT); + Require(sceNpTusCreateNpTitleCtx(0xFFFFFFFFu, nullptr) == INSUFFICIENT_ARGUMENT); + Require(sceNpTusCreateNpTitleCtx(0xFFFFFFFFu, &npId) == INVALID_ARGUMENT); + + const int single = sceNpTusCreateNpTitleCtx(0, &npId); + Require(single > 0); + const int request = sceNpTusCreateRequest(single); + Require(request > 0); + Require(sceNpTusDeleteNpTitleCtx(single) == 0); + Require(sceNpTusDeleteRequest(request) == INVALID_ID); + + std::array contexts{}; + for (std::size_t index = 0; index < contexts.size(); ++index) { + contexts[index] = index % 2 == 0 ? sceNpTusCreateNpTitleCtx(static_cast(index), &npId) : sceNpTusCreateNpTitleCtxA(0, 1); + Require(contexts[index] > 0); + } + Require(sceNpTusCreateNpTitleCtx(0, &npId) == TOO_MANY_OBJECTS); + Require(sceNpTssCreateNpTitleCtx(0, &npId) == TOO_MANY_OBJECTS); + Require(sceNpTusCreateNpTitleCtx(0, nullptr) == INSUFFICIENT_ARGUMENT); + Require(sceNpTusCreateNpTitleCtx(0xFFFFFFFFu, &npId) == INVALID_ARGUMENT); + for (const int context : contexts) Require(sceNpTusDeleteNpTitleCtx(context) == 0); +} + static void CheckMultiSlotVariables() { const int context = sceNpTusCreateNpTitleCtxA(0, 1); Require(context > 0); @@ -270,4 +295,5 @@ int main() { for (const int child : children) Require(sceNpTusPollAsync(child, &result) == INVALID_ID); for (std::size_t index = 1; index < contexts.size(); ++index) Require(sceNpTusDeleteNpTitleCtx(contexts[index]) == 0); CheckTssTitleContexts(); + CheckNpIdTitleContexts(); } diff --git a/core/libs/tests/GuestNpWebApi.cpp b/core/libs/tests/GuestNpWebApi.cpp index 75b78e28ab..1f6122817c 100644 --- a/core/libs/tests/GuestNpWebApi.cpp +++ b/core/libs/tests/GuestNpWebApi.cpp @@ -2,11 +2,13 @@ #include "prx/libSceNpWebApi/include/Api.hpp" #include "prx/libc/include/general/VabiMacros.hpp" #include +#include #include #include #include #include #include +#include namespace { @@ -242,6 +244,143 @@ void TestOlderSdks() { Require(sceNpWebApiTerminate(context) == 0, "terminate the older SDK library context"); } +void TestHandleOperations() { + const int context = sceNpWebApiInitialize(1, 0x10000); + const int other = sceNpWebApiInitialize(1, 0x10000); + const int handle = sceNpWebApiCreateHandle(context); + Require(context > 0 && other > 0 && handle > 0, "library contexts and handle for handle operations"); + + Require(sceNpWebApiAbortHandle(0x8000, handle) == LibContextNotFound, "abort a handle of an unknown context"); + Require(sceNpWebApiAbortHandle(other, handle) == HandleNotFound, "abort a handle through another context"); + Require(sceNpWebApiAbortHandle(context, handle) == 0, "abort the handle"); + Require(sceNpWebApiAbortHandle(context, handle) == 0, "abort the handle twice"); + Require(sceNpWebApiSetHandleTimeout(0x8000, handle, 1000) == LibContextNotFound, "handle timeout of an unknown context"); + Require(sceNpWebApiSetHandleTimeout(other, handle, 1000) == HandleNotFound, "handle timeout through another context"); + Require(sceNpWebApiSetHandleTimeout(context, handle, 1000) == 0, "set the handle timeout"); + Require(sceNpWebApiSetHandleTimeout(context, handle, 0) == 0, "clear the handle timeout"); + Require(sceNpWebApiDeleteHandle(context, handle) == 0, "delete the aborted handle"); + Require(sceNpWebApiAbortHandle(context, handle) == HandleNotFound, "abort a deleted handle"); + Require(sceNpWebApiSetHandleTimeout(context, handle, 1000) == HandleNotFound, "timeout of a deleted handle"); + + SetSdkVersion(0x02500000); + const int older = sceNpWebApiCreateHandle(context); + Require(older > 0, "handle before SDK 3.00"); + Require(sceNpWebApiSetHandleTimeout(context, older, 1000) == HandleNotFound, "a handle created before SDK 3.00 has no timer"); + Require(sceNpWebApiAbortHandle(context, older) == 0, "abort a handle created before SDK 3.00"); + SetSdkVersion(0x04508001); + Require(sceNpWebApiSetHandleTimeout(context, older, 1000) == HandleNotFound, "the timer is decided when the handle is created"); + Require(sceNpWebApiDeleteHandle(context, older) == 0, "delete the handle created before SDK 3.00"); + + Require(sceNpWebApiTerminate(context) == 0 && sceNpWebApiTerminate(other) == 0, "terminate the handle library contexts"); +} + +void TestRequestOptions() { + const int context = sceNpWebApiInitialize(1, 0x10000); + const int user = sceNpWebApiCreateContext(context, onlineId); + Require(user > 0, "user context for request options"); + std::int64_t request = 0; + Require(sceNpWebApiCreateRequest(user, "group", "/path", MethodGet, nullptr, &request) == 0, "request for options"); + const std::int64_t unknownUser = static_cast(user + 1) << 32 | 1; + + Require(sceNpWebApiAddHttpRequestHeader(request, nullptr, "value") == InvalidArgument, "header without a field name"); + Require(sceNpWebApiAddHttpRequestHeader(request, "Accept", nullptr) == InvalidArgument, "header without a value"); + Require(sceNpWebApiAddHttpRequestHeader(-1, nullptr, "value") == InvalidArgument, "the header is checked before the request"); + Require(sceNpWebApiAddHttpRequestHeader(-1, "Accept", "application/json") == LibContextNotFound, "header of request -1"); + Require(sceNpWebApiAddHttpRequestHeader(unknownUser, "Accept", "application/json") == UserContextNotFound, "header of a request of an unknown user context"); + Require(sceNpWebApiAddHttpRequestHeader(request + 0x10000, "Accept", "application/json") == RequestNotFound, "header of an unknown request"); + Require(sceNpWebApiAddHttpRequestHeader(request, "Accept", "application/json") == 0, "add a header"); + Require(sceNpWebApiAddHttpRequestHeader(request, "Accept", "application/json") == 0, "add the same header twice"); + + Require(sceNpWebApiSetMultipartContentType(-1, "multipart/mixed", "boundary") == LibContextNotFound, "multipart type of request -1"); + Require(sceNpWebApiSetMultipartContentType(unknownUser, "multipart/mixed", "boundary") == UserContextNotFound, "multipart type of a request of an unknown user context"); + Require(sceNpWebApiSetMultipartContentType(request + 0x10000, "multipart/mixed", "boundary") == RequestNotFound, "multipart type of an unknown request"); + Require(sceNpWebApiSetMultipartContentType(request, nullptr, nullptr) == 0, "multipart type without a name or boundary"); + Require(sceNpWebApiSetMultipartContentType(request, "multipart/mixed", "boundary") == 0, "multipart type of a request that is not multipart"); + + Require(sceNpWebApiSetRequestTimeout(-1, 1000) == LibContextNotFound, "timeout of request -1"); + Require(sceNpWebApiSetRequestTimeout(unknownUser, 1000) == UserContextNotFound, "timeout of a request of an unknown user context"); + Require(sceNpWebApiSetRequestTimeout(request + 0x10000, 1000) == RequestNotFound, "timeout of an unknown request"); + Require(sceNpWebApiSetRequestTimeout(request, 0) == 0, "request without a timeout"); + + std::array information{}; + information.fill('x'); + Require(sceNpWebApiSendRequest2(request, body, sizeof(body), information.data()) == NotSignedIn, "a request cannot be sent without a signed-in user"); + Require(sceNpWebApiSendRequest2(request, nullptr, 0, nullptr) == NotSignedIn, "send without response information"); + Require(information[0] == 'x' && information[31] == 'x', "a failed send leaves the response information alone"); + Require(sceNpWebApiSendRequest2(-1, nullptr, 0, nullptr) == LibContextNotFound, "send request -1"); + Require(sceNpWebApiSendRequest2(unknownUser, nullptr, 0, nullptr) == UserContextNotFound, "send a request of an unknown user context"); + Require(sceNpWebApiSendRequest2(request + 0x10000, nullptr, 0, nullptr) == RequestNotFound, "send an unknown request"); + Require(sceNpWebApiAbortRequest(request) == 0, "abort the request with options"); + Require(sceNpWebApiSendRequest2(request, nullptr, 0, nullptr) == Aborted, "send an aborted request"); + + Require(sceNpWebApiDeleteRequest(request) == 0, "delete the request with options"); + Require(sceNpWebApiAddHttpRequestHeader(request, "Accept", "application/json") == RequestNotFound, "header of a deleted request"); + Require(sceNpWebApiTerminate(context) == 0, "terminate the request options library context"); +} + +void TestMultipartRequests() { + const int context = sceNpWebApiInitialize(1, 0x10000); + const int user = sceNpWebApiCreateContext(context, onlineId); + Require(user > 0, "user context for multipart requests"); + + std::int64_t request = 0; + Require(sceNpWebApiCreateMultipartRequest(user, nullptr, "/path", MethodPost, &request) == InvalidArgument, "multipart request without an API group"); + Require(sceNpWebApiCreateMultipartRequest(user, "group", nullptr, MethodPost, &request) == InvalidArgument, "multipart request without a path"); + Require(sceNpWebApiCreateMultipartRequest(0, "group", "/path", MethodPatch, &request) == InvalidArgument, "the method is checked before the user context from SDK 2.50"); + Require(sceNpWebApiCreateMultipartRequest(user + 1, "group", "/path", MethodPost, &request) == UserContextNotFound, "multipart request of an unknown user context"); + Require(sceNpWebApiCreateMultipartRequest(0, "group", "/path", MethodPost, &request) == LibContextNotFound, "multipart request of user context 0"); + Require(request == 0, "a failed multipart request leaves the id alone"); + Require(sceNpWebApiCreateMultipartRequest(user, "group", "/path", MethodPost, nullptr) == 0, "multipart request without an id output"); + Require(sceNpWebApiCreateMultipartRequest(user, "group", "/path", MethodPost, &request) == 0, "create a multipart request"); + Require(static_cast(request >> 32) == user && (request & 0xffffffff) != 0, "multipart request id holds its user context"); + + Require(sceNpWebApiSetMultipartContentType(request, "multipart/mixed", "boundary") == 0, "multipart type"); + Require(sceNpWebApiAddHttpRequestHeader(request, "Accept", "application/json") == 0, "header of a multipart request"); + Require(sceNpWebApiSendRequest(request, body, sizeof(body)) == InvalidArgument, "a multipart request has no part 0"); + Require(sceNpWebApiSendRequest2(request, body, sizeof(body), nullptr) == InvalidArgument, "a multipart request has no part 0 for SendRequest2"); + Require(sceNpWebApiAbortRequest(request) == 0, "abort the multipart request"); + Require(sceNpWebApiSendRequest(request, nullptr, 0) == InvalidArgument, "the part is checked before the abort"); + Require(sceNpWebApiDeleteRequest(request) == 0, "delete the multipart request"); + Require(sceNpWebApiSendRequest(request, nullptr, 0) == RequestNotFound, "send a deleted multipart request"); + + SetSdkVersion(0x02000000); + Require(sceNpWebApiCreateMultipartRequest(user, "group", "/path", MethodPatch, &request) == 0, "multipart PATCH before SDK 2.50"); + SetSdkVersion(0x04508001); + Require(sceNpWebApiTerminate(context) == 0, "terminate the multipart library context"); +} + +void TestRequestTimeouts() { + sceNpWebApiCheckTimeout(); + const int context = sceNpWebApiInitialize(1, 0x10000); + const int user = sceNpWebApiCreateContext(context, onlineId); + Require(user > 0, "user context for timeouts"); + std::int64_t timed = 0; + std::int64_t untimed = 0; + std::int64_t unsent = 0; + std::int64_t distant = 0; + Require(sceNpWebApiCreateRequest(user, "group", "/path", MethodGet, nullptr, &timed) == 0, "request with a timeout"); + Require(sceNpWebApiCreateRequest(user, "group", "/path", MethodGet, nullptr, &untimed) == 0, "request without a timeout"); + Require(sceNpWebApiCreateRequest(user, "group", "/path", MethodGet, nullptr, &unsent) == 0, "request with a timeout that is never sent"); + Require(sceNpWebApiCreateRequest(user, "group", "/path", MethodGet, nullptr, &distant) == 0, "request with a distant timeout"); + Require(sceNpWebApiSetRequestTimeout(timed, 1) == 0 && sceNpWebApiSetRequestTimeout(unsent, 1) == 0, "set short timeouts"); + Require(sceNpWebApiSetRequestTimeout(distant, 0xffffffffu) == 0, "set a distant timeout"); + + Require(sceNpWebApiSendRequest(timed, nullptr, 0) == NotSignedIn, "sending starts the request timer"); + Require(sceNpWebApiSendRequest(untimed, nullptr, 0) == NotSignedIn, "send the request without a timeout"); + Require(sceNpWebApiSendRequest(distant, nullptr, 0) == NotSignedIn, "send the request with a distant timeout"); + std::this_thread::sleep_for(std::chrono::milliseconds(20)); + sceNpWebApiCheckTimeout(); + + Require(sceNpWebApiAbortRequest(timed) == 0, "abort a timed out request"); + Require(sceNpWebApiSendRequest(timed, nullptr, 0) == NotSignedIn, "a timed out request is not reported as aborted"); + Require(sceNpWebApiAbortRequest(untimed) == 0 && sceNpWebApiSendRequest(untimed, nullptr, 0) == Aborted, "a request without a timeout does not time out"); + Require(sceNpWebApiAbortRequest(unsent) == 0 && sceNpWebApiSendRequest(unsent, nullptr, 0) == Aborted, "the timer starts when the request is sent"); + Require(sceNpWebApiAbortRequest(distant) == 0 && sceNpWebApiSendRequest(distant, nullptr, 0) == Aborted, "a distant timeout has not passed"); + + Require(sceNpWebApiTerminate(context) == 0, "terminate the timeout library context"); + sceNpWebApiCheckTimeout(); +} + } int main() { @@ -252,5 +391,9 @@ int main() { TestRequests(); TestPushEventCallbacks(); TestOlderSdks(); + TestHandleOperations(); + TestRequestOptions(); + TestMultipartRequests(); + TestRequestTimeouts(); return 0; } diff --git a/core/libs/tests/GuestNpWebApiInitialize.cpp b/core/libs/tests/GuestNpWebApiInitialize.cpp new file mode 100644 index 0000000000..eef0f62c0f --- /dev/null +++ b/core/libs/tests/GuestNpWebApiInitialize.cpp @@ -0,0 +1,120 @@ +#include "prx/libSceNpWebApi/include/Api.hpp" + +#include +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#else +#include +#endif + +namespace { + +constexpr int InvalidArgument = static_cast(0x80552902u); +constexpr int LibContextNotFound = static_cast(0x80552904u); +constexpr int UserContextNotFound = static_cast(0x80552905u); +constexpr int InvalidContentParameter = static_cast(0x80552908u); +const char onlineId[20] = "player"; + +using IntCreateRequestFn = decltype(&sceNpWebApiIntCreateRequest); + +template +Function Resolve(const char* name) { +#ifdef _WIN32 + void* symbol = reinterpret_cast(GetProcAddress(LoadLibraryA("libSceNpWebApi.prx"), name)); +#else + void* symbol = dlsym(RTLD_DEFAULT, name); +#endif + if (!symbol) { + std::fprintf(stderr, "%s is not exported by libSceNpWebApi\n", name); + std::abort(); + } + return reinterpret_cast(symbol); +} + +void Require(bool condition, const char* message) { + if (condition) return; + std::fprintf(stderr, "NpWebApi initialize: %s\n", message); + std::abort(); +} + +void APS5_VABI Notification() {} + +bool InternalArgumentsThrow(IntCreateRequestFn intCreateRequest, int user, const NpWebApiIntCreateRequestExtraArgs* internalArgs, std::int64_t* request) { + try { + intCreateRequest(user, "group", "/v1", 0, nullptr, internalArgs, request); + } catch (const std::runtime_error& error) { + return std::string(error.what()).find("not implemented") != std::string::npos; + } + return false; +} + +} + +int main() { + const auto initializeForPresence = Resolve("sceNpWebApiInitializeForPresence"); + const auto vshInitialize = Resolve("sceNpWebApiVshInitialize"); + const auto intInitialize = Resolve("sceNpWebApiIntInitialize"); + const auto registerNotification = Resolve("sceNpWebApiRegisterNotificationCallback"); + const auto unregisterNotification = Resolve("sceNpWebApiUnregisterNotificationCallback"); + const auto intCreateRequest = Resolve("sceNpWebApiIntCreateRequest"); + + const int presence = initializeForPresence(1, 0x10000); + Require(presence > 0, "the presence library context was not created"); + const int vsh = vshInitialize(1, 0x10000); + Require(vsh > 0 && vsh != presence, "the VSH library context was not a new context"); + NpWebApiIntInitializeArgs args{1, {}, 0x10000, "internal", sizeof(NpWebApiIntInitializeArgs)}; + Require(intInitialize(nullptr) == InvalidArgument, "null internal arguments were taken"); + args.structSize = 0x18; + Require(intInitialize(&args) == InvalidArgument, "internal arguments of the wrong size were taken"); + args.structSize = sizeof(NpWebApiIntInitializeArgs); + const int internal = intInitialize(&args); + Require(internal > 0 && internal != presence && internal != vsh, "the internal library context was not a new context"); + for (const int context : {presence, vsh, internal}) { + const int user = sceNpWebApiCreateContext(context, onlineId); + Require(user > 0, "a user context could not be created in the new library context"); + Require(sceNpWebApiDeleteContext(user) == 0, "the user context could not be deleted"); + Require(sceNpWebApiTerminate(context) == 0, "the library context could not be terminated"); + } + + const int context = sceNpWebApiInitialize(1, 0x10000); + const int user = sceNpWebApiCreateContext(context, onlineId); + Require(context > 0 && user > 0, "the contexts for the notification checks were not created"); + Require(registerNotification(user, nullptr, nullptr) == InvalidArgument, "a null notification callback was taken"); + Require(registerNotification(user + 1, nullptr, nullptr) == InvalidArgument, "the callback was not checked before the user context"); + auto* callback = reinterpret_cast(&Notification); + Require(registerNotification(user + 1, callback, nullptr) == UserContextNotFound, "an unknown user context was taken"); + Require(registerNotification((0x7fff << 16) | 1, callback, nullptr) == LibContextNotFound, "an unknown library context was taken"); + Require(registerNotification(user, callback, nullptr) == 0, "registering the notification callback failed"); + Require(registerNotification(user, callback, nullptr) == 0, "registering the notification callback again failed"); + Require(unregisterNotification(user + 1) == UserContextNotFound, "unregistering for an unknown user context was taken"); + Require(unregisterNotification(user) == 0 && unregisterNotification(user) == 0, "unregistering the notification callback failed"); + + std::int64_t request = 77; + NpWebApiContentParameter typeless{8, nullptr, {}}; + Require(intCreateRequest(user, nullptr, "/v1", 0, nullptr, nullptr, &request) == InvalidArgument && intCreateRequest(user, "group", nullptr, 0, nullptr, nullptr, &request) == InvalidArgument, "an internal request without a group or path was taken"); + Require(intCreateRequest(user, "group", "/v1", 5, &typeless, nullptr, &request) == InvalidArgument, "a method past PATCH was not refused before the content parameter"); + Require(intCreateRequest(user, "group", "/v1", 0, &typeless, nullptr, &request) == InvalidContentParameter, "content without a type was taken"); + Require(intCreateRequest(user + 1, "group", "/v1", 4, nullptr, nullptr, &request) == UserContextNotFound && request == 77, "an internal request for an unknown user context was taken"); + Require(intCreateRequest(user, "group", "/v1", 4, nullptr, nullptr, &request) == 0 && (request >> 32) == user, "a PATCH internal request was not created in the user context"); + Require(sceNpWebApiDeleteRequest(request) == 0, "the internal request could not be deleted"); + const NpWebApiIntCreateRequestExtraArgs nullFields{}; + Require(intCreateRequest(user, "group", "/v1", 0, nullptr, &nullFields, &request) == 0 && (request >> 32) == user, "internal arguments with only null fields were refused"); + Require(sceNpWebApiDeleteRequest(request) == 0, "the internal request with null fields could not be deleted"); + const NpWebApiIntCreateRequestExtraArgs setFields{nullptr, onlineId, nullptr}; + request = 77; + Require(intCreateRequest(user + 1, "group", "/v1", 0, nullptr, &setFields, &request) == UserContextNotFound && request == 77, "the user context was not checked before the internal arguments"); + Require(InternalArgumentsThrow(intCreateRequest, user, &setFields, &request) && request == 77, "internal arguments with a field set did not stay unsupported"); + Require(sceNpWebApiDeleteContext(user) == 0, "the user context could not be deleted"); + Require(registerNotification(user, callback, nullptr) == UserContextNotFound, "a deleted user context was taken"); + Require(sceNpWebApiTerminate(context) == 0, "the library context could not be terminated"); + Require(unregisterNotification(user) == LibContextNotFound, "a terminated library context was taken"); + + std::puts("NpWebApi initialize and notification tests passed"); + return 0; +} diff --git a/core/libs/tests/GuestPad.cpp b/core/libs/tests/GuestPad.cpp index b15a7e26a1..d894f17ec9 100644 --- a/core/libs/tests/GuestPad.cpp +++ b/core/libs/tests/GuestPad.cpp @@ -107,11 +107,11 @@ static void CheckInputCommands() { Require(disabled.Buttons(0) == 0); } -static float SettleOrientationW() { +static float SettleOrientationW(int port = 0) { float w = 1.0f; for (int i = 0; i < 10; ++i) { std::this_thread::sleep_for(std::chrono::milliseconds(10)); - w = Pad::ReadState().orientation_w; + w = Pad::ReadState(port).orientation_w; } return w; } @@ -185,6 +185,70 @@ static void CheckExtControllerInformation(int handle) { Require(scePadGetExtControllerInformation(handle + 1, extended.data()) == PAD_ERROR_INVALID_HANDLE); } +static bool LightBarValid() { + std::uint32_t seen = 0; + PadOutputState state; + Require(PadFetchOutput_nid_postfix(&seen, &state)); + return state.lightBarValid; +} + +static void CheckHandleQueries(int user, int handle) { + constexpr int notConnected = static_cast(0x80920007); + const int closed = handle + 1; + const int special = scePadOpen_nid_postfix(user, PAD_PORT_TYPE_SPECIAL, 0, nullptr); + Require(special > 0); + Require(scePadIsValidHandle(handle, PAD_PORT_TYPE_STANDARD)); + Require(!scePadIsValidHandle(handle, PAD_PORT_TYPE_SPECIAL)); + Require(scePadIsValidHandle(special, PAD_PORT_TYPE_SPECIAL)); + Require(!scePadIsValidHandle(special, PAD_PORT_TYPE_STANDARD)); + Require(!scePadIsValidHandle(closed, PAD_PORT_TYPE_STANDARD)); + Require(!scePadIsValidHandle(0, PAD_PORT_TYPE_STANDARD)); + + float value = 1.0f; + Require(scePadGetMotionTimerUnit(handle, nullptr) == PAD_ERROR_INVALID_ARG); + Require(scePadGetMotionTimerUnit(closed, &value) == PAD_ERROR_INVALID_HANDLE && value == 0.0f); + value = 1.0f; + Require(scePadGetMotionTimerUnit(handle, &value) == notConnected && value == 0.0f); + value = 1.0f; + Require(scePadGetMotionTimerUnit(special, &value) == notConnected && value == 0.0f); + + PadMotionSensorPosition position{1.0f, 2.0f, 3.0f}; + Require(scePadGetMotionSensorPosition(handle, nullptr) == PAD_ERROR_INVALID_ARG); + Require(scePadGetMotionSensorPosition(closed, &position) == PAD_ERROR_INVALID_HANDLE); + Require(scePadGetMotionSensorPosition(handle, &position) == notConnected); + Require(position.x == 1.0f && position.y == 2.0f && position.z == 3.0f); + + float radius = 1.0f; + Require(scePadGetSphereRadius(special, nullptr) == PAD_ERROR_INVALID_ARG); + Require(scePadGetSphereRadius(handle, &radius) == PAD_ERROR_INVALID_HANDLE); + Require(scePadGetSphereRadius(special, &radius) == notConnected && radius == 1.0f); + + std::uint64_t address = 7; + Require(scePadGetBluetoothAddress(handle, nullptr) == PAD_ERROR_INVALID_ARG); + Require(scePadGetBluetoothAddress(closed, &address) == PAD_ERROR_INVALID_HANDLE); + Require(scePadGetBluetoothAddress(handle, &address) == notConnected && address == 7); + + std::array leonardo{}; + std::array unique; + unique.fill(0xaa); + leonardo[0x5c] = 0x13; + Require(scePadParseUniqueDataLeonardo(handle, nullptr, reinterpret_cast(unique.data())) == PAD_ERROR_INVALID_ARG); + Require(scePadParseUniqueDataLeonardo(handle, reinterpret_cast(leonardo.data()), nullptr) == PAD_ERROR_INVALID_ARG); + Require(unique[0] == 0xaa); + Require(scePadParseUniqueDataLeonardo(handle, reinterpret_cast(leonardo.data()), reinterpret_cast(unique.data())) == PAD_ERROR_INVALID_HANDLE); + for (std::size_t i = 0; i < unique.size(); ++i) Require(unique[i] == (i < 0x18 ? 0 : 0xaa)); + + const PadLightBarParam color{10, 20, 30}; + Require(scePadSetLightBar(handle, &color) == PAD_OK && LightBarValid()); + Require(scePadResetLightBarAllByPortType(3) == PAD_ERROR_INVALID_ARG); + Require(scePadResetLightBarAllByPortType(PAD_PORT_TYPE_SPECIAL) == PAD_OK && LightBarValid()); + Require(scePadResetLightBarAllByPortType(PAD_PORT_TYPE_STANDARD) == PAD_OK && !LightBarValid()); + Require(scePadSetLightBar(handle, &color) == PAD_OK && LightBarValid()); + Require(scePadResetLightBarAll() == PAD_OK && !LightBarValid()); + Require(scePadClose_nid_postfix(special) == PAD_OK); + Require(!scePadIsValidHandle(special, PAD_PORT_TYPE_SPECIAL)); +} + static void CheckVirtualTouchContact() { PadInputState left; left.touchLeft = true; @@ -757,6 +821,50 @@ static void CheckInjectedQueueTimes(const std::filesystem::path& path) { PadPublishInput_nid_postfix(PadInputState{}); } +static void CheckPortZeroWithdrawn() { + constexpr int user = 0x10000000; + constexpr int noHandle = static_cast(0x80920008); + const bool wasOpen = scePadGetHandle(user, 0, 0) != noHandle; + const int handle = wasOpen ? scePadGetHandle(user, 0, 0) : scePadOpen_nid_postfix(user, PAD_PORT_TYPE_STANDARD, 0, nullptr); + Require(handle > 0); + PadInputState pressed; + pressed.buttons = 0x4000; + PadSetPortConnected_nid_postfix(0, true); + PadPublishInput_nid_postfix(pressed); + PadData data[2]; + std::memset(data, 0xff, sizeof(data)); + Require(scePadReadState(handle, data) == PAD_OK); + Require(data[0].connected && (data[0].buttons & 0x4000) != 0); + PadSetPortConnected_nid_postfix(0, false); + std::memset(data, 0xff, sizeof(data)); + Require(scePadReadState(handle, data) == PAD_OK); + Require(!data[0].connected && data[0].buttons == 0 && data[0].analog_buttons_l2 == 0 && data[0].analog_buttons_r2 == 0); + Require(data[0].left_stick_x == 0 && data[0].left_stick_y == 0 && data[0].right_stick_x == 0 && data[0].right_stick_y == 0); + Require(data[0].orientation_w == 1.0f && data[0].touch_data_touch_num == 0); + PadControllerInformation controllerInfo; + std::memset(&controllerInfo, 0xff, sizeof(controllerInfo)); + Require(scePadGetControllerInformation(handle, &controllerInfo) == PAD_OK); + Require(!controllerInfo.connected && controllerInfo.connectedCount == 0); + PadInfo info; + std::memset(&info, 0xff, sizeof(info)); + Require(scePadGetInfo_nid_postfix(&info) == PAD_OK); + std::uint8_t expected = 0; + for (int port = 0; port < PAD_MAX_CONTROLLERS; ++port) { + if (Pad::IsConnected(port)) ++expected; + } + Require(info.connectedCount[0] == expected); + if (expected == 0) Require(info.padTypeInfo[0].status == 0); + PadPublishInput_nid_postfix(pressed); + std::memset(data, 0xff, sizeof(data)); + Require(scePadRead_nid_postfix(handle, data, 2) == 1); + Require(!data[0].connected && data[0].buttons == 0); + PadSetPortConnected_nid_postfix(0, true); + std::memset(data, 0xff, sizeof(data)); + Require(scePadReadState(handle, data) == PAD_OK); + Require(data[0].connected && (data[0].buttons & 0x4000) != 0); + if (!wasOpen) Require(scePadClose_nid_postfix(handle) == PAD_OK); +} + int main() { CheckInputCommands(); std::uint32_t accessibilityState = 7; @@ -767,6 +875,19 @@ int main() { Require(scePadGetControllerType(PAD_HANDLE, nullptr) == PAD_ERROR_NOT_INITIALIZED); Require(scePadGetControllerType(PAD_HANDLE, &controllerType) == PAD_ERROR_NOT_INITIALIZED); Require(controllerType == -1); + float earlyUnit = 1.0f; + PadMotionSensorPosition earlyPosition{1.0f, 2.0f, 3.0f}; + float earlyRadius = 1.0f; + std::uint64_t earlyAddress = 7; + std::array earlyLeonardo{}; + std::array earlyUnique; + earlyUnique.fill(0xaa); + Require(scePadGetMotionTimerUnit(PAD_HANDLE, nullptr) == PAD_ERROR_NOT_INITIALIZED); + Require(scePadGetMotionTimerUnit(PAD_HANDLE, &earlyUnit) == PAD_ERROR_NOT_INITIALIZED && earlyUnit == 1.0f); + Require(scePadGetMotionSensorPosition(PAD_HANDLE, &earlyPosition) == PAD_ERROR_NOT_INITIALIZED && earlyPosition.x == 1.0f && earlyPosition.y == 2.0f && earlyPosition.z == 3.0f); + Require(scePadGetSphereRadius(PAD_HANDLE, &earlyRadius) == PAD_ERROR_NOT_INITIALIZED && earlyRadius == 1.0f); + Require(scePadGetBluetoothAddress(PAD_HANDLE, &earlyAddress) == PAD_ERROR_NOT_INITIALIZED && earlyAddress == 7); + Require(scePadParseUniqueDataLeonardo(PAD_HANDLE, reinterpret_cast(earlyLeonardo.data()), reinterpret_cast(earlyUnique.data())) == PAD_ERROR_NOT_INITIALIZED && earlyUnique[0] == 0xaa); Require(scePadUnknown_n3kSX62fgNo() == static_cast(0x80920005)); Require(!scePadIsValidHandle(PAD_HANDLE, PAD_PORT_TYPE_STANDARD)); const PadVibrationParam earlyVibration{1, 2}; @@ -850,6 +971,7 @@ int main() { CheckTiltCorrection(handle); CheckAngularVelocityDeadband(handle); CheckTouchContact(); + CheckHandleQueries(user, handle); CheckVirtualTouchContact(); CheckTouchPadInformation(handle); CheckStickDeadZones(handle); @@ -970,9 +1092,71 @@ int main() { Require(scePadSetLightBar(-1, &lightColor) == PAD_ERROR_INVALID_HANDLE); Require(scePadSetLightBar(handle2, nullptr) == PAD_ERROR_INVALID_ARG); + PadInputState p0MotionSample{}; + p0MotionSample.hasMotion = true; + p0MotionSample.accel = {0.0f, 9.80665f, 0.0f}; + p0MotionSample.gyro = {0.5f, 0.5f, 0.5f}; + PadPublishInputForPort_nid_postfix(0, p0MotionSample); + Require(scePadSetMotionSensorState(handle, true) == PAD_OK); + + PadInputState p2MotionSample{}; + p2MotionSample.hasMotion = true; + p2MotionSample.accel = {4.903325f, 9.80665f, 0.0f}; + p2MotionSample.gyro = {0.1f, 0.2f, -0.3f}; + PadPublishInputForPort_nid_postfix(1, p2MotionSample); + + Require(scePadSetMotionSensorState(handle2, true) == PAD_OK); + PadData p2DataMotion{}; + Require(scePadReadState(handle2, &p2DataMotion) == PAD_OK); + Require(p2DataMotion.angular_velocity_x == 0.1f && p2DataMotion.angular_velocity_y == 0.2f && p2DataMotion.angular_velocity_z == -0.3f); + Require(p2DataMotion.acceleration_x > 0.49f && p2DataMotion.acceleration_x < 0.51f); + + Require(scePadSetMotionSensorState(handle2, false) == PAD_OK); + Require(scePadReadState(handle2, &p2DataMotion) == PAD_OK); + Require(p2DataMotion.angular_velocity_x == 0.0f && p2DataMotion.angular_velocity_y == 0.0f && p2DataMotion.angular_velocity_z == 0.0f); + Require(p2DataMotion.acceleration_x == 0.0f); + + PadData p0DataMotion{}; + Require(scePadReadState(handle, &p0DataMotion) == PAD_OK); + Require(p0DataMotion.angular_velocity_x == 0.5f && p0DataMotion.angular_velocity_y == 0.5f && p0DataMotion.angular_velocity_z == 0.5f); + + Require(scePadSetMotionSensorState(handle2, true) == PAD_OK); + Require(scePadReadState(handle2, &p2DataMotion) == PAD_OK); + Require(p2DataMotion.angular_velocity_x == 0.1f && p2DataMotion.angular_velocity_y == 0.2f && p2DataMotion.angular_velocity_z == -0.3f); + + Require(scePadSetMotionSensorState(handle2 + 99, true) == PAD_ERROR_INVALID_HANDLE); + Require(scePadSetMotionSensorState(-1, true) == PAD_ERROR_INVALID_HANDLE); + + PadPublishInputForPort_nid_postfix(0, PadInputState{}); + PadPublishInputForPort_nid_postfix(1, PadInputState{}); + + PadInputState tilted2; + tilted2.hasMotion = true; + tilted2.accel = {9.80665f, 0.0f, 0.0f}; + PadPublishInputForPort_nid_postfix(1, tilted2); + + Require(scePadSetTiltCorrectionState(handle2, false) == PAD_OK); + Require(scePadResetOrientation(handle2) == PAD_OK); + Require(SettleOrientationW(1) == 1.0f); + + Require(scePadSetTiltCorrectionState(handle2, true) == PAD_OK); + Require(SettleOrientationW(1) < 0.999f); + + PadPublishInputForPort_nid_postfix(1, PadInputState{}); + + Require(SettleOrientationW(0) == 1.0f); + + Require(scePadSetTiltCorrectionState(handle2 + 99, true) == PAD_ERROR_INVALID_HANDLE); + Require(scePadSetTiltCorrectionState(-1, true) == PAD_ERROR_INVALID_HANDLE); + + Require(scePadResetOrientation(handle2) == PAD_OK); + Require(scePadResetOrientation(handle2 + 99) == PAD_ERROR_INVALID_HANDLE); + Require(scePadResetOrientation(-1) == PAD_ERROR_INVALID_HANDLE); + Require(scePadClose_nid_postfix(handle2) == 0); Require(scePadGetHandle(user2, 0, 0) == noHandle); Require(!scePadIsValidHandle(handle2, PAD_PORT_TYPE_STANDARD)); Require(scePadSetAngularVelocityDeadbandState(handle2, false) == PAD_OK); Require(scePadSetAngularVelocityDeadbandState(handle2 + 1, false) == PAD_ERROR_INVALID_HANDLE); + CheckPortZeroWithdrawn(); } diff --git a/core/libs/tests/GuestPageTableStats.cpp b/core/libs/tests/GuestPageTableStats.cpp index 18b33b9f39..06819894e0 100644 --- a/core/libs/tests/GuestPageTableStats.cpp +++ b/core/libs/tests/GuestPageTableStats.cpp @@ -55,6 +55,11 @@ static void CheckRejectedArguments() { Require(sceKernelGetPageTableStats(&value, nullptr, &value, &value) == SCE_KERNEL_ERROR_EFAULT); Require(sceKernelGetPageTableStats(&value, &value, nullptr, &value) == SCE_KERNEL_ERROR_EFAULT); Require(sceKernelGetPageTableStats(&value, &value, &value, nullptr) == SCE_KERNEL_ERROR_EFAULT); + auto* bad = reinterpret_cast(0x10); + Require(sceKernelGetPageTableStats(bad, &value, &value, &value) == SCE_KERNEL_ERROR_EFAULT); + Require(sceKernelGetPageTableStats(&value, bad, &value, &value) == SCE_KERNEL_ERROR_EFAULT); + Require(sceKernelGetPageTableStats(&value, &value, bad, &value) == SCE_KERNEL_ERROR_EFAULT); + Require(sceKernelGetPageTableStats(&value, &value, &value, bad) == SCE_KERNEL_ERROR_EFAULT); } static void CheckCpuGranules() { @@ -111,6 +116,10 @@ static void CheckTraceMemoryStats() { second[0] = 1; Require(sceKernelGetTraceMemoryStats(nullptr, second) == 0 && second[0] == 0); Require(sceKernelGetTraceMemoryStats(nullptr, nullptr) == 0); + auto* badTrace = reinterpret_cast(0x10); + Require(sceKernelGetTraceMemoryStats(badTrace, nullptr) == SCE_KERNEL_ERROR_EFAULT); + Require(sceKernelGetTraceMemoryStats(nullptr, badTrace) == SCE_KERNEL_ERROR_EFAULT); + Require(sceKernelGetTraceMemoryStats(badTrace, badTrace) == SCE_KERNEL_ERROR_EFAULT); } int main() { diff --git a/core/libs/tests/GuestPlayGo.cpp b/core/libs/tests/GuestPlayGo.cpp index 55711df9c3..d0321f63e9 100644 --- a/core/libs/tests/GuestPlayGo.cpp +++ b/core/libs/tests/GuestPlayGo.cpp @@ -99,10 +99,18 @@ static int CheckNoPlayGoFile(const char* root) { constexpr int badPointer = static_cast(0x80B2000A); constexpr int badSize = static_cast(0x80B2000B); constexpr int badLocus = static_cast(0x80B20010); + constexpr int invalidArgument = static_cast(0x80B20004); + constexpr int notInitialized = static_cast(0x80B20005); + constexpr int badSpeed = static_cast(0x80B2000D); + constexpr int notPermitted = static_cast(0x80B2000F); + constexpr int badOptionalType = static_cast(0x80B20024); + constexpr int badScenarioConfiguration = static_cast(0x80B20026); PlayGoInitParams init{}; int handle = 0; + Require(scePlayGoSetInstallSpeed2(0, 2) == notInitialized); Require(scePlayGoInitialize(nullptr) == badPointer); + Require(scePlayGoSetInstallSpeed2(0, 2) == notInitialized); Require(scePlayGoInitialize(&init) == 0); Require(scePlayGoOpen(nullptr, nullptr) == badPointer); Require(scePlayGoOpen(&handle, nullptr) == 0); @@ -118,11 +126,19 @@ static int CheckNoPlayGoFile(const char* root) { Require(scePlayGoSetLanguageMask(handle, ~0ull) == 0); Require(scePlayGoGetLanguageMask(handle, &mask) == 0 && mask == ~0ull); + std::uint32_t requiredDisc = 0; for (const auto getOptionalChunk : {scePlayGoGetSupportedOptionalChunk, scePlayGoGetOptionalChunk}) { PlayGoOptionalChunk option{}; Require(getOptionalChunk(handle + 1, 0, &option) == badHandle); Require(getOptionalChunk(handle, 0, nullptr) == badPointer); Require(getOptionalChunk(handle, 0, &option) == 0 && option.bitmask == ~0ull); + Require(getOptionalChunk(handle, 1, &option) == 0 && option.bitmask == 0x1F); + Require(getOptionalChunk(handle, 2, &option) == 0 && option.bitmask == ~0ull); + for (const std::uint32_t type : {0u, 1u, 2u}) { + Require(getOptionalChunk(handle, type, &option) == 0); + Require(scePlayGoRequestOptionalChunk(handle, type, &option) == 0); + Require(scePlayGoGetRequiredDisc(handle, type, &option, &requiredDisc) == 0); + } Require(getOptionalChunk(handle, 3, &option) == static_cast(0x80B20024)); Require(getOptionalChunk(handle, 0xFFFFFFFF, &option) == static_cast(0x80B20024)); Require(getOptionalChunk(handle, 3, nullptr) == badPointer); @@ -171,6 +187,49 @@ static int CheckNoPlayGoFile(const char* root) { Require(scePlayGoGetInstallSpeed(handle + 1, &speed) == badHandle); Require(scePlayGoGetInstallSpeed(handle, nullptr) == badPointer); Require(scePlayGoGetInstallSpeed(handle, &speed) == 0 && speed == 2); + Require(scePlayGoSetInstallSpeed2(1, 1) == invalidArgument); + Require(scePlayGoSetInstallSpeed2(-1, 3) == invalidArgument); + Require(scePlayGoSetInstallSpeed2(0, 3) == badSpeed); + Require(scePlayGoSetInstallSpeed2(0, 0xFFFFFFFF) == badSpeed); + Require(scePlayGoSetInstallSpeed2(0, 0) == notPermitted); + Require(scePlayGoGetInstallSpeed(handle, &speed) == 0 && speed == 2); + Require(scePlayGoSetInstallSpeed2(0, 1) == 0); + Require(scePlayGoGetInstallSpeed(handle, &speed) == 0 && speed == 1); + Require(scePlayGoSetInstallSpeed2(0, 2) == 0); + Require(scePlayGoGetInstallSpeed(handle, &speed) == 0 && speed == 2); + Require(scePlayGoRequestNextChunk(handle + 1, nullptr) == badHandle); + Require(scePlayGoRequestNextChunk(handle + 1, &speed) == badHandle); + Require(scePlayGoRequestNextChunk(handle, &speed) == invalidArgument); + Require(scePlayGoRequestNextChunk(handle, nullptr) == 0); + PlayGoOptionalChunk request{}; + request.bitmask = ~0ull; + Require(scePlayGoRequestOptionalChunk(handle + 1, 0, &request) == badHandle); + Require(scePlayGoRequestOptionalChunk(handle + 1, 3, nullptr) == badHandle); + Require(scePlayGoRequestOptionalChunk(handle, 0, nullptr) == badPointer); + Require(scePlayGoRequestOptionalChunk(handle, 3, nullptr) == badPointer); + Require(scePlayGoRequestOptionalChunk(handle, 3, &request) == badOptionalType); + Require(scePlayGoRequestOptionalChunk(handle, 0xFFFFFFFF, &request) == badOptionalType); + Require(scePlayGoRequestOptionalChunk(handle, 0, &request) == 0); + Require(scePlayGoRequestOptionalChunk(handle, 2, &request) == 0); + Require(scePlayGoRequestOptionalChunk(handle, 1, &request) == badScenarioConfiguration); + request.scenarios = 0x20; + Require(scePlayGoRequestOptionalChunk(handle, 1, &request) == badScenarioConfiguration); + request.scenarios = 0x1F; + Require(scePlayGoRequestOptionalChunk(handle, 1, &request) == 0); + request.scenarios = 0; + Require(scePlayGoRequestOptionalChunk(handle, 1, &request) == 0); + std::uint32_t disc = 7; + Require(scePlayGoGetRequiredDisc(handle + 1, 0, &request, &disc) == badHandle && disc == 7); + Require(scePlayGoGetRequiredDisc(handle, 0, &request, nullptr) == badPointer); + Require(scePlayGoGetRequiredDisc(handle, 0, nullptr, &disc) == badPointer && disc == 7); + Require(scePlayGoGetRequiredDisc(handle, 3, nullptr, &disc) == badPointer && disc == 7); + Require(scePlayGoGetRequiredDisc(handle, 3, &request, &disc) == badOptionalType && disc == 7); + request.scenarios = 0x21; + Require(scePlayGoGetRequiredDisc(handle, 1, &request, &disc) == badScenarioConfiguration && disc == 7); + Require(scePlayGoGetRequiredDisc(handle, 0, &request, &disc) == 0 && disc == 0); + disc = 7; + request.scenarios = 0x1F; + Require(scePlayGoGetRequiredDisc(handle, 1, &request, &disc) == 0 && disc == 0); int64_t eta = -1; Require(scePlayGoGetEta(handle + 1, &chunk, 1, &eta) == badHandle); Require(scePlayGoGetEta(handle, &chunk, 1, nullptr) == badPointer); @@ -182,6 +241,7 @@ static int CheckNoPlayGoFile(const char* root) { Require(scePlayGoClose(handle + 1) == badHandle); Require(scePlayGoClose(handle) == 0); Require(scePlayGoTerminate() == 0); + Require(scePlayGoSetInstallSpeed2(0, 2) == notInitialized); return 0; } diff --git a/core/libs/tests/GuestPlayReady.cpp b/core/libs/tests/GuestPlayReady.cpp new file mode 100644 index 0000000000..07892d95de --- /dev/null +++ b/core/libs/tests/GuestPlayReady.cpp @@ -0,0 +1,98 @@ +#include "prx/libScePlayReady/libScePlayReady.hpp" +#include +#include +#include +#include +#include + +namespace { + +constexpr int InvalidArgument = static_cast(0x80070057); + +void Require(bool value, const char* message) { + if (value) return; + std::fprintf(stderr, "%s\n", message); + std::abort(); +} + +bool Filled(const unsigned char* bytes, std::size_t begin, std::size_t end, unsigned char value) { + for (std::size_t i = begin; i < end; ++i) + if (bytes[i] != value) return false; + return true; +} + +void CheckBufferInit() { + for (unsigned char fill : {0xA5, 0x5A}) { + unsigned char buffer[48]; + std::memset(buffer, fill, sizeof(buffer)); + sceBufferInit(buffer); + Require(Filled(buffer, 0, 24, 0) && Filled(buffer, 24, sizeof(buffer), fill), "sceBufferInit clears exactly 24 bytes"); + std::memset(buffer, fill, sizeof(buffer)); + Require(scePlayReadyBufferInit(buffer) == 0, "scePlayReadyBufferInit succeeds"); + Require(Filled(buffer, 0, 24, 0) && Filled(buffer, 24, sizeof(buffer), fill), "scePlayReadyBufferInit clears exactly 24 bytes"); + } + sceBufferInit(nullptr); + Require(scePlayReadyBufferInit(nullptr) == InvalidArgument, "scePlayReadyBufferInit rejects a null buffer"); +} + +void CheckInitParams() { + using Initialize = void (APS5_VABI*)(void*); + for (Initialize initialize : {scePlayReadyApiInitializeInitParams, scePlayReadyInitializeInitParams}) { + for (unsigned char fill : {0xA5, 0x5A}) { + unsigned char params[0x150]; + std::memset(params, fill, sizeof(params)); + initialize(params); + uint32_t magic = 0; + uint32_t version = 0; + std::memcpy(&magic, params, sizeof(magic)); + std::memcpy(&version, params + 4, sizeof(version)); + Require(magic == 0x50524459 && version == 1, "init params start with 0x50524459 and 1"); + Require(Filled(params, 8, 0x138, 0), "init params clear bytes 8 to 0x138"); + Require(Filled(params, 0x138, sizeof(params), fill), "init params leave bytes from 0x138 untouched"); + } + initialize(nullptr); + } +} + +void CheckVersion() { + const uint64_t expected[2][4] = {{2, 5, 0, 1788}, {1, 3, 3, 2021111201}}; + for (uint32_t index = 0; index < 2; ++index) { + uint64_t version[6]; + std::memset(version, 0xA5, sizeof(version)); + Require(scePlayReadyApiVersion(index, version) == 0, "scePlayReadyApiVersion succeeds for index 0 and 1"); + Require(std::memcmp(version, expected[index], sizeof(expected[index])) == 0, "scePlayReadyApiVersion writes the version"); + Require(Filled(reinterpret_cast(version), 32, sizeof(version), 0xA5), "scePlayReadyApiVersion writes 32 bytes"); + Require(scePlayReadyApiVersion(index, nullptr) == InvalidArgument, "scePlayReadyApiVersion rejects a null output"); + } + for (uint32_t index : {2u, 3u, 0x80000000u, 0xFFFFFFFFu}) { + uint64_t version[4]; + std::memset(version, 0xA5, sizeof(version)); + Require(scePlayReadyApiVersion(index, version) == InvalidArgument, "scePlayReadyApiVersion rejects an index above 1"); + Require(Filled(reinterpret_cast(version), 0, sizeof(version), 0xA5), "a rejected index writes nothing"); + } +} + +void CheckVersionString() { + const char* first = scePlayReadyApiVersionString(0); + Require(std::strcmp(first, "2.5.0.1788") == 0, "version string 0"); + const char* second = scePlayReadyApiVersionString(1); + Require(second == first, "version strings share one buffer"); + Require(std::strcmp(second, "1.3.3.2021111201") == 0, "version string 1"); + Require(std::strcmp(scePlayReadyApiVersionString(0), "2.5.0.1788") == 0, "version string 0 again"); + Require(std::memcmp(first + 11, "11201", 6) == 0, "a shorter version string leaves the earlier tail after its terminator"); + for (uint32_t index : {2u, 0x80000000u, 0xFFFFFFFFu}) { + const char* text = scePlayReadyApiVersionString(index); + Require(text == first, "an unknown index returns the same buffer"); + Require(Filled(reinterpret_cast(text), 0, 32, 0), "an unknown index clears the 32-byte buffer"); + } +} + +} // namespace + +int main() { + CheckBufferInit(); + CheckInitParams(); + CheckVersion(); + CheckVersionString(); + return 0; +} diff --git a/core/libs/tests/GuestPthreadMutexSpin.cpp b/core/libs/tests/GuestPthreadMutexSpin.cpp new file mode 100644 index 0000000000..e5e391fa58 --- /dev/null +++ b/core/libs/tests/GuestPthreadMutexSpin.cpp @@ -0,0 +1,235 @@ +#include "prx/libkernel/include/Api.hpp" +#include "prx/libkernel/Pthread/include/Cond.hpp" +#include "prx/libkernel/Pthread/include/Mutex.hpp" +#include "SceTypes.hpp" +#include +#include +#include +#include +#include +#include + +static constexpr int SCE_OK = 0; +static constexpr int THREADS = 4; +static constexpr int ROUNDS = 2000; +static constexpr int TURNS = 300; + +extern "C" std::uint64_t MutexYieldsForTest_nid_no_patch(); + +static void Require(bool value) { if (!value) std::abort(); } + +struct Counts { + int tries = 0; + int pauses = 0; + int yields = 0; +}; + +static bool Spin(int spins, int yields, int freeOnTry, Counts& counts) { + return MutexOperations::SpinAcquire(spins, yields, + [&] { return ++counts.tries == freeOnTry; }, + [&] { ++counts.pauses; }, + [&] { ++counts.yields; }); +} + +static void CheckSpinAcquire() { + Counts counts; + Require(!Spin(5, 3, 0, counts)); + Require(counts.tries == 9 && counts.pauses == 5 && counts.yields == 3); + + counts = {}; + Require(Spin(5, 3, 1, counts)); + Require(counts.tries == 1 && counts.pauses == 0 && counts.yields == 0); + + counts = {}; + Require(Spin(0, 4, 1, counts)); + Require(counts.tries == 1 && counts.pauses == 0 && counts.yields == 0); + + counts = {}; + Require(Spin(5, 3, 4, counts)); + Require(counts.tries == 4 && counts.pauses == 2 && counts.yields == 0); + + counts = {}; + Require(Spin(5, 3, 8, counts)); + Require(counts.tries == 8 && counts.pauses == 5 && counts.yields == 2); + + counts = {}; + Require(Spin(0, 2, 2, counts)); + Require(counts.tries == 2 && counts.pauses == 0 && counts.yields == 1); + + counts = {}; + Require(!Spin(0, 2, 0, counts)); + Require(counts.tries == 3 && counts.pauses == 0 && counts.yields == 2); + + counts = {}; + Require(!Spin(-3, -1, 0, counts)); + Require(counts.tries == 1 && counts.pauses == 0 && counts.yields == 0); +} + +struct Shared { + PthreadMutex mutex = nullptr; + std::atomic inside{0}; + int total = 0; + bool overlapped = false; +}; + +static void* APS5_VABI Contend(void* arg) { + auto& shared = *static_cast(arg); + for (int round = 0; round < ROUNDS; ++round) { + Require(scePthreadMutexLock(&shared.mutex) == SCE_OK); + if (shared.inside.fetch_add(1) != 0) + shared.overlapped = true; + ++shared.total; + shared.inside.fetch_sub(1); + Require(scePthreadMutexUnlock(&shared.mutex) == SCE_OK); + } + return nullptr; +} + +static void CheckContention(PthreadMutexattr* attr, int type, int spins, int yields) { + Shared shared; + Require(scePthreadMutexattrSettype(attr, type) == SCE_OK); + Require(scePthreadMutexInit(&shared.mutex, attr, "spin") == SCE_OK); + Require(scePthreadMutexSetspinloops(&shared.mutex, spins) == SCE_OK); + Require(scePthreadMutexSetyieldloops(&shared.mutex, yields) == SCE_OK); + Pthread threads[THREADS] = {}; + for (auto& thread : threads) + Require(scePthreadCreate(&thread, nullptr, Contend, &shared, nullptr) == SCE_OK); + for (auto& thread : threads) + Require(scePthreadJoin(thread, nullptr) == SCE_OK); + Require(!shared.overlapped && shared.total == THREADS * ROUNDS); + Require(scePthreadMutexDestroy(&shared.mutex) == SCE_OK); +} + +struct Ring { + PthreadMutex mutex = nullptr; + PthreadCond cond = nullptr; + std::atomic inside{0}; + std::atomic nextId{0}; + int turn = 0; + int total = 0; + bool recursive = false; + bool timed = false; + bool overlapped = false; +}; + +static void* APS5_VABI TakeTurns(void* arg) { + auto& ring = *static_cast(arg); + const int id = ring.nextId.fetch_add(1); + for (int round = 0; round < TURNS; ++round) { + Require(scePthreadMutexLock(&ring.mutex) == SCE_OK); + if (ring.recursive) + Require(scePthreadMutexLock(&ring.mutex) == SCE_OK); + while (ring.turn % THREADS != id) + Require((ring.timed ? scePthreadCondTimedwait(&ring.cond, &ring.mutex, 10000000) : scePthreadCondWait(&ring.cond, &ring.mutex)) == SCE_OK); + if (ring.inside.fetch_add(1) != 0) + ring.overlapped = true; + ++ring.turn; + ++ring.total; + ring.inside.fetch_sub(1); + Require(scePthreadCondBroadcast(&ring.cond) == SCE_OK); + if (ring.recursive) + Require(scePthreadMutexUnlock(&ring.mutex) == SCE_OK); + Require(scePthreadMutexUnlock(&ring.mutex) == SCE_OK); + } + return nullptr; +} + +static void CheckCondRelock(PthreadMutexattr* attr, int type, int spins, int yields, bool timed) { + Ring ring; + ring.recursive = type == 2; + ring.timed = timed; + Require(scePthreadMutexattrSettype(attr, type) == SCE_OK); + Require(scePthreadMutexInit(&ring.mutex, attr, "ring") == SCE_OK); + Require(scePthreadMutexSetspinloops(&ring.mutex, spins) == SCE_OK); + Require(scePthreadMutexSetyieldloops(&ring.mutex, yields) == SCE_OK); + Require(scePthreadCondInit(&ring.cond, nullptr, "ring") == SCE_OK); + Pthread threads[THREADS] = {}; + for (auto& thread : threads) + Require(scePthreadCreate(&thread, nullptr, TakeTurns, &ring, nullptr) == SCE_OK); + for (auto& thread : threads) + Require(scePthreadJoin(thread, nullptr) == SCE_OK); + Require(!ring.overlapped && ring.total == THREADS * TURNS && ring.turn == THREADS * TURNS); + Require(scePthreadCondDestroy(&ring.cond) == SCE_OK); + Require(scePthreadMutexDestroy(&ring.mutex) == SCE_OK); +} + +struct Wake { + PthreadMutex mutex = nullptr; + PthreadCond cond = nullptr; + std::atomic waiting{false}; + bool signaled = false; + int depth = 1; +}; + +static void* APS5_VABI WaitForSignal(void* arg) { + auto& wake = *static_cast(arg); + for (int level = 0; level < wake.depth; ++level) + Require(scePthreadMutexLock(&wake.mutex) == SCE_OK); + wake.waiting.store(true); + while (!wake.signaled) + Require(scePthreadCondWait(&wake.cond, &wake.mutex) == SCE_OK); + for (int level = 0; level < wake.depth; ++level) + Require(scePthreadMutexUnlock(&wake.mutex) == SCE_OK); + return nullptr; +} + +static void CheckCondRelockYields(PthreadMutexattr* attr, int type, int depth) { + constexpr std::uint64_t YIELDS = 5; + Wake wake; + wake.depth = depth; + Require(scePthreadMutexattrSettype(attr, type) == SCE_OK); + Require(scePthreadMutexInit(&wake.mutex, attr, "wake") == SCE_OK); + Require(scePthreadMutexSetspinloops(&wake.mutex, 0) == SCE_OK); + Require(scePthreadMutexSetyieldloops(&wake.mutex, static_cast(YIELDS)) == SCE_OK); + Require(scePthreadCondInit(&wake.cond, nullptr, "wake") == SCE_OK); + Pthread thread = nullptr; + Require(scePthreadCreate(&thread, nullptr, WaitForSignal, &wake, nullptr) == SCE_OK); + while (!wake.waiting.load()) + std::this_thread::yield(); + Require(scePthreadMutexLock(&wake.mutex) == SCE_OK); + const auto before = MutexYieldsForTest_nid_no_patch(); + wake.signaled = true; + Require(scePthreadCondSignal(&wake.cond) == SCE_OK); + const auto deadline = std::chrono::steady_clock::now() + std::chrono::seconds(5); + while (MutexYieldsForTest_nid_no_patch() - before < YIELDS && std::chrono::steady_clock::now() < deadline) + std::this_thread::yield(); + Require(scePthreadMutexUnlock(&wake.mutex) == SCE_OK); + Require(scePthreadJoin(thread, nullptr) == SCE_OK); + Require(MutexYieldsForTest_nid_no_patch() - before == YIELDS); + Require(scePthreadCondDestroy(&wake.cond) == SCE_OK); + Require(scePthreadMutexDestroy(&wake.mutex) == SCE_OK); +} + +static void CheckRecursiveRelock(PthreadMutexattr* attr) { + PthreadMutex mutex = nullptr; + Require(scePthreadMutexattrSettype(attr, 2) == SCE_OK); + Require(scePthreadMutexInit(&mutex, attr, "recursive") == SCE_OK); + Require(scePthreadMutexSetspinloops(&mutex, 2000) == SCE_OK); + Require(scePthreadMutexSetyieldloops(&mutex, 4) == SCE_OK); + Require(scePthreadMutexLock(&mutex) == SCE_OK); + Require(scePthreadMutexLock(&mutex) == SCE_OK); + Require(scePthreadMutexTimedlock(&mutex, 0) == SCE_OK); + for (int unlock = 0; unlock < 3; ++unlock) + Require(scePthreadMutexUnlock(&mutex) == SCE_OK); + Require(scePthreadMutexDestroy(&mutex) == SCE_OK); +} + +int main() { + CheckSpinAcquire(); + PthreadMutexattr attr = nullptr; + Require(scePthreadMutexattrInit(&attr) == SCE_OK); + CheckRecursiveRelock(&attr); + for (const int type : {1, 2, 3, 4}) + CheckCondRelockYields(&attr, type, 1); + CheckCondRelockYields(&attr, 2, 2); + for (const int type : {1, 2, 3, 4}) { + CheckContention(&attr, type, 2000, 0); + CheckContention(&attr, type, 0, 4); + CheckContention(&attr, type, 100, 4); + CheckContention(&attr, type, -1, -1); + CheckCondRelock(&attr, type, 2000, 4, false); + CheckCondRelock(&attr, type, 0, 0, false); + CheckCondRelock(&attr, type, 2000, 4, true); + } + Require(scePthreadMutexattrDestroy(&attr) == SCE_OK); +} diff --git a/core/libs/tests/GuestRaiseInHostCode.cpp b/core/libs/tests/GuestRaiseInHostCode.cpp index e89332fc4c..0577bde922 100644 --- a/core/libs/tests/GuestRaiseInHostCode.cpp +++ b/core/libs/tests/GuestRaiseInHostCode.cpp @@ -1,5 +1,6 @@ #include "prx/libkernel/include/Api.hpp" #include "SceTypes.hpp" +#include "tests/TemporaryFile.hpp" #include #include #include @@ -42,7 +43,7 @@ int main() { for (int i = 0; i < 20000 && !done.load(); ++i) std::this_thread::sleep_for(std::chrono::milliseconds(1)); if (!done.load()) std::abort(); }); - shared = std::tmpfile(); + shared = TemporaryFile::Open(); Require(shared != nullptr); Require(sceKernelInstallExceptionHandler(SigUsr1, reinterpret_cast(&Handler)) == 0); Pthread writer = nullptr; diff --git a/core/libs/tests/GuestRaiseShortSleep.cpp b/core/libs/tests/GuestRaiseShortSleep.cpp new file mode 100644 index 0000000000..aca4cc3801 --- /dev/null +++ b/core/libs/tests/GuestRaiseShortSleep.cpp @@ -0,0 +1,64 @@ +#include "prx/libkernel/include/Api.hpp" +#include "prx/libkernel/Time/include/Time.hpp" +#include "SceTypes.hpp" +#include +#include +#include +#include +#include + +static constexpr int SigUsr1 = 30; +static constexpr int Raises = 100; +static void Require(bool value) { if (!value) std::abort(); } + +static std::atomic deliveries{0}; +static std::atomic stop{false}; +static std::atomic naps{0}; +static std::atomic napMicros{0}; + +static void APS5_VABI Handler(int, void*) { deliveries.fetch_add(1); } + +static void* APS5_VABI Napper(void*) { + while (!stop.load()) { + sceKernelUsleep_nid_postfix(napMicros.load()); + naps.fetch_add(1); + } + return nullptr; +} + +static void RaiseAtNapper(KernelUseconds micros) { + napMicros.store(micros); + stop.store(false); + naps.store(0); + Pthread napper = nullptr; + Require(scePthreadCreate(&napper, nullptr, Napper, nullptr, "napper") == 0); + while (naps.load() == 0) std::this_thread::yield(); + for (int raise = 0; raise < Raises; ++raise) { + const int before = deliveries.load(); + Require(sceKernelRaiseException(napper, SigUsr1) == 0); + const auto deadline = std::chrono::steady_clock::now() + std::chrono::seconds(3); + while (deliveries.load() == before) { + if (std::chrono::steady_clock::now() >= deadline) { + std::fprintf(stderr, "raise %d at a thread sleeping %u us in a loop was not delivered within 3 s (%llu sleeps since)\n", raise, micros, naps.load()); + std::abort(); + } + std::this_thread::yield(); + } + } + stop.store(true); + Require(scePthreadJoin(napper, nullptr) == 0); +} + +int main() { + std::atomic done{false}; + std::thread watchdog([&done] { + for (int i = 0; i < 20000 && !done.load(); ++i) std::this_thread::sleep_for(std::chrono::milliseconds(1)); + if (!done.load()) std::abort(); + }); + Require(sceKernelInstallExceptionHandler(SigUsr1, reinterpret_cast(&Handler)) == 0); + for (const KernelUseconds micros : {100u, 200u, 400u}) RaiseAtNapper(micros); + Require(sceKernelRemoveExceptionHandler(SigUsr1) == 0); + std::printf("%d raises delivered\n", deliveries.load()); + done.store(true); + watchdog.join(); +} diff --git a/core/libs/tests/GuestRazorCpu.cpp b/core/libs/tests/GuestRazorCpu.cpp index 63f449ac1d..2a4cf35466 100644 --- a/core/libs/tests/GuestRazorCpu.cpp +++ b/core/libs/tests/GuestRazorCpu.cpp @@ -4,12 +4,17 @@ #include #include #include -#include namespace { void Require(bool value) { if (!value) std::abort(); } +int g_markerCallbacks = 0; + +void APS5_VABI CountMarkerCallback() { + ++g_markerCallbacks; +} + } int main() { @@ -80,12 +85,43 @@ int main() { Require(sceRazorCpuUnTagBuffer(3, buffer) == 0); Require(sceRazorCpuIsCapturing() == 0); - bool threw = false; - try { - sceRazorCpuGetDataTagStorageSize(16); + Require(sceRazorCpuGetDataTagStorageSize(0) == 0); + Require(sceRazorCpuGetDataTagStorageSize(16) == 0); + Require(sceRazorCpuGetDataTagStorageSize(0xffffffffu) == 0); - } catch (const std::runtime_error&) { - threw = true; - } - Require(threw); + const auto callback = reinterpret_cast(&CountMarkerCallback); + sceRazorCpuSetPushMarkerCallback(callback); + sceRazorCpuSetPushMarkerStaticCallback(callback); + sceRazorCpuSetPopMarkerCallback(callback); + Require(sceRazorCpuPushMarker("callback", 0x80ffffffu, 0) == 0); + Require(sceRazorCpuPushMarkerStatic("callback", 0x80ffffffu, 0) == 0); + Require(sceRazorCpuPopMarker() == 0); + Require(sceRazorCpuPopMarker() == 0); + Require(g_markerCallbacks == 0); + sceRazorCpuSetPushMarkerCallback(nullptr); + sceRazorCpuSetPushMarkerStaticCallback(nullptr); + sceRazorCpuSetPopMarkerCallback(nullptr); + + std::uint8_t context[16]{}; + Require(sceRazorCpuInitializeGpuMarkerContext(nullptr) == 22); + Require(sceRazorCpuInitializeGpuMarkerContext(context) == 22); + context[0] = 2; + Require(sceRazorCpuInitializeGpuMarkerContext(context) == 22); + context[0] = 1; + context[1] = 1; + Require(sceRazorCpuInitializeGpuMarkerContext(context) == 0); + Require(context[0] == 1 && context[1] == 1); + for (std::size_t index = 2; index < sizeof(context); ++index) Require(context[index] == 0); + Require(sceRazorCpuGpuMarkerSync() == 0); + Require(sceRazorCpuPushMarker("gpu", 0x80ffffffu, 0) == 0); + Require(sceRazorCpuPopMarker() == 0); + + Require(sceRazorCpuFiberLogNameChange() == 0); + Require(sceRazorCpuFiberSwitch() == 0); + Require(sceRazorCpuWorkloadSubmit() == 0); + Require(sceRazorCpuWorkloadRunBegin() == 0); + Require(sceRazorCpuWorkloadRunEnd() == 0); + Require(sceRazorCpuStartCaptureInternal() == static_cast(0x80580000)); + Require(sceRazorCpuStopCaptureInternal() == static_cast(0x80580000)); + Require(sceRazorCpuIsCapturing() == 0); } diff --git a/core/libs/tests/GuestRudpUnconnected.cpp b/core/libs/tests/GuestRudpUnconnected.cpp new file mode 100644 index 0000000000..208fdabe42 --- /dev/null +++ b/core/libs/tests/GuestRudpUnconnected.cpp @@ -0,0 +1,104 @@ +#include "prx/libSceRudp/include/Api.hpp" +#include "SceTypes.hpp" + +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#else +#include +#endif + +namespace { + +constexpr int NotInitialized = static_cast(0x80770001u); +constexpr int InvalidContext = static_cast(0x80770003u); +constexpr int InvalidArgument = static_cast(0x80770004u); +constexpr int NotAcceptable = static_cast(0x80770011u); + +using FlushFn = int (APS5_VABI*)(int); +using BufferStatusFn = int (APS5_VABI*)(int, void*, std::size_t); + +template +Function Resolve(const char* name) { +#ifdef _WIN32 + void* symbol = reinterpret_cast(GetProcAddress(LoadLibraryA("libSceRudp.prx"), name)); +#else + void* symbol = dlsym(RTLD_DEFAULT, name); +#endif + if (!symbol) { + std::fprintf(stderr, "%s is not exported by libSceRudp\n", name); + std::abort(); + } + return reinterpret_cast(symbol); +} + +void Require(bool condition, const char* message) { + if (condition) return; + std::fprintf(stderr, "Rudp unconnected: %s\n", message); + std::abort(); +} + +void APS5_VABI Handler(int, int, int, void*) {} + +bool RemoteInfoUntouched(int context, int expected) { + std::array address; + address.fill(0x5a); + std::uint32_t addressSize = 0x1c; + std::uint16_t port = 0x5a5a; + if (sceRudpGetRemoteInfo(context, address.data(), &addressSize, &port) != expected) return false; + for (const auto byte : address) { + if (byte != 0x5a) return false; + } + return addressSize == 0x1c && port == 0x5a5a && sceRudpGetRemoteInfo(context, nullptr, nullptr, nullptr) == expected; +} + +bool BufferStatusIs(BufferStatusFn bufferStatus, int context, std::size_t size, int expected, std::uint8_t fill) { + std::array status; + status.fill(0x5a); + if (bufferStatus(context, status.data(), size) != expected) return false; + for (std::size_t index = 0; index < status.size(); ++index) { + if (status[index] != (index < size ? fill : 0x5a)) return false; + } + return true; +} + +} + +int main() { + const auto flush = Resolve("sceRudpFlush"); + const auto bufferStatus = Resolve("sceRudpGetContextBufferStatus"); + alignas(16) static std::array pool{}; + + Require(flush(0) == NotInitialized && flush(-1) == NotInitialized, "a flush before sceRudpInit did not return NOT_INITIALIZED"); + Require(RemoteInfoUntouched(0, NotInitialized), "remote info before sceRudpInit did not return NOT_INITIALIZED"); + Require(BufferStatusIs(bufferStatus, 0, 16, NotInitialized, 0x5a) && bufferStatus(-1, nullptr, 0) == NotInitialized, "a buffer status before sceRudpInit did not return NOT_INITIALIZED"); + + Require(sceRudpInit_nid_postfix(pool.data(), static_cast(pool.size())) == 0, "sceRudpInit failed"); + Require(flush(-1) == InvalidArgument && flush(0) == InvalidContext && flush(12345) == InvalidContext, "a flush without a context was not refused in order"); + Require(RemoteInfoUntouched(-1, InvalidArgument) && RemoteInfoUntouched(12345, InvalidContext), "remote info without a context was not refused in order"); + Require(BufferStatusIs(bufferStatus, -1, 16, InvalidArgument, 0x5a) && BufferStatusIs(bufferStatus, 12345, 16, InvalidContext, 0x5a), "a buffer status without a context was not refused in order"); + Require(bufferStatus(12345, nullptr, 16) == InvalidArgument && BufferStatusIs(bufferStatus, 12345, 0, InvalidArgument, 0x5a) && BufferStatusIs(bufferStatus, 12345, 17, InvalidArgument, 0x5a), "the buffer status arguments were not checked before the context"); + Require(BufferStatusIs(bufferStatus, 12345, static_cast(0x100000010ull), InvalidArgument, 0x5a), "a buffer status size above 32 bits was cut"); + + int context = -1; + Require(sceRudpCreateContext(Handler, nullptr, &context) == 0 && context >= 0, "sceRudpCreateContext failed"); + Require(flush(context) == NotAcceptable, "a flush on an unconnected context did not return NOT_ACCEPTABLE"); + Require(RemoteInfoUntouched(context, NotAcceptable), "remote info on an unconnected context did not return NOT_ACCEPTABLE"); + for (std::size_t size = 1; size <= 16; ++size) { + Require(BufferStatusIs(bufferStatus, context, size, 0, 0), "the buffer status was not size zero bytes"); + } + Require(BufferStatusIs(bufferStatus, context, 17, InvalidArgument, 0x5a), "a buffer status of 17 bytes was taken"); + + Require(sceRudpTerminate(context) == 0, "sceRudpTerminate failed"); + Require(flush(context) == InvalidContext && RemoteInfoUntouched(context, InvalidContext) && BufferStatusIs(bufferStatus, context, 16, InvalidContext, 0x5a), "a terminated context was taken"); + Require(sceRudpEnd() == 0, "sceRudpEnd failed"); + Require(flush(context) == NotInitialized && RemoteInfoUntouched(context, NotInitialized) && BufferStatusIs(bufferStatus, context, 16, NotInitialized, 0x5a), "a call after sceRudpEnd did not return NOT_INITIALIZED"); + + std::puts("Rudp unconnected tests passed"); + return 0; +} diff --git a/core/libs/tests/GuestSaveDataHostSpace.cpp b/core/libs/tests/GuestSaveDataHostSpace.cpp new file mode 100644 index 0000000000..c845121d1a --- /dev/null +++ b/core/libs/tests/GuestSaveDataHostSpace.cpp @@ -0,0 +1,294 @@ +#include "prx/libSceSaveData/include/Api.hpp" +#include "prx/libSceSaveData.native/include/SaveDataHostSpace.hpp" +#include "prx/libSceSaveData.native/include/Api.hpp" +#include "SceTypes.hpp" +#include "prx/libc/include/general/VabiMacros.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#endif + +namespace { + +constexpr std::uint32_t MountReadWrite = 2; +constexpr std::uint32_t MountCreate2 = 32; +constexpr int SaveDataErrorParameter = -2137063424; +constexpr int SaveDataErrorNoSpaceFs = -2137063414; +constexpr std::uint64_t BlockBytes = 65536; + +int failures = 0; + +std::uint64_t fakeAvailable = 0; +int fakeCalls = 0; +bool fakeFails = false; + +std::uint64_t FakeFreeSpace(const std::string&) { + ++fakeCalls; + if (fakeFails) throw std::runtime_error("fake volume query failed"); + return fakeAvailable; +} + +void Check(bool condition, const std::string& what) { + if (condition) return; + std::fprintf(stderr, "savedata host space check failed: %s\n", what.c_str()); + ++failures; +} + +void SetFreeSpaceVariable(const char* value) { +#ifdef _WIN32 + _putenv_s("ANYPS5_FREE_SPACE", value != nullptr ? value : ""); +#else + if (value == nullptr) { + unsetenv("ANYPS5_FREE_SPACE"); + } else { + setenv("ANYPS5_FREE_SPACE", value, 1); + } +#endif +} + +int Mount(const char* name, std::uint32_t mode, std::uint64_t blocks, SaveDataMountResult* result) { + SceSaveDataDirName dirName{}; + std::snprintf(dirName.data, sizeof(dirName.data), "%s", name); + SaveDataMount3 mount{}; + mount.user_id = 1; + mount.dir_name = &dirName; + mount.mount_mode = mode; + mount.blocks = blocks; + return sceSaveDataMount3(&mount, result); +} + +void CheckValidValuesMount() { + const char* values[] = {nullptr, "fixed", "host"}; + int index = 0; + for (const char* value : values) { + SetFreeSpaceVariable(value); + const std::string name = "HS_VALID_" + std::to_string(index++); + SaveDataMountResult result{}; + const int code = Mount(name.c_str(), MountReadWrite | MountCreate2, 96, &result); + Check(code == 0, "a valid ANYPS5_FREE_SPACE value lets a save be created (" + name + ")"); + if (code == 0) Check(sceSaveDataUmount2(0, &result.mount_point) == 0, "the created save unmounts (" + name + ")"); + } + SetFreeSpaceVariable(nullptr); +} + +void CheckInvalidValueStopsMount() { + SetFreeSpaceVariable("bogus"); + SaveDataMountResult result{}; + std::string message; + try { + Mount("HS_BOGUS", MountReadWrite | MountCreate2, 96, &result); + } catch (const std::runtime_error& error) { + message = error.what(); + } + Check(message.find("ANYPS5_FREE_SPACE") != std::string::npos, "an invalid ANYPS5_FREE_SPACE throws an error naming the variable"); + Check(!std::filesystem::exists("_sd/HS_BOGUS"), "an invalid ANYPS5_FREE_SPACE stops the mount before a save is created"); + + message.clear(); + try { + Mount("HS_BOGUS", MountReadWrite, 0, &result); + } catch (const std::runtime_error& error) { + message = error.what(); + } + Check(message.find("ANYPS5_FREE_SPACE") != std::string::npos, "an open mount with an invalid ANYPS5_FREE_SPACE also throws"); + SetFreeSpaceVariable(nullptr); +} + +#ifndef _WIN32 +void CheckEmptyValueStopsMount() { + SetFreeSpaceVariable(""); + SaveDataMountResult result{}; + std::string message; + try { + Mount("HS_EMPTY", MountReadWrite | MountCreate2, 96, &result); + } catch (const std::runtime_error& error) { + message = error.what(); + } + Check(message.find("ANYPS5_FREE_SPACE") != std::string::npos, "an empty ANYPS5_FREE_SPACE throws an error naming the variable"); + Check(!std::filesystem::exists("_sd/HS_EMPTY"), "an empty ANYPS5_FREE_SPACE stops the mount before a save is created"); + SetFreeSpaceVariable(nullptr); +} +#endif + +void CheckHostRoom() { + SetFreeSpaceVariable("host"); + SetSaveDataFreeSpaceSourceForTest_nid_no_patch(FakeFreeSpace); + SaveDataMountResult result{}; + + fakeAvailable = 0; + fakeCalls = 0; + result = SaveDataMountResult{}; + int code = Mount("HS_FULL", MountReadWrite | MountCreate2, 96, &result); + Check(code == SaveDataErrorNoSpaceFs, "a save the full volume cannot hold is NO_SPACE_FS"); + Check(result.required_blocks == 96, "a full volume reports every requested block as required"); + Check(!std::filesystem::exists("_sd/HS_FULL"), "a refused save creates no directory"); + Check(fakeCalls == 1, "the volume is queried once per create"); + + fakeAvailable = 96 * BlockBytes - 1; + result = SaveDataMountResult{}; + code = Mount("HS_TINY", MountReadWrite | MountCreate2, 96, &result); + Check(code == SaveDataErrorNoSpaceFs && result.required_blocks == 1, "one byte short reports one block required"); + Check(!std::filesystem::exists("_sd/HS_TINY"), "a one-byte-short save creates no directory"); + + fakeAvailable = 96 * BlockBytes; + code = Mount("HS_EXACT", MountReadWrite | MountCreate2, 96, &result); + Check(code == 0, "a volume with exactly the requested room creates the save"); + if (code == 0) Check(sceSaveDataUmount2(0, &result.mount_point) == 0, "the exact-room save unmounts"); + + fakeAvailable = UINT64_MAX; + code = Mount("HS_HUGE", MountReadWrite | MountCreate2, 0, &result); + Check(code == 0, "a volume with unbounded room creates a default-size save"); + if (code == 0) Check(sceSaveDataUmount2(0, &result.mount_point) == 0, "the huge-room save unmounts"); + + fakeAvailable = 16384 * BlockBytes - 1; + result = SaveDataMountResult{}; + code = Mount("HS_DEFAULT", MountReadWrite | MountCreate2, 0, &result); + Check(code == SaveDataErrorNoSpaceFs && result.required_blocks == 1, "a default-size save needs the full 16384 blocks"); + + fakeFails = true; + code = Mount("HS_ERROR", MountReadWrite | MountCreate2, 96, &result); + Check(code == 0, "a failed volume query keeps today's behaviour and creates the save"); + if (code == 0) Check(sceSaveDataUmount2(0, &result.mount_point) == 0, "the save created after a failed query unmounts"); + fakeFails = false; + + fakeAvailable = UINT64_MAX; + code = Mount("HS_OPEN", MountReadWrite | MountCreate2, 96, &result); + Check(code == 0, "the save to reopen is created while the volume has room"); + if (code == 0) Check(sceSaveDataUmount2(0, &result.mount_point) == 0, "the save to reopen unmounts"); + fakeAvailable = 0; + code = Mount("HS_OPEN", MountReadWrite, 0, &result); + Check(code == 0, "a full volume still opens an existing save"); + if (code == 0) Check(sceSaveDataUmount2(0, &result.mount_point) == 0, "the opened save unmounts"); + + SetFreeSpaceVariable(nullptr); + fakeAvailable = 0; + fakeCalls = 0; + code = Mount("HS_FIXED", MountReadWrite | MountCreate2, 96, &result); + Check(code == 0, "the default fixed mode creates a save on a full volume"); + Check(fakeCalls == 0, "the default fixed mode never queries the volume"); + if (code == 0) Check(sceSaveDataUmount2(0, &result.mount_point) == 0, "the fixed-mode save unmounts"); + + SetSaveDataFreeSpaceSourceForTest_nid_no_patch(nullptr); +} + +std::uint64_t MountInfoFreeBlocks(const char* name, std::uint64_t* blocks) { + SceSaveDataDirName dirName{}; + std::snprintf(dirName.data, sizeof(dirName.data), "%s", name); + SaveDataMount3 mount{}; + mount.user_id = 1; + mount.dir_name = &dirName; + mount.mount_mode = MountReadWrite; + SaveDataMountResult result{}; + Check(sceSaveDataMount3(&mount, &result) == 0, std::string("open for mount info: ") + name); + SaveDataMountInfo info{}; + Check(sceSaveDataGetMountInfo(&result.mount_point, &info) == 0, std::string("mount info of ") + name); + Check(sceSaveDataUmount2(0, &result.mount_point) == 0, std::string("unmount after mount info: ") + name); + *blocks = info.blocks; + return info.free_blocks; +} + +std::uint64_t SearchFreeBlocks(const char* pattern, std::uint64_t* blocks) { + SceSaveDataDirName patternName{}; + std::snprintf(patternName.data, sizeof(patternName.data), "%s", pattern); + SaveDataDirNameSearchCond cond{}; + cond.user_id = 1; + cond.dir_name = &patternName; + cond.key = 5; + cond.order = 0; + SceSaveDataDirName names[1]{}; + SaveDataSearchInfo infos[1]{}; + SaveDataDirNameSearchResult result{}; + result.dir_names = names; + result.dir_names_num = 1; + result.infos = infos; + Check(sceSaveDataDirNameSearch(&cond, &result) == 0, "free-blocks search succeeds"); + Check(result.set_num == 1, "free-blocks search finds the save"); + *blocks = infos[0].blocks; + return infos[0].free_blocks; +} + +void CheckHostFreeBlocks() { + SetFreeSpaceVariable("host"); + SetSaveDataFreeSpaceSourceForTest_nid_no_patch(FakeFreeSpace); + SaveDataMountResult result{}; + fakeAvailable = UINT64_MAX; + const int created = Mount("HS_INFO", MountReadWrite | MountCreate2, 200, &result); + Check(created == 0, "a save with 200 blocks is created"); + if (created == 0) Check(sceSaveDataUmount2(0, &result.mount_point) == 0, "the new save unmounts"); + { + std::ofstream data("_sd/HS_INFO/data.bin", std::ios::binary); + const std::string bytes(40000, 'x'); + data.write(bytes.data(), static_cast(bytes.size())); + } + + std::uint64_t blocks = 0; + fakeAvailable = UINT64_MAX; + Check(MountInfoFreeBlocks("HS_INFO", &blocks) == 199 && blocks == 200, "an unbounded volume reports the save's own free blocks"); + fakeAvailable = 10 * BlockBytes + 5; + Check(MountInfoFreeBlocks("HS_INFO", &blocks) == 10 && blocks == 200, "mount info is bounded by the blocks the volume has"); + Check(SearchFreeBlocks("HS_INF%", &blocks) == 10 && blocks == 200, "the search reports the same bound"); + fakeAvailable = 0; + Check(MountInfoFreeBlocks("HS_INFO", &blocks) == 0, "a full volume reports no free blocks"); + fakeFails = true; + Check(MountInfoFreeBlocks("HS_INFO", &blocks) == 199, "a failed volume query reports the save's own free blocks"); + fakeFails = false; + + SetFreeSpaceVariable(nullptr); + fakeAvailable = 0; + fakeCalls = 0; + Check(MountInfoFreeBlocks("HS_INFO", &blocks) == 199, "the default fixed mode reports the save's own free blocks"); + Check(fakeCalls == 0, "the default fixed mode never bounds free blocks by the volume"); + SetSaveDataFreeSpaceSourceForTest_nid_no_patch(nullptr); +} + +void CheckDefaultVolumeQuery() { + SetFreeSpaceVariable("host"); + SetSaveDataFreeSpaceSourceForTest_nid_no_patch(nullptr); + SaveDataMountResult result{}; + const int created = Mount("HS_REAL", MountReadWrite | MountCreate2, 1, &result); + Check(created == 0, "a 1-block save is created with the default volume query"); + if (created == 0) Check(sceSaveDataUmount2(0, &result.mount_point) == 0, "the default-query save unmounts"); + + std::uint64_t blocks = 0; + Check(MountInfoFreeBlocks("HS_REAL", &blocks) > 0, "the default volume query reports room for a 1-block save"); + SetFreeSpaceVariable(nullptr); +} + +} // namespace + +int main() { + const auto previous = std::filesystem::current_path(); + std::mt19937_64 random(std::random_device{}()); + const auto root = std::filesystem::temp_directory_path() / ("anyps5-savedata-host-space-" + std::to_string(random())); + std::filesystem::create_directories(root); + std::filesystem::current_path(root); + sceSaveDataInitialize3(nullptr); + + CheckValidValuesMount(); + CheckInvalidValueStopsMount(); + CheckHostRoom(); + CheckHostFreeBlocks(); + CheckDefaultVolumeQuery(); +#ifndef _WIN32 + CheckEmptyValueStopsMount(); +#endif + + sceSaveDataTerminate(); + std::filesystem::current_path(previous); + std::error_code ignored; + std::filesystem::remove_all(root, ignored); + if (failures != 0) { + std::fprintf(stderr, "%d savedata host space check(s) failed\n", failures); + return 1; + } + std::printf("savedata host space tests passed\n"); + return 0; +} diff --git a/core/libs/tests/GuestSaveDataMountStatus.cpp b/core/libs/tests/GuestSaveDataMountStatus.cpp index 8370e3a5ae..a4b1e81ae6 100644 --- a/core/libs/tests/GuestSaveDataMountStatus.cpp +++ b/core/libs/tests/GuestSaveDataMountStatus.cpp @@ -1,6 +1,7 @@ #include "prx/libSceSaveData/include/Api.hpp" #include "prx/libSceSaveData.native/include/Api.hpp" #include "prx/libc/include/general/VabiMacros.hpp" +#include "prx/libc/include/General.hpp" #include "SceTypes.hpp" #include #include @@ -316,6 +317,64 @@ void CheckMountCapacityAndLifecycle() { for (const auto& mount : mounted) Check(sceSaveDataUmount2(0, &mount.mount_point) == 0, "capacity unmount succeeds"); } +void CheckHostMountFailures() { + const auto previous = std::filesystem::current_path(); + const auto root = previous / "mount-host-failures"; + std::filesystem::create_directories(root / "previous-alias"); + std::filesystem::current_path(root); + const auto writeFixture = [](const char* path, const char* text) { + auto* file = std::fopen(path, "wb"); + Check(file != nullptr, std::string("open fixture ") + path); + if (file == nullptr) return; + const bool written = std::fputs(text, file) >= 0; + const bool closed = std::fclose(file) == 0; + Check(written && closed, std::string("write fixture ") + path); + }; + const auto checkFailure = [&](const char* name, std::uint32_t mode, std::uint64_t blocks, const std::string& label) { + SceSaveDataDirName directory{}; + std::snprintf(directory.data, sizeof(directory.data), "%s", name); + SaveDataMount3 request{}; + request.dir_name = &directory; + request.mount_mode = mode; + request.blocks = blocks; + SaveDataMountResult result; + std::memset(&result, 0xCD, sizeof(result)); + const auto before = result; + const auto alias = std::filesystem::absolute("previous-alias").string(); + AddPathAlias_nid_no_patch("/savedata0", alias.c_str()); + const auto resolvedBefore = ResolvePath_nid_no_patch("/savedata0/probe"); + try { + Check(sceSaveDataMount3(&request, &result) == static_cast(0x809F000B), label + " returns INTERNAL"); + } catch (const std::exception& error) { + Check(false, label + " throws: " + error.what()); + } + Check(std::memcmp(&result, &before, sizeof(result)) == 0, label + " preserves the mount result"); + Check(ResolvePath_nid_no_patch("/savedata0/probe") == resolvedBefore, label + " preserves the path alias"); + SaveDataMountPoint point{}; + std::memcpy(point.data, "/savedata0", sizeof("/savedata0")); + SaveDataMountInfo info{}; + const auto mounted = sceSaveDataGetMountInfo(&point, &info); + Check(mounted == SaveDataErrorNotMounted, label + " consumes no mount slot"); + if (mounted == 0) sceSaveDataUmount2(0, &point); + RemovePathAlias_nid_no_patch("/savedata0"); + }; + writeFixture("_sd", "not a directory"); + for (const auto mode : {MountReadWrite | MountCreate, MountReadWrite | MountCreate2}) { + checkFailure("blocked", mode, 96, "save-root file with mode " + std::to_string(mode)); + Check(std::filesystem::is_regular_file("_sd"), "a failed mount preserves the blocking file"); + } + Check(std::filesystem::remove("_sd"), "remove the blocked save-root fixture"); + std::filesystem::create_directories("_sd/metadata.blocks"); + writeFixture("_sd/metadata.blocks/keep", "preserve this directory"); + checkFailure("metadata", MountReadWrite | MountCreate2, 96, "size metadata path is a directory"); + Check(!std::filesystem::exists("_sd/metadata"), "failed size persistence removes the newly created empty save"); + Check(std::filesystem::is_regular_file("_sd/metadata.blocks/keep"), "failed size persistence preserves the blocking directory"); + std::filesystem::remove_all("_sd/metadata.blocks"); + MountAndCheck("metadata", MountReadWrite | MountCreate2, 1u, "mount after repairing host storage"); + std::filesystem::current_path(previous); + std::filesystem::remove_all(root); +} + } int main() { @@ -328,6 +387,7 @@ int main() { CheckUnmountedCalls(); Check(sceSaveDataSyncSaveDataMemory(nullptr) == static_cast(0x809F0000), "null param rejected in memory sync"); Check(sceSaveDataInitialize3(nullptr) == 0, "SaveData initializes"); + CheckHostMountFailures(); CheckMountCapacityAndLifecycle(); MountAndCheck("fresh", MountReadWrite | MountCreate2, 1u, "CREATE2 of a missing save"); MountAndCheck("fresh", MountReadWrite | MountCreate2, 0u, "CREATE2 of an existing save"); diff --git a/core/libs/tests/GuestSceNet.cpp b/core/libs/tests/GuestSceNet.cpp index 37768ecdb9..b88e06ba9f 100644 --- a/core/libs/tests/GuestSceNet.cpp +++ b/core/libs/tests/GuestSceNet.cpp @@ -20,6 +20,7 @@ #include "prx/libkernel/Time/include/Time.hpp" #include "prx/libSceNet/src/ResolverTestHooks.hpp" #include "SceTypes.hpp" +#include "tests/TemporaryFile.hpp" #include #include #include @@ -91,7 +92,7 @@ static bool Failed(std::int64_t result, int error) { template static std::string CaptureStdout(TBody body) { std::fflush(stdout); - std::FILE* capture = std::tmpfile(); + std::FILE* capture = TemporaryFile::Open(); Require(capture != nullptr); #ifdef _WIN32 const int saved = _dup(_fileno(stdout)); @@ -189,7 +190,7 @@ static void CheckStreamSender(int family) { template static std::string CaptureDiagnostic(Diagnostic diagnostic) { - auto* file = std::tmpfile(); + auto* file = TemporaryFile::Open(); Require(file != nullptr); Require(std::fflush(stdout) == 0); #ifdef _WIN32 @@ -2211,7 +2212,12 @@ int main() { for (int i = 0; i < 16; ++i) { Require(in6addr_any_nid_postfix[i] == 0); Require(in6addr_loopback_nid_postfix[i] == (i == 15 ? 1 : 0)); + Require(sce_net_in6addr_loopback_nid_postfix[i] == (i == 15 ? 1 : 0)); + Require(sce_net_in6addr_nodelocal_allnodes_nid_postfix[i] == (i == 0 ? 0xff : i == 1 || i == 15 ? 1 : 0)); + Require(sce_net_in6addr_linklocal_allrouters_nid_postfix[i] == (i == 0 ? 0xff : i == 1 || i == 15 ? 2 : 0)); } + Require(sce_net_dummy_nid_postfix == 0); + Require(&sce_net_in6addr_loopback_nid_postfix[0] != &in6addr_loopback_nid_postfix[0]); for (const int flags : {0, 1, -1}) { Require(sceNetClearDnsCache(flags) == static_cast(0x804101C8)); Require(*sceNetErrnoLoc() == 200); diff --git a/core/libs/tests/GuestSchedParams.cpp b/core/libs/tests/GuestSchedParams.cpp index d8493598e1..e199d9bfd3 100644 --- a/core/libs/tests/GuestSchedParams.cpp +++ b/core/libs/tests/GuestSchedParams.cpp @@ -4,6 +4,8 @@ #include "prx/libc/include/general/VabiMacros.hpp" #include #include +#include +#include static constexpr int GUEST_EPERM = 1; static constexpr int GUEST_ESRCH = 3; @@ -74,6 +76,8 @@ static void CheckTargets() { REQUIRE(FailsWith(sched_setparam_nid_postfix(0, reinterpret_cast(0x10)), GUEST_EFAULT)); *__error_nid_postfix() = 0; REQUIRE(FailsWith(sched_setparam_nid_postfix(self + 1, nullptr), GUEST_EFAULT)); + *__error_nid_postfix() = 0; + REQUIRE(FailsWith(sched_setparam_nid_postfix(self + 1, reinterpret_cast(0x10)), GUEST_EFAULT)); } static constexpr int WorkerPriority = 700; @@ -136,6 +140,31 @@ static void CheckOutOfRange() { } #ifndef __APPLE__ +static void* APS5_VABI UnregisteredMainWorker(void*) { + const int pid = getpid_nid_postfix(); + *__error_nid_postfix() = 0; + REQUIRE(FailsWith(sched_setparam_nid_postfix(pid, reinterpret_cast(0x10)), GUEST_EFAULT)); + const KernelSchedParam workerParam{400}; + REQUIRE(pthread_setschedparam_nid_postfix(scePthreadSelf(), SCHED_RR_POLICY, &workerParam) == 0); + KernelSchedParam param{-1}; + try { + const int result = sched_getparam_nid_postfix(pid, ¶m); + REQUIRE(result != 0 || param.sched_priority != workerParam.sched_priority); + } catch (const std::runtime_error&) {} + try { + REQUIRE(sched_getscheduler_nid_postfix(pid) != SCHED_RR_POLICY); + } catch (const std::runtime_error&) {} + return nullptr; +} + +static void CheckBeforeMainPthreadCall() { + std::thread worker([] { UnregisteredMainWorker(nullptr); }); + worker.join(); + Pthread guestWorker = nullptr; + REQUIRE(scePthreadCreate(&guestWorker, nullptr, UnregisteredMainWorker, nullptr, "unregistered") == 0); + REQUIRE(scePthreadJoin(guestWorker, nullptr) == 0); +} + static void CheckOwnPid() { KernelSchedParam original{}; REQUIRE(sched_getparam_nid_postfix(0, &original) == 0); @@ -146,11 +175,45 @@ static void CheckOwnPid() { KernelSchedParam reported{-1}; REQUIRE(sched_getparam_nid_postfix(self, &reported) == 0 && reported.sched_priority == 600); REQUIRE(sched_getscheduler_nid_postfix(self) == policy); - REQUIRE(sched_setparam_nid_postfix(self, &original) == 0); + for (const int mainPolicy : {SCHED_FIFO_POLICY, SCHED_RR_POLICY}) { + REQUIRE(pthread_setschedparam_nid_postfix(scePthreadSelf(), mainPolicy, &mainParam) == 0); + std::thread worker([=] { + const int workerPolicy = mainPolicy == SCHED_FIFO_POLICY ? SCHED_RR_POLICY : SCHED_FIFO_POLICY; + const KernelSchedParam workerParam{400}; + REQUIRE(pthread_setschedparam_nid_postfix(scePthreadSelf(), workerPolicy, &workerParam) == 0); + KernelSchedParam value{-1}; + REQUIRE(sched_getparam_nid_postfix(self, &value) == 0 && value.sched_priority == 600); + REQUIRE(sched_getscheduler_nid_postfix(self) == mainPolicy); + const KernelSchedParam changed{500}; + REQUIRE(sched_setparam_nid_postfix(self, &changed) == 0); + REQUIRE(sched_getparam_nid_postfix(self, &value) == 0 && value.sched_priority == 500); + REQUIRE(sched_getscheduler_nid_postfix(self) == mainPolicy); + REQUIRE(sched_getparam_nid_postfix(0, &value) == 0 && value.sched_priority == 400); + REQUIRE(sched_getscheduler_nid_postfix(0) == workerPolicy); + const KernelSchedParam rejected{768}; + *__error_nid_postfix() = 0; + REQUIRE(FailsWith(sched_setparam_nid_postfix(self, &rejected), GUEST_EPERM)); + *__error_nid_postfix() = 0; + REQUIRE(FailsWith(sched_getparam_nid_postfix(self, nullptr), GUEST_EFAULT)); + *__error_nid_postfix() = 0; + REQUIRE(FailsWith(sched_setparam_nid_postfix(self, nullptr), GUEST_EFAULT)); + *__error_nid_postfix() = 0; + REQUIRE(FailsWith(sched_getparam_nid_postfix(self, reinterpret_cast(0x10)), GUEST_EFAULT)); + *__error_nid_postfix() = 0; + REQUIRE(FailsWith(sched_setparam_nid_postfix(self, reinterpret_cast(0x10)), GUEST_EFAULT)); + }); + worker.join(); + REQUIRE(sched_getparam_nid_postfix(0, &reported) == 0 && reported.sched_priority == 500); + REQUIRE(sched_getscheduler_nid_postfix(0) == mainPolicy); + } + REQUIRE(pthread_setschedparam_nid_postfix(scePthreadSelf(), policy, &original) == 0); } #endif int main() { +#ifndef __APPLE__ + CheckBeforeMainPthreadCall(); +#endif CheckCallingThread(); CheckTargets(); CheckOtherThread(); diff --git a/core/libs/tests/GuestSemaphore.cpp b/core/libs/tests/GuestSemaphore.cpp index 89fc2cc852..4ef7bdb093 100644 --- a/core/libs/tests/GuestSemaphore.cpp +++ b/core/libs/tests/GuestSemaphore.cpp @@ -34,6 +34,11 @@ static void RequireInvalidArguments() { if (attr >= 0x100 && attr <= 0x102) continue; Require(sceKernelCreateSema(&rejected, "rejected", attr, 0, 1, nullptr) == SCE_KERNEL_ERROR_EINVAL); } + for (const std::uint32_t attr : {0x100u, 0x101u, 0x102u}) { + KernelSema accepted = nullptr; + Require(sceKernelCreateSema(&accepted, "accepted", attr, 0, 1, nullptr) == SCE_OK); + Require(sceKernelDeleteSema(accepted) == SCE_OK); + } for (const std::uint32_t attr : {0x1000u, 0x10000u, 0x80000000u, 0xffffffffu}) Require(sceKernelCreateSema(&rejected, "rejected", attr, 0, 1, nullptr) == SCE_KERNEL_ERROR_EINVAL); Require(rejected == nullptr); diff --git a/core/libs/tests/GuestSendfile.cpp b/core/libs/tests/GuestSendfile.cpp index f2fac5d3cc..6ec7da5f8f 100644 --- a/core/libs/tests/GuestSendfile.cpp +++ b/core/libs/tests/GuestSendfile.cpp @@ -69,6 +69,17 @@ int main() { Require(Fails(sendfile_nid_postfix(file, pair[0], 0, 0, &tooMany, &sent, 0), 22) && sent == 77); const GuestSendfileHeaders negative{nullptr, 0, trailer, -1}; Require(Fails(sendfile_nid_postfix(file, pair[0], 0, 0, &negative, &sent, 0), 22) && sent == 77); + sent = 77; + Require(Fails(sendfile_nid_postfix(file, pair[0], 0, 0, reinterpret_cast(0x10), &sent, 0), 14) && sent == 77); + int unwritable[2]; + Require(socketpair_nid_postfix(1, 1, 0, unwritable) == 0); + Require(sendfile_nid_postfix(file, unwritable[0], 0, 16, nullptr, reinterpret_cast(0x10), 0) == 0); + Require(Receive(unwritable[1], 16) == content.substr(0, 16)); + Require(close_nid_postfix(unwritable[0]) == 0 && close_nid_postfix(unwritable[1]) == 0); + const GuestSendfileHeaders badHeaderIov{reinterpret_cast(0x10), 1, nullptr, 0}; + Require(Fails(sendfile_nid_postfix(file, pair[0], 0, 0, &badHeaderIov, &sent, 0), 14) && sent == 77); + const GuestSendfileHeaders badTrailerIov{nullptr, 0, reinterpret_cast(0x10), 1}; + Require(Fails(sendfile_nid_postfix(file, pair[0], 0, 0, &badTrailerIov, &sent, 0), 14) && sent == 77); Require(Fails(sendfile_nid_postfix(pair[1], pair[0], 0, 0, nullptr, &sent, 0), 22) && sent == 0); sent = 77; Require(Fails(sendfile_nid_postfix(file, file, 0, 0, nullptr, &sent, 0), 38) && sent == 0); diff --git a/core/libs/tests/GuestShmOpen.cpp b/core/libs/tests/GuestShmOpen.cpp index 2c7d7c9443..088d59f492 100644 --- a/core/libs/tests/GuestShmOpen.cpp +++ b/core/libs/tests/GuestShmOpen.cpp @@ -49,6 +49,25 @@ int main() { #ifndef _WIN32 Require(pwrite_nid_disambig1_nid_postfix(third, text, sizeof(text), 0) == 0); #endif + const unsigned char privateCode[] = {0xb8, 0x07, 0, 0, 0, 0xc3}; + Require(pwrite_nid_disambig1_nid_postfix(first, privateCode, sizeof(privateCode), 0x3000) == static_cast(sizeof(privateCode))); + auto* copy = static_cast(mmap_nid_postfix(nullptr, 0x4000, 3, 0x2, first, 0)); + Require(copy != reinterpret_cast(static_cast(-1))); + Require(copy[0x1000] == 'a' && copy[0x2000] == 'm'); + copy[0x1000] = 'P'; + Require(copy[0x1000] == 'P'); + Require(pread_nid_postfix(first, &last, 1, 0x1000) == 1 && last == 'a'); + Require(munmap_nid_postfix(const_cast(copy), 0x4000) == 0); + auto* readable = static_cast(mmap_nid_postfix(nullptr, 0x4000, 1, 0x2, first, 0)); + Require(readable != reinterpret_cast(static_cast(-1)) && readable[0x2000] == 'm'); + Require(munmap_nid_postfix(const_cast(readable), 0x4000) == 0); + void* privateExecutable = mmap_nid_postfix(nullptr, 0x4000, 5, 0x2, first, 0); + Require(privateExecutable != reinterpret_cast(static_cast(-1))); + int (*privateFunction)(); + const void* privateEntry = static_cast(privateExecutable) + 0x3000; + std::memcpy(&privateFunction, &privateEntry, sizeof(privateFunction)); + Require(privateFunction() == 7); + Require(munmap_nid_postfix(privateExecutable, 0x4000) == 0); Require(ftruncate_nid_postfix(third, 0x4000) == 0); Require(pwrite_nid_disambig1_nid_postfix(third, text, sizeof(text), 0) == static_cast(sizeof(text))); Require(close_nid_postfix(first) == 0 && close_nid_postfix(second) == 0 && close_nid_postfix(third) == 0); diff --git a/core/libs/tests/GuestSigtimedwait.cpp b/core/libs/tests/GuestSigtimedwait.cpp index 8eb2de43af..b8f6b036b0 100644 --- a/core/libs/tests/GuestSigtimedwait.cpp +++ b/core/libs/tests/GuestSigtimedwait.cpp @@ -142,6 +142,14 @@ int main() { Require(sigwait_nid_postfix(&empty, &taken) == 22 && *__error_nid_postfix() == 72 && taken == -1); *__error_nid_postfix() = 73; Require(sigwait_nid_postfix(&interrupt, nullptr) == 22 && *__error_nid_postfix() == 73); + *__error_nid_postfix() = 0; + Require(sigtimedwait_nid_postfix(reinterpret_cast(0x10), &info, &poll) == -1 && *__error_nid_postfix() == 14); + *__error_nid_postfix() = 0; + Require(sigtimedwait_nid_postfix(&interrupt, &info, reinterpret_cast(0x10)) == -1 && *__error_nid_postfix() == 14); + *__error_nid_postfix() = 0; + Require(sigwaitinfo_nid_postfix(reinterpret_cast(0x10), &info) == -1 && *__error_nid_postfix() == 14); + *__error_nid_postfix() = 74; + Require(sigwait_nid_postfix(reinterpret_cast(0x10), &taken) == 14 && *__error_nid_postfix() == 74); RequireUntouched(info); *__error_nid_postfix() = 0; Require(sigtimedwait_nid_postfix(&interrupt, &info, &poll) == -1 && *__error_nid_postfix() == 35); @@ -166,6 +174,15 @@ int main() { Require(sigwaitinfo_nid_postfix(&interrupt, nullptr) == 2 && received == 0); Require(raise_nid_postfix(2) == 0 && received == 0); Require(sigtimedwait_nid_postfix(&interrupt, nullptr, nullptr) == 2 && received == 0); + Require(raise_nid_postfix(2) == 0 && received == 0); + *__error_nid_postfix() = 75; + Require(sigwait_nid_postfix(&interrupt, reinterpret_cast(0x10)) == 14 && *__error_nid_postfix() == 75); + Require(raise_nid_postfix(2) == 0 && received == 0); + *__error_nid_postfix() = 0; + Require(sigtimedwait_nid_postfix(&interrupt, reinterpret_cast(0x10), &poll) == -1 && *__error_nid_postfix() == 14); + Require(raise_nid_postfix(2) == 0 && received == 0); + *__error_nid_postfix() = 0; + Require(sigwaitinfo_nid_postfix(&interrupt, reinterpret_cast(0x10)) == -1 && *__error_nid_postfix() == 14); GuestSignalSet current{}; Require(_sigprocmask_nid_postfix(1, nullptr, ¤t) == 0 && current.bits[0] == (previous.bits[0] | interrupt.bits[0])); Require(_sigprocmask_nid_postfix(3, &previous, nullptr) == 0); diff --git a/core/libs/tests/GuestSocketPair.cpp b/core/libs/tests/GuestSocketPair.cpp index e2266c799d..b760914fab 100644 --- a/core/libs/tests/GuestSocketPair.cpp +++ b/core/libs/tests/GuestSocketPair.cpp @@ -3,6 +3,9 @@ #include "SceTypes.hpp" #include "prx/libc/include/general/VabiMacros.hpp" #include +#include +#include +#include #include #include #include @@ -11,6 +14,23 @@ static void Require(bool value) { if (!value) std::abort(); } +#ifndef _WIN32 +static std::atomic lastAllocationSize{0}; +static std::atomic failAllocationOfSize{0}; +static std::atomic failAllocationAfter{0}; +void* operator new(std::size_t bytes) { + lastAllocationSize = bytes; + if (bytes != 0 && failAllocationOfSize.load() == bytes && --failAllocationAfter == 0) { + failAllocationOfSize = 0; + throw std::bad_alloc(); + } + if (void* pointer = std::malloc(bytes != 0 ? bytes : 1)) return pointer; + throw std::bad_alloc(); +} +void operator delete(void* pointer) noexcept { std::free(pointer); } +void operator delete(void* pointer, std::size_t) noexcept { std::free(pointer); } +#endif + template static bool ThrowsRuntimeError(TFunction function) { try { @@ -290,5 +310,55 @@ int main(int argc, char** argv) { Require(Fails(Unix, Stream, 6, 43)); *__error_nid_postfix() = 0; Require(socketpair_nid_postfix(Unix, Stream, 0, nullptr) == -1 && *__error_nid_postfix() == 14); + for (int type : {Stream, Datagram}) { + *__error_nid_postfix() = 0; + Require(socketpair_nid_postfix(Unix, type, 0, reinterpret_cast(0x10)) == -1 && *__error_nid_postfix() == 14); + } + constexpr std::size_t page = 0x4000; + void* memory = nullptr; + Require(sceKernelMapFlexibleMemory(&memory, page * 2, 3, 0) == 0 && memory != nullptr); + auto* base = static_cast(memory); + Require(sceKernelMprotect(base + page, page, 0) == 0); + for (auto* target : {base + page, base + page - 4}) { + *__error_nid_postfix() = 0; + Require(socketpair_nid_postfix(Unix, Stream, 0, reinterpret_cast(target)) == -1 && *__error_nid_postfix() == 14); + } + Require(sceKernelMprotect(memory, page * 2, 3) == 0 && sceKernelMunmap(reinterpret_cast(memory), page * 2) == 0); + int first[2] = {-1, -1}; + Require(socketpair_nid_postfix(Unix, Stream, 0, first) == 0); + Require(close_nid_postfix(first[0]) == 0 && close_nid_postfix(first[1]) == 0); + Require(socketpair_nid_postfix(Unix, Stream | CloseOnExec, 0, reinterpret_cast(0x10)) == -1); + int second[2] = {-1, -1}; + Require(socketpair_nid_postfix(Unix, Stream, 0, second) == 0 && second[0] == first[0] && second[1] == first[1]); + Require(close_nid_postfix(second[0]) == 0 && close_nid_postfix(second[1]) == 0); +#ifndef _WIN32 + { + std::set probe; + probe.insert(1); + } + const std::size_t registryNodeSize = lastAllocationSize; + for (const int occurrence : {1, 2}) { + int expected[2] = {-1, -1}; + Require(socketpair_nid_postfix(Unix, Stream | CloseOnExec, 0, expected) == 0); + Require(close_nid_postfix(expected[0]) == 0 && close_nid_postfix(expected[1]) == 0); + failAllocationAfter = occurrence; + failAllocationOfSize = registryNodeSize; + int refused[2] = {-1, -1}; + *__error_nid_postfix() = 0; + const int result = socketpair_nid_postfix(Unix, Stream | CloseOnExec, 0, refused); + failAllocationOfSize = 0; + Require(result == -1 && *__error_nid_postfix() == 12); + int plain[2] = {-1, -1}; + Require(socketpair_nid_postfix(Unix, Stream, 0, plain) == 0 && plain[0] == expected[0] && plain[1] == expected[1]); + Require(fcntl_nid_postfix(plain[0], 1, 0) == 0 && fcntl_nid_postfix(plain[1], 1, 0) == 0); + Require(close_nid_postfix(plain[0]) == 0 && close_nid_postfix(plain[1]) == 0); + int again[2] = {-1, -1}; + Require(socketpair_nid_postfix(Unix, Stream | CloseOnExec, 0, again) == 0 && again[0] == expected[0] && again[1] == expected[1]); + Require(fcntl_nid_postfix(again[0], 1, 0) == 1 && fcntl_nid_postfix(again[1], 1, 0) == 1); + Require(close_nid_postfix(again[0]) == 0 && close_nid_postfix(again[1]) == 0); + *__error_nid_postfix() = 0; + Require(close_nid_postfix(again[0]) == -1 && *__error_nid_postfix() == 9); + } +#endif return 0; } diff --git a/core/libs/tests/GuestSrcUtility.cpp b/core/libs/tests/GuestSrcUtility.cpp new file mode 100644 index 0000000000..0e7e5a1180 --- /dev/null +++ b/core/libs/tests/GuestSrcUtility.cpp @@ -0,0 +1,81 @@ +#include "prx/libSceSrcUtl/include/Api.hpp" +#include "SceTypes.hpp" +#include +#include +#include +#include +#include +#include +#include + +namespace { + +constexpr int INVALID_HANDLE = static_cast(0x815D0000); +constexpr int INVALID_POINTER = static_cast(0x815D0001); +constexpr int INVALID_CHANNELS = static_cast(0x815D0002); +constexpr int INVALID_MODE = static_cast(0x815D0003); +constexpr int INVALID_INPUT_RATE = static_cast(0x815D0004); +constexpr int INVALID_OUTPUT_RATE = static_cast(0x815D0005); +constexpr int HANDLE_SIZE = 0x9678; +constexpr std::uint64_t MAGIC = 0xDEADBEEFBAADF00Dull; + +void Require(bool value, const char* message) { + if (value) return; + std::fprintf(stderr, "%s\n", message); + std::abort(); +} + +void CheckHandleSize() { + constexpr std::uint32_t inputs[] = {22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000, 128000, 176400, 192000}; + constexpr std::uint32_t outputs[] = {44100, 48000, 96000, 192000}; + constexpr std::uint32_t rates[] = {0, 8000, 11025, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000, + 128000, 176400, 192000, 384000, 0xFFFFFFFF}; + for (std::uint32_t channels = 0; channels <= 9; ++channels) { + for (std::uint32_t mode = 0; mode <= 3; ++mode) { + for (const std::uint32_t input : rates) { + for (const std::uint32_t output : rates) { + int expected = HANDLE_SIZE; + if (channels == 0 || channels > 8) expected = INVALID_CHANNELS; + else if (mode > 2) expected = INVALID_MODE; + else if (std::find(std::begin(inputs), std::end(inputs), input) == std::end(inputs)) expected = INVALID_INPUT_RATE; + else if (std::find(std::begin(outputs), std::end(outputs), output) == std::end(outputs)) expected = INVALID_OUTPUT_RATE; + Require(sceSrcUtilityGetHandleSize(channels, mode, input, output) == expected, "handle size checks"); + } + } + } + } + Require(sceSrcUtilityGetHandleSize(0xFFFFFFFF, 0xFFFFFFFF, 0, 0) == INVALID_CHANNELS, "channels are checked first"); + Require(sceSrcUtilityGetHandleSize(2, 0xFFFFFFFF, 0, 0) == INVALID_MODE, "the mode is checked second"); + Require(sceSrcUtilityGetHandleSize(2, 0, 22050, 192000) == HANDLE_SIZE, "22050 to 192000"); +} + +void CheckPriority() { + Require(sceSrcUtilitySetPriority(nullptr, 1) == INVALID_HANDLE, "set on a null handle"); + std::uint32_t priority = 7; + Require(sceSrcUtilityGetPriority(nullptr, &priority) == INVALID_HANDLE && priority == 7, "get on a null handle"); + std::vector handle(HANDLE_SIZE, 0xAB); + const std::vector untouched = handle; + Require(sceSrcUtilitySetPriority(handle.data(), 1) == INVALID_HANDLE && handle == untouched, "set needs an initialized handle"); + Require(sceSrcUtilityGetPriority(handle.data(), &priority) == INVALID_HANDLE && priority == 7, "get needs an initialized handle"); + Require(sceSrcUtilityGetPriority(handle.data(), nullptr) == INVALID_HANDLE, "the handle is checked before the output"); + std::memcpy(handle.data() + 0x9470, &MAGIC, sizeof(MAGIC)); + std::vector expected = handle; + Require(sceSrcUtilityGetPriority(handle.data(), nullptr) == INVALID_POINTER, "get needs an output"); + Require(sceSrcUtilitySetPriority(handle.data(), 0x12345678) == 0, "set"); + const std::uint32_t stored = 0x12345678; + std::memcpy(expected.data() + 0x2C, &stored, sizeof(stored)); + Require(handle == expected, "set writes only the priority field"); + Require(sceSrcUtilityGetPriority(handle.data(), &priority) == 0 && priority == 0x12345678, "get"); + Require(handle == expected, "get leaves the handle unchanged"); + std::uint64_t other = MAGIC ^ 1; + std::memcpy(handle.data() + 0x9470, &other, sizeof(other)); + priority = 7; + Require(sceSrcUtilityGetPriority(handle.data(), &priority) == INVALID_HANDLE && priority == 7, "a changed magic is rejected"); +} + +} + +int main() { + CheckHandleSize(); + CheckPriority(); +} diff --git a/core/libs/tests/GuestStandardStreams.cpp b/core/libs/tests/GuestStandardStreams.cpp index 35a5d1cf76..f9cf388549 100644 --- a/core/libs/tests/GuestStandardStreams.cpp +++ b/core/libs/tests/GuestStandardStreams.cpp @@ -1,6 +1,7 @@ #include "prx/libc/include/Api.hpp" #include "prx/libc/include/FileStream.hpp" #include "prx/libc/include/general/VabiMacros.hpp" +#include "tests/TemporaryFile.hpp" #include #include #include @@ -88,8 +89,30 @@ static bool CheckFileBytes(const std::string& filename, const std::string& expec return false; } +static void CheckGetcharPutchar() { + auto* const savedInput = __stdinp_nid_postfix; + auto* const savedOutput = __stdoutp_nid_postfix; + FileStream input(TemporaryFile::Open()); + Require(fputc_nid_postfix('T', &input) == 'T' && fputc_nid_postfix(0xff, &input) == 0xff); + rewind_nid_postfix(&input); + __stdinp_nid_postfix = &input; + Require(getchar_nid_postfix() == 'T' && getchar_nid_postfix() == 0xff); + Require(getchar_nid_postfix() == EOF && feof_nid_postfix(&input) != 0 && ferror_nid_postfix(&input) == 0); + FileStream output(TemporaryFile::Open()); + __stdoutp_nid_postfix = &output; + const int written[] = {putchar_nid_postfix('U'), putchar_nid_postfix(0x141), putchar_nid_postfix(-1)}; + __stdinp_nid_postfix = savedInput; + __stdoutp_nid_postfix = savedOutput; + Require(written[0] == 'U' && written[1] == 0x41 && written[2] == 0xff); + rewind_nid_postfix(&output); + Require(fgetc_nid_postfix(&output) == 'U' && fgetc_nid_postfix(&output) == 0x41 && fgetc_nid_postfix(&output) == 0xff); + Require(fgetc_nid_postfix(&output) == EOF); + input.Close(); + output.Close(); +} + static void CheckGetcPutc() { - FileStream stream(std::tmpfile()); + FileStream stream(TemporaryFile::Open()); Require(putc_nid_postfix('A', &stream) == 'A'); Require(putc_nid_postfix(0x141, &stream) == 0x41); Require(putc_nid_postfix(-1, &stream) == 0xff); @@ -100,7 +123,7 @@ static void CheckGetcPutc() { } static void CheckUnlockedStreams() { - FileStream stream(std::tmpfile()); + FileStream stream(TemporaryFile::Open()); auto& guest = stream.GuestState(); const auto originalFlags = guest.flags; for (const int value : {0, 0x7f, 0x80, 0xff, 0x1ab, -2}) { @@ -142,7 +165,7 @@ static void CheckUnlockedStreams() { } static void CheckUnlockedQueries() { - FileStream stream(std::tmpfile()); + FileStream stream(TemporaryFile::Open()); Require(feof_unlocked_nid_postfix(&stream) == 0 && ferror_unlocked_nid_postfix(&stream) == 0); Require(std::fgetc(stream.GetHandle()) == EOF); Require(feof_unlocked_nid_postfix(&stream) == 1 && ferror_unlocked_nid_postfix(&stream) == 0); @@ -171,7 +194,7 @@ static void CheckUnlockedQueries() { } static void CheckTryLock() { - FileStream stream(std::tmpfile()); + FileStream stream(TemporaryFile::Open()); const auto tryFromOtherThread = [&] { int result = 0; std::thread other([&] { @@ -227,7 +250,7 @@ static void CheckTryLock() { } static void CheckUnlockedStreamLock(bool write, int (APS5_VABI *query)(FileStream*) = nullptr) { - FileStream stream(std::tmpfile()); + FileStream stream(TemporaryFile::Open()); Require(std::fputc('A', stream.GetHandle()) == 'A'); std::rewind(stream.GetHandle()); std::atomic held = false, release = false, entered = false, done = false; @@ -271,7 +294,7 @@ static void CheckUnlockedStreamLock(bool write, int (APS5_VABI *query)(FileStrea } static void CheckFgetsSize() { - FileStream stream(std::tmpfile()); + FileStream stream(TemporaryFile::Open()); Require(fwrite_nid_postfix("line\n", 1, 5, &stream) == 5); rewind_nid_postfix(&stream); @@ -293,9 +316,21 @@ static void CheckFgetsSize() { stream.Close(); } +static void CheckFgetsSizeOne() { + FileStream stream(TemporaryFile::Open()); + Require(fwrite_nid_postfix("line\n", 1, 5, &stream) == 5); + rewind_nid_postfix(&stream); + char buffer[8]; + std::memset(buffer, '!', sizeof(buffer)); + Require(fgets_nid_postfix(buffer, 1, &stream) == buffer && buffer[0] == '\0' && buffer[1] == '!'); + Require(ftello_nid_postfix(&stream) == 0 && ferror_nid_postfix(&stream) == 0 && feof_nid_postfix(&stream) == 0); + Require(fgets_nid_postfix(buffer, sizeof(buffer), &stream) == buffer && std::strcmp(buffer, "line\n") == 0); + stream.Close(); +} + static void CheckSupplementaryWideCharacters() { const char16_t text[] = u"A\U0001F600\n"; - FileStream stream(std::tmpfile()); + FileStream stream(TemporaryFile::Open()); Require(fputws_nid_postfix(text, &stream) == 4); rewind_nid_postfix(&stream); char bytes[8]{}; @@ -318,14 +353,14 @@ static void CheckSupplementaryWideCharacters() { Require(getwc_nid_postfix(&stream) == u'X' && getwc_nid_postfix(&stream) == 0xde00 && getwc_nid_postfix(&stream) == u'\n'); stream.Close(); - FileStream units(std::tmpfile()); + FileStream units(TemporaryFile::Open()); Require(fputwc_nid_postfix(0xd83d, &units) == 0xd83d && fputwc_nid_postfix(0xde00, &units) == 0xde00); rewind_nid_postfix(&units); Require(getwc_nid_postfix(&units) == 0xd83d && getwc_nid_postfix(&units) == 0xde00 && getwc_nid_postfix(&units) == -1); units.Close(); for (const std::string_view malformed : {"\xC0\x80", "\xE0\x9F\xBF", "\xF0\x8F\xBF\xBF", "\xF4\x90\x80\x80", "\xF8\x88\x80\x80\x80"}) { - FileStream input(std::tmpfile()); + FileStream input(TemporaryFile::Open()); Require(fwrite_nid_postfix(malformed.data(), 1, malformed.size(), &input) == malformed.size()); rewind_nid_postfix(&input); *__error_nid_postfix() = 0; @@ -335,7 +370,7 @@ static void CheckSupplementaryWideCharacters() { } static void CheckUngetcEndOfFile() { - FileStream stream(std::tmpfile()); + FileStream stream(TemporaryFile::Open()); Require(fwrite_nid_postfix("ab", 1, 2, &stream) == 2); rewind_nid_postfix(&stream); Require(ungetc_nid_postfix(EOF, &stream) == EOF); @@ -348,7 +383,7 @@ static void CheckUngetcEndOfFile() { } static void CheckRewind() { - FileStream stream(std::tmpfile()); + FileStream stream(TemporaryFile::Open()); Require(fwrite_nid_postfix("ab", 1, 2, &stream) == 2); *__error_nid_postfix() = 7; rewind_nid_postfix(&stream); @@ -423,7 +458,7 @@ static bool CheckBinaryModes() { for (const auto* mode : modes) { for (const bool reopen : {false, true}) { { std::ofstream seed(filename, std::ios::binary | std::ios::trunc); seed.write(original.data(), original.size()); Require(seed.good()); } - FileStream redirected(std::tmpfile()); + FileStream redirected(TemporaryFile::Open()); FileStream* stream = reopen ? freopen_nid_postfix(filename.c_str(), mode, &redirected) : fopen_nid_postfix(filename.c_str(), mode); Require(stream != nullptr); const bool update = std::strchr(mode, '+') != nullptr; @@ -454,7 +489,7 @@ static bool CheckBinaryModes() { } } for (const auto* mode : {"", "q", "tr", "rx", "rbx"}) { - FileStream redirected(std::tmpfile()); + FileStream redirected(TemporaryFile::Open()); Require(fopen_nid_postfix(filename.c_str(), mode) == nullptr && *__error_nid_postfix() == 22); Require(freopen_nid_postfix(filename.c_str(), mode, &redirected) == nullptr && *__error_nid_postfix() == 22); } @@ -606,7 +641,7 @@ static void CheckDescriptorAccessModes() { } static void CheckClosedStreamWrites() { - FileStream stream(std::tmpfile()); + FileStream stream(TemporaryFile::Open()); Require(freopen_nid_postfix("missing-closed-stream-dir/out.log", "w", &stream) == nullptr); Require(fputs_nid_postfix("text", &stream) == -1 && *__error_nid_postfix() == 9); Require(fprintf_nid_postfix(&stream, "%d", 1) == -1 && *__error_nid_postfix() == 9); @@ -642,7 +677,7 @@ static std::string FileText(const std::string& filename) { static void CheckClosedStreamReopen() { const auto filename = "anyps5-closed-reopen-" + std::to_string(std::chrono::steady_clock::now().time_since_epoch().count()); - FileStream stream(std::tmpfile()); + FileStream stream(TemporaryFile::Open()); Require(fclose_nid_postfix(&stream) == 0); Require(freopen_nid_postfix("missing-closed-stream-dir/out.log", "w", &stream) == nullptr && *__error_nid_postfix() == 2); Require(fputs_nid_postfix("text", &stream) == -1 && *__error_nid_postfix() == 9); @@ -744,7 +779,7 @@ static int CheckUpdateStandardOutput() { } static void CheckSetvbufInvalidMode() { - FileStream stream(std::tmpfile()); + FileStream stream(TemporaryFile::Open()); for (const int mode : {3, -1, INT_MAX}) Require(setvbuf_nid_postfix(&stream, nullptr, mode, 0) == EOF); char buffer[16]; std::memset(buffer, 'z', sizeof(buffer)); @@ -799,7 +834,7 @@ int main(int argc, char** argv) { } Require(fdopen_nid_postfix(0, nullptr) == nullptr && *__error_nid_postfix() == 22); Require(fdopen_nid_postfix(0, "invalid") == nullptr && *__error_nid_postfix() == 22); - std::FILE* original = std::tmpfile(); + std::FILE* original = TemporaryFile::Open(); Require(original != nullptr); std::fputs("retained", original); std::fflush(original); @@ -845,7 +880,7 @@ int main(int argc, char** argv) { Require(fileno_nid_postfix(__stderrp_nid_postfix) == 2); auto* const savedInput = __stdinp_nid_postfix; auto* const savedOutput = __stdoutp_nid_postfix; - FileStream customIn(std::tmpfile()); + FileStream customIn(TemporaryFile::Open()); Require(fputc_nid_postfix('T', &customIn) == 'T'); std::rewind(customIn.GetHandle()); __stdinp_nid_postfix = &customIn; @@ -853,7 +888,7 @@ int main(int argc, char** argv) { Require(getchar_unlocked_nid_postfix() == EOF); Require(ungetc_nid_postfix('W', &customIn) == 'W'); Require(getwchar_nid_postfix() == 'W'); - FileStream customOut(std::tmpfile()); + FileStream customOut(TemporaryFile::Open()); __stdoutp_nid_postfix = &customOut; Require(putchar_unlocked_nid_postfix('U') == 'U'); Require(putwchar_nid_postfix(u'V') == u'V'); @@ -862,14 +897,14 @@ int main(int argc, char** argv) { Require(fgetc_nid_postfix(&customOut) == 'V'); __stdinp_nid_postfix = savedInput; __stdoutp_nid_postfix = savedOutput; - FileStream stream(std::tmpfile()); + FileStream stream(TemporaryFile::Open()); auto& guest = *reinterpret_cast(&stream); Require(&guest == &stream.GuestState()); Require(guest.position == nullptr && guest.readRemaining == 0 && guest.writeRemaining == 0); Require(guest.descriptor == fileno_nid_postfix(&stream)); - FileStream lineBuffered(std::tmpfile()); + FileStream lineBuffered(TemporaryFile::Open()); Require(setvbuf_nid_postfix(&lineBuffered, nullptr, 1, 0) == 0); - FileStream fullyBuffered(std::tmpfile()); + FileStream fullyBuffered(TemporaryFile::Open()); Require(setvbuf_nid_postfix(&fullyBuffered, nullptr, 0, 0) == 0); Require(setvbuf_nid_postfix(&stream, nullptr, 2, 0) == 0); Require(fputc_nid_postfix('A', &stream) == 'A'); @@ -890,7 +925,7 @@ int main(int argc, char** argv) { stream.Close(); Require(guest.flags == 0 && guest.descriptor == -1); - FileStream wide(std::tmpfile()); + FileStream wide(TemporaryFile::Open()); Require(fputwc_nid_postfix(u'A', &wide) == u'A'); Require(fputws_nid_postfix(u"B\x00E9", &wide) == 2); std::rewind(wide.GetHandle()); @@ -899,7 +934,7 @@ int main(int argc, char** argv) { Require(std::memcmp(wideBytes, "AB\xC3\xA9", 4) == 0); wide.Close(); - FileStream wideIo(std::tmpfile()); + FileStream wideIo(TemporaryFile::Open()); Require(putwc_nid_postfix(u'H', &wideIo) == u'H'); Require(putwc_nid_postfix(u'i', &wideIo) == u'i'); Require(putwc_nid_postfix(u'\n', &wideIo) == u'\n'); @@ -935,7 +970,7 @@ int main(int argc, char** argv) { Require(fgetc_nid_postfix(&wideIo) == 'H'); wideIo.Close(); - FileStream roundTrip(std::tmpfile()); + FileStream roundTrip(TemporaryFile::Open()); Require(putwc_nid_postfix(u'é', &roundTrip) == u'é'); Require(putwc_nid_postfix(u'\u20ac', &roundTrip) == u'\u20ac'); Require(putwc_nid_postfix(u'\n', &roundTrip) == u'\n'); @@ -950,7 +985,7 @@ int main(int argc, char** argv) { Require(utfBuf[0] == u'é' && utfBuf[1] == u'\u20ac' && utfBuf[2] == u'\n' && utfBuf[3] == 0); roundTrip.Close(); - FileStream midErr(std::tmpfile()); + FileStream midErr(TemporaryFile::Open()); Require(fputc_nid_postfix('A', &midErr) == 'A'); Require(fputc_nid_postfix(0xff, &midErr) == 0xff); std::rewind(midErr.GetHandle()); @@ -959,7 +994,7 @@ int main(int argc, char** argv) { Require(ferror_nid_postfix(&midErr)); midErr.Close(); - FileStream formatted(std::tmpfile()); + FileStream formatted(TemporaryFile::Open()); const char expected[] = "guest 4294967297 1.25 1 2 3 4 5 6 7 8\n"; Require(fprintf_nid_postfix(&formatted, "%s %ld %.2f %d %d %d %d %d %d %d %d\n", "guest", std::int64_t{4294967297}, 1.25, 1, 2, 3, 4, 5, 6, 7, 8) == sizeof(expected) - 1); @@ -972,7 +1007,7 @@ int main(int argc, char** argv) { Require(std::strcmp(output, " 3.50:end") == 0); formatted.Close(); - FileStream scanned(std::tmpfile()); + FileStream scanned(TemporaryFile::Open()); Require(fprintf_nid_postfix(&scanned, "%d %s", 42, "answer") == 9); std::rewind(scanned.GetHandle()); Require(fscanf_nid_postfix(&scanned, "%*d") == 0); @@ -988,7 +1023,7 @@ int main(int argc, char** argv) { Require(feof_nid_postfix(&scanned) && (scanned.GuestState().flags & 0x20)); scanned.Close(); - FileStream scanBinary(std::tmpfile()); + FileStream scanBinary(TemporaryFile::Open()); Require(std::fputs("0b101", scanBinary.GetHandle()) >= 0); std::rewind(scanBinary.GetHandle()); int binaryValue = -1; @@ -997,7 +1032,7 @@ int main(int argc, char** argv) { scanBinary.Close(); #ifdef _WIN32 - FileStream scanSuppressed(std::tmpfile()); + FileStream scanSuppressed(TemporaryFile::Open()); Require(std::fputs("12", scanSuppressed.GetHandle()) >= 0); std::rewind(scanSuppressed.GetHandle()); int suppressedTarget = 321; @@ -1006,7 +1041,7 @@ int main(int argc, char** argv) { scanSuppressed.Close(); #endif - FileStream scanMany(std::tmpfile()); + FileStream scanMany(TemporaryFile::Open()); Require(std::fputs("7 1 2 3 4 5 6 7 8 4294967297 -4294967298 4294967299 abc %!", scanMany.GetHandle()) >= 0); std::rewind(scanMany.GetHandle()); int numbers[8]{}; @@ -1028,7 +1063,7 @@ int main(int argc, char** argv) { Require(fscanf_nid_postfix(&scanMany, "%d", &unmatched) == EOF && unmatched == 123); scanMany.Close(); - FileStream positioned(std::tmpfile()); + FileStream positioned(TemporaryFile::Open()); constexpr std::int64_t largeOffset = INT64_C(4294967313); Require(fseeko_nid_postfix(&positioned, largeOffset, SEEK_SET) == 0); Require(ftello_nid_postfix(&positioned) == largeOffset); @@ -1047,7 +1082,7 @@ int main(int argc, char** argv) { positioned.Close(); const auto filename = "anyps5-reopen-test-" + std::to_string(std::chrono::steady_clock::now().time_since_epoch().count()); - FileStream redirected(std::tmpfile()); + FileStream redirected(TemporaryFile::Open()); Require(fgetc_nid_postfix(&redirected) == EOF && feof_nid_postfix(&redirected)); Require(freopen_nid_postfix(filename.c_str(), "w+b", &redirected) == &redirected); Require(!feof_nid_postfix(&redirected)); @@ -1061,11 +1096,11 @@ int main(int argc, char** argv) { { std::ifstream input(filename, std::ios::binary); std::string contents; std::getline(input, contents); Require(contents == "RS"); } Require(std::filesystem::remove(filename)); - FileStream failed(std::tmpfile()); + FileStream failed(TemporaryFile::Open()); Require(freopen_nid_postfix(filename.c_str(), "rb", &failed) == nullptr); Require(*__error_nid_postfix() == 2); Require(failed.GuestState().flags == 0 && failed.GuestState().descriptor == -1); - FileStream locked(std::tmpfile()); + FileStream locked(TemporaryFile::Open()); flockfile_nid_postfix(&locked); flockfile_nid_postfix(&locked); @@ -1089,9 +1124,11 @@ int main(int argc, char** argv) { CheckRewind(); CheckUngetcEndOfFile(); CheckFgetsSize(); + CheckFgetsSizeOne(); CheckSupplementaryWideCharacters(); CheckUnlockedStreams(); CheckGetcPutc(); + CheckGetcharPutchar(); CheckUnlockedStreamLock(false); CheckUnlockedStreamLock(true); CheckUnlockedStreamLock(false, feof_unlocked_nid_postfix); diff --git a/core/libs/tests/GuestStdioVariadic.cpp b/core/libs/tests/GuestStdioVariadic.cpp index 80d9e2d166..414a9b1533 100644 --- a/core/libs/tests/GuestStdioVariadic.cpp +++ b/core/libs/tests/GuestStdioVariadic.cpp @@ -1,6 +1,7 @@ #include "prx/libc/include/Api.hpp" #include "prx/libc/include/FileStream.hpp" #include "prx/libc/include/general/VabiMacros.hpp" +#include "tests/TemporaryFile.hpp" #include #include #include @@ -85,7 +86,7 @@ static int APS5_VABI PrintWideSecureOutput(const char16_t* format, ...) { } static FileStream* SeededStream(const char* text) { - auto* stream = new FileStream(std::tmpfile(), true); + auto* stream = new FileStream(TemporaryFile::Open(), true); Require(std::fputs(text, stream->GetHandle()) >= 0, "seed a stream"); std::rewind(stream->GetHandle()); return stream; @@ -157,7 +158,7 @@ static std::string Contents(FileStream& stream) { } int main() { - FileStream scanned(std::tmpfile()); + FileStream scanned(TemporaryFile::Open()); Require(std::fputs("42 answer 7", scanned.GetHandle()) >= 0, "seed the scanned stream"); std::rewind(scanned.GetHandle()); int number = 0; @@ -168,7 +169,7 @@ int main() { Require(ScanStream(&scanned, "%d", &number) == EOF && number == 7, "vfscanf at end of file"); scanned.Close(); - FileStream input(std::tmpfile()); + FileStream input(TemporaryFile::Open()); Require(std::fputs("-5 12", input.GetHandle()) >= 0, "seed the standard input stream"); std::rewind(input.GetHandle()); FileStream* const standardInput = __stdinp_nid_postfix; @@ -179,15 +180,15 @@ int main() { __stdinp_nid_postfix = standardInput; input.Close(); - FileStream written(std::tmpfile()); + FileStream written(TemporaryFile::Open()); Require(fwprintf_nid_postfix(&written, u"%d:%ls|", 7, u"été") == 6, "fwprintf counts wide characters"); Require(PrintWide(&written, u"%5.1f", 2.25) == 5, "vfwprintf counts wide characters"); Require(Contents(written) == "7:\xc3\xa9t\xc3\xa9| 2.3", "the stream holds the formatted text"); written.Close(); - FileStream securePlain(std::tmpfile()); - FileStream secureChecked(std::tmpfile()); - FileStream secureList(std::tmpfile()); + FileStream securePlain(TemporaryFile::Open()); + FileStream secureChecked(TemporaryFile::Open()); + FileStream secureList(TemporaryFile::Open()); Require(fprintf_nid_postfix(&securePlain, "%d|%s|%5.2f|%c|%ls", 42, "ab", 3.14159, 'z', u"é") == 16, "fprintf reference"); Require(fprintf_s_nid_postfix(&secureChecked, "%d|%s|%5.2f|%c|%ls", 42, "ab", 3.14159, 'z', u"é") == 16, "fprintf_s count"); Require(PrintSecure(&secureList, "%d|%s|%5.2f|%c|%ls", 42, "ab", 3.14159, 'z', u"é") == 16, "vfprintf_s count"); @@ -199,7 +200,7 @@ int main() { secureChecked.Close(); secureList.Close(); - FileStream violations(std::tmpfile()); + FileStream violations(TemporaryFile::Open()); signed char marker = -7; char sibling[16]; Require(snprintf_s_nid_postfix(sibling, sizeof(sibling), "ab%hhn", &marker) == -1, "snprintf_s rejects %n"); @@ -219,8 +220,8 @@ int main() { Require(PrintSecureOutput("vprintf_s: %d\n", 42) == 14, "vprintf_s counts the bytes written to standard output"); Require(PrintSecureOutput("%n", &number) == -1 && PrintSecureOutput(static_cast(nullptr)) == -1, "vprintf_s violations"); - FileStream wideChecked(std::tmpfile()); - FileStream wideList(std::tmpfile()); + FileStream wideChecked(TemporaryFile::Open()); + FileStream wideList(TemporaryFile::Open()); int widePosition = -5; Require(fwprintf_s_nid_postfix(&wideChecked, u"%05d:%ls|", 42, u"été") == 10, "fwprintf_s counts wide characters"); Require(PrintWideSecure(&wideList, u"%05d:%ls|", 42, u"été") == 10, "vfwprintf_s counts wide characters"); diff --git a/core/libs/tests/GuestStreamPurge.cpp b/core/libs/tests/GuestStreamPurge.cpp index 0303fe2a34..2960694890 100644 --- a/core/libs/tests/GuestStreamPurge.cpp +++ b/core/libs/tests/GuestStreamPurge.cpp @@ -1,6 +1,7 @@ #include "prx/libc/include/Api.hpp" #include "prx/libc/include/FileStream.hpp" #include "prx/libc/include/general/VabiMacros.hpp" +#include "tests/TemporaryFile.hpp" #include #include #include @@ -33,7 +34,7 @@ std::int64_t Position(std::FILE* stream) { struct BufferedStream { std::array buffer{}; - std::FILE* native = std::tmpfile(); + std::FILE* native = TemporaryFile::Open(); FileStream stream{native}; BufferedStream() { Require(std::setvbuf(native, buffer.data(), _IOFBF, buffer.size()) == 0, "set full buffering"); } diff --git a/core/libs/tests/GuestStrings.cpp b/core/libs/tests/GuestStrings.cpp index 2a0b397629..99ab8fcedf 100644 --- a/core/libs/tests/GuestStrings.cpp +++ b/core/libs/tests/GuestStrings.cpp @@ -319,6 +319,16 @@ static void CheckStrtonum() { Require(strtonum_nid_postfix("42", 0, 100, nullptr) == 42 && *__error_nid_postfix() == 34); } +static void CheckStrnlenSBounds() { + const char bounded[] = {'a', 'b', 'c'}; + Require(strnlen_s_nid_postfix("abc", 0) == 0); + Require(strnlen_s_nid_postfix("", 4) == 0); + Require(strnlen_s_nid_postfix(bounded, sizeof(bounded)) == 3); + Require(strnlen_s_nid_postfix("abc", 2) == 2); + Require(strnlen_s_nid_postfix("ab\0cd", 5) == 2); + Require(strnlen_s_nid_postfix(nullptr, 0) == 0); +} + static void CheckCharacterConversionInSearches() { const char bytes[] = "a\xe9" "b\xe9" "c"; Require(strchr_nid_postfix(bytes, 0xe9) == bytes + 1); @@ -339,6 +349,7 @@ int main() { CheckBcopy(); if (!CheckDirnameLengths()) return 1; CheckCharacterConversionInSearches(); + CheckStrnlenSBounds(); CheckBoundsCheckedFunctions(); CheckCaseInsensitiveComparison(); CheckSscanfS(); diff --git a/core/libs/tests/GuestSystemConfiguration.cpp b/core/libs/tests/GuestSystemConfiguration.cpp index 83645fc80e..f0a1cd4e0b 100644 --- a/core/libs/tests/GuestSystemConfiguration.cpp +++ b/core/libs/tests/GuestSystemConfiguration.cpp @@ -347,6 +347,37 @@ static void CheckProcessSysctl() { length = 100; Require(sysctl_nid_postfix(mibPid, 4, buffer, &length, nullptr, 0) == -1 && *__error_nid_postfix() == 12 && length == 100); } +static void CheckProcessListSysctl() { + const int callerPid = getpid_nid_postfix(); + const int mib[] = {1, 14, 8}; + std::size_t length = 0; + Require(sysctl_nid_postfix(mib, 3, nullptr, &length, nullptr, 0) == 0); + + unsigned char buffer[1100]; + std::memset(buffer, 0xaa, sizeof(buffer)); + length = sizeof(buffer); + Require(sysctl_nid_postfix(mib, 3, buffer, &length, nullptr, 0) == 0 && length == 1088); + std::int32_t structSize = 0; + std::int32_t pid = 0; + std::memcpy(&structSize, buffer, sizeof(structSize)); + std::memcpy(&pid, buffer + 72, sizeof(pid)); + Require(structSize == 1088 && pid == callerPid); + Require(std::strcmp(reinterpret_cast(buffer + 447), "eboot.bin") == 0); + Require(buffer[1088] == 0xaa); + + const int mibWithPid[] = {1, 14, 8, 0}; + length = sizeof(buffer); + Require(sysctl_nid_postfix(mibWithPid, 4, buffer, &length, nullptr, 0) == 0 && length == 1088); + + const int mibTooLong[] = {1, 14, 8, 0, 0}; + Require(sysctl_nid_postfix(mibTooLong, 5, buffer, &length, nullptr, 0) == -1 && *__error_nid_postfix() == 22); + + length = 100; + Require(sysctl_nid_postfix(mib, 3, buffer, &length, nullptr, 0) == -1 && *__error_nid_postfix() == 12); + + length = sizeof(buffer); + Require(sysctl_nid_postfix(mib, 3, buffer, &length, buffer, sizeof(buffer)) == -1 && *__error_nid_postfix() == 1); +} struct SystemString { int mib[2]; const char* name; @@ -636,6 +667,24 @@ static void CheckVersionLimits() { } update{0xaaaaaaaau, 0xaaaaaaaau}; Require(sysKernelGetLowerLimitUpdVersion_nid_postfix(&update.version) == 0 && update.version == 0 && update.after == 0xaaaaaaaau); Require(sysKernelGetLowerLimitUpdVersion_nid_postfix(nullptr) == SCE_KERNEL_ERROR_EINVAL && *__error_nid_postfix() == 13); + Require(sceKernelGetSystemExVersion(reinterpret_cast(0x10), reinterpret_cast(first)) == 14); + Require(sceKernelGetSystemExVersion(reinterpret_cast(first), reinterpret_cast(0x10)) == 14); + Require(sysKernelGetLowerLimitSysexVersion_nid_postfix(reinterpret_cast(0x10)) == SCE_KERNEL_ERROR_EFAULT); + Require(sysKernelGetLowerLimitUpdVersion_nid_postfix(reinterpret_cast(0x10)) == SCE_KERNEL_ERROR_EFAULT); + Require(sceKernelGetSystemSwVersion_nid_postfix(reinterpret_cast(0x10)) == SCE_KERNEL_ERROR_EFAULT); + *__error_nid_postfix() = 13; + + constexpr std::size_t GuardPage = 0x4000; + void* guard = mmap_nid_postfix(nullptr, 2 * GuardPage, 3, 0x1002, -1, 0); + Require(guard != reinterpret_cast(static_cast(-1))); + Require(mprotect_nid_postfix(guard, GuardPage, 1) == 0); + auto* record = reinterpret_cast(static_cast(guard) + GuardPage - offsetof(SceKernelSystemSwVersion, versionString)); + Require(sceKernelGetSystemSwVersion_nid_postfix(record) == 0); + Require(std::memcmp(record->versionString, "01.000.000", sizeof("01.000.000")) == 0 && record->version == 0x01000000); + Require(mprotect_nid_postfix(guard, GuardPage, 3) == 0); + Require(record->size == 0); + Require(munmap_nid_postfix(guard, 2 * GuardPage) == 0); + *__error_nid_postfix() = 13; update = {0xaaaaaaaau, 0xaaaaaaaau}; Require(sysKernelGetUpdVersion_nid_postfix(&update.version) == 0 && update.version == 0 && update.after == 0xaaaaaaaau); @@ -1153,6 +1202,7 @@ int main() { CheckUnknownSysctlName(); CheckPathnameSysctl(); CheckProcessSysctl(); + CheckProcessListSysctl(); CheckSystemStringSysctl(); CheckSystemStringNames(); CheckOsReleaseDateSysctl(); diff --git a/core/libs/tests/GuestSystemFont.cpp b/core/libs/tests/GuestSystemFont.cpp index c38a2bbae3..63988f6972 100644 --- a/core/libs/tests/GuestSystemFont.cpp +++ b/core/libs/tests/GuestSystemFont.cpp @@ -119,7 +119,11 @@ static std::string CaptureStderr(const std::filesystem::path& path, TRun run) { #else const int saved = dup(2); #endif - std::FILE* file = std::fopen(path.string().c_str(), "wb"); +#ifdef _WIN32 + std::FILE* file = _wfopen(path.c_str(), L"wb"); +#else + std::FILE* file = std::fopen(path.c_str(), "wb"); +#endif Require(saved >= 0 && file != nullptr); #ifdef _WIN32 Require(_dup2(_fileno(file), 2) == 0); diff --git a/core/libs/tests/GuestSystemServiceActivation.cpp b/core/libs/tests/GuestSystemServiceActivation.cpp new file mode 100644 index 0000000000..3fc4f9762c --- /dev/null +++ b/core/libs/tests/GuestSystemServiceActivation.cpp @@ -0,0 +1,83 @@ +#include "prx/libSceSystemService/include/SystemService.hpp" +#include "SceTypes.hpp" +#include +#include +#include + +namespace { + +constexpr int invalidArgument = static_cast(0x80A10003u); +constexpr int shellInvalidArgument = static_cast(0x80E30005u); +constexpr std::uintptr_t untouchedHandle = 0x5A5A5A5A5A5A5A5Au; +constexpr std::uint32_t untouchedStatus = 0x5A5A5A5Au; +constexpr std::int32_t untouchedResult = 0x5A5A5A5A; +constexpr std::uint8_t untouchedFlag = 0x5A; + +void Require(bool value) { if (!value) std::abort(); } + +struct Codec { + int (APS5_VABI* init)(std::uintptr_t*); + int (APS5_VABI* isActivated)(std::uint8_t*); + int (APS5_VABI* start)(std::uintptr_t); + int (APS5_VABI* getStatus)(std::uintptr_t, std::uint32_t*, std::int32_t*); + int (APS5_VABI* abort)(std::uintptr_t); + int (APS5_VABI* term)(std::uintptr_t); +}; + +void TestShellCalls(std::intptr_t expectedHandle) { + Require(sceShellCoreUtilActivateInit(7, nullptr) == shellInvalidArgument); + std::intptr_t handle = 0; + Require(sceShellCoreUtilActivateInit(7, &handle) == 0 && handle == expectedHandle); + std::int32_t status = static_cast(untouchedStatus); + std::int32_t result = untouchedResult; + Require(sceShellCoreUtilActivateGetStatus(0, nullptr, &result) == shellInvalidArgument && result == untouchedResult); + Require(sceShellCoreUtilActivateGetStatus(0, &status, nullptr) == shellInvalidArgument && status == static_cast(untouchedStatus)); + Require(sceShellCoreUtilActivateGetStatus(0, &status, &result) == 0 && status == 2 && result == 0); + Require(sceShellCoreUtilActivateIsActivated(7, nullptr) == shellInvalidArgument); + bool activated = false; + Require(sceShellCoreUtilActivateIsActivated(-1, &activated) == 0 && activated); + for (std::intptr_t value : {std::intptr_t{0}, handle, std::intptr_t{-1}}) { + Require(sceShellCoreUtilActivateStart(value) == 0); + Require(sceShellCoreUtilActivateStartAsync(value) == 0); + Require(sceShellCoreUtilActivateAbort(value) == 0); + Require(sceShellCoreUtilActivateTerm(value) == 0); + } + Require(sceShellCoreUtilActivateRecordActivation() == 0); +} + +void TestCodec(const Codec& codec, std::uintptr_t expectedHandle) { + Require(codec.init(nullptr) == invalidArgument); + std::uintptr_t handle = untouchedHandle; + Require(codec.init(&handle) == 0 && handle == expectedHandle); + Require(codec.isActivated(nullptr) == invalidArgument); + std::uint8_t activated = untouchedFlag; + Require(codec.isActivated(&activated) == 0 && activated == 1); + std::uint32_t status = untouchedStatus; + std::int32_t result = untouchedResult; + Require(codec.getStatus(0, &status, &result) == invalidArgument); + Require(codec.getStatus(handle, nullptr, &result) == invalidArgument); + Require(codec.getStatus(handle, &status, nullptr) == invalidArgument); + Require(status == untouchedStatus && result == untouchedResult); + for (auto call : {codec.start, codec.abort, codec.term}) { + Require(call(0) == invalidArgument); + Require(call(handle) == 0); + Require(call(untouchedHandle) == 0); + } + Require(codec.getStatus(handle, &status, &result) == 0 && status == 2 && result == 0); + Require(codec.getStatus(untouchedHandle, &status, &result) == 0 && status == 2 && result == 0); +} + +} + +int main() { + TestCodec({sceSystemServiceActivateHevcInit, sceSystemServiceActivateHevcIsActivated, sceSystemServiceActivateHevcStart, + sceSystemServiceActivateHevcGetStatus, sceSystemServiceActivateHevcAbort, sceSystemServiceActivateHevcTerm}, 0x1000); + TestCodec({sceSystemServiceActivateHevcSoftInit, sceSystemServiceActivateHevcSoftIsActivated, sceSystemServiceActivateHevcSoftStart, + sceSystemServiceActivateHevcSoftGetStatus, sceSystemServiceActivateHevcSoftAbort, sceSystemServiceActivateHevcSoftTerm}, 0x1004); + TestCodec({sceSystemServiceActivateMpeg2Init, sceSystemServiceActivateMpeg2IsActivated, sceSystemServiceActivateMpeg2Start, + sceSystemServiceActivateMpeg2GetStatus, sceSystemServiceActivateMpeg2Abort, sceSystemServiceActivateMpeg2Term}, 0x1008); + TestShellCalls(0x100C); + Require(sceSystemServiceActivateHevc() == 0); + Require(sceSystemServiceActivateHevcSoft() == 0); + return 0; +} diff --git a/core/libs/tests/GuestSystemServicePSButtonEvent.cpp b/core/libs/tests/GuestSystemServicePSButtonEvent.cpp new file mode 100644 index 0000000000..a6750b60e6 --- /dev/null +++ b/core/libs/tests/GuestSystemServicePSButtonEvent.cpp @@ -0,0 +1,55 @@ +#include "prx/libSceSystemService/include/SystemService.hpp" +#include "SceTypes.hpp" +#include +#include +#include +#include + +namespace { + +constexpr int invalidArgument = static_cast(0x80A10003u); +constexpr unsigned char untouched = 0x5A; + +void Require(bool value) { if (!value) std::abort(); } + +SystemServicePSButtonEvent* Output(unsigned char* buffer) { + return reinterpret_cast(buffer); +} + +void FillEvent(SystemServiceEvent& event, std::int32_t eventType) { + event.event_type = eventType; + for (std::size_t i = 0; i < sizeof(event.data); ++i) event.data[i] = static_cast(0x11 + i); +} + +void RequireUntouched(const unsigned char* buffer, std::size_t from, std::size_t size) { + for (std::size_t i = from; i < size; ++i) Require(buffer[i] == untouched); +} + +} + +int main() { + static SystemServiceEvent event; + alignas(8) unsigned char buffer[32]; + FillEvent(event, 0x20000001); + std::memset(buffer, untouched, sizeof(buffer)); + Require(sceSystemServiceGetPSButtonEvent(nullptr, Output(buffer)) == invalidArgument); + Require(sceSystemServiceGetPSButtonEvent(&event, nullptr) == invalidArgument); + RequireUntouched(buffer, 0, sizeof(buffer)); + for (std::int32_t eventType : {0, 1, 0x10000001, 0x20000000, 0x20000003, 0x30000001, -1}) { + FillEvent(event, eventType); + Require(sceSystemServiceGetPSButtonEvent(&event, Output(buffer)) == invalidArgument); + RequireUntouched(buffer, 0, sizeof(buffer)); + } + for (std::int32_t eventType : {0x20000001, 0x20000002}) { + FillEvent(event, eventType); + std::memset(buffer, untouched, sizeof(buffer)); + Require(sceSystemServiceGetPSButtonEvent(&event, Output(buffer)) == 0); + std::int32_t outputType = 0; + std::memcpy(&outputType, buffer, sizeof(outputType)); + Require(outputType == eventType); + Require(std::memcmp(buffer + 4, event.data + 8, 4) == 0); + Require(std::memcmp(buffer + 8, event.data, 8) == 0); + RequireUntouched(buffer, 16, sizeof(buffer)); + } + return 0; +} diff --git a/core/libs/tests/GuestThermalSensors.cpp b/core/libs/tests/GuestThermalSensors.cpp index 0b436d9d9f..9214137285 100644 --- a/core/libs/tests/GuestThermalSensors.cpp +++ b/core/libs/tests/GuestThermalSensors.cpp @@ -84,11 +84,21 @@ int main() { Require(result == 0 ? (probe >= 0 && probe <= 130) : (result == SCE_KERNEL_ERROR_EINVAL && probe == -12345)); *__error_nid_postfix() = 0; Require(sceKernelGetSocSensorTemperature(64, nullptr) == SCE_KERNEL_ERROR_EFAULT && *__error_nid_postfix() == 14); + *__error_nid_postfix() = 0; + Require(sceKernelGetSocSensorTemperature(64, reinterpret_cast(0x10)) == SCE_KERNEL_ERROR_EFAULT && *__error_nid_postfix() == 14); int channel64 = -12345; Require(sceKernelGetSocSensorTemperature(64, &channel64) == 0 && channel64 == -49); int cpuProbe = -12345; const int cpuResult = sceKernelGetCpuTemperature(&cpuProbe); Require(cpuResult == 0 ? (cpuProbe >= 0 && cpuProbe <= 130) : (cpuResult == SCE_KERNEL_ERROR_EINVAL && cpuProbe == -12345)); + if (result == 0) { + *__error_nid_postfix() = 0; + Require(sceKernelGetSocSensorTemperature(0, reinterpret_cast(0x10)) == SCE_KERNEL_ERROR_EFAULT && *__error_nid_postfix() == 14); + } + if (cpuResult == 0) { + *__error_nid_postfix() = 0; + Require(sceKernelGetCpuTemperature(reinterpret_cast(0x10)) == SCE_KERNEL_ERROR_EFAULT && *__error_nid_postfix() == 14); + } Require(sceKernelGetSocPowerConsumption(nullptr) == SCE_KERNEL_ERROR_EFAULT); std::uint32_t consumption[32]; diff --git a/core/libs/tests/GuestTimedWaitCpu.cpp b/core/libs/tests/GuestTimedWaitCpu.cpp index c7a90c279d..5abe490586 100644 --- a/core/libs/tests/GuestTimedWaitCpu.cpp +++ b/core/libs/tests/GuestTimedWaitCpu.cpp @@ -41,15 +41,15 @@ constexpr std::uint64_t MAX_WAIT_NANOS = 50000000ULL; #endif template -static void RequireLatencyBounds(std::array samples, std::uint64_t requestedNanos, const char* name) { +static bool LatencyWithinBounds(std::array samples, std::uint64_t requestedNanos, const char* name) { std::sort(samples.begin(), samples.end()); constexpr std::size_t p99Index = (N * 99 + 99) / 100 - 1; - Require(samples[p99Index] < P99_WAIT_MAX_NANOS); - Require(samples.back() < MAX_WAIT_NANOS); + const bool within = samples[p99Index] < P99_WAIT_MAX_NANOS && samples.back() < MAX_WAIT_NANOS; std::cout << name << ": P99 overshoot " << (samples[p99Index] - requestedNanos) / 1000 << " us (limit < " << (P99_WAIT_MAX_NANOS - requestedNanos) / 1000 << " us), max overshoot " << (samples.back() - requestedNanos) / 1000 - << " us (limit < " << (MAX_WAIT_NANOS - requestedNanos) / 1000 << " us)" << std::endl; + << " us (limit < " << (MAX_WAIT_NANOS - requestedNanos) / 1000 << " us)" << (within ? "" : " EXCEEDED") << std::endl; + return within; } #ifdef _WIN32 @@ -65,7 +65,7 @@ static std::uint64_t CurrentThreadCpuNanos() { } #endif -static void TestUsleep500us() { +static bool TestUsleep500us() { std::array samples{}; #ifdef _WIN32 const auto cpuStart = CurrentThreadCpuNanos(); @@ -88,10 +88,10 @@ static void TestUsleep500us() { const auto cpuNanos = cpuEnd - cpuStart; RequireCpuBound(cpuNanos, wallNanos, "sceKernelUsleep(500 us)"); #endif - RequireLatencyBounds(samples, 500000ULL, "sceKernelUsleep(500 us)"); + return LatencyWithinBounds(samples, 500000ULL, "sceKernelUsleep(500 us)"); } -static void TestUsleep100us() { +static bool TestUsleep100us() { std::array samples{}; #ifdef _WIN32 const auto cpuStart = CurrentThreadCpuNanos(); @@ -108,16 +108,17 @@ static void TestUsleep100us() { } const auto wallEnd = std::chrono::steady_clock::now(); - RequireLatencyBounds(samples, 100000ULL, "sceKernelUsleep(100 us)"); + const bool latencyWithinBounds = LatencyWithinBounds(samples, 100000ULL, "sceKernelUsleep(100 us)"); #ifdef _WIN32 const auto cpuEnd = CurrentThreadCpuNanos(); const auto wallNanos = static_cast(std::chrono::duration_cast(wallEnd - wallStart).count()); const auto cpuNanos = cpuEnd - cpuStart; RequireCpuBound(cpuNanos, wallNanos, "sceKernelUsleep(100 us)"); #endif + return latencyWithinBounds; } -static void TestCondTimedwait500us() { +static bool TestCondTimedwait500us() { std::array samples{}; PthreadMutex mutex = nullptr; PthreadCond cond = nullptr; @@ -152,12 +153,20 @@ static void TestCondTimedwait500us() { Require(scePthreadCondDestroy(&cond) == 0); Require(scePthreadMutexDestroy(&mutex) == 0); - RequireLatencyBounds(samples, 500000ULL, "scePthreadCondTimedwait(500 us)"); + return LatencyWithinBounds(samples, 500000ULL, "scePthreadCondTimedwait(500 us)"); +} + +static void RequireWithinBoundsInOneOfAttempts(bool (*test)(), int attempts) { + for (int attempt = 0; attempt < attempts; ++attempt) { + if (test()) return; + } + std::abort(); } int main() { - TestUsleep100us(); - TestUsleep500us(); - TestCondTimedwait500us(); + constexpr int ATTEMPTS = 3; + RequireWithinBoundsInOneOfAttempts(TestUsleep100us, ATTEMPTS); + RequireWithinBoundsInOneOfAttempts(TestUsleep500us, ATTEMPTS); + RequireWithinBoundsInOneOfAttempts(TestCondTimedwait500us, ATTEMPTS); return 0; } diff --git a/core/libs/tests/GuestUserServiceLifecycle.cpp b/core/libs/tests/GuestUserServiceLifecycle.cpp index 99a61cc97b..488ed4c805 100644 --- a/core/libs/tests/GuestUserServiceLifecycle.cpp +++ b/core/libs/tests/GuestUserServiceLifecycle.cpp @@ -30,6 +30,41 @@ int InitializeWithPriority(int priority) { return sceUserServiceInitialize(¶m); } +void TestInitialUserLogout() { + SceUserServiceEvent event{}; + UserServiceLoginUserIdList list{}; + int initial = -1; + Require(sceUserServiceGetInitialUser(&initial) == USER_SERVICE_OK && initial == USER_SERVICE_INITIAL_USER_ID); + + UserServiceSetUserConnected_nid_postfix(0, false); + Require(sceUserServiceGetEvent(&event) == USER_SERVICE_OK); + Require(event.event_type == 1 && event.user_id == USER_SERVICE_INITIAL_USER_ID); + Require(sceUserServiceGetLoginUserIdList(&list) == USER_SERVICE_OK); + Require(list.user_id[0] == USER_SERVICE_USER_ID_INVALID); + Require(sceUserServiceGetEvent(&event) == USER_SERVICE_ERROR_NO_EVENT); + + UserServiceSetUserConnected_nid_postfix(0, true); + Require(sceUserServiceGetEvent(&event) == USER_SERVICE_OK); + Require(event.event_type == 0 && event.user_id == USER_SERVICE_INITIAL_USER_ID); + Require(sceUserServiceGetLoginUserIdList(&list) == USER_SERVICE_OK); + Require(list.user_id[0] == USER_SERVICE_INITIAL_USER_ID); + Require(sceUserServiceGetEvent(&event) == USER_SERVICE_ERROR_NO_EVENT); + + UserServiceSetUserConnected_nid_postfix(0, false); + UserServiceSetUserConnected_nid_postfix(0, true); + Require(sceUserServiceGetEvent(&event) == USER_SERVICE_ERROR_NO_EVENT); + + UserServiceSetUserConnected_nid_postfix(0, false); + Require(sceUserServiceTerminate() == USER_SERVICE_OK); + Require(sceUserServiceInitialize(nullptr) == USER_SERVICE_OK); + Require(sceUserServiceGetEvent(&event) == USER_SERVICE_ERROR_NO_EVENT); + Require(sceUserServiceGetLoginUserIdList(&list) == USER_SERVICE_OK); + Require(list.user_id[0] == USER_SERVICE_USER_ID_INVALID); + UserServiceSetUserConnected_nid_postfix(0, true); + Require(sceUserServiceGetEvent(&event) == USER_SERVICE_OK); + Require(event.event_type == 0 && event.user_id == USER_SERVICE_INITIAL_USER_ID); +} + void TestThreadPriority() { for (int priority : {0, 0xFF, 0x300, -1}) { Require(InitializeWithPriority(priority) == USER_SERVICE_ERROR_INVALID_ARGUMENT); @@ -110,6 +145,7 @@ int main() { Require(sceUserServiceGetEvent(&event) == USER_SERVICE_OK); Require(event.event_type == 1 && event.user_id == USER_SERVICE_INITIAL_USER_ID + 2); + TestInitialUserLogout(); Require(sceUserServiceTerminate() == USER_SERVICE_OK); TestThreadPriority(); diff --git a/core/libs/tests/GuestVdecsw.cpp b/core/libs/tests/GuestVdecsw.cpp index 0990141df2..9b2bc63990 100644 --- a/core/libs/tests/GuestVdecsw.cpp +++ b/core/libs/tests/GuestVdecsw.cpp @@ -102,6 +102,12 @@ void checkGenericPictureInfo(const OutputInfo& output, const TInfo& typed) { shorter.thisSize = sizeof(OutputInfo) - 8; auto actual = typed; check(sceVdecswGetPictureInfo(&shorter, &actual, nullptr) == 0 && std::memcmp(&actual, &typed, sizeof(actual)) == 0, "generic picture info rejected the shorter output descriptor"); + auto doubled = output; + doubled.pictureCount = 2; + auto doubledFirst = typed; + const auto doubledBefore = doubledFirst; + auto doubledSecond = typed; + check(throws([&] { sceVdecswGetPictureInfo(&doubled, &doubledFirst, &doubledSecond); }) && std::memcmp(&doubledFirst, &doubledBefore, sizeof(doubledFirst)) == 0 && std::memcmp(&doubledSecond, &doubledBefore, sizeof(doubledSecond)) == 0, "generic picture info accepted two pictures"); } void testGenericPictureInfoValidation() { diff --git a/core/libs/tests/GuestWebBrowserDialog.cpp b/core/libs/tests/GuestWebBrowserDialog.cpp index d9afba0bd3..3c9c5b947d 100644 --- a/core/libs/tests/GuestWebBrowserDialog.cpp +++ b/core/libs/tests/GuestWebBrowserDialog.cpp @@ -1,4 +1,6 @@ #include "prx/libSceWebBrowserDialog/include/Api.hpp" +#include "prx/libSceIme/include/ModalDialog.hpp" +#include "prx/libSceIme/include/PsnDialogNotice.hpp" #include "prx/libc/include/general/VabiMacros.hpp" #include "prx/libSceCommonDialog/CommonDialog.hpp" #include @@ -18,6 +20,43 @@ constexpr int COMMON_DIALOG_ERROR_ARG_NULL = static_cast(0x80B8000Du); void Require(bool value) { if (!value) std::abort(); } + +bool GenericNoticeShown() { + ModalDialogView view; + if (!ModalDialogReadView_nid_postfix(view)) return false; + return view.message == PsnDialogNoticeRequest(PsnDialogNoticeKind::GenericFeature).message; +} + +void RequireNotices(const void* param) { + WebBrowserDialogAllowList allowList{}; + allowList.size = sizeof(allowList); + allowList.addresses[0] = "test.invalid"; + ModalDialogSetPresenter_nid_postfix(true); + Require(sceWebBrowserDialogInitialize() == 0); + + PsnDialogNoticeSetMode_nid_postfix(PsnDialogNoticeMode::Silent); + ModalDialogReset_nid_postfix(ModalDialogAnyOwner); + Require(sceWebBrowserDialogOpen(param) == 0); + Require(!GenericNoticeShown() && !ModalDialogCapturesInput_nid_postfix()); + + PsnDialogNoticeSetMode_nid_postfix(PsnDialogNoticeMode::Show); + ModalDialogReset_nid_postfix(ModalDialogAnyOwner); + Require(sceWebBrowserDialogOpen(nullptr) == COMMON_DIALOG_ERROR_ARG_NULL); + Require(!GenericNoticeShown()); + Require(sceWebBrowserDialogOpen(param) == 0); + Require(GenericNoticeShown()); + + PsnDialogNoticeSetMode_nid_postfix(PsnDialogNoticeMode::Show); + ModalDialogReset_nid_postfix(ModalDialogAnyOwner); + Require(sceWebBrowserDialogOpenForPredeterminedContent(param, &allowList) == 0); + Require(GenericNoticeShown()); + + ModalDialogReset_nid_postfix(ModalDialogAnyOwner); + ModalDialogSetPresenter_nid_postfix(false); + PsnDialogNoticeSetMode_nid_postfix(PsnDialogNoticeMode::Silent); + Require(sceWebBrowserDialogTerminate() == 0); +} + } int main() { @@ -83,6 +122,9 @@ int main() { Require(sceWebBrowserDialogInitialize() == 0); Require(sceWebBrowserDialogOpenForPredeterminedContent(nullptr, &allowList) == COMMON_DIALOG_ERROR_ARG_NULL); Require(sceWebBrowserDialogOpenForPredeterminedContent(param, nullptr) == COMMON_DIALOG_ERROR_ARG_NULL); + WebBrowserDialogAllowList badSizeAllowList = allowList; + badSizeAllowList.size = sizeof(badSizeAllowList) - 1; + Require(sceWebBrowserDialogOpenForPredeterminedContent(param, &badSizeAllowList) == static_cast(0x80B8000Au)); allowList.addresses[0] = nullptr; Require(sceWebBrowserDialogOpenForPredeterminedContent(param, &allowList) == static_cast(0x80B8000Au)); allowList.addresses[19] = "test.invalid"; @@ -146,5 +188,6 @@ int main() { Require(sceWebBrowserDialogGetResult(nullptr) == COMMON_DIALOG_ERROR_ARG_NULL); Require(sceWebBrowserDialogGetStatus() == COMMON_DIALOG_STATUS_NONE); Require(sceWebBrowserDialogUpdateStatus() == COMMON_DIALOG_STATUS_NONE); + RequireNotices(param); return 0; } diff --git a/core/libs/tests/GuestWideStreamScan.cpp b/core/libs/tests/GuestWideStreamScan.cpp index 857a72001f..1f4f1971d0 100644 --- a/core/libs/tests/GuestWideStreamScan.cpp +++ b/core/libs/tests/GuestWideStreamScan.cpp @@ -1,6 +1,7 @@ #include "prx/libc/include/Api.hpp" #include "prx/libc/include/FileStream.hpp" #include "prx/libc/include/general/VabiMacros.hpp" +#include "tests/TemporaryFile.hpp" #include #include #include @@ -55,7 +56,7 @@ static int APS5_VABI ScanInputSized(const char16_t* format, ...) { } static FileStream* Open(const char* text) { - auto* stream = new FileStream(std::tmpfile()); + auto* stream = new FileStream(TemporaryFile::Open()); Require(std::fputs(text, stream->GetHandle()) >= 0, "seed the stream"); std::rewind(stream->GetHandle()); return stream; diff --git a/core/libs/tests/GuestXmlValueTypes.cpp b/core/libs/tests/GuestXmlValueTypes.cpp new file mode 100644 index 0000000000..3a9bb35b5f --- /dev/null +++ b/core/libs/tests/GuestXmlValueTypes.cpp @@ -0,0 +1,228 @@ +#include "prx/libSceXml/include/Api.hpp" + +#include +#include +#include +#include +#include +#include + +namespace { + +constexpr std::uint8_t GUARD = 0xa5; +constexpr std::uint8_t FILL = 0x5a; + +void Require(bool value, const char* what) { + if (value) return; + std::fprintf(stderr, "failed: %s\n", what); + std::abort(); +} + +template +struct Guarded { + std::array before; + alignas(8) std::array object; + std::array after; + + explicit Guarded(std::uint8_t fill = FILL) { + before.fill(GUARD); + object.fill(fill); + after.fill(GUARD); + } + + template + T* As() { + return reinterpret_cast(object.data()); + } + + bool GuardsIntact() const { + for (std::uint8_t b : before) if (b != GUARD) return false; + for (std::uint8_t b : after) if (b != GUARD) return false; + return true; + } + + bool Bytes(std::size_t from, std::size_t to, std::uint8_t value) const { + for (std::size_t i = from; i < to; ++i) if (object[i] != value) return false; + return true; + } + + std::uint64_t Word(std::size_t offset) const { + std::uint64_t value; + std::memcpy(&value, object.data() + offset, sizeof(value)); + return value; + } +}; + +void* Address(std::uint64_t value) { + return reinterpret_cast(static_cast(value)); +} + +void TestHandles() { + using Constructor = void (APS5_VABI *)(XmlHandle*); + const Constructor constructors[] = { + _ZN3sce3Xml4AttrC1Ev, _ZN3sce3Xml4AttrC2Ev, _ZN3sce3Xml13AttributeListC1Ev, _ZN3sce3Xml13AttributeListC2Ev, + _ZN3sce3Xml3Dom8DocumentC1Ev, _ZN3sce3Xml3Dom8DocumentC2Ev, _ZN3sce3Xml3Dom15DocumentBuilderC1Ev, + _ZN3sce3Xml3Dom15DocumentBuilderC2Ev, _ZN3sce3Xml11InitializerC1Ev, _ZN3sce3Xml11InitializerC2Ev, + _ZN3sce3Xml3Dom8NodeListC1Ev, _ZN3sce3Xml3Dom8NodeListC2Ev, _ZN3sce3Xml3Sax6ParserC1Ev, _ZN3sce3Xml3Sax6ParserC2Ev, + }; + for (Constructor constructor : constructors) { + Guarded<16> handle; + constructor(handle.As()); + Require(handle.Bytes(0, 8, 0) && handle.Bytes(8, 16, FILL) && handle.GuardsIntact(), "handle constructor clears only its pointer"); + } +} + +void TestStrings() { + static const char text[] = "hello, xml"; + using Default = void (APS5_VABI *)(XmlString*); + using Counted = void (APS5_VABI *)(XmlString*, const char*, std::size_t); + using Terminated = void (APS5_VABI *)(XmlString*, const char*); + using Copy = void (APS5_VABI *)(XmlString*, const XmlString*); + for (Default construct : {_ZN3sce3Xml6StringC1Ev, _ZN3sce3Xml6StringC2Ev}) { + Guarded<16> string; + construct(string.As()); + Require(string.Bytes(0, 16, 0) && string.GuardsIntact(), "String() is empty"); + } + for (Counted construct : {_ZN3sce3Xml6StringC1EPKcm, _ZN3sce3Xml6StringC2EPKcm}) { + Guarded<16> string; + construct(string.As(), text, 3); + Require(string.As()->buffer == text && string.As()->size == 3 && string.GuardsIntact(), + "String(const char*, size_t) keeps the explicit length"); + construct(string.As(), nullptr, 0x123456789); + Require(string.As()->buffer == nullptr && string.As()->size == 0x123456789, "String(const char*, size_t) stores null as given"); + } + for (Terminated construct : {_ZN3sce3Xml6StringC1EPKc, _ZN3sce3Xml6StringC2EPKc}) { + Guarded<16> string; + construct(string.As(), text); + Require(string.As()->buffer == text && string.As()->size == 10 && string.GuardsIntact(), "String(const char*) uses strlen"); + construct(string.As(), nullptr); + Require(string.Bytes(0, 16, 0) && string.GuardsIntact(), "String(nullptr) has size 0"); + construct(string.As(), ""); + Require(string.As()->size == 0 && string.As()->buffer != nullptr, "String(\"\") keeps the pointer"); + } + const XmlString source{text + 1, 7}; + for (Copy copy : {_ZN3sce3Xml6StringC1ERKS1_, _ZN3sce3Xml6StringC2ERKS1_}) { + Guarded<16> string; + copy(string.As(), &source); + Require(string.As()->buffer == text + 1 && string.As()->size == 7 && string.GuardsIntact(), "String copy"); + } + Guarded<16> assigned; + Require(_ZN3sce3Xml6StringaSERKS1_(assigned.As(), &source) == assigned.As(), "String::operator= returns this"); + Require(assigned.As()->buffer == text + 1 && assigned.As()->size == 7 && assigned.GuardsIntact(), "String::operator= copies"); + + using SimpleDefault = void (APS5_VABI *)(XmlSimpleData*); + using SimpleCounted = void (APS5_VABI *)(XmlSimpleData*, const char*, std::size_t); + for (SimpleDefault construct : {_ZN3sce3Xml10SimpleDataC1Ev, _ZN3sce3Xml10SimpleDataC2Ev}) { + Guarded<16> data; + construct(data.As()); + Require(data.Bytes(0, 16, 0) && data.GuardsIntact(), "SimpleData() is empty"); + } + for (SimpleCounted construct : {_ZN3sce3Xml10SimpleDataC1EPKcm, _ZN3sce3Xml10SimpleDataC2EPKcm}) { + Guarded<16> data; + construct(data.As(), text, 4); + Require(data.As()->data == text && data.As()->size == 4 && data.GuardsIntact(), "SimpleData(const char*, size_t)"); + } +} + +void TestSerializeParameterAndAllocator() { + using Default = void (APS5_VABI *)(XmlSerializeParameter*); + for (Default construct : {_ZN3sce3Xml18SerializeParameterC1Ev, _ZN3sce3Xml18SerializeParameterC2Ev}) { + Guarded<24> parameter; + construct(parameter.As()); + Require(parameter.Bytes(0, 20, 0) && parameter.Bytes(20, 24, FILL) && parameter.GuardsIntact(), "SerializeParameter clears 20 bytes"); + } + using Destructor = void (APS5_VABI *)(void*); + for (Destructor destroy : {_ZN3sce3Xml12MemAllocatorD1Ev, _ZN3sce3Xml12MemAllocatorD2Ev}) { + Guarded<16> allocator; + destroy(allocator.object.data()); + Require(allocator.Bytes(0, 16, FILL) && allocator.GuardsIntact(), "MemAllocator destructor writes nothing"); + } +} + +XmlNodeId NodeIdValue(std::uint64_t first, std::uint64_t second, std::uint8_t flag, std::uint8_t padding) { + XmlNodeId value; + std::memset(&value, padding, sizeof(value)); + value.first = Address(first); + value.second = Address(second); + value.flag = flag; + return value; +} + +void TestNodeId() { + using Default = void (APS5_VABI *)(XmlNodeId*); + using Fields = void (APS5_VABI *)(XmlNodeId*, void*, void*, std::uint8_t); + for (Default construct : {_ZN3sce3Xml3Dom6NodeIdC1Ev, _ZN3sce3Xml3Dom6NodeIdC2Ev}) { + Guarded<24> id; + construct(id.As()); + Require(id.Bytes(0, 17, 0) && id.Bytes(17, 24, FILL) && id.GuardsIntact(), "NodeId() leaves its padding"); + } + for (Fields construct : {_ZN3sce3Xml3Dom6NodeIdC1EPvS3_b, _ZN3sce3Xml3Dom6NodeIdC2EPvS3_b}) { + Guarded<24> id; + construct(id.As(), Address(0x1122334455667788), Address(0x8877665544332211), 0xc3); + Require(id.Word(0) == 0x1122334455667788 && id.Word(8) == 0x8877665544332211 && id.object[16] == 0xc3 && id.Bytes(17, 24, FILL) && id.GuardsIntact(), + "NodeId(void*, void*, bool) keeps a nonzero flag byte and the padding"); + } + + Guarded<24> self; + const XmlNodeId value = NodeIdValue(0x0102030405060708, 0x1112131415161718, 0x81, 0xee); + const XmlNodeId returned = _ZN3sce3Xml3Dom6NodeIdaSES2_(self.As(), value); + Require(self.Word(0) == 0x0102030405060708 && self.Word(8) == 0x1112131415161718 && self.object[16] == 0x81 && self.Bytes(17, 24, FILL) && self.GuardsIntact(), + "NodeId::operator= assigns the fields by value and leaves the padding"); + Require(std::memcmp(&returned, self.object.data(), sizeof(returned)) == 0, "NodeId::operator= returns a copy of this, padding included"); + + const XmlNodeId base = NodeIdValue(0xaaaa, 0xbbbb, 0x80, 0x00); + const XmlNodeId paddingOnly = NodeIdValue(0xaaaa, 0xbbbb, 0x80, 0xff); + const XmlNodeId otherFlag = NodeIdValue(0xaaaa, 0xbbbb, 0x81, 0x00); + const XmlNodeId otherFirst = NodeIdValue(0xaaab, 0xbbbb, 0x80, 0x00); + const XmlNodeId otherSecond = NodeIdValue(0xaaaa, 0xbbbc, 0x80, 0x00); + Require(_ZN3sce3Xml3Dom6NodeIdeqES2_(&base, paddingOnly) && !_ZN3sce3Xml3Dom6NodeIdneES2_(&base, paddingOnly), "NodeId comparison ignores padding"); + for (const XmlNodeId* other : {&otherFlag, &otherFirst, &otherSecond}) { + Require(!_ZN3sce3Xml3Dom6NodeIdeqES2_(&base, *other) && _ZN3sce3Xml3Dom6NodeIdneES2_(&base, *other), "NodeId comparison uses every field"); + } + XmlNodeId any = NodeIdValue(0x1234, 0x5678, 1, 0); + Require(_ZN3sce3Xml3Dom6NodeIdcvPvEv(&any) == nullptr, "NodeId::operator void* is null"); +} + +void TestNode() { + std::array pattern{}; + for (std::size_t i = 0; i < pattern.size(); ++i) pattern[i] = static_cast(0x40 + i); + const auto* source = reinterpret_cast(pattern.data()); + auto copied = [&](const Guarded<64>& node) { + return std::memcmp(node.object.data(), pattern.data(), 17) == 0 && node.Bytes(17, 24, FILL) && + std::memcmp(node.object.data() + 24, pattern.data() + 24, 40) == 0 && node.GuardsIntact(); + }; + using Copy = void (APS5_VABI *)(XmlNode*, const XmlNode*); + for (Copy copy : {_ZN3sce3Xml3Dom4NodeC1ERKS2_, _ZN3sce3Xml3Dom4NodeC2ERKS2_}) { + Guarded<64> node; + copy(node.As(), source); + Require(copied(node), "Node copy keeps its NodeId padding and copies the rest"); + } + Guarded<64> node; + Require(_ZN3sce3Xml3Dom4NodeaSERKS2_(node.As(), source) == node.As(), "Node::operator= returns this"); + Require(copied(node), "Node::operator= copies like the copy constructor"); + Guarded<64> same(0x33); + Require(_ZN3sce3Xml3Dom4NodeaSERKS2_(same.As(), same.As()) == same.As() && same.Bytes(0, 64, 0x33) && same.GuardsIntact(), + "Node self-assignment changes nothing"); + + const std::uint64_t pointers[] = {0, 0x1, 0x0100000000000000}; + for (std::uint64_t document : pointers) { + for (std::uint64_t data : pointers) { + Guarded<64> available(0); + std::memcpy(available.object.data() + 0x18, &document, 8); + std::memcpy(available.object.data() + 0x20, &data, 8); + Require(_ZNK3sce3Xml3Dom4Node11isAvailableEv(available.As()) == (document != 0 && data != 0), "Node::isAvailable needs both pointers"); + } + } +} + +} + +int main() { + TestHandles(); + TestStrings(); + TestSerializeParameterAndAllocator(); + TestNodeId(); + TestNode(); + std::puts("guest_xml_value_types: all checks passed"); + return 0; +} diff --git a/core/libs/tests/JxrStream.cpp b/core/libs/tests/JxrStream.cpp index 7cf587da0c..066f187541 100644 --- a/core/libs/tests/JxrStream.cpp +++ b/core/libs/tests/JxrStream.cpp @@ -18,7 +18,7 @@ namespace { constexpr std::size_t PacketSize = 4096; -alignas(8192) std::array ringStorage; +alignas(8192) std::array ringStorage; std::span ring(reinterpret_cast((reinterpret_cast(ringStorage.data()) + 16383) & ~std::uintptr_t{16383}), 8192); std::array output; std::vector calls; diff --git a/core/libs/tests/PsnDialogNotice.cpp b/core/libs/tests/PsnDialogNotice.cpp new file mode 100644 index 0000000000..ca0ca2a5ee --- /dev/null +++ b/core/libs/tests/PsnDialogNotice.cpp @@ -0,0 +1,80 @@ +#include "prx/libSceIme/include/PsnDialogNotice.hpp" +#include +#include + +namespace { + +void Require(bool value, const char* what) { + if (!value) { + std::fprintf(stderr, "psn_dialog_notice: %s\n", what); + std::abort(); + } +} + +const char16_t* const kPsnText = u"This feature needs PlayStation Network, which AnyPS5 does not provide, so it is not available."; +const char16_t* const kGenericText = u"This system feature is not available in AnyPS5."; + +ModalDialogState StateFor(std::uint32_t owner, std::size_t& chosen) { + chosen = 7; + return ModalDialogPoll_nid_postfix(chosen, owner); +} + +bool ShownMessageIs(const char16_t* text) { + ModalDialogView view; + if (!ModalDialogReadView_nid_postfix(view)) return false; + return view.message == text && view.buttons.size() == 1 && view.buttons[0].label == u"OK" && view.buttons[0].selected; +} + +void Clear() { + ModalDialogReset_nid_postfix(ModalDialogAnyOwner); +} + +} + +int main() { + PsnDialogNoticeSetMode_nid_postfix(PsnDialogNoticeMode::Show); + std::size_t chosen = 0; + + Require(!PsnDialogNoticeOfferAt_nid_postfix(PsnDialogNoticeKind::PsnFeature, 0), "an offer was shown without a presenter"); + Require(StateFor(ModalDialogAnyOwner, chosen) == ModalDialogState::Idle, "a refused offer left a modal dialog open"); + + ModalDialogSetPresenter_nid_postfix(true); + Require(PsnDialogNoticeOfferAt_nid_postfix(PsnDialogNoticeKind::PsnFeature, 0), "the first offer with a presenter was refused"); + Require(ModalDialogCapturesInput_nid_postfix(), "the notice does not capture input while it shows"); + Require(ShownMessageIs(kPsnText), "the PSN notice text or its OK button is wrong"); + Require(StateFor(ModalDialogOwnerPsnNotice, chosen) == ModalDialogState::Showing, "the notice is not owned by its library"); + Require(StateFor(ModalDialogOwnerErrorDialog, chosen) == ModalDialogState::Idle, "another owner sees the notice"); + + Require(!PsnDialogNoticeOfferAt_nid_postfix(PsnDialogNoticeKind::GenericFeature, 2500), "an offer replaced a notice that is still showing"); + Require(ShownMessageIs(kPsnText), "a refused offer changed the notice that is showing"); + + ModalDialogPublishInput_nid_postfix(ModalDialogInputKind::Confirm); + Require(StateFor(ModalDialogOwnerPsnNotice, chosen) == ModalDialogState::Answered, "OK does not end the notice"); + Clear(); + + Require(!PsnDialogNoticeOfferAt_nid_postfix(PsnDialogNoticeKind::PsnFeature, 1000), "a second notice came inside the two-second interval"); + Require(!PsnDialogNoticeOfferAt_nid_postfix(PsnDialogNoticeKind::GenericFeature, 1999), "a notice came one millisecond inside the interval"); + Require(PsnDialogNoticeOfferAt_nid_postfix(PsnDialogNoticeKind::GenericFeature, 2000), "a notice was refused at exactly the interval"); + Require(ShownMessageIs(kGenericText), "the generic notice text is wrong"); + Clear(); + + Require(!PsnDialogNoticeOfferAt_nid_postfix(PsnDialogNoticeKind::PsnFeature, 2001), "the interval does not count from the last shown notice"); + Clear(); + + ModalDialogSetPresenter_nid_postfix(false); + Require(!PsnDialogNoticeOfferAt_nid_postfix(PsnDialogNoticeKind::PsnFeature, 9000), "an offer was shown without a presenter after a reset"); + ModalDialogSetPresenter_nid_postfix(true); + Require(PsnDialogNoticeOfferAt_nid_postfix(PsnDialogNoticeKind::PsnFeature, 9001), "a refused offer started the interval"); + Clear(); + + PsnDialogNoticeSetMode_nid_postfix(PsnDialogNoticeMode::Silent); + Require(!PsnDialogNoticeOfferAt_nid_postfix(PsnDialogNoticeKind::PsnFeature, 20000), "silent mode showed a notice"); + Require(StateFor(ModalDialogAnyOwner, chosen) == ModalDialogState::Idle, "silent mode opened a modal dialog"); + Require(!ModalDialogCapturesInput_nid_postfix(), "silent mode captures input"); + + PsnDialogNoticeSetMode_nid_postfix(PsnDialogNoticeMode::Show); + Require(PsnDialogNoticeOfferAt_nid_postfix(PsnDialogNoticeKind::PsnFeature, 20000), "show mode is not restored after silent"); + Clear(); + ModalDialogSetPresenter_nid_postfix(false); + return 0; +} diff --git a/core/libs/tests/PsnDialogNoticeMode.cpp b/core/libs/tests/PsnDialogNoticeMode.cpp new file mode 100644 index 0000000000..ca5ed31da6 --- /dev/null +++ b/core/libs/tests/PsnDialogNoticeMode.cpp @@ -0,0 +1,43 @@ +#include "prx/libSceIme/include/PsnDialogNotice.hpp" +#include +#include +#include +#include + +namespace { + +void Require(bool value, const char* what) { + if (!value) { + std::fprintf(stderr, "psn_dialog_notice_mode: %s\n", what); + std::abort(); + } +} + +void RefusesNamingVariable(const char* text) { + try { + ParsePsnDialogNoticeMode(text); + } catch (const std::runtime_error& error) { + const std::string message = error.what(); + Require(message.find("ANYPS5_PSN_DIALOGS") != std::string::npos, "the refusal does not name the variable"); + Require(message.find(std::string("'") + text + "'") != std::string::npos, "the refusal does not name the value"); + return; + } + Require(false, "an invalid value was accepted"); +} + +} + +int main() { + Require(ParsePsnDialogNoticeMode(nullptr) == PsnDialogNoticeMode::Silent, "an unset variable is not silent"); + Require(ParsePsnDialogNoticeMode("") == PsnDialogNoticeMode::Silent, "an empty value is not the same as unset"); + Require(ParsePsnDialogNoticeMode("silent") == PsnDialogNoticeMode::Silent, "silent is not silent"); + Require(ParsePsnDialogNoticeMode("show") == PsnDialogNoticeMode::Show, "show is not show"); + RefusesNamingVariable("Show"); + RefusesNamingVariable("SHOW"); + RefusesNamingVariable("show "); + RefusesNamingVariable("1"); + RefusesNamingVariable("0"); + RefusesNamingVariable("on"); + RefusesNamingVariable("yes"); + return 0; +} diff --git a/core/libs/tests/TemporaryFile.hpp b/core/libs/tests/TemporaryFile.hpp new file mode 100644 index 0000000000..67db2f803b --- /dev/null +++ b/core/libs/tests/TemporaryFile.hpp @@ -0,0 +1,38 @@ +#ifndef CORE_LIBS_TESTS_TEMPORARYFILE_HPP +#define CORE_LIBS_TESTS_TEMPORARYFILE_HPP + +#include + +#ifdef _WIN32 +#include +#include +#include +#include +#include +#include +#include +#endif + +namespace TemporaryFile { + +inline std::FILE* Open() { +#ifdef _WIN32 + static std::atomic serial{0}; + std::error_code error; + const auto directory = std::filesystem::temp_directory_path(error); + if (error) return nullptr; + for (int attempt = 0; attempt < 100; ++attempt) { + const auto tick = std::chrono::steady_clock::now().time_since_epoch().count(); + const auto name = directory / ("anyps5-test-" + std::to_string(_getpid()) + "-" + std::to_string(tick) + "-" + std::to_string(serial++) + ".tmp"); + if (std::FILE* file = _wfopen(name.c_str(), L"w+bxD")) return file; + if (errno != EEXIST) return nullptr; + } + return nullptr; +#else + return std::tmpfile(); +#endif +} + +} + +#endif diff --git a/core/libs/tests/test_public_headers.py b/core/libs/tests/test_public_headers.py index 2511659765..6e99eb6ec8 100644 --- a/core/libs/tests/test_public_headers.py +++ b/core/libs/tests/test_public_headers.py @@ -16,6 +16,9 @@ SPEC = importlib.util.spec_from_file_location("nid_names", ROOT / "tools/nid_nam NIDS = importlib.util.module_from_spec(SPEC) SPEC.loader.exec_module(NIDS) DECLARATION = re.compile(r"(?:\bAPS5_VABI\s+|^[ \t]*[A-Za-z_][\w:*&<> \t]*?[ \t]+)(\w+)\s*\([^;{}]*\)\s*(?:noexcept\s*)?;", re.M) +DATA_DECLARATION = re.compile( + r"^[ \t]*extern\s+(?:const\s+)?[A-Za-z_][\w:<>]*(?:\s+(?:const|volatile))?\s+\**\s*(\w+)\s*(?:\[[^;\]\n]*\])?\s*;", re.M +) INCLUDE = re.compile(r'^\s*#\s*include\s*"([^"]+)"', re.M) TYPE_TOKEN = re.compile(r"\bnamespace\s*([\w:]*)\s*\{|\bextern\s*\{|\b(?:struct|union|class)\s+(\w+)\s*([;{])|\busing\s+(\w+)\s*=|[{}]") @@ -121,7 +124,7 @@ def audit(): for name in definitions | aliases: if name.endswith(("_nid_no_patch", "_nid_no_patch_cut")): continue - exports.setdefault(name, []).append((source, included)) + exports.setdefault(name, []).append((source, included, name in definitions)) declarations = {name: [] for name in exports} for source in sorted((ROOT / "core").rglob("*")): if source.suffix not in {".cpp", ".h", ".hpp"}: @@ -134,18 +137,24 @@ def audit(): prefix = match.group()[:match.start(1) - match.start()] if re.search(r"\b(?:return|co_return|throw|else|case)\b|&&|\|\|", prefix): continue - declarations[match.group(1)].append((resolved, text.count("\n", 0, match.start()) + 1)) + declarations[match.group(1)].append((resolved, text.count("\n", 0, match.start()) + 1, "function")) + for match in DATA_DECLARATION.finditer(text): + if match.group(1) in declarations: + declarations[match.group(1)].append((resolved, text.count("\n", 0, match.start()) + 1, "data")) errors = [] headers = set(umbrellas) for name, definitions in exports.items(): found = declarations[name] if len(found) != 1 or found[0][0].suffix not in {".h", ".hpp"}: - locations = ", ".join(f"{path.relative_to(ROOT)}:{line}" for path, line in found) + locations = ", ".join(f"{path.relative_to(ROOT)}:{line}" for path, line, _ in found) errors.append(f"{name}: expected exactly one header declaration; found {len(found)}: {locations}") continue - header = found[0][0] + header, _, kind = found[0] + if kind != "function" and any(is_function for _, _, is_function in definitions): + errors.append(f"{name}: function definition requires a function declaration") + continue headers.add(header) - for source, included in definitions: + for source, included, _ in definitions: if header not in included: errors.append(f"{name}: {header.relative_to(ROOT)} is not included by {source.parent} library umbrella") if errors: diff --git a/core/relinker/cli/src/CliArgs.cpp b/core/relinker/cli/src/CliArgs.cpp index 697a5de1aa..8a6f7b2aef 100644 --- a/core/relinker/cli/src/CliArgs.cpp +++ b/core/relinker/cli/src/CliArgs.cpp @@ -110,14 +110,7 @@ Args ParseArgs(int argc, char* argv[]) { if (args.windowsFixedBase) throw std::runtime_error("--windows-fixed-base cannot be repeated"); if (i + 1 >= argc || std::string(argv[i + 1]).empty() || std::string(argv[i + 1]).starts_with("--")) throw std::runtime_error("--windows-fixed-base requires an address"); - std::string_view value(argv[++i]); - const bool hexadecimal = value.starts_with("0x") || value.starts_with("0X"); - if (hexadecimal) value.remove_prefix(2); - std::uint64_t address = 0; - const auto parsed = std::from_chars(value.data(), value.data() + value.size(), address, hexadecimal ? 16 : 10); - if (parsed.ec != std::errc{} || parsed.ptr != value.data() + value.size() || address < 0x20000 || address > 0x7fffffff0000 || (address & 0xffff) != 0) - throw std::runtime_error("--windows-fixed-base requires a 64 KiB-aligned address from 0x20000 through 0x7fffffff0000"); - args.windowsFixedBase = address; + args.windowsFixedBase = ParseFixedBase(argv[++i], 0x20000, "--windows-fixed-base requires a 64 KiB-aligned address from 0x20000 through 0x7fffffff0000"); } else if (arg == "--linux-fixed-base") { if (args.linuxFixedBase) throw std::runtime_error("--linux-fixed-base cannot be repeated"); if (i + 1 >= argc || std::string_view(argv[i + 1]).empty() || std::string_view(argv[i + 1]).starts_with("--")) diff --git a/core/relinker/cli/tests/CliArgsTests.cpp b/core/relinker/cli/tests/CliArgsTests.cpp index a56f25be56..b7e0a7d218 100644 --- a/core/relinker/cli/tests/CliArgsTests.cpp +++ b/core/relinker/cli/tests/CliArgsTests.cpp @@ -223,6 +223,8 @@ void windowsFixedBase() { const auto args = parse({"--windows-fixed-base", value, "--windows", "input.elf", "output.exe"}); require(args.windowsFixedBase == 0x400000, "fixed base was parsed incorrectly"); } + require(parse({"--windows", "--windows-fixed-base", "0x20000", "input.elf", "output.exe"}).windowsFixedBase == 0x20000, "lowest fixed base was rejected"); + require(parse({"--windows", "--windows-fixed-base", "0x7fffffff0000", "input.elf", "output.exe"}).windowsFixedBase == 0x7fffffff0000, "highest fixed base was rejected"); require(parse({"--windows", "--windows-fixed-base", "0x400000000", "input.elf", "output.exe"}).windowsFixedBase == 0x400000000, "fixed base was truncated to 32 bits"); for (const auto& value : {"0", "0x10000", "0x400001", "0x", "-4194304", "+4194304", " 4194304", "0x400000junk", "18446744073709551616", "0x800000000000"}) expectThrows({"--windows", "--windows-fixed-base", value, "input.elf", "output.exe"}, "--windows-fixed-base requires a 64 KiB-aligned address from 0x20000 through 0x7fffffff0000"); diff --git a/core/relinker/codegen/include/codegen/x86/X64OpcodeConstants.hpp b/core/relinker/codegen/include/codegen/x86/X64OpcodeConstants.hpp index 648b8cbd79..b48555e99d 100644 --- a/core/relinker/codegen/include/codegen/x86/X64OpcodeConstants.hpp +++ b/core/relinker/codegen/include/codegen/x86/X64OpcodeConstants.hpp @@ -218,6 +218,8 @@ inline constexpr std::uint8_t ModRmRmRipRelative = 0x05; inline constexpr std::uint8_t Grp3RegTestMax = 0x01; inline constexpr std::uint8_t SibBaseMask = 0x07; inline constexpr std::uint8_t SibBaseDisp32 = 0x05; +inline constexpr std::uint8_t SibIndexMask = 0x38; +inline constexpr std::uint8_t SibIndexNone = 0x20; inline constexpr std::size_t Disp8Size = 1; inline constexpr std::size_t Disp32Size = 4; diff --git a/core/relinker/codegen/src/x86/WideStoreOperands.cpp b/core/relinker/codegen/src/x86/WideStoreOperands.cpp index 478c4108ed..529d39596b 100644 --- a/core/relinker/codegen/src/x86/WideStoreOperands.cpp +++ b/core/relinker/codegen/src/x86/WideStoreOperands.cpp @@ -37,8 +37,11 @@ void _appendU32(std::vector& bytes, const std::uint32_t value) { std::optional DecodeVexWideStore(const std::uint8_t* data, const std::size_t length) { using namespace X64OpcodeConstants; std::size_t pos = 0; - while (pos < length && _legacyPrefixAllowed(data[pos])) + bool addressSize32 = false; + while (pos < length && _legacyPrefixAllowed(data[pos])) { + addressSize32 = addressSize32 || data[pos] == PrefixAddressSize; ++pos; + } const auto vex = pos; if (vex + 2 > length) return std::nullopt; @@ -76,6 +79,7 @@ std::optional DecodeVexWideStore(const std::uint8_t* data, co } const bool ripRelative = mod == ModRmModIndirect && rm == ModRmRmRipRelative; const bool absolute = mod == ModRmModIndirect && sib.has_value() && (*sib & SibBaseMask) == SibBaseDisp32; + const bool absoluteNoIndex = absolute && (*sib & SibIndexMask) == SibIndexNone && (inverted & 0x40) != 0; const std::size_t displacementSize = mod == ModRmModDisp8 ? Disp8Size : (mod == ModRmModDisp32 || ripRelative || absolute) ? Disp32Size : 0; if (cursor + displacementSize != length) return std::nullopt; @@ -110,8 +114,16 @@ std::optional DecodeVexWideStore(const std::uint8_t* data, co highDisplacementSize = highMod == ModRmModDisp8 ? Disp8Size : Disp32Size; } } - if (!ripRelative && highDisplacement > std::numeric_limits::max()) - throw CodegenException("256-bit store displacement leaves no room for its upper half"); + const bool address32Absolute = addressSize32 && absoluteNoIndex; + const auto unsignedHighDisplacement = static_cast(static_cast(displacement)) + kHalfBytes; + if (!ripRelative) { + if (address32Absolute) { + if (unsignedHighDisplacement > std::numeric_limits::max()) + throw CodegenException("256-bit store displacement leaves no room for its upper half"); + } else if (highDisplacement > std::numeric_limits::max()) { + throw CodegenException("256-bit store displacement leaves no room for its upper half"); + } + } high.push_back(static_cast((highMod << ModRmModShift) | reg | rm)); if (sib) high.push_back(*sib); @@ -121,7 +133,7 @@ std::optional DecodeVexWideStore(const std::uint8_t* data, co else if (ripRelative) _appendU32(high, 0); else if (highDisplacementSize == Disp32Size) - _appendU32(high, static_cast(static_cast(highDisplacement))); + _appendU32(high, static_cast(highDisplacement)); high.push_back(kUpperHalf); if (ripRelative) { operands.High.RipDisplacementOffset = highDisplacementOffset; diff --git a/core/relinker/codegen/tests/Amd64OnlyConverterTests.cpp b/core/relinker/codegen/tests/Amd64OnlyConverterTests.cpp index 451340b35f..f0165db65f 100644 --- a/core/relinker/codegen/tests/Amd64OnlyConverterTests.cpp +++ b/core/relinker/codegen/tests/Amd64OnlyConverterTests.cpp @@ -839,6 +839,19 @@ void wideStoreSplit() { require(farRipSplit && farRipSplit->High.RipTarget == std::int64_t{8} + 0x7FFFFFF8 + 0x10, "A RIP-relative 256-bit store near the end of its displacement range was not split"); const Bytes farBase = {0xC5, 0xFC, 0x11, 0x80, 0xF8, 0xFF, 0xFF, 0x7F}; requireFailure([&] { (void)Codegen::DecodeVexWideStore(farBase.data(), farBase.size()); }, "A 256-bit store whose upper half has no 32-bit displacement was kept"); + const Bytes absolute32 = {0x67, 0xC5, 0xFC, 0x11, 0x04, 0x25, 0xF8, 0xFF, 0xFF, 0x7F}; + const auto absolute32Split = Codegen::DecodeVexWideStore(absolute32.data(), absolute32.size()); + require(absolute32Split && absolute32Split->Low.Bytes == Bytes{0x67, 0xC5, 0xF8, 0x11, 0x04, 0x25, 0xF8, 0xFF, 0xFF, 0x7F} && absolute32Split->High.Bytes == Bytes{0x67, 0xC4, 0xE3, 0x7D, 0x19, 0x04, 0x25, 0x08, 0x00, 0x00, 0x80, 0x01}, "A 32-bit absolute 256-bit store was not split across the signed displacement boundary"); + const Bytes disp32 = {0x67, 0xC5, 0xFC, 0x11, 0x80, 0xF8, 0xFF, 0xFF, 0x7F}; + requireFailure([&] { (void)Codegen::DecodeVexWideStore(disp32.data(), disp32.size()); }, "A 32-bit base-relative 256-bit store whose upper half can wrap was split"); + const Bytes indexed32 = {0x67, 0xC5, 0xFC, 0x11, 0x04, 0x0D, 0xF8, 0xFF, 0xFF, 0x7F}; + requireFailure([&] { (void)Codegen::DecodeVexWideStore(indexed32.data(), indexed32.size()); }, "A 32-bit indexed 256-bit store whose upper half can wrap was split"); + const Bytes extendedIndex32 = {0x67, 0xC4, 0xA1, 0x7C, 0x11, 0x04, 0x25, 0xF8, 0xFF, 0xFF, 0x7F}; + requireFailure([&] { (void)Codegen::DecodeVexWideStore(extendedIndex32.data(), extendedIndex32.size()); }, "A 32-bit store indexed by an extended register through VEX.X was split as absolute"); + const Bytes absolute32Overflow = {0x67, 0xC5, 0xFC, 0x11, 0x04, 0x25, 0xF8, 0xFF, 0xFF, 0xFF}; + requireFailure([&] { (void)Codegen::DecodeVexWideStore(absolute32Overflow.data(), absolute32Overflow.size()); }, "A 32-bit absolute 256-bit store whose upper half crosses the address boundary was split"); + const Bytes absolute64 = {0xC5, 0xFC, 0x11, 0x04, 0x25, 0xF8, 0xFF, 0xFF, 0x7F}; + requireFailure([&] { (void)Codegen::DecodeVexWideStore(absolute64.data(), absolute64.size()); }, "A 64-bit absolute 256-bit store whose upper half has no signed displacement was kept"); requireFailure([] { Codegen::StubBodyBuilder body; body.RipRelative(Bytes{0x90}, 0, 0); }, "A RIP-relative displacement outside its instruction was relocated"); const auto rosetta = Codegen::MakeAmd64OnlyInstructionMatcher(Codegen::Amd64OnlyTarget::Rosetta); const Bytes store = {0xC4, 0xC1, 0x7C, 0x11, 0x47, 0x68}; diff --git a/core/relinker/relinker/src/analysis/CodeInstructionCollector.cpp b/core/relinker/relinker/src/analysis/CodeInstructionCollector.cpp index 71a8066f4b..9297528c16 100644 --- a/core/relinker/relinker/src/analysis/CodeInstructionCollector.cpp +++ b/core/relinker/relinker/src/analysis/CodeInstructionCollector.cpp @@ -54,7 +54,10 @@ std::set CodeInstructionCollector::Collect(const std::ve const auto fileOffset = [&](std::uint64_t address, std::uint64_t size) { for (const auto& header : headers) { if (header.Type != 1 || address < header.MappedAddress || address - header.MappedAddress > header.FileSize || size > header.FileSize - (address - header.MappedAddress)) continue; - const auto offset = header.Offset + address - header.MappedAddress; + const auto relative = address - header.MappedAddress; + if (relative > std::numeric_limits::max() - header.Offset) + throw Domain::RelinkerException("Code analysis: file range exceeds image", header.Offset); + const auto offset = header.Offset + relative; range(offset, size); return offset; } diff --git a/core/relinker/relinker/src/analysis/UnusedNidFilter/ControlFlowGraph.cpp b/core/relinker/relinker/src/analysis/UnusedNidFilter/ControlFlowGraph.cpp index d8c89bcffb..dfaab81f75 100644 --- a/core/relinker/relinker/src/analysis/UnusedNidFilter/ControlFlowGraph.cpp +++ b/core/relinker/relinker/src/analysis/UnusedNidFilter/ControlFlowGraph.cpp @@ -133,7 +133,7 @@ void buildGraph(std::span text, VirtualAddress textVaddr, Vi std::memcpy(&disp, text.data() + bufOff + info.RipRelativeDispOffset, 4); VirtualAddress slotVaddr = nextVaddr + static_cast(static_cast(disp)); if (info.AddressSize32) slotVaddr = static_cast(slotVaddr); - auto resolved = relativeRelocations.TargetOfSlot(slotVaddr); + auto resolved = info.SegmentPrefix == 0 ? relativeRelocations.TargetOfSlot(slotVaddr) : std::nullopt; if (resolved.has_value()) enqueue(*resolved); } else if (info.HasBranchTarget) { @@ -146,7 +146,7 @@ void buildGraph(std::span text, VirtualAddress textVaddr, Vi std::memcpy(&disp, text.data() + bufOff + info.RipRelativeDispOffset, 4); VirtualAddress slotVaddr = nextVaddr + static_cast(static_cast(disp)); if (info.AddressSize32) slotVaddr = static_cast(slotVaddr); - auto resolved = relativeRelocations.TargetOfSlot(slotVaddr); + auto resolved = info.SegmentPrefix == 0 ? relativeRelocations.TargetOfSlot(slotVaddr) : std::nullopt; if (resolved.has_value()) enqueue(*resolved); } else if (info.HasBranchTarget) { diff --git a/core/relinker/relinker/src/analysis/UnusedNidFilter/EhFrameReader.cpp b/core/relinker/relinker/src/analysis/UnusedNidFilter/EhFrameReader.cpp index b141b5b4b8..5045239694 100644 --- a/core/relinker/relinker/src/analysis/UnusedNidFilter/EhFrameReader.cpp +++ b/core/relinker/relinker/src/analysis/UnusedNidFilter/EhFrameReader.cpp @@ -140,7 +140,7 @@ private: const bool negative = (value >> 63) != 0; if (negative ? base < std::uint64_t{0} - value : value > std::numeric_limits::max() - base) throw RelinkerException("Strict filter: unwind pointer address overflowed", field); - } else if ((encoding & 0x0F) == 2 || (encoding & 0x0F) == 3) { + } else if ((encoding & 0x0F) == 2 || (encoding & 0x0F) == 3 || ((encoding & 0x0F) == 4 && (encoding & 0x70) == 0x40)) { if (value > std::numeric_limits::max() - base) throw RelinkerException("Strict filter: unwind pointer address overflowed", field); } diff --git a/core/relinker/relinker/src/analysis/UnusedNidFilter/EntryPointCollector.cpp b/core/relinker/relinker/src/analysis/UnusedNidFilter/EntryPointCollector.cpp index 947521c429..3a095c196c 100644 --- a/core/relinker/relinker/src/analysis/UnusedNidFilter/EntryPointCollector.cpp +++ b/core/relinker/relinker/src/analysis/UnusedNidFilter/EntryPointCollector.cpp @@ -133,7 +133,10 @@ public: } } if (!container) throw RelinkerException("Init/fini array is not file-backed", arrayVa); - std::uint64_t arrayFileOff = container->fileOffset + (arrayVa - container->vaddr); + const auto relative = arrayVa - container->vaddr; + if (relative > std::numeric_limits::max() - container->fileOffset) + throw RelinkerException("Init/fini array is out of bounds", arrayVa); + const std::uint64_t arrayFileOff = container->fileOffset + relative; if (arrayFileOff > elfBytes.size() || arraySz > elfBytes.size() - arrayFileOff) throw RelinkerException("Init/fini array is out of bounds", arrayVa); for (std::uint64_t k = 0; k < arraySz / 8; ++k) { diff --git a/core/relinker/relinker/tests/ControlFlowGraphTests.cpp b/core/relinker/relinker/tests/ControlFlowGraphTests.cpp index 70ba15bc88..4279e3741c 100644 --- a/core/relinker/relinker/tests/ControlFlowGraphTests.cpp +++ b/core/relinker/relinker/tests/ControlFlowGraphTests.cpp @@ -143,6 +143,41 @@ void CheckRelocatedTransfers() { RequireOffsets(*unresolved, {0, 6, 7, 8}); } +void CheckSegmentRelativeTransfers() { + for (const auto segment : {0x00, 0x26, 0x2e, 0x36, 0x3e, 0x64, 0x65}) { + for (const bool address32 : {false, true}) { + for (const bool call : {false, true}) { + Bytes text; + if (segment != 0) text.push_back(static_cast(segment)); + if (address32) text.push_back(0x67); + text.insert(text.end(), {0xff, static_cast(call ? 0x15 : 0x25), 0, 0, 0, 0}); + const auto next = text.size(); + text.push_back(0xc3); + text.resize(32, 0x90); + text.push_back(0xc3); + const auto slot = TextAddress + 0x1000; + SetDisplacement(text, next - 4, next, slot); + Pointers pointers; + pointers.Slots = {{address32 ? static_cast(slot) : slot, TextAddress + 32}}; + const auto graph = BuildControlFlowGraph(text, TextAddress, TextAddress, {}, pointers); + std::unordered_set expected{TextAddress}; + if (call) expected.insert(TextAddress + next); + if (segment != 0x64 && segment != 0x65) expected.insert(TextAddress + 32); + Require(graph->ReachableVaddrs() == expected, "Segment-relative transfer followed a flat relocation slot"); + if (segment == 0x64 || segment == 0x65) { + text[32] = 0x0f; + const auto unmapped = BuildControlFlowGraph(text, TextAddress, TextAddress, {}, pointers); + Require(unmapped->ReachableVaddrs() == expected, "Segment-relative transfer decoded unrelated bytes"); + const auto explicitRoot = BuildControlFlowGraph(Bytes(text.begin(), text.begin() + 32), TextAddress, + TextAddress, {TextAddress + 31}, pointers); + expected.insert(TextAddress + 31); + Require(explicitRoot->ReachableVaddrs() == expected, "Segment-relative transfer discarded an explicit root"); + } + } + } + } +} + void CheckAddressSizeOverride() { constexpr auto slot = TextAddress + 0x1000; Bytes text{0x67, 0xff, 0x15, 0, 0, 0, 0, 0x90, 0xc3, 0x67, 0xff, 0x25, 0, 0, 0, 0, 0x90, 0x90, 0xc3}; @@ -175,6 +210,12 @@ void CheckCodeAddresses() { RequireOffsets(*ordinary, {0, 7}); const auto addresses = BuildControlFlowGraph(text, TextAddress, TextAddress, {}, pointers, true); RequireOffsets(*addresses, {0, 7, 16}); + for (const std::uint8_t segment : {0x64, 0x65}) { + auto prefixed = text; + prefixed.insert(prefixed.begin(), segment); + const auto graph = BuildControlFlowGraph(prefixed, TextAddress, TextAddress, {}, pointers, true); + RequireOffsets(*graph, {0, 8, 17}); + } } void CheckSpeculativeRoots() { @@ -647,6 +688,7 @@ int main() { CheckCallsBeforeZeroPadding(); CheckCallsThatStillFallThrough(); CheckRelocatedTransfers(); + CheckSegmentRelativeTransfers(); CheckAddressSizeOverride(); CheckCodeAddresses(); CheckSpeculativeRoots(); diff --git a/core/relinker/relinker/tests/ConversionTests.cpp b/core/relinker/relinker/tests/ConversionTests.cpp index 7de59e4759..60a5bb4e85 100644 --- a/core/relinker/relinker/tests/ConversionTests.cpp +++ b/core/relinker/relinker/tests/ConversionTests.cpp @@ -245,6 +245,49 @@ void scanning() { }); require(instructions.size() == code.size(), "Progress changed image code analysis"); require(updates > 10 && previous == 10000, "Missing intermediate image analysis progress"); + std::vector wrappingImage(0x1000); + Io::WriteU64(wrappingImage, 24, 0x2000); + wrappingImage[0x200] = 0xc3; + wrappingImage[0x208] = 0xc3; + Io::WriteU64(wrappingImage, 0x3c0, 0x2008); + Io::WriteU64(wrappingImage, 0x700, 0x2008); + Domain::ProgramHeader execHeader{}; + execHeader.Type = 1; + execHeader.Flags = 1; + execHeader.Offset = 0x200; + execHeader.MappedAddress = 0x2000; + execHeader.FileSize = 0x100; + execHeader.MemorySize = 0x100; + Domain::ProgramHeader dynamicHeader{}; + dynamicHeader.Type = 2; + dynamicHeader.Flags = 6; + dynamicHeader.Offset = 0x100; + dynamicHeader.MappedAddress = 0x1000; + dynamicHeader.FileSize = 48; + dynamicHeader.MemorySize = 48; + Domain::ProgramHeader wrappingDataHeader{}; + wrappingDataHeader.Type = 1; + wrappingDataHeader.Flags = 0; + wrappingDataHeader.Offset = ~std::uint64_t{0} - 63; + wrappingDataHeader.MappedAddress = 0x8000; + wrappingDataHeader.FileSize = 0x410; + wrappingDataHeader.MemorySize = 0x410; + auto controlDataHeader = wrappingDataHeader; + controlDataHeader.Offset = 0x300; + for (const auto [addrTag, sizeTag] : {std::pair{25u, 27u}, std::pair{26u, 28u}, std::pair{32u, 33u}}) { + Io::WriteU64(wrappingImage, 0x100, addrTag); + Io::WriteU64(wrappingImage, 0x108, 0x8400); + Io::WriteU64(wrappingImage, 0x110, sizeTag); + Io::WriteU64(wrappingImage, 0x118, 8); + Io::WriteU64(wrappingImage, 0x120, 0); + Io::WriteU64(wrappingImage, 0x128, 0); + reject([&] { Relinker::CodeInstructionCollector().Collect(wrappingImage, {execHeader, dynamicHeader, wrappingDataHeader}); }); + const auto roots = Relinker::CodeInstructionCollector().Collect(wrappingImage, {execHeader, dynamicHeader, controlDataHeader}); + require(roots == std::set{0x2000, 0x2008}, "Valid initializer array roots were not collected"); + Io::WriteU64(wrappingImage, 0x3c0, 0); + reject([&] { Relinker::CodeInstructionCollector().Collect(wrappingImage, {execHeader, dynamicHeader, wrappingDataHeader}); }); + Io::WriteU64(wrappingImage, 0x3c0, 0x2008); + } code[70000] = 0x0f; code[70001] = 0x05; progress.Events.clear(); diff --git a/core/relinker/relinker/tests/UnwindRecordBoundsTests.cpp b/core/relinker/relinker/tests/UnwindRecordBoundsTests.cpp index 7012706870..fe1fdf9976 100644 --- a/core/relinker/relinker/tests/UnwindRecordBoundsTests.cpp +++ b/core/relinker/relinker/tests/UnwindRecordBoundsTests.cpp @@ -1,8 +1,11 @@ #include #include +#include #include #include #include +#include +#include static void Require(bool ok) { if (!ok) throw std::runtime_error("Unwind record validation failed"); } @@ -49,7 +52,7 @@ int main() { auto empty = Fixture(); Io::WriteU64(empty, 112, 0); Require(Relinker::UnusedNidFilter::ReadExceptionFunctions(empty, {load, eh}, {}, {}).empty()); - for (int kind = 0; kind < 11; ++kind) { + for (int kind = 0; kind < 13; ++kind) { auto bytes = Fixture(); auto segment = load; switch (kind) { case 0: Io::WriteU32(bytes, 64, 0x1000); break; @@ -78,6 +81,20 @@ int main() { Io::WriteU64(bytes, 104, 0x800); break; } + case 11: { + bytes[3] = 0x3B; + Io::WriteU32(bytes, 96, 0x80000000); + Io::WriteU32(bytes, 100, 0x80000000); + break; + } + case 12: { + bytes[3] = 0x49; + bytes[96] = 0; + bytes[97] = 0x80; + bytes[98] = 0; + bytes[99] = 0x80; + break; + } } bool rejected = false; std::vector headers = {segment, eh}; @@ -93,6 +110,248 @@ int main() { catch (const std::exception&) { rejected = true; } Require(rejected); } - std::cout << "17 unwind record cases passed\n"; + auto tableOverflow = Fixture(); + tableOverflow[3] = 0x39; + tableOverflow[16] = 0x80; + tableOverflow[17] = 0x20; + tableOverflow[18] = 0x80; + tableOverflow[19] = 0x20; + Domain::ProgramHeader highLoad{}; highLoad.Type = 1; highLoad.MappedAddress = 0xFFFFFFFFFFFFF000ULL; highLoad.FileSize = 128; + Domain::ProgramHeader highEh = highLoad; highEh.Type = 0x6474E550; highEh.FileSize = 32; + bool overflowRejected = false; + try { Relinker::UnusedNidFilter::ReadExceptionFunctions(tableOverflow, {highLoad, highEh}, {}, {}); } + catch (const Domain::RelinkerException& error) { + overflowRejected = std::string(error.what()).find("unwind pointer address overflowed") != std::string::npos; + } + Require(overflowRejected); + auto udata4Overflow = Fixture(); + udata4Overflow[3] = 0x33; + Io::WriteU32(udata4Overflow, 16, 0xFFFFFFFF); + Io::WriteU32(udata4Overflow, 20, 0xFFFFFFFF); + Domain::ProgramHeader udata4HighLoad{}; udata4HighLoad.Type = 1; udata4HighLoad.MappedAddress = 0xFFFFFFFFFFFFF000ULL; udata4HighLoad.FileSize = 128; + Domain::ProgramHeader udata4HighEh = udata4HighLoad; udata4HighEh.Type = 0x6474E550; udata4HighEh.FileSize = 32; + bool udata4Rejected = false; + try { Relinker::UnusedNidFilter::ReadExceptionFunctions(udata4Overflow, {udata4HighLoad, udata4HighEh}, {}, {}); } + catch (const Domain::RelinkerException& error) { + udata4Rejected = std::string(error.what()).find("unwind pointer address overflowed") != std::string::npos; + } + Require(udata4Rejected); + auto sdataOverflow = Fixture(); + sdataOverflow[3] = 0x3B; + Io::WriteU32(sdataOverflow, 16, 0x1000); + Io::WriteU32(sdataOverflow, 20, 0x1000); + bool sdataRejected = false; + try { Relinker::UnusedNidFilter::ReadExceptionFunctions(sdataOverflow, {highLoad, highEh}, {}, {}); } + catch (const Domain::RelinkerException& error) { + sdataRejected = std::string(error.what()).find("unwind pointer address overflowed") != std::string::npos; + } + Require(sdataRejected); + auto sdata8Overflow = Fixture(); + sdata8Overflow[3] = 0x3C; + Io::WriteU64(sdata8Overflow, 16, 0x1000); + Io::WriteU64(sdata8Overflow, 24, 0x1000); + bool sdata8Rejected = false; + try { Relinker::UnusedNidFilter::ReadExceptionFunctions(sdata8Overflow, {highLoad, highEh}, {}, {}); } + catch (const Domain::RelinkerException& error) { + sdata8Rejected = std::string(error.what()).find("unwind pointer address overflowed") != std::string::npos; + } + Require(sdata8Rejected); + auto sdata2Overflow = Fixture(); + sdata2Overflow[3] = 0x3A; + Io::WriteU16(sdata2Overflow, 16, 0x1000); + Io::WriteU16(sdata2Overflow, 18, 0x1000); + bool sdata2Rejected = false; + try { Relinker::UnusedNidFilter::ReadExceptionFunctions(sdata2Overflow, {highLoad, highEh}, {}, {}); } + catch (const Domain::RelinkerException& error) { + sdata2Rejected = std::string(error.what()).find("unwind pointer address overflowed") != std::string::npos; + } + Require(sdata2Rejected); + std::vector lsdaBytes(0x400, 0); + Io::WriteU32(lsdaBytes, 0x200, 25); + lsdaBytes[0x208] = 1; + const std::uint8_t ciePrefix[] = {'z', 'P', 'L', 'R', 0, 1, 0, 0x78, 11, 0}; + std::copy(std::begin(ciePrefix), std::end(ciePrefix), lsdaBytes.begin() + 0x209); + lsdaBytes[0x212] = 0; + Io::WriteU64(lsdaBytes, 0x213, 0x1000); + lsdaBytes[0x21B] = 0x4B; + lsdaBytes[0x21C] = 0; + Io::WriteU32(lsdaBytes, 0x220, 29); + Io::WriteU32(lsdaBytes, 0x224, 0x24); + Io::WriteU64(lsdaBytes, 0x228, 0x1000); + Io::WriteU64(lsdaBytes, 0x230, 0x20); + lsdaBytes[0x238] = 4; + Io::WriteU32(lsdaBytes, 0x239, 0xFFFFEFFF); + lsdaBytes[0x300] = 1; + lsdaBytes[0x302] = 3; + Io::WriteU64(lsdaBytes, 0x304, 0x200); + Io::WriteU32(lsdaBytes, 0x30C, 1); + Io::WriteU64(lsdaBytes, 0x310, 0x1000); + Io::WriteU64(lsdaBytes, 0x318, 0x220); + Domain::ProgramHeader lsdaLoad{}; lsdaLoad.Type = 1; lsdaLoad.Flags = 4; lsdaLoad.FileSize = lsdaBytes.size(); lsdaLoad.MemorySize = lsdaBytes.size(); lsdaLoad.Alignment = 8; + Domain::ProgramHeader lsdaEh = lsdaLoad; lsdaEh.Type = 0x6474E550; lsdaEh.Offset = 0x300; lsdaEh.MappedAddress = 0x300; lsdaEh.FileSize = 32; lsdaEh.MemorySize = 32; lsdaEh.Alignment = 4; + bool lsdaOverflowRejected = false; + try { Relinker::UnusedNidFilter::ReadExceptionFunctions(lsdaBytes, {lsdaLoad, lsdaEh}, {}, {}); } + catch (const Domain::RelinkerException& error) { + lsdaOverflowRejected = std::string(error.what()).find("unwind pointer address overflowed") != std::string::npos; + } + Require(lsdaOverflowRejected); + lsdaBytes[0x21B] = 0x49; + lsdaBytes[0x238] = 2; + Io::WriteU32(lsdaBytes, 0x239, 0x5FFF); + bool lsdaSlebRejected = false; + try { Relinker::UnusedNidFilter::ReadExceptionFunctions(lsdaBytes, {lsdaLoad, lsdaEh}, {}, {}); } + catch (const Domain::RelinkerException& error) { + lsdaSlebRejected = std::string(error.what()).find("unwind pointer address overflowed") != std::string::npos; + } + Require(lsdaSlebRejected); + lsdaBytes[0x21B] = 0x4C; + Io::WriteU32(lsdaBytes, 0x220, 33); + lsdaBytes[0x238] = 8; + Io::WriteU64(lsdaBytes, 0x239, 0xFFFFFFFFFFFFEFFFULL); + bool lsda8OverflowRejected = false; + try { Relinker::UnusedNidFilter::ReadExceptionFunctions(lsdaBytes, {lsdaLoad, lsdaEh}, {}, {}); } + catch (const Domain::RelinkerException& error) { + lsda8OverflowRejected = std::string(error.what()).find("unwind pointer address overflowed") != std::string::npos; + } + Require(lsda8OverflowRejected); + auto lsdaLeb = lsdaBytes; + lsdaLeb[0x21B] = 0x41; + lsdaLeb[0x21C] = 0; + Io::WriteU32(lsdaLeb, 0x220, 35); + Io::WriteU32(lsdaLeb, 0x224, 0x24); + Io::WriteU64(lsdaLeb, 0x228, 0x1000); + Io::WriteU64(lsdaLeb, 0x230, 0x20); + lsdaLeb[0x238] = 10; + for (int index = 0; index < 9; ++index) lsdaLeb[0x239 + index] = 0x80; + lsdaLeb[0x242] = 0x82; + bool lsdaLebRejected = false; + try { Relinker::UnusedNidFilter::ReadExceptionFunctions(lsdaLeb, {lsdaLoad, lsdaEh}, {}, {}); } + catch (const Domain::RelinkerException& error) { + lsdaLebRejected = std::string(error.what()).find("overflowing LEB128 value") != std::string::npos; + } + Require(lsdaLebRejected); + auto lebOverflow = Fixture(); + lebOverflow[3] = 0x31; + for (int index = 0; index < 9; ++index) lebOverflow[16 + index] = 0x80; + lebOverflow[25] = 0x82; + Domain::ProgramHeader lebLoad{}; lebLoad.Type = 1; lebLoad.MappedAddress = 0xFFFFFFFFFFFFF000ULL; lebLoad.FileSize = 128; + Domain::ProgramHeader lebEh = lebLoad; lebEh.Type = 0x6474E550; lebEh.FileSize = 32; + bool lebRejected = false; + try { Relinker::UnusedNidFilter::ReadExceptionFunctions(lebOverflow, {lebLoad, lebEh}, {}, {}); } + catch (const Domain::RelinkerException& error) { + lebRejected = std::string(error.what()).find("overflowing LEB128 value") != std::string::npos; + } + Require(lebRejected); + std::vector lsdaUdata4Bytes(0x400, 0); + Io::WriteU32(lsdaUdata4Bytes, 0x200, 25); + lsdaUdata4Bytes[0x208] = 1; + std::copy(std::begin(ciePrefix), std::end(ciePrefix), lsdaUdata4Bytes.begin() + 0x209); + lsdaUdata4Bytes[0x212] = 0; + Io::WriteU64(lsdaUdata4Bytes, 0x213, 0x1000); + lsdaUdata4Bytes[0x21B] = 0x43; + lsdaUdata4Bytes[0x21C] = 0; + Io::WriteU32(lsdaUdata4Bytes, 0x220, 29); + Io::WriteU32(lsdaUdata4Bytes, 0x224, 0x24); + Io::WriteU64(lsdaUdata4Bytes, 0x228, 0xFFFFFFFFFFFFF000ULL); + Io::WriteU64(lsdaUdata4Bytes, 0x230, 0x20); + lsdaUdata4Bytes[0x238] = 4; + Io::WriteU32(lsdaUdata4Bytes, 0x239, 0x1000); + lsdaUdata4Bytes[0x300] = 1; + lsdaUdata4Bytes[0x302] = 3; + Io::WriteU64(lsdaUdata4Bytes, 0x304, 0x200); + Io::WriteU32(lsdaUdata4Bytes, 0x30C, 1); + Io::WriteU64(lsdaUdata4Bytes, 0x310, 0xFFFFFFFFFFFFF000ULL); + Io::WriteU64(lsdaUdata4Bytes, 0x318, 0x220); + Domain::ProgramHeader lsdaUdata4Load{}; lsdaUdata4Load.Type = 1; lsdaUdata4Load.Flags = 4; lsdaUdata4Load.FileSize = lsdaUdata4Bytes.size(); lsdaUdata4Load.MemorySize = lsdaUdata4Bytes.size(); lsdaUdata4Load.Alignment = 8; + Domain::ProgramHeader lsdaUdata4Eh = lsdaUdata4Load; lsdaUdata4Eh.Type = 0x6474E550; lsdaUdata4Eh.Offset = 0x300; lsdaUdata4Eh.MappedAddress = 0x300; lsdaUdata4Eh.FileSize = 32; lsdaUdata4Eh.MemorySize = 32; lsdaUdata4Eh.Alignment = 4; + bool lsdaUdata4Rejected = false; + try { Relinker::UnusedNidFilter::ReadExceptionFunctions(lsdaUdata4Bytes, {lsdaUdata4Load, lsdaUdata4Eh}, {}, {}); } + catch (const Domain::RelinkerException& error) { + lsdaUdata4Rejected = std::string(error.what()).find("unwind pointer address overflowed") != std::string::npos; + } + Require(lsdaUdata4Rejected); + std::vector lsdaU2Bytes(0x400, 0); + Io::WriteU32(lsdaU2Bytes, 0x200, 25); + lsdaU2Bytes[0x208] = 1; + std::copy(std::begin(ciePrefix), std::end(ciePrefix), lsdaU2Bytes.begin() + 0x209); + lsdaU2Bytes[0x212] = 0; + Io::WriteU64(lsdaU2Bytes, 0x213, 0x1000); + lsdaU2Bytes[0x21B] = 0x42; + lsdaU2Bytes[0x21C] = 0; + Io::WriteU32(lsdaU2Bytes, 0x220, 29); + Io::WriteU32(lsdaU2Bytes, 0x224, 0x24); + Io::WriteU64(lsdaU2Bytes, 0x228, 0xFFFFFFFFFFFFF000ULL); + Io::WriteU64(lsdaU2Bytes, 0x230, 0x20); + lsdaU2Bytes[0x238] = 2; + Io::WriteU16(lsdaU2Bytes, 0x239, 0xFFFF); + lsdaU2Bytes[0x300] = 1; + lsdaU2Bytes[0x302] = 3; + Io::WriteU64(lsdaU2Bytes, 0x304, 0x200); + Io::WriteU32(lsdaU2Bytes, 0x30C, 1); + Io::WriteU64(lsdaU2Bytes, 0x310, 0xFFFFFFFFFFFFF000ULL); + Io::WriteU64(lsdaU2Bytes, 0x318, 0x220); + Domain::ProgramHeader lsdaU2Load{}; lsdaU2Load.Type = 1; lsdaU2Load.Flags = 4; lsdaU2Load.FileSize = lsdaU2Bytes.size(); lsdaU2Load.MemorySize = lsdaU2Bytes.size(); lsdaU2Load.Alignment = 8; + Domain::ProgramHeader lsdaU2Eh = lsdaU2Load; lsdaU2Eh.Type = 0x6474E550; lsdaU2Eh.Offset = 0x300; lsdaU2Eh.MappedAddress = 0x300; lsdaU2Eh.FileSize = 32; lsdaU2Eh.MemorySize = 32; lsdaU2Eh.Alignment = 4; + bool lsdaU2Rejected = false; + try { Relinker::UnusedNidFilter::ReadExceptionFunctions(lsdaU2Bytes, {lsdaU2Load, lsdaU2Eh}, {}, {}); } + catch (const Domain::RelinkerException& error) { + lsdaU2Rejected = std::string(error.what()).find("unwind pointer address overflowed") != std::string::npos; + } + Require(lsdaU2Rejected); + std::vector lsdaUdata8Bytes(0x400, 0); + Io::WriteU32(lsdaUdata8Bytes, 0x200, 25); + lsdaUdata8Bytes[0x208] = 1; + std::copy(std::begin(ciePrefix), std::end(ciePrefix), lsdaUdata8Bytes.begin() + 0x209); + lsdaUdata8Bytes[0x212] = 0; + Io::WriteU64(lsdaUdata8Bytes, 0x213, 0x1000); + lsdaUdata8Bytes[0x21B] = 0x44; + lsdaUdata8Bytes[0x21C] = 0; + Io::WriteU32(lsdaUdata8Bytes, 0x220, 33); + Io::WriteU32(lsdaUdata8Bytes, 0x224, 0x24); + Io::WriteU64(lsdaUdata8Bytes, 0x228, 0xFFFFFFFFFFFFF000ULL); + Io::WriteU64(lsdaUdata8Bytes, 0x230, 0x20); + lsdaUdata8Bytes[0x238] = 8; + Io::WriteU64(lsdaUdata8Bytes, 0x239, 0x1000); + lsdaUdata8Bytes[0x300] = 1; + lsdaUdata8Bytes[0x302] = 3; + Io::WriteU64(lsdaUdata8Bytes, 0x304, 0x200); + Io::WriteU32(lsdaUdata8Bytes, 0x30C, 1); + Io::WriteU64(lsdaUdata8Bytes, 0x310, 0xFFFFFFFFFFFFF000ULL); + Io::WriteU64(lsdaUdata8Bytes, 0x318, 0x220); + bool lsdaUdata8Rejected = false; + try { Relinker::UnusedNidFilter::ReadExceptionFunctions(lsdaUdata8Bytes, {lsdaLoad, lsdaEh}, {}, {}); } + catch (const Domain::RelinkerException& error) { + lsdaUdata8Rejected = std::string(error.what()).find("unwind pointer address overflowed") != std::string::npos; + } + Require(lsdaUdata8Rejected); + std::vector lsdaS2Bytes(0x400, 0); + Io::WriteU32(lsdaS2Bytes, 0x200, 25); + lsdaS2Bytes[0x208] = 1; + std::copy(std::begin(ciePrefix), std::end(ciePrefix), lsdaS2Bytes.begin() + 0x209); + lsdaS2Bytes[0x212] = 0; + Io::WriteU64(lsdaS2Bytes, 0x213, 0x1000); + lsdaS2Bytes[0x21B] = 0x4A; + lsdaS2Bytes[0x21C] = 0; + Io::WriteU32(lsdaS2Bytes, 0x220, 29); + Io::WriteU32(lsdaS2Bytes, 0x224, 0x24); + Io::WriteU64(lsdaS2Bytes, 0x228, 0x1000); + Io::WriteU64(lsdaS2Bytes, 0x230, 0x20); + lsdaS2Bytes[0x238] = 2; + Io::WriteU16(lsdaS2Bytes, 0x239, 0xEFFF); + lsdaS2Bytes[0x300] = 1; + lsdaS2Bytes[0x302] = 3; + Io::WriteU64(lsdaS2Bytes, 0x304, 0x200); + Io::WriteU32(lsdaS2Bytes, 0x30C, 1); + Io::WriteU64(lsdaS2Bytes, 0x310, 0x1000); + Io::WriteU64(lsdaS2Bytes, 0x318, 0x220); + Domain::ProgramHeader lsdaS2Load{}; lsdaS2Load.Type = 1; lsdaS2Load.Flags = 4; lsdaS2Load.FileSize = lsdaS2Bytes.size(); lsdaS2Load.MemorySize = lsdaS2Bytes.size(); lsdaS2Load.Alignment = 8; + Domain::ProgramHeader lsdaS2Eh = lsdaS2Load; lsdaS2Eh.Type = 0x6474E550; lsdaS2Eh.Offset = 0x300; lsdaS2Eh.MappedAddress = 0x300; lsdaS2Eh.FileSize = 32; lsdaS2Eh.MemorySize = 32; lsdaS2Eh.Alignment = 4; + bool lsdaS2Rejected = false; + try { Relinker::UnusedNidFilter::ReadExceptionFunctions(lsdaS2Bytes, {lsdaS2Load, lsdaS2Eh}, {}, {}); } + catch (const Domain::RelinkerException& error) { + lsdaS2Rejected = std::string(error.what()).find("unwind pointer address overflowed") != std::string::npos; + } + Require(lsdaS2Rejected); + std::cout << "30 unwind record cases passed\n"; } catch (const std::exception& error) { std::cerr << error.what() << '\n'; return 1; } } diff --git a/core/relinker/relinker/tests/test_macos_guest_weak_exports.py b/core/relinker/relinker/tests/test_macos_guest_weak_exports.py index c1f0e8a740..d209eb1680 100644 --- a/core/relinker/relinker/tests/test_macos_guest_weak_exports.py +++ b/core/relinker/relinker/tests/test_macos_guest_weak_exports.py @@ -1,7 +1,6 @@ import os from pathlib import Path import platform -import shutil import struct import subprocess import sys @@ -103,7 +102,7 @@ def main(): command, kernel, consumer, controls = native libraries = case / 'libs' libraries.mkdir() - shutil.copyfile(kernel, libraries / 'libkernel.prx') + os.link(kernel, libraries / 'libkernel.prx') results = [] for provider in (controls[binding], converted): probe = subprocess.run([*command, str(provider), str(consumer)], diff --git a/core/relinker/relinker/tests/test_macos_guest_weak_imports.py b/core/relinker/relinker/tests/test_macos_guest_weak_imports.py index 7a0f2dc432..319fd2432a 100644 --- a/core/relinker/relinker/tests/test_macos_guest_weak_imports.py +++ b/core/relinker/relinker/tests/test_macos_guest_weak_imports.py @@ -1,6 +1,5 @@ import os import platform -import shutil import struct import subprocess import sys @@ -108,7 +107,7 @@ def check_macos_guest_weak_imports(relinker, work): assert '@rpath/' + HOST in macho.dylibs, (name, macho.dylibs) if native: command, kernel = native - shutil.copyfile(kernel, libraries / 'libkernel.prx') + os.link(kernel, libraries / 'libkernel.prx') provider_source, host = case / 'provider.c', libraries / HOST provider_source.write_text((f'int {OPTIONAL}(void) {{ return 77; }}\n' if optional else '') + (f'int {REQUIRED}(void) {{ return 42; }}\n' if required else '')) diff --git a/core/relinker/relinker/tests/test_macos_trace_imports.py b/core/relinker/relinker/tests/test_macos_trace_imports.py index 182cc1f85e..7582daa5e4 100644 --- a/core/relinker/relinker/tests/test_macos_trace_imports.py +++ b/core/relinker/relinker/tests/test_macos_trace_imports.py @@ -34,7 +34,7 @@ def library(work, name, code): subprocess.run(["xcrun", "clang", "-arch", "x86_64", "-dynamiclib", str(source), "-Wl,-install_name,@rpath/" + name + ".prx", "-o", str(output)], check=True, capture_output=True, timeout=20) - return output.read_bytes() + return output def run_binary(output): @@ -71,9 +71,9 @@ def main(): if not runnable: continue (case / "libs").mkdir() - (case / "libs" / "a.prx").write_bytes(libraries["a"]) - (case / "libs" / "libc.prx").write_bytes(libraries[libc]) - (case / "libs" / "libkernel.prx").write_bytes(libraries["libkernel"]) + os.link(libraries["a"], case / "libs" / "a.prx") + os.link(libraries[libc], case / "libs" / "libc.prx") + os.link(libraries["libkernel"], case / "libs" / "libkernel.prx") output.chmod(0o755) run = run_binary(output) if run.returncode != expected and "Bad CPU type in executable" in run.stderr: diff --git a/core/shader/recompiler/ControlFlow/src/ControlFlowGraph.cpp b/core/shader/recompiler/ControlFlow/src/ControlFlowGraph.cpp index 22fe11817d..0ba6e78fed 100644 --- a/core/shader/recompiler/ControlFlow/src/ControlFlowGraph.cpp +++ b/core/shader/recompiler/ControlFlow/src/ControlFlowGraph.cpp @@ -57,7 +57,7 @@ void rebuildPredecessors(ControlFlowGraph& graph) { } for (const auto& block : graph.blocks) { for (const auto successor : block.successors) { - addUnique(graph.blocks[successor].predecessors, block.id); + graph.blocks[successor].predecessors.push_back(block.id); } } for (auto& block : graph.blocks) { diff --git a/core/shader/recompiler/ControlFlow/src/Structurizer.cpp b/core/shader/recompiler/ControlFlow/src/Structurizer.cpp index 19da8b5235..419d0ab69a 100644 --- a/core/shader/recompiler/ControlFlow/src/Structurizer.cpp +++ b/core/shader/recompiler/ControlFlow/src/Structurizer.cpp @@ -482,6 +482,8 @@ bool canReachBefore(const ControlFlowGraph& graph, std::uint32_t start, std::uin } bool reachesWithinIteration(const ControlFlowGraph& graph, const NaturalLoop& loop, std::uint32_t start, std::uint32_t target) { + if (start == target) return true; + if (start == loop.continueBlock || start == loop.mergeBlock) return false; std::vector pending = {start}; std::vector visited(graph.blocks.size(), false); while (!pending.empty()) { diff --git a/core/shader/recompiler/Optimization/src/RedundantValueEliminator.cpp b/core/shader/recompiler/Optimization/src/RedundantValueEliminator.cpp index df61fa400d..6345947879 100644 --- a/core/shader/recompiler/Optimization/src/RedundantValueEliminator.cpp +++ b/core/shader/recompiler/Optimization/src/RedundantValueEliminator.cpp @@ -242,18 +242,22 @@ RedundantValueEliminationStats RedundantValueEliminator::Eliminate(IrProgram& pr std::uint64_t nextClobberEpoch = order.size() + 2u; std::vector firstClobber(order.size(), 0u); std::vector lastClobber(order.size(), 0u); + bool hasClobber = false; for (std::size_t position = 0; position < order.size(); ++position) { firstClobber[position] = nextClobberEpoch; for (const auto* inst : order[position]->Instructions()) { - if (ClobbersReadConst(inst->Opcode())) lastClobber[position] = nextClobberEpoch++; + if (ClobbersReadConst(inst->Opcode())) { + lastClobber[position] = nextClobberEpoch++; + hasClobber = true; + } } } - std::vector entryEpoch(order.size(), 0u); + std::vector entryEpoch(order.size(), hasClobber ? 0u : 1u); const auto exitEpoch = [&](std::size_t position) -> std::uint64_t { if (entryEpoch[position] == 0u) return 0u; return lastClobber[position] != 0u ? lastClobber[position] : entryEpoch[position]; }; - for (bool changed = true; changed;) { + for (bool changed = hasClobber; changed;) { changed = false; for (std::size_t position = 0; position < order.size(); ++position) { std::uint64_t candidate = position == 0u ? 1u : 0u; diff --git a/core/shader/recompiler/Optimization/src/ResourceMaterializer.cpp b/core/shader/recompiler/Optimization/src/ResourceMaterializer.cpp index eaef3f6147..d030e64a85 100644 --- a/core/shader/recompiler/Optimization/src/ResourceMaterializer.cpp +++ b/core/shader/recompiler/Optimization/src/ResourceMaterializer.cpp @@ -2642,13 +2642,26 @@ void ResourceMaterializer::Materialize(const IrResourcePlan& program, const SrtR const SrtForceSyncScope forceSync(runtime, attempt == 2u); const auto beforeSnapshot = runtime.descriptorScope != nullptr ? runtime.descriptorScope(runtime.userContext, 0u) : 0u; activeSources.clear(); - materializeSnapshot(plan, runtime, walker, nextSnapshot, activeSources); - const auto afterSnapshot = runtime.descriptorScope != nullptr ? runtime.descriptorScope(runtime.userContext, 0u) : 0u; - TableSnapshotter(plan, runtime, walker, activeSources, nextSnapshot.tables).Run(); - const auto afterTables = runtime.descriptorScope != nullptr ? runtime.descriptorScope(runtime.userContext, 0u) : 0u; - if (runtime.descriptorScope == nullptr || (afterTables == afterSnapshot && (plan.uniformFill.fill.kind == UniformFillKind::None || afterSnapshot == beforeSnapshot))) { + try { + materializeSnapshot(plan, runtime, walker, nextSnapshot, activeSources); + const auto afterSnapshot = runtime.descriptorScope != nullptr ? runtime.descriptorScope(runtime.userContext, 0u) : 0u; + TableSnapshotter(plan, runtime, walker, activeSources, nextSnapshot.tables).Run(); + const auto afterTables = runtime.descriptorScope != nullptr ? runtime.descriptorScope(runtime.userContext, 0u) : 0u; + if (runtime.descriptorScope != nullptr && (afterTables != afterSnapshot || (plan.uniformFill.fill.kind != UniformFillKind::None && afterSnapshot != beforeSnapshot))) { + continue; + } + const auto started = MaterializeProfiled() ? std::chrono::steady_clock::now() : std::chrono::steady_clock::time_point{}; + materializeForcedDegamma(plan, nextSnapshot); + materializeTables(plan, nextSnapshot); + materializeSrtGuards(plan, nextSnapshot); + if (MaterializeProfiled()) specializationNanoseconds.fetch_add(static_cast(std::chrono::duration_cast(std::chrono::steady_clock::now() - started).count()), std::memory_order_relaxed); completed = true; break; + } catch (const ConvertedSampleRequired&) { + throw; + } catch (const std::runtime_error&) { + if (runtime.descriptorScope == nullptr || attempt == 2u) throw; + if (runtime.descriptorScope(runtime.userContext, 0u) == beforeSnapshot) attempt = 1u; } } if (!completed) throw std::runtime_error("runtime resource snapshot did not stabilize"); @@ -2656,11 +2669,6 @@ void ResourceMaterializer::Materialize(const IrResourcePlan& program, const SrtR reportTables(); throw; } - const auto started = MaterializeProfiled() ? std::chrono::steady_clock::now() : std::chrono::steady_clock::time_point{}; - materializeForcedDegamma(plan, nextSnapshot); - materializeTables(plan, nextSnapshot); - materializeSrtGuards(plan, nextSnapshot); - if (MaterializeProfiled()) specializationNanoseconds.fetch_add(static_cast(std::chrono::duration_cast(std::chrono::steady_clock::now() - started).count()), std::memory_order_relaxed); snapshot = std::move(nextSnapshot); reportTables(); if (MaterializeProfiled()) materializeNanoseconds.fetch_add(static_cast(std::chrono::duration_cast(std::chrono::steady_clock::now() - materializeStarted).count()), std::memory_order_relaxed); diff --git a/core/shader/recompiler/Optimization/src/ShaderInfoCollector.cpp b/core/shader/recompiler/Optimization/src/ShaderInfoCollector.cpp index bf70c14b75..de12941c65 100644 --- a/core/shader/recompiler/Optimization/src/ShaderInfoCollector.cpp +++ b/core/shader/recompiler/Optimization/src/ShaderInfoCollector.cpp @@ -621,12 +621,11 @@ void ShaderInfoCollector::Collect(IrProgram& program, const ShaderStageInputInfo return inst->Opcode() == IrOpcode::BitwiseXor32; }); }); - const bool ldsAtomic64 = std::ranges::any_of(program.Blocks(), [](const auto& block) { + next.usesFaultBuffer = next.usesFaultBuffer || std::ranges::any_of(program.Blocks(), [](const auto& block) { return std::ranges::any_of(block->Instructions(), [](const IrValue* inst) { return SharedAccessOf(inst->Opcode()) == SharedAccess::Atomic && inst->Type() == IrType::U64; }); }); - next.usesFaultBuffer = next.usesFaultBuffer || ldsAtomic64; switch (program.Resources().stage) { case IrShaderStage::Vertex: case IrShaderStage::Local: diff --git a/core/shader/recompiler/Optimization/src/SsaBuilder/SsaPass.cpp b/core/shader/recompiler/Optimization/src/SsaBuilder/SsaPass.cpp index b38ffe24d2..dcf069f252 100644 --- a/core/shader/recompiler/Optimization/src/SsaBuilder/SsaPass.cpp +++ b/core/shader/recompiler/Optimization/src/SsaBuilder/SsaPass.cpp @@ -121,7 +121,7 @@ IrValue* Pass::TryRemoveTrivialPhi(IrValue& phi, Variable variable) { same = MakeInitialValue(variable); } std::vector users; - for (IrValue* user : phi.Uses()) users.push_back(user); + for (IrValue* user : phi.Uses()) if (user->IsPhi()) users.push_back(user); phi.ReplaceUsesWith(same, true); for (IrValue* user : users) { if (user->IsPhi()) { diff --git a/core/shader/recompiler/Recompiler.cpp b/core/shader/recompiler/Recompiler.cpp index 43e6c9a3cc..515f054b5a 100644 --- a/core/shader/recompiler/Recompiler.cpp +++ b/core/shader/recompiler/Recompiler.cpp @@ -836,8 +836,9 @@ std::vector specializeWords(const CompiledShaderArtifact& artifac } else if (op == spv::OpDecorate && count == 4u && words[cursor + 2u] == spv::DecorationSpecId && retained.contains(words[cursor + 1u])) { materialized.insert(materialized.end(), words.begin() + cursor, words.begin() + cursor + count); } else if (op == spv::OpSpecConstant) { - if (count != 4u || !values.contains(words[cursor + 2u])) throw std::runtime_error("invalid prepared specialization constant"); - materialized.insert(materialized.end(), {(4u << 16u) | spv::OpConstant, words[cursor + 1u], words[cursor + 2u], values.at(words[cursor + 2u])}); + const auto found = count == 4u ? values.find(words[cursor + 2u]) : values.end(); + if (found == values.end()) throw std::runtime_error("invalid prepared specialization constant"); + materialized.insert(materialized.end(), {(4u << 16u) | spv::OpConstant, words[cursor + 1u], words[cursor + 2u], found->second}); } else if (op == spv::OpMemberDecorate && count == 5u && words[cursor + 3u] == spv::DecorationOffset && pushTypes.contains(words[cursor + 1u])) { if (!replaySlotBytes || words[cursor + 2u] != 0u || *replaySlotBytes >= NativePushConstantSize) throw std::runtime_error("invalid stencil replay push constant slot"); materialized.insert(materialized.end(), words.begin() + cursor, words.begin() + cursor + count - 1u); diff --git a/core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvAnalysis.hpp b/core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvAnalysis.hpp index 1695856cdc..4dc191d3d9 100644 --- a/core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvAnalysis.hpp +++ b/core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvAnalysis.hpp @@ -30,14 +30,17 @@ struct SpirvRequirements { bool imageInt64Atomics = false; bool sharedInt64Atomics = false; bool float64 = false; + bool float64NeedsDevice = false; bool float64Interpolation = false; bool coherentBuffers = false; bool coherentBufferAlias = false; + bool readOnlyStorage = false; std::vector capabilities; std::vector extensions; }; [[nodiscard]] SpirvRequirements AnalyzeProgramRequirements(const IrProgram& program); +[[nodiscard]] bool IsIntegerFloat64Opcode(IrOpcode opcode); inline constexpr std::uint32_t FunctionLdsDwordLimit = 8192u; inline constexpr std::uint32_t PixelFunctionStorageDwords = 4096u; inline constexpr std::uint32_t PixelFunctionLdsDescriptorSet = 2u; @@ -46,7 +49,7 @@ inline constexpr std::uint32_t MeshWindowSlots = 256u; inline constexpr std::uint32_t MeshWindowHeaderDwords = 4u + MeshWindowSlots; inline constexpr std::uint32_t MeshWindowSlotDwords = 65536u; [[nodiscard]] std::uint32_t FunctionLdsDwords(const IrProgram& program); -[[nodiscard]] std::unordered_map FunctionLdsLaneAddresses(const IrProgram& program); +[[nodiscard]] std::unordered_map FunctionLdsLaneAddresses(const IrProgram& program, std::uint32_t dwords); [[nodiscard]] std::unordered_set WaveUniformValues(const IrProgram& program); [[nodiscard]] bool IsWaveMaskBranch(BranchCondition condition); diff --git a/core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterHelpers.hpp b/core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterHelpers.hpp index 9fcb5bb7a2..f0f5a1c4d1 100644 --- a/core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterHelpers.hpp +++ b/core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterHelpers.hpp @@ -158,6 +158,7 @@ std::uint32_t EmitF16BitsToF32Decoded(SpirvEmitterState& state, std::uint32_t bi void EmitProgram(SpirvEmitterState& state); void DefineGetBdaPointer(SpirvEmitterState& state); void DefineDot2F32F16Function(SpirvEmitterState& state); +void DefineIntegerFloat64Functions(SpirvEmitterState& state); void DefineReciprocalCorrectionFunction(SpirvEmitterState& state); void EmitLabel(SpirvEmitterState& state, std::uint32_t label); std::uint32_t Unary(SpirvEmitterState& state, std::uint32_t opcode, std::uint32_t type, std::uint32_t value); diff --git a/core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp b/core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp index 7193e14d66..21cefd6303 100644 --- a/core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp +++ b/core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp @@ -175,6 +175,11 @@ struct SpirvEmitterState { std::map, std::uint32_t> interpolateFunctions; std::map, std::uint32_t> fastInterpolateFunctions; bool integerInterpolation = false; + bool integerFloat64 = false; + std::uint32_t integerAddF64Function = 0; + std::uint32_t integerMulF64Function = 0; + std::uint32_t integerF64FromF32Function = 0; + std::uint32_t integerF32FromF64Function = 0; std::array, 2> bdaDwordReadFunctions {}; std::array, 2> bdaSpanReadFunctions {}; std::unordered_map> bdaGroupedLoads; diff --git a/core/shader/recompiler/SpirvBackend/src/SpirvAlu/SpirvAluEmitterFloat64.cpp b/core/shader/recompiler/SpirvBackend/src/SpirvAlu/SpirvAluEmitterFloat64.cpp index ae3c2c1917..74188bbc8d 100644 --- a/core/shader/recompiler/SpirvBackend/src/SpirvAlu/SpirvAluEmitterFloat64.cpp +++ b/core/shader/recompiler/SpirvBackend/src/SpirvAlu/SpirvAluEmitterFloat64.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -17,6 +18,7 @@ struct F64Bits { }; std::uint32_t TypeF64(SpirvEmitterState& state) { + if (state.integerFloat64) FailEmit("a 64-bit float operation in a shader that computes its f64 values with integers"); return state.module.Type(spv::OpTypeFloat, 64u); } @@ -93,8 +95,8 @@ F64Bits Quiet(SpirvEmitterState& state, F64Bits bits) { return {bits.low, Binary(state, spv::OpBitwiseOr, TypeU32(state), bits.high, ConstantU32(state, 0x00080000u))}; } -std::uint32_t NanResult(SpirvEmitterState& state, std::uint32_t value, std::initializer_list inputs) { - const auto cls = Classify(state, FromF64(state, value)); +std::uint32_t NanResultBits(SpirvEmitterState& state, std::uint32_t bits, std::initializer_list inputs) { + const auto cls = Classify(state, bits); auto result = SelectBits(state, cls.nan, {ConstantU32(state, 0u), ConstantU32(state, 0xfff80000u)}, cls.bits); for (auto it = std::rbegin(inputs); it != std::rend(inputs); ++it) { const auto input = Classify(state, *it); @@ -103,6 +105,10 @@ std::uint32_t NanResult(SpirvEmitterState& state, std::uint32_t value, std::init return Join(state, result); } +std::uint32_t NanResult(SpirvEmitterState& state, std::uint32_t value, std::initializer_list inputs) { + return NanResultBits(state, FromF64(state, value), inputs); +} + std::uint32_t MinMax(SpirvEmitterState& state, std::uint32_t lhs, std::uint32_t rhs, bool maxValue) { const auto a = Classify(state, lhs); const auto b = Classify(state, rhs); @@ -572,13 +578,256 @@ std::uint32_t FusedMultiplyAdd(SpirvEmitterState& state, std::uint32_t arg0, std return Join(state, result); } +class IntegerFloat64 { +public: + explicit IntegerFloat64(SpirvEmitterState& state) : state(state), u64(TypeScalarU64(state)), u32(TypeU32(state)), boolean(TypeBool(state)) {} + + std::uint32_t Add(std::uint32_t lhsBits, std::uint32_t rhsBits) const { + const auto lhs = scalar(lhsBits); + const auto rhs = scalar(rhsBits); + const auto lhsMagnitude = withConstant(spv::OpBitwiseAnd, lhs, MagnitudeMask); + const auto rhsMagnitude = withConstant(spv::OpBitwiseAnd, rhs, MagnitudeMask); + const auto swap = test(spv::OpULessThan, lhsMagnitude, rhsMagnitude); + const auto large = pick(swap, rhs, lhs); + const auto largeMagnitude = pick(swap, rhsMagnitude, lhsMagnitude); + const auto smallMagnitude = pick(swap, lhsMagnitude, rhsMagnitude); + const auto subtract = testConstant(spv::OpINotEqual, withConstant(spv::OpBitwiseAnd, op(spv::OpBitwiseXor, lhs, rhs), SignBit), 0u); + const auto largeField = withConstant(spv::OpShiftRightLogical, largeMagnitude, 52u); + const auto smallField = withConstant(spv::OpShiftRightLogical, smallMagnitude, 52u); + const auto largeExponent = effectiveExponent(largeField); + const auto wideLarge = withConstant(spv::OpShiftLeftLogical, significand(largeMagnitude, largeField), 10u); + const auto wideSmall = shiftRightJam(withConstant(spv::OpShiftLeftLogical, significand(smallMagnitude, smallField), 10u), op(spv::OpISub, largeExponent, effectiveExponent(smallField))); + const auto sum = op(spv::OpIAdd, wideLarge, wideSmall); + const auto carry = testConstant(spv::OpUGreaterThanEqual, sum, SignBit); + const auto sumSignificand = pick(carry, op(spv::OpBitwiseOr, withConstant(spv::OpShiftRightLogical, sum, 1u), withConstant(spv::OpBitwiseAnd, sum, 1u)), sum); + const auto sumExponent = op(spv::OpIAdd, largeExponent, pick(carry, constant(1u), constant(0u))); + const auto difference = op(spv::OpISub, wideLarge, wideSmall); + const auto normalizing = withConstant(spv::OpISub, leadingZeros(difference), 1u); + const auto room = withConstant(spv::OpISub, largeExponent, 1u); + const auto shift = pick(test(spv::OpULessThan, normalizing, room), normalizing, room); + const auto significandBits = pick(subtract, op(spv::OpShiftLeftLogical, difference, shift), sumSignificand); + const auto exponent = pick(subtract, op(spv::OpISub, largeExponent, shift), sumExponent); + const auto cancelled = logical(spv::OpLogicalAnd, subtract, testConstant(spv::OpIEqual, difference, 0u)); + const auto finite = pick(cancelled, constant(0u), roundPack(withConstant(spv::OpBitwiseAnd, large, SignBit), exponent, significandBits)); + const auto largeSpecial = testConstant(spv::OpIEqual, largeField, 0x7ffu); + const auto invalid = logical(spv::OpLogicalAnd, logical(spv::OpLogicalAnd, largeSpecial, testConstant(spv::OpIEqual, smallField, 0x7ffu)), subtract); + return pair(pick(largeSpecial, pick(invalid, constant(DefaultNan), large), finite)); + } + + std::uint32_t Mul(std::uint32_t lhsBits, std::uint32_t rhsBits) const { + const auto lhs = scalar(lhsBits); + const auto rhs = scalar(rhsBits); + const auto sign = withConstant(spv::OpBitwiseAnd, op(spv::OpBitwiseXor, lhs, rhs), SignBit); + const auto lhsMagnitude = withConstant(spv::OpBitwiseAnd, lhs, MagnitudeMask); + const auto rhsMagnitude = withConstant(spv::OpBitwiseAnd, rhs, MagnitudeMask); + const auto lhsField = withConstant(spv::OpShiftRightLogical, lhsMagnitude, 52u); + const auto rhsField = withConstant(spv::OpShiftRightLogical, rhsMagnitude, 52u); + const auto lhsNormal = normalized(lhsMagnitude, lhsField); + const auto rhsNormal = normalized(rhsMagnitude, rhsField); + const auto product = multiply(lhsNormal.significand, rhsNormal.significand); + const auto sticky = testConstant(spv::OpINotEqual, withConstant(spv::OpBitwiseAnd, product.low, (1ull << 42u) - 1u), 0u); + auto wide = op(spv::OpBitwiseOr, withConstant(spv::OpShiftLeftLogical, product.high, 22u), withConstant(spv::OpShiftRightLogical, product.low, 42u)); + wide = op(spv::OpBitwiseOr, wide, pick(sticky, constant(1u), constant(0u))); + const auto carry = testConstant(spv::OpUGreaterThanEqual, wide, SignBit); + wide = pick(carry, op(spv::OpBitwiseOr, withConstant(spv::OpShiftRightLogical, wide, 1u), withConstant(spv::OpBitwiseAnd, wide, 1u)), wide); + auto exponent = op(spv::OpIAdd, op(spv::OpIAdd, lhsNormal.exponent, rhsNormal.exponent), pick(carry, constant(~std::uint64_t{1021u}), constant(~std::uint64_t{1022u}))); + const auto tiny = test(spv::OpSLessThan, exponent, constant(1u)); + wide = pick(tiny, shiftRightJam(wide, op(spv::OpISub, constant(1u), exponent)), wide); + exponent = pick(tiny, constant(1u), exponent); + const auto zero = logical(spv::OpLogicalOr, testConstant(spv::OpIEqual, lhsMagnitude, 0u), testConstant(spv::OpIEqual, rhsMagnitude, 0u)); + const auto special = logical(spv::OpLogicalOr, testConstant(spv::OpIEqual, lhsField, 0x7ffu), testConstant(spv::OpIEqual, rhsField, 0x7ffu)); + const auto infinity = withConstant(spv::OpBitwiseOr, sign, Infinity); + return pair(pick(special, pick(zero, constant(DefaultNan), infinity), pick(zero, sign, roundPack(sign, exponent, wide)))); + } + + std::uint32_t FromF32(std::uint32_t value) const { + const auto bits = widen(Unary(state, spv::OpBitcast, u32, value)); + const auto sign = withConstant(spv::OpShiftLeftLogical, withConstant(spv::OpBitwiseAnd, bits, 0x80000000u), 32u); + const auto field = withConstant(spv::OpBitwiseAnd, withConstant(spv::OpShiftRightLogical, bits, 23u), 0xffu); + const auto fraction = withConstant(spv::OpBitwiseAnd, bits, 0x7fffffu); + const auto normal = op(spv::OpBitwiseOr, withConstant(spv::OpShiftLeftLogical, withConstant(spv::OpIAdd, field, 896u), 52u), withConstant(spv::OpShiftLeftLogical, fraction, 29u)); + const auto zeros = leadingZeros(fraction); + const auto subnormal = op(spv::OpBitwiseOr, withConstant(spv::OpShiftLeftLogical, op(spv::OpISub, constant(937u), zeros), 52u), withConstant(spv::OpBitwiseAnd, op(spv::OpShiftLeftLogical, fraction, withConstant(spv::OpISub, zeros, 11u)), FractionMask)); + auto magnitude = pick(testConstant(spv::OpIEqual, field, 0u), pick(testConstant(spv::OpIEqual, fraction, 0u), constant(0u), subnormal), normal); + magnitude = pick(testConstant(spv::OpIEqual, field, 0xffu), op(spv::OpBitwiseOr, constant(Infinity), withConstant(spv::OpShiftLeftLogical, fraction, 29u)), magnitude); + return pair(op(spv::OpBitwiseOr, sign, magnitude)); + } + + std::uint32_t ToF32(std::uint32_t pairBits) const { + const auto value = scalar(pairBits); + const auto sign = narrow(withConstant(spv::OpBitwiseAnd, withConstant(spv::OpShiftRightLogical, value, 32u), 0x80000000u)); + const auto magnitude = withConstant(spv::OpBitwiseAnd, value, MagnitudeMask); + const auto wideField = withConstant(spv::OpShiftRightLogical, magnitude, 52u); + const auto significandBits = significand(magnitude, wideField); + const auto exponent = Binary(state, spv::OpISub, u32, narrow(wideField), ConstantU32(state, 896u)); + const auto tiny = Binary(state, spv::OpSLessThan, boolean, exponent, ConstantU32(state, 1u)); + const auto shift = Select(state, u32, tiny, Binary(state, spv::OpISub, u32, ConstantU32(state, 30u), exponent), ConstantU32(state, 29u)); + const auto inRange = Binary(state, spv::OpULessThan, boolean, shift, ConstantU32(state, 64u)); + const auto amount = Select(state, u32, inRange, shift, ConstantU32(state, 63u)); + const auto kept = op(spv::OpShiftRightLogical, significandBits, widen(amount)); + const auto remainder = op(spv::OpBitwiseAnd, significandBits, withConstant(spv::OpISub, op(spv::OpShiftLeftLogical, constant(1u), widen(amount)), 1u)); + const auto half = op(spv::OpShiftLeftLogical, constant(1u), widen(Binary(state, spv::OpISub, u32, amount, ConstantU32(state, 1u)))); + const auto odd = testConstant(spv::OpINotEqual, withConstant(spv::OpBitwiseAnd, kept, 1u), 0u); + const auto up = logical(spv::OpLogicalOr, test(spv::OpUGreaterThan, remainder, half), logical(spv::OpLogicalAnd, test(spv::OpIEqual, remainder, half), odd)); + const auto rounded = Binary(state, spv::OpIAdd, u32, narrow(kept), Select(state, u32, up, ConstantU32(state, 1u), ConstantU32(state, 0u))); + const auto packedExponent = Select(state, u32, tiny, ConstantU32(state, 0u), Binary(state, spv::OpISub, u32, exponent, ConstantU32(state, 1u))); + const auto packed = Binary(state, spv::OpIAdd, u32, Binary(state, spv::OpShiftLeftLogical, u32, packedExponent, ConstantU32(state, 23u)), rounded); + const auto overflow = Binary(state, spv::OpLogicalOr, boolean, Binary(state, spv::OpSGreaterThan, boolean, exponent, ConstantU32(state, 254u)), Binary(state, spv::OpUGreaterThanEqual, boolean, packed, ConstantU32(state, 0x7f800000u))); + const auto result = Select(state, u32, inRange, Select(state, u32, overflow, ConstantU32(state, 0x7f800000u), packed), ConstantU32(state, 0u)); + return Binary(state, spv::OpBitwiseOr, u32, sign, result); + } + +private: + static constexpr std::uint64_t SignBit = 0x8000000000000000ull; + static constexpr std::uint64_t MagnitudeMask = 0x7fffffffffffffffull; + static constexpr std::uint64_t FractionMask = 0x000fffffffffffffull; + static constexpr std::uint64_t ImplicitBit = 0x0010000000000000ull; + static constexpr std::uint64_t Infinity = 0x7ff0000000000000ull; + static constexpr std::uint64_t DefaultNan = 0xfff8000000000000ull; + + struct Normalized { + std::uint32_t significand = 0; + std::uint32_t exponent = 0; + }; + + struct Product { + std::uint32_t high = 0; + std::uint32_t low = 0; + }; + + std::uint32_t constant(std::uint64_t value) const { + return state.module.Constant(spv::OpConstant, u64, static_cast(value), static_cast(value >> 32u)); + } + + std::uint32_t op(spv::Op opcode, std::uint32_t lhs, std::uint32_t rhs) const { + return Binary(state, opcode, u64, lhs, rhs); + } + + std::uint32_t withConstant(spv::Op opcode, std::uint32_t lhs, std::uint64_t rhs) const { + return op(opcode, lhs, constant(rhs)); + } + + std::uint32_t test(spv::Op opcode, std::uint32_t lhs, std::uint32_t rhs) const { + return Binary(state, opcode, boolean, lhs, rhs); + } + + std::uint32_t testConstant(spv::Op opcode, std::uint32_t lhs, std::uint64_t rhs) const { + return test(opcode, lhs, constant(rhs)); + } + + std::uint32_t logical(spv::Op opcode, std::uint32_t lhs, std::uint32_t rhs) const { + return Binary(state, opcode, boolean, lhs, rhs); + } + + std::uint32_t pick(std::uint32_t condition, std::uint32_t whenTrue, std::uint32_t whenFalse) const { + return Select(state, u64, condition, whenTrue, whenFalse); + } + + std::uint32_t scalar(std::uint32_t bits) const { + return Unary(state, spv::OpBitcast, u64, bits); + } + + std::uint32_t pair(std::uint32_t value) const { + return Unary(state, spv::OpBitcast, TypeU64(state), value); + } + + std::uint32_t widen(std::uint32_t value) const { + return Unary(state, spv::OpUConvert, u64, value); + } + + std::uint32_t narrow(std::uint32_t value) const { + return Unary(state, spv::OpUConvert, u32, value); + } + + std::uint32_t effectiveExponent(std::uint32_t field) const { + return pick(testConstant(spv::OpIEqual, field, 0u), constant(1u), field); + } + + std::uint32_t significand(std::uint32_t magnitude, std::uint32_t field) const { + return op(spv::OpBitwiseOr, withConstant(spv::OpBitwiseAnd, magnitude, FractionMask), pick(testConstant(spv::OpIEqual, field, 0u), constant(0u), constant(ImplicitBit))); + } + + std::uint32_t leadingZeros(std::uint32_t value) const { + const auto high = narrow(withConstant(spv::OpShiftRightLogical, value, 32u)); + const auto highZero = Binary(state, spv::OpIEqual, boolean, high, ConstantU32(state, 0u)); + const auto highMsb = Binary(state, spv::OpIAdd, u32, Glsl(state, u32, GLSLstd450FindUMsb, high), ConstantU32(state, 32u)); + const auto msb = Select(state, u32, highZero, Glsl(state, u32, GLSLstd450FindUMsb, narrow(value)), highMsb); + return widen(Binary(state, spv::OpISub, u32, ConstantU32(state, 63u), msb)); + } + + std::uint32_t shiftRightJam(std::uint32_t value, std::uint32_t count) const { + const auto inRange = testConstant(spv::OpULessThan, count, 64u); + const auto amount = pick(inRange, count, constant(0u)); + const auto lost = op(spv::OpBitwiseAnd, value, withConstant(spv::OpISub, op(spv::OpShiftLeftLogical, constant(1u), amount), 1u)); + const auto shifted = op(spv::OpBitwiseOr, op(spv::OpShiftRightLogical, value, amount), pick(testConstant(spv::OpINotEqual, lost, 0u), constant(1u), constant(0u))); + return pick(inRange, shifted, pick(testConstant(spv::OpINotEqual, value, 0u), constant(1u), constant(0u))); + } + + Normalized normalized(std::uint32_t magnitude, std::uint32_t field) const { + const auto fraction = withConstant(spv::OpBitwiseAnd, magnitude, FractionMask); + const auto subnormal = testConstant(spv::OpIEqual, field, 0u); + const auto zeros = leadingZeros(fraction); + return {pick(subnormal, op(spv::OpShiftLeftLogical, fraction, withConstant(spv::OpISub, zeros, 11u)), withConstant(spv::OpBitwiseOr, fraction, ImplicitBit)), + pick(subnormal, op(spv::OpISub, constant(12u), zeros), field)}; + } + + Product multiply(std::uint32_t lhs, std::uint32_t rhs) const { + const auto low = [&](std::uint32_t value) { return withConstant(spv::OpBitwiseAnd, value, 0xffffffffull); }; + const auto high = [&](std::uint32_t value) { return withConstant(spv::OpShiftRightLogical, value, 32u); }; + const auto lowLow = op(spv::OpIMul, low(lhs), low(rhs)); + const auto lowHigh = op(spv::OpIMul, low(lhs), high(rhs)); + const auto highLow = op(spv::OpIMul, high(lhs), low(rhs)); + const auto highHigh = op(spv::OpIMul, high(lhs), high(rhs)); + const auto middle = op(spv::OpIAdd, op(spv::OpIAdd, high(lowLow), low(lowHigh)), low(highLow)); + return {op(spv::OpIAdd, op(spv::OpIAdd, highHigh, high(lowHigh)), op(spv::OpIAdd, high(highLow), high(middle))), op(spv::OpBitwiseOr, withConstant(spv::OpShiftLeftLogical, middle, 32u), low(lowLow))}; + } + + std::uint32_t roundPack(std::uint32_t sign, std::uint32_t exponent, std::uint32_t significandBits) const { + const auto roundBits = withConstant(spv::OpBitwiseAnd, significandBits, 0x3ffu); + const auto kept = withConstant(spv::OpShiftRightLogical, significandBits, 10u); + const auto odd = testConstant(spv::OpINotEqual, withConstant(spv::OpBitwiseAnd, kept, 1u), 0u); + const auto up = logical(spv::OpLogicalOr, testConstant(spv::OpUGreaterThan, roundBits, 0x200u), logical(spv::OpLogicalAnd, testConstant(spv::OpIEqual, roundBits, 0x200u), odd)); + const auto magnitude = op(spv::OpIAdd, withConstant(spv::OpShiftLeftLogical, withConstant(spv::OpISub, exponent, 1u), 52u), op(spv::OpIAdd, kept, pick(up, constant(1u), constant(0u)))); + return op(spv::OpBitwiseOr, sign, pick(testConstant(spv::OpUGreaterThanEqual, magnitude, Infinity), constant(Infinity), magnitude)); + } + + SpirvEmitterState& state; + std::uint32_t u64 = 0; + std::uint32_t u32 = 0; + std::uint32_t boolean = 0; +}; + +template +std::uint32_t DefineIntegerFunction(SpirvEmitterState& state, const char* name, std::uint32_t result, TBody&& body, TParameters... parameterTypes) { + const auto function = state.module.AllocateId(); + state.module.AddName(function, name); + state.module.AddFunction(spv::OpFunction, result, function, spv::FunctionControlDontInlineMask, state.module.Type(spv::OpTypeFunction, result, parameterTypes...)); + std::array parameters{}; + std::size_t index = 0; + ((parameters[index] = state.module.AllocateId(), state.module.AddFunction(spv::OpFunctionParameter, parameterTypes, parameters[index]), ++index), ...); + EmitLabel(state, state.module.AllocateId()); + state.module.AddFunction(spv::OpReturnValue, std::apply(body, parameters)); + state.module.AddFunction(spv::OpFunctionEnd); + return function; +} + +template +std::uint32_t CallIntegerFunction(SpirvEmitterState& state, std::uint32_t function, std::uint32_t type, TArguments... arguments) { + if (function == 0u) FailEmit("an integer f64 function was not defined before function emission"); + const auto result = state.module.AllocateId(); + state.module.AddFunction(spv::OpFunctionCall, type, result, function, arguments...); + return result; +} + } std::uint32_t EmitFPAdd64(SpirvEmitterState& state, std::uint32_t arg0, std::uint32_t arg1) { + if (state.integerFloat64) return NanResultBits(state, CallIntegerFunction(state, state.integerAddF64Function, TypeU64(state), arg0, arg1), {arg0, arg1}); return NanResult(state, Exact(state, spv::OpFAdd, ToF64(state, arg0), ToF64(state, arg1)), {arg0, arg1}); } std::uint32_t EmitFPMul64(SpirvEmitterState& state, std::uint32_t arg0, std::uint32_t arg1) { + if (state.integerFloat64) return NanResultBits(state, CallIntegerFunction(state, state.integerMulF64Function, TypeU64(state), arg0, arg1), {arg0, arg1}); return NanResult(state, Exact(state, spv::OpFMul, ToF64(state, arg0), ToF64(state, arg1)), {arg0, arg1}); } @@ -914,6 +1163,24 @@ std::uint32_t Dot2F32F16Fast(SpirvEmitterState& state, std::uint32_t arg0, std:: } +void DefineIntegerFloat64Functions(SpirvEmitterState& state) { + if (!state.integerFloat64) return; + const auto uses = [&](IrOpcode opcode) { + for (const IrBlock* block : state.program.BlockOrder()) { + for (const IrValue* inst : block->Instructions()) { + if (inst->Opcode() == opcode) return true; + } + } + return false; + }; + const IntegerFloat64 integer(state); + const auto pairType = TypeU64(state); + if (uses(IrOpcode::FPAdd64)) state.integerAddF64Function = DefineIntegerFunction(state, "f64_add_integer", pairType, [&](std::uint32_t lhs, std::uint32_t rhs) { return integer.Add(lhs, rhs); }, pairType, pairType); + if (uses(IrOpcode::FPMul64)) state.integerMulF64Function = DefineIntegerFunction(state, "f64_mul_integer", pairType, [&](std::uint32_t lhs, std::uint32_t rhs) { return integer.Mul(lhs, rhs); }, pairType, pairType); + if (uses(IrOpcode::ConvertF64F32)) state.integerF64FromF32Function = DefineIntegerFunction(state, "f64_from_f32_integer", pairType, [&](std::uint32_t value) { return integer.FromF32(value); }, TypeF32(state)); + if (uses(IrOpcode::ConvertF32F64)) state.integerF32FromF64Function = DefineIntegerFunction(state, "f32_from_f64_integer", TypeU32(state), [&](std::uint32_t value) { return integer.ToF32(value); }, pairType); +} + void DefineDot2F32F16Function(SpirvEmitterState& state) { bool used = false; for (const IrBlock* block : state.program.BlockOrder()) { @@ -1085,7 +1352,7 @@ std::uint32_t EmitFPInterpolateF16(SpirvEmitterState& state, std::uint32_t arg0, } std::uint32_t EmitConvertF32F64(SpirvEmitterState& state, std::uint32_t arg0) { - const auto converted = Unary(state, spv::OpBitcast, TypeU32(state), Unary(state, spv::OpFConvert, TypeF32(state), ToF64(state, arg0))); + const auto converted = state.integerFloat64 ? CallIntegerFunction(state, state.integerF32FromF64Function, TypeU32(state), arg0) : Unary(state, spv::OpBitcast, TypeU32(state), Unary(state, spv::OpFConvert, TypeF32(state), ToF64(state, arg0))); const auto cls = Classify(state, arg0); const auto sign = Binary(state, spv::OpBitwiseAnd, TypeU32(state), cls.bits.high, ConstantU32(state, 0x80000000u)); const auto payloadHigh = Binary(state, spv::OpShiftLeftLogical, TypeU32(state), Binary(state, spv::OpBitwiseAnd, TypeU32(state), cls.bits.high, ConstantU32(state, 0x000fffffu)), ConstantU32(state, 3u)); @@ -1095,7 +1362,7 @@ std::uint32_t EmitConvertF32F64(SpirvEmitterState& state, std::uint32_t arg0) { } std::uint32_t EmitConvertF64F32(SpirvEmitterState& state, std::uint32_t arg0) { - const auto converted = Split(state, FromF64(state, Unary(state, spv::OpFConvert, TypeF64(state), arg0))); + const auto converted = Split(state, state.integerFloat64 ? CallIntegerFunction(state, state.integerF64FromF32Function, TypeU64(state), arg0) : FromF64(state, Unary(state, spv::OpFConvert, TypeF64(state), arg0))); const auto bits = Unary(state, spv::OpBitcast, TypeU32(state), arg0); const auto nan = Binary(state, spv::OpUGreaterThan, TypeBool(state), Binary(state, spv::OpBitwiseAnd, TypeU32(state), bits, ConstantU32(state, 0x7fffffffu)), ConstantU32(state, 0x7f800000u)); const auto sign = Binary(state, spv::OpBitwiseAnd, TypeU32(state), bits, ConstantU32(state, 0x80000000u)); diff --git a/core/shader/recompiler/SpirvBackend/src/SpirvAnalysis.cpp b/core/shader/recompiler/SpirvBackend/src/SpirvAnalysis.cpp index 6514d92cc1..1462e36096 100644 --- a/core/shader/recompiler/SpirvBackend/src/SpirvAnalysis.cpp +++ b/core/shader/recompiler/SpirvBackend/src/SpirvAnalysis.cpp @@ -314,9 +314,9 @@ std::optional LaneAffineOf(const IrValue* value, std::uint32_t depth } -std::unordered_map FunctionLdsLaneAddresses(const IrProgram& program) { +std::unordered_map FunctionLdsLaneAddresses(const IrProgram& program, std::uint32_t dwords) { std::unordered_map addresses; - if (FunctionLdsDwords(program) >= FunctionLdsDwordLimit) return {}; + if (dwords >= FunctionLdsDwordLimit) return {}; std::optional stride; for (const IrBlock* block : program.BlockOrder()) { for (const IrValue* inst : block->Instructions()) { @@ -335,6 +335,7 @@ std::unordered_map FunctionLdsLaneAddresses(const } SpirvRequirements AnalyzeProgramRequirements(const IrProgram& program) { + bool storageWrites = false; SpirvRequirements requirements {}; for (const IrBlock* block : program.BlockOrder()) { for (const IrValue* inst : block->Instructions()) { @@ -349,6 +350,7 @@ SpirvRequirements AnalyzeProgramRequirements(const IrProgram& program) { requirements.float64Interpolation = true; } else if (IsFloat64Opcode(inst->Opcode())) { requirements.float64 = true; + requirements.float64NeedsDevice = requirements.float64NeedsDevice || !IsIntegerFloat64Opcode(inst->Opcode()); } if (addressAccess != AddressAccess::None) { const auto memoryIndex = inst->Flags().index; @@ -382,7 +384,13 @@ SpirvRequirements AnalyzeProgramRequirements(const IrProgram& program) { requirements.subgroupLocalInvocationId = requirements.subgroupLocalInvocationId || program.Resources().stage == IrShaderStage::Compute; } } + const auto bufferAccess = BufferAccessOf(inst->Opcode()); + const auto imageAccess = ImageOpcodeInfoOf(inst->Opcode()).access; const auto sharedAccess = SharedAccessOf(inst->Opcode()); + storageWrites = storageWrites || + (bufferAccess != BufferAccess::None && bufferAccess != BufferAccess::Read) || + (addressAccess != AddressAccess::None && addressAccess != AddressAccess::Read) || + (imageAccess != ImageAccess::None && imageAccess != ImageAccess::Read) || sharedAccess != SharedAccess::None; if (sharedAccess == SharedAccess::Atomic && inst->Type() == IrType::U64) { requirements.sharedInt64Atomics = true; } @@ -473,7 +481,7 @@ SpirvRequirements AnalyzeProgramRequirements(const IrProgram& program) { } if (requirements.functionLds) { requirements.functionLdsDwords = FunctionLdsDwords(program); - requirements.functionLdsAddresses = FunctionLdsLaneAddresses(program); + requirements.functionLdsAddresses = FunctionLdsLaneAddresses(program, requirements.functionLdsDwords); if (!requirements.functionLdsAddresses.empty()) { std::uint64_t needed = 0; for (const auto& [inst, address] : requirements.functionLdsAddresses) { @@ -483,6 +491,11 @@ SpirvRequirements AnalyzeProgramRequirements(const IrProgram& program) { requirements.functionLdsDwords = static_cast(std::max((needed + 63u) & ~63ull, 64u)); } } + const auto& info = program.Info(); + const auto writtenImage = [](const ImageResource& image) { return image.written || image.atomic || image.atomic64 || image.targetMerge; }; + requirements.readOnlyStorage = !storageWrites && program.Resources().stage == IrShaderStage::Pixel && !info.bdaWrites && !info.usesFaultBuffer && !info.usesDma && + std::ranges::none_of(info.buffers, [](const BufferResource& buffer) { return buffer.written || buffer.atomic; }) && + std::ranges::none_of(info.images, writtenImage) && std::ranges::none_of(info.runtimeImageModes, [&](const auto& modes) { return std::ranges::any_of(modes, writtenImage); }); requirements.coherentBufferAlias = requirements.coherentBuffers && !program.Metadata().invalidatesCaches; return requirements; } @@ -504,12 +517,13 @@ std::unordered_set WaveUniformValues(const IrProgram& program) { changed = false; for (const IrBlock* block : program.BlockOrder()) { for (const IrValue* inst : block->Instructions()) { + auto& entry = varying[inst]; + if (entry) continue; bool lanes = !UniformSource(*inst) && LaneSource(program, *inst); for (std::size_t index = 0; !lanes && !UniformSource(*inst) && index < inst->ArgumentCount(); index++) { if (inst->Argument(index) != nullptr) lanes = isVarying(inst->Argument(index)); } - auto& entry = varying[inst]; - if (lanes && !entry) { + if (lanes) { entry = true; changed = true; } @@ -523,4 +537,8 @@ std::unordered_set WaveUniformValues(const IrProgram& program) { return uniform; } +bool IsIntegerFloat64Opcode(IrOpcode opcode) { + return opcode == IrOpcode::FPAdd64 || opcode == IrOpcode::FPMul64 || opcode == IrOpcode::ConvertF32F64 || opcode == IrOpcode::ConvertF64F32; +} + } diff --git a/core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp b/core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp index 051aa8a097..5b5dbb9e17 100644 --- a/core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp +++ b/core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp @@ -1429,7 +1429,7 @@ void EmitEmulatedSample(SpirvValueEmitContext& ctx, const ImageEmitAccess& acces auto layer = ConstantU32(state, 0u); if (arrayed) { const auto layers = Unary(state, spv::OpBitcast, i32, extract(u32, size, 2u)); - const auto rounded = Unary(state, spv::OpConvertFToS, i32, ext(f32, GLSLstd450Floor, {Binary(state, spv::OpFAdd, f32, extract(f32, setup.coord, 2u), f32Constant(0.5f))})); + const auto rounded = Unary(state, spv::OpConvertFToS, i32, ext(f32, GLSLstd450RoundEven, {extract(f32, setup.coord, 2u)})); layer = Unary(state, spv::OpBitcast, u32, ext(i32, GLSLstd450SClamp, {rounded, ConstantI32(state, 0), Binary(state, spv::OpISub, i32, layers, ConstantI32(state, 1))})); } auto reference = converted ? 0u : DrefValueF32(ctx, access, setup.layout); @@ -1475,7 +1475,7 @@ void EmitEmulatedSample(SpirvValueEmitContext& ctx, const ImageEmitAccess& acces for (std::uint32_t channel = 3u; channel-- > 0u;) red = Select(state, f32, equal(RuntimeImageSwizzle(state, mem.resource, channel), 4u), extract(f32, texel, channel), red); red = Select(state, f32, equal(modeX, EmulatedCompare::AddressBorder), Select(state, f32, inside(x, width), red, borderRed), red); red = Select(state, f32, equal(modeY, EmulatedCompare::AddressBorder), Select(state, f32, inside(y, height), red, borderRed), red); - constexpr std::array operations{spv::OpFOrdLessThan, spv::OpFOrdEqual, spv::OpFOrdLessThanEqual, spv::OpFOrdGreaterThan, spv::OpFOrdNotEqual, spv::OpFOrdGreaterThanEqual}; + constexpr std::array operations{spv::OpFOrdLessThan, spv::OpFOrdEqual, spv::OpFOrdLessThanEqual, spv::OpFOrdGreaterThan, spv::OpFUnordNotEqual, spv::OpFOrdGreaterThanEqual}; auto result = Select(state, f32, equal(parameter(0u), 7u), one, zero); for (std::uint32_t index = 0; index < operations.size(); ++index) { const auto compared = Select(state, f32, Binary(state, operations[index], TypeBool(state), reference, red), one, zero); diff --git a/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvModuleSetup.cpp b/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvModuleSetup.cpp index 6631da4a2b..fc51264bfa 100644 --- a/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvModuleSetup.cpp +++ b/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvModuleSetup.cpp @@ -471,7 +471,9 @@ void DefineModule(SpirvEmitterState& state) { const bool deviceFloat64 = std::find(state.supportedCapabilities.begin(), state.supportedCapabilities.end(), static_cast(spv::CapabilityFloat64)) != state.supportedCapabilities.end(); state.integerInterpolation = state.requirements.float64Interpolation && !deviceFloat64; if (state.integerInterpolation) state.module.EmitCapability(spv::CapabilityInt64); - if (state.requirements.float64 || (state.requirements.float64Interpolation && deviceFloat64)) { + state.integerFloat64 = state.requirements.float64 && !deviceFloat64 && !state.requirements.float64NeedsDevice; + if (state.integerFloat64) state.module.EmitCapability(spv::CapabilityInt64); + if (!state.integerFloat64 && (state.requirements.float64 || (state.requirements.float64Interpolation && deviceFloat64))) { if (!deviceFloat64) { throw std::runtime_error("64-bit float instructions need the Float64 capability, which the device lacks"); } diff --git a/core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp b/core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp index 7679b0cd6d..44beabfca9 100644 --- a/core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp +++ b/core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp @@ -1660,6 +1660,10 @@ std::uint32_t EmitClassMaskF32(SpirvEmitterState& state, std::uint32_t value, st } std::uint32_t EmitMinMaxF32Value(SpirvEmitterState& state, std::uint32_t lhs, std::uint32_t rhs, bool maxValue) { + if (maxValue && lhs == ConstantF32(state, 0u)) { + const auto positive = Binary(state, spv::OpFOrdGreaterThan, TypeBool(state), rhs, lhs); + return Select(state, TypeF32(state), positive, rhs, lhs); + } const auto lhsClass = EmitClassifyF32(state, lhs); const auto rhsClass = EmitClassifyF32(state, rhs); @@ -1765,6 +1769,7 @@ void EmitProgram(SpirvEmitterState& state) { } DefineGetBdaPointer(state); DefineDot2F32F16Function(state); + DefineIntegerFloat64Functions(state); DefineReciprocalCorrectionFunction(state); for (const IrBlock* block : program.BlockOrder()) { const bool needsScratch = std::any_of(block->Instructions().begin(), block->Instructions().end(), [](const IrValue* inst) { diff --git a/core/shader/recompiler/SpirvBackend/src/SpirvRuntimeBuffer.cpp b/core/shader/recompiler/SpirvBackend/src/SpirvRuntimeBuffer.cpp index 65cef1375d..50e70196e4 100644 --- a/core/shader/recompiler/SpirvBackend/src/SpirvRuntimeBuffer.cpp +++ b/core/shader/recompiler/SpirvBackend/src/SpirvRuntimeBuffer.cpp @@ -282,7 +282,8 @@ std::uint32_t readBuffer(SpirvValueEmitContext& context, const IrValue& instruct const auto highIndex = Select(state, TypeU32(state), both(state, inBounds, unaligned), next, lowIndex); const auto low = Binary(state, spv::OpShiftRightLogical, TypeU32(state), load(lowIndex), shift); const auto high = EmitValueOrZero(state, unaligned, Binary(state, spv::OpShiftLeftLogical, TypeU32(state), load(highIndex), highShift)); - return EmitValueOrZero(state, inBounds, combine(low, high)); + const auto value = combine(low, high); + return (access.memoryAccess & spv::MemoryAccessVolatileMask) != 0u || (state.requirements.readOnlyStorage && access.memoryAccess == 0u) ? value : EmitValueOrZero(state, inBounds, value); } std::uint32_t byteBuffers(SpirvEmitterState& state) { diff --git a/core/shader/recompiler/tests/SsaPassReads.cpp b/core/shader/recompiler/tests/SsaPassReads.cpp index f912efa732..46894dedaf 100644 --- a/core/shader/recompiler/tests/SsaPassReads.cpp +++ b/core/shader/recompiler/tests/SsaPassReads.cpp @@ -67,8 +67,17 @@ void CheckDiamondAndLoop(Variable variable) { auto* pending = pass.Read(variable, &loop); Require(pending->IsPhi(), "a read in an unsealed loop header is not a pending phi"); Require(pass.Read(variable, &loop) == pending, "a repeated read in an unsealed loop header returns another value"); + auto& reference = program.CreateValue(IrOpcode::Reference, IrType::Void); + reference.AddArgument(pending); + loop.AppendInstruction(&reference); + auto& dependent = program.CreateValue(IrOpcode::Phi, VariableType(variable)); + dependent.AddPhiOperand(&entry, &first); + dependent.AddPhiOperand(&loop, pending); + loop.AppendInstruction(&dependent); pass.Seal(&loop); Require(pass.Read(variable, &loop)->Resolve() == &first, "a loop that does not redefine the value does not read the entry value"); + Require(reference.Argument(0)->Resolve() == &first, "ordinary use did not keep the phi replacement"); + Require(dependent.Resolve() == &first, "dependent phi did not simplify after its input"); Require(pending->Resolve() == &first, "the pending loop phi does not resolve to the entry value"); } diff --git a/docs/dev/ARCHITECTURE.md b/docs/dev/ARCHITECTURE.md index be4a6d6c00..92a2e5d7b0 100644 --- a/docs/dev/ARCHITECTURE.md +++ b/docs/dev/ARCHITECTURE.md @@ -154,7 +154,7 @@ flowchart LR - A storage or sampled view of a thin array whose whole surface has more layers than the device's `maxImageArrayLayers` (2048 on NVIDIA; a PS5 array may hold up to 8192) is served from its viewed slices alone: `ArrayLayerWindow` in [`TextureTiling.cpp`](../../core/libs/prx/libSceAgcDriver/Graphics/src/TextureTiling.cpp) describes them as an array of their own starting at the first viewed slice, which is exact because a non-XOR swizzle does not depend on the slice index. A 3D volume is not an array (its depth is bounded by `maxImageDimension3D`) and a 2D image is one layer whatever its last array field holds; both pass unchanged. A view whose slices alone exceed the limit, a view of an XOR swizzle that mixes in the slice index, and any other image past the limit throw; a sampled lookup (`cachedTexture`) throws before it reads or snapshots the surface. - A draw whose `PA_SC_AA_CONFIG` selects 2, 4 or 8 samples renders into host-only multisampled images. [`MultisampleTarget.cpp`](../../core/libs/prx/libSceAgcDriver/Graphics/src/MultisampleTarget.cpp) keeps one image per device, surface address, format, extent and sample count (`MultisampleTargetView`); the pipeline, render pass and library keys carry `State::samples`, and a multisampled depth target is a multisampled depth surface. The guest sample planes and FMASK are never read or written, so the registry also guards the target's guest range: a CPU read (`GuestMemory::SetReadGuard`), a DMA copy, and a sampled or storage image read of it throw. A `CB_COLOR_CONTROL` resolve mode over a multisampled CB0 runs as a render pass whose resolve attachment is CB1's resident image (`ResolveMultisampleTarget`). A zero fill of the target's CMASK (`NoteColorMetadataFill`, from fill kernels and CP DMA fills) clears the image at its next use. - A texture over a depth surface samples the depth image itself when it views one 2D slice of the plane's own format (`DepthSurfaceTexture` in [`DepthSurface.cpp`](../../core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp)). A view of several slices (a 2D array or a cube) or an integer view of a D16 plane is served by a `DepthPlaneCopy`, an image the slices are copied into at every use: from the depth surface bound at each slice's address, else from guest memory. Such a texture is never kept in the resource templates (`RefreshedPerUse`). -- Guest memory reaches the GPU through host imports (`VK_EXT_external_memory_host`) where the driver accepts them, and through copies otherwise ([`GuestBufferMemory.cpp`](../../core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp)). A registered range larger than the import window (64 MiB) is imported per window for buffer and fill accesses and whole for an address-based build. Live imports stay under a budget, with the least recently used import retired first (see TechnicalDebt, Host import windows and budget). +- Guest memory reaches the GPU through host imports (`VK_EXT_external_memory_host`) where the driver accepts them, and through copies otherwise ([`GuestBufferMemory.cpp`](../../core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp)). A registered range larger than the import window (64 MiB) is imported per window for buffer and fill accesses and whole for an address-based build. Live imports stay under a budget, with the least recently used import retired first (see [libSceAgcDriver technical debt](debt/libSceAgcDriver.md), Host import windows and budget). - A guest protect or unmap that overlaps a plain host-pointer import retires the whole import before changing the guest range (`WaitForLeasesAndImports` in [`GuestBufferMemory.cpp`](../../core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp)). Later accesses import surviving registered ranges again; imports never keep the pages across a cut pinned in a trimmed state. `GuestAllocations::Range::backingSerial` distinguishes the original pages from replacements: untouched pieces of a split keep their serial, newly mapped or protected pieces get a fresh one, and every span passed to `RequireUnpinned` (including the other mappings of remapped direct memory and the resident runs touched by a 2 MiB unmap or remap) gets a fresh serial when the mutation ends. - A draw binds its vertex and index ranges in place from a host import, except with NVIDIA's Windows driver, which reads a host import of guest memory far slower than a buffer it allocated (Astro Bot at Crash Site on an RTX 5070 Ti: 164 against 45 ms of draws per frame), so they are copied there (`DrawInputsInPlaceUsable`, `Context::drawInputsInPlace`). `APS5_DRAW_INPUTS_IN_PLACE=1` binds them in place and `APS5_NO_DRAW_INPUTS_IN_PLACE=1` copies them on any device; the second wins. - On Windows, a host import of private `MEM_WRITE_WATCH` memory (singly mapped direct memory) stays on `GetWriteWatch` when `ProbeImportWriteProtection` shows the driver reports nothing written after the second GPU read and a GPU write, and a CPU store is collected (`decideImportWatch`). The driver marks every page of such an import written, asynchronously, until a GPU use of it completes (a read on the settle queue ends it even while main-queue work that used the import first is still running, and the first use of an earlier import of the same pages after that read marks nothing), so `settleImport` in [`GuestBufferMemory.cpp`](../../core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp) copies 4 bytes out of the new import on a second queue of the graphics family, or on a queue of another copy-capable family when the graphics family has only one (`Context::settleQueue`, own pool and mutex) inside `ImportWatched`'s window and waits for it, for imports of 1 MiB or more; the main queue can't be used there because `importAllocation` holds the imports lock and `GpuMutex` comes before it in the lock order. A smaller import is compared when it is made, so a title that maps, imports and unmaps a small buffer around every submission does not block its mapping thread. Its 4-byte read is queued instead: the next import lookup that holds `GpuMutex` while the imports match the registry (`settleUnwatchedImports`) records the queued reads into one batch on the main queue, with barriers ordering earlier and later writes around the reads. Submission does not wait on the CPU, and once the batch's fence has signalled a later lookup returns the import's pages to the write watch (`GuestMemory::Rewatch` drops the marks of every 64 KiB block they touch and stamps those blocks as a CPU store; an import only excludes its own pages, so the rest of a block it partly covers keeps its own state), unless a live storage image overlaps those blocks. Such an import stays compared: an image that took its generation before the stamp would take the stamp for a CPU store over the results it produces after it, and drop them. A settled import whose range had already left the watch returns the same way, and an import retired while its read is in flight is kept with that batch and freed once the batch has completed, without waiting for it; a guest unmap of its memory waits for the batch instead. `APS5_NO_DEFERRED_SETTLES` (any value) keeps every import under 1 MiB compared. Imports through a section alias keep tracking on the guest views, and every other Windows host import is compared. A device without such a queue keeps the comparisons. On Linux the settle queue is made when the device imports dma-buf memory, and every dma-buf import of 1 MiB or more is settled right after it is made, for another reason: the kernel maps an import's pages for the GPU at the first submission that uses it, which took about 2 s for a 3 GiB import on RADV and held up the title's frame. The import's buffer is shared with the settle queue's family instead of aliased, since a sparse import is bound to many memory objects. diff --git a/docs/dev/BUILD.md b/docs/dev/BUILD.md index 5ca59f74fa..3c17f3087e 100644 --- a/docs/dev/BUILD.md +++ b/docs/dev/BUILD.md @@ -287,6 +287,8 @@ Inside the window the queue workers, the presenter and the draw committer and fi The summary line has `commit` and `dirty` of the build, `env` (every `APS5_*` variable; a value containing `/` or `\` is written as ``), `gpu`, `driver`, `os`, `cpu` (the CPU brand string), `cpu_threads` and `memory_mib` (physical memory) of the host (all three absent on a host that is not x86 or reports no brand string), `title_id`, `title` and `content_version` from `app0/sce_sys/param.json` (only when the title has one; `content_version` is empty when the file has no `contentVersion`, or one that is not a string of at most 15 characters), `resolution` (the video output's), `window`, `presents`, `frame_ms` (p50, p90, p99 and max of the intervals between presents), `gpu_busy_ms_per_present` (the batch timestamps behind `[present]`), `worker_busy_pct` (share of the window each queue worker spends in `Driver.Packet`, `Driver.Suspend`, `Driver.EndSubmission`, `Driver.Rewind` and `Driver.Completion`), `top_phases_ms_per_frame` (the eight largest scopes and stages, without `Driver.WorkerWait`), `trace_dropped`, `trace_dropped_threads` and `trace`. `trace_dropped` is `true` when any thread lost a slice, any thread's totals table (512 scope and stage entries) was full, or the `gpu` track was full. `trace_dropped_threads` is present only then and has one entry per such thread name (threads that share a name, such as the shader prepare threads, share one entry: `events_lost` is summed, `events_full_after_s` is the earliest, `totals_full` is true if any is): `events_full_after_s` (seconds from the first present of the window to the start of the first lost slice; absent for `gpu` and, in every summary line (windowed `APS5_TRACE_FRAMES`/`APS5_TRACE_SECONDS` and `APS5_TRACE_SUMMARY_EVERY`), whenever the first lost slice starts outside the line's span of presents, including a slice whose scope began before the window opened or one lost after the window's last present), `events_lost` (slices not recorded; absent when 0; in `APS5_TRACE_SUMMARY_EVERY` lines it counts the thread buffer's losses since it started, not only those of the line's span) and `totals_full` (`true` when the thread's totals table overflowed, which makes the summary numbers incomplete; a thread with `events_lost` only has complete totals). A trace holds timings, scope names, counts and thread names; no guest memory, paths or strings of the title. +The summary's scope durations are wall time aggregated across threads. Nested scopes include their children, and scopes on different threads can overlap; adding them does not give a frame's exclusive CPU or GPU cost. Only the eight largest aggregates are listed: a missing scope or stage does not establish that it did not run or cost nothing, even when `trace_dropped` is false. `worker_busy_pct` measures occupancy in the listed scopes, including waits inside them, rather than CPU utilization. Use the full trace and separately measured thread CPU time to distinguish these cases. + The shader preparation threads are traced as well, `shader prepare`, with a buffer for 32,768 events each. A wait for the GPU mutex on a traced thread is a `GpuMutex.wait.` slice (`dispatch`, `draw`, `present`, `flush` and so on, as on the `[lock]` line). The `gpu` track holds one `batch` slice per recorder batch, from the batch's timestamp pair. With `APS5_PROFILE_GPU=1` it also holds a slice per command class range, under the class names of the `[gputime]` line (`draw`, `copy`, `fill`, `present-blit`, ...); program ranges are left out. The track keeps up to 262,144 ranges; more set `trace_dropped`. The GPU clock is mapped onto the CPU clock with calibrated timestamps (`VK_KHR_calibrated_timestamps` or the EXT version, enabled only when a trace switch is set) taken when the window opens and when it closes, so the two clocks are matched at both ends of the window. A batch is added when the driver reads its timestamps, after its fence signals, so the batches of the last frames of the window, which complete after it closes, are missing. Without calibrated timestamps the trace has no `gpu` track, and the `[trace]` line says so. diff --git a/docs/dev/ENVIRONMENT.md b/docs/dev/ENVIRONMENT.md index af605afcff..5ce9bf15a8 100644 --- a/docs/dev/ENVIRONMENT.md +++ b/docs/dev/ENVIRONMENT.md @@ -6,6 +6,7 @@ The code reads environment names through `getenv`, `IsEnvironmentSet`, `kibSetti | Name | Kind | Source | Default | Description | |------|------|--------|---------|-------------| +| `ANYPS5_GUEST_ENV_TEST_4C27` | string | `core/libs/tests/GuestEnvironment.cpp` | | test variable that the guest environment test sets, copies and removes; not a product setting | | `ANYPS5_JOB_MANAGER_CASE` | string | `core/libs/tests/JobManagerReference.cpp` | | selects the CPU fixture run by `tools/run_job_manager_reference.py` | | `ANYPS5_JOB_MANAGER_HOST` | presence | `core/libs/tests/JobManagerReference.cpp` | | runs the reference adapter against the host fallback instead of the loaded guest module | | `ANYPS5_LOADEXEC_PARENT` | string | `core/libs/tests/GuestLoadExecHost.cpp` | | variable the Windows entry stub reads; its wide name is built in `core/relinker/elfpatcher/src/windows/WindowsEntryStubBuilder.cpp` | @@ -13,6 +14,7 @@ The code reads environment names through `getenv`, `IsEnvironmentSet`, `kibSetti | `ANYPS5_POSIX_SPAWN_ROLE` | string | `core/libs/tests/GuestPosixSpawn.cpp` | | role of the test's own copy spawned as a `posix_spawn` child, which exits or sleeps on it and otherwise fails | | `ANYPS5_TEST_QUOTED_ARGV0` | presence | `core/libs/tests/GuestLoadExecHost.cpp` | | makes the load-exec test's first argument one with quotes, a backslash and non-ASCII text | | `APS5_EBOOT` | string | `core/libs/prx/libSceSystemService/Export.cpp` | | host path of the executable launched for /app0/eboot.bin; unset or empty means the running executable | +| `APS5_LOAD_EXEC_STANDARD_ERROR` | string | `core/libs/tests/GuestSystemServiceLoadExecStandardError.cpp` | | marker that the standard-error load-exec test sets in its child process to choose a mode, `list` or `none`; not a product setting | | `APS5_SKIP_TIMING_TESTS` | string | `core/libs/tests/PreciseWait.cpp` | | treats the timing tests' runner as preempted, so they skip without probing the clock; an empty value or one starting with 0 leaves the probe on | | `APS5_USBD_DEVICE` | string | `core/libs/tests/GuestUsbd.cpp` | | selects the USB device a test drives, as vendor:product in hex | @@ -157,7 +159,7 @@ The code reads environment names through `getenv`, `IsEnvironmentSet`, `kibSetti | `APS5_DUMP_SHADERS` | string | `core/libs/prx/libSceAgcDriver/Execution/src/Driver/Dispatch/Dispatch.cpp` | | writes each prepared shader's request to shader_
.req; a comma-separated list of hex program addresses (for example `807b90a100,0x807b925400`) writes only those programs' requests, and any other value (such as `1`) writes every request | | `APS5_DUMP_STORAGE` | string | `core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp` | | selects storage textures to dump by hex address or WxHxL[:format] extent as storage_
_.raw | | `APS5_DUMP_STORAGE_GATE` | path | `core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp` | | with `APS5_DUMP_STORAGE`, waits for this path to exist and reads matching live images directly without guest writeback; at most eight addresses, 8 MiB linear storage per image; writes `storage_direct_
_.raw` with the existing pitch, height and VkFormat header and first-mip pixels | -| `APS5_TEST_DIRECT_READBACK` | set | `core/libs/prx/libSceAgcDriver/tests/execution/LayeredVolumeDraw.cpp` | | runs the clean-volume gated live-image readback regression in the layered volume execution test | +| `APS5_TEST_DIRECT_READBACK` | presence | `core/libs/prx/libSceAgcDriver/tests/execution/LayeredVolumeDraw.cpp` | | runs the clean-volume gated live-image readback regression in the layered volume execution test | | `APS5_DUMP_SUBMITS` | string | `core/libs/prx/libSceAgcDriver/Execution/src/SubmissionCapture.cpp` | | directory in which every submission is captured for replay | | `APS5_DUMP_TARGETS` | integer | `core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp` | 0 | dumps the first n renders of each non-resident color target as target_
_.raw in the working directory; a non-zero value also runs every draw synchronously, and in practice it needs APS5_NO_RESIDENT_TARGETS=1 | | `APS5_DUMP_TEXTURE` | string | `core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp` | | hex addresses or WxH extents whose sampled textures are dumped on each of their first 8 uploads as texture_
_.raw | @@ -173,6 +175,7 @@ The code reads environment names through `getenv`, `IsEnvironmentSet`, `kibSetti | `APS5_FRAME_CAPTURE` | string | `core/libs/prx/libSceAgcDriver/Execution/src/FrameRecorder.cpp` | | directory in which the driver records a few frames of the title's driver calls and guest memory for `agc_frame_replay` | | `APS5_FRAME_CAPTURE_AT_FLIP` | integer | `core/libs/prx/libSceAgcDriver/Execution/src/FrameRecorder.cpp` | 0 | frame boundary (CPU flip or submission that flips) at which the frame capture starts when no trigger file is set; 0 and 1 both start at the first boundary; a value that is not a number fails | | `APS5_FRAME_CAPTURE_FRAMES` | integer | `core/libs/prx/libSceAgcDriver/Execution/src/FrameRecorder.cpp` | 10 | number of frame boundaries the frame capture records | +| `APS5_FRAME_CAPTURE_MIN_FREE_BYTES` | integer | `core/libs/prx/libSceAgcDriver/Execution/src/FrameRecorder.cpp` | 4294967296 | free bytes the capture volume must keep or the frame capture stops with a warning; the tests set 0 so a nearly full runner disk cannot fail them | | `APS5_FRAME_CAPTURE_TRIGGER` | string | `core/libs/prx/libSceAgcDriver/Execution/src/FrameRecorder.cpp` | | file whose appearance starts the frame capture at the next frame boundary; a number in it replaces the frame count | | `APS5_FULL_BARRIERS` | presence | `core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp` | | records every barrier instead of merging redundant ones | | `APS5_GPU_CHECKPOINTS` | presence | `core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp` | | attaches device diagnostic checkpoints through VK_NV_device_diagnostic_checkpoints, or buffer markers through VK_AMD_buffer_marker on a device without it | @@ -212,6 +215,7 @@ The code reads environment names through `getenv`, `IsEnvironmentSet`, `kibSetti | `APS5_LOG_SYNC` | presence | `core/libs/prx/libSceAgcDriver/Execution/include/AsyncLog.hpp` | | writes AGC log lines on the calling thread instead of through the asynchronous sink thread | | `APS5_LOOP_GUARD` | presence | `core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp` | | enables the fault buffer that guards shader loops running past their bound | | `APS5_MIRROR_REFRESH_THREADS` | integer | `core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp` | 3 | number of helper threads that refresh heap mirrors, clamped to 0 through 16 | +| `APS5_NO_ADAPTIVE_STAGING` | presence | `core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp` | | stages every element the staging window admits instead of probing each busy element by frame GPU time and keeping it in place when that is faster | | `APS5_NO_ADDRESS_READ_PASSES` | presence | `core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp` | | stops a draw that only reads through its buffer descriptors from counting as read-only, so it breaks the pass instead of continuing the producer's | | `APS5_NO_ADDRESS_SPACE_CACHE` | presence | `core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp` | | disables the address-space cache so every build rebuilds its space | | `APS5_NO_ADJACENT_GENERATION` | presence | `core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp` | | leaves adjacent pending images at their generation during a write-back, as before | @@ -509,6 +513,8 @@ The code reads environment names through `getenv`, `IsEnvironmentSet`, `kibSetti | Name | Kind | Source | Default | Description | |------|------|--------|---------|-------------| | `APS5_PAD_SPEAKER_FALLBACK_DB` | string | `core/libs/prx/libSceAudioOut/src/AudioOut2PadMix.cpp` | 0 | gain in dB for AudioOut2 controller-speaker ports folded into the main mix when no controller speaker is present; accepts a number from -60 to 0 or mute/off/-inf, and the default 0 leaves the mix unchanged; any other value, including an out-of-range number, stops the title with an error naming the variable and the value | +| `ANYPS5_MUTE_ON_FOCUS_LOSS` | string | `core/libs/prx/libScePad/src/HostVolumeState.cpp` | 0 | `1` mutes the host audio while the display window has no focus and restores it when the focus returns; `0` or unset leaves the audio alone; any other value, including an empty one, stops the game with an error naming the variable | +| `ANYPS5_VOLUME` | string | `core/libs/prx/libScePad/src/HostVolumeState.cpp` | 100 | initial host output volume, a whole number from 0 to 100, changed afterwards by the volume keys; 100 leaves the audio bit-identical to the title's output; any other value, including an empty one, stops the game with an error naming the variable | | `APS5_TRACE_AUDIOOUT` | presence | `core/libs/prx/libSceAudioOut/src/AudioOut.cpp` | | logs each audio-out port opened with its type, sample count, frequency and format | | `APS5_TRACE_AUDIOOUT2` | presence | `core/libs/prx/libSceAudioOut/src/AudioOut2Context.cpp` | | prints the title's AudioOut2 context and port parameters and stream activity | @@ -524,6 +530,12 @@ The code reads environment names through `getenv`, `IsEnvironmentSet`, `kibSetti |------|------|--------|---------|-------------| | `ANYPS5_SYSTEM_FONTS` | string | `core/libs/prx/libSceFont/src/SystemFont.cpp` | | directory holding the system fonts, defaulting to anyps5-fonts beside the executable | +### libSceIme + +| Name | Kind | Source | Default | Description | +|------|------|--------|---------|-------------| +| `ANYPS5_PSN_DIALOGS` | string | `core/libs/prx/libSceIme/src/PsnDialogNotice.cpp` | silent | when a dialog that needs PlayStation Network opens (profile, friend list, store, invitations, Facebook link, authorized apps), `show` displays a host notice that the feature is not available; `silent`, unset or empty shows nothing, as before; any other value stops the title at its first such dialog with an error naming the variable | + ### libSceNpEntitlementAccess | Name | Kind | Source | Default | Description | @@ -554,6 +566,7 @@ The code reads environment names through `getenv`, `IsEnvironmentSet`, `kibSetti | Name | Kind | Source | Default | Description | |------|------|--------|---------|-------------| | `APS5_SAVEDATA_TRACE` | presence | `core/libs/prx/libSceSaveData.native/Export.cpp` | 3 | logs every save-data operation instead of the first three at each logging site | +| `ANYPS5_FREE_SPACE` | string | `core/libs/prx/libSceSaveData.native/Export.cpp` | fixed | `fixed` keeps the save sizes and room the title sees today; `host` refuses to create a save whose blocks the save's volume cannot hold (`SCE_SAVE_DATA_ERROR_NO_SPACE_FS`, with the missing blocks in `required_blocks`) and bounds a save's free blocks by the room its volume has; empty or any other value stops the game with an error naming the variable; on Windows an empty value is the same as unset, because `cmd` and PowerShell remove the variable | ### libSceSystemService @@ -574,6 +587,7 @@ The code reads environment names through `getenv`, `IsEnvironmentSet`, `kibSetti | `ANYPS5_DISPLAY_INDEX` | integer | `core/libs/prx/libSceVideoOut/src/DisplayWindow.cpp` | 0 | SDL display index used for the initial window size and centered position; invalid or unavailable indices fail window creation; selection does not guarantee the window will not activate | | `ANYPS5_FULLSCREEN` | presence | `core/libs/prx/libSceVideoOut/src/DisplayWindow.cpp` | | opens the display window fullscreen at the desktop resolution when set to a non-empty value other than 0; F11 still switches back | | `ANYPS5_INPUT_CONFIG` | string | `core/libs/prx/libSceVideoOut/src/InputMapping.cpp` | | path of the input mapping file that binds host keys and mouse to guest pad actions | +| `ANYPS5_PAD_PORT0_STATE` | string | `core/libs/prx/libSceVideoOut/include/Port0Presence.hpp` | default | `default` keeps port 0 connected and user 0 logged in as before; `controller` makes port 0 and user 0 follow the controller bound to slot 0, a change committed after 500 ms, and a withdrawn port 0 reads zeroed and disconnected; any other value, including an empty one, stops the game when video output starts with an error naming the variable | | `ANYPS5_REQUIRE_DISPLAY` | presence | `core/libs/prx/libSceVideoOut/tests/Flip.cpp` | | makes video-out tests fail instead of skipping when no display or Vulkan device is available | | `APS5_NO_PAD_INPUT` | presence | `core/libs/prx/libSceVideoOut/src/PadInput.cpp` | | ignores keyboard and mouse input so a measurement run is not advanced by a stray press | | `APS5_NO_WGI` | presence | `core/libs/prx/libSceVideoOut/src/VideoOutDriver.cpp` | | turns off SDL's Windows.Gaming.Input joystick backend at default hint priority, on Windows hosts where it faults a few seconds into every run | diff --git a/docs/dev/debt/libCprm.md b/docs/dev/debt/libCprm.md new file mode 100644 index 0000000000..6668953591 --- /dev/null +++ b/docs/dev/debt/libCprm.md @@ -0,0 +1,52 @@ +# libCprm technical debt + +### Callable exports + +- [Callable exports](../../../core/libs/prx/libCprm/Export.cpp) - 35 entries are import-resolution declarations only. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Data exports require separate layout and ownership analysis. Candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `+Eh9ZNYi6zo` | +| `Unknown` | `+X9TC+1sw8c` | +| `Unknown` | `1M23A00Z5YY` | +| `Unknown` | `9Blq0Y1cfC4` | +| `Unknown` | `C+UDpkvBfq0` | +| `Unknown` | `Dxqbh2fid-0` | +| `Unknown` | `GYIfXUO2DQM` | +| `Unknown` | `GzdjmaMs2ec` | +| `Unknown` | `Ja2HmL89pQk` | +| `Unknown` | `N1QA8ydpT5s` | +| `Unknown` | `Qqt9wsrnORY` | +| `Unknown` | `SebG2x8vugA` | +| `Unknown` | `Sz5wfo9uoQo` | +| `Unknown` | `UXwPU6S3K3M` | +| `Unknown` | `Ut6wGp0l-EU` | +| `Unknown` | `Uv-1Y7ctRPg` | +| `Unknown` | `WWfjXT2d7SM` | +| `Unknown` | `YhPUdyQoZ2w` | +| `Unknown` | `YvBd1vant8Y` | +| `Unknown` | `aoE6klVaQmo` | +| `Unknown` | `fb1srL++42M` | +| `Unknown` | `gnClz0AOgtw` | +| `Unknown` | `h9jXWgBLon0` | +| `Unknown` | `hs4OD9CTzsU` | +| `Unknown` | `hvZH8f+HBVg` | +| `Unknown` | `i2aJI0V3U3A` | +| `Unknown` | `iDCilRZjGRM` | +| `Unknown` | `lCmvZpz-8Sg` | +| `Unknown` | `llRRCXKDB8g` | +| `Unknown` | `mq+QSu3eTDM` | +| `Unknown` | `pa1PYEalrtU` | +| `Unknown` | `tsJszAZ7k+A` | +| `Unknown` | `vR2Jy582NrI` | +| `Unknown` | `x5bhPjRC+WQ` | +| `Unknown` | `y2mH4WVl028` | + +### Unresolved data exports + +These older data exports remain undeclared. Their NIDs and sizes also appear in the later inventory, but their types, initialization and lifetime have not been established. Both images contain the same relocation pattern within these objects: the first has five relative relocations; the second has four relative relocations and one symbol relocation. The file-backed bytes are zero before relocation. Object type, relocated targets, initialization and lifetime remain unverified. + +| NID | Size (bytes) | Relocations | +| --- | ---: | ---: | +| `5vIwXuuJRyw` | 56 | 5 | +| `xPsa6JbPY0w` | 56 | 5 | diff --git a/docs/dev/debt/libSceAbstractStorage.md b/docs/dev/debt/libSceAbstractStorage.md index 8541e16bd0..133265d1eb 100644 --- a/docs/dev/debt/libSceAbstractStorage.md +++ b/docs/dev/debt/libSceAbstractStorage.md @@ -3,3 +3,19 @@ ### Known export names; ABI prototypes unverified - 110 pending exports in [Export.cpp](../../../core/libs/prx/libSceAbstractStorage/Export.cpp) are present in the [PS5-3.20_Libs](https://github.com/DNNDHH/PS5-3.20_Libs) inventory. Their prototypes and behavior are unverified. They use the no-parameter import-resolution convention and throw through `NotImplemented_nid_no_patch`; these declarations make no ABI or behavior claim. + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceAbstractStorage/Export.cpp) - 7 entries present in both version-labelled images are import-resolution declarations only. Neither label independently authenticates retail firmware provenance. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Data exports require separate layout and ownership analysis. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `+bCU7y60g28` | +| `Unknown` | `JwplLmzUrs0` | +| `Unknown` | `Nrv7BRYovYk` | +| `Unknown` | `YBmeXvldPyg` | +| `Unknown` | `jsjQnoZHra8` | +| `Unknown` | `lMU9P5mJtNM` | +| `Unknown` | `scAYh9JGyYI` | + +- [Older callable NIDs](../../../core/libs/prx/libSceAbstractStorage/Export.cpp): 14 unidentified exports have unverified names, signatures and behavior. These are throwing import-resolution placeholders; no functionality is implemented. No matching NIDs were found in the later module inventory. diff --git a/docs/dev/debt/libSceAbstractTcs.md b/docs/dev/debt/libSceAbstractTcs.md new file mode 100644 index 0000000000..1235886bd6 --- /dev/null +++ b/docs/dev/debt/libSceAbstractTcs.md @@ -0,0 +1,5 @@ +# libSceAbstractTcs technical debt + +### Functional + +- [Older callable NIDs](../../../core/libs/prx/libSceAbstractTcs/Export.cpp): 40 unidentified exports have unverified names, signatures and behavior. These are throwing import-resolution placeholders; no functionality is implemented. No matching NIDs were found in the later module inventory. diff --git a/docs/dev/debt/libSceAcm.md b/docs/dev/debt/libSceAcm.md index 2c1bdc3552..5f4d76cd12 100644 --- a/docs/dev/debt/libSceAcm.md +++ b/docs/dev/debt/libSceAcm.md @@ -2,7 +2,7 @@ ### Silent stubs -- [libSceAcm](../../../core/libs/prx/libSceAcm/Export.cpp) batches execute as silent no-ops, and do not execute encoded panner, FFT and reverb commands. +- [libSceAcm](../../../core/libs/prx/libSceAcm/Export.cpp) batches execute as silent no-ops, and do not execute encoded panner, FFT, reverb and priority commands (the priority job layout and checks are read from `libSceAcm.sprx`, firmware 13.40, not measured on a console). ### Unknown function info @@ -29,3 +29,15 @@ - [`sceAcmBatchJobNotification`](../../../core/libs/prx/libSceAcm/Export.cpp) is a parameterless pending declaration for import resolution. Its signature and behavior are unverified; it throws through `NotImplemented_nid_no_patch`. - [`sceAcm_ConvReverb_SharedInput`](../../../core/libs/prx/libSceAcm/Export.cpp) encodes the reverb jobs as `libSceAcm.sprx` does on firmware 13.40 (read from the module's code and compared with that code run on x86-64, not measured on a console). PPSA01317 calls it during boot with 512-sample blocks. Its input stage appends one `sceAcm_FFT` job of twice the block size (256 points for 128-sample blocks). The meaning of the reverb descriptor's block metadata for the DSP is unverified. + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceAcm/Export.cpp) - 5 entries present in both version-labelled images are import-resolution declarations only. Neither label independently authenticates retail firmware provenance. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Data exports require separate layout and ownership analysis. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `9+f3tPdeyP0` | +| `Unknown` | `DvsnlQr4yyk` | +| `Unknown` | `PLNywpi1zR4` | +| `Unknown` | `YpYvibqaqz0` | +| `Unknown` | `ngDRON91+-Y` | diff --git a/docs/dev/debt/libSceAgcDriver.md b/docs/dev/debt/libSceAgcDriver.md index 2f9a94c914..b012724a33 100644 --- a/docs/dev/debt/libSceAgcDriver.md +++ b/docs/dev/debt/libSceAgcDriver.md @@ -6,6 +6,29 @@ - [sceAgcDriverRegisterDefaultOwner](../../../core/libs/prx/libSceAgcDriver/Unimplemented.cpp) (libSceAgcDriver) - takes one uint32 owner by value (OpenAGC `include/agcdriver.h`, SharpEmu `AgcExports.DriverResources.cs`) and returns 0 without recording it. PPSA21480 treats the code 0x8A6C9018 it returned before as fatal. Console behaviour is unverified: OpenAGC describes the function as a firmware 5.50 stub that returns 0x8A6C9018, SharpEmu returns 0. The one call in PPSA21480 (0x7f41f) is followed by a test of the sign of the result only; a negative result ends in a coredump user string write and `abort()` (0x131d0-0x13214). - [sceAgcDriverSetResourceRegistrationInfo](../../../core/libs/prx/libSceAgcDriver/Resource/src/Registration.cpp) (libSceAgcDriver) - returns 0 without storing the info, as the retail `libSceAgcDriver.sprx` body does; registration is unavailable, so nothing reads it back. +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceAgcDriver/Export.cpp) - 16 entries present in both version-labelled images are import-resolution declarations only. None is listed in the pinned public 3.20 catalogue for this library. Neither label independently authenticates retail firmware provenance. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Data exports require separate layout and ownership analysis. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `6WO4CscVnfM` | +| `Unknown` | `6v-D6CQHA4Y` | +| `Unknown` | `8CXPPlNmvIc` | +| `Unknown` | `Cia3HgY0WiY` | +| `Unknown` | `DGN+IaHNR8o` | +| `Unknown` | `EqwPDQyh+Ec` | +| `Unknown` | `IGYqP+WKCgc` | +| `Unknown` | `LgctzJSGy7s` | +| `Unknown` | `NmE3PfE211o` | +| `Unknown` | `O144kUYDSBo` | +| `Unknown` | `gpF0LZ3+19c` | +| `Unknown` | `mxyUaQfPgb8` | +| `Unknown` | `oFb2hMcoJa4` | +| `Unknown` | `sW7yp7NVlrk` | +| `Unknown` | `tD2ECNSuTQQ` | +| `Unknown` | `wxdcyVqXJEY` | + ### Unknown function info - [sceAgcDriverSubmitCommandBuffer, sceAgcDriverSubmitMultiCommandBuffers](../../../core/libs/prx/libSceAgcDriver/Submit/src/CommandBuffer.cpp) (libSceAgcDriver) - `queue_context` is treated as a pointer to context whose queue identifier is stored 4 bytes in, matching KytyPS5 (`src/libs/agc.cpp` `AgcDriverSubmitCommandBuffer` / `get_driver_queue`). A null context returns `EINVAL` (22). Whether the console validates other context fields before queue dispatch is unverified. Compute queues are still accepted only for 0x20 to 0x57; queue 0x58 and above throw. Console acceptance of 0x58 on these entrypoints was not measured @@ -15,12 +38,12 @@ - [sceAgcDriverAcquireHDRScopesACQ, sceAgcDriverHp3dLockEnd, sceAgcDriverHp3dLockStart, sceAgcDriverIsEsvmProcess, sceAgcDriverReleaseHDRScopesACQ, sceAgcDriverSetValueToSharedGds, sceAgcDriverSetWorkloadStreamInactive, sceAgcDriverSubmitReprojectionAcb, sceAgcDriverSuspendPointSubmitCdbg, sceAgcDriverSysGetGfxAppGpuResetStatus](../../../core/libs/prx/libSceAgcDriver/Unimplemented.cpp) (libSceAgcDriver) - signatures and behavior are unverified; these parameterless declarations only resolve imports and throw through `NotImplemented_nid_no_patch`. - [sceAgcDriverSetFlip, sceAgcDriverSetWorkloadsActive, sceAgcDriverSetWorkloadComplete, sceAgcDriverUserDataWritePacket, sceAgcDriverUserDataWritePushMarker, sceAgcDriverUserDataWritePopMarker, sceAgcDriverUserDataWriteSetMarker](../../../core/libs/prx/libSceAgcDriver/Export.cpp) (libSceAgcDriver) - declared without parameters; they throw through `NotImplemented_nid_no_patch`. The tree answers their packet sizes (`sceAgcDriverGetSetFlipPacketSizeInDwords`, `sceAgcDriverGetSetWorkloadsActivePacketSize`, `sceAgcDriverGetSetWorkloadCompletePacketSize`, `sceAgcDriverUserDataGetPacketSize` in `Submit/src/Dcb.cpp`), and libSceAgc writes its own flip, workload and marker packets through a `CommandBuffer*` (`libSceAgc/DcbState/src/Display.cpp`, `Workload.cpp`, `Marker.cpp`), but it has no driver-level prototype, so whether these calls take the same arguments and write the same words is not known -- [sceAgcDriverCreateQueue, sceAgcDriverDestroyQueue, sceAgcDriverSetupAsyncGraphics, sceAgcDriverSubmitMultiCommandBuffersDirect, sceAgcDriverSuspendPointSubmit, sceAgcDriverSuspendPointSubmitDirect, sceAgcDriverIDHSSubmit, sceAgcDriverTmpInitIdhs, sceAgcDriverAcquireRazorACQ, sceAgcDriverSubmitToRazorACQ, sceAgcDriverSubmitToHDRScopesACQ, sceAgcDriverCwsrSuspendAcq, sceAgcDriverCwsrResumeAcq](../../../core/libs/prx/libSceAgcDriver/Export.cpp) (libSceAgcDriver) - declared without parameters; they throw through `NotImplemented_nid_no_patch`. The tree submits only through the calls in `Submit/src` and knows a queue context only as `sceAgcDriverSubmitCommandBuffer` reads it; it has no arguments or results for queue creation, suspend-point or IDHS submission, or the Razor, HDR-scopes and CWSR queue calls -- [sceAgcDriverGetRegShadowInfo, sceAgcDriverGetRegShadowInfoAgr, sceAgcDriverSetupRegisterShadow, sceAgcDriverPatchClearState, sceAgcDriverNotifyDefaultStates, sceAgcDriverPassInfoDownward, sceAgcDriverModuleRegistration, sceAgcDriverGetReservedDmemForAgc, sceAgcDriverGetWorkloadStreamInfo, sceAgcDriverSetHsOffchipParamDirect](../../../core/libs/prx/libSceAgcDriver/Export.cpp) (libSceAgcDriver) - declared without parameters; they throw through `NotImplemented_nid_no_patch`. The executor keeps no register-shadow memory and runs `CLEAR_STATE` itself (`Execution/src/Pm4.cpp`), workload streams are kept only as registered ids (`Resource/src/Registration.cpp`) and `sceAgcDriverSetHsOffchipParam` keeps nothing (`State/src/Configuration.cpp`); the arguments and results of these calls are not in the tree -- [sceAgcDriverDebugHardwareStatus, sceAgcDriverGetPaDebugInterfaceVersion, sceAgcDriverSysEnableSubmitDone45Exception, sceAgcDriverSysGetClientNumber, sceAgcDriverSysIsGameClosed](../../../core/libs/prx/libSceAgcDriver/Export.cpp) (libSceAgcDriver) - declared without parameters; they throw through `NotImplemented_nid_no_patch`. They are not among the retail constant results in `Unimplemented.cpp`, and the tree has no prototype or console answer for them +- [sceAgcDriverCreateQueue, sceAgcDriverDestroyQueue, sceAgcDriverSetupAsyncGraphics, sceAgcDriverSuspendPointSubmit, sceAgcDriverIDHSSubmit, sceAgcDriverTmpInitIdhs, sceAgcDriverSubmitToHDRScopesACQ, sceAgcDriverCwsrSuspendAcq, sceAgcDriverCwsrResumeAcq](../../../core/libs/prx/libSceAgcDriver/Export.cpp) (libSceAgcDriver) - declared without parameters; they throw through `NotImplemented_nid_no_patch`. The tree submits only through the calls in `Submit/src` and knows a queue context only as `sceAgcDriverSubmitCommandBuffer` reads it; it has no arguments or results for queue creation, suspend-point or IDHS submission, or the HDR-scopes and CWSR queue calls +- [sceAgcDriverGetRegShadowInfo, sceAgcDriverGetRegShadowInfoAgr, sceAgcDriverSetupRegisterShadow, sceAgcDriverPatchClearState, sceAgcDriverNotifyDefaultStates, sceAgcDriverPassInfoDownward, sceAgcDriverGetReservedDmemForAgc, sceAgcDriverGetWorkloadStreamInfo](../../../core/libs/prx/libSceAgcDriver/Export.cpp) (libSceAgcDriver) - declared without parameters; they throw through `NotImplemented_nid_no_patch`. The executor keeps no register-shadow memory and runs `CLEAR_STATE` itself (`Execution/src/Pm4.cpp`) and workload streams are kept only as registered ids (`Resource/src/Registration.cpp`); the arguments and results of these calls are not in the tree +- [sceAgcDriverDebugHardwareStatus, sceAgcDriverSysEnableSubmitDone45Exception, sceAgcDriverSysGetClientNumber, sceAgcDriverSysIsGameClosed](../../../core/libs/prx/libSceAgcDriver/Export.cpp) (libSceAgcDriver) - declared without parameters; they throw through `NotImplemented_nid_no_patch`. They are not among the retail constant results in `Unimplemented.cpp`, and the tree has no prototype or console answer for them - [sceAgcDriverNopDataWritePacket](../../../core/libs/prx/libSceAgcDriver/Unimplemented.cpp) (libSceAgcDriver) - writes an IT_NOP packet with 32-bit address at dword 1 and payload at dword 2, returning 2 dwords for null data or zero bytes, and total dwords otherwise. Console behavior for null or unaligned destination remains unmeasured. - [sceAgcDriverGetCoredumpAddress](../../../core/libs/prx/libSceAgcDriver/Unimplemented.cpp) (libSceAgcDriver) returns the driver's shared coredump-area pointer, which is null when no coredump area is allocated. AnyPS5 reports coredump mode disabled and does not allocate this area; the export returns null. Enabling and populating an AGC coredump area is not implemented. -- [sceAgcDriverSetTargetRingForDiag](../../../core/libs/prx/libSceAgcDriver/Unimplemented.cpp) (libSceAgcDriver) returns `0x8A6D0001` (`DRIVER_FEATURE_UNAVAILABLE`), matching the retail PS5 export. The retail diagnostic log message is not reproduced. +- [sceAgcDriverSetTargetRingForDiag, sceAgcDriverAcquireRazorACQ, sceAgcDriverGetPaDebugInterfaceVersion, sceAgcDriverSetHsOffchipParamDirect, sceAgcDriverSubmitMultiCommandBuffersDirect, sceAgcDriverSubmitToRazorACQ, sceAgcDriverSuspendPointSubmitDirect, sceAgcDriverModuleRegistration](../../../core/libs/prx/libSceAgcDriver/Unimplemented.cpp) (libSceAgcDriver) - the retail diagnostic log messages are not reproduced. In firmware 13.42's libSceAgcDriver.sprx, read from disassembly and not measured on a console, these exports ignore their arguments apart from the message and return `0x8A6D0001` (`DRIVER_FEATURE_UNAVAILABLE`), sceAgcDriverModuleRegistration `0x8A6D0003`. - [Initial point context](../../../core/libs/prx/libSceAgcDriver/Execution/include/QueueState.hpp) - new queues and CLEAR_STATE seed PA_SU_POINT_SIZE 0x00080008 and PA_SU_POINT_MINMAX 0xffff0000, matching every public context table in libSceAgc/Command/include/RegisterDefaultsData.hpp. Cocoon (PPSA08766) reaches geometry point output without writing these registers in the observed startup. Applying the SDK context defaults to initial/CLEAR_STATE driver context is inferred; GPU power-on reset state is not measured and is not the source of these values. Explicit writes and pushed/restored contexts retain their own values. @@ -80,9 +103,10 @@ - [HTILE address of a depth array slice](../../../core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp) (libSceAgcDriver) - `decodeDepth` adds the `DB_DEPTH_VIEW` slice offset to the Z and stencil addresses but not to `htileAddress`, so every slice of a layered depth target shares slice 0's HTILE address and a fill of slice 0's HTILE marks all slices cleared. Astro's Playroom fills the HTILE of each of its three shadow cascades 0x40000 apart (0x24000 bytes of tiles each) back to back before drawing, so the result is still right there; a title that clears one slice between draws to another would lose depth. The per-slice HTILE stride is not derived yet. - [sceAgcDriverGetHsOffchipParam](../../../core/libs/prx/libSceAgcDriver/Unimplemented.cpp) (libSceAgcDriver, NID `r28hEh6cNH0`) - declared as a throwing stub. The two `uint16_t` output pointers and integer return type follow [ps5-vulkan](https://github.com/blackbearreloaded/ps5-vulkan/blob/4bb0c8b1423698a7369efc22b829bf16a99e7128/native/tess_driver_import_stub.c#L10), which reads the pair before it binds a tessellation factor ring. The meaning of the two values, their initial state and how they relate to `sceAgcDriverSetHsOffchipParam`, which keeps nothing here, are unknown; the stub does not write caller memory. PPSA99011 imports it - [Vertex input and color target overlap](../../../core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp) (AGC driver) - direct draws exclude the descriptor prefix skipped by `firstVertex` or `firstInstance` from the alias check; indexed draws conservatively use index zero as the lower bound before adding `firstVertex`. Indirect draws still check the full descriptor extent. Reads of the active target's bytes remain unsupported; same-draw console ordering is not established. -- [PS4 (GCN) tiling](../../../core/libs/prx/libSceAgcDriver/Graphics/src/TextureTiling.cpp) (libSceAgcDriver, PS4) - not checked on a console. Surfaces with `GuestTextureResource::gcnPitch` set use the GB_TILE_MODE and GB_MACROTILE_MODE tables of [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/main/src/video_core/amdgpu/tiling.cpp) and addrlib's `ComputeSurfaceAddrFromCoordMicroTiled` and `MacroTiled`: 8x8 micro tiles in thin, depth or display element order, macro tiles with pipe config P8_32x32_16x16 (P8_32x32_8x16 for the two PRT thin modes), bank width 1 and a 256-byte pipe interleave, depth micro tiles split into slices a whole surface apart with the bank rotated by (banks / 2 + 1) per slice, PRT pipe and bank taken from the coordinates inside the macro tile, and LINEAR_GENERAL rows of exactly the pitch. [TextureTiling.cpp](../../../core/libs/prx/libSceAgcDriver/tests/TextureTiling.cpp) compares it with a separate implementation of the addrlib formulas. -- [PS4 (GCN) thick and layered surfaces](../../../core/libs/prx/libSceAgcDriver/Graphics/src/TextureTiling.cpp) (libSceAgcDriver, PS4) - 3D and thick modes (GB_TILE_MODE 15 and 19 to 26) throw, and so does a storage image or a depth plane of a layered surface with several mip levels. A sampled layered surface with several mip levels is stored level by level, which is not checked on a console; [GcnDetile.cpp](../../../core/libs/prx/libSceAgcDriver/tests/execution/GcnDetile.cpp) runs the GPU detiler over every mode that does not throw. -- [PS4 render targets and display buffers](../../../core/libs/prx/libSceAgcDriver/Execution/src/DisplayBuffer.cpp) (libSceAgcDriver, PS4) - a tiled PS4 display buffer is read as Display2DThin with rows padded to 128 elements, as shadPS4's `image_info.cpp` does. A PS4 render target spans its surface padded to whole macro tiles (1920x1080 at 32 bits is 1920x1088), the display buffer is its top-left corner, and a texture over that corner with the same pitch, tiling and texel size is a [GPU copy](../../../core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp) of it. A PS4 `DB_Z_INFO` names a GB_TILE_MODE index; the depth image stays on the GPU and HTILE is kept, as for the PS5. +- [PS4 (GCN) tiling](../../../core/libs/prx/libSceAgcDriver/Graphics/src/TextureTiling.cpp) (libSceAgcDriver, PS4) - not checked on a console. Surfaces with `GuestTextureResource::gcnPitch` set use the GB_TILE_MODE and GB_MACROTILE_MODE tables of [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/main/src/video_core/amdgpu/tiling.cpp) and addrlib's `ComputeSurfaceAddrFromCoordMicroTiled` and `MacroTiled`: 8x8 micro tiles in thin, depth or display element order, macro tiles with pipe config P8_32x32_16x16 (P8_32x32_8x16 for the two PRT thin modes), bank width 1 and a 256-byte pipe interleave, depth micro tiles split into slices a whole surface apart with the bank rotated by (banks / 2 + 1) per slice, PRT pipe, and for GB_TILE_MODE 11 and 16 bank, taken from the coordinates inside the macro tile, and LINEAR_GENERAL rows of exactly the pitch. [TextureTiling.cpp](../../../core/libs/prx/libSceAgcDriver/tests/TextureTiling.cpp) compares it with a separate implementation of them. +- [PS4 (GCN) 2D PRT tiling](../../../core/libs/prx/libSceAgcDriver/Graphics/src/TextureTiling.cpp) (libSceAgcDriver, PS4) - not checked on a console. GB_TILE_MODE 6, 7, 12 and 17 take the bank from the coordinates inside the macro tile, as shadPS4 does; AMD's addrlib (Mesa 393bf0d1467c) and fpPS4 (04cefd43e6fd) use the whole coordinates for the bank of these 2D PRT modes and take it inside the macro tile only for modes 11 and 16, which fpPS4 documents as the ones that can alias virtual pages to one physical page. +- [PS4 (GCN) thick and layered surfaces](../../../core/libs/prx/libSceAgcDriver/Graphics/src/TextureTiling.cpp) (libSceAgcDriver, PS4) - 3D and thick modes (GB_TILE_MODE 15 and 19 to 26) throw, and so does a storage image or a depth plane of a layered surface with several mip levels. A sampled layered surface with several mip levels is stored level by level, which is not checked on a console; [GcnDetile.cpp](../../../core/libs/prx/libSceAgcDriver/tests/execution/GcnDetile.cpp) runs the GPU detiler over every mode that does not throw. The bank of each layer of a tiled 2D array is rotated by (banks / 2 - 1) times the layer index outside the PRT modes, XORed in as AMD's address library and shadPS4 (`tiling.comp`, 0614ce324be0) do; fpPS4 (`ps4_tiling.pas`, 04cefd43e6fd) adds it to the bank instead. Not checked on a console. +- [PS4 render targets and display buffers](../../../core/libs/prx/libSceAgcDriver/Execution/src/DisplayBuffer.cpp) (libSceAgcDriver, PS4) - a tiled PS4 display buffer is read as Display2DThin with rows padded to 128 elements, as shadPS4's `image_info.cpp` does. A PS4 render target spans its surface padded to whole macro tiles (1920x1080 at 32 bits is 1920x1088), the display buffer is its top-left corner, and a texture over that corner with the same pitch, tiling and texel size is a [GPU copy](../../../core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp) of it. A PS4 `DB_Z_INFO` names a GB_TILE_MODE index; the depth image stays on the GPU and HTILE is kept, as for the PS5. shadPS4 (`image_info.cpp`, 0614ce324be0) rounds the width of a tiled display buffer up to a multiple of 128 itself, whereas `DisplayBufferSize` requires the pitch to be one already. - [PS4 pattern fill](../../../core/libs/prx/libSceAgcDriver/Execution/src/Driver/Memory/BufferFill.cpp) (libSceAgcDriver, PS4) - the PS4 build of the pattern-fill compute kernel seen in Limbo (CUSA01664), with user data s[4:7] a 32-bit UINT source, s[8:11] the 32-bit UINT destination and s[12:15] a control record of count and index mask, where thread i stores source[i & mask], runs as a GPU fill when the mask is 0, a single repeated dword; other masks run the kernel, since running Limbo's two-dword clears of a 64-bit target as fills made its gameplay advance more slowly per frame. The kernel is recognized by its code, not by an SDK symbol. ### Functional @@ -141,7 +165,7 @@ - [Pipeline journal](../../../core/libs/prx/libSceAgcDriver/Graphics/src/PipelineJournal.cpp) (libSceAgcDriver): resident graphics pipelines are bounded by count, not bytes: the store grows from 1024 to 4096 entries for a replay that does not fit and for evicted pipelines that keep coming back, and the last `APS5_PIPELINE_JOURNAL_ENTRIES` (4096) records are all replayed, so a pipeline the title never asks for again costs its memory until teardown. `agc_driver_recorder_tests --benchmark-pipeline-store-memory [count]` gives a floor with the triangle shaders: about 59 KiB host and no device memory per pipeline on an RTX 4090, 100 KiB host and 8 KiB device-local on a UHD 770; larger shaders cost more. The file is rewritten to three quarters of `APS5_PIPELINE_JOURNAL_MAX_MIB` when full. A compute pipeline is replayed over the layout `DescribeSetLayouts` derives, checked only under `APS5_VERIFY_SET_LAYOUTS=1`. The header's format number guards the recipe codec and the store key. - [Graphics pipeline libraries](../../../core/libs/prx/libSceAgcDriver/Graphics/src/PipelineLibrary.cpp) (libSceAgcDriver): a pipeline is fast-linked at the draw and relinked with `VK_PIPELINE_CREATE_LINK_TIME_OPTIMIZATION_BIT_EXT` on a background thread, and binds the optimized one from the next draw on. Draws recorded before that use the fast link, whose vertex stage keeps the outputs the fragment stage does not read: on RADV (Radeon 660M, Mesa 26.2.4) 346 of 483 Astro's Playroom vertex shaders paired with a fragment stage that reads none of them used more VGPRs (median 8 more, up to 2.5 times), and on an RTX 4090 13 of 15 PPSA36082 vertex shaders up to 68 instead of 38 (#2242). The optimized link compiles to the same code as a whole pipeline - [Fragment shader interlock pipelines](../../../core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp) (libSceAgcDriver): a pipeline whose fragment shader declares a fragment shader interlock capability is never built from graphics pipeline libraries, on every driver, so it is compiled whole at the draw with no fast link to bridge the compile. RADV's fast link ([mesa#16653](https://gitlab.freedesktop.org/mesa/mesa/-/work_items/16653), Mesa 26.2.5, RX 7900 GRE) jumps to the PS epilog without waiting for the shader's stores, and the epilog's `done` export ends the GFX11 primitive-ordered section, so the next overlapping wave reads the old value: `agc_driver_pixel_interlock` lost read-modify-writes in 108 of 120 loaded runs under `APS5_NO_PIPELINE_LTO=1`. On an RTX 4090 (NVIDIA 617.42, Windows) the fast link kept the ordering in 240 of 240 loaded runs; other drivers are not measured. -- [Prebuilt pipeline libraries](../../../core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp) (libSceAgcDriver): each registered vertex or pixel shader in registration form gets its pre-rasterization or fragment-shader library built on one background thread, with a fixed state the draw may not use: triangle list, counter-clockwise front face, no depth clamp, depth bias or conservative rasterization, first provoking vertex, one sample. Libraries are kept until the device is torn down; on Astro's Playroom 1948 of them added 0.44 GB of peak memory on RADV. +- [Prebuilt pipeline libraries](../../../core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp) (libSceAgcDriver): each registered vertex or pixel shader in registration form gets its pre-rasterization or fragment-shader library built on the prebuild thread pool, with a fixed state the draw may not use: triangle list, counter-clockwise front face, no depth clamp, depth bias or conservative rasterization, first provoking vertex, one sample. Libraries are kept until the device is torn down; on Astro's Playroom 1948 of them added 0.44 GB of peak memory on RADV. - [`APS5_THREAD_PRIORITY=rt`](../../../core/libs/prx/libSceAgcDriver/Execution/src/ThreadPriority.cpp) (libSceAgcDriver) lowers the process's hard `RLIMIT_RTTIME` when it is above `APS5_THREAD_RTTIME_US` or rtkit's `RTTimeUSecMax`, because [rtkit](https://github.com/heftig/rtkit/blob/c295fa849f52b487be6433e69e08b46251950399/rtkit-daemon.c#L592-L637) (`verify_process_rttime`) reads the hard limit from `/proc//limits` and refuses real-time scheduling when it is higher. An unprivileged process cannot raise the hard limit again, so it stays lowered for the process and its threads even when rtkit then refuses the request (burst limit, user or start-time checks) and the thread throws. rtkit's `MaxRealtimePriority` and `RTTimeUSecMax` are read first, so an unreachable rtkit or a priority above its maximum leaves the limit untouched. The lowered limit only matters for threads that later run under a real-time policy - On a device without VK_EXT_robustness2's `nullDescriptor`, such as MoltenVK, a null image descriptor in a typed heap is a [placeholder image](../../../core/libs/prx/libSceAgcDriver/Graphics/src/PlaceholderImages.cpp) of that heap's type, 1×1 and cleared to zero, which every null descriptor of the heap shares. Reads give zeros, as `nullDescriptor` allows, but stores and atomics to it are kept, so a later read of a null storage image can return them, and a depth comparison compares against depth 0. A heap whose placeholder the device cannot create, for example 1D or 3D depth, 64-bit atomics without 64-bit image atomics, or multisampled storage without `shaderStorageImageMultisample`, throws when a null descriptor reaches it. - [Draw input snapshots](../../../core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp) (libSceAgcDriver): `PrepareDrawBindings` caps read-only input buffer snapshots at 64 MiB (overridable via `APS5_DRAW_SNAPSHOT_MAX_MIB`). Larger inputs (streaming heaps, bindless pools) or draws exceeding the cumulative budget skip the per-draw snapshot and bind in place, avoiding multi-gigabyte CPU copy stalls (such as Ratchet & Clank: Rift Apart PPSA01474 stalling at frame ~380 copying 36 GB every 5 s). If the title rewrites those large ranges on the CPU before GPU completion, the in-place binding observes the modification, as verified by `drawSnapshotCapTests`. @@ -221,6 +245,7 @@ - [One-sample color targets beside a multisampled depth target](../../../core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp) (libSceAgcDriver) - a one-sample color target drawn with a depth target of the rasterizer's sample count is taken to keep the coverage of sample 0 after the depth and stencil tests. That is the rule of [`VK_AMD_mixed_attachment_samples`](https://github.com/KhronosGroup/Vulkan-Docs/blob/193ebe195f47ffc5004683d1659e71c725658c4d/chapters/fragops.adoc#L2510-L2516), and it is not measured on hardware. The draw needs `VK_AMD_mixed_attachment_samples`, or `VK_NV_framebuffer_mixed_samples` with truncated coverage reduction, for its sample count and throws without them. With `PS_ITER_SAMPLE` the color is the output of sample 0's invocation. Overrasterization and color targets of different sample counts throw. - [DCC display buffers](../../../core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp) are presented only when all keys of the console's DCC extent agree on uncompressed or a fast-clear code, padding keys included; other keys, and register-clear keys over a pending image, throw. - [Storage image write-back](../../../core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp) (libSceAgcDriver) stores the GPU results over a CPU-stamped range whose guest bytes equal the copy taken when the image's layers got their generation (images up to 1 MiB whose guest bytes were settled at that point, with no unit shadow, pending image results or recorded GPU store over them; other images keep the previous rule: the CPU's bytes win). A CPU store that rewrites the baseline value after the GPU changed it is not told apart from no store, and the GPU result wins there. The 1 MiB limit is a choice, not a console value. A range a queued draw commit still has to read is left pending whatever the stamps say ([`DrawPipeline::HeldReads`](../../../core/libs/prx/libSceAgcDriver/Execution/include/Driver/Draw/DrawPipeline.hpp)), so a title that recycles one allocation between an index buffer and a storage image sees the draw's own indices; the trade is a title that reads a surface as index data and means the image gets the pre-image bytes instead, since the reservation does not compare the command-stream positions of the draw and of the image's write. `APS5_NO_QUEUED_DRAW_READ_ORDER=1` restores the old behaviour, and the `[storage]` line counts the listings the hold turned away (`held for a queued draw read`) and the `[draw] pipelined` line the stores it held. The hold covers what the commit reads of guest memory: the index range, the vertex input ranges as their descriptor extents ([`QueuedDrawReadRanges`](../../../core/libs/prx/libSceAgcDriver/Execution/src/Driver/Memory/WrittenBuffers.cpp), since the bytes a draw fetches depend on the highest index, which only the commit knows) and the source of a queued DMA copy. Every other commit-time read goes through the flush hook, so it sees the bytes the hold protects. Two commit-time reads are outside the hold: the texels a register or cmask clear materialization reads from the draw's own colour target (through the hook, so ordered, but the hold does not cover a render target), and a CPU read whose store the hold turned away, which sees the pre-image bytes. Nothing retries a refused store: the image reaches guest memory with the next flush of that range (the queue worker's idle store, a `WAIT_REG_MEM` poll over it, a later read or write of it). A kept 64 KiB unit that lies outside every (slice, level) window stores nothing: the tracking grid is flat over the guest range while 3D slices taper in depth with the mip level (`HasLayer`), so the higher depth slices' higher-level blocks belong to no window. The console's tracking of such units is not measured. +- [Queue-idle storage write-back](../../../core/libs/prx/libSceAgcDriver/Execution/src/Driver/Queues/QueueWorker.cpp) (libSceAgcDriver) - storage-image results that nothing flushes, waits for or overwrites reach guest memory only after every queue has been idle for 50 ms, where the console's GPU writes them to memory as it runs. The idle store goes 4 MiB at a time and stops as soon as queue 0 has queued work or another queue is running, leaving the rest for the next idle period. A title whose frame gaps pass 50 ms still starts an idle store between two frames, and its next frame waits for the piece in progress: a title's movies at about 25 fps (frame gaps up to 65 ms) show frames of up to about 100 ms there. - [16-bit float display buffers](../../../core/libs/prx/libSceAgcDriver/Execution/src/DisplayBuffer.cpp) (libSceAgcDriver, libSceVideoOut) - pixel formats `0xC001000622000000` and `0xC001000600000000` are taken as R16G16B16A16 and B16G16R16A16 float, eight bytes per texel, as [KytyPS5](https://github.com/KytyPS5/KytyPS5/blob/59183dbfa81ed7efdff6069177fed50de0552725/src/graphics/host_gpu/renderer/image/imageInfo.h) maps them and [SharpProspero](https://github.com/SvenGDK/SharpProspero/blob/5dfdb4b0b166e83dc9ae275001afb695f12c7174/src/SharpProspero/Interop/VideoOut/VideoOutTypes.cs) names them (`Rgba16Float`, `Bgra16Float`); PPSA11386 registers 3840x2160 tiled buffers of the first. The tiled layout is assumed to be the 8-byte SW_64KB_R_X equation of `TextureSwizzleEquations.hpp` applied to full coordinates, as addrlib applies it, by analogy with the 32-bit scanout; `ColorTargetLayout` applies the equations to in-block coordinates, which for 8-byte texels differs in every odd 64-row block row (address bit 11 takes y bit 6) and for 16-byte texels also differs, so a float display buffer written through `WriteColorTarget` and presented from guest memory would show those rows misplaced. The values are assumed to be linear light and are encoded with the sRGB curve for the 8-bit output. Bits 32-39 of these formats are `0x06`, as in the 10-bit formats SharpProspero lists without sRGB transfer, while its sRGB formats have `0x00`, its 10-bit PQ formats `0x04` (with `0x07` in bits 40-47) and its float BT.2100 PQ formats `0x07`: they show only that these formats are not the sRGB ones. NaN and negative values give 0, values of 1 and above give 255, alpha is linear. Neither the layout nor the transfer is verified against console or title frames, and HDR output is not modelled. DCC metadata on a float buffer throws. - [BT.2100 PQ display buffers](../../../core/libs/prx/libSceAgcDriver/Execution/include/PqToSdr.hpp) (libSceAgcDriver, libSceVideoOut) - pixel formats `0x8100070422000000` and `0x8100070400000000` are taken as 10:10:10:2 texels with BT.2020 primaries and the SMPTE ST 2084 transfer, red or blue in the low bits, as [SharpProspero](https://github.com/SvenGDK/SharpProspero/blob/5dfdb4b0b166e83dc9ae275001afb695f12c7174/src/SharpProspero/Interop/VideoOut/VideoOutTypes.cs) names them (`Rgb10A2Bt2100Pq`, `Bgr10A2Bt2100Pq`) and [KytyPS5](https://github.com/KytyPS5/KytyPS5/blob/59183dbfa81ed7efdff6069177fed50de0552725/src/graphics/host_gpu/renderer/image/imageInfo.h) maps the first; PPSA01317 registers display buffers of the first when its output reports HDR. With HDR output they are presented unchanged through an HDR10 swapchain (`VK_COLOR_SPACE_HDR10_ST2084_EXT`, 10-bit, with `VK_EXT_hdr_metadata`); otherwise they are converted to 8-bit sRGB: ST 2084 EOTF, BT.2020 to BT.709 primaries with negative components clipped, a luminance tone map and the sRGB encoding. The tone map is ours: min(203 nits, white level) is SDR white (the BT.2408 HDR reference white), luminance passes unchanged up to 0.75 of it and an extended Reinhard shoulder above reaches 1.0 at the white level, the peak sceSystemServiceGetHdrToneMapLuminance last reported to the title (or the current one when it never asked), since titles read it once. How a console shows such a buffer on an SDR display is unknown. Alpha is opaque. - [HDR output override](../../../core/libs/prx/libSceAgcDriver/Execution/src/HostHdr.cpp) - setting `APS5_FORCE_SDR` suppresses HDR availability reported to titles while retaining the detected display and surface capabilities. It selects the existing SDR presentation path; it does not add support for floating-point BT.2100 PQ buffers (`0xC001070722000000` and `0xC001070700000000`), whose presentation remains refused. The override does not change the host display settings. @@ -286,7 +311,7 @@ - [Host import refresh](../../../core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp) (libSceAgcDriver): after a change to the guest allocation registry, an import is checked again only when its import window, or its own range when larger, touches a range that changed since the last check, or when it was made since then; every import is checked when the window is 0 or the window or the budget changed. An unchanged import whose run could now be larger, because a remembered refusal no longer holds, is kept until its window changes or a request for the larger run retires it; before, any registry change anywhere retired it. Remembered failures and refusals are dropped the same way and stay checked where they are used. - [Sampled MSAA surface geometry](../../../core/libs/prx/libSceAgcDriver/Graphics/src/TextureTiling.cpp) supplies the fragment-aware linear size and one mip for a tiled 2D surface at two, four or eight fragments. Unsupported arrays, mip chains, extents and block sizes throw. Linear descriptors retain the existing geometry path, including its use when sampling an existing native target; a linear MSAA guest layout is not modeled. The range calculation follows AMD Addrlib's thin-block dimensions. Console layout equivalence and title effects of the additional mip metadata remain unmeasured. This does not add sample upload or readback. -- [Unclamped normalized color targets](../../../core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp) (libSceAgcDriver) - CB_COLOR_INFO targets with BLEND_CLAMP clear (bit 15) on UNORM and SNORM formats are accepted. Without blending Vulkan's conversion clamps the stored value. With blending the pixel shader reads the target through its storage image under pixel interlock, evaluates the blend equation on the unclamped export, and stores the clamped result, because Vulkan clamps blend inputs to the normalized range. The result is not measured on a console. The final float to normalized rounding is Vulkan's. The path needs fragmentShaderPixelInterlock, recorded draws and a single-sample resident target, and refuses dual-source blending, multisampled, packed, reversed and alternate component order targets, a signed target whose write mask skips a component (the shader rewrites it through a float, so the code -128 would become -127), and a packed target's partial write in the same draw. +- [Unclamped normalized color targets](../../../core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp) (libSceAgcDriver) - CB_COLOR_INFO targets with BLEND_CLAMP clear (bit 15) on UNORM and SNORM formats are accepted. With blending the pixel shader reads the target through its storage image under pixel interlock, evaluates the blend equation on the unclamped export, and stores the clamped result, because Vulkan clamps blend inputs to the normalized range. The result is not measured on a console. The final float to normalized rounding is Vulkan's. The path needs fragmentShaderPixelInterlock and shaderStorageImageReadWithoutFormat (refused without either), recorded draws and a single-sample resident target, and refuses dual-source blending, multisampled, packed, reversed and alternate component order targets, a signed target whose write mask skips a component (the shader rewrites it through a float, so the code -128 would become -127), and a packed target's partial write in the same draw. - [Multisample image readback](../../../core/libs/prx/libSceAgcDriver/Graphics/src/MultisampleReadback.cpp) fetches unsigned R8/R16/R32/R32G32/R32G32B32A32 or D32 depth samples through a 2D array view in GENERAL, in layer/y/x/fragment order. The caller owns producer completion, image transitions and resource lifetimes. It implements Vulkan per-sample fetches, not guest-memory publication, metadata expansion or PS5 layout equivalence; D32 exceptional-value preservation has not been measured. Other formats, sample counts and invalid ranges throw. - [Multisample image upload](../../../core/libs/prx/libSceAgcDriver/Graphics/src/MultisampleUpload.cpp) does not model guest layouts, native ownership or CMASK/FMASK/DCC publication; console equivalence and large-title initialization costs remain unmeasured. It stores 1/2/4/8/16-byte elements from a storage buffer into an unsigned 2D multisample array view in layer/y/x/fragment order. It requires enabled multisample storage images and formatless image writes, 2/4/8 fragments and valid aligned buffer and dispatch ranges. The caller supplies the matching storage view in GENERAL and owns barriers, completion and resource lifetimes. @@ -305,6 +330,7 @@ - [Long Windows pipeline-cache paths](../../../core/libs/prx/libSceAgcDriver/Graphics/src/PipelineCache.cpp) (libSceAgcDriver) - whether retail console filesystem APIs normalize non-canonical or relative cache paths beyond MAX_PATH without truncation remains unmeasured against console diagnostics. On Windows, filesystem journal normalization and shared content readers do not cover non-canonical or relative pipeline cache paths beyond MAX_PATH. - [DB_RENDER_CONTROL.STENCIL_CLEAR_ENABLE without a stencil plane](../../../core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp) (libSceAgcDriver): a stencil clear on a depth target whose `DB_STENCIL_INFO` format is `STENCIL_INVALID` is dropped; the depth clear and color writes proceed. AMD PAL ([`gfx9RsrcProcMgr.cpp`](https://github.com/GPUOpen-Drivers/pal/blob/c5e800072a32/src/core/hw/gfxip/rpm/gfx9/gfx9RsrcProcMgr.cpp)) and radeonsi (`si_clear.c`) never set the bit without a stencil plane, and shadPS4 drops it the same way (`vk_rasterizer.cpp`, `StencilValid`). No source states what the hardware does with the bit then; the console was not measured. A read-only stencil plane still throws - [Swept write-only staging](../../../core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp) (libSceAgcDriver): on a discrete GPU a write-only element whose V# stride is wider than the widest buffer store (16 bytes) and that a direct dispatch sweeps is staged in a device-local shadow. The shadow still takes a copy-in, because the copy-back covers the whole element and the stores may leave part of each record unwritten. A sweep proven to write every byte of the element (from the offsets and widths of its stores within the record) could skip the copy-in, about 10 ms per frame in Diablo II: Resurrected; that proof is not made. Store widths are not recorded per instruction either, so a record of 16 bytes or less stays in place even when its stores are narrower. +- [Adaptive staging](../../../core/libs/prx/libSceAgcDriver/Graphics/include/AdaptiveStaging.hpp) (libSceAgcDriver): whether a staged element pays for its two copies is decided by probing the frame GPU time, not from the element's accesses. The probe is measured on one title (PPSA03912, NVIDIA on Linux). It judges by the whole frame's GPU time, so a scene whose GPU load moves by itself can keep the slower mode until the next probe, 20 to 160 s later, and each probe runs a few frames in the slower mode. - [WriteChanged](../../../core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp) (AGC driver) - a partly changed 16-byte write-back chunk is stored with one byte store per changed byte when at most `ChangedByteStoreLimit()` bytes changed, and with `MASKMOVDQU` otherwise. The limit is 16 (byte stores at every density) on a CPU whose vendor string is `AuthenticAMD` and 4 on any other. The cost of `MASKMOVDQU` is measured only on a Ryzen 9 7950X, where byte stores win up to about 10 changed bytes in a microbenchmark but PPSA16064 lost its gain when `MASKMOVDQU` was kept from 10 changed bytes on, and on a Core i9-14900KF, where byte stores win only at 3 or 4 changed bytes and are up to 2.6 times slower for dense chunks (#8930). Other AMD and Intel generations and other vendors are not measured. - [Host report](../../../core/libs/prx/libSceAgcDriver/Execution/src/HostReportVulkan.cpp) (libSceAgcDriver, `ANYPS5_HOST_REPORT=1`): run on Linux with a software Vulkan device only. Its Windows branches (`RtlGetVersion`, `GlobalMemoryStatusEx`, `USERNAME`, `COMPUTERNAME`, `USERPROFILE`) and its macOS branches are not run, and no hardware GPU's output is checked. The list of required Vulkan items in `HostReportVulkan.cpp` mirrors the checks of `VulkanDevice.cpp` by hand: a new hard requirement added there must be added to the list, or the start fails with the older single-item message. Closes when: the report is read on Windows, macOS and a hardware GPU. diff --git a/docs/dev/debt/libSceAjm.native.md b/docs/dev/debt/libSceAjm.native.md index efb53e7344..da7e79d812 100644 --- a/docs/dev/debt/libSceAjm.native.md +++ b/docs/dev/debt/libSceAjm.native.md @@ -46,3 +46,17 @@ - [AJM Opus mapping family 255 with several channels](../../../core/libs/prx/libSceAjm.native/src/Ajm.cpp) (libSceAjm.native): the initialization words carry no stream count or channel mapping, so the decoder opens on the first packet. It counts the self-delimited streams of that multistream packet ([RFC 6716 appendix B](https://datatracker.ietf.org/doc/html/rfc6716#appendix-B)) and takes each stream's stereo flag from its TOC byte as coupled, then decodes with an identity channel mapping. A packet whose streams do not add up to the channel count throws. The layout is inferred, not read from the console; unverified on hardware. - [AJM three-, four- and five-channel AAC](../../../core/libs/prx/libSceAjm.native/src/Ajm.cpp): PS5 PCM equivalence and speaker masks for three and five channels remain unverified. Raw configuration numbers follow the pinned shadPS4 decoder above; PCM follows its FDK-AAC backend's default WAV channel order, documented by [FDK-AAC](https://github.com/mstorsjo/fdk-aac/blob/v2.0.3/libAACdec/include/aacdecoder_lib.h), using FFmpeg's corresponding native layouts. Three- and five-channel format sidebands throw before decoding; format queries after decoding also throw. Four-channel metadata retains the existing source's quad mask even though AAC configuration 4 carries a center and a back-center speaker. Other AAC layouts, including PCE-based configurations and seven/eight channels, still throw. + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceAjm.native/Export.cpp) - 7 entries observed in the 3.20 export inventory and present in the later 13.60-labelled inventory are import-resolution declarations only. The later inventory label does not authenticate a retail firmware version. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Data exports require separate layout and ownership analysis. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `IfQ-AhcmW9k` | +| `Unknown` | `JAPya-QyJlU` | +| `Unknown` | `MgTTRx1YSFw` | +| `Unknown` | `POOw6Y5luA8` | +| `Unknown` | `mKgie3ed4ao` | +| `Unknown` | `mwtwIZb60YM` | +| `Unknown` | `qkuXdR4-Ihc` | diff --git a/docs/dev/debt/libSceAmpr.md b/docs/dev/debt/libSceAmpr.md index 12b57e4846..0c9bbb353d 100644 --- a/docs/dev/debt/libSceAmpr.md +++ b/docs/dev/debt/libSceAmpr.md @@ -2,12 +2,12 @@ ### Silent stubs -- [sceAmprCommandBufferDestructor, sceAmprAprCommandBufferDestructor, sceAmprAmmCommandBufferConstructor, sceAmprAmmCommandBufferDestructor](../../../core/libs/prx/libSceAmpr/Export.cpp) (libSceAmpr) - return 0 without reading or changing the buffer, or the APR gather and scatter states. Unlike `sceAmprCommandBufferConstructor` and `sceAmprAprCommandBufferConstructor`, the AMM constructor leaves every field of the buffer as the caller left it. Borderlands 4 (PPSA01494), Ghost of Tsushima (PPSA02225), Forspoken (PPSA03984), Astro Bot (PPSA21564), Crimson Desert (PPSA25286), MXGP 26 (PPSA30839) and Super Meat Boy 3D (PPSA31162) call both destructors; Forspoken also calls the AMM constructor and destructor once each +- [sceAmprCommandBufferDestructor, sceAmprAprCommandBufferDestructor, sceAmprAmmCommandBufferConstructor, sceAmprAmmCommandBufferDestructor](../../../core/libs/prx/libSceAmpr/Export.cpp) (libSceAmpr) - return 0 for a non-null buffer and leave its contents and the APR gather and scatter states untouched, except that a buffer whose commands the emulator expanded (see the command sizes entry below) is released: its original `base` and `size` are restored and `offset` and the command count reset to 0. The AMM constructor returns `SCE_KERNEL_ERROR_EINVAL` for null and, unlike `sceAmprCommandBufferConstructor` and `sceAmprAprCommandBufferConstructor`, does not initialize the buffer. Borderlands 4 (PPSA01494), Ghost of Tsushima (PPSA02225), Forspoken (PPSA03984), Astro Bot (PPSA21564), Crimson Desert (PPSA25286), MXGP 26 (PPSA30839) and Super Meat Boy 3D (PPSA31162) call both destructors; Forspoken also calls the AMM constructor and destructor once each ### Unknown function info - [sceAmprAmmSetPageTablePoolOccupancyNotificationThreshold](../../../core/libs/prx/libSceAmpr/Export.cpp) (libSceAmpr) - throws as unimplemented. The `(int threshold)` signature follows [drakmor/ampr_emu](https://github.com/drakmor/ampr_emu/blob/cfa85df379f6eeeb165d7badf9b648e266fe77b7/src/sceampr_exports.cpp#L336-L337), where the export passes the threshold to `sceKernelMapperSetPageTablePoolOccupancyNotificationThreshold(int)`; not measured on a console. The thresholds the kernel rejects, their error codes and how the notification is delivered are unknown, and no title is known to call it (Planet Zoo, PPSA18026, imports it). -- [AMPR command buffer null arguments](../../../core/libs/prx/libSceAmpr/Export.cpp) (libSceAmpr) - the result for a null command buffer is unknown for `sceAmprCommandBufferConstructor`, `sceAmprAprCommandBufferConstructor`, `sceAmprCommandBufferReset` and `sceAmprCommandBufferSetBuffer`; these return `SCE_KERNEL_ERROR_EINVAL` here, but the behavior has not been confirmed on a PS5. +- [AMPR command buffer null arguments](../../../core/libs/prx/libSceAmpr/Export.cpp) (libSceAmpr) - the result for a null command buffer is unknown for `sceAmprCommandBufferConstructor`, `sceAmprAprCommandBufferConstructor`, `sceAmprCommandBufferReset`, `sceAmprCommandBufferSetBuffer` and `sceAmprCommandBufferGetSize`; the first four return `SCE_KERNEL_ERROR_EINVAL` here, and `sceAmprCommandBufferGetSize` chooses 0, but none of the null behaviour has been confirmed on a PS5. - [AMPR WriteAddressFromCounterPairOnCompletion](../../../core/libs/prx/libSceAmpr/Export.cpp) (libSceAmpr) - the pair of an even counter n is assumed to give counter n in the low 32 bits and n + 1 in the high 32 bits. Wait compare values, wait flush and counter index ranges follow the [ampr_emu](https://github.com/drakmor/ampr_emu) reimplementation; the flush is accepted and has no effect, as commands run in order - [AMPR command buffer offsets](../../../core/libs/prx/libSceAmpr/Export.cpp) (libSceAmpr) - recording with a current offset greater than the bound memory size throws before calculating remaining capacity or writing a command. This validates the emulator's own command-buffer encoding; the console's response to a corrupted opaque buffer object is unknown. - [AMPR command sizes](../../../core/libs/prx/libSceAmpr/Export.cpp) (libSceAmpr) - non-`Nop` commands use host encoding with an 8-byte header, exceeding console sizes. On overflow, the buffer expands up to a 32 MiB cap on the guest heap, relocating `base` and `size`; below this cap a full buffer avoids `EBUSY`, placing commands in host memory not allocated by the guest, and AMM submits resolve original pointers to expanded memory. Rebinding the same memory via `SetBuffer` frees prior expansions and resets that buffer's offset and commands to 0. Beyond the cap, appends return `EBUSY`. `Nop(n)` is n dwords and `NopWithData(n)` (n + 1) dwords with header `0x5452000F | payloadDwords << 8 | (type & 0xF) << 12`, and `ConstructNop` writes its word before payload and zeroes padding (FW 13.42, #10936); null `base` reports before count or range. `NopWithData` and `ConstructNop` stop at the record without trailing zeros. The at-start flag of `_04_00` writes is ignored; commands run in order. diff --git a/docs/dev/debt/libSceAppContent.md b/docs/dev/debt/libSceAppContent.md index c75f621a36..9ea6e297ba 100644 --- a/docs/dev/debt/libSceAppContent.md +++ b/docs/dev/debt/libSceAppContent.md @@ -6,10 +6,7 @@ | Name | NID | | --- | --- | -| `sceAppContentCheckBundleLicenseOnDisc` | `xZo2-418Wdo` | | `sceAppContentDownloadDataGetBlockSize` | `9ht66cHTj7g` | -| `sceAppContentGetGameTrialsFlag` | `1saJukIkcKw` | -| `sceAppContentGetPlayableStatus` | `y8meQn-Qy5c` | - [sceAppContentDownloadDataGetAvailableSpaceKb](../../../core/libs/prx/libSceAppContent/Export.cpp) (libSceAppContent) - a title whose `param.json` declares `downloadDataSize` 0 gets 0 KB and OK; the console's behaviour for a title without a download data area is unverified (it may return an error instead). KytyPS5 does not special-case it, and shadPS4 stubs 1048576 KB. One disassembled title (PPSA15246) calls it with the `/download0` mount point and a zeroed 64-bit output, ignores the return value and multiplies the output by 1024, so for that title an error that leaves the output untouched and an OK with 0 KB look the same - [sceAppContentDownloadDataFormat](../../../core/libs/prx/libSceAppContent/Export.cpp) (libSceAppContent) - empties the `/download0` directory, creating it if needed. Imported by PPSA01317. A null mount point returns `PARAMETER` and another mount point returns `NOT_MOUNTED` as in `sceAppContentTemporaryDataFormat` and `sceAppContentDownloadDataGetAvailableSpaceKb`; the console's error codes for both and its behaviour with files still open are unverified @@ -23,5 +20,7 @@ - [Additional content](../../../core/libs/prx/libSceAppContent/Export.cpp) (libSceAppContent) is not installed or mounted: `sceAppContentAddcontMount` answers `NOT_FOUND` for every entitlement label and `sceAppContentAddcontUnmount` for every mount point, as no add-content mount is ever handed out; `sceAppContentGetAddcontInfo` answers `DRM_NO_ENTITLEMENT` for every label and `sceAppContentGetAddcontInfoList` reports 0 entries; `sceAppContentAddcontEnqueueDownload` answers `PARAMETER` for a null label and `NOT_FOUND` otherwise, since no download is ever queued; `sceAppContentAddcontDelete` answers `PARAMETER` for a null label and `NOT_FOUND` otherwise, since no additional content is ever installed. `sceAppContentGetAddcontDownloadProgress` answers `PARAMETER` for a null label or progress and `NOT_FOUND` otherwise, as [dlc_emu](https://github.com/drakmor/dlc_emu/blob/fcf69b16d46a9850578bce19dc2c1b4dc867cbb5/src/dlc_modules/dlc_content.cpp#L2328-L2341) does for a label that is not installed additional content, and never writes the progress. Its 16-byte layout (`DataSize`, then `DownloadedSize`, both 64-bit) follows [SharpProspero](https://github.com/SvenGDK/SharpProspero/blob/5dfdb4b0b166e83dc9ae275001afb695f12c7174/src/SharpProspero/Interop/AppContent/AppContent.cs#L45-L54) and is unused here. The signatures of `sceAppContentAddcontEnqueueDownload` and `sceAppContentGetAddcontDownloadProgress` follow [SharpProspero](https://github.com/SvenGDK/SharpProspero/blob/5dfdb4b0b166e83dc9ae275001afb695f12c7174/src/SharpProspero/Interop/AppContent/AppContent.cs#L140-L148), and the signature of `sceAppContentAddcontDelete` follows [dlc_emu](https://github.com/drakmor/dlc_emu/blob/fcf69b16d46a9850578bce19dc2c1b4dc867cbb5/src/dlc_modules/dlc_content.h#L91-L92); dlc_emu is not a console measurement and no console source gives the error codes, so the signatures and the error codes are unverified - [sceAppContentAddcontEnqueueDownloadByEntitlemetId, sceAppContentAddcontEnqueueDownloadSp, sceAppContentAddcontMountByEntitlemetId and sceAppContentAddcontShrink](../../../core/libs/prx/libSceAppContent/Export.cpp) (libSceAppContent) - unverified on a PS5. After the initialization guard they answer `PARAMETER` for a null argument and `NOT_FOUND` otherwise, without writing the mount point, as [dlc_emu](https://github.com/drakmor/dlc_emu/blob/fcf69b16d46a9850578bce19dc2c1b4dc867cbb5/src/dlc_modules/dlc_content.cpp#L2125-L2209) does for content it does not know; the prototypes are [dlc_emu's](https://github.com/drakmor/dlc_emu/blob/fcf69b16d46a9850578bce19dc2c1b4dc867cbb5/src/dlc_modules/dlc_content.h#L88-L99). dlc_emu rejects a padded label at every SDK while the label calls above check it only from SDK 0x01500000 or 0x03500000, so `Sp` and `Shrink` answer `PARAMETER` for one from SDK 0x03500000 and throw below it - [sceAppContentGetAddcontInfoByEntitlementId, sceAppContentGetAddcontInfoListByIroTag and sceAppContentGetPftFlag](../../../core/libs/prx/libSceAppContent/Export.cpp) (libSceAppContent) - unverified on a PS5. After the initialization guard they give [dlc_emu's](https://github.com/drakmor/dlc_emu/blob/fcf69b16d46a9850578bce19dc2c1b4dc867cbb5/src/dlc_modules/dlc_content.cpp#L2040-L2086) answers for content it does not know: `DRM_NO_ENTITLEMENT` without writing the info, 0 entries for any tag (a null `hitNum` beside a list returns 0, unlike `sceAppContentGetAddcontInfoList`), and a [PFT flag of 0](https://github.com/drakmor/dlc_emu/blob/fcf69b16d46a9850578bce19dc2c1b4dc867cbb5/src/dlc_modules/dlc_content.cpp#L2343-L2347), and `PARAMETER` for null arguments, with dlc_emu's [prototypes](https://github.com/drakmor/dlc_emu/blob/fcf69b16d46a9850578bce19dc2c1b4dc867cbb5/src/dlc_modules/dlc_content.h#L74-L131) +- [sceAppContentCheckBundleLicenseOnDisc and sceAppContentGetPlayableStatus](../../../core/libs/prx/libSceAppContent/Export.cpp) (libSceAppContent) - unverified on a PS5. After the initialization guard both give [dlc_emu's](https://github.com/drakmor/dlc_emu/blob/fcf69b16d46a9850578bce19dc2c1b4dc867cbb5/src/dlc_modules/dlc_content.cpp#L2211-L2256) `NOT_FOUND` for content it does not know, without writing the playable status. Null arguments return `PARAMETER`, as does a padded label from SDK 0x03500000, as [dlc_emu](https://github.com/drakmor/dlc_emu/blob/fcf69b16d46a9850578bce19dc2c1b4dc867cbb5/src/dlc_modules/dlc_content.cpp#L1570-L1576) checks GetPlayableStatus and @akkadbakkad89 [read](https://github.com/boykopovar/AnyPS5/pull/13673#issuecomment-6545629239) CheckBundleLicenseOnDisc in firmware 4.03 (dlc_emu: 0x01500000). Prototypes from [dlc_emu](https://github.com/drakmor/dlc_emu/blob/fcf69b16d46a9850578bce19dc2c1b4dc867cbb5/src/dlc_modules/dlc_content.h#L100-L109). +- [sceAppContentGetGameTrialsFlag](../../../core/libs/prx/libSceAppContent/Export.cpp) (libSceAppContent) - unverified on a PS5: after the initialization guard it writes a flag of 0, as [dlc_emu](https://github.com/drakmor/dlc_emu/blob/fcf69b16d46a9850578bce19dc2c1b4dc867cbb5/src/dlc_modules/dlc_content.cpp#L2211-L2256) does for content it does not know, and a null pointer returns `PARAMETER`. The prototype is [dlc_emu's](https://github.com/drakmor/dlc_emu/blob/fcf69b16d46a9850578bce19dc2c1b4dc867cbb5/src/dlc_modules/dlc_content.h#L100-L109). - [sceAppContentGetEntitlementKey](../../../core/libs/prx/libSceAppContent/Export.cpp) (libSceAppContent) - the service result without an entitlement is unverified: this model returns `DRM_NO_ENTITLEMENT` and leaves the 16-byte key unchanged. Initialization, null-pointer and SDK 0x01500000 label-padding checks match the reported [firmware 13.42 module probe](https://github.com/boykopovar/AnyPS5/pull/9638#issuecomment-6390573735), run in an emulator, not on hardware. That module forwards service labels 0, 7, 8 and 0xFFFFFFFF without checking them; this library ignores the service label. The system service's own validation and errors remain unknown. - [Temporary app-content storage](../../../core/libs/prx/libSceAppContent/Export.cpp) console behaviour and hardware return values are unverified, including behaviour with open files across unmount; host filesystem failures throw. Storage models one `/temp0` mount, preserving files on unmount while rejecting new path resolutions until remount, and leaving existing open host descriptors usable. `sceAppContentTemporaryDataMount` delegates to `sceAppContentTemporaryDataMount2` with option 1 (`TEMPORARY_DATA_OPTION_FORMAT`) to format on mount as [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/main/src/core/libraries/app_content/app_content.cpp#L550-L553) does. Mount, format, space-query and unmount errors follow [fpPS4](https://github.com/red-prig/fpPS4/blob/04cefd43e6fddd1ab033e7980cd356d14c964905/sys/sys_path.pas); pointer ABI follows [SharpProspero](https://github.com/SvenGDK/SharpProspero/blob/main/src/SharpProspero/Interop/AppContent/AppContent.cs). diff --git a/docs/dev/debt/libSceAppDbShellCoreClient.md b/docs/dev/debt/libSceAppDbShellCoreClient.md new file mode 100644 index 0000000000..904e4cc6ae --- /dev/null +++ b/docs/dev/debt/libSceAppDbShellCoreClient.md @@ -0,0 +1,20 @@ +# libSceAppDbShellCoreClient technical debt + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceAppDbShellCoreClient/Export.cpp) - 10 entries present in both version-labelled images are import-resolution declarations only. Neither label independently authenticates retail firmware provenance. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Data exports require separate layout and ownership analysis. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `-NB6hsKeI2E` | +| `Unknown` | `0PevQGrqaXQ` | +| `Unknown` | `1rdpvtPYXUg` | +| `Unknown` | `3GBO83N9XYk` | +| `Unknown` | `8ahcDF2NTFc` | +| `Unknown` | `DdycECIaV2o` | +| `Unknown` | `SlsrwedLC34` | +| `Unknown` | `aqObO3I7PVk` | +| `Unknown` | `gyhDBiNNvlg` | +| `Unknown` | `s3XFdWNwYD8` | + +- [Older callable NIDs](../../../core/libs/prx/libSceAppDbShellCoreClient/Export.cpp): 18 unidentified exports have unverified names, signatures and behavior. These are throwing import-resolution placeholders; no functionality is implemented. No matching NIDs were found in the later module inventory. diff --git a/docs/dev/debt/libSceAppInstUtil.md b/docs/dev/debt/libSceAppInstUtil.md index 5699239627..5c10aa50ea 100644 --- a/docs/dev/debt/libSceAppInstUtil.md +++ b/docs/dev/debt/libSceAppInstUtil.md @@ -1,5 +1,38 @@ # libSceAppInstUtil technical debt +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceAppInstUtil/Export.cpp) - 26 entries present in both version-labelled images are import-resolution declarations only. None is listed in the pinned public 3.20 catalogue for this library. Neither label independently authenticates retail firmware provenance. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Data exports require separate layout and ownership analysis. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `2WQuFX8yYXg` | +| `Unknown` | `4vqRxwpIE1M` | +| `Unknown` | `9QIC1kZpSG4` | +| `Unknown` | `K73u2VX0JFo` | +| `Unknown` | `LsUZe38RhCs` | +| `Unknown` | `N6H7LMfZD5Q` | +| `Unknown` | `NXqdUFpinmo` | +| `Unknown` | `QMjuGVPtjUY` | +| `Unknown` | `R-OUApMZ1d8` | +| `Unknown` | `T9h6l8bFKGE` | +| `Unknown` | `X5Q7QxodFcg` | +| `Unknown` | `XWjOLtdgxa4` | +| `Unknown` | `Y+ln-TkY+hA` | +| `Unknown` | `Zv+26GDSKcQ` | +| `Unknown` | `ecad2GAw55Y` | +| `Unknown` | `gFlBHjtrMDI` | +| `Unknown` | `gP27iU+aZFw` | +| `Unknown` | `grC16befiso` | +| `Unknown` | `j80u95nZ+3A` | +| `Unknown` | `j9qjbjMifhQ` | +| `Unknown` | `pbYNtR2enrY` | +| `Unknown` | `qn0aziKw-kE` | +| `Unknown` | `qxjCWxg8ki4` | +| `Unknown` | `vZ1SWJ0y4mo` | +| `Unknown` | `xV7MhF+9AQk` | +| `Unknown` | `yYVV-f0zoWY` | + ### Unknown function info - [sceAppInstUtilAppInstallPkg](../../../core/libs/prx/libSceAppInstUtil/Export.cpp) - the package path is followed by an opaque 64-bit value sent to the install service; its meaning and pointer-versus-integer type remain unresolved. diff --git a/docs/dev/debt/libSceAsyncStorageInternal.md b/docs/dev/debt/libSceAsyncStorageInternal.md new file mode 100644 index 0000000000..c043bb94dd --- /dev/null +++ b/docs/dev/debt/libSceAsyncStorageInternal.md @@ -0,0 +1,23 @@ +# libSceAsyncStorageInternal technical debt + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceAsyncStorageInternal/Export.cpp) - 13 entries present in both version-labelled images are import-resolution declarations only. A public 3.20 catalogue for this library was not verified. Neither label independently authenticates retail firmware provenance. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Data exports require separate layout and ownership analysis. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `+YiZLBbdEy8` | +| `Unknown` | `65H7-ohmD9c` | +| `Unknown` | `93CwGWrhf+w` | +| `Unknown` | `9zqbh2tZtZg` | +| `Unknown` | `EKjWxMVMPzY` | +| `Unknown` | `Knldkc0w9lI` | +| `Unknown` | `TN9xRCVggRw` | +| `Unknown` | `hP+HenjaOi8` | +| `Unknown` | `iYDbqYNVajM` | +| `Unknown` | `jR1uFCw8qwc` | +| `Unknown` | `mvZ-UdW+Z-Q` | +| `Unknown` | `q4KNqhT5ibk` | +| `Unknown` | `r299OxwCYsY` | + +- [Older callable NIDs](../../../core/libs/prx/libSceAsyncStorageInternal/Export.cpp): 9 unidentified exports have unverified names, signatures and behavior. These are throwing import-resolution placeholders; no functionality is implemented. No matching NIDs were found in the later module inventory. Five use the primary library qualifier and four use the auxiliary qualifier; qualified guest import resolution is unverified. diff --git a/docs/dev/debt/libSceAudio3d.md b/docs/dev/debt/libSceAudio3d.md index fe59a534e2..8e7cadd713 100644 --- a/docs/dev/debt/libSceAudio3d.md +++ b/docs/dev/debt/libSceAudio3d.md @@ -2,7 +2,7 @@ ### Silent stubs -- [libSceAudio3d](../../../core/libs/prx/libSceAudio3d/Export.cpp) (libSceAudio3d) - `sceAudio3dObjectSetAttributes` validates the port, the reserved object and the attribute array (an object id that was never reserved returns the invalid-object error, while shadPS4 returns success for it; neither is measured on a console), treating the reset-state attribute as valid with a null value and requiring a value for the others, but the identifiers and the value of each are not interpreted, so an object has no samples, no gain and no position: the ids of the `PCM`, `GAIN` and `POSITION` attributes and the `POSITION` layout are unknown (the aerolib NID list gives the names only, the Orbital IDA type database the signatures only and shadPS4's values are PS4). `sceAudio3dPortSetAttribute` accepts the late reverb level and the downmix spread attributes and ignores them, and `sceAudio3dPortFlush` drops the frames queued by `sceAudio3dPortAdvance` instead of mixing and submitting them to an output +- [libSceAudio3d](../../../core/libs/prx/libSceAudio3d/Export.cpp) (libSceAudio3d) - `sceAudio3dObjectSetAttributes` makes the firmware 13.42 checks (the count and the array, then the port, attribute ids 1 to 11, the format and sample count of a `PCM` block, the reserved object, then a value for every id except `RESET_STATE`) but applies nothing, so an object has no samples, no gain and no position; the value checks AudioOut2 makes when it applies them are not modelled. `sceAudio3dPortSetAttribute` checks the late reverb level (0 to 1), the downmix spread radius (0.1 to 2) and the height-aware value as firmware 13.42's AudioOut2 (libSceAudioOut.sprx) does when Audio3d passes them on, and ignores them, and `sceAudio3dPortFlush` drops the frames queued by `sceAudio3dPortAdvance` instead of mixing and submitting them to an output ### Functional @@ -10,18 +10,18 @@ ### Unknown function info -- [sceAudio3dPortOpen](../../../core/libs/prx/libSceAudio3d/Export.cpp) (libSceAudio3d) - buffer modes 0 and 1 (also selected by the 0x10 and 0x18 parameter sizes, whose missing fields take the 512 objects and depth 2 that shadPS4 and prosper both fill in before the checks) and 3 beds depend on an SDK version check in the module ([prosper](https://github.com/mattias800/prosper)) and throw. A repeated `sceAudio3dInitialize` (`NOT_READY` in shadPS4, 0 in prosper) and `sceAudio3dPortAdvance` on a full queue (`NOT_READY` in shadPS4, unhandled in KytyPS5) throw too +- [sceAudio3dInitialize](../../../core/libs/prx/libSceAudio3d/Export.cpp) (libSceAudio3d) - a repeated call throws (`NOT_READY` in shadPS4, 0 in prosper). In firmware 13.42 a PS5 process gets 0 when `sceAudioOut2Initialize` returns 0 again and `NOT_READY` when it returns 0x80268004, and this project's `sceAudioOut2Initialize` does not model a repeated initialization. A PS4 process gets `NOT_READY` for a repeated call before `reserved` is checked, as in the firmware - [sceAudio3dPortGetAttributesSupported](../../../core/libs/prx/libSceAudio3d/Export.cpp): the native export validates the port before the count pointer, writes the total count without reading its incoming value, and writes the complete list when an array is supplied. These checks are matched. The list itself remains the host's three port attributes: the native list derives from AudioOut2 device capability masks, SDK version and platform mode, which the host does not yet model. -- [sceAudio3dObjectReserve](../../../core/libs/prx/libSceAudio3d/Export.cpp) (libSceAudio3d) - object ids, the `max_objects` limit and the checks of `sceAudio3dObjectReserve` and `sceAudio3dObjectUnreserve` follow [shadPS4](https://github.com/shadps4-emu/shadPS4) (PS4), the only reference with a body: ids count up from 1 per port, skipping 0, 0xFFFFFFFF and ids in use, and a failed reserve writes 0xFFFFFFFF -- [sceAudio3dPortOpenEx](../../../core/libs/prx/libSceAudio3d/Export.cpp) (libSceAudio3d) - unknown signature: shadPS4, SharpProspero, Orbital's IDA type database and prosper do not declare it -- [sceAudio3dPortCreate](../../../core/libs/prx/libSceAudio3d/Export.cpp) (libSceAudio3d) - opens with a 0x10 parameter block, as [shadPS4](https://github.com/shadps4-emu/shadPS4) (PS4) does, so it always selects buffer mode 0 and throws once its arguments pass, like `sceAudio3dPortOpen` with that block. A null port id or a non-zero reserved argument returns `INVALID_PARAMETER` before the initialization check, which follows shadPS4, the only reference with a body; it is unmeasured on a PS5 -- [sceAudio3dPortDestroy](../../../core/libs/prx/libSceAudio3d/Export.cpp) (libSceAudio3d) - throws: what it does is unknown. The signature (a port id) comes from the [Orbital](https://github.com/AlexAltea/orbital) IDA type database and [SharpProspero](https://github.com/SvenGDK/SharpProspero); shadPS4 only logs and returns 0, and no other reference has a body -- [sceAudio3dPortGetStatus](../../../core/libs/prx/libSceAudio3d/Export.cpp) (libSceAudio3d) - throws: the status layout and what it reports are unknown. The signature (a port id and a status pointer) comes from [SharpProspero](https://github.com/SvenGDK/SharpProspero); shadPS4 only logs and returns 0, and no other reference has a body -- [sceAudio3dReportRegisterHandler](../../../core/libs/prx/libSceAudio3d/Export.cpp) (libSceAudio3d) - unknown signature: shadPS4 declares it without arguments and only logs and returns 0; SharpProspero, Orbital's IDA type database and prosper do not declare it -- [sceAudio3dReportUnregisterHandler](../../../core/libs/prx/libSceAudio3d/Export.cpp) (libSceAudio3d) - unknown signature: shadPS4 declares it without arguments and only logs and returns 0; SharpProspero, Orbital's IDA type database and prosper do not declare it +- [sceAudio3dObjectReserve](../../../core/libs/prx/libSceAudio3d/Export.cpp) (libSceAudio3d) - object ids and the `max_objects` limit follow [shadPS4](https://github.com/shadps4-emu/shadPS4) (PS4), the only reference with a body: ids count up from 1 per port, skipping 0, 0xFFFFFFFF and ids in use. In firmware 13.42 AudioOut2 hands out the ids. The checks follow firmware 13.42: the port first, leaving the id untouched, then the pointer, and a failed reserve then writes 0xFFFFFFFF +- [sceAudio3dReportRegisterHandler](../../../core/libs/prx/libSceAudio3d/Export.cpp) (libSceAudio3d) - the 20 call reports reach the type 0 handlers after the call's own lock is released, while firmware 13.42 calls them under its report lock, where a handler that registers or unregisters a handler never returns. Here a report already under way on another thread can still call a handler after `sceAudio3dReportUnregisterHandler` returned, which the console's lock prevents +- [sceAudio3dPortDestroy](../../../core/libs/prx/libSceAudio3d/Export.cpp) (libSceAudio3d) - closes port 0 through `sceAudio3dPortClose`. Firmware 13.42 passes the port's AudioOut2 context number, not the port id, to `sceAudio3dPortClose`, which accepts only 0, so the console closes the port only when that number is 0. The number comes from the audio service and cannot be read from the module; this project's port is context 0 +- [sceAudio3dPortOpen](../../../core/libs/prx/libSceAudio3d/Export.cpp) (libSceAudio3d) - a failed open leaves the open port's settings alone, while firmware 13.42 stores a parameter block of a known size before it checks the user, the values or the open port, so on the console a failed open while a port is open changes the granularity and buffer mode that `sceAudio3dAudioOutOpen`, `sceAudio3dPortAdvance` and `sceAudio3dPortPush` check afterwards +- [sceAudio3dPortOpen, sceAudio3dPortPush, sceAudio3dBedWrite2 and sceAudio3dAudioOutOpen in a PS4 process](../../../core/libs/prx/libSceAudio3d/Export.cpp) (libSceAudio3d) - firmware 13.42 stores `sceKernelIsPs4Process` at `sceAudio3dInitialize` and takes a PS4 branch in these calls. Its answers are followed where this project can give them: buffer mode 0 to 2 and 2 or 3 beds are valid, route 1 is rejected on a 2-bed port, and type 3 with `param` bit 17 is 0x80260007. Buffer modes 0 and 1 and 3 beds throw (not modelled), and so do formats 6 and 7, which the firmware rewrites to 2 and 5 for a PS4 SDK up to 0x3FFFFFF while `sceKernelGetPs4CompiledSdkVersion` throws here. For a PS4 SDK of 0x11000000 or later the firmware also advances the AudioOut2 context after a successful open and after a push that leaves the queue empty, unless `sceAudio3dPortOpenEx` was called; neither advance happens here. Routes 1 and 2 play on both outputs +- [sceAudio3dBedWrite2](../../../core/libs/prx/libSceAudio3d/Export.cpp) (libSceAudio3d) - 24 channels return `INVALID_PARAMETER`, while firmware 13.42 also accepts 24 (besides 2, 6 and 8) and passes the bed to AudioOut2, whose handling of it is unknown - [sceAudio3dCreateSpeakerArray](../../../core/libs/prx/libSceAudio3d/Export.cpp) (libSceAudio3d) - the speaker-array calls return the AudioOut2 result unchanged: the console translates AudioOut2 speaker-array errors into Audio3d codes, but this project's AudioOut2 speaker-array calls throw instead of returning error codes, so there is nothing to translate yet - [Audio3d bed downmix coefficients](../../../core/libs/prx/libSceAudio3d/Mixer.hpp) (libSceAudio3d) - the centre and the surrounds fold into stereo with a 0.7071 gain and the LFE channel is dropped, which follows [shadPS4](https://github.com/shadps4-emu/shadPS4) (PS4): its `DOWNMIX_CENTER` and `DOWNMIX_SURROUND` are 0.7071 and its `DOWNMIX_LFE` is 0, so the `if constexpr` that adds the LFE is compiled out. [prosper](https://github.com/mattias800/prosper) disagrees on the LFE only: it folds it into both sides with a 0.5 gain, in its AudioOut2 main bed path, which is not an Audio3d path. KytyPS5 has no Audio3d mixing at all. The absolute level is unmeasured: fpPS4 scales the front by 1 + 3/sqrt(2) instead of 1 - [Audio3d bed channel order](../../../core/libs/prx/libSceAudio3d/Mixer.hpp) (libSceAudio3d) - the buffer is read as L, R, C, LFE, Ls, Rs, Lrs, Rrs, the standard order, which three references agree on: [shadPS4](https://github.com/shadps4-emu/shadPS4) reads the front, centre, LFE and surround samples at those indices, [prosper](https://github.com/mattias800/prosper) documents FL, FR, FC, LFE and then surround pairs, and fpPS4 names them `_FL=0 _FR=1 _FC=2 _LF=3 _SL=4 _SR=5 _BL=6 _BR=7`. fpPS4's `STD` layout swaps the side and back pairs, which this library does not model -- [sceAudio3dAudioOutOutput](../../../core/libs/prx/libSceAudio3d/Export.cpp) (libSceAudio3d) - the return is the number of frames per channel in the queued block, which follows [KytyPS5](https://github.com/KytyPS5/KytyPS5) and [prosper](https://github.com/mattias800/prosper), whose `sceAudioOutOutput` returns the grain, and this project's own `sceAudioOutOutput`, which returns the port's `samplesNum` (the buffer length in frames). [shadPS4](https://github.com/shadps4-emu/shadPS4) returns the total samples instead (`len * channels`) and fpPS4 returns 0; no console measurement settles it +- [sceAudio3dAudioOutOutput](../../../core/libs/prx/libSceAudio3d/Export.cpp) (libSceAudio3d) - returns 0 as firmware 13.42 does (it hands the block to AudioOut2 and returns its result), but queues the block itself, returns `NOT_READY` when `queue_depth` blocks are pending and accepts only handles opened through `sceAudio3dAudioOutOpen`, while the console accepts any AudioOut handle and leaves the queue to AudioOut2 +- [sceAudio3dAudioOutClose](../../../core/libs/prx/libSceAudio3d/Export.cpp) (libSceAudio3d) - closes only handles opened through `sceAudio3dAudioOutOpen` and returns `INVALID_PORT` for any other, while firmware 13.42 asks libSceAudioOut for the handle's AudioOut2 port and closes every handle that lookup accepts. `sceAudio3dPortClose` leaves these handles open as firmware 13.42 does, but drops their pending blocks, and `sceAudio3dAudioOutOutput` on them returns `INVALID_PORT`, while the console hands the block to AudioOut2, whose result once the port's context is destroyed is unknown - [sceAudio3dPortAdvance buffer mode](../../../core/libs/prx/libSceAudio3d/Export.cpp) (libSceAudio3d) - a mode other than 2 returns `NOT_SUPPORTED` (0x80EA0008), the value [shadPS4](https://github.com/shadps4-emu/shadPS4) uses for it and the one [prosper](https://github.com/mattias800/prosper) reads from the PS5 module's own error table, where 0x80EA0008 is what the per-port calls return for a buffer mode they do not support. shadPS4 and prosper refuse only mode 0 in `sceAudio3dPortAdvance` and modes 0 and 1 in `sceAudio3dPortPush`, while [KytyPS5](https://github.com/KytyPS5/KytyPS5) requires mode 2 at `sceAudio3dPortOpen` and halts otherwise, so this library refuses every other mode at the open and the check here is unreachable. 0x80EA0005 is `OUT_OF_MEMORY`, not `NOT_SUPPORTED` - [sceAudio3dPortAdvance on a full queue](../../../core/libs/prx/libSceAudio3d/Export.cpp) (libSceAudio3d) - a full queue returns `NOT_READY` (0x80EA0007) instead of throwing, which follows [shadPS4](https://github.com/shadps4-emu/shadPS4), the only reference with a body: it returns `ORBIS_AUDIO3D_ERROR_NOT_READY` when the mixed queue is at the port's depth. [KytyPS5](https://github.com/KytyPS5/KytyPS5) halts instead and prosper has no queue at all diff --git a/docs/dev/debt/libSceAudioOut.md b/docs/dev/debt/libSceAudioOut.md index 4134ebe72e..1761fe08e4 100644 --- a/docs/dev/debt/libSceAudioOut.md +++ b/docs/dev/debt/libSceAudioOut.md @@ -1,5 +1,45 @@ # libSceAudioOut technical debt +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceAudioOut/src/InventoryExports.cpp) - 33 import-resolution declarations throw through `NotImplemented_nid_no_patch`; prototypes and behavior are unverified. Both version-labelled images contain these NIDs in module `libSceAudioOut`: six under logical library `libSceAudioOut` and 27 under `libSceAudioOut2`. The labels do not independently authenticate firmware provenance; the NIDs are absent from the pinned public 3.20 catalogue. Identified names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `-3HTIXaIx7U` | +| `Unknown` | `0Oz9yG27ovw` | +| `Unknown` | `1pWftEwJg6w` | +| `Unknown` | `4Ac+2ezx1lY` | +| `Unknown` | `6hw5LpQh6-M` | +| `Unknown` | `87IcZgIbuxQ` | +| `Unknown` | `8qn2ceJ4HVg` | +| `Unknown` | `96EqlBA6q4I` | +| `Unknown` | `B88xqT6vI88` | +| `Unknown` | `DEpjrJh-flc` | +| `Unknown` | `GIcJie+rjvM` | +| `Unknown` | `KeHpCnAvtGw` | +| `Unknown` | `Oqn65W-w8bo` | +| `Unknown` | `PNeVjMfwq1M` | +| `Unknown` | `PSg2qlLNCqM` | +| `Unknown` | `UAk5DtTuUMo` | +| `Unknown` | `WKpJvbBdcbU` | +| `Unknown` | `WOfIge9NmBA` | +| `Unknown` | `YSm2BXd3gfE` | +| `Unknown` | `Zk1Cn7Z2tVs` | +| `Unknown` | `bd5H255vnsk` | +| `Unknown` | `f3xQNbru2m8` | +| `Unknown` | `g33sQzMRRmQ` | +| `Unknown` | `gaUU6uC15vs` | +| `Unknown` | `jEcHKuQ4k8I` | +| `Unknown` | `lyHeaetMYXg` | +| `Unknown` | `r5LqvBxfG+0` | +| `Unknown` | `rSyeebu6wWI` | +| `Unknown` | `rzjbvXzvDtE` | +| `Unknown` | `spvw78DsDzU` | +| `Unknown` | `tqTyWw6NgyU` | +| `Unknown` | `tvPlXmc4MHs` | +| `Unknown` | `yt9g5kdJy1o` | + ### Silent stubs - [sceAudioOut2LoTerminate](../../../core/libs/prx/libSceAudioOut/src/AudioOut2Low.cpp) (libSceAudioOut) - returns 0, as the PS5 13.60 module (0x248d0) does whether or not the low-latency service runs. The module disconnects from the audio server and clears the service tables; here `sceAudioOut2LoInit` starts no service and open contexts and ports are left as they are @@ -28,7 +68,7 @@ | `sceAudioOut2SetSpeakerInfo` | `-Bn3G37Q1qU` | | `sceAudioOut2SetTvCorrectionInfo` | `slskcaPR5u0` | -- [sceAudioOut2ContextAdvance and sceAudioOut2ContextPush](../../../core/libs/prx/libSceAudioOut/src/AudioOut2Context.cpp) (libSceAudioOut) - with an SDL device, Advance snapshots each port's PCM and gain; Push consumes completed grains in order and a blocking Push waits for Advance when none is ready. Inferred from PPSA26358, which rewrites the same 512-frame, 12-channel float buffer on a producer thread and pushes on another thread. In 39 local titles, 66 direct Push calls pass blocking 0 (19), 1 (43), not constant (4). Console buffer ownership, snapshot timing and empty-queue errors are unverified. Completed grains remain queued until Push consumes them, so memory use grows with an unconsumed PCM backlog. The console backlog limit is unverified. A nonblocking Push without a completed grain throws; this is a runtime restriction, not a console measurement. Context destruction concurrent with active calls remains unsupported. Without an SDL device the existing wall-clock path remains. +- [sceAudioOut2ContextAdvance and sceAudioOut2ContextPush](../../../core/libs/prx/libSceAudioOut/src/AudioOut2Context.cpp) (libSceAudioOut) - console buffer ownership, read timing, backlog limit and empty-queue errors are unverified. With an SDL device, Advance completes a grain from each port's PCM and gain: a buffer given by a set plays the copy taken at that set (PPSA02433, Wwise, clears its mix buffers after setting them and before Advance); a repeated buffer is read at Advance (PPSA26358 rewrites one 12-channel buffer in place on a producer thread and pushes on another). Push consumes completed grains in order; a blocking Push waits for Advance, a nonblocking one without a completed grain throws (runtime restriction). In 39 local titles, 66 direct Push calls pass blocking 0 (19), 1 (43), not constant (4). Unconsumed grains stay queued, so memory grows with the backlog. Concurrent context destruction is unsupported. Without an SDL device the wall-clock path remains - [sceAudioOut2UserGetSupportedAttributes](../../../core/libs/prx/libSceAudioOut/src/AudioOut2User.cpp) - the PS5 module confirms a pointer-sized user handle and two optional uint32 outputs. Handles 0/-1 return 0x80268010 before checking outputs; two null outputs return 0x80268001. Host masks still describe only implemented PCM/gain support, unlike native SDK- and device-dependent masks. Unknown or destroyed host handles throw; native arbitrary handles are pointers and cannot be validated by the host registry. Port ownership and busy-user destruction remain unimplemented. - [sceAudioOutExOpen, sceAudioOutExConfigureOutput, sceAudioOutExClose](../../../core/libs/prx/libSceAudioOut/src/AudioOut.cpp) (libSceAudioOut) - the HDMI bitstream calls follow [PS5-Audio-Passthrough-Research](https://github.com/sainsaji/PS5-Audio-Passthrough-Research/blob/cf3c921d79bf00db4847f31b68a7bd95a8037cd7/docs/FINDINGS.md#L31-L80), which disassembles firmware 12.70's libSceAudioOut and logs the calls on a console. `sceAudioOutExOpen(user, mode)` returns `0x80260015` for a mode above 10 or outside mask `0x61F`; otherwise it opens a port of internal type 6 in S16 stereo, 256 frames at 48000 Hz for modes 0, 1, 2 and 9 and 1024 frames at 192000 Hz for modes 3, 4 and 10. `sceAudioOutExConfigureOutput(control, flags, mode, target, option)` returns `0x80268009` when `control` is not 0, takes modes 0 to 10 and 0xFF and targets 1 to 3 and 0xFF, and returned 0 on the console; `sceAudioOutExClose` returned 0. The argument registers match [Jelly5](https://github.com/02dnot/Jelly5/blob/552b866d89b2a58b27f7f7b0484dc743ce235526/app/src/jelly5_bitstream.cpp#L26-L28) and PPSA99051's [bitstream_out.cpp](https://github.com/sainsaji/PS5-Audio-Passthrough-Research/blob/cf3c921d79bf00db4847f31b68a7bd95a8037cd7/sample-app/src/platform/ps5/bitstream_out.cpp#L29-L32). Audio reaches the host through SDL as PCM and the host has no HDMI bitstream output, so an Ex port has no host device: `sceAudioOutOutput` paces it at its own rate and drops its IEC 61937 bursts, and `sceAudioOutExConfigureOutput` changes nothing. Nonzero `flags` or `option`, other modes or targets, `sceAudioOutExClose` of a handle that is not an Ex port, and `sceAudioOutGetPortState` on an Ex port throw, since the console's answers are unknown @@ -39,13 +79,13 @@ - [sceAudioOut2SetSystemDebugState](../../../core/libs/prx/libSceAudioOut/src/AudioOut2System.cpp) (libSceAudioOut) - records the debug state id in the trace and returns 0, as [KytyPS5](https://github.com/KytyPS5/KytyPS5/blob/df5b9b92be7dfd463b47756b707d6d356a9f0550/src/libs/libAudio2.cpp) does; the host has no system mix to apply it to. Id `0x20` with a 4-byte param throws. Not measured on a console - [sceAudioOut2GetSpeakerArrayCoefficients](../../../core/libs/prx/libSceAudioOut/src/AudioOut2SpeakerArray.cpp) (libSceAudioOut) - validates the handle and the coefficient count like the ambisonics call, then writes the front pair at full gain and silence for every other speaker, ignoring the position, spread, height awareness and downmix spread radius: [KytyPS5](https://github.com/KytyPS5/KytyPS5/blob/df5b9b92be7dfd463b47756b707d6d356a9f0550/src/libs/libAudio2.cpp) and [prosper](https://github.com/mattias800/prosper/blob/main/prosper/src/hle/audio/hle_audio.cpp) both return that pair. The console's VBAP gains over the array's directions are not measured - [sceAudioOutSetMixLevelPadSpk](../../../core/libs/prx/libSceAudioOut/src/AudioOut.cpp) (libSceAudioOut) - no source applies the level (shadPS4 only stores it); it is assumed to be a linear gain on the port's own output, and the -9 dB default (11626) is applied to every pad speaker port, including those of titles that never call the function -- [sceAudioOutGetLastOutputTime](../../../core/libs/prx/libSceAudioOut/src/AudioOut.cpp) (libSceAudioOut) - signature and behaviour taken from the [shadPS4](https://github.com/shadps4-emu/shadPS4) and [fpPS4](https://github.com/red-prig/fpPS4) reimplementations of the PS4 library, not confirmed on a PS5 title: the time is the process time at which `sceAudioOutOutput` or `sceAudioOutOutputs` accepted the port's last block, not the time the block reached the device +- [sceAudioOutGetLastOutputTime](../../../core/libs/prx/libSceAudioOut/src/AudioOut.cpp) (libSceAudioOut) - signature and behaviour taken from the [shadPS4](https://github.com/shadps4-emu/shadPS4) and [fpPS4](https://github.com/red-prig/fpPS4) reimplementations of the PS4 library, not confirmed on a PS5 title: the time is the process time at which `sceAudioOutOutput` or `sceAudioOutOutputs` accepted the port's last block, not the time the block reached the device. [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/0614ce324be092791b758d79f93d9f1ca5b10a81/src/core/libraries/audio/audioout.cpp#L183-L187) (PS4) stamps it after its output thread hands the block on and [fpPS4](https://github.com/red-prig/fpPS4/blob/04cefd43e6fddd1ab033e7980cd356d14c964905/src/audio/ps4_libsceaudioout.pas#L695-L804) (PS4) after its blocking device write; AnyPS5 once it has queued the block to a host device or paced a port without one, which can be earlier than both; KytyPS5 (PS5) has no such function - [sceAudioOutGetSystemState](../../../core/libs/prx/libSceAudioOut/src/AudioOut.cpp) (libSceAudioOut) - the 32-byte layout (`float loudness`, 4 reserved bytes, 3 reserved 64-bit words) follows shadPS4's `OrbisAudioOutSystemState` and SharpProspero's `SceAudioOutSystemState` (`Size = 32`); it is not confirmed on a console. Loudness is reported as a constant 0.0f, although SharpProspero documents it in LKFS, so the value is unconfirmed. shadPS4 returns NOT_INIT before `sceAudioOutInit`; that check is not modelled. Imported by PPSA30528, which fails to load without it - [sceAudioOutSysOpen, sceAudioOutSysConfigureOutput, sceAudioOutSysClose](../../../core/libs/prx/libSceAudioOut/src/AudioOut.cpp) (libSceAudioOut) - imported by PPSA99051 and PPSA99997, which fail to load without them; the signatures follow [EVO-PLAYER-PS5](https://github.com/sainsaji/EVO-PLAYER-PS5/blob/da0c0451333bab82e79fffd2de4718e917f9dcb0/projects/evoplayer/core/src/audio/evo_pt.cpp#L24-L29), whose audio code both titles share, and are not confirmed on a console. `sceAudioOutSysOpen(user, mode)` opens a port only for mode 5, the TrueHD MAT route: [the same project's carrier table](https://github.com/sainsaji/EVO-PLAYER-PS5/blob/da0c0451333bab82e79fffd2de4718e917f9dcb0/projects/evoplayer/core/src/audio/iec61937.cpp#L125-L140), read from sceAudioOutExOpen's own tables in firmware 12.70, describes it as a 768 kHz port of 1024 S16 8-channel frames whose 16-byte frames are consumed at 192 kHz; every other mode throws. Audio reaches the host through SDL as PCM and the host has no HDMI bitstream output, so like an Ex port a Sys port has no host device: `sceAudioOutOutput` paces it at its own rate and drops the MAT bursts. `sceAudioOutSysConfigureOutput(type, flags, mode, target, option)` accepts only the observed `(1, 0, 5, 1, 0)` HDMI MAT switch and changes nothing; other arguments throw. `sceAudioOutSysClose` closes a Sys port and throws for any other handle. The restore path EVO-PLAYER-PS5 takes after a Sys port calls `sceAudioOutExConfigureOutput(0, 0, 0xFF, 0xFF, 0)`, so no Sys reset combination is known - [sceAudioOut2PortCreate](../../../core/libs/prx/libSceAudioOut/src/AudioOut2Port.cpp) (libSceAudioOut) - MAIN (type 0) format validation follows PS5 firmware 13.60 measurements: bits 8-11 accept 1, 2, 8 or 12, bits 0-6 accept 0 or 1, bit 7 requires 8 channels, and bits 12-31 do not affect validation. The sample types are still read as float and int16; bit 7's layout, the PCM effect of bits 12-31 and the port `flags` are unverified. Other port types retain unverified format validation, including 6 channels and rejection of bits 12-31. One title (PPSA03355, in its libfmod plugin) disassembled for this entry has three call sites (0xe5faf, 0xe64a3, 0xe6a3b): type 0 with format 0x800 at 48000 Hz and flags 0; type 0x100 with format 0x100 at 48000 Hz and flags 0, after which it compares the result with 0x80268002; and a third that was not read. The first format is within the MAIN ranges above; for type 0x100 the validation is unverified, and what the type means is not shown. - [sceAudioOut2PortCreate](../../../core/libs/prx/libSceAudioOut/src/AudioOut2Port.cpp) (libSceAudioOut) - 12 channels are assumed to be L R C LFE Ls Rs Lb Rb Ltf Rtf Ltb Rtb as in KytyPS5's 12-to-8 fold, and 6 and 8 channels to be its first 6 and 8; no title or SDK header confirms the order - [sceAudioOut2PortCreate](../../../core/libs/prx/libSceAudioOut/src/AudioOut2Port.cpp) (libSceAudioOut) - the stereo fold is assumed, not the console's downmix: C at -3 dB into both sides, Ls/Rs, Lb/Rb and Ltf/Rtf at -3 dB and Ltb/Rtb at -6 dB into their own side, LFE dropped -- [sceAudioOut2PortSetAttributes](../../../core/libs/prx/libSceAudioOut/src/AudioOut2Port.cpp) (libSceAudioOut) - each PCM buffer set (attribute 0) is taken as one grain: buffers set between two pushes are queued and played one per grain, at most 16 queued. A grain with no new buffer repeats the last one only when the port has always been given that same buffer (rewritten in place); a port whose buffers move on plays silence instead. Each set also copies the grain from the buffer: once another port of the context is given the same buffer, the grains already queued with it (and its repeat) play that copy instead of the buffer's later contents, as PPSA08587 fills one buffer and hands it to each of its three ports in turn before advancing. A buffer no other port is given is still read when the grain is pushed. Inferred from PPSA12544, whose object port (type 6) is given one grain of a 64-grain ring per set, often two or three between pushes and then none for a few; the console behaviour for several sets per push and for a push without a new buffer is not documented +- [sceAudioOut2PortSetAttributes](../../../core/libs/prx/libSceAudioOut/src/AudioOut2Port.cpp) (libSceAudioOut) - the console behaviour for several buffer sets (attribute 0) per push and for a push without a new buffer is not documented; this is inferred from titles. Buffers set between pushes are queued and played one per grain, at most 16. A grain without a new buffer repeats the last one only for a port given one buffer once since it was created or cleared with a null buffer (rewritten in place); otherwise it plays silence: PPSA12544 moves through a ring, and PPSA02433 gives each Wwise object port the same buffer every grain but none for ~350 ms while loading, when that memory is reused. Each set also copies the grain; once another port of the context is given the same buffer, the queued grains and the repeat play that copy (PPSA08587 hands one buffer to three ports in turn). Other buffers are read when the grain is pushed - [sceAudioOutOpen](../../../core/libs/prx/libSceAudioOut/src/AudioOut.cpp) (libSceAudioOut) - format error `0x80260007` (`SCE_AUDIO_OUT_ERROR_INVALID_FORMAT`) follows PS4 comparator [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/0614ce324be092791b758d79f93d9f1ca5b10a81/src/core/libraries/audio/audioout.cpp#L283-L287) (`audioout_error.h`), which rejects formats outside `S16Mono` through `Float_8CH_Std`; console behaviour for a format low byte above 7 and for higher bits is unmeasured. Output buffer checks validate total byte count against `INT32_MAX` on virtual ports, and an oversized vibration pad buffer throws. - [Legacy vibration ports](../../../core/libs/prx/libSceAudioOut/src/AudioOut.cpp): PPSA99902's [public input wrapper](https://github.com/Nazky/UnleashedRecomp-Prospero/blob/2ce067a1d51bb58670c7ee4a3aed893c504da805/UnleashedRecomp/hid/driver/sdl_hid.cpp#L316) opens type 10 with 256 stereo S16 or F32 frames at 48000 Hz. Mono duplicates its channel as AudioOut2 does; wider vibration layouts throw. Native controller output uses AudioOut2's four-channel layout, or its six-channel PulseAudio mapping. Without a controller sound card the existing RMS motor transform is applied to segments of at most 256 frames, scheduled by the legacy queue's frame count and rate; drain and close remove only that port's segments. Concurrent sources combine by the maximum per motor, and the pad consumer uses this approximation only for controllers other than DualSense. This host timing and motor model is not a console measurement or waveform reproduction; legacy native output is unmeasured on hardware, and user routing retains the single-controller limitation. AudioOut2 retains its separate 80 ms peak hold. @@ -134,11 +174,14 @@ ### Functional +- [AudioOut2 main output](../../../core/libs/prx/libSceAudioOut/src/AudioOut2Context.cpp) (libSceAudioOut) - a context's main host device is opened once at sceAudioOut2ContextCreate and is not reopened when SDL reports it stopped, so its audio stays silent for the rest of the context's life; only the controller sound card of a context is probed again. The console's behaviour when its output disappears is not measured +- [Host output reopen](../../../core/libs/prx/libSceAudioOut/src/AudioOut.cpp) (libSceAudioOut) - the console's behaviour when a port's output disappears is not measured. Here a port whose host device SDL reports as stopped reopens its default output or controller sound card before its next output, a host policy with no console counterpart. When that reopen fails, the port runs as a virtual port for the rest of its life and is not retried +- [sceAudioOut2ContextPush](../../../core/libs/prx/libSceAudioOut/src/AudioOut2Context.cpp) (libSceAudioOut) - a blocking Push waits for room before it queues its grain and again after, so it returns once fewer grains than the queue depth wait to be played (each wait ends after at most 200 ms, so on a queue that never drains a blocking Push returns after up to 400 ms). Inferred from PPSA02530, whose sound engine pushes one grain per call from a feeder thread and wakes its renderer after each push: while Push returned as soon as the grain was queued, the renderer found the queue full and slept until the next rendered frame. When the console's blocking Push returns is unmeasured. Both waits release the context lock, so destroying a context while a push is waiting on it is not supported. - [sceAudioOutMasteringInit, sceAudioOutMasteringTerm and sceAudioOutMasteringSetParam](../../../core/libs/prx/libSceAudioOut/src/AudioOut2Mastering.cpp) (libSceAudioOut) - non-zero flags, a null pointer and a params id other than 1 throw; a repeated Init, a Term without Init and a SetParam or GetState before Init are unknown. There is no mastering stage, so Init and Term keep no state and SetParam reads only the id. The signatures and the default params id 1 follow [SharpProspero](https://github.com/SvenGDK/SharpProspero/blob/5dfdb4b0b166e83dc9ae275001afb695f12c7174/src/SharpProspero/Interop/Audio/AudioOut.cs#L312-L344), not a console measurement. SharpProspero documents flag bit 0 as `SwapEqCompressor`, and shadPS4's PS4 stub [rejects any non-zero Init flags](https://github.com/shadps4-emu/shadPS4/blob/8d50471b7dc141dd700b51276b8edd1f293bce26/src/core/libraries/audio/audioout.cpp#L956-L962) with 0x80260201 - [sceAudioOutMasteringGetState](../../../core/libs/prx/libSceAudioOut/src/AudioOut2Mastering.cpp) (libSceAudioOut) - the states id 1 and the meter offsets 32, 128, 240, 272 and 304 in a 336-byte struct follow [SharpProspero](https://github.com/SvenGDK/SharpProspero/blob/5dfdb4b0b166e83dc9ae275001afb695f12c7174/src/SharpProspero/Audio/AudioOutMastering.cs#L97-L110), not a console measurement. With no mastering stage it zeroes the compressor input RMS and gain, and the limiter input, output and gain peaks, and leaves the other bytes, including the descriptors the AudioOut2 call writes, untouched; zero is not known to be what the console reports for an idle chain. A null pointer and a states id other than 1 throw; the console error codes are unknown - [sceAudioOut2EnableChat and sceAudioOut2DisableChat](../../../core/libs/prx/libSceAudioOut/src/AudioOut2System.cpp) - both PS5 exports take no arguments, return 0x80268006 before AudioOut2 initialization, and invoke the system chat service with selector 3. A negative service result maps to 0x80268000, otherwise they return zero. The host only records a local enabled flag, without a chat service; repeated-call and no-session behavior therefore still depends on the missing service. - [AudioOut2 contexts](../../../core/libs/prx/libSceAudioOut/src/AudioOut2Context.cpp) (libSceAudioOut) with an SDL device and no `sceAudioOut2ContextAdvance` calls read a grain's port buffers at the next push, at least 100 us after the grain was pushed, and play the mix behind a 40 ms cushion that the queue level leaves out. When the hardware reads the buffers is not known. The timing follows a title whose mixer fills a buffer after pushing it, reuses it two pushes later, and may still be writing it when the next push follows within microseconds. The last grain pushed before a title stops pushing is never read or played. - [AudioOut2 context handles](../../../core/libs/prx/libSceAudioOut/src/AudioOut2Context.cpp) (libSceAudioOut) are the context's host address, checked against the set of live contexts. `AudioOut2FindContext` releases the set's lock before the caller uses the context, so a `sceAudioOut2ContextDestroy` on another thread during a `Push`, `Advance`, `GetQueueLevel`, `SetAttributes` or `sceAudioOut2PortCreate` on the same handle can still free the context under that call. A destroyed handle becomes valid again if a later `sceAudioOut2ContextCreate` gets the same allocation. What the console returns for a reused or concurrently destroyed handle is unknown. - [sceAudioOut2ContextGetQueueLevel](../../../core/libs/prx/libSceAudioOut/src/AudioOut2Context.cpp) (libSceAudioOut) with an SDL device counts the grains that `sceAudioOut2ContextAdvance` completed and no push has consumed as queued, together with the pushed grains beyond the 40 ms cushion, up to `queue_depth`. Whether the console counts them is unknown. Pushes that fill the cushion leave the level at 0, so a title that renders as many grains as the level leaves room for and pushes them on another thread rendered a full queue again after each of those pushes: PPSA23226's Wwise sink passes the available count to the sound engine as the number of frames to render, advances once per frame and pushes on a separate thread, and exceeded 16 completed grains. Counted, the completed grains keep such a title at most `queue_depth` grains ahead of its pushes. -- [sceAudioOut2LoInit, sceAudioOut2LoContext* and sceAudioOut2LoPort* calls](../../../core/libs/prx/libSceAudioOut/src/AudioOut2Low.cpp) (libSceAudioOut) have no low-latency path: each forwards to its `sceAudioOut2` counterpart, so grain and queue depth are the context's `num_grains` and `queue_depth`, and playback keeps the 40 ms cushion. [SharpProspero](https://github.com/SvenGDK/SharpProspero/blob/5dfdb4b0b166e83dc9ae275001afb695f12c7174/src/SharpProspero/Interop/Audio/AudioOut2.cs#L489-L545) only says each call takes the same handles and parameter blocks as its counterpart and drives the low-latency clock with a shallow queue and a small grain ([docs](https://github.com/SvenGDK/SharpProspero/blob/5dfdb4b0b166e83dc9ae275001afb695f12c7174/docs/audio.md#L662-L668)). Unverified: the console's grain and depth limits, its error for a handle of the other service (accepted here) and what `sceAudioOut2LoInit` returns when repeated (0 here). +- [sceAudioOut2LoInit, sceAudioOut2LoContext* and sceAudioOut2LoPort* calls](../../../core/libs/prx/libSceAudioOut/src/AudioOut2Low.cpp) (libSceAudioOut) have no low-latency path: each forwards to its `sceAudioOut2` counterpart (`sceAudioOut2LoInit` only marks initialized), so grain and queue depth are the context's `num_grains` and `queue_depth`, and playback keeps the 40 ms cushion. [SharpProspero](https://github.com/SvenGDK/SharpProspero/blob/5dfdb4b0b166e83dc9ae275001afb695f12c7174/src/SharpProspero/Interop/Audio/AudioOut2.cs#L489-L545) only says each call takes the same handles and parameter blocks as its counterpart and drives the low-latency clock with a shallow queue and a small grain ([docs](https://github.com/SvenGDK/SharpProspero/blob/5dfdb4b0b166e83dc9ae275001afb695f12c7174/docs/audio.md#L662-L668)). Unverified: the console's grain and depth limits, its error for a handle of the other service (accepted here) and what `sceAudioOut2LoInit` returns when repeated (0 here). - [sceAudioOutSysGetHdmiMonitorInfo](../../../core/libs/prx/libSceAudioOut/src/AudioOut.cpp) - native validation requires a non-null buffer and exactly 384 bytes, then accepts types 1 and 16. Mapped pointer/size/type errors are 0x80260004/06/0C. The host still zeroes type 1 output and throws for type 16: native monitor descriptors and system audio settings are unavailable. Driver initialization failures and service errors are not represented. diff --git a/docs/dev/debt/libSceAudioPropagation.md b/docs/dev/debt/libSceAudioPropagation.md index f93a5065b4..ea8ae41614 100644 --- a/docs/dev/debt/libSceAudioPropagation.md +++ b/docs/dev/debt/libSceAudioPropagation.md @@ -1,5 +1,20 @@ # libSceAudioPropagation technical debt +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceAudioPropagation/InventoryExports.cpp) - 8 entries present in both version-labelled images are import-resolution declarations only. Neither label independently authenticates retail firmware provenance. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Data exports require separate layout and ownership analysis. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `sceAudioPropagationSourceQueryAudioPaths` | `yW8FldaufkU` | +| `Unknown` | `TrQMW7ARZXY` | +| `Unknown` | `ZSdiF+pXrF8` | +| `Unknown` | `fOTrQvqzABM` | +| `Unknown` | `fhMkXxnE8aw` | +| `Unknown` | `laU0fM-tTsc` | +| `Unknown` | `mdH4mANi9GI` | +| `Unknown` | `o0gGIp1vd6A` | + ### Silent stubs - [libSceAudioPropagation](../../../core/libs/prx/libSceAudioPropagation/Export.cpp) lacks acoustic propagation: attributes have no effect, sources expose 36 initially empty, invalid path slots and no rays, rendering preserves the destination mix without adding path contributions, and allocated CPU work memory is mostly unused. Ray results and audio paths accept empty lists and throw otherwise; `sceAudioPropagationSourceCalculateAudioPaths` returns the initial native validation errors, then goes through `NotImplemented_nid_no_patch`, as propagation is not implemented. Room, portal, source and material handles are tracked, but destruction after their system is destroyed silently succeeds without native lifetime semantics being confirmed. Occlusion, reflections and reverb are absent. diff --git a/docs/dev/debt/libSceAudiodec.md b/docs/dev/debt/libSceAudiodec.md index af4aaecf4b..b5f8b83ee0 100644 --- a/docs/dev/debt/libSceAudiodec.md +++ b/docs/dev/debt/libSceAudiodec.md @@ -6,11 +6,9 @@ - [sceAudiodecDecode](../../../core/libs/prx/libSceAudiodec/src/Codecs.cpp) (libSceAudiodec) - a raw M4AAC stream carries no channel configuration, so the decoder tries the mono/stereo configuration and then configurations 3 to 7 within `ui_max_channels` until one decodes the first access unit, and keeps that one. No reference documents how the library picks the layout (shadPS4 maps the channel count straight to the configuration; SharpProspero only describes the maximum). With the stereo configuration a mono raw stream decodes as 2 channels, so 2 is reported, not 1 -- [sceAudiodecUnregisterCodec, sceAudiodecGetAjmContext](../../../core/libs/prx/libSceAudiodec/Export.cpp) throw on every call. Their names and NIDs are confirmed defined function exports in the pinned [PS5 13.60 inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/bfec40deb4c47a17d7603ee2bc79aa6862c0c56b/data/firmware-13.60/libsceaudiodec-2dbab67864.jsonl); signatures and behavior remain unknown. Parameterless `int` declarations are import placeholders, not verified prototypes or working implementations. - - [sceAudiodecDecode](../../../core/libs/prx/libSceAudiodec/src/Codecs.cpp) (libSceAudiodec) - the HE-AAC handling follows one console measurement of an HE-AAC v2 ADTS stream: SBR output at 48 kHz in one channel with `ui_enable_heaac` 1, the 24 kHz mono core with 0. Not measured: whether the console, like FFmpeg, decodes a stream without SBR data in its first access unit as AAC-LC with `ui_enable_heaac` 1, and what it reports in `ui_sampling_freq` and `ui_heaac` with `ui_enable_heaac` 0 (here the rate of the returned PCM and 0) ### Functional - [sceAudiodecDecode](../../../core/libs/prx/libSceAudiodec/src/Codecs.cpp) (libSceAudiodec) - an ADTS stream with channel configuration 0 (layout in a program config element) is still parsed by FFmpeg, so `ui_enable_heaac` 0 does not remove its SBR and a mono one with Parametric Stereo comes out as stereo. -- [libSceAudiodec](../../../core/libs/prx/libSceAudiodec/Export.cpp) accepts only 16-bit PCM, and float PCM for ATRAC9 and M4AAC, as `sceAudiodecCreateDecoder` did in a payload process on a PS5 (firmware 13.60), which returned `ERROR_INVALID_WORD_LENGTH` for `iBwPcm` 0, 3 and -1 with each codec and for float with MP3; other word sizes are assumed to fail the same way. ATRAC9 decoding is covered only by configuration and error tests, as no ATRAC9 encoder is available for a fixture. +- [libSceAudiodec](../../../core/libs/prx/libSceAudiodec/Export.cpp) accepts only 16-bit PCM, and float PCM for ATRAC9 and M4AAC, as `sceAudiodecCreateDecoder` did in a payload process on a PS5 (firmware 13.60), which returned `ERROR_INVALID_WORD_LENGTH` for `iBwPcm` 0, 3 and -1 with each codec and for float with MP3; other word sizes are assumed to fail the same way. Separately measured on PS4 (firmware 10.71) for MP3 and M4AAC over `iBwPcm` -1 to 3: MP3 accepts only 16-bit (1), M4AAC accepts 16-bit and float (1 and 2), and every other value returns `ERROR_INVALID_WORD_LENGTH`. ATRAC9's word length is not reached there: with invalid config data the console returns `ERROR_AT9_INVALID_CONFIG_DATA` for every word length, so it validates the config before the word size. This is a PS4 10.71 measurement; the PS5 behaviour for these cases is still the 13.60 one above, not re-confirmed on current PS5 firmware. ATRAC9 decoding is covered only by configuration and error tests, as no ATRAC9 encoder is available for a fixture. diff --git a/docs/dev/debt/libSceAudiodec.native.md b/docs/dev/debt/libSceAudiodec.native.md index 01bc5f3533..b268037461 100644 --- a/docs/dev/debt/libSceAudiodec.native.md +++ b/docs/dev/debt/libSceAudiodec.native.md @@ -3,3 +3,5 @@ ### Unknown function info - [libSceAudiodec.native pending exports](../../../core/libs/prx/libSceAudiodec.native/Export.cpp) - 14 named callable exports are listed in the [PS5 3.20 export table](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceAudiodec.native.c) and were cross-checked against the same module in PS5 firmware 13.60. Their signatures and behaviour are unverified; the declarations use the no-parameter unknown-signature convention and throw through `NotImplemented_nid_no_patch`. +- [sceAudiodecUnregisterCodec](../../../core/libs/prx/libSceAudiodec.native/Export.cpp) (libSceAudiodec.native) - throws on every call. @BunnyFl's [firmware 13.42 run](https://github.com/boykopovar/AnyPS5/issues/13680#issuecomment-6537745276) of `libSceAudiodec.native.sprx` under an emulator with imports stubbed gives `(context, 32-bit type)`, a null context returning `0x807F0002` and an unknown type `0x807F0001`, but every accepted type ends in an Ajm service call whose result it returns. Its parameterless `int` declaration is an import placeholder, not a verified prototype. Only this module exports it on the console, as the [13.60 inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/bfec40deb4c47a17d7603ee2bc79aa6862c0c56b/data/firmware-13.60/libsceaudiodec-2dbab67864.jsonl) and the 13.42 module agree +- [sceAudiodecGetAjmContext](../../../core/libs/prx/libSceAudiodec.native/Export.cpp) (libSceAudiodec.native) - `(context, uint32_t* ajmi, uint32_t* ajm)` from the same [13.42 run](https://github.com/boykopovar/AnyPS5/issues/13680#issuecomment-6537745276), not measured on a console: a null context returns `0x807F0002` and writes nothing, otherwise the two 32-bit ids at offsets 0 and 4 of the context go to the outputs that are not null and the call returns 0, with no lock, no service call and no check that `sceAudiodecInitialize` filled the context. Only this module exports it, so `libSceAudiodec` does not diff --git a/docs/dev/debt/libSceAvPlayer.md b/docs/dev/debt/libSceAvPlayer.md index c911a343f3..312d8c076f 100644 --- a/docs/dev/debt/libSceAvPlayer.md +++ b/docs/dev/debt/libSceAvPlayer.md @@ -18,5 +18,6 @@ ### Functional +- [sceAvPlayerGetStreamInfo / sceAvPlayerGetStreamInfoEx](../../../core/libs/prx/libSceAvPlayer/src/Player.cpp) (libSceAvPlayer) - every player reports audio streams as type 2 (video 1), whether it was made by `sceAvPlayerInit` or by `sceAvPlayerInitEx` of any `this_size`. No module, SDK header or console measurement was used; the rule is inferred from titles. PPSA02433 makes its logo players with `sceAvPlayerInit` and its READY callback (app.elf 0x1509d50) enables type 2 as audio and type 1 as video and ignores other types, so type 0 left the logos silent; the PPSA02508 and PPSA03706 players made with the 0x230-byte `sceAvPlayerInitEx` layout enable type 2 as well. Unverified: whether the console library reports a different value for some init path or SDK version, and the values of other stream types (timed text). No title expecting audio type 0 is known - [sceAvPlayerGetVideoData / sceAvPlayerGetVideoDataEx](../../../core/libs/prx/libSceAvPlayer/src/Source.cpp) (libSceAvPlayer) - delivers a video frame up to 0.75 × frame duration ahead of its timestamp in default sync mode to accommodate presentation loops that poll slightly before the refresh boundary; the console's exact presentation tolerance is unverified. - [sceAvPlayerGetVideoData](../../../core/libs/prx/libSceAvPlayer/src/Source.cpp) (libSceAvPlayer) in sync mode `SCE_AVPLAYER_AV_SYNC_MODE_NONE` skips queued frames that the audio clock has already passed while the title pulls audio, so a title that requests video slower than the film's frame rate keeps the picture with the sound. Whether the console hands out every frame in this mode is unknown. PPSA12544 requests 7-19 frames per second for a 30 fps cinematic diff --git a/docs/dev/debt/libSceAvSetting.md b/docs/dev/debt/libSceAvSetting.md index 137968d8e2..9569bf1845 100644 --- a/docs/dev/debt/libSceAvSetting.md +++ b/docs/dev/debt/libSceAvSetting.md @@ -32,6 +32,43 @@ - [sceAvControlSetMonitorFakeMode](../../../core/libs/prx/libSceAvSetting/Export.cpp) (libSceAvSetting) - unknown signature - [sceAvControlGetCurrentOutputSysMode](../../../core/libs/prx/libSceAvSetting/Export.cpp) (libSceAvSetting) - unknown signature - [sceAvControlGetNativeHdmiMonitorInfo](../../../core/libs/prx/libSceAvSetting/Export.cpp) (libSceAvSetting) - unknown signature +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceAvSetting/Export.cpp) - 28 entries present in both version-labelled images are import-resolution declarations only. None is listed in the pinned public 3.20 catalogue for this library. Neither label independently authenticates retail firmware provenance. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Data exports require separate layout and ownership analysis. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `+QkxEV+rZws` | +| `Unknown` | `0BKuKlQG8zE` | +| `Unknown` | `0mMgouCMXQ4` | +| `Unknown` | `0vwiTglFTz4` | +| `Unknown` | `7kywfNahIbw` | +| `Unknown` | `A143jTEYkNw` | +| `Unknown` | `DtJ45BO7LtY` | +| `Unknown` | `Dxe4ybR-NaM` | +| `Unknown` | `GYAho0we28c` | +| `Unknown` | `Iv3zoMND6xU` | +| `Unknown` | `JUxonNYB9xk` | +| `Unknown` | `JlZQqZOsTMQ` | +| `Unknown` | `MNZaRdvvdU4` | +| `Unknown` | `V-IcK9eokeE` | +| `Unknown` | `bM9VthphLmg` | +| `Unknown` | `bXmd6MGBaNI` | +| `Unknown` | `cANt7oF1VsA` | +| `Unknown` | `cK+dKi9GYYA` | +| `Unknown` | `ftQASJeHi6M` | +| `Unknown` | `kvYuLJa0CyU` | +| `Unknown` | `m1Wi0Yp38v0` | +| `Unknown` | `mp2s52Yr4pc` | +| `Unknown` | `nWFSNYt07Cw` | +| `Unknown` | `nhvN5B5bvyc` | +| `Unknown` | `osJaW+pc9kw` | +| `Unknown` | `s-Egk+i6sAY` | +| `Unknown` | `tIR02KtiDXw` | +| `Unknown` | `xVRs9kzSP7I` | + +### Unknown function info (continued) + - [sceAvControlGetRawMonitorInfo](../../../core/libs/prx/libSceAvSetting/Export.cpp) (libSceAvSetting) - unknown signature - [sceAvControlGetKsvList](../../../core/libs/prx/libSceAvSetting/Export.cpp) (libSceAvSetting) - unknown signature - [sceAvControlGetRawEdid](../../../core/libs/prx/libSceAvSetting/Export.cpp) (libSceAvSetting) - unknown signature diff --git a/docs/dev/debt/libSceAvcap2mvr.md b/docs/dev/debt/libSceAvcap2mvr.md new file mode 100644 index 0000000000..ca1d4510ba --- /dev/null +++ b/docs/dev/debt/libSceAvcap2mvr.md @@ -0,0 +1,23 @@ +# libSceAvcap2mvr technical debt + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceAvcap2mvr/Export.cpp) - 13 entries present in both version-labelled images are import-resolution declarations only. Neither label independently authenticates retail firmware provenance. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +[Version-pinned selected ELF export records](https://gist.github.com/kyon-eth/3fbb1a4a6f95a936b4cd58e9c3d8c50c/5e3af709224ed8235af11337309af0725e5685cb) list every NID below with its image label, decoded export module and library, raw qualified symbol, ELF function type, value and size for each inspected version-labelled image. The extract SHA-256 is `02ab27f12bcd0cc9fa03fa33f55fc201110f0d54a86bbbaa093d55d0a8cf262d`; its full-module sorted-function-NID digests and raw module-parameter words permit independent comparison. This is an analyst-produced metadata record, not independent authentication of the original images or proof of prototypes or behavior. + +| Name | NID | +| --- | --- | +| `Unknown` | `AVuH0FujF30` | +| `Unknown` | `JgAC1LkbWns` | +| `Unknown` | `Kt2IOGEfaFc` | +| `Unknown` | `Mq1MuGlr48g` | +| `Unknown` | `QSLdUawhEhg` | +| `Unknown` | `R5tFB0tMbgY` | +| `Unknown` | `Tjmx+DOF65c` | +| `Unknown` | `ZMR+Q0NYcmU` | +| `Unknown` | `nPlusHmt9NY` | +| `Unknown` | `s7aQGkLitBU` | +| `Unknown` | `sM27f1nWpCc` | +| `Unknown` | `tq-PG8QaNDM` | +| `Unknown` | `u4wtg4AegL8` | diff --git a/docs/dev/debt/libSceBemp2sys.md b/docs/dev/debt/libSceBemp2sys.md index 558e91e63a..e719f90a7b 100644 --- a/docs/dev/debt/libSceBemp2sys.md +++ b/docs/dev/debt/libSceBemp2sys.md @@ -3,3 +3,12 @@ ### Unknown function info - [libSceBemp2sys pending exports](../../../core/libs/prx/libSceBemp2sys/Export.cpp) - 31 named callable exports are listed in the [PS5 3.20 export table](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceBemp2sys.c) and were cross-checked against the same module in PS5 firmware 13.60. Their signatures and behaviour are unverified; the declarations use the no-parameter unknown-signature convention and throw through `NotImplemented_nid_no_patch`. + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceBemp2sys/Export.cpp) - 2 entries observed in the 3.20 export inventory and present in the later 13.60-labelled inventory are import-resolution declarations only. The later inventory label does not authenticate a retail firmware version. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. + +| Name | NID | +| --- | --- | +| `Unknown` | `1L1WwRMiys8` | +| `Unknown` | `B1nK+wb5rME` | diff --git a/docs/dev/debt/libSceBgft.md b/docs/dev/debt/libSceBgft.md index f8e91c27e7..f8123902e2 100644 --- a/docs/dev/debt/libSceBgft.md +++ b/docs/dev/debt/libSceBgft.md @@ -42,3 +42,5 @@ Candidate names marked **aerolib** occur in the [repository-pinned table](https: | `Unknown` | `85axuUkg9eE` | unresolved | `0x480` | 23 | | `Unknown` | `fJnnIc5sHOU` | unresolved | `0x2f0` | 18 | | `Unknown` | `tBOVSvi9EjY` | unresolved | `0x530` | 17 | + +- [Older callable NIDs](../../../core/libs/prx/libSceBgft/Export.cpp): 2 unidentified exports have unverified names, signatures and behavior. These are throwing import-resolution placeholders; no functionality is implemented. No matching NIDs were found in the later module inventory. diff --git a/docs/dev/debt/libSceBgsStorage.md b/docs/dev/debt/libSceBgsStorage.md new file mode 100644 index 0000000000..45193dde5d --- /dev/null +++ b/docs/dev/debt/libSceBgsStorage.md @@ -0,0 +1,15 @@ +# libSceBgsStorage technical debt + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceBgsStorage/Export.cpp) - 5 entries present in both version-labelled images are import-resolution declarations only. Neither label independently authenticates retail firmware provenance. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Data exports require separate layout and ownership analysis. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `BauWWA9gkBc` | +| `Unknown` | `JK67MBtUF5A` | +| `Unknown` | `PQqTvPT8G2E` | +| `Unknown` | `kS74ICPn0MQ` | +| `Unknown` | `mTm6O2Zjiak` | + +- [Older callable NIDs](../../../core/libs/prx/libSceBgsStorage/Export.cpp): 12 unidentified exports have unverified names, signatures and behavior. These are throwing import-resolution placeholders; no functionality is implemented. No matching NIDs were found in the later module inventory. diff --git a/docs/dev/debt/libSceCamera.md b/docs/dev/debt/libSceCamera.md index 9c2c1abd89..12df0e604c 100644 --- a/docs/dev/debt/libSceCamera.md +++ b/docs/dev/debt/libSceCamera.md @@ -90,3 +90,13 @@ - [sceCamera2SetAutoExposureGain](../../../core/libs/prx/libSceCamera/Export.cpp) (libSceCamera, NID `vx9MQYicBVQ`) - listed in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceCamera.c); signature and behavior are unverified, so this parameterless declaration is for import resolution only and throws through `NotImplemented_nid_no_patch` - [sceCameraIsConfigChangeDone](../../../core/libs/prx/libSceCamera/Export.cpp) (libSceCamera, NID `wQfd7kfRZvo`) - listed in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceCamera.c); signature and behavior are unverified, so this parameterless declaration is for import resolution only and throws through `NotImplemented_nid_no_patch` - [sceCameraSetVideoSync](../../../core/libs/prx/libSceCamera/Export.cpp) (libSceCamera, NID `wpeyFwJ+UEI`) - listed in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceCamera.c); signature and behavior are unverified, so this parameterless declaration is for import resolution only and throws through `NotImplemented_nid_no_patch` + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceCamera/InventoryExports.cpp) - 3 entries observed in the 3.20 export inventory and present in the later 13.60-labelled inventory are import-resolution declarations only. The later inventory label does not authenticate a retail firmware version. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Data exports require separate layout and ownership analysis. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `AnqFx-nAxZM` | +| `Unknown` | `azeU8qML4VM` | +| `Unknown` | `kgRnfleNYNo` | diff --git a/docs/dev/debt/libSceCdlgAdIdClient.md b/docs/dev/debt/libSceCdlgAdIdClient.md new file mode 100644 index 0000000000..689c278f55 --- /dev/null +++ b/docs/dev/debt/libSceCdlgAdIdClient.md @@ -0,0 +1,5 @@ +# libSceCdlgAdIdClient technical debt + +### Unknown function info + +- [7 exports (7 without a known name, bound by NID)](../../../core/libs/prx/libSceCdlgAdIdClient/Export.cpp) (libSceCdlgAdIdClient) - every function export of `libSceCdlgAdIdClient.sprx` from the firmware 13.60 export table, names from aerolib.csv only where `tools/nid_names.py` `compute_nid` reproduces the NID. Signatures, parameter layouts and behaviour are unknown; every export throws through `NotImplemented_nid_no_patch` diff --git a/docs/dev/debt/libSceCdlgUtilServer.md b/docs/dev/debt/libSceCdlgUtilServer.md index c6a2a8990a..ccff940e1c 100644 --- a/docs/dev/debt/libSceCdlgUtilServer.md +++ b/docs/dev/debt/libSceCdlgUtilServer.md @@ -5,3 +5,42 @@ - [_ZN3sce16CommonDialogUtil6Server13setFinishDataEPvm, _ZN3sce16CommonDialogUtil6Server6setRunEPvm, _ZN3sce16CommonDialogUtil6Server9setFinishEv, _ZN3sce16CommonDialogUtil6Server9setResultEi, _ZN3sce16CommonDialogUtil6ServerC2EPKcmmis](../../../core/libs/prx/libSceCdlgUtilServer/Export.cpp) - names and NIDs match the [PS5 3.20 inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceCdlgUtilServer.c); signatures and behavior are unverified. No-parameter declarations resolve imports and throw through `NotImplemented_nid_no_patch` when called. - [_ZN3sce16CommonDialogUtil6ServerD0Ev, _ZN3sce16CommonDialogUtil6ServerD1Ev, _ZN3sce16CommonDialogUtil6ServerD2Ev, _ZNK3sce16CommonDialogUtil6Server10getVersionERj, _ZNK3sce16CommonDialogUtil6Server10isCloseReqEv](../../../core/libs/prx/libSceCdlgUtilServer/Export.cpp) - names and NIDs match the [PS5 3.20 inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceCdlgUtilServer.c); signatures and behavior are unverified. No-parameter declarations resolve imports and throw through `NotImplemented_nid_no_patch` when called. - [_ZNK3sce16CommonDialogUtil6Server14getServerStateEv](../../../core/libs/prx/libSceCdlgUtilServer/Export.cpp) - names and NIDs match the [PS5 3.20 inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceCdlgUtilServer.c); signatures and behavior are unverified. No-parameter declarations resolve imports and throw through `NotImplemented_nid_no_patch` when called. + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceCdlgUtilServer/Export.cpp) - 32 entries present in both version-labelled images are import-resolution declarations only. None is listed in the pinned public 3.20 catalogue for this library. Neither label independently authenticates retail firmware provenance. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unknown names use literal NID aliases. One data export is outside this callable inventory and requires separate layout and ownership analysis. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `1IzIqsh2lVE` | +| `Unknown` | `2pswOa0ZQoQ` | +| `Unknown` | `33zrWSbHxcI` | +| `Unknown` | `56KPLy5Uc-w` | +| `Unknown` | `CK-7W3zhCjk` | +| `Unknown` | `Dv1KWHTwGeM` | +| `Unknown` | `KaTogANOP6U` | +| `Unknown` | `MQDTRLwdnrU` | +| `Unknown` | `NKhtpQTUjpY` | +| `Unknown` | `Pl1B1+pzwLM` | +| `Unknown` | `RiJYtG8H1Yk` | +| `Unknown` | `VMUTkgazl40` | +| `Unknown` | `VrN0lR+BJyc` | +| `Unknown` | `W4zcizD4i3I` | +| `Unknown` | `WlSxsADNweU` | +| `Unknown` | `YNi5ipH59bE` | +| `Unknown` | `ZRy0WQp2COs` | +| `Unknown` | `aFrwE9W9faU` | +| `Unknown` | `aX1ZGnOo9vg` | +| `Unknown` | `aztojjv0xT0` | +| `Unknown` | `dQte4n-nQlg` | +| `Unknown` | `e3l9WkmIjyw` | +| `Unknown` | `ht7qLD4xIAU` | +| `Unknown` | `j6vGxXgVnCQ` | +| `Unknown` | `k9wR+1LoaoU` | +| `Unknown` | `lhSjnuF2bzg` | +| `Unknown` | `mCWvwveN2gM` | +| `Unknown` | `qFygU3yA0HE` | +| `Unknown` | `ucY3L5rXqjs` | +| `Unknown` | `vfUweaM01gw` | +| `Unknown` | `yPspG9QpJK4` | +| `Unknown` | `zjj3moy7KpM` | diff --git a/docs/dev/debt/libSceCffMgr.md b/docs/dev/debt/libSceCffMgr.md new file mode 100644 index 0000000000..30fec26968 --- /dev/null +++ b/docs/dev/debt/libSceCffMgr.md @@ -0,0 +1,5 @@ +# libSceCffMgr technical debt + +### Unknown function info + +- [14 exports (7 without a known name, bound by NID)](../../../core/libs/prx/libSceCffMgr/Export.cpp) (libSceCffMgr) - every function export of `libSceCffMgr.sprx` from the firmware 13.60 export table, names from aerolib.csv only where `tools/nid_names.py` `compute_nid` reproduces the NID. Signatures, parameter layouts and behaviour are unknown; every export throws through `NotImplemented_nid_no_patch` diff --git a/docs/dev/debt/libSceCommonDialog.md b/docs/dev/debt/libSceCommonDialog.md index 3cd9ebcc15..43d2199a17 100644 --- a/docs/dev/debt/libSceCommonDialog.md +++ b/docs/dev/debt/libSceCommonDialog.md @@ -1,5 +1,24 @@ # libSceCommonDialog technical debt +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceCommonDialog/AdditionalExports.cpp) - 12 entries present in both version-labelled images are import-resolution declarations only. Neither label independently authenticates retail firmware provenance. These NIDs are absent from the pinned public 3.20 catalogue. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Data exports require separate layout and ownership analysis. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `8q7icGBWIrA` | +| `Unknown` | `D-V35OhFeIM` | +| `Unknown` | `QXFsLON5QWw` | +| `Unknown` | `SDpCfY9uB0g` | +| `Unknown` | `Zaa6fhiKQDE` | +| `Unknown` | `aUS4PgJye98` | +| `Unknown` | `afLdI6i0lQw` | +| `Unknown` | `mVRnPerBcK0` | +| `Unknown` | `p9TTq4bLdFU` | +| `Unknown` | `q3-8WWCG2N0` | +| `Unknown` | `txNJzxX6yrA` | +| `Unknown` | `yxjgDvqUbGQ` | + ### Silent stubs - [libSceCommonDialog](../../../core/libs/prx/libSceCommonDialog/Export.cpp) diff --git a/docs/dev/debt/libSceContentSearch.md b/docs/dev/debt/libSceContentSearch.md index ccb59cc6a2..8051fd4b39 100644 --- a/docs/dev/debt/libSceContentSearch.md +++ b/docs/dev/debt/libSceContentSearch.md @@ -17,3 +17,12 @@ - [Content queries](../../../core/libs/prx/libSceContentSearch/Export.cpp) use an empty host library and always report update id 0; the console's initial update id is unverified. No content rows are produced. Every title is assumed to have search permission. Nested filter/sort validation is incomplete: empty nested column sets, null filter values and unknown enum values throw. Guest heap allocation and the platform-dependent minimum heap size are unimplemented. Initialization and outer pointer/count/limit validation follow the supplied module. - [Metadata access](../../../core/libs/prx/libSceContentSearch/Export.cpp) cannot open metadata by path or content id because missing-content errors remain unresolved: past their argument checks, both opening calls go through `NotImplemented_nid_no_patch`. No metadata handles are issued. The field-info and value queries reject invalid outer pointers, then go through `NotImplemented_nid_no_patch`, as no metadata id is ever opened and the console's error for one depends on the requested field; closing an unopened handle returns the confirmed invalid-argument error. + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceContentSearch/Export.cpp) - 2 entries observed in the 3.20 export inventory and present in the later 13.60-labelled inventory are import-resolution declarations only. The later inventory label does not authenticate a retail firmware version. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Data exports require separate layout and ownership analysis. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `Np8cEpyDFRE` | +| `Unknown` | `X9e+hZfue0U` | diff --git a/docs/dev/debt/libSceCustomMusicCore.md b/docs/dev/debt/libSceCustomMusicCore.md index 9ffaf08475..76736e3964 100644 --- a/docs/dev/debt/libSceCustomMusicCore.md +++ b/docs/dev/debt/libSceCustomMusicCore.md @@ -3,3 +3,5 @@ ### Unknown function info - [sceCustomMusicCoreBgmClose, sceCustomMusicCoreBgmOpen, sceCustomMusicCoreBgmOpen2, sceCustomMusicCoreBgmOutput, sceCustomMusicCoreBgmSetAudioVolume, sceCustomMusicCoreBgmStart, sceCustomMusicCoreBgmStop, sceCustomMusicCoreGetBgmAuthorityStatus, sceCustomMusicCoreGetHdcpStatus, sceCustomMusicCoreGetSystemAudioVolume, sceCustomMusicCorePostEvent, sceCustomMusicCoreSendEvent, sceCustomMusicCoreSendMulticastEvent, sceCustomMusicCoreSendSpMessage, sceCustomMusicCoreSetSystemAudioVolume, sceCustomMusicCoreStartOperation, sceCustomMusicCoreStartOperation2 and sceCustomMusicCoreStopOperation](../../../core/libs/prx/libSceCustomMusicCore/Export.cpp) (libSceCustomMusicCore) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceCustomMusicCore.c), but no credible prototypes were found. The declarations have no parameters solely to resolve known imports; this is not an ABI claim and callers must not call them until signatures are verified + +- [Older callable NIDs](../../../core/libs/prx/libSceCustomMusicCore/Export.cpp): 11 unidentified exports have unverified names, signatures and behavior. These are throwing import-resolution placeholders; no functionality is implemented. No matching NIDs were found in the later module inventory. diff --git a/docs/dev/debt/libSceCustomMusicPlayReady4.md b/docs/dev/debt/libSceCustomMusicPlayReady4.md new file mode 100644 index 0000000000..23ea10e415 --- /dev/null +++ b/docs/dev/debt/libSceCustomMusicPlayReady4.md @@ -0,0 +1,5 @@ +# libSceCustomMusicPlayReady4 technical debt + +### Functional + +- [Callable exports](../../../core/libs/prx/libSceCustomMusicPlayReady4/Export.cpp): 82 unidentified exports have unverified names, signatures and behavior. These are throwing import-resolution placeholders; no playback functionality is implemented. No matching NIDs were found in the later module inventory. Data exports require separate layout and ownership analysis. diff --git a/docs/dev/debt/libSceDataTransfer.md b/docs/dev/debt/libSceDataTransfer.md index 73f63f47d6..7cd330b315 100644 --- a/docs/dev/debt/libSceDataTransfer.md +++ b/docs/dev/debt/libSceDataTransfer.md @@ -7,3 +7,4 @@ - [sceDataTransferRequestAuthPS5, sceDataTransferRequestCalcTransferSizePS4, sceDataTransferRequestCalcTransferSizePS5, sceDataTransferRequestEndFgTransfer, sceDataTransferRequestEndFgTransferPS5, sceDataTransferRequestGetDeviceInfoPS4, sceDataTransferRequestGetPS4Info](../../../core/libs/prx/libSceDataTransfer/Export.cpp) have unknown signatures and behaviour. The parameterless `int` declarations are import-resolution placeholders, not confirmed ABI signatures, and throw through `NotImplemented_nid_no_patch`. Only the names and NIDs are established by the [13.60 export inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/bfec40deb4c47a17d7603ee2bc79aa6862c0c56b/data/firmware-13.60/libscedatatransfer-ca1b6655ff.jsonl). - [sceDataTransferRequestGetPS5Info, sceDataTransferRequestLaunchPS5, sceDataTransferRequestPrepareFgTransferPS5, sceDataTransferRequestRebootAuthPS5, sceDataTransferRequestSearchPS5, sceDataTransferRequestStartFgTransferPS5, sceDataTransferRequestTransferTimePS5](../../../core/libs/prx/libSceDataTransfer/Export.cpp) have unknown signatures and behaviour. The parameterless `int` declarations are import-resolution placeholders, not confirmed ABI signatures, and throw through `NotImplemented_nid_no_patch`. Only the names and NIDs are established by the [13.60 export inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/bfec40deb4c47a17d7603ee2bc79aa6862c0c56b/data/firmware-13.60/libscedatatransfer-ca1b6655ff.jsonl). - [sceDataTransferAbortFgTransfer, sceDataTransferAbortRequest, sceDataTransferAbortSearchPS4, sceDataTransferCheckBgTransferRunning, sceDataTransferGetFgTransferProgress, sceDataTransferGetPrepareFgTransferProgress, sceDataTransferInitialize, sceDataTransferRequestGetAppInfoPS4, sceDataTransferRequestGetSavedataInfoPS4, sceDataTransferRequestGetUsersPS4, sceDataTransferRequestLaunchPS4, sceDataTransferRequestPrepareFgTransfer, sceDataTransferRequestRebootAuthPS4, sceDataTransferRequestSearchPS4, sceDataTransferRequestStartFgTransfer, sceDataTransferRequestTransferTimePS4, sceDataTransferTargetAbortBindSavedata, sceDataTransferTargetAbortDeactivate, sceDataTransferTargetAbortEth0, sceDataTransferTargetAbortGetDeviceInfo, sceDataTransferTargetAbortGetDeviceInfoApplication, sceDataTransferTargetAbortGetTitles, sceDataTransferTargetAbortGetUsers, sceDataTransferTargetAbortLaunch, sceDataTransferTargetAbortPrepareTransfer, sceDataTransferTargetAbortPwrReq, sceDataTransferTargetAbortReboot, sceDataTransferTargetAbortSendSsoNew2Old, sceDataTransferTargetAbortSendSsoOld2New, sceDataTransferTargetAbortTransfer, sceDataTransferTargetAbortTransferSpeed, sceDataTransferTargetEventIsAuthReady, sceDataTransferTargetEventIsIPv6Ready, sceDataTransferTargetEventIsPwrReqReady, sceDataTransferTargetGetFailedUsers, sceDataTransferTargetGetRebootData, sceDataTransferTargetGetTransferProgress, sceDataTransferTargetRequestAbortSearch, sceDataTransferTargetRequestActivate, sceDataTransferTargetRequestAuth, sceDataTransferTargetRequestBindSavedata, sceDataTransferTargetRequestComplete, sceDataTransferTargetRequestCreateRebootData, sceDataTransferTargetRequestDeactivate, sceDataTransferTargetRequestEndTransfer, sceDataTransferTargetRequestGetDeviceInfo, sceDataTransferTargetRequestGetDeviceInfoApplication, sceDataTransferTargetRequestGetTitles, sceDataTransferTargetRequestGetUsers, sceDataTransferTargetRequestLaunch, sceDataTransferTargetRequestPrepareTransfer, sceDataTransferTargetRequestPrepareTransferProgress, sceDataTransferTargetRequestPwrReq, sceDataTransferTargetRequestReboot, sceDataTransferTargetRequestSearch, sceDataTransferTargetRequestSendSsoNew2Old, sceDataTransferTargetRequestSendSsoOld2New, sceDataTransferTargetRequestStartTransfer, sceDataTransferTargetRequestTransferSpeed and sceDataTransferTerminate](../../../core/libs/prx/libSceDataTransfer/Export.cpp) (libSceDataTransfer) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceDataTransfer.c), but no credible prototypes were found. The declarations have no parameters solely to resolve known imports; this is not an ABI claim and callers must not call them until signatures are verified +- [sceDataTransferEventIsAuthReady and sceDataTransferEventIsPwrReqReady](../../../core/libs/prx/libSceDataTransfer/Export.cpp) have unknown signatures and behaviour. The parameterless `int` declarations are import-resolution placeholders, not confirmed ABI signatures, and throw through `NotImplemented_nid_no_patch`. Only the names and NIDs are established (NID database entries; the names hash to `YxCpG1l-iMA` and `p+EwF-lg9Lc`). diff --git a/docs/dev/debt/libSceDepth.md b/docs/dev/debt/libSceDepth.md index 9a67891d10..1ddfa68482 100644 --- a/docs/dev/debt/libSceDepth.md +++ b/docs/dev/debt/libSceDepth.md @@ -2,6 +2,8 @@ ### Unknown function info +- [Depth export `unL9sWu4IIw`](../../../core/libs/prx/libSceDepth/Export.cpp) is a function record with qualifier `G#A` in older and later version-labelled modules. In both, dynamic metadata maps library ID 6 and module ID 0 to `libSceDepth`. The older module-parameter words are `0x08540001` and `0x03200004`; the later words are `0x13590001` and `0x13600007`. Both have the same 39 function NIDs, whose sorted-LF SHA-256 is `a56e046304aaf76b3193f5b4fc0a57c4660bff9b05255e51149891461c23becc`, using the [static ELF membership procedure](https://github.com/boykopovar/AnyPS5/pull/12367#issuecomment-6470603298). Version labels are not authenticated retail provenance, and the digest identifies the NID set, not the binary or ABI. The export name, signature and behavior are unverified; this declaration throws. + - [_sceDepthCalcHeteroAdjustParam, _sceDepthHeadCandidateTrackerGetInformation, _sceDepthHeadCandidateTrackerSetInformation, _sceDepthSetCameraFactoryCalibrationData, _sceDepthSetHeteroAdjustParam, _sceDepthSetHeteroMode](../../../core/libs/prx/libSceDepth/Export.cpp) (libSceDepth) - signatures and behavior are unverified; these parameterless declarations only resolve imports and throw through `NotImplemented_nid_no_patch`. - [libSceDepth pending exports](../../../core/libs/prx/libSceDepth/Export.cpp) - 32 named callable exports are listed in the [PS5 3.20 export table](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceDepth.c) and were cross-checked against the same module in PS5 firmware 13.60. Their signatures and behaviour are unverified; the declarations use the no-parameter unknown-signature convention and throw through `NotImplemented_nid_no_patch`. diff --git a/docs/dev/debt/libSceDepth2.md b/docs/dev/debt/libSceDepth2.md index ee4e1f9b5c..568f0d9d90 100644 --- a/docs/dev/debt/libSceDepth2.md +++ b/docs/dev/debt/libSceDepth2.md @@ -1,5 +1,10 @@ # libSceDepth2 technical debt +### Additional callable exports + +- [Depth2 export `tLM3AwtzaHs`](../../../core/libs/prx/libSceDepth2/Export.cpp) is a function record with qualifier `L#A` in older and later version-labelled modules. In both, dynamic metadata maps library ID 11 and module ID 0 to `libSceDepth2`. The older module-parameter words are `0x08540001` and `0x03200004`; the later words are `0x13590001` and `0x13600007`. Both have the same 11 function NIDs, whose sorted-LF SHA-256 is `72ab095808199bf39edf98a41b28470660ca1db537e1cfb7be251b4e9d405a98`, using the [static ELF membership procedure](https://github.com/boykopovar/AnyPS5/pull/12367#issuecomment-6470603298). Version labels are not authenticated retail provenance, and the digest identifies the NID set, not the binary or ABI. The export name, signature and behavior are unverified; this declaration throws. + + ### Unknown function info - [libSceDepth2 pending exports](../../../core/libs/prx/libSceDepth2/Export.cpp) - 10 named callable exports are listed in the [PS5 3.20 export table](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceDepth2.c) and were cross-checked against the same module in PS5 firmware 13.60. Their signatures and behaviour are unverified; the declarations use the no-parameter unknown-signature convention and throw through `NotImplemented_nid_no_patch`. diff --git a/docs/dev/debt/libSceDiscMap.md b/docs/dev/debt/libSceDiscMap.md index b058be4747..604eeb0732 100644 --- a/docs/dev/debt/libSceDiscMap.md +++ b/docs/dev/debt/libSceDiscMap.md @@ -7,3 +7,12 @@ ### Unknown function info - [sceDiscMapGetPackageSize](../../../core/libs/prx/libSceDiscMap/Export.cpp) (libSceDiscMap) - its name and NID are in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceDiscMap.c); the `(int64_t, int*, int*)` prototype follows [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/f68923fe807f657348e6719ce658bcbd0a2b1c72/src/core/libraries/disc_map/disc_map.cpp#L12), is not measured on a console, and every call throws + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceDiscMap/Export.cpp) - 2 entries observed in the 3.20 export inventory and present in the later 13.60-labelled inventory are import-resolution declarations only. The later inventory label does not authenticate a retail firmware version. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Data exports require separate layout and ownership analysis. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `5+vOlukvkfg` | +| `Unknown` | `fJgP+wqifno` | diff --git a/docs/dev/debt/libSceFlexContent.md b/docs/dev/debt/libSceFlexContent.md new file mode 100644 index 0000000000..9f7fdbf225 --- /dev/null +++ b/docs/dev/debt/libSceFlexContent.md @@ -0,0 +1,5 @@ +# libSceFlexContent technical debt + +### Unknown function info + +- [12 exports (5 without a known name, bound by NID)](../../../core/libs/prx/libSceFlexContent/Export.cpp) (libSceFlexContent) - every function export of `libSceFlexContent.sprx` from the firmware 13.60 export table, names from aerolib.csv only where `tools/nid_names.py` `compute_nid` reproduces the NID. Signatures, parameter layouts and behaviour are unknown; every export throws through `NotImplemented_nid_no_patch` diff --git a/docs/dev/debt/libSceFont.md b/docs/dev/debt/libSceFont.md index 56afebbafa..91b0dfc3a3 100644 --- a/docs/dev/debt/libSceFont.md +++ b/docs/dev/debt/libSceFont.md @@ -34,7 +34,7 @@ The 44 additional exports below have unknown signatures and behavior. Their para - [sceFontGraphicsDrawupFillTextureImageObject, sceFontGraphicsDrawupFillTexturePatternObject](../../../core/libs/prx/libSceFont/src/Unimplemented.cpp) (libSceFont) - still throwing. The original [4.03 and PPSA20397 recovery report](https://github.com/boykopovar/AnyPS5/pull/11012) identifies their NIDs as `CfkpBe2CqBQ` and `FL0unhGcFvI`, and their 4.03 `libSceFont.sprx` bodies as 670 and 871 bytes; the author [checked those NIDs in a local 4.03 dump](https://github.com/boykopovar/AnyPS5/pull/11012#issuecomment-6403420327). The signature `(graphicsObject, fillObject, mode, out, x, y, w, h)` with an `int` error return follows that report's firmware-body analysis and the PPSA20397 `libSceFontGsm.prx` caller. The body's own validation path: `out` is zeroed up front, the graphics object is checked for magic word `0xf53` at +0 and stores the error at +4 (`0x80460084` null object, `0x80460002` invalid arguments, `0x80460001` no renderer, `0x8046005c` unbound buffer, `0x804600a2` empty pool). The reported caller passes the embedded object at `graphicsObject+0x28`, the mode byte at `+0xf`, and its own `out`/rect arguments verbatim after checking `[graphics+0xd]==0x58`, `[graphics+0x38]==1` and the rect against a float bound. Exact 4.03 function offsets and PPSA20397 caller addresses were not included in that report, so this evidence cannot yet be independently reproduced from the published material. Separately, an [attributed 13.42 report](https://github.com/boykopovar/AnyPS5/pull/11012#issuecomment-6403475148) places these NIDs at `0x22260` and `0x22530` in a different build with 706- and 824-byte bodies; those are **not** 4.03 offsets. On valid input the 4.03 body reportedly takes the renderer's record pool (`graphicsObject+8` -> `+8` -> `+0x160`), allocates a 0x40+0x80 drawup record (command byte 0x40, then the rect floats and mode), enqueues it into the object's record list (+0x28/+0x30 with used/maximum counters at +0x10/+0x14) and returns it through `out`. Implementing it needs the `sceFontGraphics` drawup pipeline it feeds - the record pool, the dequeueing objects and the ~40 sibling `sceFontGraphics*` exports - all of which are stubbed, so a standalone producer would report success for work nothing consumes -- [sceFontDefineAttribute, sceFontGetAttribute](../../../core/libs/prx/libSceFont/src/Style.cpp), [sceFontGlyphDefineAttribute, sceFontGlyphGetAttribute](../../../core/libs/prx/libSceFont/src/Render.cpp) (libSceFont) - the signatures `(handle, int attribute, int* oldAttribute)` and `(handle, int attribute, int* nowAttribute)`, and the same shape for a glyph, follow the [SharpProspero](https://github.com/SvenGDK/SharpProspero/blob/main/src/SharpProspero/Interop/Font/SceFont.Engine.cs) bindings, matching the IDA type database of [Orbital](https://github.com/AlexAltea/orbital/blob/master/tools/ida/db_types.json) and [KytyPS5](https://github.com/KytyPS5/KytyPS5/blob/d2413fc2ebd91d1b7234197c2dd5bd48e1cb6a51/src/libs/libFont.cpp#L1249-L1264), not confirmed on a title. Every handle and every glyph keeps one attribute, an opaque int whose meaning and valid values are unknown: define stores the new value and returns the previous one, and get returns the stored value with its `attribute` argument unused, as in KytyPS5. An attribute never set is 0. The null checks and the invalid-object errors follow the other libSceFont functions and diverge from [KytyPS5](https://github.com/KytyPS5/KytyPS5/blob/d2413fc2ebd91d1b7234197c2dd5bd48e1cb6a51/src/libs/libFont.cpp#L1251-L1265), which returns `OK` for a null handle or glyph after writing 0 to the old-attribute pointer: every other handle and glyph entry point in this library reports the invalid object instead, and a title that passes one is already failing. shadPS4 leaves both exports unimplemented, so there is no second implementation to compare. PPSA01325 calls the glyph define with 0x11 on a glyph from `sceFontGenerateCharGlyph` that it deletes unused and draws with `sceFontRenderCharGlyphImageHorizontal`; the three bindings all read the third argument as an out pointer, not a value, so this call sets the glyph's attribute to 0x11. The attribute changes neither shaping nor rendering. +- [sceFontDefineAttribute, sceFontGetAttribute](../../../core/libs/prx/libSceFont/src/Style.cpp), [sceFontGlyphDefineAttribute, sceFontGlyphGetAttribute](../../../core/libs/prx/libSceFont/src/Render.cpp) (libSceFont) - the signatures `(handle, int attribute, int* oldAttribute)` and `(handle, int attribute, int* nowAttribute)`, and the same shape for a glyph, follow the [SharpProspero](https://github.com/SvenGDK/SharpProspero/blob/main/src/SharpProspero/Interop/Font/SceFont.Engine.cs) bindings, matching the IDA type database of [Orbital](https://github.com/AlexAltea/orbital/blob/master/tools/ida/db_types.json) and [KytyPS5](https://github.com/KytyPS5/KytyPS5/blob/d2413fc2ebd91d1b7234197c2dd5bd48e1cb6a51/src/libs/libFont.cpp#L1249-L1264), not confirmed on a title. Every handle keeps one attribute, an opaque int whose meaning and valid values are unknown: define stores the new value and returns the previous one, and get returns the stored value with its `attribute` argument unused, as in KytyPS5. An attribute never set is 0. A glyph keeps one bit instead: its define accepts only 0x10 and 0x11, returning `SCE_FONT_ERROR_INVALID_PARAMETER` for any other value, stores the value and returns the previous 0x10 or 0x11, which is 0x10 when never set; its get returns 0x10 or 0x11 and ignores its `attribute` argument. The null checks and the invalid-object errors follow the other libSceFont functions and diverge from [KytyPS5](https://github.com/KytyPS5/KytyPS5/blob/d2413fc2ebd91d1b7234197c2dd5bd48e1cb6a51/src/libs/libFont.cpp#L1251-L1265), which returns `OK` for a null handle or glyph after writing 0 to the old-attribute pointer: every other handle and glyph entry point in this library reports the invalid object instead, and a title that passes one is already failing. shadPS4 leaves both exports unimplemented, so there is no second implementation to compare. PPSA01325 calls the glyph define with 0x11 on a glyph from `sceFontGenerateCharGlyph` that it deletes unused and draws with `sceFontRenderCharGlyphImageHorizontal`; the three bindings all read the third argument as an out pointer, not a value, so this call sets the glyph's attribute to 0x11. The attribute changes neither shaping nor rendering. - [sceFontGlyphRenderImage, sceFontGlyphRenderImageHorizontal, sceFontGlyphRenderImageVertical](../../../core/libs/prx/libSceFont/src/Render.cpp) (libSceFont) - follow firmware 13.42's module as BunnyFl ran it natively ([comment](https://github.com/boykopovar/AnyPS5/pull/10892#issuecomment-6415399922); one font, 'A', one pixel format, not a console): the glyph's character is drawn as `sceFontRenderCharGlyphImage` and its directional forms draw it, at the glyph's generation scale; the surface's style frame wins over the argument, and a frame that sets no scale keeps that scale. A valid `sceFontGlyphRenderImageVertical` call, and `sceFontGlyphRenderImage` on a vertical font, throw: the module reports advance and stride 40/40 there where the char call gives 90/90 at 40 px, and one case doesn't name the rule. A pointer that isn't a renderer, and `SCE_FONT_ERROR_INVALID_FONT_HANDLE` for a closed owner font, are not measured - [sceFontRebindRenderer](../../../core/libs/prx/libSceFont/src/Open.cpp): follows the shadPS4 port and its return codes are unmeasured: `SCE_FONT_ERROR_INVALID_FONT_HANDLE` for a null handle or a block with a zero handle magic, `SCE_FONT_ERROR_NOT_BOUND_RENDERER` for a font without a renderer, `SCE_FONT_ERROR_FATAL` for a renderer with a wrong magic, and `SCE_FONT_OK` on a bound font, repeated calls included. The `guest_font_rebind_renderer` test pins the invalid handle, unbound and bound cases; the wrong-magic case is not covered. diff --git a/docs/dev/debt/libSceFontGs.md b/docs/dev/debt/libSceFontGs.md new file mode 100644 index 0000000000..5405d4e1ad --- /dev/null +++ b/docs/dev/debt/libSceFontGs.md @@ -0,0 +1,5 @@ +# libSceFontGs technical debt + +### Unknown function info + +- [`sceFontGraphicsGnmSurfaceInit`, `sceFontSelectGraphicsGnm` and four unnamed exports](../../../core/libs/prx/libSceFontGs/Export.cpp) (libSceFontGs) - parameter lists, return types and behaviour are unverified, so every entry throws through `NotImplemented_nid_no_patch`; the parameterless `int` declarations only resolve imports. The [PS5 13.60 export inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/226383a7fa4b1275d6cebf61eb1c1e7ca7b58bcb/data/firmware-13.60/libscefontgs-b42f55c1c1.jsonl) names two of them and lists `DI4LrTUrD04`, `NtbMKwRg6qg`, `UsBLoyXsQZs` and `uksHKVEsxu4` without names; the pinned [module map](https://github.com/boykopovar/ps5-nid-map/blob/cc1d586fddab576a520f226da6b2632b031e6d09/data/Modules/libSceFontGs.inc) assigns all six to `libSceFontGs`. The six exports shared with `libSceFontGs.native` are left to that library. diff --git a/docs/dev/debt/libSceFontGs.native.md b/docs/dev/debt/libSceFontGs.native.md new file mode 100644 index 0000000000..8fafc9ce1c --- /dev/null +++ b/docs/dev/debt/libSceFontGs.native.md @@ -0,0 +1,5 @@ +# libSceFontGs.native technical debt + +### Unknown function info + +- [6 exports](../../../core/libs/prx/libSceFontGs.native/Export.cpp) (libSceFontGs.native) - every function export of `libSceFontGs.native.sprx` from the firmware 13.60 export table, names from aerolib.csv only where `tools/nid_names.py` `compute_nid` reproduces the NID. Signatures, parameter layouts and behaviour are unknown; every export throws through `NotImplemented_nid_no_patch` diff --git a/docs/dev/debt/libSceFreeTypeOt.md b/docs/dev/debt/libSceFreeTypeOt.md index 880f53c69e..8de27f976e 100644 --- a/docs/dev/debt/libSceFreeTypeOt.md +++ b/docs/dev/debt/libSceFreeTypeOt.md @@ -1,7 +1,7 @@ # libSceFreeTypeOt technical debt - The FT_Outline_Get_Orientation, FT_Request_Size, FT_Sin, FT_Tan, FT_Vector_Unit, FT_New_Size, FT_Outline_Copy, FT_Outline_Decompose, FT_Stroker_New, FT_Stroker_Done, FT_Stroker_GetCounts, FT_Stroker_BeginSubPath, FT_Stroker_LineTo, FT_Stroker_EndSubPath, FT_Stroker_Set, FT_Stroker_Rewind, FT_Stroker_GetBorderCounts, FT_Stroker_ConicTo and FT_Stroker_CubicTo NIDs in [Export.cpp](../../../core/libs/prx/libSceFreeTypeOt/Export.cpp) are identified, but their provider-specific prototypes and behavior remain unverified. Their named helpers retain the explicit inventory aliases and throw; the separate libSceFreeType implementations do not supply this provider. -- The 75 `sceFreeTypeOtUnknown_*_nid_no_patch` exports in [Export.cpp](../../../core/libs/prx/libSceFreeTypeOt/Export.cpp) are present in the PS5 3.20 export inventory from [PS5-3.20_Libs](https://github.com/DNNDHH/PS5-3.20_Libs). Their prototypes and behavior are unverified. Each uses the no-parameter import-resolution convention and throws through `NotImplemented_nid_no_patch`; these declarations make no ABI or behavior claim. +- The 73 `sceFreeTypeOtUnknown_*_nid_no_patch` exports in [Export.cpp](../../../core/libs/prx/libSceFreeTypeOt/Export.cpp) are present in the PS5 3.20 export inventory from [PS5-3.20_Libs](https://github.com/DNNDHH/PS5-3.20_Libs). Their prototypes and behavior are unverified. Each uses the no-parameter import-resolution convention and throws through `NotImplemented_nid_no_patch`; these declarations make no ABI or behavior claim. ### Unknown function info - [FT_Outline_GetInsideBorder, FT_Outline_GetOutsideBorder](../../../core/libs/prx/libSceFreeTypeOt/CMakeLists.txt) (libSceFreeTypeOl, libSceFreeTypeOt) - console prototypes, enum/layout equivalence, FreeType configuration and module/library versions are unverified. The existing LP64 outline layout and unsigned 16-bit counts follow bundled FreeType 2.13.3; border selection follows [ftstroke.c](https://github.com/freetype/freetype/blob/42608f77f20749dd6ddc9e0536788eaad70ea4b5/src/base/ftstroke.c), with the shifted polygon area from [ftoutln.c](https://github.com/freetype/freetype/blob/42608f77f20749dd6ddc9e0536788eaad70ea4b5/src/base/ftoutln.c) accumulated in 64 bits. Null positive-count arrays and out-of-range or non-increasing contour endpoints throw when reached; their console behavior is unknown. Tags and flags are not read, and input arrays remain caller-owned. @@ -14,4 +14,6 @@ - [FT_MulDiv_No_Round, FT_Matrix_Multiply_Scaled, FT_Vector_Transform_Scaled, ft_highpow2](../../../core/libs/prx/libSceFreeTypeOt/Export.cpp) (libSceFreeTypeOt) - console prototypes and the FT_LONG64 build option are unverified. FT_Property_Set and ft_highpow2 date this FreeType to 2.4.11-2.5.3, whose stock [ftconfig.h](https://github.com/freetype/freetype/blob/cecf93ef90c660a8b0b45e5adbbfb5ea443fb6b9/include/freetype/config/ftconfig.h#L289-L306) drops FT_LONG64 under `__STDC__` and compiles the 32-bit [FT_MulDiv](https://github.com/freetype/freetype/blob/cecf93ef90c660a8b0b45e5adbbfb5ea443fb6b9/src/base/ftcalc.c#L411-L479). Inputs where that build, the FT_LONG64 build and bundled 2.13.3 can differ throw without writing: an operand above 0x7FFFFFFF in magnitude, a zero divisor with a zero factor, or a quotient above 0xFFFFFFFF. The scaled calls divide each term by 0x10000 * scaling, so |scaling| > 32767 throws; a null matrix or vector is a no-op unless that product overflows. +- [FT_SqrtFixed, FT_Sqrt32](../../../core/libs/prx/libSceFreeTypeOt/Export.cpp) (libSceFreeTypeOt) - the exports carry the NIDs of these FreeType names; console prototypes and FreeType version equivalence are unverified. `FT_Property_Set` and `FT_Sqrt32` (`FT_CONFIG_OPTION_OLD_INTERNALS`, removed in 2.5.0) narrow this FreeType to 2.4.11-2.4.12 [ftcalc.c](https://github.com/freetype/freetype/blob/cecf93ef90c660a8b0b45e5adbbfb5ea443fb6b9/src/base/ftcalc.c#L155-L186). Both take and return 32-bit `FT_Int32` regardless of `FT_LONG64`: [FT_SqrtFixed](https://github.com/freetype/freetype/blob/cecf93ef90c660a8b0b45e5adbbfb5ea443fb6b9/src/base/ftcalc.c#L855-L885) returns 0 for non-positive inputs and floors `sqrt(x << 16)` for positive `x` (unlike the unsigned rounding `FT_SqrtFixed` in bundled 2.13.3), and `FT_Sqrt32` floors the square root of `x` cast to `FT_UInt32`. + - [ft_mem_alloc, ft_mem_qalloc, ft_mem_realloc, ft_mem_qrealloc, ft_mem_free, ft_mem_dup, ft_mem_strdup, ft_mem_strcpyn](../../../core/libs/prx/libSceFreeTypeOt/src/Memory.cpp) (libSceFreeTypeOt) - the exports carry the NIDs of these FreeType names; console prototypes and FreeType version equivalence are unverified. The LP64 signatures, the guest `FT_MemoryRec` callbacks and the error codes (Invalid_Argument 0x06, Array_Too_Large 0x0A, Out_Of_Memory 0x40) follow FreeType 2.4.12 [ftutil.c](https://github.com/freetype/freetype/blob/cecf93ef90c660a8b0b45e5adbbfb5ea443fb6b9/src/base/ftutil.c#L49-L221). Bundled FreeType 2.13.3 differs only in `ft_mem_qrealloc` from a count of 0, which it does not zero. As in a release build, `ft_mem_qrealloc` does not check the `FT_ASSERT` that a block with no current items is null. The current byte size passed to `realloc` wraps where the source's signed product would overflow. diff --git a/docs/dev/debt/libSceGLSlimVSH.md b/docs/dev/debt/libSceGLSlimVSH.md index cd3f01db42..bbfcbe020d 100644 --- a/docs/dev/debt/libSceGLSlimVSH.md +++ b/docs/dev/debt/libSceGLSlimVSH.md @@ -3,3 +3,31 @@ ### Unknown function info - The 22 known-name imports in [Export.cpp](../../../core/libs/prx/libSceGLSlimVSH/Export.cpp) are listed in the PS5 3.20 [export inventory](https://github.com/DNNDHH/PS5-3.20_Libs). Their exact prototypes and behavior are unverified; each uses a no-parameter throwing import-resolution placeholder. + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceGLSlimVSH/Export.cpp) - 7 callable NIDs match the [public 3.20 catalogue](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceGLSlimVSH.c) and the [selected export metadata](https://gist.github.com/kyon-eth/e1b845e2be0047e065a7dbb2c2e92322/7a180a59bf97bf6ea42020d4eedf9a8d631b0fd3) from two version-labelled images (SHA-256 `5d1eb4913d2914be044c05a48c4287a3a73e526605f21ec37ce9acfb5b2170ad`). The labels are not authenticated. Prototypes and behavior are unverified; these declarations throw through `NotImplemented_nid_no_patch` and implement no runtime functionality. + +| Name | NID | +| --- | --- | +| `sceSlimglCompositorSetInvisibleCanvasCommand` | `DN8v2xNOyjg` | +| `sceSlimglCompositorSetMemoryCommand` | `aswH9c+RN0E` | +| `sceSlimglCompositorSetPostEventCommand` | `WvuRaahcTfA` | +| `sceSlimglCompositorWaitEndOfRendering` | `lcaik1AxwEY` | +| `sceSlimglCompositorWaitPostEvent` | `HwBlC8TLKHQ` | +| `sceSlimglIPCEnd` | `Fa0atOcWPaI` | +| `sceSlimglIPCSetup` | `F4pQ5tsDo74` | + +### Additional unidentified exports + +- Seven [callable exports](../../../core/libs/prx/libSceGLSlimVSH/Export.cpp) are declared as throwing placeholders. Their names, signatures and behavior are unverified. The same module and library identities occur in two version-labelled images; those labels are not authenticated. + +| Name | NID | +| --- | --- | +| `Unknown` | `9iW854bwvmc` | +| `Unknown` | `DVNKmWX1jOU` | +| `Unknown` | `JjyNMbSAgLk` | +| `Unknown` | `LLDLZ-mQK+Q` | +| `Unknown` | `Yf0LATiXPsg` | +| `Unknown` | `ZLvm5korFRA` | +| `Unknown` | `qSuVNKHENqs` | diff --git a/docs/dev/debt/libSceGic.md b/docs/dev/debt/libSceGic.md index c7b8a71c3e..1dde8cf32d 100644 --- a/docs/dev/debt/libSceGic.md +++ b/docs/dev/debt/libSceGic.md @@ -2,4 +2,4 @@ ### Unknown function info -- [ and sceGicGetValue](../../../core/libs/prx/libSceGic/Export.cpp) (libSceGic) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceGic.c), but no credible prototypes were found. The declarations have no parameters solely to resolve known imports; this is not an ABI claim and callers must not call them until signatures are verified +- [sceGicGetValue](../../../core/libs/prx/libSceGic/Export.cpp) (libSceGic) - the name and NID are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceGic.c), but no credible prototypes were found. The declarations have no parameters solely to resolve known imports; this is not an ABI claim and callers must not call them until signatures are verified diff --git a/docs/dev/debt/libSceGifParser.md b/docs/dev/debt/libSceGifParser.md new file mode 100644 index 0000000000..f6faf762de --- /dev/null +++ b/docs/dev/debt/libSceGifParser.md @@ -0,0 +1,5 @@ +# libSceGifParser technical debt + +### Callable exports + +- [Callable exports](../../../core/libs/prx/libSceGifParser/Export.cpp) - Seven 3.20 callable NIDs are import-resolution declarations only. One NID also appears in the 13.60-labelled inventory; other NIDs differ across versions. Their signatures and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. No runtime functionality is implemented. Data exports require separate layout and ownership analysis. diff --git a/docs/dev/debt/libSceGnmDriverForNeoMode.md b/docs/dev/debt/libSceGnmDriverForNeoMode.md index 8aa80f9741..d38b5f9ac6 100644 --- a/docs/dev/debt/libSceGnmDriverForNeoMode.md +++ b/docs/dev/debt/libSceGnmDriverForNeoMode.md @@ -2,15 +2,20 @@ ### Unknown function info -- [sceGnmDingDongForWorkload, sceGnmDrawInitToDefaultContextStateInternalCommand, sceGnmRegisterOwner](../../../core/libs/prx/libSceGnmDriverForNeoMode/Export.cpp) - the first two throw through `NotImplemented_nid_no_patch` and `sceGnmRegisterOwner` returns `Failure` (0x8EEE00FF) without registering anything; behaviour and the PS5 prototypes are unmeasured. The only source of the parameter lists is shadPS4's PS4-derived prototypes (GPLv2, used as a reference only), with no second reference; structure pointers are `void*` because no layout is known. +- [sceGnmDingDongForWorkload, sceGnmRegisterOwner](../../../core/libs/prx/libSceGnmDriverForNeoMode/Export.cpp) - the first throws through `NotImplemented_nid_no_patch` and `sceGnmRegisterOwner` returns `Failure` (0x8EEE00FF) without registering anything; behaviour and the PS5 prototypes are unmeasured. The only source of the parameter lists is shadPS4's PS4-derived prototypes (GPLv2, used as a reference only), with no second reference; structure pointers are `void*` because no layout is known. - [libSceGnmDriverForNeoMode pending exports](../../../core/libs/prx/libSceGnmDriverForNeoMode/Export.cpp) - 34 named callable exports are listed in the [PS5 3.20 export table](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceGnmDriverForNeoMode.c) and were cross-checked against the same module in PS5 firmware 13.60. Their signatures and behaviour are unverified; the declarations use the no-parameter unknown-signature convention and throw through `NotImplemented_nid_no_patch`. ### Functional - [retail-only answers](../../../core/libs/prx/libSceGnmDriverForNeoMode/Export.cpp) (libSceGnmDriverForNeoMode) - the debug resets, the resource and owner registration calls, the SDMA calls and the SQ counter calls return `0x8EEE00FF`, the five `sceGnmDriverInternalRetrieveGnmInterface*` calls return `0x80000000`, `sceGnmGetDbgGcHandle` returns -1, `sceGnmDriverTraceInProgress` and `sceGnmValidateOnSubmitEnabled` return 0 and the other validation calls return `0x80D13FFF`. These are the values [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/a808e76/src/core/libraries/gnmdriver/gnmdriver.cpp) returns for calls it marks as not available in retail firmware; they are not measured on a console, and the arguments are not read - [default state packets](../../../core/libs/prx/libSceGnmDriverForNeoMode/Export.cpp) (libSceGnmDriverForNeoMode) - `sceGnmDrawInitDefaultHardwareState`, `sceGnmDrawInitDefaultHardwareState200`, `sceGnmDrawInitDefaultHardwareState350`, `sceGnmDrawInitToDefaultContextState` and `sceGnmDrawInitToDefaultContextState400` write the sequences in [InitSequences.hpp](../../../core/libs/prx/libSceGnmDriverForNeoMode/include/InitSequences.hpp), taken from [shadPS4's gnmdriver_init.h](https://github.com/shadps4-emu/shadPS4/blob/a808e76/src/core/libraries/gnmdriver/gnmdriver_init.h): its Neo sequences, except the plain hardware state, which shadPS4 also writes unchanged in Neo mode. The size checks and returned sizes are shadPS4's. Not compared with console output, and nothing in AnyPS5 consumes a GNM command buffer yet +- [sceGnmDrawInitToDefaultContextStateInternalCommand](../../../core/libs/prx/libSceGnmDriverForNeoMode/Export.cpp) (libSceGnmDriverForNeoMode) - answers as `sceGnmDrawInitToDefaultContextState` when the compiled SDK version in the process parameters is below 0x04000000 and as `sceGnmDrawInitToDefaultContextState400` from it, as firmware 13.42's module does, run natively with its imports stubbed, not on a console. The module reads the version at init through `sceKernelGetCompiledSdkVersion`. From 0x04000000 its result and output equal `...State400` for every size tried ([run](https://github.com/boykopovar/AnyPS5/pull/10701#issuecomment-6403613914)). Below it, size 0x20 writes 19 words byte-identical to the module's own `sceGnmDrawInitToDefaultContextState`, from a copy of that sequence, and other sizes write nothing ([@BunnyFl's comparison](https://github.com/boykopovar/AnyPS5/pull/13712#issuecomment-6543609746)). The version is read at each call here, not cached at init - [draw, dispatch, wait and VGT packets](../../../core/libs/prx/libSceGnmDriverForNeoMode/Export.cpp) (libSceGnmDriverForNeoMode) - the signatures, size checks, PM4 words and refusals (-1) of the 17 command writers follow [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/a808e76/src/core/libraries/gnmdriver/gnmdriver.cpp) on its Neo-mode path, since this module is the Neo-mode driver: draw initiators keep flag bits 29 to 31, and `sceGnmSetVgtControl` and `sceGnmResetVgtControl` write `IA_MULTI_VGT_PARAM` through `SET_UCONFIG_REG` (shadPS4's `UseNeoCompatSequences` is false). The packets are not compared with console output, and nothing in AnyPS5 consumes a GNM command buffer yet - [embedded shaders](../../../core/libs/prx/libSceGnmDriverForNeoMode/Export.cpp) (libSceGnmDriverForNeoMode) - `sceGnmSetEmbeddedVsShader` (id 0, a fullscreen triangle) and `sceGnmSetEmbeddedPsShader` (id 0 writes black, id 1 exports depth only) write the register packets of [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/a808e76/src/core/libraries/gnmdriver/gnmdriver.cpp), pointing at the shader code in [EmbeddedShaders.hpp](../../../core/libs/prx/libSceGnmDriverForNeoMode/include/EmbeddedShaders.hpp) in this module's memory instead of the console's `0xfe000f00` area. That code is shadPS4's instruction listing assembled with LLVM 19 `llvm-mc -arch=amdgcn -mcpu=bonaire`, without the binary header and register block that follow it on the console, since nothing here reads them; another id returns `0x8EEE00FF`. The size and modifier arguments are not checked, as in shadPS4. Not compared with console output, and nothing in AnyPS5 consumes a GNM command buffer yet - [shader register packets](../../../core/libs/prx/libSceGnmDriverForNeoMode/Export.cpp) (libSceGnmDriverForNeoMode) - `sceGnmUpdateVsShader`, `sceGnmUpdatePsShader`, `sceGnmUpdatePsShader350`, `sceGnmSetPsShader350`, `sceGnmUpdateGsShader`, `sceGnmUpdateHsShader` and `sceGnmSetCsShaderWithModifier` write the packets, size checks and -1 refusals of [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/a808e76/src/core/libraries/gnmdriver/gnmdriver.cpp); the update forms carry context registers inside NOP packets as there. Not compared with console output, and nothing in AnyPS5 consumes a GNM command buffer yet - [workloads](../../../core/libs/prx/libSceGnmDriverForNeoMode/Export.cpp) (libSceGnmDriverForNeoMode) - `sceGnmCreateWorkloadStream`, `sceGnmBeginWorkload` and `sceGnmEndWorkload` return shadPS4's values (3 for a null output or name, 1 for a stream above 15, 2 for workload 0 or one with a top byte above 15) and keep no state; not measured on a console - [sceGnmGetGpuCoreClockFrequency](../../../core/libs/prx/libSceGnmDriverForNeoMode/Export.cpp) (libSceGnmDriverForNeoMode) - returns 911 MHz, shadPS4's Neo-mode value, which it derives from Neo mode instead of the console's ioctl. `sceGnmGetOffChipTessellationBufferSize` returns shadPS4's `0x800000` + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceGnmDriverForNeoMode/Export.cpp) - 20 callable NIDs are present in both version-labelled images. Both images also export these NIDs from the distinct normal Gnm provider; matching NIDs do not establish behavioral equivalence. Future declarations or implementations in that provider require loader analysis. Image labels are not authenticated. Names, signatures and behavior are unverified; each declaration throws. diff --git a/docs/dev/debt/libSceGvMp4Parser.md b/docs/dev/debt/libSceGvMp4Parser.md index 0c189f5ba0..d1ac649c3b 100644 --- a/docs/dev/debt/libSceGvMp4Parser.md +++ b/docs/dev/debt/libSceGvMp4Parser.md @@ -4,3 +4,9 @@ - [_ZN23sceMetadataReaderWriter11gvMp4Parser19gvMp4ParserFinalizeEv, _ZN23sceMetadataReaderWriter11gvMp4Parser21gvMp4ParserInitializeEv, _ZN23sceMetadataReaderWriter11gvMp4Parser23gvMp4ParserReadMetadataERKSsRKNS_8MetadataERS3_, _ZN23sceMetadataReaderWriter11gvMp4Parser24gvMp4ParserWriteMetadataERKSsRKNS_8MetadataE, _ZN23sceMetadataReaderWriter11gvMp4Parser27gvMp4ParserExtractThumbnailERKSsRNS_9ThumbnailE](../../../core/libs/prx/libSceGvMp4Parser/Export.cpp) - names and NIDs match the [PS5 3.20 inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceGvMp4Parser.c); signatures and behavior are unverified. No-parameter declarations resolve imports and throw through `NotImplemented_nid_no_patch` when called. - [_ZN23sceMetadataReaderWriter11gvMp4Parser21gvMp4ParserInitializeEv, _ZN23sceMetadataReaderWriter11gvMp4Parser23gvMp4ParserReadMetadataERKSsRKNS_8MetadataERS3_, _ZN23sceMetadataReaderWriter11gvMp4Parser24gvMp4ParserWriteMetadataERKSsRKNS_8MetadataE, _ZN23sceMetadataReaderWriter11gvMp4Parser27gvMp4ParserExtractThumbnailERKSsRNS_9ThumbnailE](../../../core/libs/prx/libSceGvMp4Parser/Export.cpp) - not exported by any firmware 13.42 module, so on 13.42 an import of these NIDs resolves to nothing in the firmware; the 3.20 declarations remain for titles built against older firmware. Measured as a payload process on a device: `dlsym` on the `dlopen` handle of `libSceGvMp4Parser.sprx` returns null for each of these names, while `gvMp4ParserFinalize` resolves. + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceGvMp4Parser/Export.cpp) - 16 NIDs have callable entries in a 3.20-labelled image and in a later 13.60-labelled image under a different module and library identity. Image labels are not independently authenticated. Names, parameter lists, return types, behavior and cross-version equivalence are unverified. The parameterless `int` declarations are placeholders and every entry throws. + +- [Older callable NIDs](../../../core/libs/prx/libSceGvMp4Parser/Export.cpp): 3 unidentified exports have unverified names, signatures and behavior. These are throwing import-resolution placeholders; no functionality is implemented. No matching NIDs were found in the later module inventory. diff --git a/docs/dev/debt/libSceHmd2.md b/docs/dev/debt/libSceHmd2.md index ea4e8ceaaf..c453ebbed2 100644 --- a/docs/dev/debt/libSceHmd2.md +++ b/docs/dev/debt/libSceHmd2.md @@ -1,5 +1,23 @@ # libSceHmd2 technical debt +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceHmd2/InventoryExports.cpp) - 11 entries present in both version-labelled images are import-resolution declarations only. Neither label independently authenticates retail firmware provenance. These NIDs are absent from the pinned public 3.20 catalogue. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Data exports require separate layout and ownership analysis. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `7Qwh+itD9r4` | +| `Unknown` | `Ec6R1zHrEmA` | +| `Unknown` | `FBUEhH9tQ1A` | +| `Unknown` | `GLtAhJ6E2io` | +| `Unknown` | `Ijl+flgyR7Q` | +| `Unknown` | `PcdNgERzCos` | +| `Unknown` | `UbHtTtGRplE` | +| `Unknown` | `dvGkONYMdJg` | +| `Unknown` | `fY41qRGCvTM` | +| `Unknown` | `n9wYmNVt6S4` | +| `Unknown` | `wDDAIxOeaqg` | + ### Silent stubs - [libSceHmd2](../../../core/libs/prx/libSceHmd2/Export.cpp) has no PS VR2 runtime: Initialize returns unsupported-feature, so normal calls never reach initialized device behavior. Reprojection and gaze operations retain their throwing bodies. Four size/alignment queries return measured constants; QueryBufferSizeAlign still throws. Device setup, headset tracking and rendering are not implemented. @@ -28,6 +46,7 @@ - [sceHmd2InternalSetVibrationMode](../../../core/libs/prx/libSceHmd2/Export.cpp) (libSceHmd2) - unknown signature - [sceHmd2InternalGetVr2dData](../../../core/libs/prx/libSceHmd2/Export.cpp) (libSceHmd2) - unknown signature - [sceHmd2InternalImageCloseBySlot](../../../core/libs/prx/libSceHmd2/Export.cpp) (libSceHmd2) - unknown signature +- [sceHmd2Unknown_CBkVZi9WhVo_nid_no_patch](../../../core/libs/prx/libSceHmd2/Export.cpp) (libSceHmd2) - NID `CBkVZi9WhVo` of the `libSceHmd2ReprojectionMotionVector` sub-library, listed as a function export in the [13.60 inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/990ca8e56aa1d294857af66ade24d552d18d5945/data/firmware-13.60/libscehmd2reprojectionmotionvector-a3712ce199.jsonl) with no name or signature. It throws through `NotImplemented_nid_no_patch` and exists only so a title that imports it, such as [My First Gran Turismo](https://github.com/boykopovar/AnyPS5/discussions/13466), can load. Before `sceHmd2Initialize` the console [answered](https://github.com/boykopovar/AnyPS5/pull/7798#issuecomment-6262489180) 0 with every argument null but `0x8a720009` with every argument pointing at zeroed memory, so its checks are not known ### Functional @@ -85,3 +104,5 @@ - [libSceHmd2 reprojection exports](../../../core/libs/prx/libSceHmd2/Export.cpp) - frame identifiers and predicted display times are 64-bit. Event setters accept a kernel event queue and 32-bit event ID, consumed by sceKernelTriggerUserEvent. Mirroring uses two memory pointers and a separate 32-byte mode/reserved option. Status and current-output queries write 104 and 32 bytes; those field layouts and the reprojection initialization fields remain incomplete. Positional-reprojection mode is a byte with values 0 through 5, not a boolean. - [Reprojection parameter submission](../../../core/libs/prx/libSceHmd2/Export.cpp) - SetParam and SetParamWithBuffer take a 32-bit buffer-set ID, 64-bit frame ID, parameter pointer and reserved register slot. The parameter contains a layer pointer, signed count and optional 128-byte flags/reserved structure; plain and buffered layer strides are 328 and 472 bytes. Layer union fields remain incomplete. SetRenderConfig consumes three 64-bit slots; only bits 0 and 32 of the first can be nonzero. SetParam and SetParamWithBuffer remain unimplemented. + +- [Older callable NIDs](../../../core/libs/prx/libSceHmd2/Export.cpp): 7 unidentified exports have unverified names, signatures and behavior. These are throwing import-resolution placeholders; no functionality is implemented. No matching NIDs were found in the later module inventory. diff --git a/docs/dev/debt/libSceHttp2.md b/docs/dev/debt/libSceHttp2.md index 600830fa6e..07a548a382 100644 --- a/docs/dev/debt/libSceHttp2.md +++ b/docs/dev/debt/libSceHttp2.md @@ -30,9 +30,11 @@ - [libSceHttp2 transport](../../../core/libs/prx/libSceHttp2/Transport.cpp) - only synchronous HTTPS requests with version 3 and ALPN `h2` are supported. HTTP/1.x, cleartext HTTP/2, negotiation fallback, connection reuse, multiplexing across requests, CONNECT, response trailers, automatic redirects and authentication challenges throw. Version values, method strings, header overwrite/append modes, status/read/content-length signatures and timeout units follow [SharpProspero](https://github.com/SvenGDK/SharpProspero/blob/5dfdb4b0b166e83dc9ae275001afb695f12c7174/src/SharpProspero/Interop/Net/Http2.cs); wire framing and negotiation follow [RFC 9113 sections 3, 5, 6 and 8](https://www.rfc-editor.org/rfc/rfc9113.html). [prosper](https://github.com/mattias800/prosper/blob/b1bec57186a0/prosper/src/hle/net/hle_http2.cpp) instead records the method argument as an integer; the string signature follows SharpProspero. These are public compatibility contracts, not console measurements. - [libSceHttp2 error paths](../../../core/libs/prx/libSceHttp2/Transport.cpp) - cancellation, deadlines, DNS/TLS/protocol failures, malformed inputs, concurrent calls on one request and exhausted connection slots throw because their console error mappings are unknown. Socket connect errors propagate the libSceNet result, following the module-analysis report in [prosper #2894](https://github.com/mattias800/prosper/issues/2894); the report does not establish every exported error path. A request uses one connection; a context's concurrency cap counts connections until EOF, failure or deletion. Native pooling, scheduling, validation order and teardown semantics remain unverified. DNS uses two host workers and a queue of eight; cancellation/deadlines abandon the caller's wait, not libc's lookup. Library unload can wait for a host lookup to return. A resolve retry resubmits a failed lookup with a new timeout; a timed-out lookup isn't retried. The console's retry semantics are unverified. -- [libSceHttp2 TLS settings](../../../core/libs/prx/libSceHttp2/Export.cpp) - minimum SSL versions outside 2 to 5, nonnull SSL callbacks and flags outside `0x3d` throw. Supported certificate-check bits follow SharpProspero and use libSceSsl's TLS 1.2 backend and CA context; native defaults and error translation are unverified. Settings on object kinds other than templates/requests throw, except for the request options below; native object-kind restrictions are otherwise unverified. Settings become immutable when transport is created. Zero timeout values, negative resolve retries, gzip inflation and connection-slot wait timeouts throw; a failed lookup is retried up to the set count. Host HTTP allocations are not charged to the context pool, so `sceHttp2GetMemoryPoolStats` reports a live context's pool size with zero peak and current use. PPSA01494, PPSA30839 and PPSA31162 read the three sizes for memory logging without checking the result, and stopped at startup while it threw. +- [libSceHttp2 TLS settings](../../../core/libs/prx/libSceHttp2/Export.cpp) - minimum SSL versions outside 2 to 5, nonnull SSL callbacks and flags outside `0x3d` throw. Supported certificate-check bits follow SharpProspero and use libSceSsl's TLS 1.2 backend and CA context; native defaults and error translation are unverified. Settings on object kinds other than templates/requests throw, except for the request options below and context SSL flags; native object-kind restrictions are otherwise unverified. Settings become immutable when transport is created. Zero timeout values, negative resolve retries and connection-slot wait timeouts throw; a failed lookup is retried up to the set count. Host HTTP allocations are not charged to the context pool, so `sceHttp2GetMemoryPoolStats` reports a live context's pool size with zero peak and current use. PPSA01494, PPSA30839 and PPSA31162 read the three sizes for memory logging without checking the result, and stopped at startup while it threw. - [sceHttp2SetMinSslVersion](../../../core/libs/prx/libSceHttp2/Export.cpp) - libSceHttp2's own range and validation order are not measured: versions 2 (SSL 3.0) to 5 (TLS 1.2) are accepted, the range `sceSslSetMinSslVersion` takes on a 13.40 console ([libSceSsl](libSceSsl.md)). The floor is not kept: libSceSsl negotiates TLS 1.2 only, which meets every accepted floor, so a server limited to versions older than TLS 1.2 fails the handshake whatever the floor; what a lower floor does with such a server on a console is not measured. +- [sceHttp2SslEnableOption, sceHttp2SslDisableOption](../../../core/libs/prx/libSceHttp2/Export.cpp) (libSceHttp2) - accept a context id as well as a template or request, as [prosper](https://github.com/mattias800/prosper/blob/b1bec57186a0/prosper/src/hle/net/hle_http2.cpp#L461-L478) does for any live object; PPSA06866 sets them on its context ([#13715](https://github.com/boykopovar/AnyPS5/issues/13715)). The context keeps the flags and templates created after the call copy them; that inheritance, and whether templates already created see the change, are not established by any source or measured on a console - [libSceHttp2 request options](../../../core/libs/prx/libSceHttp2/Export.cpp) - extends the TLS settings entry: the auth and redirect flags, headers and the auth-info and pre-send callbacks live in `Http2::Settings`, are copied into each new request and become immutable once transport exists; the getters still read them then. Accepted kinds, defaults, copying, header modes, error codes and their order follow the 13.42 module run in an emulator ([#10536](https://github.com/boykopovar/AnyPS5/pull/10536)), not a console. A null out-pointer to `sceHttp2GetAuthEnabled` is written through on that module; here it throws. The pre-send callback type is unknown. The transport never calls either callback, and the auth cache flush only validates the context +- [libSceHttp2 gzip responses](../../../core/libs/prx/libSceHttp2/Transport.cpp) - `sceHttp2SetInflateGZIPEnabled` stores the flag. When it is set and the response carries `content-encoding: gzip`, the transport inflates the body with the vendored zlib before `sceHttp2ReadData` and `sceHttp2GetResponseContentLength` see it, and reports the inflated length; both calls wait for END_STREAM while the enabled response is gzip. The transport neither adds nor inspects `Accept-Encoding`, so the guest supplies that request header and an unsolicited gzip response is inflated too. Whether a console rewrites the header block (Content-Encoding and Content-Length) is unverified, so the serialized headers keep the fields the server sent; other encodings are not inflated, a malformed or truncated stream, a bad checksum or size and concatenated members throw, and the optional gzip header CRC is not verified. - [sceHttp2GetAllResponseHeaders](../../../core/libs/prx/libSceHttp2/Export.cpp) throws: the serialization, size and lifetime of a decoded HTTP/2 header block have not been established. Status and Content-Length fields are decoded; absent Content-Length reports `NotFound`, following SharpProspero. - [libSceHttp2 asynchronous requests](../../../core/libs/prx/libSceHttp2/Export.cpp) - send/read submission and `sceHttp2WaitAsync` throw. The previous offline implementation queued a fabricated network failure and used event type zero; public sources do not establish the completion event types, wait timeout updates, cancellation results or ownership of async buffers. PPSA17221's kqueue layout and PPSA15508's 24-byte wait result establish caller ABI only. No completion or equeue event is manufactured. diff --git a/docs/dev/debt/libSceIcu.md b/docs/dev/debt/libSceIcu.md index be476d498e..8b1b49669f 100644 --- a/docs/dev/debt/libSceIcu.md +++ b/docs/dev/debt/libSceIcu.md @@ -4,8 +4,21 @@ - [ICU export availability](../../../core/libs/prx/libSceIcu/Unescape.cpp) across firmware versions remains unproven. The [PS5 3.20 inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceIcu.c) includes the implemented escape, invariant-character and version helpers. [BunnyFl’s firmware 13.42 report](https://github.com/boykopovar/AnyPS5/pull/10961#issuecomment-6400071863) records `u_getVersion` returning `78.1.0.0` under an emulator, but neither escape function is in the checked native `system_ex/common_ex/lib/libSceIcu.sprx` export table. Only 104 of the 661 inventory NIDs appear among that module’s 299 exports. The exports for compatibility with older firmware are retained; availability and routing across firmware versions remain unproven. +### Older dispatch exports + +- [Older dispatch exports](../../../core/libs/prx/libSceIcu/Export.cpp) - Four 3.20 callable NIDs are declared as throwing placeholders. Their signatures and behavior are unverified. The four selector wrappers have identical instruction bytes in the 3.20 and later version-labelled modules, and corresponding consumer switch cases call them. Their NIDs and internal layouts differ; no forwarding or binary compatibility is claimed. Later image version metadata does not authenticate a retail firmware release. + +| 3.20 NID | Later candidate NID | Selector | +| --- | --- | --- | +| `BufsAiaX0+s` | `3lVihhFbXus` | 0 | +| `xdF5zg0V5Oc` | `HFkUTLyJkZ0` | 1 | +| `Con4H1SB3nw` | `jXOj7dZh7RQ` | 2 | +| `lME28PLmu54` | `bxjI++g9NkE` | 3 | + ### Functional +- [Older callable exports](../../../core/libs/prx/libSceIcu/LegacyExports.cpp) - 2347 3.20 callable NIDs have unidentified names and are declared as throwing placeholders. Their signatures and behavior are unverified; no ICU functionality is implemented. These NIDs do not appear in the later version-labelled module inventory; no cross-version identity or compatibility is claimed. + - [UTF-8 macro helpers](../../../core/libs/prx/libSceIcu/Utf8.cpp) have no console ABI or behavior verification. Their names and NIDs are in the [PS5 3.20 inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceIcu.c); behavior follows ICU 78.1 [utf_impl.cpp](https://github.com/unicode-org/icu/blob/049e0d6a420629ac7db77256987d083a563287b5/icu4c/source/common/utf_impl.cpp). These are macro bodies, not complete UTF-8 operations: append encodes ASCII with two bytes, and null-error-pointer failures write the legacy length-dependent error characters. Null index pointers, negative positions, reversed bounds, overflowing index or capacity arithmetic, and null buffers when accessed throw instead of reproducing undefined behavior. Negative forward lengths denote NUL-terminated input. Cross-firmware export availability and native behavior outside the macros' preconditions remain unverified. - [Space classification](../../../core/libs/prx/libSceIcu/Space.cpp) is unverified on a console. `u_isspace`, `u_isblank`, `u_isWhitespace`, `u_isJavaSpaceChar` and `u_isUWhiteSpace` follow ICU 78.1 [uchar.cpp](https://github.com/unicode-org/icu/blob/049e0d6a420629ac7db77256987d083a563287b5/icu4c/source/common/uchar.cpp#L196-L244) over fixed Zs, Zl, Zp and White_Space sets instead of ICU's property data; the sets are unchanged from ICU 65.1 to 78.1. Firmware 13.42 exports `u_isUWhiteSpace` but not the other four ([#11013](https://github.com/boykopovar/AnyPS5/pull/11013#issuecomment-6401310351)), which are kept from the 3.20 inventory for older firmware (see ICU export availability). Closes when: compared with the console. @@ -18,8 +31,13 @@ - [Invariant character and version helpers](../../../core/libs/prx/libSceIcu/Version.cpp) are unverified on a console. `u_charsToUChars`, `u_UCharsToChars`, `u_versionFromString`, `u_versionFromUString` and `u_versionToString` follow ICU 78.1 [uinvchar.cpp](https://github.com/unicode-org/icu/blob/release-78.1/icu4c/source/common/uinvchar.cpp) and [putil.cpp](https://github.com/unicode-org/icu/blob/release-78.1/icu4c/source/common/putil.cpp), unchanged since 65.1. Firmware 13.42 reports ICU 78.1 and exports none of them ([#11013](https://github.com/boykopovar/AnyPS5/pull/11013#issuecomment-6400470698)); the [3.20 table](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceIcu.c) has all five. Version parts use the guest `strtoul`, truncated to eight bits; `u_versionToString` keeps ICU's dropped zero tens digit (105 becomes `15`). A null buffer with a positive conversion length throws; ICU dereferences it. Closes when: compared with the console. +- [Iterator comparison and Unicode version](../../../core/libs/prx/libSceIcu/CompareIter.cpp) are unverified on a console. `u_strCompareIter` and `u_getUnicodeVersion` follow ICU 78.1 [ustring.cpp](https://github.com/unicode-org/icu/blob/049e0d6a4206/icu4c/source/common/ustring.cpp#L828-L882) and [uchar.cpp](https://github.com/unicode-org/icu/blob/049e0d6a4206/icu4c/source/common/uchar.cpp#L484-L489); the version is 17.0, the Unicode data of 78.1, whatever firmware is emulated. A null iterator callback that ICU would call throws `std::invalid_argument`; ICU dereferences it. The code unit difference wraps instead of overflowing. The `UBool` is read as one byte, nonzero meaning true. Closes when: compared with the console. + - [Default-converter string copy helpers](../../../core/libs/prx/libSceIcu/Invariant.cpp) `u_austrcpy` and `u_austrncpy` are unverified on a console and throw `NotImplemented_nid_no_patch` on code units above `0x7f`. Their names and NIDs come from the PS5 3.20 inventory; signatures and ASCII (`0x01`–`0x7f`) behavior follow ICU 78.1's [ustr_cnv.cpp](https://github.com/unicode-org/icu/blob/release-78.1/icu4c/source/common/ustr_cnv.cpp), unchanged since 65.1, without assuming the console's default converter for non-ASCII units. `u_austrncpy` writes a single NUL when the source ends before the count without zero-padding the remainder. Null buffers with `u_austrcpy` or a positive count throw an invalid-argument exception, whereas ICU dereferences in `u_austrcpy` and returns the destination unchanged in `u_austrncpy`. Closes when: compared with the console, including the default converter for non-ASCII units. ### Known export names; ABI prototypes unverified -- The 96 `sceIcuUnknown_*_nid_no_patch` exports in [Export.cpp](../../../core/libs/prx/libSceIcu/Export.cpp) are present in the PS5 3.20 export inventory from [PS5-3.20_Libs](https://github.com/DNNDHH/PS5-3.20_Libs). Their prototypes and behavior are unverified. Each uses the no-parameter import-resolution convention and throws through `NotImplemented_nid_no_patch`; these declarations make no ABI or behavior claim. +- The 93 `sceIcuUnknown_*_nid_no_patch` and named `*_nid_postfix` stubs in [Export.cpp](../../../core/libs/prx/libSceIcu/Export.cpp) are present in the PS5 3.20 export inventory from [PS5-3.20_Libs](https://github.com/DNNDHH/PS5-3.20_Libs). Their prototypes and behavior are unverified. Each uses the no-parameter import-resolution convention and throws through `NotImplemented_nid_no_patch`; these declarations make no ABI or behavior claim. +- The 73 named stubs declared in [Identified.hpp](../../../core/libs/prx/libSceIcu/Identified.hpp) carry the ICU C API names whose `tools/nid_names.py` hash equals the inventory NID; the names were taken from the identifiers of the ICU 78.1 `common`, `i18n` and `io` sources. A name match does not show that the console function has ICU's prototype or behavior. Most of them read Unicode property, case-folding or resource data that no host library provides. + +- [Resource type classification](../../../core/libs/prx/libSceIcu/Resource.cpp) has no console ABI or behavior verification. `res_getPublicType` (NID `WPrktCwd+iw` in the PS5 3.20 inventory above) takes an unsigned 32-bit resource and returns a signed 32-bit public type, following ICU 65.1 and [ICU 78.1](https://github.com/unicode-org/icu/blob/049e0d6a420629ac7db77256987d083a563287b5/icu4c/source/common/uresdata.cpp). Both use the same mapping of the high four bits; the low 28 bits do not affect the result. Cross-firmware export availability and native behavior remain unverified. Closes when: compared with the console. diff --git a/docs/dev/debt/libSceImageUtil.md b/docs/dev/debt/libSceImageUtil.md new file mode 100644 index 0000000000..731a9a05d8 --- /dev/null +++ b/docs/dev/debt/libSceImageUtil.md @@ -0,0 +1,15 @@ +# libSceImageUtil technical debt + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceImageUtil/Export.cpp) - 5 entries present in both version-labelled images are import-resolution declarations only. Neither label independently authenticates retail firmware provenance. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Data exports require separate layout and ownership analysis. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `CttPwxlzc1A` | +| `Unknown` | `o9hdefxVx-0` | +| `Unknown` | `pjWv++MzaJY` | +| `Unknown` | `rSoaNeazErw` | +| `Unknown` | `yjU-5r3TDtc` | + +- [Older callable NIDs](../../../core/libs/prx/libSceImageUtil/Export.cpp): 5 unidentified exports have unverified names, signatures and behavior. These are throwing import-resolution placeholders; no functionality is implemented. No matching NIDs were found in the later module inventory. diff --git a/docs/dev/debt/libSceIme.md b/docs/dev/debt/libSceIme.md index 53cf52512a..d05f886ca9 100644 --- a/docs/dev/debt/libSceIme.md +++ b/docs/dev/debt/libSceIme.md @@ -1,5 +1,15 @@ # libSceIme technical debt +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceIme/Export.cpp) - 2 entries observed in the 3.20 export inventory and present in the later 13.60-labelled inventory are import-resolution declarations only. The later inventory label does not authenticate a retail firmware version. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. + +| Name | NID | +| --- | --- | +| `Unknown` | `NbbzN9GRg+c` | +| `Unknown` | `aChMGUoc7QI` | + + ### Silent stubs - [sceImeOpen](../../../core/libs/prx/libSceIme/Export.cpp) (libSceIme) shows no panel: the text is typed on the host keyboard, which [ImeTextInput](../../../core/libs/prx/libSceVideoOut/src/ImeTextInput.cpp) forwards from the game window (SDL text input, Backspace, Delete, Left, Right, Home, End, Enter and Escape), and the controller cannot type. While a panel is open, key presses do not reach the keyboard-to-pad bindings of [PadInput](../../../core/libs/prx/libSceVideoOut/src/PadInput.cpp), as the console's panel takes the controller; key releases still do. Minecraft Preview (PPSA19639, #1277) opens it when entering a world. The external keyboard filter is accepted and never called because no keycode events are produced diff --git a/docs/dev/debt/libSceImeBackend.md b/docs/dev/debt/libSceImeBackend.md index fc528a3311..b39cf6144b 100644 --- a/docs/dev/debt/libSceImeBackend.md +++ b/docs/dev/debt/libSceImeBackend.md @@ -3,3 +3,4 @@ ### Unknown function info - [sceImeBackendParamInit, sceImeBackendOpen, sceImeBackendClose, sceImeBackendReset, sceImeBackendGetStatus, sceImeBackendEnterCharacter, sceImeBackendBackspaceCharacter, sceImeBackendPartConfirm, sceImeBackendAllConfirm, sceImeBackendAllDeleteConvertString, sceImeBackendConvertForward, sceImeBackendConvertBackward, sceImeBackendConvertCancel, sceImeBackendGetString, sceImeBackendGetConvertString, sceImeBackendGetConfirmString, sceImeBackendGetCaretIndex, sceImeBackendModeCaretNext, sceImeBackendModeCaretPrevious, sceImeBackendGetCandidateList, sceImeBackendGetCandidateListSize, sceImeBackendGetCandidateSelect](../../../core/libs/prx/libSceImeBackend/Export.cpp) (libSceImeBackend) - declared without parameters: their signatures and behaviour are not established, so every call throws. PPSA05110 imports them and does not load without them. +- [`sceImeBackendGetConvertMode`, `sceImeBackendTemporalConfirm`, `sceImeBackendSetConvertMode`, `sceImeBackendForTestFunction` and `sceImeBackendDeleteCharacter`](../../../core/libs/prx/libSceImeBackend/Export.cpp) (libSceImeBackend) - parameter lists, return types and behaviour are unverified, so every entry throws through `NotImplemented_nid_no_patch`; the parameterless `int` declarations only resolve imports. The names and NIDs come from the [PS5 13.60 export inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/226383a7fa4b1275d6cebf61eb1c1e7ca7b58bcb/data/firmware-13.60/libsceimebackend-877b15bc21.jsonl), and the pinned [module map](https://github.com/boykopovar/ps5-nid-map/blob/cc1d586fddab576a520f226da6b2632b031e6d09/data/Modules/libSceImeBackend.inc) assigns them to `libSceImeBackend`. diff --git a/docs/dev/debt/libSceInvitationDialog.md b/docs/dev/debt/libSceInvitationDialog.md index 796df23dc8..e8ed9744c1 100644 --- a/docs/dev/debt/libSceInvitationDialog.md +++ b/docs/dev/debt/libSceInvitationDialog.md @@ -2,6 +2,7 @@ ### Silent stubs +- [sceInvitationDialogOpen](../../../core/libs/prx/libSceInvitationDialog/Export.cpp) (libSceInvitationDialog) - with `ANYPS5_PSN_DIALOGS=show`, a successful open shows AnyPS5's notice that the feature needs PlayStation Network; the console's own display without PlayStation Network is not measured, and the notice wording is AnyPS5's. - [sceInvitationDialogOpen, sceInvitationDialogGetResult](../../../core/libs/prx/libSceInvitationDialog/Export.cpp) (libSceInvitationDialog, PS4) - no dialog is shown and no invitation is sent: `Open` moves the dialog straight to `FINISHED`, and `GetResult` returns 0 with `errorCode` 0, `result` `USER_CANCELED` (1), the `callbackArg` of the last `Open` and a recipient count of 0, as [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/2cdefaa1298c6e4ece6c74bd84e90f3906282d51/src/core/libraries/invitation_dialog/invitation_dialog.cpp) reports when its window is dismissed and as [libSceNpProfileDialog](libSceNpProfileDialog.md) does. Not measured on a console. ### Unknown function info diff --git a/docs/dev/debt/libSceIpmi.md b/docs/dev/debt/libSceIpmi.md index 2829ca156f..e60923e470 100644 --- a/docs/dev/debt/libSceIpmi.md +++ b/docs/dev/debt/libSceIpmi.md @@ -9,3 +9,14 @@ ### Known export names; ABI prototypes unverified - 40 pending exports in [Export.cpp](../../../core/libs/prx/libSceIpmi/Export.cpp) are present in the [PS5-3.20_Libs](https://github.com/DNNDHH/PS5-3.20_Libs) inventory. Their prototypes and behavior are unverified. They use the no-parameter import-resolution convention and throw through `NotImplemented_nid_no_patch`; these declarations make no ABI or behavior claim. + +### Additional callable exports + + +- [Additional callable exports](../../../core/libs/prx/libSceIpmi/Export.cpp) - 3 entries observed in the 3.20 export inventory and present in the later 13.60-labelled inventory are import-resolution declarations only. The later inventory label does not authenticate a retail firmware version. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Data exports require separate layout and ownership analysis. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `fjPNqzuUop8` | +| `Unknown` | `gL4bo5h2nwU` | +| `Unknown` | `rq3L3xKnt3Y` | diff --git a/docs/dev/debt/libSceJsc.md b/docs/dev/debt/libSceJsc.md index dbe4438060..2ceadd9288 100644 --- a/docs/dev/debt/libSceJsc.md +++ b/docs/dev/debt/libSceJsc.md @@ -6,6 +6,8 @@ ### Functional +- [Older callable NIDs](../../../core/libs/prx/libSceJsc/LegacyExports.cpp): 198 unidentified exports have unverified names, signatures and behavior. These are throwing import-resolution placeholders; no JavaScriptCore behavior is implemented. No matching NIDs were found in the later module inventory. + - [JSString conversion](../../../core/libs/prx/libSceJsc/Export.cpp): console behavior is unverified. UTF-16 storage, null/empty distinction and partial UTF-8 output follow pinned WebKit [OpaqueJSString.cpp](https://github.com/WebKit/WebKit/blob/f274ef4c03ebace644c46f8ec55746b391acdcc8/Source/JavaScriptCore/API/OpaqueJSString.cpp) and [UTF8Conversion.cpp](https://github.com/WebKit/WebKit/blob/f274ef4c03ebace644c46f8ec55746b391acdcc8/Source/WTF/wtf/unicode/UTF8Conversion.cpp). Malformed UTF-8 creates a null string, distinct from an empty string; output stops before an unpaired UTF-16 surrogate. The PS5 11.x [OpaqueJSString.h](https://github.com/neonmodder123/PS5-WebKit-11.x/blob/80f77e94c63ee7202eec3d4b5b1a021dd89011ba/Source/JavaScriptCore/API/OpaqueJSString.h#L49-L52) keeps the low 32 bits of a UTF-16 length of 2^32 or more, which throws here as in pinned WebKit. ### Known export names; ABI prototypes unverified diff --git a/docs/dev/debt/libSceJxr.md b/docs/dev/debt/libSceJxr.md index e425528f86..f475ca4357 100644 --- a/docs/dev/debt/libSceJxr.md +++ b/docs/dev/debt/libSceJxr.md @@ -1,5 +1,9 @@ # libSceJxr technical debt +### GUID exports + +- [GUID data exports](../../../core/libs/prx/libSceJxr/src/GuidExports.cpp) use 84 values from the pinned JXR header. Their NIDs and bytes match version-labelled images; the labels are not authenticated. Runtime behavior on a console and complete consumer coverage are unverified. Four additional 4-byte interface identifiers have names and values matching the pinned upstream JXR implementation and both version-labelled images; their relative placement in a guest image and use by consumers are unverified. One older 8-byte writable object has a relocation and no matching later-image data export; its identity, lifetime and initialization remain unknown and it is not implemented. + ### Functional - [PixelFormatLookup](../../../core/libs/prx/libSceJxr/src/PixelFormatLookup.cpp) uses pinned public jxrlib through a C bridge and a 56-byte LP64 guest record. [BunnyFl reports firmware 13.42 native-PC comparisons](https://github.com/boykopovar/AnyPS5/pull/9954#issuecomment-6406356097): the 68 table entries match public jxrlib, and return values/record fields match across 802 cases repeated three times, except that the module clears padding bytes 28..31 on all 309 successes. This bridge now clears that four-byte range explicitly on success; it does not copy indeterminate C++ padding. This is attributed single-firmware evidence, not an author-run console measurement or proof of the complete Sony ABI/configuration. Module/library versions, other firmware and valid-mode null arguments remain unverified. Modes 0/1 perform forward GUID/reverse TIFF lookup; other modes and misses leave the entire record unchanged. Valid-mode null records and forward null GUIDs remain explicitly unsupported. Success borrows a read-only static GUID while the module is loaded; callers must not free it. Closes when: remaining Sony ABI, version/configuration and invalid-argument behavior are verified by attributable measurements or disassembly diff --git a/docs/dev/debt/libSceJxrParser.md b/docs/dev/debt/libSceJxrParser.md new file mode 100644 index 0000000000..6dd340db2c --- /dev/null +++ b/docs/dev/debt/libSceJxrParser.md @@ -0,0 +1,5 @@ +# libSceJxrParser technical debt + +### Callable exports + +- [Callable exports](../../../core/libs/prx/libSceJxrParser/Export.cpp) - Seven 3.20 callable NIDs are import-resolution declarations only. One NID also appears in the 13.60-labelled inventory; other NIDs differ across versions. Their signatures and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. No runtime functionality is implemented. Data exports require separate layout and ownership analysis. diff --git a/docs/dev/debt/libSceKeyboard.md b/docs/dev/debt/libSceKeyboard.md index 01e3cda73e..bc0154e9ae 100644 --- a/docs/dev/debt/libSceKeyboard.md +++ b/docs/dev/debt/libSceKeyboard.md @@ -6,6 +6,7 @@ ### Unknown function info +- [Keyboard export `l76jptHfizM`](../../../core/libs/prx/libSceKeyboard/Export.cpp) is recorded as a function with qualifier `E#A` in older and later version-labelled modules. In both, dynamic metadata maps library ID 4 and module ID 0 to `libSceKeyboard`. The older module-parameter words are `0x08540001` and `0x03200004`; the later words are `0x13590001` and `0x13600007`. The 17 older function NIDs under that qualifier have sorted-LF SHA-256 `42ee4240ba6e95c22083ea1ce753b81bdc8852b5f241675f4eecbd9bcca83ad9` using the [static ELF membership procedure](https://github.com/boykopovar/AnyPS5/pull/12367#issuecomment-6470603298). Version labels are not authenticated retail provenance; this digest identifies the NID set, not the binary or ABI. The export name, signature and behavior are unverified; this declaration throws. - [sceDbgKeyboardGetHandle](../../../core/libs/prx/libSceKeyboard/Export.cpp) (logical `libSceDbgKeyboard`, NID `vob3PZretTg`) - signature and behavior are unknown. This parameterless `int` declaration is an import placeholder, not a verified ABI prototype; every call throws through `NotImplemented_nid_no_patch`. The binding is in the [13.60 inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/bfec40deb4c47a17d7603ee2bc79aa6862c0c56b/data/firmware-13.60/libscedbgkeyboard-a009193dfc.jsonl). - [sceDbgKeyboardClose, sceDbgKeyboardGetKey2Char, sceDbgKeyboardInit, sceDbgKeyboardOpen, sceDbgKeyboardRead, sceDbgKeyboardReadState](../../../core/libs/prx/libSceKeyboard/Export.cpp) (libSceKeyboard) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceKeyboard.c), but no credible prototypes were found. They are declared without parameters solely to resolve known imports; this is not an ABI claim. diff --git a/docs/dev/debt/libSceLibcInternal.md b/docs/dev/debt/libSceLibcInternal.md index 5c8b0b7a31..48d3b4afb3 100644 --- a/docs/dev/debt/libSceLibcInternal.md +++ b/docs/dev/debt/libSceLibcInternal.md @@ -1,5 +1,313 @@ # libSceLibcInternal technical debt +### Additional callable exports + +The named entries below use provider-specific NID aliases to avoid interposing host libc and C++ runtime symbols. + +- The [revision-pinned identity inventory](https://gist.github.com/kyon-eth/6bd58c3d7a0fa933dd4b524754c43265/e4e5dbc43890a24e35dc1c656135000210e28390) records module, library, symbol type and NIDs for [InventoryExports.cpp](../../../core/libs/prx/libSceLibcInternal/InventoryExports.cpp); it is a metadata summary rather than independent verification. One entry belongs to the logical library `libSceLibcInternalExt` within this module. + +- [Additional callable exports](../../../core/libs/prx/libSceLibcInternal/InventoryExports.cpp) - 297 entries observed in a 3.20-labelled image and a later 13.60-labelled image; 291 match the public 3.20 catalogue and 6 do not. These are declarations only; neither image label authenticates a retail firmware version. Signatures and behavior are unverified; parameterless `int` declarations are placeholders. Every entry throws through `NotImplemented_nid_no_patch`. All declarations use literal NID aliases; the table records candidate names where known. No runtime functionality is implemented; data exports need separate analysis. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `_ZNKSt22_System_error_category23default_error_conditionEi` | `ww3UUl317Ng` | +| `_ZNKSt22_System_error_category4nameEv` | `dXy+lFOiaQA` | +| `_ZNKSt22_System_error_category7messageEi` | `HpAlvhNKb2Y` | +| `_ZNSt10moneypunctIwLb0EEC2EPKcm` | `5bQqdR3hTZw` | +| `_ZNSt10moneypunctIwLb0EEC2ERKSt8_Locinfomb` | `1kvQkOSaaVo` | +| `_ZNSt10moneypunctIwLb0EEC2Em` | `bBGvmspg3Xs` | +| `_ZNSt10moneypunctIwLb0EED0Ev` | `95MaQlRbfC8` | +| `_ZNSt10moneypunctIwLb0EED1Ev` | `ki5SQPsB4m4` | +| `_ZNSt10moneypunctIwLb0EED2Ev` | `6F1JfiING18` | +| `_ZNSt10moneypunctIwLb1EE7_GetcatEPPKNSt6locale5facetEPKS1_` | `HmcMLz3cPkM` | +| `_ZNSt10moneypunctIwLb1EEC1EPKcm` | `pyBabUesXN4` | +| `_ZNSt10moneypunctIwLb1EEC1ERKSt8_Locinfomb` | `uROsAczW6OU` | +| `_ZNSt10moneypunctIwLb1EEC1Em` | `X69UlAXF-Oc` | +| `_ZNSt10moneypunctIwLb1EEC2EPKcm` | `GS1AvxBwVgY` | +| `_ZNSt10moneypunctIwLb1EEC2Em` | `sTaUDDnGOpE` | +| `_ZNSt10moneypunctIwLb1EED1Ev` | `OM0FnA7Tldk` | +| `_ZNSt10moneypunctIwLb1EED2Ev` | `uVOxy7dQTFc` | +| `_ZNSt12future_errorD0Ev` | `rNYLEsL7M0k` | +| `_ZNSt12future_errorD2Ev` | `XFh0C66aEms` | +| `_ZNSt12system_errorC2ESt10error_codePKc` | `oly3wSwEJ2A` | +| `_ZNSt13bad_exceptionD0Ev` | `lX9M5u0e48k` | +| `_ZNSt13bad_exceptionD1Ev` | `t6egllDqQ2M` | +| `_ZNSt13bad_exceptionD2Ev` | `iWNC2tkDgxw` | +| `_ZNSt13basic_filebufIcSt11char_traitsIcEE4syncEv` | `VNaqectsZNs` | +| `_ZNSt13basic_filebufIcSt11char_traitsIcEE5_LockEv` | `9biiDDejX3Q` | +| `_ZNSt13basic_filebufIcSt11char_traitsIcEE5uflowEv` | `jfr41GGp2jA` | +| `_ZNSt13basic_filebufIcSt11char_traitsIcEE6setbufEPci` | `SYFNsz9K2rs` | +| `_ZNSt13basic_filebufIcSt11char_traitsIcEE7seekoffElNSt5_IosbIiE8_SeekdirENS4_9_OpenmodeE` | `7oio2Gs1GNk` | +| `_ZNSt13basic_filebufIcSt11char_traitsIcEE7seekposESt4fposI9_MbstatetENSt5_IosbIiE9_OpenmodeE` | `rsS5cBMihAM` | +| `_ZNSt13basic_filebufIcSt11char_traitsIcEE8overflowEi` | `oYMRgkQHoJM` | +| `_ZNSt13basic_filebufIcSt11char_traitsIcEED0Ev` | `MYCRRmc7cDA` | +| `_ZNSt13basic_filebufIcSt11char_traitsIcEED1Ev` | `Yc2gZRtDeNQ` | +| `_ZNSt13basic_filebufIcSt11char_traitsIcEED2Ev` | `gOxGOQmSVU0` | +| `_ZNSt13basic_filebufIwSt11char_traitsIwEE5_LockEv` | `GYTma8zq0NU` | +| `_ZNSt13basic_filebufIwSt11char_traitsIwEE6setbufEPwi` | `wAcnCK2HCeI` | +| `_ZNSt13basic_filebufIwSt11char_traitsIwEE7seekposESt4fposI9_MbstatetENSt5_IosbIiE9_OpenmodeE` | `10VcrHqHAlw` | +| `_ZNSt13basic_filebufIwSt11char_traitsIwEE8overflowEi` | `PjH5dZGfQHQ` | +| `_ZNSt13basic_filebufIwSt11char_traitsIwEE9pbackfailEi` | `NeiFvKblpZM` | +| `_ZNSt13basic_filebufIwSt11char_traitsIwEED0Ev` | `JJ-mkOhdook` | +| `_ZNSt13basic_istreamIwSt11char_traitsIwEED1Ev` | `RP7ijkGGx50` | +| `_ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryC2ERS2_` | `4GbIwW5u5us` | +| `_ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryD2Ev` | `MB1VCygerRU` | +| `_ZNSt13basic_ostreamIwSt11char_traitsIwEED0Ev` | `7VRfkz22vPk` | +| `_ZNSt13basic_ostreamIwSt11char_traitsIwEED1Ev` | `EYZJsnX58DE` | +| `_ZNSt14overflow_errorD2Ev` | `OypvNf3Uq3c` | +| `_ZNSt15basic_streambufIcSt11char_traitsIcEE6xsgetnEPci` | `VpwymQiS4ck` | +| `_ZNSt15basic_streambufIcSt11char_traitsIcEE6xsputnEPKci` | `sXaxl1QGorg` | +| `_ZNSt15basic_streambufIcSt11char_traitsIcEE9showmanycEv` | `IAEl1Ta7yVU` | +| `_ZNSt15basic_streambufIwSt11char_traitsIwEE6xsgetnEPwi` | `lZVehk7yFok` | +| `_ZNSt15basic_streambufIwSt11char_traitsIwEE6xsputnEPKwi` | `041c37QfoUc` | +| `_ZNSt15basic_streambufIwSt11char_traitsIwEE9showmanycEv` | `olsoiZsezkk` | +| `_ZNSt15underflow_errorD2Ev` | `xiqd+QkuYXc` | +| `_ZNSt16nested_exceptionD1Ev` | `+qKS53qzWdA` | +| `_ZNSt16nested_exceptionD2Ev` | `8R00hgzXQDY` | +| `_ZNSt22_Future_error_categoryD0Ev` | `WDKzMM-uuLE` | +| `_ZNSt22_System_error_categoryD0Ev` | `Dc4ZMWmPMl8` | +| `_ZNSt22_System_error_categoryD1Ev` | `hVQgfGhJz3U` | +| `_ZNSt23_Generic_error_categoryD1Ev` | `MAalgQhejPc` | +| `_ZNSt24_Iostream_error_categoryD1Ev` | `27Z-Cx1jbkU` | +| `_ZNSt3pmr19new_delete_resourceEv` | `9G32u5RRYxE` | +| `_ZNSt3pmr20get_default_resourceEv` | `d2u38zs4Pe8` | +| `_ZNSt4_Pad7_LaunchEPKcPP12pthread_attrPP7pthread` | `H7-7Z3ixv-w` | +| `_ZNSt4_Pad7_LaunchEPKcPP7pthread` | `PBbZjsL6nfc` | +| `_ZNSt4_PadC2EPKc` | `uhnb6dnXOnc` | +| `_ZNSt5ctypeIcED0Ev` | `p8-44cVeO84` | +| `_ZNSt5ctypeIcED1Ev` | `tPsGA6EzNKA` | +| `_ZNSt5ctypeIwED0Ev` | `zOPA5qnbW2U` | +| `_ZNSt6_Mutex5_LockEv` | `U54NBtdj6UY` | +| `_ZNSt6_Mutex7_UnlockEv` | `7OCTkL2oWyg` | +| `_ZNSt6_MutexC2Ev` | `log6zy2C9iQ` | +| `_ZNSt6_MutexD2Ev` | `j7e7EQBD6ZA` | +| `_ZNSt6_WinitC1Ev` | `-Bl9-SZ2noc` | +| `_ZNSt6_WinitC2Ev` | `57mMrw0l-40` | +| `_ZNSt6locale16_SetgloballocaleEPv` | `1TaQLyPDJEY` | +| `_ZNSt6locale5emptyEv` | `K-5mtupQZ4g` | +| `_ZNSt6locale5facet7_DecrefEv` | `AgxEl+HeWRQ` | +| `_ZNSt6locale5facet7_IncrefEv` | `-EgSegeAKl4` | +| `_ZNSt6locale7_Locimp8_MakelocERKSt8_LocinfoiPS0_PKS_` | `5r801ZWiJJI` | +| `_ZNSt6locale7_Locimp9_MakewlocERKSt8_LocinfoiPS0_PKS_` | `BcbHFSrcg3Y` | +| `_ZNSt6locale7_Locimp9_MakexlocERKSt8_LocinfoiPS0_PKS_` | `fkFGlPdquqI` | +| `_ZNSt6locale7_LocimpC2ERKS0_` | `dsJKehuajH4` | +| `_ZNSt6locale7_LocimpD1Ev` | `aD-iqbVlHmQ` | +| `_ZNSt6locale7_LocimpD2Ev` | `So6gSmJMYDs` | +| `_ZNSt6localeD1Ev` | `pMWnITHysPc` | +| `_ZNSt7_MpunctIcE5_InitERKSt8_Locinfob` | `m7qAgircaZY` | +| `_ZNSt7_MpunctIcEC2EPKcmbb` | `0il9qdo6fhs` | +| `_ZNSt7_MpunctIcED1Ev` | `0AeC+qCELEA` | +| `_ZNSt7_MpunctIwE5_InitERKSt8_Locinfob` | `iCoD0EOIbTM` | +| `_ZNSt7_MpunctIwEC2EPKcmbb` | `TDhjx3nyaoU` | +| `_ZNSt7_MpunctIwED1Ev` | `0TADyPWrobI` | +| `_ZNSt7codecvtIDic9_MbstatetED0Ev` | `vwMx2NhWdLw` | +| `_ZNSt7codecvtIDic9_MbstatetED1Ev` | `TuhGCIxgLvA` | +| `_ZNSt7codecvtIDsc9_MbstatetED0Ev` | `zYHryd8vd0w` | +| `_ZNSt7codecvtIcc9_MbstatetEC1ERKSt8_Locinfom` | `3YCLxZqgIdo` | +| `_ZNSt7codecvtIcc9_MbstatetEC2ERKSt8_Locinfom` | `4qHwSTPt-t8` | +| `_ZNSt7codecvtIcc9_MbstatetEC2Em` | `e5Hwcntvd8c` | +| `_ZNSt7codecvtIcc9_MbstatetED0Ev` | `2TYdayAO39E` | +| `_ZNSt7codecvtIcc9_MbstatetED1Ev` | `djNkrJKTb6Q` | +| `_ZNSt7codecvtIwc9_MbstatetED1Ev` | `0fkFA3za2N8` | +| `_ZNSt7collateIcEC2ERKSt8_Locinfom` | `L71JAnoQees` | +| `_ZNSt7collateIcEC2Em` | `tkqNipin1EI` | +| `_ZNSt7collateIcED0Ev` | `Lt4407UMs2o` | +| `_ZNSt7collateIcED1Ev` | `8pXCeme0FC4` | +| `_ZNSt7collateIcED2Ev` | `dP5zwQ2Yc8g` | +| `_ZNSt7collateIwE5_InitERKSt8_Locinfo` | `LxKs-IGDsFU` | +| `_ZNSt7collateIwEC1EPKcm` | `fjHAU8OSaW8` | +| `_ZNSt7collateIwEC1ERKSt8_Locinfom` | `wggIIjWSt-E` | +| `_ZNSt7collateIwEC2EPKcm` | `PSAw7g1DD24` | +| `_ZNSt7collateIwEC2ERKSt8_Locinfom` | `2PoQu-K2qXk` | +| `_ZNSt7collateIwEC2Em` | `HQbgeUdQyyw` | +| `_ZNSt7collateIwED0Ev` | `ig4VDIRc21Q` | +| `_ZNSt7collateIwED1Ev` | `ZO3a6HfALTQ` | +| `_ZNSt7collateIwED2Ev` | `84wIPnwBGiU` | +| `_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em` | `uXj-oWD2334` | +| `_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2ERKSt8_Locinfom` | `yAobGI2Whrg` | +| `_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em` | `RNmYVYlZvv8` | +| `_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev` | `-1G1iE3KyGI` | +| `_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev` | `kAay0hfgDJs` | +| `_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev` | `6S8jzWWGcWo` | +| `_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE5_InitERKSt8_Locinfo` | `4MHgRGOKOXY` | +| `_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1ERKSt8_Locinfom` | `0UPU3kvxWb0` | +| `_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em` | `18rLbEV-NQs` | +| `_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2ERKSt8_Locinfom` | `e3shgCIZxRc` | +| `_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em` | `-+RKa3As0gE` | +| `_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev` | `aHDdLa7jA1U` | +| `_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev` | `Zbaaq-d70ms` | +| `_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev` | `bwVJf3kat9c` | +| `_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE5_InitERKSt8_Locinfo` | `BbJ4naWZeRw` | +| `_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1ERKSt8_Locinfom` | `Hg1im-rUeHc` | +| `_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em` | `LAEVU8cBSh4` | +| `_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2ERKSt8_Locinfom` | `Mniutm2JL2M` | +| `_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev` | `aOK5ucXO-5g` | +| `_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev` | `WoCt9o2SYHw` | +| `_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1ERKSt8_Locinfom` | `Ky+C-qbKcX0` | +| `_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em` | `xdHqQoggdfo` | +| `_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em` | `f1ZGLUnQGgo` | +| `_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev` | `jyXTVnmlJD4` | +| `_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev` | `WiUy3dEtCOQ` | +| `_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev` | `6hV3y21d59k` | +| `_ZNSt8_Locinfo8_AddcatsEiPKc` | `WkAsdy5CUAo` | +| `_ZNSt8_LocinfoC1ERKSs` | `2aSk2ruCP0E` | +| `_ZNSt8_LocinfoC2EPKc` | `pN02FS5SPgg` | +| `_ZNSt8_LocinfoC2ERKSs` | `ReK9U6EUWuU` | +| `_ZNSt8_LocinfoC2EiPKc` | `i180MNC9p4c` | +| `_ZNSt8ios_base4InitC1Ev` | `sqWytnhYdEg` | +| `_ZNSt8ios_base4InitD1Ev` | `kxXCvcat1cM` | +| `_ZNSt8ios_base4InitD2Ev` | `bxLH5WHgMBY` | +| `_ZNSt8ios_base5clearENSt5_IosbIiE8_IostateEb` | `QXJCcrXoqpU` | +| `_ZNSt8ios_baseD0Ev` | `I5jcbATyIWo` | +| `_ZNSt8messagesIcE5_InitERKSt8_Locinfo` | `eLB2+1+mVvg` | +| `_ZNSt8messagesIcE7_GetcatEPPKNSt6locale5facetEPKS1_` | `96Ev+CE1luE` | +| `_ZNSt8messagesIcEC1Em` | `6gCBQs1mIi4` | +| `_ZNSt8messagesIcEC2EPKcm` | `qF3mHeMAHVk` | +| `_ZNSt8messagesIcED1Ev` | `34mi8lteNTs` | +| `_ZNSt8messagesIcED2Ev` | `yDdbQr1oLOc` | +| `_ZNSt8messagesIwE7_GetcatEPPKNSt6locale5facetEPKS1_` | `XghI4vmw8mU` | +| `_ZNSt8messagesIwEC1Em` | `n4+3hznhkU4` | +| `_ZNSt8messagesIwEC2EPKcm` | `DlDsyX+XsoA` | +| `_ZNSt8messagesIwEC2ERKSt8_Locinfom` | `DDQjbwNC31E` | +| `_ZNSt8messagesIwED1Ev` | `6sAaleB7Zgk` | +| `_ZNSt8messagesIwED2Ev` | `I-e7Dxo087A` | +| `_ZNSt8numpunctIcE5_InitERKSt8_Locinfob` | `1LvbNeZZJ-o` | +| `_ZNSt8numpunctIcE5_TidyEv` | `fFnht9SPed8` | +| `_ZNSt8numpunctIcEC1ERKSt8_Locinfomb` | `CDm+TUClE7E` | +| `_ZNSt8numpunctIcEC1Em` | `TEtyeXjcZ0w` | +| `_ZNSt8numpunctIcEC2EPKcmb` | `yIn4l8OO1zA` | +| `_ZNSt8numpunctIcEC2Em` | `1eVdDzPtzD4` | +| `_ZNSt8numpunctIcED1Ev` | `qEob3o53s2M` | +| `_ZNSt8numpunctIwE5_TidyEv` | `2YCDWkuFEy8` | +| `_ZNSt8numpunctIwEC1EPKcmb` | `H+T2VJ91dds` | +| `_ZNSt8numpunctIwEC1ERKSt8_Locinfomb` | `s1EM2NdPf0Y` | +| `_ZNSt8numpunctIwEC1Em` | `XOgjMgZ3fjo` | +| `_ZNSt8numpunctIwEC2EPKcmb` | `m4kEqv7eGVY` | +| `_ZNSt8numpunctIwEC2ERKSt8_Locinfomb` | `MQJQCxbLfM0` | +| `_ZNSt8numpunctIwEC2Em` | `ElKI+ReiehU` | +| `_ZNSt8numpunctIwED0Ev` | `VHBnRBxBg5E` | +| `_ZNSt8numpunctIwED1Ev` | `lzK3uL1rWJY` | +| `_ZNSt8numpunctIwED2Ev` | `XDm4jTtoEbo` | +| `_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE5_TidyEv` | `+yrOX7MgVlk` | +| `_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1ERKSt8_Locinfom` | `iO5AOflrTaA` | +| `_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2EPKcm` | `M0n7l76UVyE` | +| `_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2ERKSt8_Locinfom` | `l7OtvplI42U` | +| `_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em` | `dU8Q2yzFNQg` | +| `_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev` | `mmq9OwwYx74` | +| `_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev` | `Cp9ksNOeun8` | +| `_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE5_TidyEv` | `ImblNB7fVVU` | +| `_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE7_GetcatEPPKNSt6locale5facetEPKS5_` | `e5jQyuEE+9U` | +| `_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1ERKSt8_Locinfom` | `y0hzUSFrkng` | +| `_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em` | `J2xO4cttypo` | +| `_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2ERKSt8_Locinfom` | `bU3S1OS1sc0` | +| `_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em` | `p-SW25yE-Q8` | +| `_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev` | `8H3yBUytv-0` | +| `_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev` | `QTgRx1NTp6o` | +| `_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE5_InitERKSt8_Locinfo` | `QdPT7uDTlo0` | +| `_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em` | `6htjEH2Gi-w` | +| `_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev` | `WQQlL0n2SpU` | +| `_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE7_GetcatEPPKNSt6locale5facetEPKS5_` | `bF2uVCqVhBY` | +| `_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1ERKSt8_Locinfom` | `oi3kpQPqpMY` | +| `_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2ERKSt8_Locinfom` | `b1LciG4lUUk` | +| `_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em` | `lOF5jrFNZUA` | +| `_ZNSt9basic_iosIcSt11char_traitsIcEE4initEPSt15basic_streambufIcS1_Eb` | `UQPicLg8Sx8` | +| `_ZNSt9basic_iosIwSt11char_traitsIwEE4initEPSt15basic_streambufIwS1_Eb` | `uqLGWOX7-YE` | +| `_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE5_InitERKSt8_Locinfo` | `6zg3ziZ4Qis` | +| `_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE7_GetcatEPPKNSt6locale5facetEPKS5_` | `MSSvHmcbs3g` | +| `_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1ERKSt8_Locinfom` | `7NQGsY7VY3c` | +| `_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em` | `YGPopdkhujM` | +| `_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2ERKSt8_Locinfom` | `iWtXRduTjHA` | +| `_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em` | `f+1EaDVL5C4` | +| `_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev` | `b9QSruV4nnc` | +| `_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev` | `CClObiVHzDY` | +| `_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE5_InitERKSt8_Locinfo` | `JOj6qfc4VLs` | +| `_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1ERKSt8_Locinfom` | `ej+44l1PjjY` | +| `_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev` | `RB3ratfpZDc` | +| `_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev` | `a6yvHMSqsV0` | +| `_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev` | `7ZmeGHyM6ew` | +| `_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE4_PutES3_St22_String_const_iteratorISt11_String_valISt13_Simple_typesIcEEEm` | `66AuqgLnsQE` | +| `_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE4_RepES3_cm` | `1dY2KJfkgMM` | +| `_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE5_InitERKSt8_Locinfo` | `riBxNiKLvI0` | +| `_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE7_GetcatEPPKNSt6locale5facetEPKS5_` | `w9fCz0pbHdw` | +| `_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1ERKSt8_Locinfom` | `mdYczJb+bb0` | +| `_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em` | `Qi5fpNt5+T0` | +| `_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2ERKSt8_Locinfom` | `b2na0Dzd5j8` | +| `_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Em` | `XqbpfYmAZB4` | +| `_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev` | `s2zG12AYKTg` | +| `_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev` | `AnE9WWbyWkM` | +| `_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev` | `MuACiCSA8-s` | +| `_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE4_RepES3_wm` | `6QU40olMkOM` | +| `_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE5_InitERKSt8_Locinfo` | `kJmdxo4uM+8` | +| `_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE7_GetcatEPPKNSt6locale5facetEPKS5_` | `0sHarDG9BY4` | +| `_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em` | `rme+Po9yI5M` | +| `_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em` | `jIvWFH24Bjw` | +| `_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev` | `4+oswXtp7PQ` | +| `_ZNSt9type_infoD0Ev` | `N5nZ3wQw+Vc` | +| `_ZNSt9type_infoD1Ev` | `LLssoYjMOow` | +| `_ZNSt9type_infoD2Ev` | `zb3436295XU` | +| `_ZSt10_GetloctxtIcSt19istreambuf_iteratorIwSt11char_traitsIwEEEiRT0_S5_mPKT_` | `FX+eS2YsEtY` | +| `_ZSt10_GetloctxtIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEiRT0_S5_mPKT_` | `i4J5FvRPG-w` | +| `_ZSt10_Rng_abortPKc` | `VrWUXy1gqn8` | +| `_ZSt13resetiosflagsNSt5_IosbIiE9_FmtflagsE` | `qMXslRdZVj4` | +| `_ZSt14_Debug_messagePKcS0_j` | `Zn44KZgJtWY` | +| `_ZSt14get_unexpectedv` | `zPWCqkg7V+o` | +| `_ZSt14set_unexpectedPFvvE` | `Eva2i4D5J6I` | +| `_ZSt16_Xoverflow_errorPKc` | `saSUnPWLq9E` | +| `_ZSt17_Future_error_mapi` | `0r8rbw2SFqk` | +| `_ZSt22_Random_device_entropyv` | `mDIHE-aaRaI` | +| `_ZSt6_ThrowRKSt9exception` | `pDFe-IgbTPg` | +| `_ZSt7_FiopenPKwNSt5_IosbIiE9_OpenmodeEi` | `aqyjhIx7jaY` | +| `_ZSt7_MP_AddPyy` | `QfPuSqhub7o` | +| `_ZSt7_MP_GetPy` | `lrQSsTRMMr4` | +| `_ZSt7_MP_MulPyyy` | `Gav1Xt1Ce+c` | +| `_ZSt7_MP_RemPyy` | `Ozk+Z6QnlTY` | +| `_ZSt7setbasei` | `4rrOHCHAV1w` | +| `_ZSt9_LStrxfrmIcEmPT_S1_PKS0_S3_PKSt8_Collvec` | `V62E2Q8bJVY` | +| `_ZSt9_LStrxfrmIwEmPT_S1_PKS0_S3_PKSt8_Collvec` | `BloPUt1HCH0` | +| `_ZTv0_n24_NSiD1Ev` | `+Uuj++A+I14` | +| `_ZTv0_n24_NSoD0Ev` | `QJJ-4Dgm8YQ` | +| `_ZTv0_n24_NSoD1Ev` | `kvqg376KsJo` | +| `_ZTv0_n24_NSt13basic_istreamIwSt11char_traitsIwEED1Ev` | `q05IXuNA2NE` | +| `_ZTv0_n24_NSt13basic_ostreamIwSt11char_traitsIwEED0Ev` | `0j1jspKbuFk` | +| `_ZTv0_n24_NSt13basic_ostreamIwSt11char_traitsIwEED1Ev` | `HSkPyRyFFHQ` | +| `_ZdaPvS_` | `Suc8W0QPxjw` | +| `_ZdlPvS_` | `1vo6qqqa9F4` | +| `__atomic_compare_exchange_n` | `hsn2TaF3poY` | +| `__atomic_exchange_n` | `oCH4efUlxZ0` | +| `__atomic_store_n` | `GdwuPYbVpP4` | +| `__fflush` | `E1iwBYkG3CM` | +| `__kernel_cos` | `-m7FIvSBbMM` | +| `__kernel_cosdf` | `7ruwcMCJVGI` | +| `__kernel_sindf` | `2Lvc7KWtErs` | +| `__longjmp` | `9mKjVppFsL0` | +| `__vfprintf` | `yAZ5vOpmBus` | +| `_init_tls` | `6NCOqr3cD74` | +| `_malloc_finalize_lv2` | `RnqlvEmvkdw` | +| `_malloc_fini` | `21KFhEQDJ3s` | +| `_malloc_init_lv2` | `20cUk0qX9zo` | +| `_malloc_init` | `z8GPiQwaAEY` | +| `_malloc_postfork` | `V94pLruduLg` | +| `_malloc_prefork` | `aLYyS4Kx6rQ` | +| `_new_setup` | `KNNNbyRieqQ` | +| `_readdir_unlocked` | `-u3XfqNumMU` | +| `_rtld_atfork_pre` | `i-7v8+UGglc` | +| `_rtld_error` | `dmHEVUqDYGw` | +| `_rtld_get_stack_prot` | `AdYYKgtPlqg` | +| `_rtld_thread_init` | `gRw4XrztJ4Q` | +| `_sceLibcGetMallocParam` | `1nZ4Xfnyp38` | +| `_seekdir` | `Do3zPpsXj1o` | +| `backtrace_game` | `jFSmlgyyEUg` | +| `clock_1700` | `n8onIBR4Qdk` | +| `devname_r` | `BIALMFTZ75I` | +| `devname` | `fqLrWSWcGHw` | +| `malloc_initialize` | `owT6zLJxrTs` | +| `Unknown` | `GG6441JdYkA` | +| `Unknown` | `QZ9YgTk+yrE` | +| `Unknown` | `bGuDd3kWVKQ` | +| `Unknown` | `f9LVyN8Ky8g` | +| `Unknown` | `o1Ez0fsXvhI` | +| `Unknown` | `wUqJ0psUjDo` | + ### Unknown function info - [Additional libSceLibcInternal exports](../../../core/libs/prx/libSceLibcInternal/Export.cpp) - the name/NID pairs below are defined exports in the [firmware 13.60 inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/bfec40deb4c47a17d7603ee2bc79aa6862c0c56b/data/firmware-13.60/libscelibcinternal-f9a6d6abff.jsonl). Their ABIs and behaviour are unknown. Parameterless `int` declarations are import-resolution placeholders, not established signatures; every call throws `NotImplemented_nid_no_patch`. @@ -207,3 +515,155 @@ - [_ZNSt13basic_filebufIwSt11char_traitsIwEED2Ev](../../../core/libs/prx/libSceLibcInternal/InventoryExports6.cpp) (libSceLibcInternal, NID `aC9OWBGjvxA`) - listed in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceLibcInternal.c); signature and behavior are unverified, so this parameterless declaration is for import resolution only and throws through `NotImplemented_nid_no_patch` - [_ZNSt3pmr20set_default_resourceEPNS_15memory_resourceE](../../../core/libs/prx/libSceLibcInternal/InventoryExports6.cpp) (libSceLibcInternal, NID `TKYsv0jdvRw`) - listed in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceLibcInternal.c); signature and behavior are unverified, so this parameterless declaration is for import resolution only and throws through `NotImplemented_nid_no_patch` - [_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE5_InitERKSt8_Locinfo](../../../core/libs/prx/libSceLibcInternal/InventoryExports6.cpp) (libSceLibcInternal, NID `cXL+LN0lSwc`) - listed in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceLibcInternal.c); signature and behavior are unverified, so this parameterless declaration is for import resolution only and throws through `NotImplemented_nid_no_patch` + +### Additional PS5 3.20 import declarations + +- [_ZNKSt8ios_base7failure8_DoraiseEv](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `F27xQUBtNdU` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8messagesIcE3getEiiiRKSs](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `XxsPrrWJ52I` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8messagesIcE4openERKSsRKSt6locale](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `U2t+WvMQj8A` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8messagesIcE5closeEi](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `EeBQ7253LkE` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8messagesIcE6do_getEiiiRKSs](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `vbgCuYKySLI` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8messagesIcE7do_openERKSsRKSt6locale](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `HeBwePMtuFs` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8messagesIcE8do_closeEi](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `rRmMX83UL1E` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8messagesIwE3getEiiiRKSbIwSt11char_traitsIwESaIwEE](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `Ea+awuQ5Bm8` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8messagesIwE4openERKSsRKSt6locale](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `TPq0HfoACeI` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8messagesIwE5closeEi](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `GGoH7e6SZSY` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8messagesIwE6do_getEiiiRKSbIwSt11char_traitsIwESaIwEE](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `UM6rGQxnEMg` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8messagesIwE7do_openERKSsRKSt6locale](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `zSehLdHI0FA` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8messagesIwE8do_closeEi](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `AjkxQBlsOOY` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8numpunctIcE11do_groupingEv](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `cnNz2ftNwEU` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8numpunctIcE11do_truenameEv](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `nRf0VQ++OEw` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8numpunctIcE12do_falsenameEv](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `ozLi0i4r6ds` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8numpunctIcE13decimal_pointEv](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `klWxQ2nKAHY` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8numpunctIcE13thousands_sepEv](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `QGSIlqfIU2c` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8numpunctIcE16do_decimal_pointEv](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `JXzQGOtumdM` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8numpunctIcE16do_thousands_sepEv](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `zv1EMhI7R1c` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8numpunctIcE8groupingEv](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `JWplGh2O0Rs` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8numpunctIcE8truenameEv](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `fXUuZEw7C24` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8numpunctIcE9falsenameEv](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `3+VwUA8-QPI` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8numpunctIwE11do_groupingEv](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `2BmJdX269kI` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8numpunctIwE11do_truenameEv](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `nvSsAW7tcX8` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8numpunctIwE12do_falsenameEv](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `-amctzWbEtw` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8numpunctIwE13decimal_pointEv](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `leSFwTZZuE4` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8numpunctIwE13thousands_sepEv](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `2Olt9gqOauQ` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8numpunctIwE16do_decimal_pointEv](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `mzRlAVX65hQ` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8numpunctIwE16do_thousands_sepEv](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `Utj8Sh5L0jE` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8numpunctIwE8groupingEv](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `VsJCpXqMPJU` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8numpunctIwE8truenameEv](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `3M20pLo9Gdk` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8numpunctIwE9falsenameEv](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `LDbKkgI-TZg` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10date_orderEv](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `ShlQcYrzRF8` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_dateES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `T85u2sPrKOo` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_timeES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `73GV+sRHbeY` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_yearES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `dSfKN47p6ac` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11get_weekdayES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `KwJ5V3D0v3A` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE13do_date_orderEv](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `8PIh8BFpNYQ` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE13get_monthnameES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `vvA7HtdtWnY` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14do_get_weekdayES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `xzYpD5d24aA` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE16do_get_monthnameES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `ZuCHPDq-dPw` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmcc](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `+RuThw5axA4` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmcc](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `Vw03kdKZUN0` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE7_GetfmtES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmPKc](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `E7UermPZVcw` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE7_GetintERS3_S5_iiRiRKSt5ctypeIcE](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `8raXTYQ11cg` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_dateES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `OY5mqEBxP+8` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_timeES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `rrqNi95bhMs` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_yearES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `5L5Aft+9nZU` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE10date_orderEv](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `nc6OsiDx630` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_dateES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `SYCwZXKZQ08` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_timeES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `2pJJ0dl-aPQ` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_yearES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `cRSJysDpVl4` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11get_weekdayES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `A0PftWMfrhk` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE13do_date_orderEv](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `dP14OHWe4nI` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE13get_monthnameES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `xy0MR+OOZI8` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14do_get_weekdayES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `hGlkh5YpcKw` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE16do_get_monthnameES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `R1ITHuTUMEI` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmPKwSE_](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `B8c4P1vCixQ` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmcc](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `64pqofAwJEg` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmcc](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `0MzJAexrlr4` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE7_GetfmtES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmPKc](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `r8003V6UwZg` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE7_GetintERS3_S5_iiRiRKSt5ctypeIwE](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `lhJWkEh-HXM` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_dateES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `kwp-0uidHpw` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_timeES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `9TfGnN6xq-U` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_yearES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `Krt-A7EnHHs` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPK2tmPKcSB_](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `j9LU8GsuEGw` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPK2tmcc](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `qkuA-unH7PU` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecPK2tmcc](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `+i81FtUCarA` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewPK2tmPKwSB_](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `Sc0lXhQG5Ko` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewPK2tmcc](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `Nt6eyVKm+Z4` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewPK2tmcc](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `Fr7j8dMsy4s` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt9bad_alloc8_DoraiseEv](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `pS-t9AJblSM` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERSs](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `2fxdcyt5tGs` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERe](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `G84okRnyJJg` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERSs](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `D2njLPpEt1E` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERe](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `IRVqdGwSNXE` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8_GetmfldERS3_S5_bRSt8ios_basePc](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `CLT04GjI7UE` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERSbIwS2_SaIwEE](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `wWIsjOqfcSc` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERe](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `cx-1THpef1A` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERSbIwS2_SaIwEE](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `DhXTD5eM7LQ` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERe](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `zzubCm+nDzc` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8_GetmfldERS3_S5_bRSt8ios_basePw](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `RalOJcOXJJo` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_bRSt8ios_basecRKSs](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `DR029KeWsHw` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_bRSt8ios_basece](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `65cvm2NDLmU` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_bRSt8ios_basecRKSs](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `OR-4zyIi2aE` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_bRSt8ios_basece](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `iXVrhA51z0M` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE8_PutmfldES3_bRSt8ios_basecbSsc](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `d57FDzON1h0` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_bRSt8ios_basewRKSbIwS2_SaIwEE](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `JruBeQgsAaU` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_bRSt8ios_basewe](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `fsF-tGtGsD4` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_bRSt8ios_basewRKSbIwS2_SaIwEE](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `GDiCYtaiUyM` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_bRSt8ios_basewe](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `wVY5DpvU6PU` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE8_PutmfldES3_bRSt8ios_basewbSbIwS2_SaIwEEw](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `r-JSsJQFUsY` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSbIwSt11char_traitsIwESaIwEE5_CopyEmm](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `Ti86LmOKvr0` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSbIwSt11char_traitsIwESaIwEE5eraseEmm](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `TgEb5a+nOnk` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSbIwSt11char_traitsIwESaIwEE6appendERKS2_mm](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `hSUcSStZEHM` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSbIwSt11char_traitsIwESaIwEE6appendEmw](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `nF8-CM+tro4` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSbIwSt11char_traitsIwESaIwEE6assignEPKwm](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `IJmeA5ayVJA` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSbIwSt11char_traitsIwESaIwEE6assignERKS2_mm](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `piJabTDQRVs` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSbIwSt11char_traitsIwESaIwEE6assignEmw](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `8oO55jndPRg` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSbIwSt11char_traitsIwESaIwEE6insertEmmw](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `w2GyuoXCnkw` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSiD0Ev](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `6ZDv6ZusiFg` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSiD1Ev](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `tJU-ttrsXsk` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSo6sentryC2ERSo](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `gVTWlvyBSIc` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSo6sentryD2Ev](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `nk+0yTWvoRE` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSoD0Ev](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `lTTrDj5OIwQ` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSoD1Ev](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `HpCeP12cuNY` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSs5_CopyEmm](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `9HILqEoh24E` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSs5eraseEmm](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `0Ir3jiT4V6Q` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSs6appendERKSsmm](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `qiR-4jx1abE` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSs6appendEmc](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `QqBWUNEfIAo` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSs6assignEPKcm](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `xSxPHmpcNzY` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSs6assignERKSsmm](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `pGxNI4JKfmY` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSs6assignEmc](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `ikjnoeemspQ` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSs6insertEmmc](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `KDgQWX1eDeo` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSt10filesystem10_Copy_fileEPKcS1_](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `PbCV7juCZVo` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSt10filesystem10_File_sizeEPKc](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `SQ02ZA5E-UE` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSt10filesystem11_EquivalentEPKcS1_](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `XD9FmX1mavU` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSt10filesystem12_Current_setEPKc](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `Yl10kSufa5k` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSt10filesystem13_Current_set2EPKc](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `yL8dMdCi4Ys` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSt10filesystem16_Last_write_timeEPKc](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `HCB1auZdcmo` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSt10filesystem18_Xfilesystem_errorEPKcRKNS_4pathES4_St10error_code](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `Wut42WAe7Rw` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSt10filesystem20_Set_last_write_timeEPKcl](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `VSk+sij2mwg` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSt10filesystem5_StatEPKcPNS_5permsE](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `EBwahsMLokw` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSt10filesystem6_LstatEPKcPNS_5permsE](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `o1qlZJqrvmI` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSt10filesystem7_RenameEPKcS1_](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `srwl1hhFoUI` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSt10filesystem7_ResizeEPKcm](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `O4mPool-pow` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSt10filesystem8_StatvfsEPKcRNS_10space_infoE](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `SdKk439pgjg` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSt10moneypunctIcLb0EE7_GetcatEPPKNSt6locale5facetEPKS1_](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `mU88GYCirhI` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSt10moneypunctIcLb0EEC1EPKcm](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `5afBJmEfUQI` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSt10moneypunctIcLb0EEC1ERKSt8_Locinfomb](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `wrR3T5i7gpY` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSt10moneypunctIcLb0EEC1Em](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `tYBLm0BoQdQ` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSt10moneypunctIcLb0EEC2EPKcm](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `aNfpdhcsMWI` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSt10moneypunctIcLb0EEC2ERKSt8_Locinfomb](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `uQFv8aNF8Jc` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSt10moneypunctIcLb0EEC2Em](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `5DFeXjP+Plg` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSt10moneypunctIcLb0EED0Ev](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `sS5fF+fht2c` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSt10moneypunctIcLb0EED1Ev](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `3cW6MrkCKt0` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSt10moneypunctIcLb0EED2Ev](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `mbGmSOLXgN0` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSt10moneypunctIcLb1EE7_GetcatEPPKNSt6locale5facetEPKS1_](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `BuxsERsopss` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSt10moneypunctIcLb1EEC1EPKcm](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `9S960jA8tB0` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSt10moneypunctIcLb1EEC1ERKSt8_Locinfomb](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `TRn3cMU4mjY` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSt10moneypunctIcLb1EEC1Em](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `nbTAoMwiO38` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSt10moneypunctIcLb1EEC2EPKcm](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `RxJnJ-HoySc` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSt10moneypunctIcLb1EEC2ERKSt8_Locinfomb](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `7e3DrnZea-Q` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSt10moneypunctIcLb1EEC2Em](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `kPELiw9L-gw` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSt10moneypunctIcLb1EED0Ev](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `tcdvTUlPnL0` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSt10moneypunctIcLb1EED1Ev](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `wT+HL7oqjYc` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSt10moneypunctIcLb1EED2Ev](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `F7CUCpiasec` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. +- [_ZNSt10moneypunctIwLb0EE7_GetcatEPPKNSt6locale5facetEPKS1_](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - NID `0OjBJZd9VeM` from the PS5 3.20 export inventory; prototype and behavior are unverified. Declaration is for import resolution only. diff --git a/docs/dev/debt/libSceLibreSsl.md b/docs/dev/debt/libSceLibreSsl.md index 447430bb92..99dd5f9578 100644 --- a/docs/dev/debt/libSceLibreSsl.md +++ b/docs/dev/debt/libSceLibreSsl.md @@ -2,12 +2,12 @@ ### Functional -- [SSL_select_next_proto](../../../core/libs/prx/libSceLibreSsl/src/ProtocolSelection.cpp) leaves empty lists, zero-length names and truncated encodings unsupported and throws instead of following the reported firmware behavior. Null outputs also throw; their firmware behavior is unmeasured. [Independent firmware 13.42 evidence](https://github.com/boykopovar/AnyPS5/pull/9785#issuecomment-6406712390) reports host-PC execution of `libSceLibreSsl.sprx` at `0xda6d0`, with matching six-argument valid-list selection, status, borrowed pointer and length. That report also observes negotiation of zero-length entries, unchecked fallback lengths and an empty-supported-list read; these paths remain unsupported here. Null outputs and console-hardware behavior remain unmeasured. The author-sourced signature and valid-list contract follow LibreSSL 3.4.1. +- [SSL_select_next_proto](../../../core/libs/prx/libSceLibreSsl/src/ProtocolSelection.cpp) (libSceLibreSsl) follows LibreSSL 3.4.1 [`ssl_lib.c`](https://github.com/libressl/openbsd/blob/d7513e7d4daf94905fd4cb0a5e5c89109d2874f7/src/lib/libssl/ssl_lib.c), which validates neither list: a zero-length entry is negotiated, no overlap returns `supported + 1` with the unchecked length byte `supported[0]`, read even for an empty supported list, and each pair of entries with equal length bytes is compared over that many bytes, past the end of a truncated list. [Firmware 13.42 host-PC evidence](https://github.com/boykopovar/AnyPS5/pull/9785#issuecomment-6406712390) of `libSceLibreSsl.sprx` (`0xda6d0`) reports the same status, pointer and length for 700,000 valid pairs and for the six unvalidated cases. Null outputs, a null supported list and a null peer list with a non-zero length throw, where the module faults; nothing is measured on a console. - [SHA384_Init and SHA512_Init](../../../core/libs/prx/libSceLibreSsl/src/Digest.cpp) (libSceLibreSsl) - clear the 128-byte block buffer of the context, which LibreSSL 2.5.4 leaves as it was; digests are unaffected. `guest_libressl_oracle` (`ANYPS5_LIBRESSL_ORACLE`) compares the rest of the context with LibreSSL 2.5.4 ### Unknown function info -- [libSceLibreSsl pending exports](../../../core/libs/prx/libSceLibreSsl/Export.cpp) - 293 named callable exports are listed in the [PS5 3.20 export table](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceLibreSsl.c) and were cross-checked against the same module in PS5 firmware 13.60. Their signatures and behaviour are unverified; the declarations use the no-parameter unknown-signature convention and throw through `NotImplemented_nid_no_patch`. +- [libSceLibreSsl pending exports](../../../core/libs/prx/libSceLibreSsl/Export.cpp) - 292 named callable exports are listed in the [PS5 3.20 export table](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceLibreSsl.c) and were cross-checked against the same module in PS5 firmware 13.60. Their signatures and behaviour are unverified; the declarations use the no-parameter unknown-signature convention and throw through `NotImplemented_nid_no_patch`. - [MD4, MD5, SHA1, SHA224, SHA256, SHA384 and SHA512 Init/Update/Final and SHA256](../../../core/libs/prx/libSceLibreSsl/src/Digest.cpp) (libSceLibreSsl) - signatures and context layouts follow the [LibreSSL headers](https://github.com/libressl/openbsd/blob/bc9483725c5815efb64b6d9acc52fc5fba139212/src/lib/libcrypto/sha/sha.h), and buffering and `Final` follow its [sources](https://github.com/libressl/openbsd/tree/bc9483725c5815efb64b6d9acc52fc5fba139212/src/lib/libcrypto/sha); nothing is checked on the console. Null contexts, null input with a nonzero length, null digest buffers in the 32-bit `Final` functions and a buffered byte count that is not below the block size, which LibreSSL does not check, throw - [DES_set_key, DES_ecb_encrypt, DES_set_odd_parity](../../../core/libs/prx/libSceLibreSsl/Export.cpp) (libSceLibreSsl) - the 128-byte `DES_key_schedule` holds the 8-byte key followed by zeros instead of LibreSSL's precomputed subkeys, so a title reading its contents sees different bytes; `DES_ecb_encrypt` derives the subkeys through mbedtls on each call. Not compared with the console. Results follow LibreSSL [des_key.c](https://github.com/libressl/openbsd/blob/bc9483725c5815efb64b6d9acc52fc5fba139212/src/lib/libcrypto/des/des_key.c) and [des.c](https://github.com/libressl/openbsd/blob/bc9483725c5815efb64b6d9acc52fc5fba139212/src/lib/libcrypto/des/des.c): `DES_set_key` skips the parity and weak-key checks and returns 0, as it does while `DES_check_key` is 0 (that variable is not in the PS5 export inventory), a nonzero `enc` encrypts, and `DES_set_odd_parity` sets each byte's low bit for odd parity. Null pointers throw where LibreSSL faults - [X509_verify_cert_error_string](../../../core/libs/prx/libSceLibreSsl/Export.cpp) - no console call is verified. The 64-bit argument, low-32-bit lookup, messages and shared numeric fallback follow [LibreSSL 2.5.4](https://github.com/libressl/openbsd/blob/2e2c612066aa993717528a0249c15c51128d61cb/src/lib/libcrypto/x509/x509_txt.c), the version identified in [published firmware 13.40 measurements](https://github.com/boykopovar/AnyPS5/discussions/8981#discussioncomment-19111214). Console modifications and other firmware versions remain unverified. Unknown-code results share an overwritten static buffer and are not safe for concurrent use, as in that release; code 1 and codes above 54 use the numeric fallback. @@ -24,7 +24,7 @@ - [X509_STORE_CTX_get_error, X509_STORE_CTX_set_error, X509_STORE_CTX_get_error_depth, X509_STORE_CTX_get_current_cert, X509_STORE_CTX_get_chain](../../../core/libs/prx/libSceLibreSsl/src/X509StoreContext.cpp) (libSceLibreSsl) - the 240-byte `X509_STORE_CTX` layout and the results follow [LibreSSL 2.5.4](https://github.com/libressl/openbsd/tree/2e2c612066aa993717528a0249c15c51128d61cb/src/lib/libcrypto/x509) `x509_vfy.h` and `x509_vfy.c`, the version identified in [published firmware 13.40 measurements](https://github.com/boykopovar/AnyPS5/discussions/8981#discussioncomment-19111214); nothing is checked on the console. No export of this module creates or fills a context yet, so only contexts the caller builds reach them. A null context, which LibreSSL dereferences, throws - [X509_STORE_CTX_get_ex_data, X509_STORE_CTX_get1_chain](../../../core/libs/prx/libSceLibreSsl/src/X509StoreContext.cpp) (libSceLibreSsl) - unverified on a PS5, and no export of this module sets ex_data or builds a chain yet. A chain whose count is negative or above its allocation, or that holds a null certificate, throws before copying; LibreSSL 2.5.4 overruns or dereferences it. Otherwise both follow its [x509_vfy.c](https://github.com/libressl/openbsd/blob/2e2c612066aa993717528a0249c15c51128d61cb/src/lib/libcrypto/x509/x509_vfy.c#L1978-L2026): entry `idx` of the ex_data stack as [`CRYPTO_get_ex_data`](https://github.com/libressl/openbsd/blob/2e2c612066aa993717528a0249c15c51128d61cb/src/lib/libcrypto/ex_data.c#L627-L636) reads it, and a chain copied as [`sk_dup`](https://github.com/libressl/openbsd/blob/2e2c612066aa993717528a0249c15c51128d61cb/src/lib/libcrypto/stack/stack.c#L83-L136) copies it, raising each certificate's `references` (`X509` offset 28) by one. - [UI_set_result](../../../core/libs/prx/libSceLibreSsl/src/Ui.cpp) (libSceLibreSsl) - unverified on a PS5, and no export of this module creates a `UI` or `UI_STRING` yet. The "You must type in %d to %d characters" text LibreSSL 2.5.4 attaches to the size errors is not kept, because the error queue holds codes only. A null `UI` or result, or null boolean characters that must be compared, throws; LibreSSL dereferences them. The rest follows its [ui_lib.c](https://github.com/libressl/openbsd/blob/2e2c612066aa993717528a0249c15c51128d61cb/src/lib/libcrypto/ui/ui_lib.c#L816-L879) over the 40-byte `UI` and 64-byte `UI_STRING` of [ui_locl.h](https://github.com/libressl/openbsd/blob/2e2c612066aa993717528a0249c15c51128d61cb/src/lib/libcrypto/ui/ui_locl.h#L104-L148): a result outside the bounds sets `UI_FLAG_REDOABLE` and queues `UI_R_RESULT_TOO_SMALL` or `UI_R_RESULT_TOO_LARGE`. -- [PKCS12_PBE_add, OBJ_cleanup, SSL_load_error_strings](../../../core/libs/prx/libSceLibreSsl/Export.cpp) (libSceLibreSsl) - unverified on a PS5; each returns without an observable effect and queues no error. `OBJ_cleanup` frees no added object, because `OBJ_create` throws and none can exist ([obj_dat.c](https://github.com/libressl/openbsd/blob/2e2c612066aa993717528a0249c15c51128d61cb/src/lib/libcrypto/objects/obj_dat.c#L265-L280)); it must free them once objects can be added. `SSL_load_error_strings` builds no string table, because `ERR_error_string` and `ERR_error_string_n` throw ([ssl_err.c](https://github.com/libressl/openbsd/blob/2e2c612066aa993717528a0249c15c51128d61cb/src/lib/libssl/ssl_err.c#L483-L490)); the tables are needed once a string lookup exists. `PKCS12_PBE_add` is empty in LibreSSL 2.5.4 ([p12_crpt.c](https://github.com/libressl/openbsd/blob/2e2c612066aa993717528a0249c15c51128d61cb/src/lib/libcrypto/pkcs12/p12_crpt.c#L67-L70)). +- [PKCS12_PBE_add, SSL_load_error_strings](../../../core/libs/prx/libSceLibreSsl/Export.cpp) (libSceLibreSsl) - unverified on a PS5; each returns without an observable effect and queues no error. `SSL_load_error_strings` builds no string table, because `ERR_error_string` and `ERR_error_string_n` throw ([ssl_err.c](https://github.com/libressl/openbsd/blob/2e2c612066aa993717528a0249c15c51128d61cb/src/lib/libssl/ssl_err.c#L483-L490)); the tables are needed once a string lookup exists. `PKCS12_PBE_add` is empty in LibreSSL 2.5.4 ([p12_crpt.c](https://github.com/libressl/openbsd/blob/2e2c612066aa993717528a0249c15c51128d61cb/src/lib/libcrypto/pkcs12/p12_crpt.c#L67-L70)). - [EVP_PKEY_type](../../../core/libs/prx/libSceLibreSsl/src/Pkey.cpp) (libSceLibreSsl) - follows the method table of [LibreSSL 2.5.4](https://github.com/libressl/openbsd/blob/2e2c612066aa993717528a0249c15c51128d61cb/src/lib/libcrypto/asn1/ameth_lib.c#L83-L111) `ameth_lib.c` built without GOST and with no engine (every `ENGINE_` export throws): RSA (6) and its alias 19 give 6, the DSA types 66, 67, 70, 113 and 116 give 116, DH (28), EC (408), HMAC (855) and CMAC (894) give themselves, and every other type, the GOST types 811, 815, 946 and 947 included, gives 0. These results match [firmware 13.42's module run natively on a PC](https://github.com/boykopovar/AnyPS5/pull/10398#issuecomment-6406072913) for every type from -1000 to 5000 and the `int` extremes; nothing is checked on the console ### Functional @@ -35,7 +35,9 @@ - [SSL_alert_desc_string_long](../../../core/libs/prx/libSceLibreSsl/Alert.cpp) - Console execution and equivalence across other firmware revisions remain unverified. BunnyFl reports identical strings for 3,841 inputs across three runs against the firmware 13.42 module executed natively on a PC ([comparison](https://github.com/boykopovar/AnyPS5/pull/9870#issuecomment-6406774281)); this is not a console run. The mapping follows LibreSSL 2.5.4. -- [i2t_ASN1_OBJECT](../../../core/libs/prx/libSceLibreSsl/src/ObjectText.cpp) and the [object table](../../../core/libs/prx/libSceLibreSsl/src/ObjectTable.cpp) are unverified on PS5. The 956 objects and their search order are generated from [LibreSSL 2.5.4](https://github.com/libressl/openbsd/tree/2e2c612066aa993717528a0249c15c51128d61cb/src/lib/libcrypto/objects) `objects.txt` and `obj_mac.num` with its `objects.pl` and `obj_dat.pl`, the version string the module holds; LibreSSL 2.7 adds NIDs 956-967, so its `jurisdictionLocalityName`, `jurisdictionStateOrProvinceName` and `jurisdictionCountryName` OIDs print by name there and numerically here. `OBJ_obj2txt` follows 2.5.4 `obj_dat.c`, with objects added at run time left out because no export of this module adds one. A negative buffer length, and a null buffer with a positive length, throw instead of being passed on as a `size_t` +- [i2t_ASN1_OBJECT](../../../core/libs/prx/libSceLibreSsl/src/ObjectText.cpp) and the [object table](../../../core/libs/prx/libSceLibreSsl/src/ObjectTable.cpp) are unverified on PS5. The 956 objects and their search order are generated from [LibreSSL 2.5.4](https://github.com/libressl/openbsd/tree/2e2c612066aa993717528a0249c15c51128d61cb/src/lib/libcrypto/objects) `objects.txt` and `obj_mac.num` with its `objects.pl` and `obj_dat.pl`, the version string the module holds; LibreSSL 2.7 adds NIDs 956-967, so its `jurisdictionLocalityName`, `jurisdictionStateOrProvinceName` and `jurisdictionCountryName` OIDs print by name there and numerically here. `OBJ_obj2txt` follows 2.5.4 `obj_dat.c`, and looks up objects added by `OBJ_create` before the table, as `OBJ_obj2nid` does. A negative buffer length, and a null buffer with a positive length, throw instead of being passed on as a `size_t` + +- [OBJ_create and OBJ_cleanup](../../../core/libs/prx/libSceLibreSsl/src/ObjectCreate.cpp) are unverified on PS5. They follow LibreSSL 2.5.4 [`obj_dat.c`](https://github.com/libressl/openbsd/blob/2e2c612066aa993717528a0249c15c51128d61cb/src/lib/libcrypto/objects/obj_dat.c) and the `a2d_ASN1_OBJECT` parser of `a_object.c`, with its error codes and arcs past 64 bits: each object takes the next NID from 956, the latest object with an encoding wins, and `OBJ_cleanup` drops them all without resetting the NID counter. Added objects live in host memory, so an allocation failure throws instead of queuing `ERR_R_MALLOC_FAILURE`. `OBJ_cleanup` is never deferred: `check_defer` only fires for ciphers or digests with an added NID, which no export registers. Name lookups (`OBJ_sn2nid`, `OBJ_ln2nid`) of added objects are not kept, as no export reads them yet. A null OID text throws where LibreSSL faults - [X509_STORE_new, X509_STORE_free and X509_STORE_set_flags](../../../core/libs/prx/libSceLibreSsl/src/X509Store.cpp) are unverified on PS5. The 136-byte store, 64-byte verify parameters, 56-byte parameter identity, 32-byte stacks and the results follow [LibreSSL 2.5.4](https://github.com/libressl/openbsd/tree/2e2c612066aa993717528a0249c15c51128d61cb/src/lib/libcrypto/x509) `x509_lu.c` and `x509_vpm.c`, the version in [firmware 13.40 measurements](https://github.com/boykopovar/AnyPS5/discussions/8981#discussioncomment-19111214). No export adds a certificate, CRL or policy object, so `X509_STORE_free` throws instead of freeing one and the object cache's comparator throws. A null store or verify parameters, and a null element array behind a positive count, throw where LibreSSL faults diff --git a/docs/dev/debt/libSceLibreSsl3.md b/docs/dev/debt/libSceLibreSsl3.md index f1d9e2c548..7a6b17f51b 100644 --- a/docs/dev/debt/libSceLibreSsl3.md +++ b/docs/dev/debt/libSceLibreSsl3.md @@ -2,21 +2,24 @@ ### Unknown function info -- [libSceLibreSsl3 pending exports](../../../core/libs/prx/libSceLibreSsl3/Export.cpp) - 81 named callable exports, excluding `CRYPTO_memcmp`, `MD5`, `SHA1`, `d2i_ASN1_INTEGER`, `EVP_PKEY_up_ref` and `EC_KEY_up_ref`, remain unimplemented from the [PS5 3.20 export table](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceLibreSsl3.c), cross-checked against the same module in PS5 firmware 13.60. Their signatures and behaviour are unverified; the declarations use the no-parameter unknown-signature convention and throw through `NotImplemented_nid_no_patch`. +- [libSceLibreSsl3 pending exports](../../../core/libs/prx/libSceLibreSsl3/Export.cpp) - 80 named callable exports, excluding `CRYPTO_memcmp`, `MD5`, `SHA1`, `d2i_ASN1_INTEGER`, `EVP_PKEY_up_ref`, `EC_KEY_up_ref` and `RSA_up_ref`, remain unimplemented from the [PS5 3.20 export table](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceLibreSsl3.c), cross-checked against the same module in PS5 firmware 13.60. Their signatures and behaviour are unverified; the declarations use the no-parameter unknown-signature convention and throw through `NotImplemented_nid_no_patch`. ### Functional - [ASN.1 integer decoding](../../../core/libs/prx/libSceLibreSsl3/src/IntegerDecoder.cpp) throws on rejected encodings/allocation failures instead of matching native NULL/error handling. Redundant-sign/empty-content rejection retains old output that the module frees and clears. The decoder does not populate the legacy queue; remaining LibreSSL3 ERR exports throw. [13.42 native-PC evidence](https://github.com/boykopovar/AnyPS5/pull/10948#issuecomment-6412137728), using a recording allocator, confirms tested replacement/free order, allocation cleanup and negative-length NULL returns. Nonnegative null input faults natively and throws here. Console/application-heap ABI and untested error-precedence/overflow combinations remain unverified. Contracts follow [LibreSSL 4.0.0](https://github.com/libressl/openbsd/tree/ce488b78e0bd994780569df718596b9776ff681a/src/lib/libcrypto/asn1). Closes when: error/replacement semantics and console/allocator interoperability are verified. - [CRYPTO_memcmp](../../../core/libs/prx/libSceLibreSsl3/Export.cpp) follows the public [LibreSSL signature and equality contract](https://man.openbsd.org/CRYPTO_memcmp.3), without PS5 verification. The exact nonzero result for unequal buffers is unspecified by that contract. Content-independent execution of its volatile byte reads still depends on the compiler; inspect optimized code when changing toolchains. Closes when: measured on a PS5 and the supported toolchains' generated code is checked. - [MD5 and SHA1](../../../core/libs/prx/libSceLibreSsl3/src/Digest.cpp) (libSceLibreSsl3) - follow LibreSSL's [md5.c, sha1.c](https://github.com/libressl/openbsd/tree/bc9483725c5815efb64b6d9acc52fc5fba139212/src/lib/libcrypto) and hash through libSceLibreSsl's `MD5_*` and `SHA1_*`. A null digest buffer, which LibreSSL 4.0.0 does not check, throws. Nothing is checked on the console -- [EVP_PKEY_up_ref and EC_KEY_up_ref](../../../core/libs/prx/libSceLibreSsl3/src/Key.cpp) - console layouts and retain/release interoperability are unverified. The 32-byte EVP and 64-byte EC layouts, with counters at offsets 4 and 48, follow [LibreSSL 4.0.0](https://github.com/libressl/openbsd/tree/ce488b78e0bd994780569df718596b9776ff681a/src/lib/libcrypto) `evp/evp_local.h`, `evp/p_lib.c`, `ec/ec_local.h` and `ec/ec_key.c`. Atomic retains replace its internal mutex; future releases must synchronize with the same counters. With no key constructors/destructors in this module, tests use caller-owned objects without validating allocator or destruction compatibility. Null keys and signed-counter overflow, undefined upstream, throw without mutation. Closes when: console layouts and lifetime interoperability are measured. +- [EVP_PKEY_up_ref, EC_KEY_up_ref and RSA_up_ref](../../../core/libs/prx/libSceLibreSsl3/src/Key.cpp) - console layouts and retain/release interoperability are unverified. The 32-byte EVP, 64-byte EC and 152-byte RSA layouts, with counters at offsets 4, 48 and 104, follow [LibreSSL 4.0.0](https://github.com/libressl/openbsd/tree/ce488b78e0bd994780569df718596b9776ff681a/src/lib/libcrypto) `evp/evp_local.h`, `evp/p_lib.c`, `ec/ec_local.h`, `ec/ec_key.c`, `rsa/rsa_local.h` and `rsa/rsa_lib.c`; the RSA layout has no `engine` field, unlike libSceLibreSsl's `LibreSslRsa`. Atomic retains replace its internal mutex; future releases must synchronize with the same counters. With no key constructors/destructors in this module, tests use caller-owned objects without validating allocator or destruction compatibility. Null keys and signed-counter overflow, undefined upstream, throw without mutation. Closes when: console layouts and lifetime interoperability are measured. - [Parent export forwarding](../../../core/libs/prx/libSceLibreSsl3/ParentExports.cpp) exposes 395 parent-library exports on Windows through IAT tail jumps without changing their ABI. Non-Windows hosts use their existing dependency lookup. Static COFF inspection verifies names, parent imports and tail jumps; Windows loading and runtime behavior remain unverified. Parent functions retain their existing implementation limitations. +- [EVP_MD_CTX_md](../../../core/libs/prx/libSceLibreSsl3/src/DigestContext.cpp) (libSceLibreSsl3) - nothing is checked on the console. As in [LibreSSL 4.0.0](https://github.com/libressl/openbsd/blob/ce488b78e0bd994780569df718596b9776ff681a/src/lib/libcrypto/evp/evp_digest.c) `evp_digest.c`, a null context returns null and any other returns its first field, `digest`. That field is first in 4.0.0's `evp_local.h` and in the [2.5.4 layout](https://github.com/libressl/openbsd/blob/2e2c612066aa993717528a0249c15c51128d61cb/src/lib/libcrypto/evp/evp.h) of the contexts the forwarded libSceLibreSsl exports handle; the layouts differ after it, so the context and digest are declared opaque. Closes when: compared with the console. +- [EVP_CIPHER_key_length and EVP_CIPHER_iv_length](../../../core/libs/prx/libSceLibreSsl3/src/Cipher.cpp) (libSceLibreSsl3) - nothing is checked on the console. They return `key_len` and `iv_len` from the 80-byte `EVP_CIPHER` of [LibreSSL 4.0.0](https://github.com/libressl/openbsd/tree/ce488b78e0bd994780569df718596b9776ff681a/src/lib/libcrypto/evp) `evp_local.h` and `evp_cipher.c`. The fields are at offsets 8 and 12, as in the [2.5.4 layout](https://github.com/libressl/openbsd/blob/2e2c612066aa993717528a0249c15c51128d61cb/src/lib/libcrypto/evp/evp.h) of the ciphers the forwarded libSceLibreSsl exports handle. A null cipher, which LibreSSL dereferences, throws. Closes when: compared with the console. +- [X509_VERIFY_PARAM_set_flags](../../../core/libs/prx/libSceLibreSsl3/src/X509VerifyParam.cpp) (libSceLibreSsl3) - nothing is checked on the console. It ORs the flags into `flags` and returns 1, as both [LibreSSL 2.5.4](https://github.com/libressl/openbsd/blob/2e2c612066aa993717528a0249c15c51128d61cb/src/lib/libcrypto/x509/x509_vpm.c) and [4.0.0](https://github.com/libressl/openbsd/blob/ce488b78e0bd994780569df718596b9776ff681a/src/lib/libcrypto/x509/x509_vpm.c) `x509_vpm.c` do. They differ when `EXPLICIT_POLICY`, `INHIBIT_ANY` or `INHIBIT_MAP` is set while `POLICY_CHECK` is neither set nor requested: 2.5.4 also adds `POLICY_CHECK` and 4.0.0 does not. The console's choice is unknown, so that case throws through `NotImplemented_nid_no_patch` and leaves the parameters unchanged. It writes libSceLibreSsl's 2.5.4 `LibreSslX509VerifyParam`, whose `flags` is at offset 24 as in 4.0.0. Null parameters throw. Closes when: the console's policy behaviour is measured. - [sk_new, sk_push and sk_free](../../../core/libs/prx/libSceLibreSsl3/src/Stack.cpp) (libSceLibreSsl3) - follow [LibreSSL 4.0.0](https://github.com/libressl/openbsd/blob/ce488b78e0bd994780569df718596b9776ff681a/src/lib/libcrypto/stack/stack.c) `stack.c` with libSceLibreSsl's 32-byte `_STACK` layout, which `stack_local.h` keeps there. Stacks and element arrays come from the guest heap, so the forwarded `sk_pop_free` can release them. Nothing is checked on the console. Where LibreSSL faults or overflows, they throw: `sk_push` on a null stack, on a negative element count, on a null element array it does not regrow, or when the element array cannot double without overflowing `int` ### Additional callable export inventory -- [Additional exports](../../../core/libs/prx/libSceLibreSsl3/AdditionalExports.cpp) declare 180 callable exports: 54 named and 126 known only by NID. Every entry throws. Parameterless `int` declarations are unknown-signature placeholders, not verified ABI contracts. Names/NIDs match the 13.60 export table. No functional implementation or title unblock is claimed. +- [Additional exports](../../../core/libs/prx/libSceLibreSsl3/AdditionalExports.cpp) declare 176 callable exports: 50 named and 126 known only by NID. Every entry throws. Parameterless `int` declarations are unknown-signature placeholders, not verified ABI contracts. Names/NIDs match the 13.60 export table. No functional implementation or title unblock is claimed. | Name | NID | | --- | --- | @@ -42,7 +45,6 @@ | `unknown` | `44M+SEbpNdQ` | | `unknown` | `4Q3bvOy4LY8` | | `unknown` | `4pEl-5DmrrM` | -| `EVP_CIPHER_iv_length` | `4ryyfC3TknU` | | `SSL_set_accept_state` | `5BoCLZK9mGk` | | `unknown` | `5DhOJmgra8E` | | `unknown` | `5NBoRJYLH0U` | @@ -55,7 +57,6 @@ | `unknown` | `8kct4CSWwOA` | | `tls_configure` | `8pwP-7j5UZI` | | `X509_STORE_CTX_get0_param` | `8wroYNJAQpo` | -| `X509_VERIFY_PARAM_set_flags` | `9E9Gr4FLIE4` | | `unknown` | `A-Hs-8mau+8` | | `unknown` | `A0lZtFjhcTw` | | `unknown` | `A65b+ZhOt9k` | @@ -76,7 +77,6 @@ | `unknown` | `GFEaREp1UFw` | | `EVP_PKEY_get0_EC_KEY` | `GY2X+VHs568` | | `unknown` | `GjO5Ap3E-t4` | -| `EVP_MD_CTX_md` | `H1dRCduUy+o` | | `unknown` | `HE-vihq-KKw` | | `EVP_PKEY_verify` | `HEuvmk+aHs4` | | `unknown` | `IOutZPRNNPo` | @@ -166,7 +166,6 @@ | `EVP_PKEY_derive_set_peer` | `ovH4WphWIQQ` | | `unknown` | `pW329hq95Hc` | | `unknown` | `pdxCm9+CCc4` | -| `EVP_CIPHER_key_length` | `qAG7o03bkkM` | | `unknown` | `qGsc6uT6p1E` | | `EVP_PKEY_verify_init` | `qseLIVbdvMQ` | | `unknown` | `rJZ-aiNIYCA` | diff --git a/docs/dev/debt/libSceLoginMgrServer.md b/docs/dev/debt/libSceLoginMgrServer.md index 3faa72d0ee..37140bc947 100644 --- a/docs/dev/debt/libSceLoginMgrServer.md +++ b/docs/dev/debt/libSceLoginMgrServer.md @@ -1,5 +1,17 @@ # libSceLoginMgrServer technical debt +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceLoginMgrServer/Export.cpp) - 5 entries present in both version-labelled images are import-resolution declarations only. Neither label independently authenticates retail firmware provenance. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `GzbYqYyRTBg` | +| `Unknown` | `M1h7vFE7Hm0` | +| `Unknown` | `NvO5e-NOkXU` | +| `Unknown` | `T7HQTX-ylss` | +| `Unknown` | `uD-Sde+R4D8` | + ### Unknown function info - [sceLoginMgrServerCheckSafetyNoticeShown, sceLoginMgrServerClearMorpheusRequiredUserId, sceLoginMgrServerConvertToUserId, sceLoginMgrServerCreateUser, sceLoginMgrServerDestroyUser, sceLoginMgrServerDialogGetAppId, sceLoginMgrServerDialogGetOpenParam, sceLoginMgrServerDialogNotifyCloseFinished, sceLoginMgrServerDialogNotifyOpenFinished, sceLoginMgrServerDialogSetResult, sceLoginMgrServerGetLogoutInfo, sceLoginMgrServerGetMorpheusRequiredUserId, sceLoginMgrServerGetSharePlayAllowPadOperation, sceLoginMgrServerInitialize, sceLoginMgrServerInitializeSharePlayAllowPadOperation, sceLoginMgrServerIsRequestedCdlgClose, sceLoginMgrServerLoginServiceGetRequestParam, sceLoginMgrServerLoginServiceNotifyRequestFinished, sceLoginMgrServerNotifyEasySignInFinished, sceLoginMgrServerNotifyEasySignInUserCode, sceLoginMgrServerNotifyHmdConnectInfo, sceLoginMgrServerNotifySafetyNoticeShown, sceLoginMgrServerNotifyShellUIState, sceLoginMgrServerSetLoginFlag, sceLoginMgrServerSetMorpheusAssignEnabledFlag, sceLoginMgrServerSetMorpheusRequiredUserId, sceLoginMgrServerSetSharePlayMode, sceLoginMgrServerSetUserStatus, sceLoginMgrServerTerminate and sceLoginMgrServerUpdateUserIdRalatedToPadUniqueId](../../../core/libs/prx/libSceLoginMgrServer/Export.cpp) (libSceLoginMgrServer) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceLoginMgrServer.c), but no credible prototypes were found. The declarations have no parameters solely to resolve known imports; this is not an ABI claim and callers must not call them until signatures are verified diff --git a/docs/dev/debt/libSceM4aacEnc.md b/docs/dev/debt/libSceM4aacEnc.md index fbb1f5292f..4d595b0551 100644 --- a/docs/dev/debt/libSceM4aacEnc.md +++ b/docs/dev/debt/libSceM4aacEnc.md @@ -1,5 +1,10 @@ # libSceM4aacEnc technical debt +### Additional callable exports + +- [M4aac encoder export `dyjd6gEaAXw`](../../../core/libs/prx/libSceM4aacEnc/Export.cpp) is a function record with qualifier `D#A` in older and later version-labelled modules. Both map library ID 3 and module ID 0 to `libSceM4aacEnc`. Older module words: `0x08540001`, `0x03200004`; later: `0x13590001`, `0x13600007`. Both contain 18 function NIDs; sorted-LF SHA-256: `b60081c1301a28b192a54d084092ac13164556129b70ee7aa92407ff24256115`, using the [static ELF membership procedure](https://github.com/boykopovar/AnyPS5/pull/12367#issuecomment-6470603298). Labels do not authenticate retail provenance; the digest identifies the NID set only. Independent verification requires a matching image. The name, signature and behavior are unverified; this declaration throws. + + ### Unknown function info - [libSceM4aacEnc](../../../core/libs/prx/libSceM4aacEnc/Export.cpp) (libSceM4aacEnc, sysmodule id `0x000000bc`) has no encoder, so all seventeen exports throw. PPSA03332 imports them and fails to load (`libSceM4aacEnc.prx: cannot open shared object file`) when the library is absent. The names are from the aerolib NID list: `sceM4aacEncClearContext`, `sceM4aacEncClearContextEx`, `sceM4aacEncCreateEncoder`, `sceM4aacEncCreateEncoderEx`, `sceM4aacEncDeleteEncoder`, `sceM4aacEncDeleteEncoderEx`, `sceM4aacEncEncode`, `sceM4aacEncEncodeEx`, `sceM4aacEncEncodeWithPriority`, `sceM4aacEncEncodeWithPriorityEx`, `sceM4aacEncFlush`, `sceM4aacEncFlushEx`, `sceM4aacEncFlushWithPriority`, `sceM4aacEncFlushWithPriorityEx`, `sceM4aacEncGetContext`, `sceM4aacEncInitialize` and `sceM4aacEncTerminate` diff --git a/docs/dev/debt/libSceMbus.md b/docs/dev/debt/libSceMbus.md index 0b1429bfc7..89c4ff5e82 100644 --- a/docs/dev/debt/libSceMbus.md +++ b/docs/dev/debt/libSceMbus.md @@ -16,7 +16,9 @@ - [sceMbusAddHandleByDeviceId](../../../core/libs/prx/libSceMbus/PendingExports.cpp): the six-argument ABI is confirmed, including the 64-bit device ID. The meanings of the last three 32-bit fields require the device-service backend. -- [sceMbus control and handle registration](../../../core/libs/prx/libSceMbus/PendingExports.cpp): argument positions and transmitted widths are recovered for control acquisition, handle registration, process attachment, user binding and device-ID conversion. Several scalar field meanings still depend on the service protocol; the 64-bit control value and unnamed registration fields must not be interpreted as pointers. AcquireControlList returns a constant error without reading its incoming arguments, so its source signature remains unresolved. +- [sceMbusConvertToLocalDeviceId, sceMbusConvertToMbusDeviceId and sceMbusConvertToLocalDeviceId2](../../../core/libs/prx/libSceMbus/PendingExports.cpp): follow firmware 13.42's libSceMbus.sprx, read from disassembly and compared under a CPU emulator, not measured on a console. A device ID holds a 48-bit local ID with the device class in the top 16 bits. sceMbusConvertToLocalDeviceId keeps only the low 32 bits of the local ID. sceMbusConvertToMbusDeviceId converts only classes 0x10 and 0x20 and returns 0x809B0008 for any other. sceMbusConvertToLocalDeviceId2 returns the low 48 bits when the class equals the identifier's top 16 bits; any other class throws, because the module then asks the Mbus service to translate the identifier and writes the output only when the service succeeds, and this project has no Mbus service. + +- [sceMbus control and handle registration](../../../core/libs/prx/libSceMbus/PendingExports.cpp): argument positions and transmitted widths are recovered for control acquisition, handle registration, process attachment and user binding. Several scalar field meanings still depend on the service protocol; the 64-bit control value and unnamed registration fields must not be interpreted as pointers. AcquireControlList returns a constant error without reading its incoming arguments, so its source signature remains unresolved. - [sceMbus debug process and device queries](../../../core/libs/prx/libSceMbus/PendingExports.cpp): process information is transmitted as 16 bytes, startup input/output as eight bytes, control status as 24 bytes, internal information as 2832 bytes and priority information as 3088 bytes. Device enumeration writes a 32-bit count followed by 396-byte entries. These pointee fields and the semantics of unnamed process flags remain unresolved; declarations use distinct incomplete types instead of guessing their fields. diff --git a/docs/dev/debt/libSceMetadataReaderWriter.md b/docs/dev/debt/libSceMetadataReaderWriter.md index 297daf5a49..64397d0502 100644 --- a/docs/dev/debt/libSceMetadataReaderWriter.md +++ b/docs/dev/debt/libSceMetadataReaderWriter.md @@ -1,5 +1,20 @@ # libSceMetadataReaderWriter technical debt +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceMetadataReaderWriter/Export.cpp) - 6 entries present in both version-labelled images are import-resolution declarations only. Neither label independently authenticates retail firmware provenance. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Data exports require separate layout and ownership analysis. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `2oFr2hbrkRs` | +| `Unknown` | `ElB1bNKymPg` | +| `Unknown` | `GCOzTsybYr0` | +| `Unknown` | `Ly4V1dsyKCA` | +| `Unknown` | `YeIbFGmyUVM` | +| `Unknown` | `ckVz4iaNj4E` | + +- [Older callable NIDs](../../../core/libs/prx/libSceMetadataReaderWriter/Export.cpp): 2 unidentified exports have unverified names, signatures and behavior. These are throwing import-resolution placeholders; no functionality is implemented. No matching NIDs were found in the later module inventory. + ### Unknown function info - [_ZN23sceMetadataReaderWriter10initializeEv, _ZN23sceMetadataReaderWriter11getMimeTypeERKSsRSt6vectorIjSaIjEE, _ZN23sceMetadataReaderWriter12getMimeTypesERKSsiPi, _ZN23sceMetadataReaderWriter12readMetadataERKSsRKNS_8MetadataEjRS2_, _ZN23sceMetadataReaderWriter13writeMetadataERKSsRKNS_8MetadataEj](../../../core/libs/prx/libSceMetadataReaderWriter/Export.cpp) - names and NIDs match the [PS5 3.20 inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceMetadataReaderWriter.c); signatures and behavior are unverified. No-parameter declarations resolve imports and throw through `NotImplemented_nid_no_patch` when called. diff --git a/docs/dev/debt/libSceNKWeb.md b/docs/dev/debt/libSceNKWeb.md index 5b311c43ed..b1e70144a0 100644 --- a/docs/dev/debt/libSceNKWeb.md +++ b/docs/dev/debt/libSceNKWeb.md @@ -3,3 +3,13 @@ ### Functional - [sceNKWebInitialize and sceNKWebTerminate](../../../core/libs/prx/libSceNKWeb/Export.cpp) remain throwing stubs. Both native exports take no input arguments and return a 32-bit status; decompiler SIMD parameters are unused register propagation through initialization and cleanup helpers. + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceNKWeb/Export.cpp) - 3 entries observed in the 3.20 export inventory and present in the later 13.60-labelled inventory are import-resolution declarations only. The later inventory label does not authenticate a retail firmware version. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Data exports require separate layout and ownership analysis. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `HTKKQjsQMiQ` | +| `Unknown` | `HvqTa7FlgMI` | +| `Unknown` | `q+Emt1gYris` | diff --git a/docs/dev/debt/libSceNKWebKit.md b/docs/dev/debt/libSceNKWebKit.md index 26cf3c9683..787e89801b 100644 --- a/docs/dev/debt/libSceNKWebKit.md +++ b/docs/dev/debt/libSceNKWebKit.md @@ -1,156 +1,48 @@ # libSceNKWebKit technical debt +### Unknown function info + +- [WebKit API objects](../../../core/libs/prx/libSceNKWebKit/src/Object.hpp) (libSceNKWebKit) - `WK*` objects are host objects numbered with `API::Object::Type` as [APIObject.h](https://github.com/neonmodder123/PS5-WebKit-11.x/blob/80f77e94c63ee7202eec3d4b5b1a021dd89011ba/Source/WebKit/Shared/API/APIObject.h) builds for PlayStation, with ApplicationManifest, InspectorExtension, WebExtension and WebAuthn types off and PopupMenuItem and AccessibilityObject on per [OptionsPlayStation.cmake](https://github.com/neonmodder123/PS5-WebKit-11.x/blob/80f77e94c63ee7202eec3d4b5b1a021dd89011ba/Source/cmake/OptionsPlayStation.cmake); the console module version, its type numbers and its object layouts are unverified, so these objects cannot be passed to a console WebKit module. A null or wrong-type reference throws where WebKit dereferences it. +- [WTF and WebCore value layouts](../../../core/libs/prx/libSceNKWebKit/src/WtfStringAbi.hpp) (libSceNKWebKit) - `WTF::String`, `StringImpl`, `StringView`, `CString`, `URL` and the WebCore geometry, transform and `Color` layouts follow the release 64-bit headers at the [pinned source](https://github.com/neonmodder123/PS5-WebKit-11.x/blob/80f77e94c63ee7202eec3d4b5b1a021dd89011ba/Source/WTF/wtf/text/StringImpl.h) and are pinned with `static_assert`; they are tested on Windows, not against console binaries. `StringImpl::destroy`, atom and symbol strings and external buffers still throw, so a string whose last reference guest code drops terminates. +- [Media preferences](../../../core/libs/prx/libSceNKWebKit/src/Preferences.cpp) (libSceNKWebKit) - unset `MediaSourceEnabled`, `EncryptedMediaAPIEnabled` and `SourceBufferChangeTypeEnabled` getters throw, and feature-key setters for `EncryptedMediaAPIEnabled`, `SourceBufferChangeTypeEnabled` and `WebMParserEnabled` throw, because the PlayStation media player configuration behind `ENABLE_MEDIA_SOURCE` and `ENABLE_ENCRYPTED_MEDIA` is not in the pinned source. Other defaults evaluate [UnifiedWebPreferences.yaml](https://github.com/neonmodder123/PS5-WebKit-11.x/blob/80f77e94c63ee7202eec3d4b5b1a021dd89011ba/Source/WTF/Scripts/Preferences/UnifiedWebPreferences.yaml) for PlayStation; downstream console overrides are unverified. + +### Functional + +- [JavaScriptCore C API](../../../core/libs/prx/libSceNKWebKit/src/JscContext.cpp) (libSceNKWebKit) - `JS*` runs on QuickJS-NG (`3rdparty/quickjs`), not JavaScriptCore: there is no JIT and no conservative stack scan, and error messages, stack traces and property order come from QuickJS. An unprotected `JSObjectRef` held only in a native variable or heap structure across `JSGarbageCollect` is collected, where JavaScriptCore keeps it through its stack scan; `JSValueProtect`, a marking constraint, a JavaScript reference or an active callback frame keep it alive. `JSStringRef` values are `libSceJsc` strings. +- [Dictionary key order](../../../core/libs/prx/libSceNKWebKit/src/Dictionary.cpp) (libSceNKWebKit) - `WKDictionaryCopyKeys` returns keys sorted by UTF-16 code unit, not in the `WTF::HashMap` iteration order of [WKDictionary.cpp](https://github.com/neonmodder123/PS5-WebKit-11.x/blob/80f77e94c63ee7202eec3d4b5b1a021dd89011ba/Source/WebKit/Shared/API/c/WKDictionary.cpp). +- [Out-of-line colors](../../../core/libs/prx/libSceNKWebKit/src/WebCoreColor.cpp) (libSceNKWebKit) - `WebCore::Color` operations on an out-of-line value (extended color spaces in [Color.h](https://github.com/neonmodder123/PS5-WebKit-11.x/blob/80f77e94c63ee7202eec3d4b5b1a021dd89011ba/Source/WebCore/platform/graphics/Color.h)) throw; only inline 8-bit sRGBA values are handled. +- [WTF host services](../../../core/libs/prx/libSceNKWebKit/src/WtfSystem.cpp) (libSceNKWebKit) - `fastMalloc`, `bmalloc` and Gigacage allocations come from the host allocator, and `numberOfProcessorCores`, `ramSize`, the clocks and random values come from the host, not the console; they throw when the host cannot answer. `WTFCrash` and failed assertions abort the process. + ### Known export names; ABI prototypes unverified -- The 150 WebCore, WebKit C API, JavaScriptCore, Inspector and WTF exports in [Export.cpp](../../../core/libs/prx/libSceNKWebKit/Export.cpp) are present in the PS5 3.20 `libSceNKWebKit` export inventory from [PS5-3.20_Libs](https://github.com/DNNDHH/PS5-3.20_Libs). Each is named after the symbol the [verified NID name database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) gives for its NID, and the NID of that name matches. Prototypes and behavior are unverified; each uses the no-parameter import-resolution convention and throws through `NotImplemented_nid_no_patch`. These declarations make no ABI or behavior claim. +- The 131 remaining WebCore, WebKit C API, JavaScriptCore, Inspector and WTF exports in [Export.cpp](../../../core/libs/prx/libSceNKWebKit/Export.cpp) are present in the PS5 3.20 `libSceNKWebKit` export inventory from [PS5-3.20_Libs](https://github.com/DNNDHH/PS5-3.20_Libs). Each is named after the symbol the [verified NID name database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) gives for its NID, and the NID of that name matches. Prototypes and behavior are unverified; each uses the no-parameter import-resolution convention and throws through `NotImplemented_nid_no_patch`. These declarations make no ABI or behavior claim. + +### Older callable exports + +- [Older callable exports](../../../core/libs/prx/libSceNKWebKit/Export.cpp) - 2393 3.20 callable NIDs are declared as throwing placeholders. Their prototypes and behavior are unverified; parameterless `int` declarations are not verified ABI contracts. These NIDs do not appear in the later version-labelled module inventory; no cross-version identity or functional behavior is claimed. Exports shared with other older modules require separate provider analysis. ### Additional callable exports - The [revision-pinned identity inventory](https://gist.github.com/kyon-eth/d44995f181e1818977bd38f0e6fc0f34/8afcb14b0707a09b6274ff7f7bcf33ef46cfe2e7) records the module, library, symbol type and NIDs for the declarations in [Export.cpp](../../../core/libs/prx/libSceNKWebKit/Export.cpp); it is a metadata summary rather than independent verification. For the 255 absent from the public catalogue, [per-image ELF records](https://gist.github.com/kyon-eth/147be8dd556e9cced2577ccbed548972/1a659ecfe819e724675991a574a1aebb5fbb48e5) include the raw qualified names, module and library identities, symbol type, values and sizes; the record file SHA-256 is `44bdc4d6073192a8f41b7be359b75364b3d41dbbd11ce649924b8cebdd4ffe51`. Image labels are not authenticated. -- [Additional callable exports](../../../core/libs/prx/libSceNKWebKit/Export.cpp) - 8703 declarations throw through `NotImplemented_nid_no_patch`; signatures and behavior are unverified. The later 13.60-labelled image contains all 8703; 8448 match the public 3.20 catalogue, while 255 are absent and their presence in retail 3.20 is unverified. Per-image records show the latter in a separate 3.20-labelled image, but neither image label is authenticated. Identified names match NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). Data exports need separate analysis. +- [Additional callable exports](../../../core/libs/prx/libSceNKWebKit/Export.cpp) - 7574 of the 8703 inventory declarations listed below throw through `NotImplemented_nid_no_patch`; signatures and behavior are unverified. The later 13.60-labelled image contains all 8703; 8448 match the public 3.20 catalogue, while 255 are absent and their presence in retail 3.20 is unverified. Per-image records show the latter in a separate 3.20-labelled image, but neither image label is authenticated. Identified names match NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). Data exports need separate analysis. | Name | NID | | --- | --- | -| `JSCheckScriptSyntax` | `C54iMS8+tl8` | -| `JSClassCreate` | `DSTJsRjpDeg` | -| `JSClassRelease` | `TyyaYni97vQ` | -| `JSClassRetain` | `mrLkr3Hr0SM` | | `JSContextCreateBacktrace` | `s77ZLU-juKw` | -| `JSContextGetGlobalContext` | `ovzOMwvVgTY` | -| `JSContextGetGlobalObject` | `RJW3AojPP1A` | -| `JSContextGetGroup` | `DQ435HoiiJc` | -| `JSContextGroupAddHeapFinalizer` | `MpD0hOKBNJE` | -| `JSContextGroupAddMarkingConstraint` | `XoZqM9IBP+M` | -| `JSContextGroupClearExecutionTimeLimit` | `Gt6fMQroxAY` | -| `JSContextGroupCreate` | `eCbNVDFzGCs` | -| `JSContextGroupRelease` | `FZyUhOcX-LA` | -| `JSContextGroupRemoveHeapFinalizer` | `gvAxvGQwxCg` | -| `JSContextGroupRetain` | `FrWdTOjaiOA` | -| `JSContextGroupSetExecutionTimeLimit` | `BZj-LE0sIHA` | -| `JSDisableGCTimer` | `qS85SeRSd8A` | -| `JSEvaluateScript` | `YssF41MWxCU` | -| `JSGarbageCollect` | `V8bfkfmBVxo` | -| `JSGetMemoryUsageStatistics` | `cjk-Cdurz2c` | -| `JSGlobalContextCopyName` | `KtU8gRo-GLg` | -| `JSGlobalContextCreate` | `8S9bwpVSMvI` | -| `JSGlobalContextCreateInGroup` | `kQ0tHfaz-R4` | -| `JSGlobalContextGetIncludesNativeCallStackWhenReportingExceptions` | `Vj3x-1To4sQ` | -| `JSGlobalContextGetRemoteInspectionEnabled` | `hBhzSRNLEYc` | -| `JSGlobalContextRelease` | `b+Bla9TTD04` | -| `JSGlobalContextRetain` | `5F4qWfh3NsI` | -| `JSGlobalContextSetIncludesNativeCallStackWhenReportingExceptions` | `GeJKliDKddg` | -| `JSGlobalContextSetName` | `I0PkxCo7wxQ` | -| `JSGlobalContextSetRemoteInspectionEnabled` | `H0WTMJD9+jM` | -| `JSGlobalContextSetUnhandledRejectionCallback` | `8-gHRL4zbd8` | -| `JSObjectCallAsConstructor` | `f9xif4l1ZhU` | -| `JSObjectCallAsFunction` | `lgC8W0Qu1iw` | -| `JSObjectCopyPropertyNames` | `Lcwli-n-8mE` | -| `JSObjectDeletePrivateProperty` | `HjmOQPiuspU` | -| `JSObjectDeletePropertyForKey` | `1dmShONVJEc` | -| `JSObjectDeleteProperty` | `KGxAOGkXt7s` | -| `JSObjectGetArrayBufferByteLength` | `uAyWBZtHkgM` | -| `JSObjectGetArrayBufferBytesPtr` | `FEU0ygVamU4` | -| `JSObjectGetGlobalContext` | `ORtxNAsujC8` | -| `JSObjectGetPrivate` | `MH3ye94AkZc` | -| `JSObjectGetPrivateProperty` | `B8nHW0+LrJ8` | -| `JSObjectGetPropertyAtIndex` | `lOYH420riKo` | -| `JSObjectGetPropertyForKey` | `tPzhAGqQaD4` | -| `JSObjectGetProperty` | `pNliRQzOktU` | -| `JSObjectGetPrototype` | `ytHFpyVl7gw` | -| `JSObjectGetProxyTarget` | `akCszAlMQQY` | -| `JSObjectGetTypedArrayBuffer` | `8D2GMMAmpC8` | -| `JSObjectGetTypedArrayByteLength` | `IkiI5iE7d98` | -| `JSObjectGetTypedArrayByteOffset` | `X9GXg6Y4eFU` | -| `JSObjectGetTypedArrayBytesPtr` | `I-OpF7lc-YM` | -| `JSObjectGetTypedArrayLength` | `klL8TZWRUGk` | -| `JSObjectHasProperty` | `35hf1B8ev14` | -| `JSObjectIsConstructor` | `8ATBwVI+xfE` | -| `JSObjectIsFunction` | `gcsP-2FEZIk` | -| `JSObjectMakeArrayBufferWithBytesNoCopy` | `ME5vQjjzBNg` | -| `JSObjectMakeArray` | `o3bxF-l3DoQ` | -| `JSObjectMakeConstructor` | `GxotrjFiHnc` | -| `JSObjectMakeDate` | `cfJhLH8uj4k` | -| `JSObjectMakeDeferredPromise` | `QFx5cPYgu3U` | -| `JSObjectMakeError` | `JdoZDRANNUE` | -| `JSObjectMakeFunction` | `94PPEKa0QsQ` | -| `JSObjectMakeFunctionWithCallback` | `Tm9bXhmwlMA` | -| `JSObjectMakeRegExp` | `42JsosEueOQ` | -| `JSObjectMakeTypedArrayWithArrayBuffer` | `7jXS0r9rkLg` | -| `JSObjectMakeTypedArrayWithArrayBufferAndOffset` | `y9rpICKLMcw` | -| `JSObjectMakeTypedArrayWithBytesNoCopy` | `94NTgVHUaE8` | -| `JSObjectMakeTypedArray` | `s5Jgo6yw-o0` | -| `JSObjectMake` | `vtHRQyWv+sw` | -| `JSObjectSetPrivateProperty` | `zQbA-QPfK4I` | -| `JSObjectSetPropertyAtIndex` | `tr1Uc33FqHY` | -| `JSObjectSetPropertyForKey` | `onh8ugUeSQM` | -| `JSObjectSetProperty` | `z3qLvuQ6R8w` | -| `JSObjectSetPrototype` | `rp9ESANSaSs` | -| `JSPropertyNameAccumulatorAddName` | `pw+zuLAiI3U` | -| `JSPropertyNameArrayGetCount` | `gFwrGZX2VHg` | -| `JSPropertyNameArrayGetNameAtIndex` | `AbA05b6nRfY` | -| `JSPropertyNameArrayRelease` | `hR4Q4+3Kw10` | -| `JSPropertyNameArrayRetain` | `Fu0n0QGoarQ` | | `JSRemoteInspectorDisableAutoStart` | `5xaAcGH9QLs` | -| `JSRemoteInspectorGetInspectionEnabledByDefault` | `GDoaflM8pXo` | | `JSRemoteInspectorServerStart` | `2CZKDvi+xV4` | -| `JSRemoteInspectorSetInspectionEnabledByDefault` | `pvKooBHIGck` | | `JSRemoteInspectorSetLogToSystemConsole` | `K7KNByP46vs` | | `JSRemoteInspectorSetParentProcessInformation` | `M829RJ26qMA` | | `JSRemoteInspectorStart` | `u2XjomABnhY` | -| `JSReportExtraMemoryCost` | `gaxkMFwAeDg` | | `JSRunLoop` | `Olb6L5-YCBE` | -| `JSScriptCreateFromString` | `4q9iRNKayfw` | -| `JSScriptCreateReferencingImmortalASCIIText` | `9W6sEqfgXDY` | -| `JSScriptEvaluate` | `1gXYOYMR+m8` | -| `JSScriptRelease` | `7adKrsNyrRQ` | -| `JSScriptRetain` | `AEf6cGMJ5Fg` | | `JSSetOptions` | `vE61ounVJEI` | -| `JSStringCreateWithCharactersNoCopy` | `QNfeQkXbKk8` | -| `JSSynchronousEdenCollectForDebugging` | `rP9G1kItPl4` | -| `JSSynchronousGarbageCollectForDebugging` | `MCC-f9Vdrok` | -| `JSValueCreateJSONString` | `HRuqgFnBD60` | -| `JSValueGetTypedArrayType` | `49GAz4KpvyA` | -| `JSValueGetType` | `g8-wnopz0jE` | -| `JSValueIsArray` | `KIXWOBUPaHk` | -| `JSValueIsBoolean` | `tvhjgR5-DlE` | -| `JSValueIsDate` | `IhPWA3mYDk4` | -| `JSValueIsEqual` | `w3d6oZK52-I` | -| `JSValueIsInstanceOfConstructor` | `UPiqgAaHdtU` | -| `JSValueIsNull` | `X+BrzKqtupE` | -| `JSValueIsNumber` | `71B6E4fG+sA` | -| `JSValueIsObjectOfClass` | `uDNVMv6AgrQ` | -| `JSValueIsObject` | `jn+QXnoXVnc` | -| `JSValueIsStrictEqual` | `Ke-EQFve6sw` | -| `JSValueIsString` | `Ik7a6r6a7iw` | -| `JSValueIsSymbol` | `LiZvA-SjCko` | -| `JSValueIsUndefined` | `BZx2PqN5SsE` | -| `JSValueMakeBoolean` | `YCOZ80HgcTQ` | -| `JSValueMakeFromJSONString` | `HR0Ks7kSkUY` | -| `JSValueMakeNull` | `ZSHf8kyWYD4` | -| `JSValueMakeNumber` | `cT71x7KleG0` | -| `JSValueMakeSymbol` | `9xrhjJsmR2Q` | -| `JSValueMakeUndefined` | `mtbYjAKi5NQ` | -| `JSValueProtect` | `LPpUAOnfyxg` | -| `JSValueToBoolean` | `bW+iY4EnrNY` | -| `JSValueToNumber` | `rSsusHq9Y4Y` | -| `JSValueToObject` | `qma2Q24pDPI` | -| `JSValueToStringCopy` | `9bSDYmkp-Vw` | -| `JSValueUnprotect` | `ZnucTodXqc0` | -| `JSWeakCreate` | `Qly1iycov-E` | -| `JSWeakGetObject` | `6M+7uiGXQoQ` | -| `JSWeakObjectMapGet` | `aLX3IaojWsg` | -| `JSWeakObjectMapRemove` | `P4bb6JxoBdE` | -| `JSWeakObjectMapSet` | `7fKmJJYLvyw` | -| `JSWeakRelease` | `aYhJ9FWn0I0` | -| `JSWeakRetain` | `ValV+RKC9yw` | | `WKAXObjectButtonState` | `Dp64o6lCLkM` | | `WKAXObjectCopyDescription` | `YHG4TtOxLmw` | | `WKAXObjectCopyHelpText` | `XEncuQcKGeQ` | | `WKAXObjectCopyTitle` | `KYRL0uRR90o` | | `WKAXObjectCopyURL` | `Np-E0FZrqkQ` | | `WKAXObjectFrame` | `huPnixU5dNc` | -| `WKAXObjectGetTypeID` | `rIXoNZkmSbI` | | `WKAXObjectPage` | `KrVXrd3WyfM` | | `WKAXObjectRole` | `pt0Eyg26hqw` | | `WKAccessibilityCanUseSecondaryAXThread` | `7bL9hbEC1w0` | @@ -162,24 +54,14 @@ | `WKApplicationCacheManagerDeleteAllEntries` | `RHV1W6LLOZQ` | | `WKApplicationCacheManagerDeleteEntriesForOrigin` | `RNqLyINmGek` | | `WKApplicationCacheManagerGetApplicationCacheOrigins` | `fquLkyv1zr4` | -| `WKApplicationCacheManagerGetTypeID` | `VrJb1YjehwI` | -| `WKArrayAppendItem` | `5mCd+ow2T2s` | -| `WKArrayCreateAdoptingValues` | `zadJ2FWJud4` | -| `WKArrayCreate` | `z58h5a5HWwI` | -| `WKArrayGetItemAtIndex` | `Ll5gO+4szVs` | -| `WKArrayGetSize` | `MhZcX2IyZKM` | -| `WKArrayGetTypeID` | `JTeaIEONlYI` | -| `WKArrayRemoveItemAtIndex` | `FyVJTzY51dc` | | `WKAuthenticationChallengCopyRequestURL` | `A49tCnZlNyw` | | `WKAuthenticationChallengeGetDecisionListener` | `lJhs-zI+A50` | | `WKAuthenticationChallengeGetPreviousFailureCount` | `qqg8sYkQrGY` | | `WKAuthenticationChallengeGetProposedCredential` | `3L6XDc-UNVA` | | `WKAuthenticationChallengeGetProtectionSpace` | `V7Zs0n4FEKs` | -| `WKAuthenticationChallengeGetTypeID` | `wWSwCjA8pSI` | | `WKAuthenticationChallengeIsForMainResource` | `cSHyMR8vSNo` | | `WKAuthenticationChallengeIsInMainFrame` | `HWZd3fXbPio` | | `WKAuthenticationDecisionListenerCancel` | `Pu16MviGh5o` | -| `WKAuthenticationDecisionListenerGetTypeID` | `j5SUJcQbn4Y` | | `WKAuthenticationDecisionListenerRejectProtectionSpaceAndContinue` | `BwzMDOLhDYI` | | `WKAuthenticationDecisionListenerUseCredential` | `opFenFdq3F4` | | `WKBackForwardListClear` | `DF2gm2NCGhY` | @@ -191,25 +73,18 @@ | `WKBackForwardListGetForwardItem` | `r2P4v9m3K3s` | | `WKBackForwardListGetForwardListCount` | `b5kj+VbcJOI` | | `WKBackForwardListGetItemAtIndex` | `XSK4jllLpbM` | -| `WKBackForwardListGetTypeID` | `XuZn1qUezkE` | | `WKBackForwardListItemCopyOriginalURL` | `8PKVhejBM2Q` | | `WKBackForwardListItemCopyTitle` | `epLzR2+diVQ` | | `WKBackForwardListItemCopyURL` | `LcWGak3Mp3c` | -| `WKBackForwardListItemGetTypeID` | `IvngxwXoUdw` | -| `WKBooleanCreate` | `0ELyQu0bQIM` | -| `WKBooleanGetTypeID` | `8-hZIMejkAc` | -| `WKBooleanGetValue` | `xJsxrCNpOjU` | | `WKBundleAddOriginAccessAllowListEntry` | `Ec6dqG56Kog` | | `WKBundleBackForwardListClear` | `uDz2mwaGQxc` | | `WKBundleBackForwardListCopyItemAtIndex` | `w7TgSPl+20I` | | `WKBundleBackForwardListGetBackListCount` | `jbkqtarv--A` | -| `WKBundleBackForwardListGetTypeID` | `RFIZToM9FcU` | | `WKBundleBackForwardListItemCopyChildren` | `FbPgeyqyKxw` | | `WKBundleBackForwardListItemCopyOriginalURL` | `A3HuqQOmdmA` | | `WKBundleBackForwardListItemCopyTarget` | `eNlDM--QehI` | | `WKBundleBackForwardListItemCopyTitle` | `oA7TAoIYksg` | | `WKBundleBackForwardListItemCopyURL` | `lW7Qtc4Q4bI` | -| `WKBundleBackForwardListItemGetTypeID` | `q5ucPOQPJv0` | | `WKBundleBackForwardListItemHasCachedPageExpired` | `AMLRfnzY1CU` | | `WKBundleBackForwardListItemIsInBackForwardCache` | `LKMVeWFdRNk` | | `WKBundleBackForwardListItemIsSame` | `Q7y-M7olJkc` | @@ -220,7 +95,6 @@ | `WKBundleDOMWindowExtensionCreate` | `fI5-EhJqxeA` | | `WKBundleDOMWindowExtensionGetFrame` | `VN5TX+cUFf4` | | `WKBundleDOMWindowExtensionGetScriptWorld` | `CFtAcs7A434` | -| `WKBundleDOMWindowExtensionGetTypeID` | `gCx93FeUqcg` | | `WKBundleExtendClassesForParameterCoder` | `11DvPWLfwtU` | | `WKBundleFileHandleCreateWithPath` | `wWExpSMGya0` | | `WKBundleFrameAllowsFollowingLink` | `pmZi4yM8pxM` | @@ -256,7 +130,6 @@ | `WKBundleFrameGetParentFrame` | `v2hk1-AZ06A` | | `WKBundleFrameGetPendingUnloadCount` | `4ZQbnnW1z+Q` | | `WKBundleFrameGetScrollOffset` | `hYAhYYYeVZA` | -| `WKBundleFrameGetTypeID` | `zGsaQ8j2MsI` | | `WKBundleFrameGetVisibleContentBounds` | `53ZFAkGdDkU` | | `WKBundleFrameGetVisibleContentBoundsExcludingScrollbars` | `cPtt38dvZK8` | | `WKBundleFrameHandlesPageScaleGesture` | `-0ETdbxl-Kg` | @@ -270,7 +143,6 @@ | `WKBundleGarbageCollectJavaScriptObjects` | `vNNCUDOFpFY` | | `WKBundleGetApplicationConnection` | `L4ZuA2XEwzw` | | `WKBundleGetJavaScriptObjectsCount` | `IzxyWmghAig` | -| `WKBundleGetTypeID` | `nzO7rUcBW4c` | | `WKBundleHitTestResultCopyAbsoluteImageURL` | `H2oBJVmx0XQ` | | `WKBundleHitTestResultCopyAbsoluteLinkURL` | `0gETKZk91ig` | | `WKBundleHitTestResultCopyAbsoluteMediaURL` | `rW+n1QeUDdo` | @@ -286,13 +158,11 @@ | `WKBundleHitTestResultGetIsSelected` | `-tEPJ84QOzw` | | `WKBundleHitTestResultGetMediaType` | `YaGMXGYIWJ0` | | `WKBundleHitTestResultGetTargetFrame` | `w32pxSSQ4Rs` | -| `WKBundleHitTestResultGetTypeID` | `4kKhbLDBWQg` | | `WKBundleHitTestResultIsDownloadableMedia` | `moAKVLhGVOQ` | | `WKBundleHitTestResultMediaHasAudio` | `Oe33uOtx7sI` | | `WKBundleHitTestResultMediaIsInFullscreen` | `W6+fHPVq9Sc` | | `WKBundleInspectorClose` | `xTfnxYXtinY` | | `WKBundleInspectorEvaluateScriptForTest` | `b6+hAoAkJl8` | -| `WKBundleInspectorGetTypeID` | `DMB487Ois9o` | | `WKBundleInspectorSetPageProfilingEnabled` | `-r23ePSw30o` | | `WKBundleInspectorShow` | `KVehJeKp2gE` | | `WKBundleIsPageBoxVisible` | `ysYpNHM+f2U` | @@ -305,7 +175,6 @@ | `WKBundleNavigationActionGetNavigationType` | `tnvxzeWju10` | | `WKBundleNavigationActionGetShouldOpenExternalURLs` | `Ez-Pj0QWgSc` | | `WKBundleNavigationActionGetShouldTryAppLinks` | `x2Bw3o33jBY` | -| `WKBundleNavigationActionGetTypeID` | `Ldcx6Bfgxuc` | | `WKBundleNodeHandleCopyDocumentFrame` | `o1BJoFZNBYo` | | `WKBundleNodeHandleCopyDocument` | `H7cknGH2DVo` | | `WKBundleNodeHandleCopyHTMLFrameElementContentFrame` | `aHUVAX-1UOA` | @@ -325,7 +194,6 @@ | `WKBundleNodeHandleGetHTMLInputElementLastChangeWasUserEdit` | `p3uXvmETGok` | | `WKBundleNodeHandleGetHTMLTextAreaElementLastChangeWasUserEdit` | `R+2FUI+qUB4` | | `WKBundleNodeHandleGetRenderRect` | `TBGBVDzPzh0` | -| `WKBundleNodeHandleGetTypeID` | `WlRy47jghy8` | | `WKBundleNodeHandleSetHTMLInputElementAutoFillAvailable` | `xWvs8ZzLQSI` | | `WKBundleNodeHandleSetHTMLInputElementAutoFillButtonEnabledWithButtonType` | `F6hnPpozF2M` | | `WKBundleNodeHandleSetHTMLInputElementAutoFillButtonEnabled` | `w07dR+ym+z8` | @@ -378,7 +246,6 @@ | `WKBundlePageGetPageZoomFactor` | `bNfhkICjfEk` | | `WKBundlePageGetRenderTreeSize` | `U2LcSWAxv6I` | | `WKBundlePageGetTextZoomFactor` | `YYbrGICsiyQ` | -| `WKBundlePageGetTypeID` | `LmXR95K9aqY` | | `WKBundlePageHasComposition` | `v08CAVZPz-0` | | `WKBundlePageHasLocalDataForURL` | `LDKb9CdjDC4` | | `WKBundlePageInsertNewlineInQuotedContent` | `gOfB92L-2uE` | @@ -395,7 +262,6 @@ | `WKBundlePageOverlayClear` | `LVb-RgymeuY` | | `WKBundlePageOverlayCreate` | `PZlpwRuzFII` | | `WKBundlePageOverlayFractionFadedIn` | `F2mHImVJQPM` | -| `WKBundlePageOverlayGetTypeID` | `NBjin8TOnnA` | | `WKBundlePageOverlaySetAccessibilityClient` | `JBugz1LKFAA` | | `WKBundlePageOverlaySetNeedsDisplay` | `InWCDUOqVQI` | | `WKBundlePagePostMessageIgnoringFullySynchronousMode` | `EjX3MmMvpTs` | @@ -445,7 +311,6 @@ | `WKBundleRangeHandleCopySnapshotWithOptions` | `DUFkuflD2aY` | | `WKBundleRangeHandleCreate` | `FRDcroFI5oQ` | | `WKBundleRangeHandleGetBoundingRectInWindowCoordinates` | `u2vunBIph6w` | -| `WKBundleRangeHandleGetTypeID` | `hOM-emPwQEY` | | `WKBundleReleaseMemory` | `Zuc39RxgKlE` | | `WKBundleRemoveAllWebNotificationPermissions` | `ldxacgzSYVM` | | `WKBundleRemoveOriginAccessAllowListEntry` | `YkgkKjq1zjk` | @@ -456,7 +321,6 @@ | `WKBundleScriptWorldCopyName` | `DvKkBV1hFE8` | | `WKBundleScriptWorldCreateWorld` | `f2hz+NhGpbw` | | `WKBundleScriptWorldDisableOverrideBuiltinsBehavior` | `arhBKRy2grc` | -| `WKBundleScriptWorldGetTypeID` | `3Z-hTSXcHyc` | | `WKBundleScriptWorldMakeAllShadowRootsOpen` | `MddMup7PwZk` | | `WKBundleScriptWorldNormalWorld` | `2SSw6lT8qJo` | | `WKBundleSetClient` | `6Sajlv-clVQ` | @@ -464,14 +328,7 @@ | `WKBundleSetServiceWorkerProxyCreationCallback` | `tow2sT8FF3c` | | `WKBundleSetTabKeyCyclesThroughElements` | `t7K3DznwwOU` | | `WKBundleSetWebNotificationPermission` | `-67rxYq1qZo` | -| `WKCertificateInfoCopyCertificateAtIndex` | `Sxjbwl5-9+U` | -| `WKCertificateInfoCopyVerificationErrorDescription` | `q-CaGIByNbY` | -| `WKCertificateInfoCreateWithCertficateChain` | `E2RDHfE68c8` | -| `WKCertificateInfoGetCertificateChainSize` | `t+6tvd72XNE` | -| `WKCertificateInfoGetTypeID` | `aKzReC07ziw` | -| `WKCertificateInfoGetVerificationError` | `-moGynfbX70` | | `WKClearMockMediaDevices` | `ogjjVYnBJR8` | -| `WKConnectionGetTypeID` | `MbELgaqJ8Ow` | | `WKConnectionPostMessage` | `HRkYAo+HK5w` | | `WKConnectionSetConnectionClient` | `YRlm9YSeOYE` | | `WKContextAddSupportedPlugin` | `REZbDZa4btY` | @@ -480,49 +337,6 @@ | `WKContextClearCurrentModifierStateForTesting` | `Yk2qJg3VRBY` | | `WKContextClearSupportedPlugins` | `XIckVUXyJsE` | | `WKContextClearVisitedLinks` | `HiehcAiEDCc` | -| `WKContextConfigurationAlwaysKeepAndReuseSwappedProcesses` | `6i00BlGDSV4` | -| `WKContextConfigurationCopyApplicationCacheDirectory` | `aTdxY7THLVU` | -| `WKContextConfigurationCopyCustomClassesForParameterCoder` | `lf45wu5A-5M` | -| `WKContextConfigurationCopyDiskCacheDirectory` | `YFEYZzHHzi8` | -| `WKContextConfigurationCopyIndexedDBDatabaseDirectory` | `d5rhOaMjg0E` | -| `WKContextConfigurationCopyInjectedBundlePath` | `ueBDsJH29YI` | -| `WKContextConfigurationCopyLocalStorageDirectory` | `KI5+WPu8Wq4` | -| `WKContextConfigurationCopyMediaKeysStorageDirectory` | `kEMteHSVA+0` | -| `WKContextConfigurationCopyNetworkProcessPath` | `Yep4Dx-41IE` | -| `WKContextConfigurationCopyOverrideLanguages` | `mMUfpTLzhLs` | -| `WKContextConfigurationCopyResourceLoadStatisticsDirectory` | `8mKu28JdhO4` | -| `WKContextConfigurationCopyWebProcessPath` | `XQ+cgNIT8Z0` | -| `WKContextConfigurationCopyWebSQLDatabaseDirectory` | `WkVyoM7fyO4` | -| `WKContextConfigurationCreateWithLegacyOptions` | `aLsbm2KRQgE` | -| `WKContextConfigurationCreate` | `gElXE+OeQvA` | -| `WKContextConfigurationDiskCacheSizeOverride` | `pGERM4K5W1Y` | -| `WKContextConfigurationFullySynchronousModeIsAllowedForTesting` | `0PflEBfoZDs` | -| `WKContextConfigurationGetUserId` | `XW9bCLxgW10` | -| `WKContextConfigurationIgnoreSynchronousMessagingTimeoutsForTesting` | `A4bGTcq3-2E` | -| `WKContextConfigurationPrewarmsProcessesAutomatically` | `KDU5tG3gZRs` | -| `WKContextConfigurationProcessSwapsOnNavigation` | `M0QKpW7MKJY` | -| `WKContextConfigurationSetApplicationCacheDirectory` | `AFaKHX-zKCY` | -| `WKContextConfigurationSetCustomClassesForParameterCoder` | `jliSfePg28E` | -| `WKContextConfigurationSetDiskCacheDirectory` | `Nj-+klMfmSA` | -| `WKContextConfigurationSetDiskCacheSizeOverride` | `uW5wKgMp0JQ` | -| `WKContextConfigurationSetFullySynchronousModeIsAllowedForTesting` | `UDjtBPqU1og` | -| `WKContextConfigurationSetIgnoreSynchronousMessagingTimeoutsForTesting` | `lh4bGXJ1Pl0` | -| `WKContextConfigurationSetIndexedDBDatabaseDirectory` | `RiM5eDPbnXE` | -| `WKContextConfigurationSetInjectedBundlePath` | `5my6B3OKWLk` | -| `WKContextConfigurationSetLocalStorageDirectory` | `JT09vtkRDFo` | -| `WKContextConfigurationSetMediaKeysStorageDirectory` | `hXDH86Z4EHA` | -| `WKContextConfigurationSetNetworkProcessPath` | `m4VaXZE7J6U` | -| `WKContextConfigurationSetOverrideLanguages` | `2apC3qcQPvQ` | -| `WKContextConfigurationSetPrewarmsProcessesAutomatically` | `Ds+MUxya7Hk` | -| `WKContextConfigurationSetProcessSwapsOnNavigation` | `yz5l9NVnL4I` | -| `WKContextConfigurationSetResourceLoadStatisticsDirectory` | `qiAvfROsb6Y` | -| `WKContextConfigurationSetShouldCaptureAudioInUIProcess` | `eT8uRhbly2I` | -| `WKContextConfigurationSetShouldConfigureJSCForTesting` | `S3G7+rtcvUQ` | -| `WKContextConfigurationSetUserId` | `6xWOV1fjt24` | -| `WKContextConfigurationSetUsesWebProcessCache` | `IlO3gE1DNoI` | -| `WKContextConfigurationSetWebProcessPath` | `ATJaPHE0IC0` | -| `WKContextConfigurationSetWebSQLDatabaseDirectory` | `9yKCRw7LyGU` | -| `WKContextConfigurationUsesWebProcessCache` | `cXaNyPwDaB8` | | `WKContextCopyPlugInAutoStartOriginHashes` | `G4+RWlGLEt0` | | `WKContextCreate` | `EnYKPlIQ0DA` | | `WKContextCreateWithConfiguration` | `XgehYXFKMDs` | @@ -543,7 +357,6 @@ | `WKContextGetResourceCacheManager` | `N3bGYLHZl48` | | `WKContextGetStatisticsWithOptions` | `lihFGjz1c-c` | | `WKContextGetStatistics` | `dNMdheP8oUQ` | -| `WKContextGetTypeID` | `ZRHyhWkJpD8` | | `WKContextGetUsesSingleWebProcess` | `qZDRsY7kQ0s` | | `WKContextGetWebsiteDataStore` | `dDc6-iayAyg` | | `WKContextJavaScriptConfigurationFileEnabled` | `efD5N1zaabU` | @@ -555,7 +368,6 @@ | `WKContextMenuItemGetChecked` | `42HcmdjlDmc` | | `WKContextMenuItemGetEnabled` | `gEV0JIqdYdg` | | `WKContextMenuItemGetTag` | `I849n0yCszo` | -| `WKContextMenuItemGetTypeID` | `uiDkfX8F6IU` | | `WKContextMenuItemGetType` | `bIdRTPcRP7w` | | `WKContextMenuItemGetUserData` | `oRR5HoDuB7Y` | | `WKContextMenuItemSeparatorItem` | `yOyUp3CncVw` | @@ -607,39 +419,17 @@ | `WKCookieManagerDeleteCookiesForHostname` | `4gJ2MFHUsvY` | | `WKCookieManagerGetHTTPCookieAcceptPolicy` | `d9tCx7OTo00` | | `WKCookieManagerGetHostnamesWithCookies` | `FNCVZgUSgfw` | -| `WKCookieManagerGetTypeID` | `Ae5yw4TYq-8` | | `WKCookieManagerSetClient` | `q-Hwxr4yls0` | | `WKCookieManagerSetHTTPCookieAcceptPolicy` | `a7yz7vOyBxk` | | `WKCookieManagerStartObservingCookieChanges` | `vyOiJyvWOik` | | `WKCookieManagerStopObservingCookieChanges` | `ebPeu+4eyj8` | -| `WKCredentialCopyUser` | `Mwr-lR7-oUs` | -| `WKCredentialCreateWithCertificateInfo` | `zonyi51GcZw` | -| `WKCredentialCreate` | `j0WdRf7bUMY` | -| `WKCredentialGetTypeID` | `ld1z8QaWVNw` | -| `WKDataCreate` | `wi5L94psWjQ` | -| `WKDataGetBytes` | `G1fDABsBuxo` | -| `WKDataGetSize` | `kc89FM1Uil4` | -| `WKDataGetTypeID` | `9PNaecmeTbA` | -| `WKDictionaryCopyKeys` | `xaT+yTMJJP8` | -| `WKDictionaryCreate` | `lfY0K492DV0` | -| `WKDictionaryGetItemForKey` | `TdTpGqx4cXY` | -| `WKDictionaryGetSize` | `9iGYtO7nweM` | -| `WKDictionaryGetTypeID` | `lO2rp0uakfM` | -| `WKDictionarySetItem` | `HBmQvWiq4pg` | -| `WKDoubleCreate` | `Hs7FP4ljGT4` | -| `WKDoubleGetTypeID` | `iE3CMaB0t70` | -| `WKDoubleGetValue` | `8byEIstY8fo` | | `WKDownloadCopyRequest` | `9AGT4R9XxlU` | | `WKDownloadGetOriginatingPage` | `44ygghy3b4E` | -| `WKDownloadGetTypeID` | `-x5vK4NNNYM` | | `WKDownloadGetWasUserInitiated` | `YqiQrQV1Wbk` | | `WKErrorCopyDomain` | `CbWxMDgV5WQ` | | `WKErrorCopyFailingURL` | `Rcz4V01xRBo` | -| `WKErrorCopyWKErrorDomain` | `R0HNwv8ngXY` | | `WKErrorGetErrorCode` | `Jx+jaw-BVuE` | -| `WKErrorGetTypeID` | `jM9QbqB-2Bk` | | `WKFormSubmissionListenerContinue` | `NRF4gBL1p9o` | -| `WKFormSubmissionListenerGetTypeID` | `rUm4xXy5TH0` | | `WKFrameCanProvideSource` | `pupKRlW6z-w` | | `WKFrameCanShowMIMEType` | `K5V0IcHAoOE` | | `WKFrameCopyMIMEType` | `UwMYQFss8oM` | @@ -654,39 +444,27 @@ | `WKFrameGetMainResourceData` | `wd3NsMeiyj4` | | `WKFrameGetPage` | `pAEazR4ifq8` | | `WKFrameGetResourceData` | `heyzb1EgSYg` | -| `WKFrameGetTypeID` | `GH-8t-+jzHM` | | `WKFrameGetWebArchive` | `OF6uR63q+Ss` | | `WKFrameHandleGetFrameID` | `LPzmQHV7qEo` | -| `WKFrameHandleGetTypeID` | `vLii6YzmaaA` | | `WKFrameInfoCreateFrameHandleRef` | `lQUbnRQ699M` | -| `WKFrameInfoGetTypeID` | `q+NxQ4ogEDw` | | `WKFrameIsDisplayingMarkupDocument` | `vwFaWsNoiQw` | | `WKFrameIsDisplayingStandaloneImageDocument` | `3HDn1r7lsGM` | | `WKFrameIsFrameSet` | `BTOv1017JlU` | | `WKFrameIsMainFrame` | `fo3MaNfUAUE` | | `WKFramePolicyListenerDownload` | `IT1HfKWFBQ0` | -| `WKFramePolicyListenerGetTypeID` | `uyGl1QPqY7s` | | `WKFramePolicyListenerIgnore` | `0ppk-ExuWJA` | | `WKFramePolicyListenerUseInNewProcess` | `P67QGjv0uSA` | | `WKFramePolicyListenerUseInNewProcessWithPolicies` | `vDrj6vV4d60` | | `WKFramePolicyListenerUse` | `K-2wOp7OEL8` | | `WKFramePolicyListenerUseWithPolicies` | `82bVw8qSCFc` | | `WKFrameStopLoading` | `R8pxYSQQqcY` | -| `WKGeolocationManagerGetTypeID` | `lSGEqQCGfbI` | | `WKGeolocationManagerProviderDidChangePosition` | `NB5lJxGW9Ro` | | `WKGeolocationManagerProviderDidFailToDeterminePosition` | `0jIcJu0tb+o` | | `WKGeolocationManagerProviderDidFailToDeterminePositionWithErrorMessage` | `NTLwhm+Wfk8` | | `WKGeolocationManagerSetProvider` | `55QR+rnq6FI` | | `WKGeolocationPermissionRequestAllow` | `d1IXlZ0caEU` | | `WKGeolocationPermissionRequestDeny` | `GB8w2Gfd0Ag` | -| `WKGeolocationPermissionRequestGetTypeID` | `nq-FMcy8LXU` | -| `WKGeolocationPositionCreate` | `7B7QLlsyCo8` | -| `WKGeolocationPositionCreate_b` | `UOMssWsF9UU` | -| `WKGeolocationPositionCreate_c` | `05tQK2p2l3o` | -| `WKGeolocationPositionGetTypeID` | `JuA51bPRpmc` | -| `WKGetTypeID` | `fTWrVJcXr44` | | `WKHTTPCookieStoreDeleteAllCookies` | `mVoWS3zTfxs` | -| `WKHTTPCookieStoreGetTypeID` | `tTLEJS3+OIM` | | `WKHTTPCookieStoreSetCookieForHostname` | `bXKJvpaEKpk` | | `WKHTTPCookieStoreSetHTTPCookieAcceptPolicy` | `AP4g3QKWeFg` | | `WKHitTestResultCopyAbsoluteImageURL` | `P12aEEi4s4E` | @@ -697,14 +475,12 @@ | `WKHitTestResultCopyLinkTitle` | `5kKBK5wylwI` | | `WKHitTestResultCopyLookupText` | `9bbMhTfv3nY` | | `WKHitTestResultGetElementBoundingBox` | `MybHsH8cii0` | -| `WKHitTestResultGetTypeID` | `1oMvFrDq0pw` | | `WKHitTestResultIsContentEditable` | `iioP3xFfzJ8` | | `WKIconDatabaseCheckIntegrityBeforeOpening` | `Q6e57L2Vat8` | | `WKIconDatabaseClose` | `D6zZXKyK2XI` | | `WKIconDatabaseCopyIconDataForPageURL` | `ErWkFcqcBYE` | | `WKIconDatabaseCopyIconURLForPageURL` | `PEWusNk7cIM` | | `WKIconDatabaseEnableDatabaseCleanup` | `Fg2BRITDYDg` | -| `WKIconDatabaseGetTypeID` | `QyuHptNshis` | | `WKIconDatabaseReleaseIconForURL` | `pKUEWyAWkeI` | | `WKIconDatabaseRemoveAllIcons` | `LMXftlH0v2Y` | | `WKIconDatabaseRetainIconForURL` | `0parhLSAuME` | @@ -715,7 +491,6 @@ | `WKImageCreateCairoSurface` | `1QfyjHj40es` | | `WKImageCreateFromCairoSurface` | `jJePHioTWw0` | | `WKImageGetSize` | `NfSMc-E4OA0` | -| `WKImageGetTypeID` | `pE4L6eMygg8` | | `WKImeEventGetInputLanguage` | `YZP9-KrWVgc` | | `WKImeEventMake` | `E5qbM3aFc2s` | | `WKImeEventRelease` | `7Oc5AygU+9Q` | @@ -724,7 +499,6 @@ | `WKInspectorConnect` | `il8-JtRpqUk` | | `WKInspectorDetach` | `xhDUq5emaGw` | | `WKInspectorGetPage` | `qs+B5yWiMc4` | -| `WKInspectorGetTypeID` | `6vKnJ0YYMVs` | | `WKInspectorHide` | `AhwGp7JtQjI` | | `WKInspectorIsAttached` | `rMnQ2wsSy-c` | | `WKInspectorIsConnected` | `ceIT7njviKk` | @@ -745,23 +519,15 @@ | `WKKeyValueStorageManagerGetModificationTimeKey` | `luMlXp-022c` | | `WKKeyValueStorageManagerGetOriginKey` | `Bk3H5AlkwIM` | | `WKKeyValueStorageManagerGetStorageDetailsByOrigin` | `D2O5KU7KlMo` | -| `WKKeyValueStorageManagerGetTypeID` | `kx3Hhnn-ZoU` | | `WKKeyboardEventMake` | `UJXHm7AkPK8` | -| `WKMessageListenerGetTypeID` | `9l7AK7-JFzw` | | `WKMessageListenerSendReply` | `9Rvb-lG-IYI` | | `WKMouseEventMake` | `4LPi8JtvxYQ` | -| `WKMutableArrayCreate` | `v3hD6yHyoi0` | -| `WKMutableDictionaryCreate` | `nG9zMww7lhE` | -| `WKNavigationActionGetTypeID` | `8r+cK8-zvBs` | | `WKNavigationActionShouldPerformDownload` | `dy5gXrUocbc` | | `WKNavigationDataCopyNavigationDestinationURL` | `VBpaH-iDg48` | | `WKNavigationDataCopyOriginalRequest` | `S-xPXI+4q9E` | | `WKNavigationDataCopyTitle` | `4zsaU7SmJeE` | | `WKNavigationDataCopyURL` | `Iz8WjECFHIY` | -| `WKNavigationDataGetTypeID` | `J2OMHZAhMC0` | -| `WKNavigationGetTypeID` | `1UqsL1I+qec` | | `WKNavigationResponseCanShowMIMEType` | `zDNEy9hON-w` | -| `WKNavigationResponseGetTypeID` | `TBeZQ0ZN6dg` | | `WKNotificationCopyBody` | `mLDfb0Bl+A8` | | `WKNotificationCopyIconURL` | `WFLFSRXPRn0` | | `WKNotificationCopyLang` | `C0Zzwfz-3bw` | @@ -769,15 +535,12 @@ | `WKNotificationCopyTitle` | `TFclhiSEXqI` | | `WKNotificationGetID` | `6+JjX8dugXY` | | `WKNotificationGetSecurityOrigin` | `f5y9sv5r5hs` | -| `WKNotificationGetTypeID` | `yiiB+pbygU4` | -| `WKNotificationManagerGetTypeID` | `OZ0w4N914Uo` | | `WKNotificationManagerProviderDidClickNotification` | `U3ua0NGm+jE` | | `WKNotificationManagerProviderDidCloseNotifications` | `IeQSRVoUfPw` | | `WKNotificationManagerProviderDidRemoveNotificationPolicies` | `gjIRPiBLogA` | | `WKNotificationManagerProviderDidShowNotification` | `7mQ26kdVI1U` | | `WKNotificationManagerSetProvider` | `7LaChig9ovU` | | `WKNotificationPermissionRequestDeny` | `b9wqZKzgejI` | -| `WKNotificationPermissionRequestGetTypeID` | `e7pzuaSj6AQ` | | `WKOpenPanelParametersCopyAcceptedFileExtensions` | `13zq0KIVJJg` | | `WKOpenPanelParametersCopyAcceptedMIMETypes` | `FajrozYzGvw` | | `WKOpenPanelParametersCopyAllowedMIMETypes` | `YacE5rS1b3k` | @@ -786,10 +549,8 @@ | `WKOpenPanelParametersGetAllowsDirectories` | `yZ8MpxQizWM` | | `WKOpenPanelParametersGetAllowsMultipleFiles` | `6JUqQUan7cM` | | `WKOpenPanelParametersGetMediaCaptureType` | `UYD2jkWiCr0` | -| `WKOpenPanelParametersGetTypeID` | `dnXP-Ctcfyo` | | `WKOpenPanelResultListenerCancel` | `O0YiYsUaleQ` | | `WKOpenPanelResultListenerChooseFiles` | `2ChSmFDC91I` | -| `WKOpenPanelResultListenerGetTypeID` | `5bDbYUYXAmU` | | `WKPageAreScrollbarAnimationsSuppressed` | `OQYQvowtC6I` | | `WKPageBackgroundExtendsBeyondPage` | `qKJ2G1pGKmU` | | `WKPageBeginPrinting` | `hujPhSbtd4A` | @@ -804,22 +565,6 @@ | `WKPageClearWheelEventTestMonitor` | `XJLGUoS-3wI` | | `WKPageClose` | `h2cIHUQsu9w` | | `WKPageComputePagesForPrinting` | `uuF9vP1RSZ8` | -| `WKPageConfigurationCreate` | `nadjzO4Rufs` | -| `WKPageConfigurationGetContext` | `JO-9GKQvbCw` | -| `WKPageConfigurationGetPageGroup` | `Pn2yl7Yi2e4` | -| `WKPageConfigurationGetPreferences` | `WvrKKVTYKUk` | -| `WKPageConfigurationGetRelatedPage` | `rzCicCsOcPg` | -| `WKPageConfigurationGetTypeID` | `N6Zxk80Ewgs` | -| `WKPageConfigurationGetUserContentController` | `3oQXJPlb8zo` | -| `WKPageConfigurationGetWebsiteDataStore` | `Q7obvY7jbqQ` | -| `WKPageConfigurationSetBackgroundCPULimit` | `P4q5pGTwqw0` | -| `WKPageConfigurationSetContext` | `BKgXHG1tMP0` | -| `WKPageConfigurationSetInitialCapitalizationEnabled` | `bqbkCHsef6o` | -| `WKPageConfigurationSetPageGroup` | `zHD-PGImDeY` | -| `WKPageConfigurationSetPreferences` | `h-JNdoOhUY8` | -| `WKPageConfigurationSetRelatedPage` | `U-3pvGonwTA` | -| `WKPageConfigurationSetUserContentController` | `glEe46x-ZPQ` | -| `WKPageConfigurationSetWebsiteDataStore` | `pkP97nU1QO4` | | `WKPageCopyActiveURL` | `xKQvzQ1q63A` | | `WKPageCopyApplicationNameForUserAgent` | `0PYkLRuvLMw` | | `WKPageCopyCommittedURL` | `KKdrRaSLnoA` | @@ -877,19 +622,9 @@ | `WKPageGetSessionHistoryURLValueType` | `lfWRbhGF-vQ` | | `WKPageGetSourceForFrame` | `plbxmi4Te84` | | `WKPageGetTextZoomFactor` | `pNy9E8Now3M` | -| `WKPageGetTypeID` | `WjESEDn5AEk` | | `WKPageGoBack` | `o2fPZBklfHg` | | `WKPageGoForward` | `T2GU7yBLQNA` | | `WKPageGoToBackForwardListItem` | `YE3MRmCjo0Y` | -| `WKPageGroupAddUserScript` | `vP9N8rOMbJQ` | -| `WKPageGroupAddUserStyleSheet` | `dOy7pCh+keI` | -| `WKPageGroupCreateWithIdentifier` | `y0SswDKrSiQ` | -| `WKPageGroupGetPreferences` | `sZYNm-cAb1E` | -| `WKPageGroupGetTypeID` | `iB4zET-Oj+o` | -| `WKPageGroupGetUserContentController` | `YlQ3gfC7fqM` | -| `WKPageGroupRemoveAllUserScripts` | `06waOZH+zd4` | -| `WKPageGroupRemoveAllUserStyleSheets` | `unk-IdKq+R8` | -| `WKPageGroupSetPreferences` | `tpVW+9x7KcM` | | `WKPageHandleImeEvent` | `7cGuv-8-6jE` | | `WKPageHandleKeyboardEvent` | `KT3+V4XYj7w` | | `WKPageHandleMouseEvent` | `zf4+IDdC57s` | @@ -933,7 +668,6 @@ | `WKPageReloadWithoutContentBlockers` | `rza9NDv-OoI` | | `WKPageRenderTreeExternalRepresentation` | `jLmjAIno8oQ` | | `WKPageRequestStorageAccessConfirmResultListenerCall` | `JfGd39hq3Ik` | -| `WKPageRequestStorageAccessConfirmResultListenerGetTypeID` | `7rNEJOU11hY` | | `WKPageRestoreFromSessionState` | `0vC8zP+wJyI` | | `WKPageRestoreFromSessionStateWithoutNavigation` | `60j3hXkW9+4` | | `WKPageResumeActiveDOMObjectsAndAnimations` | `3GC9QQlTKoU` | @@ -942,14 +676,10 @@ | `WKPageRubberBandsAtRight` | `tI-w0kRXieM` | | `WKPageRubberBandsAtTop` | `ErwSbohShIc` | | `WKPageRunBeforeUnloadConfirmPanelResultListenerCall` | `T-GOS0yg738` | -| `WKPageRunBeforeUnloadConfirmPanelResultListenerGetTypeID` | `ZUMUxvly5Iw` | | `WKPageRunJavaScriptAlertResultListenerCall` | `6LmTCyxtXgo` | -| `WKPageRunJavaScriptAlertResultListenerGetTypeID` | `LredT8zbSlk` | | `WKPageRunJavaScriptConfirmResultListenerCall` | `8tUBw7skPZ0` | -| `WKPageRunJavaScriptConfirmResultListenerGetTypeID` | `-f5CqEvJjwU` | | `WKPageRunJavaScriptInMainFrame` | `BRYaC0en9CQ` | | `WKPageRunJavaScriptPromptResultListenerCall` | `e+Fq1ZZzkyE` | -| `WKPageRunJavaScriptPromptResultListenerGetTypeID` | `XaqWcRBnceI` | | `WKPageSelectContextMenuItem` | `GvAwpvKsjPc` | | `WKPageSelectFindMatch` | `HX9slXuFM5c` | | `WKPageSetAddsVisitedLinks` | `OCteYQ6w5Ok` | @@ -1023,410 +753,15 @@ | `WKPluginInformationPluginURLKey` | `BgnV9ciabNs` | | `WKPluginInformationPluginspageAttributeURLKey` | `WKUanh-oVyc` | | `WKPluginInformationUpdatePastLastBlockedVersionIsKnownAvailableKey` | `w5yd8587Xyo` | -| `WKPointCreate` | `q96oBmczAWU` | -| `WKPointGetTypeID` | `bbcJa87UkyM` | -| `WKPointGetValue` | `I3214xCz1gY` | | `WKPopupMenuItemCopyText` | `xmQq6hB1vqE` | -| `WKPopupMenuItemGetTypeID` | `hXu4ow0ml4M` | | `WKPopupMenuItemIsEnabled` | `DUF5lHKpf6o` | | `WKPopupMenuItemIsItem` | `w6uemFn00hc` | | `WKPopupMenuItemIsSeparator` | `cIEUZ-pzXZo` | -| `WKPreferencesCopyCursiveFontFamily` | `zpuDFfjHETM` | -| `WKPreferencesCopyDefaultTextEncodingName` | `YrYaxLTSTO8` | -| `WKPreferencesCopyFTPDirectoryTemplatePath` | `q8sAT77cytk` | -| `WKPreferencesCopyFantasyFontFamily` | `JUgeqTtnIuQ` | -| `WKPreferencesCopyFixedFontFamily` | `nL8jh-3HkIg` | -| `WKPreferencesCopyMediaContentTypesRequiringHardwareSupport` | `m87dkWET7+Q` | -| `WKPreferencesCopyPictographFontFamily` | `mqTT0TMW0iE` | -| `WKPreferencesCopySansSerifFontFamily` | `tWzrZ7vvWIg` | -| `WKPreferencesCopySerifFontFamily` | `av0w04NTFNM` | -| `WKPreferencesCopyStandardFontFamily` | `wkE+qauDby0` | -| `WKPreferencesCreateCopy` | `smCpmvwKDVQ` | -| `WKPreferencesCreateWithIdentifier` | `MLNoiVNdF1Q` | -| `WKPreferencesCreate` | `tAuQSNscAqg` | -| `WKPreferencesEnableAllExperimentalFeatures` | `ZzkpRWtyNFc` | -| `WKPreferencesGetAVFoundationEnabled` | `rLK6S3dUUEA` | -| `WKPreferencesGetAVFoundationNSURLSessionEnabled` | `SYU6Z4blPB8` | | `WKPreferencesGetAccelerated2DCanvasEnabled` | `DrEP3qaThDE` | -| `WKPreferencesGetAcceleratedCompositingEnabled` | `TMwYGNk+z3w` | -| `WKPreferencesGetAcceleratedDrawingEnabled` | `UrafQRzOxd4` | -| `WKPreferencesGetAggressiveTileRetentionEnabled` | `Opg4di-td2c` | -| `WKPreferencesGetAllowCrossOriginSubresourcesToAskForCredentials` | `gkDIoxZtOuk` | -| `WKPreferencesGetAllowMediaContentTypesRequiringHardwareSupportAsFallback` | `ba-1NKWEdjU` | -| `WKPreferencesGetAllowsAirPlayForMediaPlayback` | `vUz7RsxUmHI` | -| `WKPreferencesGetAllowsPictureInPictureMediaPlayback` | `vN+uSr3WpOI` | -| `WKPreferencesGetAnimatedImageAsyncDecodingEnabled` | `Hh+5bs44RNM` | -| `WKPreferencesGetAntialiasedFontDilationEnabled` | `8sN4TdPfvNI` | -| `WKPreferencesGetApplePayCapabilityDisclosureAllowed` | `SSlCLGevxB8` | -| `WKPreferencesGetApplePayEnabled` | `j0yZCTA9wys` | -| `WKPreferencesGetArtificialPluginInitializationDelayEnabled` | `jyhqbsCB4kQ` | -| `WKPreferencesGetAsynchronousPluginInitializationEnabled` | `6x-luKeSQNg` | -| `WKPreferencesGetAsynchronousPluginInitializationEnabledForAllPlugins` | `fi17Swuc348` | -| `WKPreferencesGetAsynchronousSpellCheckingEnabled` | `hIOzfLdWPKA` | -| `WKPreferencesGetAttachmentElementEnabled` | `Ub05p6lScXw` | -| `WKPreferencesGetAudioPlaybackRequiresUserGesture` | `gonUZZF6--M` | -| `WKPreferencesGetAuthorAndUserStylesEnabled` | `LLyFtEN3cEA` | -| `WKPreferencesGetAutostartOriginPlugInSnapshottingEnabled` | `8lA9lXh0Jfk` | -| `WKPreferencesGetBackspaceKeyNavigationEnabled` | `Z8Afdc4FdPo` | -| `WKPreferencesGetBeaconAPIEnabled` | `aZ84p5aBkrc` | -| `WKPreferencesGetCSSOMViewScrollingAPIEnabled` | `IU+jMKipip4` | -| `WKPreferencesGetCanvasUsesAcceleratedDrawing` | `4cWxMuvkAVE` | -| `WKPreferencesGetCaptureAudioInGPUProcessEnabled` | `zECbYPJ4I2I` | -| `WKPreferencesGetCaptureAudioInUIProcessEnabled` | `FOU9hGXYs4A` | -| `WKPreferencesGetCaptureVideoInGPUProcessEnabled` | `NlS2R9vXK0o` | -| `WKPreferencesGetCaretBrowsingEnabled` | `sv+XaoHkUIk` | -| `WKPreferencesGetColorFilterEnabled` | `qUJIkmd3tyw` | -| `WKPreferencesGetCompositingBordersVisible` | `fWsMBQSxmSM` | -| `WKPreferencesGetCompositingRepaintCountersVisible` | `OhVJO3fn7dk` | -| `WKPreferencesGetContentChangeObserverEnabled` | `nofAEAG9+TM` | -| `WKPreferencesGetCookieEnabled` | `JJVOQ9-csDE` | -| `WKPreferencesGetCrossOriginResourcePolicyEnabled` | `isYAJ-sJJ4E` | -| `WKPreferencesGetCustomPasteboardDataEnabled` | `H1p9Bd5xQeQ` | -| `WKPreferencesGetDNSPrefetchingEnabled` | `HHx-tF5nNvE` | -| `WKPreferencesGetDOMPasteAllowed` | `Jv1BF8DLSYY` | -| `WKPreferencesGetDOMTimersThrottlingEnabled` | `BwAIkiXQHfk` | -| `WKPreferencesGetDataTransferItemsEnabled` | `xJvhaEzgb8Y` | -| `WKPreferencesGetDatabasesEnabled` | `gb6RAEU5pgY` | -| `WKPreferencesGetDefaultFixedFontSize` | `5XzzJSlUM8w` | -| `WKPreferencesGetDefaultFontSize` | `fIUD1xhY8TM` | -| `WKPreferencesGetDeveloperExtrasEnabled` | `VOSeH8BIUkE` | -| `WKPreferencesGetDiagnosticLoggingEnabled` | `BBJoU2m+U88` | -| `WKPreferencesGetDirectoryUploadEnabled` | `U0l5R1vC1do` | -| `WKPreferencesGetDownloadAttributeEnabled` | `vvlbLKHioMM` | -| `WKPreferencesGetEditableLinkBehavior` | `tqWD7hd81YM` | -| `WKPreferencesGetEnableInheritURIQueryComponent` | `Slh4bod3jBg` | -| `WKPreferencesGetEncodingDetectorEnabled` | `T0aVLlco4D8` | -| `WKPreferencesGetEncryptedMediaAPIEnabled` | `u5pQ01e-HF8` | -| `WKPreferencesGetEnumeratingAllNetworkInterfacesEnabled` | `CjLdS99AOJU` | -| `WKPreferencesGetFetchAPIEnabled` | `4-30FU3BDs0` | -| `WKPreferencesGetFetchAPIKeepAliveEnabled` | `UQZhMdb2bOQ` | -| `WKPreferencesGetFileAccessFromFileURLsAllowed` | `YrEOsOmcveQ` | -| `WKPreferencesGetForceFTPDirectoryListings` | `KMXKX2BT6ik` | -| `WKPreferencesGetFrameFlatteningEnabled` | `0iEGz7pB0ZI` | -| `WKPreferencesGetFullScreenEnabled` | `U5q+5THwQJY` | -| `WKPreferencesGetGamepadsEnabled` | `vi0uz2KDi60` | -| `WKPreferencesGetHTTPEquivEnabled` | `FF3Bpy-+5aE` | -| `WKPreferencesGetHiddenPageCSSAnimationSuspensionEnabled` | `0Aqqie4gXEY` | -| `WKPreferencesGetHiddenPageDOMTimerThrottlingAutoIncreases` | `0cPhfQ0yQfo` | -| `WKPreferencesGetHiddenPageDOMTimerThrottlingEnabled` | `GkcuoqSr8nw` | -| `WKPreferencesGetHighlightAPIEnabled` | `QoZ-IQbyN3Q` | -| `WKPreferencesGetHixie76WebSocketProtocolEnabled` | `eXYzyWOANqE` | -| `WKPreferencesGetHyperlinkAuditingEnabled` | `m2-C4ATpzfI` | -| `WKPreferencesGetICECandidateFilteringEnabled` | `s6KzWGD8P3k` | -| `WKPreferencesGetIgnoreViewportScalingConstraints` | `oSR7UP2qKeQ` | -| `WKPreferencesGetImageControlsEnabled` | `0ezpnHVyg+s` | -| `WKPreferencesGetInactiveMediaCaptureSteamRepromptIntervalInMinutes` | `1B8WzbZ9TiA` | -| `WKPreferencesGetIncrementalRenderingSuppressionTimeout` | `f1saCd4HzCU` | -| `WKPreferencesGetInlineMediaPlaybackRequiresPlaysInlineAttribute` | `nxLDhsSb6GM` | -| `WKPreferencesGetInteractiveFormValidationEnabled` | `S-3U05lXJhk` | -| `WKPreferencesGetIntersectionObserverEnabled` | `4qCJAabaQ6A` | -| `WKPreferencesGetInvisibleMediaAutoplayPermitted` | `RrTAXQpHW-4` | -| `WKPreferencesGetIsAccessibilityIsolatedTreeEnabled` | `8ozlDe1o-ok` | -| `WKPreferencesGetIsSecureContextAttributeEnabled` | `F-iEWTPtfyw` | -| `WKPreferencesGetJavaEnabled` | `jpB7Ik2Qrpw` | -| `WKPreferencesGetJavaScriptCanAccessClipboard` | `TLmzpgpiC5U` | -| `WKPreferencesGetJavaScriptCanOpenWindowsAutomatically` | `R-Uj-EZ9NZE` | -| `WKPreferencesGetJavaScriptEnabled` | `f+r1NszlolE` | -| `WKPreferencesGetJavaScriptMarkupEnabled` | `6BA6o6hUoTI` | -| `WKPreferencesGetJavaScriptRuntimeFlags` | `H2LmrUCPD40` | -| `WKPreferencesGetKeygenElementEnabled` | `j6AZ9q1Cob0` | -| `WKPreferencesGetLargeImageAsyncDecodingEnabled` | `812ErfQJ70Q` | -| `WKPreferencesGetLegacyEncryptedMediaAPIEnabled` | `gqr-pq0E8kY` | -| `WKPreferencesGetLinkPreloadEnabled` | `UWQJ3LjYU0o` | -| `WKPreferencesGetLoadsImagesAutomatically` | `x6VrO1EEKm4` | -| `WKPreferencesGetLoadsSiteIconsIgnoringImageLoadingPreference` | `osWtCsta06M` | -| `WKPreferencesGetLocalStorageEnabled` | `ONUP+hSzhqw` | -| `WKPreferencesGetLogsPageMessagesToSystemConsoleEnabled` | `VKxq9vTrR2w` | -| `WKPreferencesGetLongMousePressEnabled` | `F6zbHtndY4Y` | -| `WKPreferencesGetMainContentUserGestureOverrideEnabled` | `Uiyy-woHSDA` | -| `WKPreferencesGetMediaCapabilitiesEnabled` | `CFEjBEf0Mes` | -| `WKPreferencesGetMediaCaptureRequiresSecureConnection` | `nRD+2A9Htb4` | -| `WKPreferencesGetMediaControlsScaleWithPageZoom` | `f3rFzo5wykg` | -| `WKPreferencesGetMediaDevicesEnabled` | `6jAtbdWXPBw` | -| `WKPreferencesGetMediaPlayable` | `B35ZcgDNE60` | -| `WKPreferencesGetMediaPlaybackAllowsInline` | `KKgFmz4V2e8` | -| `WKPreferencesGetMediaPlaybackRequiresUserGesture` | `sHJ2PvfxFZg` | -| `WKPreferencesGetMediaPreloadingEnabled` | `pS96n3Qoz1Q` | -| `WKPreferencesGetMediaSourceEnabled` | `Xx0dItTuoRM` | -| `WKPreferencesGetMediaStreamEnabled` | `u-rdLhMlauo` | -| `WKPreferencesGetMediaUserGestureInheritsFromDocument` | `iW9pUP8vR18` | -| `WKPreferencesGetMenuItemElementEnabled` | `C4GGY4M5WPs` | -| `WKPreferencesGetMetaRefreshEnabled` | `I0wxpjuw6sE` | -| `WKPreferencesGetMinimumFontSize` | `1c-lvc-RwAQ` | -| `WKPreferencesGetMinimumZoomFontSize` | `qVqE22mHm6M` | -| `WKPreferencesGetMockCaptureDevicesEnabled` | `ym1zt5eSs-k` | -| `WKPreferencesGetMockScrollbarsEnabled` | `N39w8gCDtOM` | -| `WKPreferencesGetNeedsSiteSpecificQuirks` | `o5HryppIGR0` | -| `WKPreferencesGetNeedsStorageAccessFromFileURLsQuirk` | `M666JyEakIQ` | -| `WKPreferencesGetNewBlockInsideInlineModelEnabled` | `odlxNwyXfM8` | -| `WKPreferencesGetNotificationsEnabled` | `IlJiXLRCfks` | -| `WKPreferencesGetOfflineWebApplicationCacheEnabled` | `TGU99OcdkEw` | -| `WKPreferencesGetPDFPluginEnabled` | `dfqRsTgs+mA` | -| `WKPreferencesGetPageCacheEnabled` | `N39BtoMLsU4` | -| `WKPreferencesGetPageCacheSupportsPlugins` | `PLN3vUYYQ3I` | -| `WKPreferencesGetPageVisibilityBasedProcessSuppressionEnabled` | `gm3NmEkM6Uo` | -| `WKPreferencesGetPaginateDuringLayoutEnabled` | `zQJ3Wgpr2xE` | -| `WKPreferencesGetPaintTimingEnabled` | `H3LD-9ATHlY` | -| `WKPreferencesGetPeerConnectionEnabled` | `Q838nnG0kxQ` | -| `WKPreferencesGetPlugInSnapshottingEnabled` | `VVJTdpEEI+g` | -| `WKPreferencesGetPluginSandboxProfilesEnabledForAllPlugins` | `YTJJtsvWfv4` | -| `WKPreferencesGetPluginsEnabled` | `sC1zGDM6E8U` | -| `WKPreferencesGetPrimaryPlugInSnapshotDetectionEnabled` | `GlxLVLdfMos` | -| `WKPreferencesGetPrivateBrowsingEnabled` | `1bGjhJ77Y-s` | -| `WKPreferencesGetProcessSwapOnNavigationEnabled` | `MtlV-fYy3gk` | -| `WKPreferencesGetPunchOutWhiteBackgroundsInDarkMode` | `Qjwn1h+e6hw` | | `WKPreferencesGetQTKitEnabled` | `8N-4nYLwXak` | -| `WKPreferencesGetReferrerPolicyAttributeEnabled` | `Ip0oCnCtcT0` | -| `WKPreferencesGetRemotePlaybackEnabled` | `E+ZoUOTnyFw` | -| `WKPreferencesGetRequestAnimationFrameEnabled` | `SYAxuJLMTFM` | -| `WKPreferencesGetResourceTimingEnabled` | `w9iZlvnkMFU` | -| `WKPreferencesGetResourceUsageOverlayVisible` | `e1kruvXYH6s` | -| `WKPreferencesGetRestrictedHTTPResponseAccess` | `ShfFUIrkUkk` | -| `WKPreferencesGetScrollingPerformanceLoggingEnabled` | `oZRfoAHjO0I` | -| `WKPreferencesGetSelectTrailingWhitespaceEnabled` | `l7Lj6F5gBo0` | -| `WKPreferencesGetServerTimingEnabled` | `z9x75h6MxPM` | -| `WKPreferencesGetServiceControlsEnabled` | `xkf7inWsr-M` | -| `WKPreferencesGetShouldAllowUserInstalledFonts` | `pczcmuVoGFU` | -| `WKPreferencesGetShouldConvertPositionStyleOnCopy` | `etK79qkWJCc` | -| `WKPreferencesGetShouldDisplayCaptions` | `mLv3OywuMTk` | -| `WKPreferencesGetShouldDisplaySubtitles` | `htLZoQXxjEE` | -| `WKPreferencesGetShouldDisplayTextDescriptions` | `TqF1tZVTXFM` | -| `WKPreferencesGetShouldPrintBackgrounds` | `CcMQp8E76TM` | -| `WKPreferencesGetShouldRespectImageOrientation` | `1+FCJWJHZCU` | -| `WKPreferencesGetShouldSuppressKeyboardInputDuringProvisionalNavigation` | `vjl8jLeIG4k` | -| `WKPreferencesGetShouldUseServiceWorkerShortTimeout` | `8eYzxmkntIw` | -| `WKPreferencesGetShowsToolTipOverTruncatedText` | `0vAS7bEXO7k` | -| `WKPreferencesGetShowsURLsInToolTipsEnabled` | `L8CIoipS9j4` | -| `WKPreferencesGetSmartInsertDeleteEnabled` | `3uGJ6hKMv6Y` | -| `WKPreferencesGetSnapshotAllPlugIns` | `0FK6kbZvcvA` | -| `WKPreferencesGetSourceBufferChangeTypeEnabled` | `KeBee2k5Re8` | -| `WKPreferencesGetSpatialNavigationEnabled` | `l0GNH5s-e8U` | -| `WKPreferencesGetStorageAccessAPIEnabled` | `15rPAIJU2YE` | -| `WKPreferencesGetStorageBlockingPolicy` | `q7MbpPmWX5c` | -| `WKPreferencesGetSubpixelAntialiasedLayerTextEnabled` | `B8-G2Ok8Wrk` | -| `WKPreferencesGetSubpixelCSSOMElementMetricsEnabled` | `cSC1n6rXQik` | -| `WKPreferencesGetSuppressesIncrementalRendering` | `p4rQDN6X2Pw` | -| `WKPreferencesGetSyntheticEditingCommandsEnabled` | `tkKBGKmUGa4` | -| `WKPreferencesGetTabsToLinks` | `KNU+bdKmhWo` | -| `WKPreferencesGetTelephoneNumberParsingEnabled` | `JfKwkMqWOyg` | -| `WKPreferencesGetTextAreasAreResizable` | `qQjT3pNT14o` | -| `WKPreferencesGetTextAutosizingEnabled` | `GR+0ko0mEi0` | -| `WKPreferencesGetTextAutosizingUsesIdempotentMode` | `oF3QrlvftiA` | -| `WKPreferencesGetThreadedScrollingEnabled` | `xGsMGzTYI3o` | -| `WKPreferencesGetTiledScrollingIndicatorVisible` | `IKG13mPMFrs` | -| `WKPreferencesGetTopNavigationToDataURLsAllowed` | `K9UQzhrp0qg` | | `WKPreferencesGetTypeID` | `dyqLbVYkq3o` | -| `WKPreferencesGetUniversalAccessFromFileURLsAllowed` | `TDtCTYwcHIs` | -| `WKPreferencesGetUseGiantTiles` | `WPXxdWF+FgQ` | -| `WKPreferencesGetUserInterfaceDirectionPolicy` | `8xcXCQYNlCQ` | -| `WKPreferencesGetUserTimingEnabled` | `4tMXLC7QwyM` | -| `WKPreferencesGetVideoPlaybackRequiresUserGesture` | `o6RX0md55xw` | -| `WKPreferencesGetViewGestureDebuggingEnabled` | `h7mDS1CrXXg` | -| `WKPreferencesGetVisibleDebugOverlayRegions` | `b32cboJlKBM` | -| `WKPreferencesGetWebArchiveDebugModeEnabled` | `mSohbeE5Qfk` | -| `WKPreferencesGetWebAudioEnabled` | `Wqbmub94nLE` | -| `WKPreferencesGetWebAuthenticationEnabled` | `c-+2EXSCk2E` | -| `WKPreferencesGetWebGLEnabled` | `xMe6RPFDPLA` | -| `WKPreferencesGetWebSQLDisabled` | `XE0pNXwREeY` | -| `WKPreferencesGetWebSecurityEnabled` | `DsCIAx5UQQk` | -| `WKPreferencesGetWebShareEnabled` | `CwRFC2F8-2E` | -| `WKPreferencesGetXSSAuditorEnabled` | `xEg9rENUCrA` | -| `WKPreferencesResetAllInternalDebugFeatures` | `q-J0pWv2yqE` | -| `WKPreferencesSetAVFoundationEnabled` | `UVo9HdqYP2c` | -| `WKPreferencesSetAVFoundationNSURLSessionEnabled` | `t1ziJxm-7dM` | | `WKPreferencesSetAccelerated2DCanvasEnabled` | `UEBk9iGqhPo` | -| `WKPreferencesSetAcceleratedCompositingEnabled` | `GIjv95F1IfU` | -| `WKPreferencesSetAcceleratedDrawingEnabled` | `s+C+abjNOWc` | -| `WKPreferencesSetAggressiveTileRetentionEnabled` | `IQen0wTU8Nc` | -| `WKPreferencesSetAllowCrossOriginSubresourcesToAskForCredentials` | `MUyK4dE-KB8` | -| `WKPreferencesSetAllowMediaContentTypesRequiringHardwareSupportAsFallback` | `F6cMNnTEcjU` | -| `WKPreferencesSetAllowsAirPlayForMediaPlayback` | `gsJUoIpMdME` | -| `WKPreferencesSetAllowsPictureInPictureMediaPlayback` | `ykNDaBA+y+k` | -| `WKPreferencesSetAnimatedImageAsyncDecodingEnabled` | `GHbvNOFZd9E` | -| `WKPreferencesSetAntialiasedFontDilationEnabled` | `7pEKaQB9TYI` | -| `WKPreferencesSetApplePayCapabilityDisclosureAllowed` | `VI8kZGN3A2A` | -| `WKPreferencesSetApplePayEnabled` | `sqsMyl+M20c` | -| `WKPreferencesSetArtificialPluginInitializationDelayEnabled` | `PPd5fKTn3XY` | -| `WKPreferencesSetAsynchronousPluginInitializationEnabled` | `FRluBCWNkDA` | -| `WKPreferencesSetAsynchronousPluginInitializationEnabledForAllPlugins` | `3xgqVi8Gd4g` | -| `WKPreferencesSetAsynchronousSpellCheckingEnabled` | `u1UlXA+WAG0` | -| `WKPreferencesSetAttachmentElementEnabled` | `l3LUyryX1Iw` | -| `WKPreferencesSetAudioPlaybackRequiresUserGesture` | `eKuRIaJZ1EY` | -| `WKPreferencesSetAuthorAndUserStylesEnabled` | `MkpOPYf0iTg` | -| `WKPreferencesSetBackspaceKeyNavigationEnabled` | `vz51DOc4a6s` | -| `WKPreferencesSetBeaconAPIEnabled` | `ebxz367IKR8` | -| `WKPreferencesSetCSSOMViewScrollingAPIEnabled` | `6dlDe+C9aGk` | -| `WKPreferencesSetCaptureAudioInGPUProcessEnabled` | `8EQ1k-45LF0` | -| `WKPreferencesSetCaptureAudioInUIProcessEnabled` | `0RY1ClbavWY` | -| `WKPreferencesSetCaptureVideoInGPUProcessEnabled` | `pkuKqhkpVG4` | -| `WKPreferencesSetCaptureVideoInUIProcessEnabled` | `Yau1o4fyQYE` | -| `WKPreferencesSetCaretBrowsingEnabled` | `qiF3loVWl8M` | -| `WKPreferencesSetColorFilterEnabled` | `aA6Blf1LIF4` | -| `WKPreferencesSetCompositingBordersVisible` | `rFW7xEUHq-I` | -| `WKPreferencesSetCompositingRepaintCountersVisible` | `11VA62-jFjU` | -| `WKPreferencesSetCookieEnabled` | `BMP8b5t9wPM` | -| `WKPreferencesSetCrossOriginResourcePolicyEnabled` | `qH-qzNamQcA` | -| `WKPreferencesSetCursiveFontFamily` | `itsatXayviY` | -| `WKPreferencesSetCustomPasteboardDataEnabled` | `OfZnFLuX8+g` | -| `WKPreferencesSetDNSPrefetchingEnabled` | `JSZRv7K8MqM` | -| `WKPreferencesSetDOMPasteAllowed` | `T5o+X-wW0AE` | -| `WKPreferencesSetDOMTimersThrottlingEnabled` | `VpMTrmtXHPE` | -| `WKPreferencesSetDataTransferItemsEnabled` | `RkdBEmqeOcw` | -| `WKPreferencesSetDatabasesEnabled` | `UlzzM1VENZM` | -| `WKPreferencesSetDefaultFixedFontSize` | `GWvTh6Cxidg` | -| `WKPreferencesSetDefaultFontSize` | `6u-wDQcw7aM` | -| `WKPreferencesSetDefaultTextEncodingName` | `oYpubo9Rb8s` | -| `WKPreferencesSetDeveloperExtrasEnabled` | `hWMLhvK9D2g` | -| `WKPreferencesSetDiagnosticLoggingEnabled` | `NpHpKPWNh1M` | -| `WKPreferencesSetDirectoryUploadEnabled` | `cpZlnNQc3IY` | -| `WKPreferencesSetDownloadAttributeEnabled` | `JhCa8+zk0oI` | -| `WKPreferencesSetEditableLinkBehavior` | `OI2Gl1qYpbY` | -| `WKPreferencesSetEnableInheritURIQueryComponent` | `WZhVtxHy5Hk` | -| `WKPreferencesSetEncodingDetectorEnabled` | `eMWhZ2iljvg` | -| `WKPreferencesSetEncryptedMediaAPIEnabled` | `1Q-ExO66G94` | -| `WKPreferencesSetEnumeratingAllNetworkInterfacesEnabled` | `jmZh4NrN1S0` | -| `WKPreferencesSetExperimentalFeatureForKey` | `Z0i8mwHJcf8` | -| `WKPreferencesSetFTPDirectoryTemplatePath` | `kiAvx9Y-Q-0` | -| `WKPreferencesSetFantasyFontFamily` | `AiXfM7pAAgo` | -| `WKPreferencesSetFetchAPIEnabled` | `4JiFsEs9Yyw` | -| `WKPreferencesSetFetchAPIKeepAliveEnabled` | `PLnBrDuEl1Y` | -| `WKPreferencesSetFileAccessFromFileURLsAllowed` | `zlYFwFq6GV8` | -| `WKPreferencesSetFixedFontFamily` | `jpeIEGc1yPA` | -| `WKPreferencesSetForceFTPDirectoryListings` | `SHtstVxKix4` | -| `WKPreferencesSetFrameFlatteningEnabled` | `6sI08fxTRDQ` | -| `WKPreferencesSetFullScreenEnabled` | `-CdmI7pz6Uk` | -| `WKPreferencesSetGamepadsEnabled` | `wts8U0YjzRs` | -| `WKPreferencesSetHTTPEquivEnabled` | `ihjPFw3x2VA` | -| `WKPreferencesSetHiddenPageCSSAnimationSuspensionEnabled` | `zvIq6Rg+sec` | -| `WKPreferencesSetHiddenPageDOMTimerThrottlingAutoIncreases` | `vVxVAZ8z14k` | -| `WKPreferencesSetHiddenPageDOMTimerThrottlingEnabled` | `J98mAY+MsBs` | -| `WKPreferencesSetHighlightAPIEnabled` | `nBCuC-XurKo` | -| `WKPreferencesSetHixie76WebSocketProtocolEnabled` | `dpBLF9M80EY` | -| `WKPreferencesSetHyperlinkAuditingEnabled` | `UgeApjKttsM` | -| `WKPreferencesSetICECandidateFilteringEnabled` | `ltgaNmuCMn4` | -| `WKPreferencesSetIgnoreViewportScalingConstraints` | `jQh1WaXmyHo` | -| `WKPreferencesSetImageControlsEnabled` | `1TOp3pCsV7A` | -| `WKPreferencesSetInactiveMediaCaptureSteamRepromptIntervalInMinutes` | `kTKLhNn54l8` | -| `WKPreferencesSetIncrementalRenderingSuppressionTimeout` | `DdI943QWaTE` | -| `WKPreferencesSetInlineMediaPlaybackRequiresPlaysInlineAttribute` | `B7ciVXz8B14` | -| `WKPreferencesSetInteractiveFormValidationEnabled` | `9ZqL5WUiiXw` | -| `WKPreferencesSetInternalDebugFeatureForKey` | `zqqgK8OxnPQ` | -| `WKPreferencesSetIntersectionObserverEnabled` | `-pAtC74McJ8` | -| `WKPreferencesSetInvisibleMediaAutoplayPermitted` | `IZz5Cy2O52Q` | -| `WKPreferencesSetIsAccessibilityIsolatedTreeEnabled` | `BCcUsMKVXRA` | -| `WKPreferencesSetIsSecureContextAttributeEnabled` | `aFurHdEPXqc` | -| `WKPreferencesSetJavaEnabled` | `dMKbGZFdVLI` | -| `WKPreferencesSetJavaScriptCanAccessClipboard` | `NhU+N-QCz9w` | -| `WKPreferencesSetJavaScriptCanOpenWindowsAutomatically` | `fFLYYJiOIx0` | -| `WKPreferencesSetJavaScriptEnabled` | `gri-rp0Ne+Y` | -| `WKPreferencesSetJavaScriptMarkupEnabled` | `cVRV8StiMBY` | -| `WKPreferencesSetJavaScriptRuntimeFlags` | `ledra0RhS6I` | -| `WKPreferencesSetKeygenElementEnabled` | `wzQ6l9N1svA` | -| `WKPreferencesSetLargeImageAsyncDecodingEnabled` | `YEGbElW0Bos` | -| `WKPreferencesSetLegacyEncryptedMediaAPIEnabled` | `awhEw-iEmcc` | -| `WKPreferencesSetLinkPreloadEnabled` | `x24L8vgb3Wo` | -| `WKPreferencesSetLoadsImagesAutomatically` | `enJGqCsUsBg` | -| `WKPreferencesSetLoadsSiteIconsIgnoringImageLoadingPreference` | `ePb7SaW90CA` | -| `WKPreferencesSetLocalFileContentSniffingEnabled` | `dAkYQ-Y2O88` | -| `WKPreferencesSetLocalStorageEnabled` | `FYlV1evmD0c` | -| `WKPreferencesSetLogsPageMessagesToSystemConsoleEnabled` | `FViWTCmYhfI` | -| `WKPreferencesSetLongMousePressEnabled` | `bkPLMG14uW8` | -| `WKPreferencesSetMainContentUserGestureOverrideEnabled` | `n+WMO5xUXXw` | -| `WKPreferencesSetMediaCapabilitiesEnabled` | `slCSOYBcEOI` | -| `WKPreferencesSetMediaCaptureRequiresSecureConnection` | `jtHgUDo2a74` | -| `WKPreferencesSetMediaContentTypesRequiringHardwareSupport` | `BquE5qCYVGw` | -| `WKPreferencesSetMediaControlsScaleWithPageZoom` | `0OQm7EIMZUs` | -| `WKPreferencesSetMediaDevicesEnabled` | `6yMnkmRUIKA` | -| `WKPreferencesSetMediaPlayable` | `4WLw+JZeJLA` | -| `WKPreferencesSetMediaPlaybackAllowsInline` | `wmi-p2uDgS0` | -| `WKPreferencesSetMediaPlaybackRequiresUserGesture` | `rt9GX+642U0` | -| `WKPreferencesSetMediaPreloadingEnabled` | `s9M5bNj1iwM` | -| `WKPreferencesSetMediaSourceEnabled` | `U9JcaWbbuAs` | -| `WKPreferencesSetMediaStreamEnabled` | `4rxJYR2IbIU` | -| `WKPreferencesSetMediaUserGestureInheritsFromDocument` | `wZk528e6788` | -| `WKPreferencesSetMenuItemElementEnabled` | `VeF6Z+WeJ84` | -| `WKPreferencesSetMetaRefreshEnabled` | `XbtmAGrMGZM` | -| `WKPreferencesSetMinimumFontSize` | `TkV6Eb8ej6c` | -| `WKPreferencesSetMinimumZoomFontSize` | `fnTLa75XU54` | -| `WKPreferencesSetMockCaptureDevicesEnabled` | `NmN7-XSVkU0` | -| `WKPreferencesSetMockScrollbarsEnabled` | `yoKkZ3Mf0bU` | -| `WKPreferencesSetNeedsSiteSpecificQuirks` | `lKgkI3GzBZs` | -| `WKPreferencesSetNeedsStorageAccessFromFileURLsQuirk` | `Yynzyic5YHA` | -| `WKPreferencesSetNewBlockInsideInlineModelEnabled` | `-RWsM4pVi0E` | -| `WKPreferencesSetNotificationsEnabled` | `hXyBi5L7vb4` | -| `WKPreferencesSetOfflineWebApplicationCacheEnabled` | `mBh9vA+yWpU` | -| `WKPreferencesSetPDFPluginEnabled` | `ytGILcCyIuc` | -| `WKPreferencesSetPageCacheEnabled` | `Nfev+xcWn9M` | -| `WKPreferencesSetPageCacheSupportsPlugins` | `afFm5k0o1bg` | -| `WKPreferencesSetPageVisibilityBasedProcessSuppressionEnabled` | `M2eV2Ax+Wa4` | -| `WKPreferencesSetPaginateDuringLayoutEnabled` | `zEWBWsEG9kU` | -| `WKPreferencesSetPaintTimingEnabled` | `j4jpidD-Itk` | -| `WKPreferencesSetPeerConnectionEnabled` | `iTraNBq44Do` | -| `WKPreferencesSetPictographFontFamily` | `KECIldu6iZ4` | -| `WKPreferencesSetPlugInSnapshottingEnabled` | `nDyn07nzty0` | -| `WKPreferencesSetPluginSandboxProfilesEnabledForAllPlugins` | `ljd2tQnZJwk` | -| `WKPreferencesSetPluginsEnabled` | `iH5WG2Vw97w` | -| `WKPreferencesSetPrimaryPlugInSnapshotDetectionEnabled` | `hIKwcwEhcuY` | -| `WKPreferencesSetPrivateBrowsingEnabled` | `fa4XXO3Q7B8` | -| `WKPreferencesSetProcessSwapOnNavigationEnabled` | `GdkV-7Tkijw` | -| `WKPreferencesSetPunchOutWhiteBackgroundsInDarkMode` | `jgt9K5OHpVI` | | `WKPreferencesSetQTKitEnabled` | `6jkxaKVf01A` | -| `WKPreferencesSetReferrerPolicyAttributeEnabled` | `x0OZJuCAlAo` | -| `WKPreferencesSetRemotePlaybackEnabled` | `Ka-tCFE2G84` | -| `WKPreferencesSetRequestAnimationFrameEnabled` | `lrYl5U+ryl0` | -| `WKPreferencesSetResourceTimingEnabled` | `sK8u6H-As9E` | -| `WKPreferencesSetResourceUsageOverlayVisible` | `BPidIRvnZRQ` | -| `WKPreferencesSetRestrictedHTTPResponseAccess` | `vjzot7nsFTY` | -| `WKPreferencesSetSansSerifFontFamily` | `Eo3iJoTQazQ` | -| `WKPreferencesSetScrollingPerformanceLoggingEnabled` | `YNE7yepUciw` | -| `WKPreferencesSetSelectTrailingWhitespaceEnabled` | `PN3W85tGUYw` | -| `WKPreferencesSetSerifFontFamily` | `dc2YCey0wDI` | -| `WKPreferencesSetServerTimingEnabled` | `biQzMorP6PE` | -| `WKPreferencesSetServiceControlsEnabled` | `rTgOs4NhM-E` | -| `WKPreferencesSetShouldAllowUserInstalledFonts` | `JFSfX9g9dy0` | -| `WKPreferencesSetShouldConvertPositionStyleOnCopy` | `nYgxNM6MO90` | -| `WKPreferencesSetShouldDisplayCaptions` | `Ak7b6A9cJvc` | -| `WKPreferencesSetShouldDisplaySubtitles` | `6hfyVLzdy9I` | -| `WKPreferencesSetShouldDisplayTextDescriptions` | `qsolSac3t68` | -| `WKPreferencesSetShouldPrintBackgrounds` | `hsr4NjC3kho` | -| `WKPreferencesSetShouldRespectImageOrientation` | `5-ulmjWNkbQ` | -| `WKPreferencesSetShouldSuppressKeyboardInputDuringProvisionalNavigation` | `c7b+WzTY6Co` | -| `WKPreferencesSetShouldUseServiceWorkerShortTimeout` | `fI6tT2-+1Qk` | -| `WKPreferencesSetShowsToolTipOverTruncatedText` | `JHAYKa2Q2hw` | -| `WKPreferencesSetShowsURLsInToolTipsEnabled` | `NizKX0O0WL4` | -| `WKPreferencesSetSmartInsertDeleteEnabled` | `wuKE2HtEBv8` | -| `WKPreferencesSetSnapshotAllPlugIns` | `VpnRVAozBCQ` | -| `WKPreferencesSetSourceBufferChangeTypeEnabled` | `xhH2dgpJC70` | -| `WKPreferencesSetSpatialNavigationEnabled` | `KEwNCmLeQH0` | -| `WKPreferencesSetStorageAccessAPIEnabled` | `p0eCRmPrfns` | -| `WKPreferencesSetStorageBlockingPolicy` | `vcRPgIzgnpg` | -| `WKPreferencesSetSubpixelAntialiasedLayerTextEnabled` | `H-jGYRkbVE4` | -| `WKPreferencesSetSubpixelCSSOMElementMetricsEnabled` | `7dqSnW4K+ok` | -| `WKPreferencesSetSuppressesIncrementalRendering` | `F0pINIU7TtY` | -| `WKPreferencesSetSyntheticEditingCommandsEnabled` | `eT9vBUywDRw` | -| `WKPreferencesSetTabsToLinks` | `o0n5bcVYtN0` | -| `WKPreferencesSetTelephoneNumberParsingEnabled` | `3sTGJxsk2tM` | -| `WKPreferencesSetTextAreasAreResizable` | `M1OFnlIAH-8` | -| `WKPreferencesSetTextAutosizingEnabled` | `owCRS3+wOwk` | -| `WKPreferencesSetTextAutosizingUsesIdempotentMode` | `6ebqMkrKndk` | -| `WKPreferencesSetThreadedScrollingEnabled` | `VehaKjlHG2c` | -| `WKPreferencesSetTiledScrollingIndicatorVisible` | `o0qLNFGzBgw` | -| `WKPreferencesSetTopNavigationToDataURLsAllowed` | `r-LTgAHhLHQ` | -| `WKPreferencesSetUniversalAccessFromFileURLsAllowed` | `RQqcnQJszJI` | -| `WKPreferencesSetUseGiantTiles` | `sH97Xl4NkSs` | -| `WKPreferencesSetUserInterfaceDirectionPolicy` | `Um-RcJhrQYw` | -| `WKPreferencesSetUserTimingEnabled` | `a2nS6F4hBDI` | -| `WKPreferencesSetVideoPlaybackRequiresUserGesture` | `d8OlbJ+fuX4` | -| `WKPreferencesSetViewGestureDebuggingEnabled` | `wOe+n1xNytw` | -| `WKPreferencesSetVisibleDebugOverlayRegions` | `LsVLIew2D-w` | -| `WKPreferencesSetWebArchiveDebugModeEnabled` | `Aw2xTP5uAG0` | -| `WKPreferencesSetWebAudioEnabled` | `iRfxJ54qlG0` | -| `WKPreferencesSetWebAuthenticationEnabled` | `c4e-vuKRjn0` | -| `WKPreferencesSetWebGLEnabled` | `bFmgCQYlHAw` | -| `WKPreferencesSetWebSQLDisabled` | `nm7E-8HX0jE` | -| `WKPreferencesSetWebSecurityEnabled` | `YQRWoaNNiWM` | -| `WKPreferencesSetWebShareEnabled` | `7lu35eETqeQ` | -| `WKPreferencesSetXSSAuditorEnabled` | `f4VeCjTa2hA` | | `WKProtectionSpaceCopyCertificateInfo` | `FdhooB4MqkE` | | `WKProtectionSpaceCopyHost` | `U0xPrr5rnH4` | | `WKProtectionSpaceCopyRealm` | `osSHWP92dx4` | @@ -1435,12 +770,7 @@ | `WKProtectionSpaceGetPort` | `ABcMO6bA+mw` | | `WKProtectionSpaceGetReceivesCredentialSecurely` | `GbcKdx3JDJw` | | `WKProtectionSpaceGetServerType` | `ZcwgROJJWSo` | -| `WKProtectionSpaceGetTypeID` | `aF1OmU3HiZ0` | -| `WKRectCreate` | `E5OsEQbrnvk` | -| `WKRectGetTypeID` | `0jpKR6tsSyc` | -| `WKRectGetValue` | `Pf0ke26Zigo` | | `WKRegistrableDomainCreate` | `BjwTHxBa4gc` | -| `WKRelease` | `lwLheZe67v0` | | `WKRemoveMockMediaDevice` | `Dr2VufJK70A` | | `WKRenderLayerCopyElementID` | `lRlQXPSYfTI` | | `WKRenderLayerCopyElementTagName` | `mtWy8+9VNV4` | @@ -1454,7 +784,6 @@ | `WKRenderLayerGetNormalFlowList` | `mFGaMlruNv4` | | `WKRenderLayerGetPositiveZOrderList` | `AKduh-C7Ukw` | | `WKRenderLayerGetRenderer` | `FgHJrrJSptw` | -| `WKRenderLayerGetTypeID` | `7+7EZDESn0U` | | `WKRenderLayerIsClipped` | `qnVSx0dMIj4` | | `WKRenderLayerIsClipping` | `TTHhexfjJ1E` | | `WKRenderLayerIsReflection` | `AIOn++bTCGY` | @@ -1467,13 +796,10 @@ | `WKRenderObjectGetElementClassNames` | `NkEITXscsR4` | | `WKRenderObjectGetFrameRect` | `CvLd+zsiNGM` | | `WKRenderObjectGetTextLength` | `QQwtijo98qI` | -| `WKRenderObjectGetTypeID` | `XiNGBFEOnDs` | | `WKResetMockMediaDevices` | `atK8tRkYvFI` | | `WKResourceCacheManagerClearCacheForAllOrigins` | `g-SjvruXQtc` | | `WKResourceCacheManagerClearCacheForOrigin` | `Sq7E7Dwlq0w` | | `WKResourceCacheManagerGetCacheOrigins` | `v+SAyXDkOCI` | -| `WKResourceCacheManagerGetTypeID` | `oNdsLXxf6Zo` | -| `WKRetain` | `v7rWMZ9150M` | | `WKRunLoopCallOnMainThread` | `2haZWaB3Gcs` | | `WKRunLoopInitializeMain` | `L8wKvGYzNDU` | | `WKRunLoopRunMain` | `7REoZxCEojI` | @@ -1486,87 +812,39 @@ | `WKSecurityOriginCreateFromDatabaseIdentifier` | `50a9aq8a5AQ` | | `WKSecurityOriginCreateFromString` | `SfMLraLeAvo` | | `WKSecurityOriginGetPort` | `8QtMUIaB7Uk` | -| `WKSecurityOriginGetTypeID` | `rha5LcpZjAI` | | `WKSendDisplayConfigurationChangedMessageForTesting` | `CQsllLq8d7I` | | `WKSerializedScriptValueCreate` | `10fsdhg9448` | | `WKSerializedScriptValueDeserialize` | `GzcqLy9vAYY` | -| `WKSerializedScriptValueGetTypeID` | `BcT3QQZ44HU` | | `WKSessionStateCopyData` | `Uybzrh+1nJE` | | `WKSessionStateCreateFromData` | `AMrPlFNJec8` | -| `WKSessionStateGetTypeID` | `08Mldv4GCkE` | -| `WKSizeCreate` | `QLHb6Lpy4kE` | -| `WKSizeGetTypeID` | `KHT8IFOs2KM` | -| `WKSizeGetValue` | `sNEbgt8b2z4` | -| `WKStringCopyJSString` | `Vd4gElytvJs` | -| `WKStringCreateWithJSString` | `Zo1yv7m+mY0` | -| `WKStringCreateWithUTF8CString` | `kOwDs0cPXSI` | -| `WKStringGetCharacters` | `ZMt1qFgeRyM` | -| `WKStringGetLength` | `+zfvXbPVJT0` | -| `WKStringGetMaximumUTF8CStringSize` | `Kc5iNPK+E78` | -| `WKStringGetTypeID` | `U3EQ4p0-HhY` | -| `WKStringGetUTF8CStringNonStrict` | `g3Qdjto8V0g` | -| `WKStringGetUTF8CString` | `yjHAiyDd7+o` | -| `WKStringIsEmpty` | `1YQJbkuXzWI` | -| `WKStringIsEqualToUTF8CStringIgnoringCase` | `1PZkUODbkfA` | -| `WKStringIsEqualToUTF8CString` | `iehMlfnzitM` | -| `WKStringIsEqual` | `XVMW7SSyhiI` | | `WKTextCheckerSetTestingMode` | `uhbwdrVWKnk` | -| `WKUInt64Create` | `h3NZavyUBAI` | -| `WKUInt64GetTypeID` | `jefrnRrBwwM` | -| `WKUInt64GetValue` | `FYSe6iue9yo` | | `WKURLCopyHostName` | `eL7PAmyp2fs` | | `WKURLCopyLastPathComponent` | `zjB-cbY-OcE` | | `WKURLCopyPath` | `DZzXHBYmlw0` | | `WKURLCopyScheme` | `GmJyq9LDPJs` | -| `WKURLCopyString` | `aRjNtzjjqD8` | | `WKURLCreateWithBaseURL` | `W+FQt2MUK+4` | -| `WKURLCreateWithUTF8CString` | `DR1TVxyTPKc` | -| `WKURLGetTypeID` | `I8R9aSsT2C0` | | `WKURLIsEqual` | `S9pzhyNVdFE` | | `WKURLRequestCopyFirstPartyForCookies` | `l0Hmd0lFea8` | | `WKURLRequestCopyHTTPMethod` | `SxWVkTIB01Y` | | `WKURLRequestCopySettingHTTPBody` | `LOgEfXqoLL0` | | `WKURLRequestCopyURL` | `n-9+9Xe90t4` | | `WKURLRequestCreateWithWKURL` | `TC9965WYLHM` | -| `WKURLRequestGetTypeID` | `sTmBGgQPBIU` | | `WKURLRequestSetDefaultTimeoutInterval` | `YXTIbI-WYtE` | | `WKURLResponseCopyMIMEType` | `byPai8g0cxM` | | `WKURLResponseCopySuggestedFilename` | `+xdJWXA20fg` | | `WKURLResponseCopyURL` | `fsZdiho79Qs` | | `WKURLResponseGetExpectedContentLength` | `urWbmBbaVjM` | -| `WKURLResponseGetTypeID` | `Ns0SeI2eKaU` | | `WKURLResponseHTTPStatusCode` | `V8sTDUESRVE` | | `WKURLResponseIsAttachment` | `73gjSG1YiTU` | -| `WKUserContentControllerAddUserContentFilter` | `uiNw6AxXTIs` | -| `WKUserContentControllerAddUserScript` | `q4zrlHzLmi4` | -| `WKUserContentControllerCopyUserScripts` | `hW-9++DsvQ4` | -| `WKUserContentControllerCreate` | `DxVrjV-GW0M` | -| `WKUserContentControllerGetTypeID` | `Mb17d0l5rU8` | -| `WKUserContentControllerRemoveAllUserContentFilters` | `D8GfkqC2eYU` | -| `WKUserContentControllerRemoveAllUserScripts` | `lT7zcuOXoKo` | | `WKUserContentExtensionStoreCompile` | `6g8aRptom6Y` | | `WKUserContentExtensionStoreCreate` | `qlWLlgf0DyY` | -| `WKUserContentExtensionStoreGetTypeID` | `KTNKiQiq0o8` | | `WKUserContentExtensionStoreLookup` | `l8gsEeVfp+s` | -| `WKUserContentURLPatternCopyHost` | `rul24vLhE0Q` | -| `WKUserContentURLPatternCopyScheme` | `3Gn+E5AVeCg` | -| `WKUserContentURLPatternCreate` | `m58lpCIGa1o` | -| `WKUserContentURLPatternGetTypeID` | `XVIG0ICGRpM` | -| `WKUserContentURLPatternIsValid` | `j5gK4TdLd8Q` | -| `WKUserContentURLPatternMatchesSubdomains` | `Lnzqj7zDJho` | | `WKUserContentURLPatternMatchesURL` | `JfpZWg77-Zw` | -| `WKUserMediaPermissionCheckGetTypeID` | `D-e3WfA3w-U` | | `WKUserMediaPermissionCheckSetUserMediaAccessInfo` | `MBwkZncofuk` | | `WKUserMediaPermissionRequestAllow` | `luXC7N4AUUk` | | `WKUserMediaPermissionRequestAudioDeviceUIDs` | `AZbcxbfE7Ik` | | `WKUserMediaPermissionRequestDeny` | `u4w4eIh6yBI` | -| `WKUserMediaPermissionRequestGetTypeID` | `sgICbJoUPj4` | | `WKUserMediaPermissionRequestVideoDeviceUIDs` | `Ayqs7t7iPd4` | -| `WKUserScriptCopySource` | `2SVtfbYe8Ps` | -| `WKUserScriptCreateWithSource` | `ip+ObaxsB3w` | -| `WKUserScriptGetInjectionTime` | `QIkZhXvpyO4` | -| `WKUserScriptGetMainFrameOnly` | `qcM8nnO-V2k` | -| `WKUserScriptGetTypeID` | `pMkuOcjPRsk` | | `WKViewAccessibilityFocusedObject` | `mQOmuuuwvXk` | | `WKViewAccessibilityHitTest` | `9XouNrl+xF0` | | `WKViewAccessibilityRootObject` | `7R83-mIE4ik` | @@ -1587,40 +865,9 @@ | `WKViewValueChangedForPopupMenu` | `rr8g0GkA+GE` | | `WKViewWillEnterFullScreen` | `Qv917g7goow` | | `WKViewWillExitFullScreen` | `6o4itIbqsY8` | -| `WKViewportAttributesGetTypeID` | `y-vtU6-d5-Y` | | `WKWebsiteDataStoreClearAllDeviceOrientationPermissions` | `4go6vGk6E+A` | | `WKWebsiteDataStoreClearAppBoundSession` | `YujMtLJPOok` | | `WKWebsiteDataStoreClearBundleIdentifierInNetworkProcess` | `Mrp3OVQ9jI4` | -| `WKWebsiteDataStoreConfigurationCopyApplicationCacheDirectory` | `7wxcVuLXjCU` | -| `WKWebsiteDataStoreConfigurationCopyCacheStorageDirectory` | `AUn2aRDId28` | -| `WKWebsiteDataStoreConfigurationCopyCookieStorageFile` | `MfE6TL7FiRc` | -| `WKWebsiteDataStoreConfigurationCopyIndexedDBDatabaseDirectory` | `u-FTU5Apy+4` | -| `WKWebsiteDataStoreConfigurationCopyLocalStorageDirectory` | `PEAZaQLLjnY` | -| `WKWebsiteDataStoreConfigurationCopyMediaKeysStorageDirectory` | `8foS4r5VM2M` | -| `WKWebsiteDataStoreConfigurationCopyNetworkCacheDirectory` | `lNi53JL+QIw` | -| `WKWebsiteDataStoreConfigurationCopyResourceLoadStatisticsDirectory` | `SCw7-qws4dU` | -| `WKWebsiteDataStoreConfigurationCopyServiceWorkerRegistrationDirectory` | `tu-Ex57uUFI` | -| `WKWebsiteDataStoreConfigurationCopyWebSQLDatabaseDirectory` | `Nv9RRgkwewY` | -| `WKWebsiteDataStoreConfigurationCreate` | `miRJUYf51k4` | -| `WKWebsiteDataStoreConfigurationGetNetworkCacheSpeculativeValidationEnabled` | `EpyWvhlGDaw` | -| `WKWebsiteDataStoreConfigurationGetPerOriginStorageQuota` | `ZD-0e3b7Leo` | -| `WKWebsiteDataStoreConfigurationGetStaleWhileRevalidateEnabled` | `fsdDK9+jXuI` | -| `WKWebsiteDataStoreConfigurationGetTestingSessionEnabled` | `JvTTJlj3YmE` | -| `WKWebsiteDataStoreConfigurationGetTypeID` | `19rW9Jqrx+A` | -| `WKWebsiteDataStoreConfigurationSetApplicationCacheDirectory` | `uIS-li19ItI` | -| `WKWebsiteDataStoreConfigurationSetCacheStorageDirectory` | `vhBlGxkfit4` | -| `WKWebsiteDataStoreConfigurationSetCookieStorageFile` | `shn5GKv+7Rs` | -| `WKWebsiteDataStoreConfigurationSetIndexedDBDatabaseDirectory` | `k3fGJSLc5FI` | -| `WKWebsiteDataStoreConfigurationSetLocalStorageDirectory` | `QPydzIZAUdU` | -| `WKWebsiteDataStoreConfigurationSetMediaKeysStorageDirectory` | `TJVkpK-C6G0` | -| `WKWebsiteDataStoreConfigurationSetNetworkCacheDirectory` | `qpUgzdXZkLA` | -| `WKWebsiteDataStoreConfigurationSetNetworkCacheSpeculativeValidationEnabled` | `v-PIc7iEKIs` | -| `WKWebsiteDataStoreConfigurationSetPerOriginStorageQuota` | `ej9lV7VhqBw` | -| `WKWebsiteDataStoreConfigurationSetResourceLoadStatisticsDirectory` | `oTGmwGHklf0` | -| `WKWebsiteDataStoreConfigurationSetServiceWorkerRegistrationDirectory` | `TJmXkFe3Cbo` | -| `WKWebsiteDataStoreConfigurationSetStaleWhileRevalidateEnabled` | `rzMyjrfU6Ag` | -| `WKWebsiteDataStoreConfigurationSetTestingSessionEnabled` | `-UrHIrgeKrM` | -| `WKWebsiteDataStoreConfigurationSetWebSQLDatabaseDirectory` | `ubUpW4CUi58` | | `WKWebsiteDataStoreCreateNonPersistentDataStore` | `hzBAQGt4hMw` | | `WKWebsiteDataStoreCreateWithConfiguration` | `gJCqCiXkwDU` | | `WKWebsiteDataStoreDisableNetworkProxySettings` | `k2niR5Rxn84` | @@ -1634,7 +881,6 @@ | `WKWebsiteDataStoreGetFetchCacheSizeForOrigin` | `hZS58BxCAV8` | | `WKWebsiteDataStoreGetHTTPCookieStore` | `hOXOdd6Lp5g` | | `WKWebsiteDataStoreGetResourceLoadStatisticsEnabled` | `2H0q+W0RyYk` | -| `WKWebsiteDataStoreGetTypeID` | `sksl7DuWb9c` | | `WKWebsiteDataStoreIsStatisticsEphemeral` | `TzInlmRQcHw` | | `WKWebsiteDataStoreIsStatisticsGrandfathered` | `Ud+1jEz8LWc` | | `WKWebsiteDataStoreIsStatisticsHasHadUserInteraction` | `7EqOpt3gTIg` | @@ -1700,53 +946,8 @@ | `WKWebsiteDataStoreStatisticsResetToConsistentState` | `cPsMwFBQkYw` | | `WKWebsiteDataStoreStatisticsUpdateCookieBlocking` | `eVnCOMC5iO4` | | `WKWebsiteDataStoreUpdateBundleIdentifierInNetworkProcess` | `bg+X3d1K+mU` | -| `WKWebsitePoliciesCopyCustomHeaderFields` | `3G3NkSJ-kwc` | -| `WKWebsitePoliciesCreate` | `ZvmJz4fcT1o` | -| `WKWebsitePoliciesGetAllowedAutoplayQuirks` | `gNM1XISuMUQ` | -| `WKWebsitePoliciesGetAutoplayPolicy` | `IsJVYLiBgow` | -| `WKWebsitePoliciesGetContentBlockersEnabled` | `zQsd8K1pV6A` | -| `WKWebsitePoliciesGetDataStore` | `5w55Rh-7xNM` | -| `WKWebsitePoliciesGetPopUpPolicy` | `NTK-RerXvZ4` | -| `WKWebsitePoliciesGetTypeID` | `epOoacB68yE` | -| `WKWebsitePoliciesSetAutoplayPolicy` | `TwLxp0uv5lM` | -| `WKWebsitePoliciesSetContentBlockersEnabled` | `qYIaDKP6Xx4` | -| `WKWebsitePoliciesSetCustomHeaderFields` | `Q4lonvz8bSg` | -| `WKWebsitePoliciesSetDataStore` | `LRz04P5K1Ao` | -| `WKWebsitePoliciesSetPopUpPolicy` | `u4D+PriSpxE` | -| `WKWindowFeaturesGetTypeID` | `jtKsxN12YfA` | -| `WTFCrashWithSecurityImplication` | `J70xb+ZpKFM` | -| `WTFCrash` | `bYmGOdgqDKc` | -| `WTFGetBacktrace` | `Z0eb0mzQMfE` | -| `WTFInitializeLogChannelStatesFromString` | `YdJfGJ4kryk` | -| `WTFIsDebuggerAttached` | `eIfqo4s541w` | -| `WTFLogAlwaysAndCrash` | `rcYIfDMSmbg` | -| `WTFLogAlways` | `jSKwfmNwSTY` | -| `WTFLogChannelByName` | `rx2qbyMARn8` | -| `WTFLogVerbose` | `j7J7DtkLt9A` | -| `WTFLogWithLevel` | `y3Yqewe4JAU` | -| `WTFLog` | `peWBA9e0+AM` | -| `WTFPrintBacktrace` | `mBS9mviaUk8` | -| `WTFReportArgumentAssertionFailure` | `Ta+JC0maV8o` | -| `WTFReportAssertionFailureWithMessage` | `VPVYBR6zPag` | -| `WTFReportAssertionFailure` | `n9DxFKQWQFI` | -| `WTFReportBacktrace` | `G9Iyt5lxwvs` | -| `WTFReportError` | `ZgkSGlEl1hk` | -| `WTFReportFatalError` | `tHn68ic3YC4` | -| `WTFReportNotImplementedYet` | `EDdShKgRXAM` | -| `WTFWillLogWithLevel` | `MmFRBBJMUlw` | -| `_Z20WTFCrashWithInfoImpliPKcS0_im` | `cqoRyqFKVts` | -| `_Z20WTFCrashWithInfoImpliPKcS0_imm` | `OK7SJat0qwI` | -| `_Z20WTFCrashWithInfoImpliPKcS0_immmm` | `ZU4MapJqM0U` | -| `_Z20WTFCrashWithInfoImpliPKcS0_immmmm` | `9+6bMQWFZQg` | -| `_Z20WTFCrashWithInfoImpliPKcS0_immmmmm` | `CCThZGN3PEk` | -| `_Z20WTFCrashWithInfoImpliPKcS0_immmmmmm` | `cTWdQpoKaBY` | -| `_Z20WTFCrashWithInfoImpliPKcS0_immm` | `u9Hwxp2D0c8` | -| `_ZN13OpaqueJSClassD1Ev` | `U7HgCKaRu4s` | -| `_ZN13OpaqueJSClassD2Ev` | `6206R5Ww+sc` | | `_ZN14OpaqueJSString9tryCreateEON3WTF6StringE` | `mcOkVwJvgME` | | `_ZN14OpaqueJSString9tryCreateERKN3WTF6StringE` | `PVV6vSXtXwE` | -| `_ZN14OpaqueJSStringD1Ev` | `MIvGFlW3XyI` | -| `_ZN14OpaqueJSStringD2Ev` | `xJrAJW1ibOs` | | `_ZN3JSC10ConfigFile14setProcessNameEPKc` | `gU19IpVh5DQ` | | `_ZN3JSC10ConfigFile20setParentProcessNameEPKc` | `AeTgkm3kN-k` | | `_ZN3JSC10ConfigFile5parseEv` | `6Ur0PoWQ2mc` | @@ -1966,7 +1167,6 @@ | `_ZN3JSC16SamplingProfiler39noticeCurrentThreadAsJSCExecutionThreadEv` | `s7ZkDunmDMo` | | `_ZN3JSC16SamplingProfiler5startEv` | `z8s5YSelTK8` | | `_ZN3JSC16SymbolTableEntry16freeFatEntrySlowEv` | `LyiYFmzddAU` | -| `_ZN3JSC16clearArrayMemsetEPdj` | `fkaBx1FOo+g` | | `_ZN3JSC16createRangeErrorEPNS_14JSGlobalObjectERKN3WTF6StringE` | `EKW4neZCdQQ` | | `_ZN3JSC16profiledEvaluateEPNS_14JSGlobalObjectENS_15ProfilingReasonERKNS_10SourceCodeENS_7JSValueERN3WTF8NakedPtrINS_9ExceptionEEE` | `Lvv0FhW0b-0` | | `_ZN3JSC16setNeverOptimizeEPK15OpaqueJSContextPK13OpaqueJSValue` | `P2QIyj9sjR0` | @@ -2037,8 +1237,6 @@ | `_ZN3JSC18PropertyDescriptor21setAccessorDescriptorEPNS_12GetterSetterEj` | `1U1HXAR-PdU` | | `_ZN3JSC18PropertyDescriptor9setGetterENS_7JSValueE` | `9tHTHaoaTRU` | | `_ZN3JSC18PropertyDescriptor9setSetterENS_7JSValueE` | `nJ0Pu5MzLBw` | -| `_ZN3JSC18enableSuperSamplerEv` | `WJXuUnREXZ4` | -| `_ZN3JSC18logTotalPhaseTimesEv` | `UU8OQd42DFk` | | `_ZN3JSC19HeapSnapshotBuilder11analyzeNodeEPNS_6JSCellE` | `6+Ilj5seAW8` | | `_ZN3JSC19HeapSnapshotBuilder13buildSnapshotEv` | `KJoz6a9hUJQ` | | `_ZN3JSC19HeapSnapshotBuilder15setLabelForCellEPNS_6JSCellERKN3WTF6StringE` | `WudmiYuePRQ` | @@ -2070,7 +1268,6 @@ | `_ZN3JSC19SourceProviderCache5clearEv` | `fIWHyK5ncmg` | | `_ZN3JSC19SourceProviderCacheD1Ev` | `bWq0yN2dxGA` | | `_ZN3JSC19SourceProviderCacheD2Ev` | `LcMJhTa9y+c` | -| `_ZN3JSC19disableSuperSamplerEv` | `SNdZ+yGT2Tg` | | `_ZN3JSC19iteratorForIterableEPNS_14JSGlobalObjectENS_7JSValueE` | `MQZ5eEw6RLk` | | `_ZN3JSC19iteratorForIterableEPNS_14JSGlobalObjectEPNS_8JSObjectENS_7JSValueE` | `KuwfGqH0wQs` | | `_ZN3JSC19numberOfDFGCompilesENS_7JSValueE` | `hRh5HG-czGg` | @@ -2082,7 +1279,6 @@ | `_ZN3JSC20createReferenceErrorEPNS_14JSGlobalObjectERKN3WTF6StringE` | `rA7E7LfU7Sk` | | `_ZN3JSC20failNextNewCodeBlockEPK15OpaqueJSContext` | `qdvU43se+yY` | | `_ZN3JSC20failNextNewCodeBlockEPNS_14JSGlobalObjectE` | `w00D0ddSQLA` | -| `_ZN3JSC20waitForVMDestructionEv` | `Po2PGyK-DwM` | | `_ZN3JSC21MarkedJSValueRefArrayC2EP15OpaqueJSContextj` | `YnZOHtC8PgY` | | `_ZN3JSC21MarkedJSValueRefArrayD1Ev` | `nYh9OiczTZM` | | `_ZN3JSC21getInt8ArrayClassInfoEv` | `lNZ3n4I2ifo` | @@ -2122,7 +1318,6 @@ | `_ZN3JSC22globalMemoryStatisticsEv` | `6+mBcQlHzNg` | | `_ZN3JSC22optimizeNextInvocationENS_7JSValueE` | `QtEl0Z5ogAE` | | `_ZN3JSC22optimizeNextInvocationEPNS_14JSGlobalObjectEPNS_9CallFrameE` | `9WSnQEt0mxM` | -| `_ZN3JSC22printSuperSamplerStateEv` | `FoDIzczBEy4` | | `_ZN3JSC23AbstractSamplingCounter4dumpEv` | `NO8LGTKyCTk` | | `_ZN3JSC23JSModuleNamespaceObjectC1ERNS_2VMEPNS_9StructureE` | `fRcAtZp5MOQ` | | `_ZN3JSC23JSModuleNamespaceObjectC2ERNS_2VMEPNS_9StructureE` | `whnNR7vJo40` | @@ -2147,12 +1342,9 @@ | `_ZN3JSC25JSSegmentedVariableObject12addVariablesEjNS_7JSValueE` | `3+Qr0+VLg+0` | | `_ZN3JSC25JSSegmentedVariableObject17findVariableIndexEPv` | `pyKuV2SE-jQ` | | `_ZN3JSC25jsStringWithCacheSlowCaseERNS_2VMERN3WTF10StringImplE` | `kfaKs9xDzbo` | -| `_ZN3JSC25numberOfOSRExitFuzzChecksEv` | `0yriBj5rS3U` | | `_ZN3JSC26createIteratorResultObjectEPNS_14JSGlobalObjectENS_7JSValueEb` | `zemLlPNbl-g` | | `_ZN3JSC26evaluateWithScopeExtensionEPNS_14JSGlobalObjectERKNS_10SourceCodeEPNS_8JSObjectERN3WTF8NakedPtrINS_9ExceptionEEE` | `MZdPfTkA+uc` | | `_ZN3JSC26setCannotUseOSRExitFuzzingEPNS_14JSGlobalObjectEPNS_9CallFrameE` | `p8J-f9vV8so` | -| `_ZN3JSC27finalizeStatsAtEndOfTestingEv` | `cD6y6-gGmv4` | -| `_ZN3JSC27numberOfExceptionFuzzChecksEv` | `44NqyrtBMMk` | | `_ZN3JSC28getHashMapBucketKeyClassInfoEv` | `79OE9ov2-JQ` | | `_ZN3JSC29constructArrayNegativeIndexedEPNS_14JSGlobalObjectEPNS_9StructureEPKNS_7JSValueEj` | `cSsNeg1iICY` | | `_ZN3JSC29createNotEnoughArgumentsErrorEPNS_14JSGlobalObjectE` | `6sNCMCcDva8` | @@ -2178,8 +1370,6 @@ | `_ZN3JSC2VM9tryCreateENS_8HeapTypeEPN3WTF7RunLoopE` | `u4YLcz+Oh-M` | | `_ZN3JSC2VMD1Ev` | `cQvetBe+n6M` | | `_ZN3JSC2VMD2Ev` | `y8YNNx71uI0` | -| `_ZN3JSC30waitForAsynchronousDisassemblyEv` | `Dy6dHzIb0WA` | -| `_ZN3JSC31numberOfStaticOSRExitFuzzChecksEv` | `PvR1kzb7Nrg` | | `_ZN3JSC32JSDestructibleObjectHeapCellTypeC1Ev` | `Ot6Xfs+KjC4` | | `_ZN3JSC32JSDestructibleObjectHeapCellTypeC2Ev` | `3X+cZHapioA` | | `_ZN3JSC32JSDestructibleObjectHeapCellTypeD0Ev` | `YxdY94Fw670` | @@ -2188,7 +1378,6 @@ | `_ZN3JSC32throwDOMAttributeGetterTypeErrorEPNS_14JSGlobalObjectERNS_10ThrowScopeEPKNS_9ClassInfoENS_12PropertyNameE` | `hcr91gUh9Mw` | | `_ZN3JSC33getHashMapBucketKeyValueClassInfoEv` | `FMhcXpjqzIc` | | `_ZN3JSC35getSomeBaselineCodeBlockForFunctionENS_7JSValueE` | `CYkcE1YQNeg` | -| `_ZN3JSC38numberOfExecutableAllocationFuzzChecksEv` | `gonN1KzF8wA` | | `_ZN3JSC3DFG18getNumCompilationsEv` | `36QNLZCsGZ8` | | `_ZN3JSC41constructFunctionSkippingEvalEnabledCheckEPNS_14JSGlobalObjectERKNS_7ArgListERKNS_10IdentifierERKNS_12SourceOriginERKN3WTF6StringERKNSB_12TextPositionEiNS_24FunctionConstructionModeENS_7JSValueE` | `1usDFC2WXJ4` | | `_ZN3JSC41constructObjectFromPropertyDescriptorSlowEPNS_14JSGlobalObjectERKNS_18PropertyDescriptorE` | `RoiTvhwOekc` | @@ -2366,7 +1555,6 @@ | `_ZN3JSC9StructureC1ERNS_2VMEPNS_14JSGlobalObjectENS_7JSValueERKNS_8TypeInfoEPKNS_9ClassInfoEhj` | `JvQlBVLkDuU` | | `_ZN3JSC9StructureC2ERNS_2VMEPNS_14JSGlobalObjectENS_7JSValueERKNS_8TypeInfoEPKNS_9ClassInfoEhj` | `wA33q23RD+A` | | `_ZN3JSC9constructEPNS_14JSGlobalObjectENS_7JSValueERKNS_8CallDataERKNS_7ArgListES2_` | `kfbMCFJxb6E` | -| `_ZN3PAL10systemBeepEv` | `4vI9lIREBzc` | | `_ZN3PAL12CryptoDigest11computeHashEv` | `XCaHXZDgzVk` | | `_ZN3PAL12CryptoDigest8addBytesEPKvm` | `k0PVLsctcUs` | | `_ZN3PAL12CryptoDigestD1Ev` | `OT1pwqHrDKg` | @@ -2396,15 +1584,8 @@ | `_ZN3WTF10ParkingLot21parkConditionallyImplEPKvRKNS_12ScopedLambdaIFbvEEERKNS3_IFvvEEERKNS_24TimeWithDynamicClockTypeE` | `NRUy9MCPBJI` | | `_ZN3WTF10ParkingLot9unparkAllEPKv` | `ocD3Wh0yT1E` | | `_ZN3WTF10ParkingLot9unparkOneEPKv` | `56Wsrmx3txk` | -| `_ZN3WTF10StringImpl11reverseFindEDsj` | `VzJ+wuTOprM` | | `_ZN3WTF10StringImpl17utf8ForCharactersEPKDsjNS_14ConversionModeE` | `NvD7vqlu22E` | | `_ZN3WTF10StringImpl17utf8ForCharactersEPKhj` | `o5VwYgTgLtU` | -| `_ZN3WTF10StringImpl19characterStartingAtEj` | `duxNFZJFnJU` | -| `_ZN3WTF10StringImpl19createUninitializedEjRPDs` | `ifN6TwFG-z4` | -| `_ZN3WTF10StringImpl19createUninitializedEjRPh` | `VUt75MJDQeE` | -| `_ZN3WTF10StringImpl20create8BitIfPossibleEPKDsj` | `hCzmxMj+3rU` | -| `_ZN3WTF10StringImpl23convertToASCIILowercaseEv` | `1U0ISnl-L-A` | -| `_ZN3WTF10StringImpl23convertToASCIIUppercaseEv` | `NDvMOmW2dH0` | | `_ZN3WTF10StringImpl28convertToLowercaseWithLocaleERKNS_10AtomStringE` | `5SrekqH5TJQ` | | `_ZN3WTF10StringImpl28convertToUppercaseWithLocaleERKNS_10AtomStringE` | `LO6XXCwAPyU` | | `_ZN3WTF10StringImpl31convertToLowercaseWithoutLocaleEv` | `ANdfelUexnk` | @@ -2412,12 +1593,9 @@ | `_ZN3WTF10StringImpl57convertToLowercaseWithoutLocaleStartingAtFailingIndex8BitEj` | `mlL4YzHlNa4` | | `_ZN3WTF10StringImpl5adoptEONS_12StringBufferIDsEE` | `jnH78zLM6qY` | | `_ZN3WTF10StringImpl5adoptEONS_12StringBufferIhEE` | `E0H-Rg9JQxQ` | -| `_ZN3WTF10StringImpl6createEPKDsj` | `tq-7fdC5Oms` | -| `_ZN3WTF10StringImpl6createEPKhj` | `RevDxuwYd4o` | | `_ZN3WTF10StringImpl7destroyEPS0_` | `yxwlKktzy6Y` | | `_ZN3WTF10StringImpl7replaceEDsDs` | `DLW++1OroYc` | | `_ZN3WTF10StringImpl7replaceEDsPKhj` | `F4xfUw8Mo+A` | -| `_ZN3WTF10StringImpl9substringEjj` | `Geq48oFpp0A` | | `_ZN3WTF10StringView11SplitResult8Iterator17findNextSubstringEv` | `85VvItGKSso` | | `_ZN3WTF10StringView11SplitResult8IteratorppEv` | `o+fLdWYVdAY` | | `_ZN3WTF10StringView16GraphemeClusters8IteratorC1EOS2_` | `WKOxC3orqKk` | @@ -2452,12 +1630,7 @@ | `_ZN3WTF10WorkerPoolC2ENS_12ASCIILiteralEjNS_7SecondsE` | `R6yTbCLOMSI` | | `_ZN3WTF10WorkerPoolD1Ev` | `2QBxm43-Rr8` | | `_ZN3WTF10WorkerPoolD2Ev` | `aL6nI2orYZk` | -| `_ZN3WTF10fastCallocEmm` | `uVsMQhMnxbE` | -| `_ZN3WTF10fastMallocEm` | `2CtlOo7nzno` | -| `_ZN3WTF10fastStrDupEPKc` | `4KFFUT-5pM8` | -| `_ZN3WTF10hasElapsedERKNS_24TimeWithDynamicClockTypeE` | `13eZprwQdRI` | | `_ZN3WTF10initializeEv` | `B9f0KrVp8No` | -| `_ZN3WTF11CStringHash5equalERKNS_7CStringES3_` | `JmCJwcGvR-k` | | `_ZN3WTF11LogArgumentIPKvE8toStringES2_` | `IAZgenCVKNE` | | `_ZN3WTF11OSAllocator18releaseDecommittedEPvm` | `UFKtijmAhkM` | | `_ZN3WTF11OSAllocator23hintMemoryNotNeededSoonEPvm` | `XhrUc+9K1xQ` | @@ -2493,8 +1666,6 @@ | `_ZN3WTF11ThreadGroup3addERNS_6ThreadE` | `yI8ZKsn2NmU` | | `_ZN3WTF11ThreadGroupD2Ev` | `6L90iL-CjWA` | | `_ZN3WTF11TimingScope11scopeDidEndEv` | `vNFWwy493LY` | -| `_ZN3WTF11fastReallocEPvm` | `x5PHjJsfkoU` | -| `_ZN3WTF11jsValueFreeEPv` | `w0P0WAfYXJQ` | | `_ZN3WTF11portAllowedERKNS_3URLE` | `tRrU4kb6AtE` | | `_ZN3WTF11setDataFileEPKc` | `mxYK3TBPDro` | | `_ZN3WTF11setNonBlockEi` | `ZH232ViZnko` | @@ -2512,7 +1683,6 @@ | `_ZN3WTF13MetaAllocatorC2ERNS_4LockEmm` | `7GF7CfOKTBw` | | `_ZN3WTF13MetaAllocatorD0Ev` | `bWPSP8A71Rk` | | `_ZN3WTF13MetaAllocatorD2Ev` | `55-0EcgDmz8` | -| `_ZN3WTF13MonotonicTime3nowEv` | `gWLXqFf+5uI` | | `_ZN3WTF13ReadWriteLock10readUnlockEv` | `yPRGiJGWA-4` | | `_ZN3WTF13ReadWriteLock11writeUnlockEv` | `trYWw7dUt9Y` | | `_ZN3WTF13ReadWriteLock8readLockEv` | `tbhRqP+K-1c` | @@ -2523,10 +1693,8 @@ | `_ZN3WTF13StringBuilder16appendCharactersEPKhj` | `E2TkkVyRubQ` | | `_ZN3WTF13StringBuilder22appendQuotedJSONStringERKNS_6StringE` | `xJRNEp2d-Wg` | | `_ZN3WTF13aboutBlankURLEv` | `3nmBMeZtd+Y` | -| `_ZN3WTF13allPrivilegesEv` | `wacykQ2UrWk` | | `_ZN3WTF13dumpCharacterERNS_11PrintStreamEc` | `rpsD9ynfjc0` | | `_ZN3WTF13isMainRunLoopEv` | `5K-9Y7aFV60` | -| `_ZN3WTF13jsValueMallocEm` | `tsc4z+9Xk+c` | | `_ZN3WTF13normalizedNFCENS_10StringViewE` | `bgrxJM-HmMM` | | `_ZN3WTF13normalizedNFCERKNS_6StringE` | `2LUk8Ch0mJY` | | `_ZN3WTF13printInternalERNS_11PrintStreamEN3JSC14TypedArrayModeE` | `DwwpqTcKG0Q` | @@ -2550,8 +1718,6 @@ | `_ZN3WTF13printInternalERNS_11PrintStreamEt` | `7WVXLziXGtM` | | `_ZN3WTF13printInternalERNS_11PrintStreamEx` | `tTW6TdBv6wo` | | `_ZN3WTF13printInternalERNS_11PrintStreamEy` | `BiM6ri5fwo8` | -| `_ZN3WTF13tryFastCallocEmm` | `vILEMo+UUIE` | -| `_ZN3WTF13tryFastMallocEm` | `sTJ5WzgrEC0` | | `_ZN3WTF14AtomStringImpl10addLiteralEPKcj` | `m+-AT4JRFBw` | | `_ZN3WTF14AtomStringImpl11addSlowCaseERNS_10StringImplE` | `47H3Xt0ke9s` | | `_ZN3WTF14AtomStringImpl11addSlowCaseERNS_15AtomStringTableERNS_10StringImplE` | `cUU3-6ewPWM` | @@ -2602,11 +1768,8 @@ | `_ZN3WTF14createIteratorENS_10StringViewE` | `svIkqWCw-LU` | | `_ZN3WTF14dataLogFStringEPKc` | `xQQ4VSubx-k` | | `_ZN3WTF14dupCloseOnExecEi` | `wQ9-tXakN90` | -| `_ZN3WTF14fastMallocSizeEPKv` | `6yCZwTLGL4c` | | `_ZN3WTF14isVersion4UUIDENS_10StringViewE` | `XbR6JVGM+0U` | -| `_ZN3WTF14jsValueReallocEPvm` | `ms6Fvf6+Ypc` | | `_ZN3WTF14setCloseOnExecEi` | `YebyCbJ7X7k` | -| `_ZN3WTF14tryFastReallocEPvm` | `3dmVkJ1WFVk` | | `_ZN3WTF15AtomStringTableD1Ev` | `YHjoCx7QaOs` | | `_ZN3WTF15AtomStringTableD2Ev` | `JxkGFAxlPa8` | | `_ZN3WTF15AutomaticThread11shouldSleepERKNS_14AbstractLockerE` | `IRiggzlySno` | @@ -2630,16 +1793,12 @@ | `_ZN3WTF15ThreadCondition9timedWaitERNS_5MutexENS_8WallTimeE` | `iulVS7DGVeg` | | `_ZN3WTF15ThreadConditionD1Ev` | `jfeZA8a0GbA` | | `_ZN3WTF15ThreadConditionD2Ev` | `FD7Kfj4cCDs` | -| `_ZN3WTF15fastAlignedFreeEPv` | `ChELiKSlZ9o` | | `_ZN3WTF15isWordTextBreakEP14UBreakIterator` | `Jb1OVO08cOE` | | `_ZN3WTF15memoryFootprintEv` | `DLog94EYwFI` | | `_ZN3WTF16addSignalHandlerENS_6SignalEONS_8FunctionIFNS_12SignalActionES0_RNS_7SigInfoERNS_17PlatformRegistersEEEE` | `l0Z0NQiqr3M` | | `_ZN3WTF16callOnMainThreadEONS_8FunctionIFvvEEE` | `DDIR4QpfiIg` | | `_ZN3WTF16codePointCompareENS_10StringViewES0_` | `PAp-xS1m7bI` | | `_ZN3WTF16codePointCompareERKNS_6StringES2_` | `qpi9pgZKF5g` | -| `_ZN3WTF16fastZeroedMallocEm` | `1srQTITTjM4` | -| `_ZN3WTF16tryJSValueMallocEm` | `vbjmDDIBzzc` | -| `_ZN3WTF17GregorianDateTime21setToCurrentLocalTimeEv` | `xUZEheAPMYs` | | `_ZN3WTF17GregorianDateTimeC1EdNS_15LocalTimeOffsetE` | `9NbKoZNi0Jo` | | `_ZN3WTF17GregorianDateTimeC2EdNS_15LocalTimeOffsetE` | `jRKHSzq25WA` | | `_ZN3WTF17PrivateSymbolImpl6createERNS_10StringImplE` | `S6NzIicbleU` | @@ -2655,16 +1814,7 @@ | `_ZN3WTF17StringPrintStreamD1Ev` | `EOmLhk6TiW4` | | `_ZN3WTF17StringPrintStreamD2Ev` | `DyzD9dy1J9M` | | `_ZN3WTF17callOnMainRunLoopEONS_8FunctionIFvvEEE` | `9v4s2WAlWKI` | -| `_ZN3WTF17charactersToFloatEPKDsmPb` | `Grm8FwC5JHA` | -| `_ZN3WTF17charactersToFloatEPKDsmRm` | `18MTG+xtvtU` | -| `_ZN3WTF17charactersToFloatEPKhmPb` | `bV+MAY-cz5I` | -| `_ZN3WTF17charactersToFloatEPKhmRm` | `t-Fwv83WoZ0` | | `_ZN3WTF17double_conversion23DoubleToStringConverter19EcmaScriptConverterEv` | `vYLd9fXeOkc` | -| `_ZN3WTF17double_conversion23StringToDoubleConverter13StringToFloatEPKcmPm` | `NBcu2DCofTw` | -| `_ZN3WTF17double_conversion23StringToDoubleConverter13StringToFloatEPKtmPm` | `uBURSzaJ+ig` | -| `_ZN3WTF17double_conversion23StringToDoubleConverter14StringToDoubleEPKcmPm` | `P3NGPgoeLII` | -| `_ZN3WTF17double_conversion23StringToDoubleConverter14StringToDoubleEPKtmPm` | `Il1VIdvQNQo` | -| `_ZN3WTF17fastAlignedMallocEmm` | `zX0skVT0j-U` | | `_ZN3WTF17languageDidChangeEv` | `6kL-6MlnOos` | | `_ZN3WTF17wordBreakIteratorENS_10StringViewE` | `fmD6lvba-e0` | | `_ZN3WTF18ExternalStringImpl6createEPKDsjONS_8FunctionIFvPS0_PvjEEE` | `8Elqwzjf6KQ` | @@ -2679,23 +1829,15 @@ | `_ZN3WTF18ParallelHelperPoolC2EONS_7CStringE` | `hY2tr-X7ytM` | | `_ZN3WTF18ParallelHelperPoolD1Ev` | `xfQm3FWZ-og` | | `_ZN3WTF18ParallelHelperPoolD2Ev` | `zWhqEwkF-C0` | -| `_ZN3WTF18charactersToDoubleEPKDsmPb` | `iZcuO+Kb-4E` | -| `_ZN3WTF18charactersToDoubleEPKhmPb` | `C2FgjGcN39c` | -| `_ZN3WTF18constantTimeMemcmpEPKvS1_m` | `bj0oCNjElOE` | -| `_ZN3WTF18fastEnableMiniModeEv` | `i7Rhg-uQBfU` | -| `_ZN3WTF18fastMallocGoodSizeEm` | `rUZfugj0RMc` | | `_ZN3WTF19MetaAllocatorHandle6shrinkEm` | `gsZfTYKMm7o` | | `_ZN3WTF19MetaAllocatorHandleD1Ev` | `xECsbsDabJE` | | `_ZN3WTF19MetaAllocatorHandleD2Ev` | `JbEwAVpz8zE` | | `_ZN3WTF19ParallelEnvironment7executeEPv` | `u1jYWyP2OeU` | | `_ZN3WTF19ParallelEnvironmentC1EPFvPvEmi` | `Efn-a1tGPqw` | | `_ZN3WTF19ParallelEnvironmentC2EPFvPvEmi` | `ciXM3j2URKk` | -| `_ZN3WTF19hasProcessPrivilegeENS_16ProcessPrivilegeE` | `gsF75bCkzAI` | | `_ZN3WTF19isCompilationThreadEv` | `qoO6VaMuvG0` | -| `_ZN3WTF19isFastMallocEnabledEv` | `Mfl7dPUz9kE` | | `_ZN3WTF19mimeTypeFromDataURLENS_10StringViewE` | `kie+nv-1HCM` | | `_ZN3WTF19numGraphemeClustersENS_10StringViewE` | `K7qAbz7P3rs` | -| `_ZN3WTF19tryFastZeroedMallocEm` | `iZfYbwM82bU` | | `_ZN3WTF20ConcurrentPtrHashSet15deleteOldTablesEv` | `K59xDVxbCyM` | | `_ZN3WTF20ConcurrentPtrHashSet5clearEv` | `sDuWnr1d9ko` | | `_ZN3WTF20ConcurrentPtrHashSet7addSlowEPNS0_5TableEjjjPv` | `V-fPa0Bhh0w` | @@ -2707,15 +1849,8 @@ | `_ZN3WTF20ParallelHelperClient6finishEv` | `X+GUHRxWSq4` | | `_ZN3WTF20ParallelHelperClientD1Ev` | `pCPHOY0VhUY` | | `_ZN3WTF20ParallelHelperClientD2Ev` | `80LTtL71Ics` | -| `_ZN3WTF20equalIgnoringNullityEPKDsmPNS_10StringImplE` | `p1WOMELu-4A` | -| `_ZN3WTF20equalIgnoringNullityEPNS_10StringImplES1_` | `YS6CTarAjOY` | -| `_ZN3WTF20fastDisableScavengerEv` | `nooBSCAPeS8` | -| `_ZN3WTF20fastMallocStatisticsEv` | `QufGZLVNl4U` | | `_ZN3WTF20initializeMainThreadEv` | `IDANRncW4HU` | -| `_ZN3WTF20protocolIsJavaScriptENS_10StringViewE` | `1RVx3WHq+mA` | | `_ZN3WTF20resetAccumulatedLogsEv` | `v4r2uz0R1ys` | -| `_ZN3WTF20setProcessPrivilegesENS_9OptionSetINS_16ProcessPrivilegeEEE` | `dmPL5pRccX4` | -| `_ZN3WTF20tryFastAlignedMallocEmm` | `DiMNwdYc2Yg` | | `_ZN3WTF21MemoryPressureHandler12setPageCountEj` | `AAkVf-cyiwM` | | `_ZN3WTF21MemoryPressureHandler13releaseMemoryENS_8CriticalENS_11SynchronousE` | `LiJyR7R9j9s` | | `_ZN3WTF21MemoryPressureHandler24currentMemoryUsagePolicyEv` | `3pFQHWls4Ug` | @@ -2748,14 +1883,8 @@ | `_ZN3WTF22FastBitVectorWordOwner10resizeSlowEm` | `NetEd5QBLRw` | | `_ZN3WTF22FastBitVectorWordOwner13setEqualsSlowERKS0_` | `qY895ndHoiI` | | `_ZN3WTF22TextBreakIteratorCache9singletonEv` | `m9nEKMAp80k` | -| `_ZN3WTF22equalIgnoringASCIICaseEPKNS_10StringImplES2_` | `z+TvcXz6sPE` | -| `_ZN3WTF22equalRespectingNullityENS_10StringViewES0_` | `GflSK+Jz9Lo` | | `_ZN3WTF22isMainThreadOrGCThreadEv` | `UHbf2fZIrxk` | -| `_ZN3WTF22numberOfProcessorCoresEv` | `L5XKYpXLrrE` | -| `_ZN3WTF22protocolIsInHTTPFamilyENS_10StringViewE` | `YjitVZx1Dkg` | -| `_ZN3WTF22removeProcessPrivilegeENS_16ProcessPrivilegeE` | `F1J5HXb9feo` | | `_ZN3WTF23callOnMainThreadAndWaitEONS_8FunctionIFvvEEE` | `95FhkfvoGQM` | -| `_ZN3WTF23fastCommitAlignedMemoryEPvm` | `jDmNNYhAKg4` | | `_ZN3WTF24AutomaticThreadCondition4waitERNS_4LockE` | `4Xe0NrWsndM` | | `_ZN3WTF24AutomaticThreadCondition7waitForERNS_4LockENS_7SecondsE` | `6VIC0pMsv30` | | `_ZN3WTF24AutomaticThreadCondition9notifyAllERKNS_14AbstractLockerE` | `Ei7Gxq2j6e8` | @@ -2764,26 +1893,19 @@ | `_ZN3WTF24AutomaticThreadConditionC2Ev` | `AiOIdr8qlv8` | | `_ZN3WTF24AutomaticThreadConditionD1Ev` | `eW8DnRSDucM` | | `_ZN3WTF24AutomaticThreadConditionD2Ev` | `qjebiZKT83w` | -| `_ZN3WTF24TimeWithDynamicClockType3nowENS_9ClockTypeE` | `8-YkZFXzp+o` | -| `_ZN3WTF24calculateLocalTimeOffsetEdNS_8TimeTypeE` | `URX9azN77dU` | | `_ZN3WTF24callOnMainRunLoopAndWaitEONS_8FunctionIFvvEEE` | `uTDkdY+Gquc` | | `_ZN3WTF24currentTextBreakLocaleIDEv` | `xr2263Do-NU` | | `_ZN3WTF24isDefaultPortForProtocolEtNS_10StringViewE` | `SC58p5kvRVg` | | `_ZN3WTF24normalizeLineEndingsToLFEONS_6VectorIhLm0ENS_15CrashOnOverflowELm16ENS_10FastMallocEEE` | `aRe4HfMOslA` | | `_ZN3WTF25activateSignalHandlersForENS_6SignalE` | `Pyu7Zyt6XUE` | | `_ZN3WTF25addLanguageChangeObserverEPvPFvS0_E` | `dsxMZLBYKOU` | -| `_ZN3WTF25fastDecommitAlignedMemoryEPvm` | `kP0UwniJtRo` | -| `_ZN3WTF25fastMallocDumpMallocStatsEv` | `PCe-c5KNG38` | | `_ZN3WTF26getAndResetAccumulatedLogsEv` | `bD3nxh6Om44` | | `_ZN3WTF26normalizeLineEndingsToCRLFEONS_6VectorIhLm0ENS_15CrashOnOverflowELm16ENS_10FastMallocEEE` | `oUjgPUMQcao` | | `_ZN3WTF27protocolHostAndPortAreEqualERKNS_3URLES2_` | `tDDzvLlQ7CE` | -| `_ZN3WTF27releaseFastMallocFreeMemoryEv` | `g5OUObarCN0` | | `_ZN3WTF28displayNameForLanguageLocaleERKNS_6StringE` | `8RYSSEu8pUk` | | `_ZN3WTF28encodeWithURLEscapeSequencesERKNS_6StringE` | `3DqiPW3mayI` | | `_ZN3WTF28normalizeLineEndingsToNativeEONS_6VectorIhLm0ENS_15CrashOnOverflowELm16ENS_10FastMallocEEE` | `KWwKlT9hDkc` | | `_ZN3WTF28removeLanguageChangeObserverEPv` | `1aiL+Rc87Zg` | -| `_ZN3WTF29cryptographicallyRandomValuesEPvm` | `ioaqRTOlpys` | -| `_ZN3WTF29equalIgnoringASCIICaseNonNullEPKNS_10StringImplES2_` | `r1p+26H3NfQ` | | `_ZN3WTF30numCodeUnitsInGraphemeClustersENS_10StringViewEj` | `3PZOiy2oZ9w` | | `_ZN3WTF30overrideUserPreferredLanguagesERKNS_6VectorINS_6StringELm0ENS_15CrashOnOverflowELm16ENS_10FastMallocEEE` | `21V5nmYlWm4` | | `_ZN3WTF30userPreferredLanguagesOverrideEv` | `2aMiAKRnwgk` | @@ -2792,14 +1914,11 @@ | `_ZN3WTF31NonSharedCharacterBreakIteratorD1Ev` | `gD1m+NqX994` | | `_ZN3WTF31NonSharedCharacterBreakIteratorD2Ev` | `mihp249C15g` | | `_ZN3WTF31equalIgnoringFragmentIdentifierERKNS_3URLES2_` | `WkZpN6r-c+A` | -| `_ZN3WTF31sixCharacterHashStringToIntegerEPKc` | `NcVtS5qj+Ns` | | `_ZN3WTF33indexOfBestMatchingLanguageInListERKNS_6StringERKNS_6VectorIS0_Lm0ENS_15CrashOnOverflowELm16ENS_10FastMallocEEERb` | `RoOulmakF2U` | | `_ZN3WTF37canCurrentThreadAccessThreadLocalDataERNS_6ThreadE` | `UY123Q3mRZI` | | `_ZN3WTF37parseDateFromNullTerminatedCharactersEPKc` | `Eisgz+sqX1g` | -| `_ZN3WTF37parseDateFromNullTerminatedCharactersEPKcRb` | `Go8rq2aaDlc` | | `_ZN3WTF3ICU12majorVersionEv` | `VZkUzpN-EW8` | | `_ZN3WTF3ICU12minorVersionEv` | `GMRugn+lVTw` | -| `_ZN3WTF3URL10invalidateEv` | `8Ydwx621DeA` | | `_ZN3WTF3URL11setProtocolENS_10StringViewE` | `dnZM2KrZii0` | | `_ZN3WTF3URL14setHostAndPortENS_10StringViewE` | `w1JXzWCP5UM` | | `_ZN3WTF3URL15hostIsIPAddressENS_10StringViewE` | `yMosJYTG-QI` | @@ -2815,9 +1934,7 @@ | `_ZN3WTF3URLC2ERKS0_RKNS_6StringEPKNS_15URLTextEncodingE` | `ANq4kcABc7A` | | `_ZN3WTF3absERKNS_9MediaTimeE` | `qcwPekjtvyE` | | `_ZN3WTF40clearDefaultPortForProtocolMapForTestingEv` | `AuhjTeWbn5Y` | -| `_ZN3WTF40parseES5DateFromNullTerminatedCharactersEPKcRb` | `y5v7URrv4PU` | | `_ZN3WTF40registerDefaultPortForProtocolForTestingEtRKNS_6StringE` | `Sn3WBciBmSE` | -| `_ZN3WTF40releaseFastMallocFreeMemoryForThisThreadEv` | `iVKW7nYDUkU` | | `_ZN3WTF4Lock10unlockSlowEv` | `e4I+fGvwugs` | | `_ZN3WTF4Lock13safepointSlowEv` | `UX5VJ-OZdTg` | | `_ZN3WTF4Lock8lockSlowEv` | `GciZ5UdsizU` | @@ -2831,37 +1948,12 @@ | `_ZN3WTF5MutexC2Ev` | `ut8I892aPW8` | | `_ZN3WTF5MutexD1Ev` | `SVYZa9hbTh8` | | `_ZN3WTF5MutexD2Ev` | `WBxQfbet+nY` | -| `_ZN3WTF5equalEPKNS_10StringImplEPKDsj` | `Im8eHiDTMeY` | -| `_ZN3WTF5equalEPKNS_10StringImplEPKh` | `VsQFi9sWc88` | -| `_ZN3WTF5equalEPKNS_10StringImplEPKhj` | `R5kWFrmHVCQ` | -| `_ZN3WTF5equalERKNS_10StringImplES2_` | `ooxXMa0uk0U` | | `_ZN3WTF5sleepENS_7SecondsE` | `gsFoqQ-R5js` | -| `_ZN3WTF5sleepERKNS_24TimeWithDynamicClockTypeE` | `NgCYLj0lVYw` | -| `_ZN3WTF6Config17permanentlyFreezeEv` | `xK7B8RkMD6s` | -| `_ZN3WTF6String13fromCodePointEi` | `hXtby+xy4lA` | | `_ZN3WTF6String24numberToStringFixedWidthEdj` | `EIwwRbyxZTM` | -| `_ZN3WTF6String26fromUTF8WithLatin1FallbackEPKhm` | `LUD7lFC2li4` | | `_ZN3WTF6String28numberToStringFixedPrecisionEdjNS_29TrailingZerosTruncatingPolicyE` | `KtgcveZxnco` | | `_ZN3WTF6String28numberToStringFixedPrecisionEfjNS_29TrailingZerosTruncatingPolicyE` | `16H0tI43iL8` | | `_ZN3WTF6String6numberEd` | `I6gS9R3DurY` | | `_ZN3WTF6String6numberEf` | `7qx9ZPDsDq4` | -| `_ZN3WTF6String6numberEi` | `EVgaLPB1Mbg` | -| `_ZN3WTF6String6numberEj` | `v7K5ZMlOnQo` | -| `_ZN3WTF6String6numberEl` | `sbCus2-wUQ8` | -| `_ZN3WTF6String6numberEm` | `8PQY5phhmoE` | -| `_ZN3WTF6String6numberEx` | `fZeo0Mk6YP0` | -| `_ZN3WTF6String6numberEy` | `yARaOs411s4` | -| `_ZN3WTF6String8fromUTF8EPKh` | `eFThXSRZtyo` | -| `_ZN3WTF6String8fromUTF8EPKhm` | `KECbnF2igRw` | -| `_ZN3WTF6String8fromUTF8ERKNS_7CStringE` | `Fa9ocon8fUk` | -| `_ZN3WTF6StringC1EPKDsj` | `UAwAfORouyI` | -| `_ZN3WTF6StringC1EPKcj` | `hQ8Mt43cvrc` | -| `_ZN3WTF6StringC1EPKc` | `p3grARF0IJY` | -| `_ZN3WTF6StringC1EPKhj` | `HPmUq28fuMk` | -| `_ZN3WTF6StringC2EPKDsj` | `7J78O2z8glA` | -| `_ZN3WTF6StringC2EPKc` | `3AhFWhH0mH8` | -| `_ZN3WTF6StringC2EPKcj` | `fEIG2SWc6gU` | -| `_ZN3WTF6StringC2EPKhj` | `yRWxhEAt52g` | | `_ZN3WTF6Thread13mayBeGCThreadEv` | `QIdqG9iFqwI` | | `_ZN3WTF6Thread14changePriorityEi` | `wITj6RMihC4` | | `_ZN3WTF6Thread16registerGCThreadENS_12GCThreadTypeE` | `46Y8UjUJPK0` | @@ -2875,14 +1967,6 @@ | `_ZN3WTF6Thread6signalEi` | `S2XXSC1X2l8` | | `_ZN3WTF6ThreadD1Ev` | `KdxtVUZ-nyY` | | `_ZN3WTF6ThreadD2Ev` | `wEGeGTNWR1A` | -| `_ZN3WTF7CPUTime16forCurrentThreadEv` | `Grn1GRcWJio` | -| `_ZN3WTF7CString11mutableDataEv` | `Osl3-BsmjZA` | -| `_ZN3WTF7CString16newUninitializedEmRPc` | `8WRGpXy43Rw` | -| `_ZN3WTF7CString4growEm` | `AlXeQLzHOPM` | -| `_ZN3WTF7CStringC1EPKcm` | `Nsle20GAXvE` | -| `_ZN3WTF7CStringC1EPKc` | `zOnJttJv-8w` | -| `_ZN3WTF7CStringC2EPKc` | `Z-lkbHvLSr4` | -| `_ZN3WTF7CStringC2EPKcm` | `iZFcLZVClyE` | | `_ZN3WTF7RunLoop13dispatchAfterENS_7SecondsEONS_8FunctionIFvvEEE` | `JkZwD6Lu-cg` | | `_ZN3WTF7RunLoop17setWakeUpCallbackEONS_8FunctionIFvvEEE` | `qIz+DBSTKZM` | | `_ZN3WTF7RunLoop38suspendFunctionDispatchForCurrentCycleEv` | `fKaloYAyEOM` | @@ -2897,13 +1981,10 @@ | `_ZN3WTF7RunLoop9TimerBaseC2ERS0_` | `7fOcpBLva2Y` | | `_ZN3WTF7RunLoop9TimerBaseD1Ev` | `Fj3K7fq81Nw` | | `_ZN3WTF7RunLoop9TimerBaseD2Ev` | `CmEb6NZaH44` | -| `_ZN3WTF7Unicode51calculateStringHashAndLengthFromUTF8MaskingTop8BitsEPKcS2_RjS3_` | `KDhvMdyJm2M` | -| `_ZN3WTF7ramSizeEv` | `L+f444MZShU` | | `_ZN3WTF8CollatorC1EPKcb` | `8DP3Cufk2xw` | | `_ZN3WTF8CollatorC2EPKcb` | `jPO4DqIdSig` | | `_ZN3WTF8CollatorD1Ev` | `YyCzoJifhqg` | | `_ZN3WTF8CollatorD2Ev` | `E3vh3HLyXrI` | -| `_ZN3WTF8Internal25parseDoubleFromLongStringEPKDsmRm` | `ZqVhdZ64zpo` | | `_ZN3WTF8JSONImpl10ObjectBase6removeERKNS_6StringE` | `nIH6ALR8JYA` | | `_ZN3WTF8JSONImpl5Array6createEv` | `ASltWpUx6Zg` | | `_ZN3WTF8JSONImpl5Value4nullEv` | `MkJD9O9pXvI` | @@ -2937,13 +2018,9 @@ | `_ZN3WTF8JSONImpl9ArrayBaseC2Ev` | `VYQqKZrhPn4` | | `_ZN3WTF8JSONImpl9ArrayBaseD0Ev` | `BOBj7UfI96k` | | `_ZN3WTF8JSONImpl9ArrayBaseD1Ev` | `zWaD-ACT3yg` | -| `_ZN3WTF8WallTime3nowEv` | `2lgqM74hGv4` | | `_ZN3WTF8WordLock10unlockSlowEv` | `MffI7wLS6TM` | | `_ZN3WTF8WordLock8lockSlowEv` | `Acl7E8U+V44` | | `_ZN3WTF8dataFileEv` | `iZD+UvpXBfg` | -| `_ZN3WTF8dataLogFEPKcz` | `CEDv5P43Ouk` | -| `_ZN3WTF8fastFreeEPv` | `bNoqBCwrN+Q` | -| `_ZN3WTF8pageSizeEv` | `ZopRN-OA-qs` | | `_ZN3WTF9BitVector11excludeSlowERKS0_` | `fVOcX2+6qiI` | | `_ZN3WTF9BitVector13OutOfLineBits6createEm` | `x9Et46dq93c` | | `_ZN3WTF9BitVector13OutOfLineBits7destroyEPS1_` | `ptecTDe+jIU` | @@ -2981,12 +2058,8 @@ | `_ZN3WTF9URLParser19parseURLEncodedFormENS_10StringViewE` | `Ev+2GetBNwE` | | `_ZN3WTF9URLParser24internalValuesConsistentERKNS_3URLE` | `jKPJKar5yGY` | | `_ZN3WTF9URLParser9serializeERKNS_6VectorINS_12KeyValuePairINS_6StringES3_EELm0ENS_15CrashOnOverflowELm16ENS_10FastMallocEEE` | `sx-mGnQPyeg` | -| `_ZN3WTF9dataLogFVEPKcP13__va_list_tag` | `SwCCeuHoB+8` | -| `_ZN3WTFeqERKNS_7CStringEPKc` | `MQctua+I2DE` | -| `_ZN3WTFeqERKNS_7CStringES2_` | `noLHUdxm01g` | | `_ZN3WTFlsERNS_10TextStreamENS_7SecondsE` | `UgIITEJeYRo` | | `_ZN3WTFlsERNS_10TextStreamERKNS_3URLE` | `8M6cv85VPG4` | -| `_ZN3WTFltERKNS_7CStringES2_` | `ujNrClE1MjA` | | `_ZN6WebKit14WebProcessMainEiPPc` | `xQI1SMBDGvk` | | `_ZN6WebKit18NetworkProcessMainEiPPc` | `SJWwfPd52Ug` | | `_ZN7Nicosia6Buffer6createERKN7WebCore7IntSizeEj` | `MfJ3R1TdXCY` | @@ -3012,10 +2085,6 @@ | `_ZN7WebCore10FileHandleD1Ev` | `dcRpnwhqCwc` | | `_ZN7WebCore10FileHandleD2Ev` | `0tjbqZDVPp8` | | `_ZN7WebCore10FileHandleaSEOS0_` | `Em5voBytaq0` | -| `_ZN7WebCore10FloatPoint15narrowPrecisionEdd` | `b4+e4w5A5Lo` | -| `_ZN7WebCore10FloatPoint9normalizeEv` | `ubu+mUNY3GI` | -| `_ZN7WebCore10FloatPointC1ERKNS_8IntPointE` | `kqP+QHW4KXs` | -| `_ZN7WebCore10FloatPointC2ERKNS_8IntPointE` | `1SrnHnVL2to` | | `_ZN7WebCore10ISOFullBoxC1ERKS0_` | `zCgYva0hGps` | | `_ZN7WebCore10ISOFullBoxC1Ev` | `m3TcEKpIGo4` | | `_ZN7WebCore10ISOFullBoxC2ERKS0_` | `GMDlBS2FjfA` | @@ -3045,10 +2114,6 @@ | `_ZN7WebCore10JSLocationD2Ev` | `ki7myINNcOA` | | `_ZN7WebCore10JSLocationaSERKS0_` | `dcYyto60A7Q` | | `_ZN7WebCore10JSNodeList9toWrappedERN3JSC2VMENS1_7JSValueE` | `PMX1wD5abbk` | -| `_ZN7WebCore10LayoutRect5scaleEf` | `73ZYnt2WGWU` | -| `_ZN7WebCore10LayoutRect5uniteERKS0_` | `t8rMPQgl5dc` | -| `_ZN7WebCore10LayoutRectC1ERKNS_9FloatRectE` | `LDT0j38WE1A` | -| `_ZN7WebCore10LayoutRectC2ERKNS_9FloatRectE` | `9u-+t-g0hdE` | | `_ZN7WebCore10OriginLockD1Ev` | `pmS3ZsTZjRo` | | `_ZN7WebCore10OriginLockD2Ev` | `cTkrwldaa1w` | | `_ZN7WebCore10Pasteboard10readOriginEv` | `kBiv08+TCFs` | @@ -3345,8 +2410,6 @@ | `_ZN7WebCore11RenderStyleD1Ev` | `K-1Q9aFLzz8` | | `_ZN7WebCore11RenderStyleD2Ev` | `9CdadcNnX+E` | | `_ZN7WebCore11RenderTheme9singletonEv` | `M9wKVlQLlos` | -| `_ZN7WebCore11RoundedRectC1ERKNS_10LayoutRectERKNS_10LayoutSizeES6_S6_S6_` | `wS3FCjBDN6w` | -| `_ZN7WebCore11RoundedRectC2ERKNS_10LayoutRectERKNS_10LayoutSizeES6_S6_S6_` | `x5ETQ5yFeCE` | | `_ZN7WebCore11SimpleRangeC1EONS_13BoundaryPointES2_` | `Yh3Q1rMIGXo` | | `_ZN7WebCore11SimpleRangeC1ERKNS_13BoundaryPointES3_` | `qrmirrWJQR8` | | `_ZN7WebCore11SimpleRangeC2EONS_13BoundaryPointES2_` | `4vKq7BQr9Og` | @@ -3779,7 +2842,6 @@ | `_ZN7WebCore14XMLHttpRequestD2Ev` | `yrbzVXtDvXg` | | `_ZN7WebCore14endOfParagraphERKNS_15VisiblePositionENS_27EditingBoundaryCrossingRuleE` | `0QZ4ACiysus` | | `_ZN7WebCore14foldQuoteMarksERKN3WTF6StringE` | `7-dpn36Q3qc` | -| `_ZN7WebCore14roundedIntRectERKNS_9FloatRectE` | `tlfWS7PHmoY` | | `_ZN7WebCore14stopResolveDNSEm` | `EvaWvuniNCE` | | `_ZN7WebCore14valueForLengthERKNS_6LengthENS_10LayoutUnitE` | `Aioru3Sp3WQ` | | `_ZN7WebCore15ActiveDOMObject15suspendIfNeededEv` | `q629pGti59c` | @@ -3795,18 +2857,6 @@ | `_ZN7WebCore15ActiveDOMObjectD0Ev` | `mNIajby8IWQ` | | `_ZN7WebCore15ActiveDOMObjectD1Ev` | `2-pbW8Uw8FI` | | `_ZN7WebCore15ActiveDOMObjectD2Ev` | `VBi3vzGVTyI` | -| `_ZN7WebCore15AffineTransform12makeIdentityEv` | `Tx7TIiaynFE` | -| `_ZN7WebCore15AffineTransform15scaleNonUniformEdd` | `RfYAH7aupGY` | -| `_ZN7WebCore15AffineTransform4skewEdd` | `kTDnY9DqgNI` | -| `_ZN7WebCore15AffineTransform5flipXEv` | `ue13srrrLqA` | -| `_ZN7WebCore15AffineTransform5flipYEv` | `UfuKEUkb3Ds` | -| `_ZN7WebCore15AffineTransform5scaleERKNS_9FloatSizeE` | `OzJfg7CVeTs` | -| `_ZN7WebCore15AffineTransform5scaleEd` | `i7CzaSPFxi8` | -| `_ZN7WebCore15AffineTransform5shearEdd` | `Wf8AS4IEmVw` | -| `_ZN7WebCore15AffineTransform6rotateEd` | `HzhgdsSJKDo` | -| `_ZN7WebCore15AffineTransform8multiplyERKS0_` | `d+WRN-Uj4qU` | -| `_ZN7WebCore15AffineTransform9translateERKNS_10FloatPointE` | `S8e6HVhtyn0` | -| `_ZN7WebCore15AffineTransform9translateEdd` | `EtPFfT9o1S0` | | `_ZN7WebCore15AsyncFileStream11openForReadERKN3WTF6StringExx` | `VKJiHsvURZA` | | `_ZN7WebCore15AsyncFileStream5closeEv` | `dEVr74VmImA` | | `_ZN7WebCore15AsyncFileStream7performEON3WTF8FunctionIFNS2_IFvRNS_16FileStreamClientEEEERNS_10FileStreamEEEE` | `ZVpEkHLDZbI` | @@ -4015,8 +3065,6 @@ | `_ZN7WebCore16FileReaderLoader6cancelEv` | `zRiYco2OGYk` | | `_ZN7WebCore16FileReaderLoaderC1ENS0_8ReadTypeEPNS_22FileReaderLoaderClientE` | `1aPXW6zlPz4` | | `_ZN7WebCore16FileReaderLoaderC2ENS0_8ReadTypeEPNS_22FileReaderLoaderClientE` | `6QL1C4uv4T0` | -| `_ZN7WebCore16FloatRoundedRectC1ERKNS_9FloatRectERKNS0_5RadiiE` | `YYOptrfFtso` | -| `_ZN7WebCore16FloatRoundedRectC2ERKNS_9FloatRectERKNS0_5RadiiE` | `vIzNvnAbsbI` | | `_ZN7WebCore16FontCascadeFonts23realizeFallbackRangesAtERKNS_22FontCascadeDescriptionEj` | `WhHAwtSeEVY` | | `_ZN7WebCore16FontCascadeFontsD1Ev` | `jhinn3TXn5g` | | `_ZN7WebCore16FontCascadeFontsD2Ev` | `zREgl-R2PHU` | @@ -4763,20 +3811,6 @@ | `_ZN7WebCore20SVGPathStringBuilderD2Ev` | `kNMZlFmxBH8` | | `_ZN7WebCore20ScrollingCoordinator13pageDestroyedEv` | `2Nlpj99LvVo` | | `_ZN7WebCore20ScrollingCoordinator45setForceSynchronousScrollLayerPositionUpdatesEb` | `Rf1XDVI64Ck` | -| `_ZN7WebCore20TransformationMatrix10makeAffineEv` | `0ClvVCH7yL8` | -| `_ZN7WebCore20TransformationMatrix10rectToRectERKNS_9FloatRectES3_` | `Lve0jCux1P0` | -| `_ZN7WebCore20TransformationMatrix11translate3dEddd` | `PiVXIX6zE6g` | -| `_ZN7WebCore20TransformationMatrix15scaleNonUniformEdd` | `I42mYvwndio` | -| `_ZN7WebCore20TransformationMatrix4skewEdd` | `vQE6-ztj3Ks` | -| `_ZN7WebCore20TransformationMatrix5flipXEv` | `-tGCVwk0ehU` | -| `_ZN7WebCore20TransformationMatrix5flipYEv` | `EwhDKyvR0-Y` | -| `_ZN7WebCore20TransformationMatrix5scaleEd` | `FQrrVMzekMs` | -| `_ZN7WebCore20TransformationMatrix6rotateEd` | `LhLaRhmF6ro` | -| `_ZN7WebCore20TransformationMatrix8multiplyERKS0_` | `jpxHb1JKdCA` | -| `_ZN7WebCore20TransformationMatrix8rotate3dEddd` | `QQ+2HEyYLt8` | -| `_ZN7WebCore20TransformationMatrix9translateEdd` | `wVqClDHSLdY` | -| `_ZN7WebCore20TransformationMatrixC1ERKNS_15AffineTransformE` | `u8LyMEJB5fA` | -| `_ZN7WebCore20TransformationMatrixC2ERKNS_15AffineTransformE` | `kTVYwxFhSsc` | | `_ZN7WebCore20UserGestureIndicator18currentUserGestureEv` | `FB9S-dovCx0` | | `_ZN7WebCore20UserGestureIndicator29processingUserGestureForMediaEv` | `UU20U-U-Nmk` | | `_ZN7WebCore20UserGestureIndicatorD1Ev` | `G-+SmxcuaMA` | @@ -4999,7 +4033,6 @@ | `_ZN7WebCore21convertToIntegerClampIsEET_RN3JSC14JSGlobalObjectENS2_7JSValueE` | `kHuGSHvt3As` | | `_ZN7WebCore21convertToIntegerClampItEET_RN3JSC14JSGlobalObjectENS2_7JSValueE` | `r2+NfKBLFUQ` | | `_ZN7WebCore21identifierToUSVStringERN3JSC14JSGlobalObjectERKNS0_10IdentifierE` | `eX0m5bz4rZc` | -| `_ZN7WebCore21isBackForwardLoadTypeENS_13FrameLoadTypeE` | `RtZTpGeo+2U` | | `_ZN7WebCore21mainThreadNormalWorldEv` | `BHCyHXCvQZ8` | | `_ZN7WebCore21setPlatformStrategiesEPNS_18PlatformStrategiesE` | `zUMbo2HaFrU` | | `_ZN7WebCore22CanvasRenderingContext5derefEv` | `ASfhwEyh1cI` | @@ -5336,7 +4369,6 @@ | `_ZN7WebCore27parseCacheControlDirectivesERKNS_13HTTPHeaderMapE` | `kB7iRn6G2NQ` | | `_ZN7WebCore27parseHTMLNonNegativeIntegerEN3WTF10StringViewE` | `V4T4zWxST6E` | | `_ZN7WebCore27screenSupportsExtendedColorEPNS_6WidgetE` | `V0+T-rQTbe0` | -| `_ZN7WebCore27setPresentingApplicationPIDEi` | `RWIkTdc5wzM` | | `_ZN7WebCore27withinTextUnitOfGranularityERKNS_15VisiblePositionENS_15TextGranularityENS_18SelectionDirectionE` | `3M4Zu3TOlcI` | | `_ZN7WebCore28BackingStoreBackendCairoImplC1ERKNS_7IntSizeEf` | `h3up3fILBXA` | | `_ZN7WebCore28BackingStoreBackendCairoImplC2ERKNS_7IntSizeEf` | `SW7SgFwOmu4` | @@ -5418,7 +4450,6 @@ | `_ZN7WebCore30closestWordBoundaryForPositionERKNS_15VisiblePositionE` | `wGksbXEKspk` | | `_ZN7WebCore30forwardForEachCallToBackingMapERNS_17JSDOMGlobalObjectERN3JSC9CallFrameERNS2_8JSObjectE` | `ohECoBXM0fg` | | `_ZN7WebCore30forwardForEachCallToBackingSetERNS_17JSDOMGlobalObjectERN3JSC9CallFrameERNS2_8JSObjectE` | `JMwBt9GFCBo` | -| `_ZN7WebCore30isStatusCodeCacheableByDefaultEi` | `E2s4c1-cIEs` | | `_ZN7WebCore30makeRangeSelectingNodeContentsERNS_4NodeE` | `veUz0LV2k1w` | | `_ZN7WebCore30rejectPromiseWithThisTypeErrorERN3JSC14JSGlobalObjectEPKcS4_` | `dLvYqphQ+l8` | | `_ZN7WebCore30rejectPromiseWithThisTypeErrorERNS_15DeferredPromiseEPKcS3_` | `KAC-e9-fPB0` | @@ -5439,7 +4470,6 @@ | `_ZN7WebCore32WorkerThreadableWebSocketChannelC1ERNS_17WorkerGlobalScopeERNS_22WebSocketChannelClientERKN3WTF6StringERNS_14SocketProviderE` | `CpVHU7S7LN0` | | `_ZN7WebCore32WorkerThreadableWebSocketChannelC2ERNS_17WorkerGlobalScopeERNS_22WebSocketChannelClientERKN3WTF6StringERNS_14SocketProviderE` | `HKNLNiIM8TY` | | `_ZN7WebCore32isSimpleCrossOriginAccessRequestERKN3WTF6StringERKNS_13HTTPHeaderMapE` | `eNFR5wiR41Y` | -| `_ZN7WebCore32isStatusCodePotentiallyCacheableEi` | `FbklI6mL4Fw` | | `_ZN7WebCore32serializationForRenderTreeAsTextERKNS_5ColorE` | `efuMHaAx5-M` | | `_ZN7WebCore32throwArgumentMustBeFunctionErrorERN3JSC14JSGlobalObjectERNS0_10ThrowScopeEjPKcS6_S6_` | `8wr9i3BWSBw` | | `_ZN7WebCore32useBlockedPlugInContextMenuTitleEv` | `KYICSuDQehA` | @@ -5460,7 +4490,6 @@ | `_ZN7WebCore36ISOProtectionSystemSpecificHeaderBoxD0Ev` | `d-tpkqffj6I` | | `_ZN7WebCore36ISOProtectionSystemSpecificHeaderBoxD1Ev` | `kQWc+ifDQvA` | | `_ZN7WebCore36ISOProtectionSystemSpecificHeaderBoxD2Ev` | `bksmE6fo+6E` | -| `_ZN7WebCore36largestRectWithAspectRatioInsideRectEfRKNS_9FloatRectE` | `aY6qhHKBJp8` | | `_ZN7WebCore36parseCrossOriginResourcePolicyHeaderEN3WTF10StringViewE` | `2sTzwlghBUU` | | `_ZN7WebCore36registerMemoryReleaseNotifyCallbacksEv` | `XTRBMujlKzo` | | `_ZN7WebCore36visiblePositionForPositionWithOffsetERKNS_15VisiblePositionEi` | `GwfKLihv7-o` | @@ -5479,11 +4508,9 @@ | `_ZN7WebCore37CrossOriginAccessControlCheckDisableraSERKS0_` | `q+SQjILxj1o` | | `_ZN7WebCore37WidgetHierarchyUpdatesSuspensionScope11moveWidgetsEv` | `XDdMkcoXOGE` | | `_ZN7WebCore37computeFreshnessLifetimeForHTTPFamilyERKNS_16ResourceResponseEN3WTF8WallTimeE` | `bbkcYO2xEa8` | -| `_ZN7WebCore37smallestRectWithAspectRatioAroundRectEfRKNS_9FloatRectE` | `GUq5MmrvvBU` | | `_ZN7WebCore38updateResponseHeadersAfterRevalidationERNS_16ResourceResponseERKS0_` | `zM6YDpjXj9E` | | `_ZN7WebCore39cleanHTTPRequestHeadersForAccessControlERNS_15ResourceRequestEN3WTF9OptionSetINS_29HTTPHeadersToKeepFromCleaningEEE` | `PfN-ltCCZaU` | | `_ZN7WebCore40restrictMinimumScaleFactorToViewportSizeERNS_18ViewportAttributesENS_7IntSizeEf` | `6-68Bw2XP0Q` | -| `_ZN7WebCore43initializeMaximumHTTPConnectionCountPerHostEv` | `qNtPJNKGExA` | | `_ZN7WebCore44computeMinimumScaleFactorForContentContainedERKNS_18ViewportAttributesERKNS_7IntSizeES5_` | `4ClN4aYoaK0` | | `_ZN7WebCore46visibleImageElementsInRangeWithNonLoadedImagesERKNS_11SimpleRangeE` | `1Nf0+rjfAs0` | | `_ZN7WebCore48closestEditablePositionInElementForAbsolutePointERKNS_7ElementERKNS_8IntPointE` | `8xXJUdXNHL4` | @@ -5647,12 +4674,6 @@ | `_ZN7WebCore50restrictScaleFactorToInitialScaleIfNotUserScalableERNS_18ViewportAttributesE` | `kHd8jF+QltI` | | `_ZN7WebCore5Cairo11ShadowStateC1ERKNS_20GraphicsContextStateE` | `ugZkPwKokqE` | | `_ZN7WebCore5Cairo11ShadowStateC2ERKNS_20GraphicsContextStateE` | `UL7nmmoYEsU` | -| `_ZN7WebCore5ColorC1EOS0_` | `fw4riMtVRRY` | -| `_ZN7WebCore5ColorC1ERKS0_` | `wDiTejvV0kY` | -| `_ZN7WebCore5ColorC2EOS0_` | `11kj4X8ocA0` | -| `_ZN7WebCore5ColorC2ERKS0_` | `gTNjfocKYHU` | -| `_ZN7WebCore5ColoraSEOS0_` | `rqYK96mLBMk` | -| `_ZN7WebCore5ColoraSERKS0_` | `P-8awVLZpDw` | | `_ZN7WebCore5Event9initEventERKN3WTF10AtomStringEbb` | `HCYsekMO4e4` | | `_ZN7WebCore5Image12supportsTypeERKN3WTF6StringE` | `bxLuTQ2Uv28` | | `_ZN7WebCore5Image20loadPlatformResourceEPKc` | `tqo89+Bqhk0` | @@ -5863,15 +4884,6 @@ | `_ZN7WebCore7Element9offsetTopEv` | `BCzsWDsn9L0` | | `_ZN7WebCore7Element9outerTextEv` | `DgOXxr1ZN8A` | | `_ZN7WebCore7Element9setPseudoERKN3WTF10AtomStringE` | `KlRDG7pC24w` | -| `_ZN7WebCore7IntRect5scaleEf` | `FEkLrSser8s` | -| `_ZN7WebCore7IntRect5uniteERKS0_` | `f4xQcsvggtA` | -| `_ZN7WebCore7IntRect9intersectERKS0_` | `HWcfdLiowwM` | -| `_ZN7WebCore7IntRectC1ERKNS_10LayoutRectE` | `GPuymBQUb6s` | -| `_ZN7WebCore7IntRectC1ERKNS_9FloatRectE` | `mkLaODh2FTE` | -| `_ZN7WebCore7IntRectC2ERKNS_10LayoutRectE` | `1lBBeTjZ0bI` | -| `_ZN7WebCore7IntRectC2ERKNS_9FloatRectE` | `7oIDpW1fnds` | -| `_ZN7WebCore7IntSizeC1ERKNS_9FloatSizeE` | `WUASruwvl+E` | -| `_ZN7WebCore7IntSizeC2ERKNS_9FloatSizeE` | `SUe+-Pqn50Q` | | `_ZN7WebCore7JSEvent9toWrappedERN3JSC2VMENS1_7JSValueE` | `EqRj7d5zUU4` | | `_ZN7WebCore7JSRange14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE` | `DjQzK3OnWAE` | | `_ZN7WebCore7JSRange15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `75qcBN57jBQ` | @@ -5969,8 +4981,6 @@ | `_ZN7WebCore8FormData6createEv` | `Yd7vowOw4fc` | | `_ZN7WebCore8FormDataD1Ev` | `6l8Ua3l0RQU` | | `_ZN7WebCore8FormDataD2Ev` | `21cUbLIHG+s` | -| `_ZN7WebCore8IntPointC1ERKNS_10FloatPointE` | `vBoyDfg+EVA` | -| `_ZN7WebCore8IntPointC2ERKNS_10FloatPointE` | `kZpi+FEogTM` | | `_ZN7WebCore8JSDOMURL14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE` | `NASakyO6sMo` | | `_ZN7WebCore8JSDOMURL15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `i5FMHLlAuCQ` | | `_ZN7WebCore8JSDOMURL15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE` | `k66VgjV17-M` | @@ -6032,7 +5042,6 @@ | `_ZN7WebCore8Settings44setClientCoordinatesRelativeToLayoutViewportEb` | `bWYhKmtyu1M` | | `_ZN7WebCore8Settings44setHiddenPageDOMTimerThrottlingAutoIncreasesEb` | `4BAhWOEnY4M` | | `_ZN7WebCore8XMLNames4initEv` | `hkP+sGvpPns` | -| `_ZN7WebCore8isReloadENS_13FrameLoadTypeE` | `7rcp+-q8MOo` | | `_ZN7WebCore9AnimationC1Ev` | `LSXwKvlefUA` | | `_ZN7WebCore9AnimationC2Ev` | `yDe86KCEP4s` | | `_ZN7WebCore9AnimationD1Ev` | `mwFPufuvMpk` | @@ -6058,11 +5067,6 @@ | `_ZN7WebCore9DragImageD1Ev` | `0jsZGfvAN3g` | | `_ZN7WebCore9DragImageD2Ev` | `g2fw8kXx2IU` | | `_ZN7WebCore9DragImageaSEOS0_` | `jRX3E9YPAyk` | -| `_ZN7WebCore9FloatRect5scaleEff` | `gyqpM5tRXtA` | -| `_ZN7WebCore9FloatRect5uniteERKS0_` | `8eDqEhpPaeE` | -| `_ZN7WebCore9FloatRect6extendERKNS_10FloatPointE` | `VUUXtGDlUyU` | -| `_ZN7WebCore9FloatRect9intersectERKS0_` | `whf3SRXlvUM` | -| `_ZN7WebCore9FloatRectC1ERKNS_7IntRectE` | `0NAq38V3Das` | | `_ZN7WebCore9FontCache17inactiveFontCountEv` | `cH2+t98qn1g` | | `_ZN7WebCore9FontCache19fontForPlatformDataERKNS_16FontPlatformDataE` | `SPFz9bHH5Kg` | | `_ZN7WebCore9FontCache21purgeInactiveFontDataEj` | `sD6DlU9wkwc` | @@ -6192,7 +5196,6 @@ | `_ZN7bmalloc11IsoTLSEntrynwEmPv` | `6a1KgkULyqs` | | `_ZN7bmalloc11IsoTLSEntrynwEm` | `cg5bcS+k9P8` | | `_ZN7bmalloc12IsoTLSLayout3addEPNS_11IsoTLSEntryE` | `tMWlx2AgEiY` | -| `_ZN7bmalloc12cryptoRandomEPvm` | `BMjFEB02M-s` | | `_ZN7bmalloc13IsoSharedPage9tryCreateEv` | `A4P8aG8cGz0` | | `_ZN7bmalloc15IsoHeapImplBase11didDecommitEPvm` | `skIfr3+tx9E` | | `_ZN7bmalloc15IsoHeapImplBase11scavengeNowEv` | `LizLWDLOZt4` | @@ -6211,19 +5214,7 @@ | `_ZN7bmalloc15IsoHeapImplBasenaEmPv` | `T4RZ2R4QNj8` | | `_ZN7bmalloc15IsoHeapImplBasenaEm` | `lekMQNRdlRs` | | `_ZN7bmalloc15IsoHeapImplBasenwEm` | `E0pHVD7uJ+E` | -| `_ZN7bmalloc15availableMemoryEv` | `QGKNBmGRZZE` | -| `_ZN7bmalloc16isActiveHeapKindENS_8HeapKindE` | `RLX3bxGjrCQ` | | `_ZN7bmalloc17getPerProcessDataEjPKcmm` | `FbvROv13LwA` | -| `_ZN7bmalloc19mapToActiveHeapKindENS_8HeapKindE` | `nymuLF2QARg` | -| `_ZN7bmalloc3api13freeOutOfLineEPvNS_8HeapKindE` | `kAcvu4tpcJI` | -| `_ZN7bmalloc3api14enableMiniModeEv` | `PZtD8PmirVs` | -| `_ZN7bmalloc3api15mallocOutOfLineEmNS_8HeapKindE` | `r+zkazHnHlE` | -| `_ZN7bmalloc3api16disableScavengerEv` | `vQGVOZmLEXE` | -| `_ZN7bmalloc3api21commitAlignedPhysicalEPvmNS_8HeapKindE` | `m5+q1dyt2WM` | -| `_ZN7bmalloc3api23decommitAlignedPhysicalEPvmNS_8HeapKindE` | `bZVYOH83P8g` | -| `_ZN7bmalloc3api29tryLargeZeroedMemalignVirtualEmmNS_8HeapKindE` | `tPa8cN2Gb0g` | -| `_ZN7bmalloc3api8scavengeEv` | `eIUsJO-UCH8` | -| `_ZN7bmalloc3api9isEnabledENS_8HeapKindE` | `fKlkxthWjdE` | | `_ZN7bmalloc5Cache25allocateSlowCaseNullCacheENS_8HeapKindEm` | `7oKMHilvjQA` | | `_ZN7bmalloc5Cache25allocateSlowCaseNullCacheENS_8HeapKindEmm` | `G33UVyzplCY` | | `_ZN7bmalloc5Cache27deallocateSlowCaseNullCacheENS_8HeapKindEPv` | `xWpmqXWWI4A` | @@ -6242,16 +5233,6 @@ | `_ZN7bmalloc9Allocator12allocateImplEmmNS_13FailureActionE` | `CYJC0YsH4u4` | | `_ZN7bmalloc9Scavenger29scheduleIfUnderMemoryPressureEm` | `e6cCjttumPM` | | `_ZN7bmalloc9Scavenger8scheduleEm` | `KYfHQoyY9Uc` | -| `_ZN8Gigacage10tryReallocENS_4KindEPvm` | `mCpCL9lHEIM` | -| `_ZN8Gigacage11alignedFreeENS_4KindEPv` | `6GTrLVlb4CU` | -| `_ZN8Gigacage11mallocArrayENS_4KindEmm` | `i8H75v2E-6g` | -| `_ZN8Gigacage14tryMallocArrayENS_4KindEmm` | `bDxp2MUE484` | -| `_ZN8Gigacage16freeVirtualPagesENS_4KindEPvm` | `9mz0oIY43Z8` | -| `_ZN8Gigacage16tryAlignedMallocENS_4KindEmm` | `9smhIInBMpM` | -| `_ZN8Gigacage29tryAllocateZeroedVirtualPagesENS_4KindEm` | `dq+jnbD0N2A` | -| `_ZN8Gigacage4freeENS_4KindEPv` | `KHIw7IVhuWE` | -| `_ZN8Gigacage6mallocENS_4KindEm` | `zC7DdUja3a4` | -| `_ZN8Gigacage9tryMallocENS_4KindEm` | `KUG9TYTe0kU` | | `_ZN9Inspector13AgentRegistry13discardValuesEv` | `BGd4bkSC3gA` | | `_ZN9Inspector13AgentRegistry27didCreateFrontendAndBackendEPNS_14FrontendRouterEPNS_17BackendDispatcherE` | `HQayaNjjt4w` | | `_ZN9Inspector13AgentRegistry29willDestroyFrontendAndBackendENS_16DisconnectReasonE` | `MxGDaM0UkSY` | @@ -7155,27 +6136,10 @@ | `_ZNK3JSC9JSPromise9isHandledERNS_2VME` | `NgxfVG1k2Vg` | | `_ZNK3WTF10AtomString23convertToASCIILowercaseEv` | `MUpSmygnJSM` | | `_ZNK3WTF10AtomString23convertToASCIIUppercaseEv` | `uXJeEurJF8c` | -| `_ZNK3WTF10StringImpl10startsWithEDs` | `XKbeIT1wH7A` | -| `_ZNK3WTF10StringImpl10startsWithEPKcj` | `WH0fAB8IaaA` | -| `_ZNK3WTF10StringImpl11sizeInBytesEv` | `C2JaQRcg9Kc` | -| `_ZNK3WTF10StringImpl12hashSlowCaseEv` | `2mN+0oNQLFU` | -| `_ZNK3WTF10StringImpl14concurrentHashEv` | `KawS4Ly+geA` | -| `_ZNK3WTF10StringImpl4utf8ENS_14ConversionModeE` | `AtUOSzkIyO4` | -| `_ZNK3WTF10StringImpl8endsWithEDs` | `Le7mifAKPRU` | -| `_ZNK3WTF10StringImpl8endsWithEPKcj` | `cV8oVafV7Fw` | -| `_ZNK3WTF10StringView10startsWithEDs` | `nk3yHQPZxLA` | | `_ZNK3WTF10StringView16GraphemeClusters8IteratordeEv` | `gStShPRXKPk` | | `_ZNK3WTF10StringView16GraphemeClusters8IteratoreqERKS2_` | `DYcMsG69kBo` | -| `_ZNK3WTF10StringView23convertToASCIILowercaseEv` | `sowzvTN5IkQ` | -| `_ZNK3WTF10StringView23convertToASCIIUppercaseEv` | `YVecTCYH9EA` | -| `_ZNK3WTF10StringView26getCharactersWithASCIICaseENS0_15CaseConvertTypeEPDs` | `yvL0St8BV7E` | -| `_ZNK3WTF10StringView26getCharactersWithASCIICaseENS0_15CaseConvertTypeEPh` | `cwCFIDoQBf0` | -| `_ZNK3WTF10StringView4findES0_j` | `h38RqwwwQlM` | -| `_ZNK3WTF10StringView4utf8ENS_14ConversionModeE` | `cEGwE8ZjJlw` | -| `_ZNK3WTF10StringView8endsWithEDs` | `sIvMhKPPhK0` | | `_ZNK3WTF11Persistence7Decoder28bufferIsLargeEnoughToContainEm` | `OuoVW-SJiZQ` | | `_ZNK3WTF12ASCIILiteral4dumpERNS_11PrintStreamE` | `IdIO1h6EW3I` | -| `_ZNK3WTF13MonotonicTime19approximateWallTimeEv` | `6ems2EAHiJs` | | `_ZNK3WTF13MonotonicTime4dumpERNS_11PrintStreamE` | `K-UfI+QGiEU` | | `_ZNK3WTF13StringBuilder11reifyStringEv` | `DmOJ1MfHFrw` | | `_ZNK3WTF14MediaTimeRange12toJSONStringEv` | `mz868SDp4PI` | @@ -7183,72 +6147,35 @@ | `_ZNK3WTF15AutomaticThread4nameEv` | `r8Md8WuqsoA` | | `_ZNK3WTF17double_conversion23DoubleToStringConverter13ToExponentialEdiPNS0_13StringBuilderE` | `9qxUiFlS1A4` | | `_ZNK3WTF19MetaAllocatorHandle4dumpERNS_11PrintStreamE` | `BPh+itev3WQ` | -| `_ZNK3WTF24TimeWithDynamicClockType13monotonicTimeEv` | `JwrKmyxIJjk` | -| `_ZNK3WTF24TimeWithDynamicClockType16nowWithSameClockEv` | `aFFwS9mbHZE` | -| `_ZNK3WTF24TimeWithDynamicClockType19approximateWallTimeEv` | `WFQ5IKTMQs0` | -| `_ZNK3WTF24TimeWithDynamicClockType24approximateMonotonicTimeEv` | `Uqn5KvU5tTQ` | | `_ZNK3WTF24TimeWithDynamicClockType4dumpERNS_11PrintStreamE` | `Ea+86Wd8S-g` | -| `_ZNK3WTF24TimeWithDynamicClockType8wallTimeEv` | `3qfGoMlYkiI` | -| `_ZNK3WTF24TimeWithDynamicClockTypegeERKS0_` | `zQduSmnc1KA` | -| `_ZNK3WTF24TimeWithDynamicClockTypegtERKS0_` | `nwbBBUpKAtA` | -| `_ZNK3WTF24TimeWithDynamicClockTypeleERKS0_` | `h4rZXdIdwFU` | -| `_ZNK3WTF24TimeWithDynamicClockTypemiERKS0_` | `QMKiWatcAFI` | -| `_ZNK3WTF3URL10protocolIsENS_10StringViewE` | `5UhnGPXbi88` | -| `_ZNK3WTF3URL11encodedUserEv` | `BEwqFgdKXuA` | | `_ZNK3WTF3URL11hostAndPortEv` | `RZHqKvX5z+E` | -| `_ZNK3WTF3URL12isAboutBlankEv` | `UYgxVHhvMxw` | -| `_ZNK3WTF3URL13isAboutSrcDocEv` | `L5Cd+mIcvb4` | | `_ZNK3WTF3URL14fileSystemPathEv` | `lOFTLo+dG3Y` | -| `_ZNK3WTF3URL14isHierarchicalEv` | `Stn8WH8AdjM` | -| `_ZNK3WTF3URL15encodedPasswordEv` | `4FFsFmw5Qg0` | | `_ZNK3WTF3URL16isMatchingDomainENS_10StringViewE` | `Ub4JvxZ0KE4` | | `_ZNK3WTF3URL17lastPathComponentEv` | `ElXcYHtYqtE` | -| `_ZNK3WTF3URL18fragmentIdentifierEv` | `kYMBRpJ+Agk` | | `_ZNK3WTF3URL19protocolHostAndPortEv` | `q8fEMeIqd5w` | -| `_ZNK3WTF3URL20protocolIsJavaScriptEv` | `4ZerC-xiHv8` | | `_ZNK3WTF3URL21truncatedForUseAsBaseEv` | `uekVJTVqBGc` | | `_ZNK3WTF3URL24strippedForUseAsReferrerEv` | `CyN41AniueA` | -| `_ZNK3WTF3URL28queryWithLeadingQuestionMarkEv` | `8ItkKGIHJmE` | | `_ZNK3WTF3URL30stringCenterEllipsizedToLengthEj` | `JRPrmfTHt08` | -| `_ZNK3WTF3URL39fragmentIdentifierWithLeadingNumberSignEv` | `WsWNyw1KycE` | | `_ZNK3WTF3URL4dumpERNS_11PrintStreamE` | `ITwB6pPwmRc` | -| `_ZNK3WTF3URL4hostEv` | `bAN1O3eaO5c` | -| `_ZNK3WTF3URL4pathEv` | `9wYKBq8z2rA` | | `_ZNK3WTF3URL4userEv` | `ETN4mn+-5l0` | | `_ZNK3WTF3URL8passwordEv` | `aCtpeXWclTE` | -| `_ZNK3WTF3URL8protocolEv` | `g3O1JgTFs-A` | | `_ZNK3WTF6Logger17LogSiteIdentifier8toStringEv` | `kkWkqBuJiDU` | | `_ZNK3WTF6String18simplifyWhiteSpaceEPFbDsE` | `xuaSjMP7VYc` | -| `_ZNK3WTF6String19characterStartingAtEj` | `5ar727BtdoQ` | -| `_ZNK3WTF6String20substringSharingImplEjj` | `4iRtUH7ZYPg` | -| `_ZNK3WTF6String23convertToASCIILowercaseEv` | `OQBu00sK6sc` | -| `_ZNK3WTF6String23convertToASCIIUppercaseEv` | `J0Kyx5E61iU` | | `_ZNK3WTF6String25splitAllowingEmptyEntriesEDs` | `nDlY546YL3E` | -| `_ZNK3WTF6String27isSafeToSendToAnotherThreadEv` | `CuqN-UrxCrE` | | `_ZNK3WTF6String28convertToLowercaseWithLocaleERKNS_10AtomStringE` | `oxQpdsUY-cg` | | `_ZNK3WTF6String28convertToUppercaseWithLocaleERKNS_10AtomStringE` | `7IN+T9v1oAg` | | `_ZNK3WTF6String29charactersWithNullTerminationEv` | `TTlQMk6YTRM` | | `_ZNK3WTF6String31convertToLowercaseWithoutLocaleEv` | `vQwAX-xV-Dg` | | `_ZNK3WTF6String31convertToUppercaseWithoutLocaleEv` | `xZYXhT-qMno` | -| `_ZNK3WTF6String4utf8ENS_14ConversionModeE` | `zwvAXAgGj84` | | `_ZNK3WTF6String57convertToLowercaseWithoutLocaleStartingAtFailingIndex8BitEj` | `XStmVdN3R7Y` | -| `_ZNK3WTF6String5asciiEv` | `8s9UY6PrUa8` | | `_ZNK3WTF6String5splitEDs` | `ku8lWRpthiU` | -| `_ZNK3WTF6String6latin1Ev` | `nlYycDAxvdE` | | `_ZNK3WTF6String7toFloatEPb` | `BbKt5wzlOsU` | | `_ZNK3WTF6String8foldCaseEv` | `dXm2FJEv86k` | | `_ZNK3WTF6String8toDoubleEPb` | `NwMHWqfNEmg` | | `_ZNK3WTF6Thread4dumpERNS_11PrintStreamE` | `IEIydcJjkbo` | -| `_ZNK3WTF7CPUTime23percentageCPUUsageSinceERKS0_` | `1Mn-wSJLAIY` | -| `_ZNK3WTF7CString4hashEv` | `mUtGD4Sa7i4` | | `_ZNK3WTF7RunLoop9TimerBase16secondsUntilFireEv` | `9ym46rnYKZA` | | `_ZNK3WTF7RunLoop9TimerBase8isActiveEv` | `uh7RQK-+n20` | | `_ZNK3WTF7Seconds4dumpERNS_11PrintStreamE` | `hrTPOtnC7Mw` | -| `_ZNK3WTF7SecondsmiENS_13MonotonicTimeE` | `vg-JBVgN8pE` | -| `_ZNK3WTF7SecondsmiENS_8WallTimeE` | `Da6x253v+8Q` | -| `_ZNK3WTF7SecondsmiERKNS_24TimeWithDynamicClockTypeE` | `PZQidcQkPQA` | -| `_ZNK3WTF7SecondsplENS_13MonotonicTimeE` | `5B891j8wVb0` | -| `_ZNK3WTF7SecondsplENS_8WallTimeE` | `2mXGiQ+NjhA` | | `_ZNK3WTF8Collator11collateUTF8EPKcS2_` | `Ds3V4AkI+J4` | | `_ZNK3WTF8Collator7collateENS_10StringViewES1_` | `g46lcz7ehyY` | | `_ZNK3WTF8JSONImpl10ObjectBase10memoryCostEv` | `MnJYzxTchUY` | @@ -7264,7 +6191,6 @@ | `_ZNK3WTF8JSONImpl9ArrayBase3getEm` | `hQxOExuMeQQ` | | `_ZNK3WTF8JSONImpl9ArrayBase5beginEv` | `vDSseQ4HPRc` | | `_ZNK3WTF8JSONImpl9ArrayBase9writeJSONERNS_13StringBuilderE` | `T8fOjmwNgOI` | -| `_ZNK3WTF8WallTime24approximateMonotonicTimeEv` | `xXdH+HZsm5E` | | `_ZNK3WTF8WallTime4dumpERNS_11PrintStreamE` | `BXpm0S4olVo` | | `_ZNK3WTF9BitVector11isEmptySlowEv` | `aPI3JqrIPEw` | | `_ZNK3WTF9BitVector12bitCountSlowEv` | `IzXg6-zWJ5E` | @@ -7302,13 +6228,10 @@ | `_ZNK3WTF9MediaTimentEv` | `82yg+EfjqV4` | | `_ZNK3WTF9MediaTimeplERKS0_` | `KliQ-mvV3Y0` | | `_ZNK7WebCore10FileHandlecvbEv` | `1WM6fw+AXm0` | -| `_ZNK7WebCore10FloatPoint15matrixTransformERKNS_15AffineTransformE` | `tplByifH2p0` | -| `_ZNK7WebCore10FloatPoint18constrainedBetweenERKS0_S2_` | `irbymj7rYDU` | | `_ZNK7WebCore10FontRanges16fontForCharacterEi` | `a9NTPM3fgrs` | | `_ZNK7WebCore10FontRanges17fontForFirstRangeEv` | `J4q5kQaotFE` | | `_ZNK7WebCore10FontRanges21glyphDataForCharacterEiNS_30ExternalResourceDownloadPolicyE` | `wFLNa9nYSIU` | | `_ZNK7WebCore10JSDocument7wrappedEv` | `v5la07-B+AE` | -| `_ZNK7WebCore10LayoutRect8containsERKS0_` | `uKr5dZIABo4` | | `_ZNK7WebCore10MouseEvent11fromElementEv` | `-5xLBHcLnNk` | | `_ZNK7WebCore10MouseEvent9toElementEv` | `wH4XZCjtfW0` | | `_ZNK7WebCore10PluginData16supportsMimeTypeERKN3WTF6StringENS0_18AllowedPluginTypesE` | `E27wOOhC3n0` | @@ -7478,7 +6401,6 @@ | `_ZNK7WebCore11RenderStyle18computedLineHeightEv` | `Hq8zMjWpUu8` | | `_ZNK7WebCore11RenderStyle26colorByApplyingColorFilterERKNS_5ColorE` | `T1-Z1I8I17o` | | `_ZNK7WebCore11RenderVideo8videoBoxEv` | `5Dkyawhp0TE` | -| `_ZNK7WebCore11RoundedRect8containsERKNS_10LayoutRectE` | `D6gT6hNDk24` | | `_ZNK7WebCore11XPathResult10resultTypeEv` | `zWdJYlMai5M` | | `_ZNK7WebCore11XPathResult11numberValueEv` | `emfrItA6E3w` | | `_ZNK7WebCore11XPathResult11stringValueEv` | `krX3uZpoV3c` | @@ -7641,17 +6563,6 @@ | `_ZNK7WebCore15ActiveDOMObject20isAllowedToRunScriptEv` | `6ot8v-aJp4w` | | `_ZNK7WebCore15ActiveDOMObject25virtualHasPendingActivityEv` | `iNX6kO6iSaM` | | `_ZNK7WebCore15ActiveDOMObject30assertSuspendIfNeededWasCalledEv` | `wRA9-Ih1MkU` | -| `_ZNK7WebCore15AffineTransform10isIdentityEv` | `OQJl4-I14Mk` | -| `_ZNK7WebCore15AffineTransform22toTransformationMatrixEv` | `FTx8zZOXi4w` | -| `_ZNK7WebCore15AffineTransform6xScaleEv` | `Qnrl8KUtVGs` | -| `_ZNK7WebCore15AffineTransform6yScaleEv` | `MSs83LRZpEk` | -| `_ZNK7WebCore15AffineTransform7mapQuadERKNS_9FloatQuadE` | `KPFb-NhG5Tk` | -| `_ZNK7WebCore15AffineTransform7mapRectERKNS_7IntRectE` | `7xZPYVC9HlQ` | -| `_ZNK7WebCore15AffineTransform7mapRectERKNS_9FloatRectE` | `BqtgDqSMfJE` | -| `_ZNK7WebCore15AffineTransform7mapSizeERKNS_7IntSizeE` | `n1m5ZaCMtpk` | -| `_ZNK7WebCore15AffineTransform7mapSizeERKNS_9FloatSizeE` | `kD+v7gtx55o` | -| `_ZNK7WebCore15AffineTransform8mapPointERKNS_10FloatPointE` | `1SCH3FYiVNQ` | -| `_ZNK7WebCore15AffineTransform8mapPointERKNS_8IntPointE` | `MzgS-gyYwgY` | | `_ZNK7WebCore15AffineTransform9mapRegionERKNS_6RegionE` | `D-MYWruwiUQ` | | `_ZNK7WebCore15CSSGroupingRule8cssRulesEv` | `FfRPM8I9Wvw` | | `_ZNK7WebCore15CertificateInfo12isolatedCopyEv` | `F-cW5QXnhxo` | @@ -7954,12 +6865,6 @@ | `_ZNK7WebCore20ResourceResponseBase8mimeTypeEv` | `HDR9zkTEoJ4` | | `_ZNK7WebCore20ScrollingCoordinator25scrollableContainerNodeIDERKNS_12RenderObjectE` | `DVeoAh0xG6w` | | `_ZNK7WebCore20ScrollingCoordinator36coordinatesScrollingForOverflowLayerERKNS_11RenderLayerE` | `1nxJkpm8wLA` | -| `_ZNK7WebCore20TransformationMatrix12isInvertibleEv` | `nXsuPh83H-g` | -| `_ZNK7WebCore20TransformationMatrix17toAffineTransformEv` | `8EI2YIBPufQ` | -| `_ZNK7WebCore20TransformationMatrix7mapQuadERKNS_9FloatQuadE` | `wzu8fkKsGPU` | -| `_ZNK7WebCore20TransformationMatrix7mapRectERKNS_7IntRectE` | `p5nOMeQrjY4` | -| `_ZNK7WebCore20TransformationMatrix7mapRectERKNS_9FloatRectE` | `yFxsCLoBma4` | -| `_ZNK7WebCore20TransformationMatrix8mapPointERKNS_10FloatPointE` | `ek3kHDpFMdg` | | `_ZNK7WebCore21BackForwardController12forwardCountEv` | `wmkk8v-vEI0` | | `_ZNK7WebCore21BackForwardController18canGoBackOrForwardEi` | `No2407W5Jes` | | `_ZNK7WebCore21BackForwardController9backCountEv` | `AZ+JE981Lgg` | @@ -8129,10 +7034,6 @@ | `_ZNK7WebCore4Page9sessionIDEv` | `DCC67J1Y-Qg` | | `_ZNK7WebCore4Path16fastBoundingRectEv` | `deHBNJOPqkQ` | | `_ZNK7WebCore4Text9wholeTextEv` | `M8mhZ0K1zNE` | -| `_ZNK7WebCore5Color14colorWithAlphaEf` | `GrXt-2SalT0` | -| `_ZNK7WebCore5Color8darkenedEv` | `tt0DzTUWdtQ` | -| `_ZNK7WebCore5Color9lightnessEv` | `u-ggcoP--yc` | -| `_ZNK7WebCore5Color9luminanceEv` | `vdeWIyIqZ5o` | | `_ZNK7WebCore5Range10cloneRangeEv` | `vh9S93S1eCM` | | `_ZNK7WebCore5Range11compareNodeERNS_4NodeE` | `HxT+avGg5Os` | | `_ZNK7WebCore5Range12comparePointERNS_4NodeEj` | `f5B2kxRIerw` | @@ -8219,9 +7120,6 @@ | `_ZNK7WebCore7Element28getUnsignedIntegralAttributeERKNS_13QualifiedNameE` | `ssNlwZtVGgY` | | `_ZNK7WebCore7Element9innerHTMLEv` | `7h1gxkWw9Ec` | | `_ZNK7WebCore7Element9outerHTMLEv` | `lDt1EAkv2fc` | -| `_ZNK7WebCore7IntRect10intersectsERKS0_` | `MUBehB39EUM` | -| `_ZNK7WebCore7IntRect8containsERKS0_` | `vubR4LgD6Co` | -| `_ZNK7WebCore7IntSize18constrainedBetweenERKS0_S2_` | `meIjK6xCa4M` | | `_ZNK7WebCore8DOMTimer24intervalClampedToMinimumEv` | `vYz7gkTnLis` | | `_ZNK7WebCore8Document10alinkColorEv` | `uN9iGVRcQNI` | | `_ZNK7WebCore8Document10compatModeEv` | `BkmXm7XvXJI` | @@ -8265,7 +7163,6 @@ | `_ZNK7WebCore8FormData14asSharedBufferEv` | `poQaKh1C0pI` | | `_ZNK7WebCore8FormData7flattenEv` | `H0CXchtam5k` | | `_ZNK7WebCore8FormData9asBlobURLEv` | `FscFh70QHyg` | -| `_ZNK7WebCore8IntPoint18constrainedBetweenERKS0_S2_` | `y9LxpxOPY9M` | | `_ZNK7WebCore8Location4hostEv` | `NCHVBc1E3+c` | | `_ZNK7WebCore8Position10downstreamENS_27EditingBoundaryCrossingRuleE` | `5gELNQcC+f8` | | `_ZNK7WebCore8Position13containerNodeEv` | `-d0d1BTY40s` | @@ -8288,15 +7185,6 @@ | `_ZNK7WebCore9CookieJar14cookiesEnabledERKNS_8DocumentE` | `9FIdF0nhg00` | | `_ZNK7WebCore9CookieJar29cookieRequestHeaderFieldValueERNS_8DocumentERKN3WTF3URLE` | `UDYkHFjCgi0` | | `_ZNK7WebCore9CookieJar7cookiesERNS_8DocumentERKN3WTF3URLE` | `nfMZQIjYo5U` | -| `_ZNK7WebCore9FloatQuad11boundingBoxEv` | `pRvz++QdUEI` | -| `_ZNK7WebCore9FloatQuad12containsQuadERKS0_` | `1LXOYqj7rz0` | -| `_ZNK7WebCore9FloatQuad13containsPointERKNS_10FloatPointE` | `lCd7-DV+3EM` | -| `_ZNK7WebCore9FloatQuad13isRectilinearEv` | `SF1QQ6-x304` | -| `_ZNK7WebCore9FloatRect10intersectsERKS0_` | `YNoMmLu3t7k` | -| `_ZNK7WebCore9FloatRect21inclusivelyIntersectsERKS0_` | `nKSdTXE6XjQ` | -| `_ZNK7WebCore9FloatRect8containsERKNS_10FloatPointENS0_12ContainsModeE` | `rClTWgPeQDo` | -| `_ZNK7WebCore9FloatSize18constrainedBetweenERKS0_S2_` | `iCb9Z3+1hTY` | -| `_ZNK7WebCore9FloatSize6isZeroEv` | `AFLa8IFxjsQ` | | `_ZNK7WebCore9FrameTree10childCountEv` | `NF1s99Jgzow` | | `_ZNK7WebCore9FrameTree11scopedChildEj` | `cLEfGWxS0OU` | | `_ZNK7WebCore9FrameTree12traverseNextENS_7CanWrapEPNS_7DidWrapE` | `8v50ik3N8zs` | @@ -8715,3 +7603,10 @@ | `Unknown` | `zdn8pgeNnEY` | | `Unknown` | `ziXF7YQDRhY` | | `Unknown` | `zpeJoENXwDY` | + +### Functional + +- [parseDateFromNullTerminatedCharacters(const char*)](../../../core/libs/prx/libSceNKWebKit/Export.cpp) (libSceNKWebKit) - still throws: it subtracts [calculateLocalTimeOffset](https://github.com/WebKit/WebKit/blob/c55364d53f97/Source/WTF/wtf/DateMath.cpp#L318-L361), whose code path follows `HAVE_LOCALTIME_R`, `HAVE_TIMEGM` and `HAVE_TM_GMTOFF` from [configure checks](https://github.com/WebKit/WebKit/blob/c55364d53f97/Source/cmake/OptionsCommon.cmake#L131-L148) against the port's sysroot, and the device time zone. +- [parseDateFromNullTerminatedCharacters(const char*, bool&)](../../../core/libs/prx/libSceNKWebKit/DateParsing.cpp) (libSceNKWebKit) - is not measured on a device, and throws where pinned [DateMath.cpp](https://github.com/WebKit/WebKit/blob/c55364d53f97/Source/WTF/wtf/DateMath.cpp#L684-L988) overflows a signed integer, which is undefined there (the `YYYY/MM/DD` day count, the `GMT+hh:mm` minute total and comment nesting), and for a null argument, where WebKit faults. +- [WTF decimal parsing](../../../core/libs/prx/libSceNKWebKit/CharactersToNumber.cpp) - the device's WebKit revision is unverified; `charactersToDouble`, `charactersToFloat` and `StringToDoubleConverter` follow pinned WebKit [toDoubleType](https://github.com/WebKit/WebKit/blob/c55364d53f97/Source/WTF/wtf/text/WTFString.cpp#L1040-L1098) and [StringToIeee](https://github.com/WebKit/WebKit/blob/c55364d53f97/Source/WTF/wtf/dtoa/double-conversion.cc#L459-L664). Under a rounding mode other than round-to-nearest, WebKit's [exact-power fast path](https://github.com/WebKit/WebKit/blob/c55364d53f97/Source/WTF/wtf/dtoa/strtod.cc#L219-L254) and the double-to-float cast in [Strtof](https://github.com/WebKit/WebKit/blob/c55364d53f97/Source/WTF/wtf/dtoa/strtod.cc#L485-L588) round in the current mode and the host conversion may round differently. +- [WTF decimal parsing limits](../../../core/libs/prx/libSceNKWebKit/CharactersToNumber.cpp) - inputs of about 1 GiB or more whose decimal exponent leaves the range of WebKit's [`int` exponent](https://github.com/WebKit/WebKit/blob/c55364d53f97/Source/WTF/wtf/dtoa/double-conversion.cc#L488-L490) throw, where WebKit overflows. A UTF-16 `charactersTo*` length above `UINT32_MAX` after leading spaces throws where WebKit's [conversion Vector](https://github.com/WebKit/WebKit/blob/c55364d53f97/Source/WTF/wtf/Vector.h#L291-L293) crashes. diff --git a/docs/dev/debt/libSceNKWebKitRequirements.md b/docs/dev/debt/libSceNKWebKitRequirements.md index 4aa7db880a..179b64d8a4 100644 --- a/docs/dev/debt/libSceNKWebKitRequirements.md +++ b/docs/dev/debt/libSceNKWebKitRequirements.md @@ -3,3 +3,43 @@ ### Known export names; ABI prototypes unverified - 133 pending exports in [Export.cpp](../../../core/libs/prx/libSceNKWebKitRequirements/Export.cpp) are present in the [PS5-3.20_Libs](https://github.com/DNNDHH/PS5-3.20_Libs) inventory. Their prototypes and behavior are unverified. They use the no-parameter import-resolution convention and throw through `NotImplemented_nid_no_patch`; these declarations make no ABI or behavior claim. +- The 122 of them declared in [Identified.hpp](../../../core/libs/prx/libSceNKWebKitRequirements/include/Identified.hpp) carry the zlib, libjpeg, libpsl, SQLite, libxml2 and UndefinedBehaviorSanitizer names whose `tools/nid_names.py` hash equals the inventory NID; the names were taken from the identifiers of the zlib 1.3.1, libjpeg-turbo 3.0.4, libpsl 0.21.5, SQLite 3.46.1 and libxml2 2.13.4 sources and from the two `__ubsan_handle_cfi_check_fail` handlers libkernel_sys exports. A name match does not show that the console function has that library's prototype or behavior. The other 11 hash to no identifier of those sources or of ICU 76.1, HarfBuzz 10.0.1, cairo 1.18.2, pixman 0.42.2, FreeType 2.13.3, libpng 1.6.44, Expat 2.6.3, libxslt 1.1.42, libwebp 1.4.0, Brotli 1.1.0, WOFF2 1.0.2, curl 8.10.1, Little CMS 2.16, OpenJPEG 2.5.2 and Fontconfig 2.15.0. + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceNKWebKitRequirements/Export.cpp) - 32 entries present in both version-labelled images are import-resolution declarations only. Neither label independently authenticates retail firmware provenance. These NIDs are absent from the pinned public 3.20 catalogue. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Data exports require separate layout and ownership analysis. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `++QInfMOBN0` | +| `Unknown` | `+oA7tlz2Aiw` | +| `Unknown` | `1MRhOnElUw4` | +| `Unknown` | `1T7K-PY5paE` | +| `Unknown` | `3yG30EKj-64` | +| `Unknown` | `4dTqu8uWd6Q` | +| `Unknown` | `6-rd4IXD0mM` | +| `Unknown` | `68aoiQnJutE` | +| `Unknown` | `8u1QXzSpyno` | +| `Unknown` | `JwB900c8Nyo` | +| `Unknown` | `KCP1Db-mniM` | +| `Unknown` | `NCGIxzXT-KA` | +| `Unknown` | `TAGTeghnmJs` | +| `Unknown` | `TNO-EUJZf3c` | +| `Unknown` | `Wz6vEl9ATDQ` | +| `Unknown` | `YpZ1fAOlVoo` | +| `Unknown` | `ZSkWe-fNsuY` | +| `Unknown` | `cgNin5rMqA8` | +| `Unknown` | `cq16C8ickjY` | +| `Unknown` | `hjlKZNuv+v8` | +| `Unknown` | `o6hmqtmcw10` | +| `Unknown` | `o7ktMsqiCBU` | +| `Unknown` | `rW6yS0aJbjQ` | +| `Unknown` | `rgWcud6b43M` | +| `Unknown` | `soW4BQ5l3Os` | +| `Unknown` | `tc5h+wVQWZI` | +| `Unknown` | `tu7+XEdsUA8` | +| `Unknown` | `u4SbDPju5eo` | +| `Unknown` | `uXf4oddEz5E` | +| `Unknown` | `uiTgPO1VRaA` | +| `Unknown` | `x2xMh95HEb4` | +| `Unknown` | `z5L7zirdMWM` | diff --git a/docs/dev/debt/libSceNet.md b/docs/dev/debt/libSceNet.md index 3a04f46c58..86749242b8 100644 --- a/docs/dev/debt/libSceNet.md +++ b/docs/dev/debt/libSceNet.md @@ -1,5 +1,20 @@ # libSceNet technical debt +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceNet/InventoryExports.cpp) - 8 entries present in both version-labelled images are import-resolution declarations only. All belong to module `libSceNet`; seven have logical library `libSceNet` and one has logical library `libSceNetDebug`. Neither label independently authenticates retail firmware provenance. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `+hZ3zpjYiYw` | +| `Unknown` | `-qjsa0xOWMc` | +| `Unknown` | `DnB6WJ91HGg` | +| `Unknown` | `HMievhVSU3g` | +| `Unknown` | `YQZkUbAw6rg` | +| `Unknown` | `guwFkKH+wP8` | +| `Unknown` | `mnXcgCBmiV0` | +| `Unknown` | `pGboVhl-6P0` | + - [sceNetShowRouteWithMemory, sceNetShowIfconfigWithMemory, sceNetShowPolicyWithMemory, sceNetShowRoute6WithMemory](../../../core/libs/prx/libSceNet/Export.cpp) (libSceNet) - validates memory pool ID and returns success without printing anything: the `(poolId)` signature and pool validation follow [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/main/src/core/libraries/net/net.cpp) and `sceNetShowNetstatWithMemory`; shadPS4 stubs the Ifconfig, Policy and Route6 forms the same way, validating the pool and returning success. What the console prints and where is unverified ### Silent stubs diff --git a/docs/dev/debt/libSceNetCtl.md b/docs/dev/debt/libSceNetCtl.md index 5eaf80a88a..75e854922d 100644 --- a/docs/dev/debt/libSceNetCtl.md +++ b/docs/dev/debt/libSceNetCtl.md @@ -21,3 +21,32 @@ - [sceNetCtlGetIfStat](../../../core/libs/prx/libSceNetCtl/Export.cpp) (libSceNetCtl) throws on macOS: an unprivileged process reads the interface byte counters (`getifaddrs` and `sysctl(NET_RT_IFLIST2)` alike) reduced to their low 32 bits, so a total would wrap every 4 GiB - [Host interface cache](../../../core/libs/prx/libSceNetCtl/Export.cpp) (libSceNetCtl) - on Windows, `sceNetCtlGetState`, `sceNetCtlGetStateV6`, `sceNetCtlCheckCallback`, `sceNetCtlGetIfStat` and `sceNetCtlGetInfo` reuse the last host interface query until `NotifyUnicastIpAddressChange`, `NotifyIpInterfaceChange` or `NotifyRouteChange2` reports a change, instead of calling `GetAdaptersAddresses` on every call. A DNS server change with no address, interface or route change is seen only at the next such change. If the notifications cannot be registered, every call queries the host as before. - [sceNetCtlGetNatInfo](../../../core/libs/prx/libSceNetCtl/Export.cpp) (libSceNetCtl) - performs RFC 5389 STUN binding probes from the active host IPv4 interface against `stun.playstation.net` and fallback third-party STUN servers (`stun.cloudflare.com`, `stun.l.google.com`, `stun1.l.google.com`) instead of reading cached state from the console's background `netctl` service, which probes `*.np.stun.playstation.net` with authenticated Classic STUN (RFC 3489); those third-party hosts receive the host's IPv4 address when an uncached call resolves or probes them. Each discovery call has a 1000 ms total time budget (DNS resolution included, 300 ms per UDP probe), and successful results are cached for 60 s per local IPv4 address while failures re-probe on the next call. Console captures confirm NAT type 2, NAT type 3, and STUN failure; NAT type 1 when the mapped endpoint matches the local socket is not measured on a console with a direct public IP. + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceNetCtl/Export.cpp) - 20 entries present in both version-labelled images are import-resolution declarations only. None is listed in the pinned public 3.20 catalogue for this library. Neither label independently authenticates retail firmware provenance. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +[Version-pinned selected ELF export records](https://gist.github.com/kyon-eth/3fbb1a4a6f95a936b4cd58e9c3d8c50c/5e3af709224ed8235af11337309af0725e5685cb) list every NID below with its image label, decoded export module and library, raw qualified symbol, ELF function type, value and size for each inspected version-labelled image. The extract SHA-256 is `02ab27f12bcd0cc9fa03fa33f55fc201110f0d54a86bbbaa093d55d0a8cf262d`; its full-module sorted-function-NID digests and raw module-parameter words permit independent comparison. This is an analyst-produced metadata record, not independent authentication of the original images or proof of prototypes or behavior. + +| Name | NID | +| --- | --- | +| `sceInetStatInit` | `0NRuAY4RRLc` | +| `sceInetStatTerm` | `W4wSTmiI4+0` | +| `sceNetConnSwitcherStop` | `xCPBfQsndCs` | +| `Unknown` | `09YMz3Vp5us` | +| `Unknown` | `1PGApDf96ao` | +| `Unknown` | `1mrTXfVGn+g` | +| `Unknown` | `2Ny2lzU3o9w` | +| `Unknown` | `3cNKxJXXYYk` | +| `Unknown` | `AIu-tRC-mSM` | +| `Unknown` | `BSERkV-a9e8` | +| `Unknown` | `FwX+Js8qXNA` | +| `Unknown` | `I14Npt-awQg` | +| `Unknown` | `KUdWtCC6w-0` | +| `Unknown` | `QnQ4RBu546Y` | +| `Unknown` | `e5-Xj0wEzbI` | +| `Unknown` | `lScJhO3Rnpk` | +| `Unknown` | `mfWDyuk-M0I` | +| `Unknown` | `on7RqSRy8pU` | +| `Unknown` | `sngJX5nUjVM` | +| `Unknown` | `wVXoAlD7Fsg` | diff --git a/docs/dev/debt/libSceNgs2.md b/docs/dev/debt/libSceNgs2.md index f25b3c941d..7e75078013 100644 --- a/docs/dev/debt/libSceNgs2.md +++ b/docs/dev/debt/libSceNgs2.md @@ -2,5 +2,5 @@ ### Unknown function info -- [sceNgs2FftInit, sceNgs2FftProcess, sceNgs2FftQuerySize](../../../core/libs/prx/libSceNgs2/PendingExports.cpp) (libSceNgs2) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceNgs2.c), but no credible prototypes were found in the cited sources. They are declared without parameters solely to resolve known imports and make no ABI claim. -- [sceNgs2ParseWaveformUser, sceNgs2SystemEnumHandles, sceNgs2SystemEnumRackHandles](../../../core/libs/prx/libSceNgs2/PendingExports.cpp) (libSceNgs2) - names and NIDs are in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceNgs2.c); signatures follow [SharpProspero's Ngs2 bindings](https://github.com/SvenGDK/SharpProspero/blob/5dfdb4b0b166e83dc9ae275001afb695f12c7174/src/SharpProspero/Interop/Audio/Ngs2.cs), not measured on a console. Opaque structure pointers use `void*`; these stubs throw for import resolution. +- [sceNgs2FftQuerySize](../../../core/libs/prx/libSceNgs2/PendingExports.cpp) (libSceNgs2) - implemented in `libSceNgs2.native/src/System.cpp` from the firmware 11.00 module at `0x430`, whose table is at `0x30b30`: lengths 8..12 select 64, 128, 256, 512 and 1024 samples from the entry at offset 4, bit 1 of the flags halves the count, and the work size is `32 * count + 64`. `-1` for a length outside 8..12 is the module's own return; `-1` for a null output is this implementation's guard, since the module writes through the pointer after validating only the length. [sceNgs2FftInit and sceNgs2FftProcess](../../../core/libs/prx/libSceNgs2/PendingExports.cpp) still throw: the 7.3 KB AVX radix-8 kernel and its packed input/output layout are not recovered, and no dump imports these NIDs. +- [sceNgs2ParseWaveformUser, sceNgs2SystemEnumHandles, sceNgs2SystemEnumRackHandles](../../../core/libs/prx/libSceNgs2/PendingExports.cpp) (libSceNgs2) - implemented in `libSceNgs2.native/src/System.cpp` from the firmware 11.00 module at `0x10810`, `0xf270` and `0xf0d0`. `sceNgs2ParseWaveformUser` passes a type-2 read descriptor to the module helper at `0xfac0`, which calls the handler as `handler(user_data, offset, data, size)` and expects an `int32_t`; in the module a negative return becomes `0x804A0408`, as does a null handler, and a null output becomes `0x804A0053`. The 256 MiB RIFF cap, which returns `SCE_NGS2_ERROR_INVALID_WAVEFORM_DATA`, and buffering the whole RIFF body after the 12-byte header are this implementation's safety choices, not measured on a console. The enumerators return the count of live systems or racks and fill up to the requested count; a null output with a nonzero count returns `0x804A0053` and an unknown system `0x804A0230`. No dump imports these NIDs. diff --git a/docs/dev/debt/libSceNgs2.native.md b/docs/dev/debt/libSceNgs2.native.md index 7dfdaa8919..cd2eba6df2 100644 --- a/docs/dev/debt/libSceNgs2.native.md +++ b/docs/dev/debt/libSceNgs2.native.md @@ -18,19 +18,20 @@ - [NGS2 submixer UserFx](../../../core/libs/prx/libSceNgs2.native/src/Custom.cpp) (control `0x20000004`) invokes the title's callback after input mixing on every playing grain, including silence. The 40-byte control and 48-byte process context follow [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/945dbc3cc3eee80ac3e053b438502ed936fa6bb2/src/core/libraries/ngs2/ngs2_submixer.h). PPSA03747 installs a peak-meter callback; its code confirms the channel pointers, user data 0, channel count, grain size and sample-rate offsets and returns 0. Other user data words are preserved. Flags are assumed to be 1 after registration/restart and 0 thereafter, following UserFx2's first-process convention; this callback does not inspect them. Null handlers disable the effect, setup clears it, and nonzero callback results throw. These lifecycle and error semantics are unverified on console hardware. - [NGS2 voice callback after setup](../../../core/libs/prx/libSceNgs2.native/src/Voice.cpp) (libSceNgs2.native) - a sampler or mixer setup clears the voice callback with the rest of the voice state. PPSA18216 registers a block-end callback for a streamed music voice, later sets the same voice up again for one-shot ATRAC9 blocks with user data 0, and registers the callback again before it streams again; its callback dereferences the block's user data, so it must not run for the one-shot blocks. A setup made from inside the voice's own callback clears that callback as well, so a callback that sets its voice up again and queues the next block runs once instead of for every block; PPSA18216 never sets a voice up from inside its callback, so that ordering is unverified. Unverified on console hardware. - [NGS2 ATRAC9 streaming](../../../core/libs/prx/libSceNgs2.native/src/Atrac9.cpp) keeps waveform duration and skip counts across compressed input blocks. The shared `APPEND` flag (2), called `ONLY_DATA` in the compressed-data reference, ignores an ATRAC9 continuation block's sample, skip and repeat counts, following [KytyPS5](https://github.com/KytyPS5/KytyPS5/blob/bb98f26433fa9e711c219aac1711fe8ecba5bf3a/src/libs/ngs2.cpp); PPSA03747 confirms a 262044-byte initial buffer declaring 11310532 samples, followed by 16384-byte buffers with flags 3. Incomplete superframes are retained until more input arrives. Input-block completion callbacks allow refills; the final callback of a logical waveform waits for its buffered PCM to drain, preserving the existing complete-block repeat behaviour. This buffering, callback timing, decoded-byte accounting and starvation silence are unverified on hardware. A closed ATRAC9 stream ending before its declared samples throws; fragmented ATRAC9 waveforms with repeats are unsupported. PCM streaming retains its existing append validation and early-close behaviour. -- [NGS2 mastering voice gain](../../../core/libs/prx/libSceNgs2.native/src/Voice.cpp) (libSceNgs2.native) - a NaN sample in a PCM_I16L render buffer throws, because PS5 firmware 3.20 and 4.03 were measured only into float buffers, where a NaN gain gives NaN samples. Measured there: param 0x30000004 (id seen in PPSA22520) sets linear full-band and LFE factors on the mastering output, applied from the next render, flat for the first gain a voice receives and ramped over the next grain in eight lanes after that, which this change does not implement; each is clamped to [-32, 32] with NaN kept, and every value returns 0. The LFE level acts on channel 3 of 6- and 8-channel voices and the full-band level on every other channel, 1- and 2-channel voices included; a mastering setup resets both to 1, and STOP_IMM plus PLAY keeps them -- [NGS2 stereo mastering voice into a surround buffer](../../../core/libs/prx/libSceNgs2.native/src/Render.cpp) (libSceNgs2.native) - PPSA21402 renders a 2-channel mastering voice into a 6- or 8-channel render buffer, which the mixing stage rejected. The console's conversion is unknown: the left and right channels are assumed to go to the first two buffer channels (front left and right) and the remaining channels stay silent, with no centre, LFE or surround content. Any other channel count mismatch still throws +- [NGS2 mastering voice gain](../../../core/libs/prx/libSceNgs2.native/src/Voice.cpp) (libSceNgs2.native) - two gaps against PS5 firmware 3.20 and 4.03: the first gain a voice receives is flat here and every later one should ramp over the next grain in eight lanes, which this change does not implement; and the console applies the gain after the mastering to render-buffer remap, per buffer channel (the LFE level on buffer channel 3 whenever both counts are 4 or more), where it is applied here per mastering channel, the LFE level only on 6- and 8-channel voices. Measured: param 0x30000004 (id seen in PPSA22520) sets linear full-band and LFE factors, applied from the next render; each is clamped to [-32, 32] with NaN kept, and every value returns 0; a mastering setup resets both to 1, and STOP_IMM plus PLAY keeps them +- [NGS2 PCM_I16L render output](../../../core/libs/prx/libSceNgs2.native/src/Render.cpp) (libSceNgs2.native) - the conversion `trunc(clamp(x * 32767, -32767, 32767))`, with NaN written as 0, comes from the PS5 firmware 3.20 and 4.03 `libSceNgs2.native` module run on a PC with chosen inputs (rendered samples compared), not from a console. Not measured: the PS4 `libSceNgs2`, which shares this code; chains with resampling, only unresampled ones were compared; and the caller's SSE rounding mode, which the PS5 float multiply follows and no test here sets - [NGS2 voices without a format](../../../core/libs/prx/libSceNgs2.native/src/Voice.cpp) (libSceNgs2.native) - a sampler voice whose setup has no format (all zero) accepts an add of no waveform blocks without `APPEND`, which only applies `RESET` and the `CONTINUE` state, and matrix levels with no levels, which clear that matrix. PPSA36591 sets such a voice up, adds no blocks and sets no levels when a button is pressed at its title screen. Whether the console returns success or an error there is not measured; blocks with data, `APPEND` and an empty matrix on a voice with a format are still refused - [NGS2 play without setup](../../../core/libs/prx/libSceNgs2.native/src/Voice.cpp) (libSceNgs2.native) - differs from PS5 firmware 3.20 and 4.03 `libSceNgs2.native.sprx` in two cases: a set-up voice given an add of no waveform blocks and played keeps state flags 1 there for as long as it was watched and only until the next render here; an add of no blocks to a voice that already played and ended returns `0x804A8054` there and succeeds here. A `PLAY` on a voice with no channels (never set up; an all-zero setup leaves an earlier setup untouched) returns `0x804A8351` (`SCE_NGS2_ERROR_INVALID_VOICE_ACCESS`) from Control and RunCommands, leaves it idle and skips the rest of the list, as that module does for every rack; PPSA03061 (Void Terrarium) frees its sound slots that way - [NGS2 silent waveform blocks](../../../core/libs/prx/libSceNgs2.native/src/Voice.cpp) (libSceNgs2.native): flag `0x10` (named `SILENCE` here; no public reference names it) lets a waveform block declare samples without data. PPSA04867 adds one block with flags `0x11`, `data_size` 0 and `num_samples` 16385, then another with flags `0x11` and a fully specified 0x800-byte, 1024-sample mono block, which takes the ordinary path. A dataless block under the flag outputs `num_samples` frames of silence, reports them through `decoded_data_size`, and finishes like a complete block; a dataless block without the flag still throws as not fitting its data. The flag's real name, its interaction with ATRAC9 and repeats, and the console's `waveform_data` for silent blocks are unverified on hardware - [NGS2 streaming PCM waveforms](../../../core/libs/prx/libSceNgs2.native/src/Voice.cpp) (libSceNgs2.native) - PPSA21402 streams its music by adding one block whose `num_samples` is the whole track and whose `data_size` is a 16 KiB first piece, with `CONTINUE`, and then adds each following piece with flag `0x2` (called `APPEND` here) and the same `num_samples`. No reference describes flag `0x2`. A 16-bit PCM block without skipped samples or repeats whose `num_samples` exceed its data is assumed to start such a stream; flag `0x2` is assumed to append the block's data to the last streaming block, ignoring its `num_samples`; the voice is assumed to output silence without advancing while it has played all appended data and `CONTINUE` is set; and the waveform is assumed to end at `num_samples` or, once `CONTINUE` is cleared, at the end of the appended data. `sceNgs2VoiceGetState` reports the bytes played as `decoded_data_size`, which the title uses to release its queued data, and the read position as `waveform_data`. Appending to a block that is not a stream, or other formats, skipped samples, repeats and partial frames, throw - [NGS2 matrix levels](../../../core/libs/prx/libSceNgs2.native/src/Voice.cpp) (libSceNgs2.native) - levels are clamped to -4..4 and NaN is kept, as the PS4 firmware 11.00 `libSceNgs2.sprx` stores them; not yet confirmed on the PS5 library. That library rejects a level count of 0 and keeps the matrix; the PS5 error code is unknown, so a count of 0 throws, except on a sampler voice without a format, where it clears the matrix (see NGS2 voices without a format). `sceNgs2VoiceRunCommands` is not in that library, so its matrix levels command is assumed to clamp the same way +- [NGS2 port volume](../../../core/libs/prx/libSceNgs2.native/src/Voice.cpp) (libSceNgs2.native) - the clamp covers a sampler voice's ports between renders only; other voice types, controls buffered during a render and the PS4 library (same code) are unmeasured. A port past the count still throws for VoiceControl param 0x2, for RunCommands on a voice without 8 ports or in a batch mixing other commands with port volumes, and in sceNgs2VoiceGetPortInfo; a batch of port volumes only on a voice with 8 ports returns 0x804A8357. Measured on the PS5 firmware 3.20 and 4.03 libSceNgs2.native module run on a PC, not a console (return codes, read-backs, samples): param 0x2 and RunCommands command 6 clamp the volume to [0, 32] with NaN and -0 kept and return 0 for every value; GetPortInfo reads it back at once; command 6 reads its low 32 bits as a float whatever the value type and ignores numValues and flags; a batch naming a port of 8 or more on an 8-port rack returns 0x804A8357 and applies none - [NGS2 sampler voice state flag EMPTY](../../../core/libs/prx/libSceNgs2.native/src/Render.cpp) (libSceNgs2.native) - a playing sampler voice that still accepts blocks (`CONTINUE`) and has played all queued blocks reports `INUSE|PLAYING|EMPTY` (0x20) and keeps playing, so blocks added later play on. PPSA18391 (engine: Clickteam Fusion) reads `state_flags & 0x22 != 2` from `sceNgs2VoiceGetState` as the end of a sound and only then reuses the voice. When the console sets and clears EMPTY, and whether it also reports it for other voice types, is unverified on hardware. - [NGS2 waveform block playback](../../../core/libs/prx/libSceNgs2.native/src/Render.cpp) has reference checks for finite PCM repeat counts 0 through 3, skip/sample windows, callbacks and six input formats using host kernel adapters, not console execution. Finite repeat counts specify total passes, with 0 and 1 both playing once. PCM reads the combined skip/sample window from the data start; ATRAC9 retains codec skip handling. The public callback repeat field stays zero in those checks. Extreme window overflow, fragmented compressed repeats and callback positions outside the tested schedules remain unverified. - [NGS2 custom parameter positions](../../../core/libs/prx/libSceNgs2.native/src/Voice.cpp) - other custom module families have not received the PitchShift validation audit. PitchShift decodes the low five position bits within its parameter family: 0x20 aliases position zero, matching 13.60 dispatch and host-adapted reference execution. An absent or mismatched module returns `0x804A835A` before later linked parameters execute. Checks cover two module positions, invalid positions, list termination and active processing through an aliased parameter. These are host-adapted library checks, not console execution. -- [NGS2 reverb channel conversion](../../../core/libs/prx/libSceNgs2.native/src/Reverb.cpp) (libSceNgs2.native) - a reverb voice whose `num_input_channels` differs from `num_output_channels` (PPSA03747 sets up 2 inputs and 8 outputs) mixes its ports in the input layout and folds that to mono with the input count's gains, as an equal-count voice does, and runs the comb and allpass stages per output channel. The PS4 library's handling of the dry signal in this case is not checked: here it reaches the output layout through the default channel map, so a stereo input keeps its dry signal on the front left and right and the other outputs carry only the reverb -- [NGS2 port matrix](../../../core/libs/prx/libSceNgs2.native/src/Render.cpp) (libSceNgs2.native) - a port without a matrix, or with a selected matrix whose levels were never set, mixes through a default channel map: mono reaches both stereo channels at -3 dB and the 5.1 and 7.1 centre, stereo folds to mono at -3 dB per side, and wider sources fold down with 0.5 and -3 dB gains. The map and the equivalence of an unset matrix with no matrix were measured from the PS4 firmware 11.00 `libSceNgs2.sprx`, not yet from the PS5 library. That library only accepts submixer and mastering voices with 1, 2, 6 or 8 channels, so the map into 3, 4, 5 or 7 channels throws. A port into more than 8 channels without a matrix throws: the 13.42 module rejects a custom submixer voice with more than 8 inputs or outputs (`0x804A8052`), so that mapping is unreachable. A matrix set with fewer levels than the destination needs still mixes only the rows it has +- [NGS2 reverb channel conversion](../../../core/libs/prx/libSceNgs2.native/src/Reverb.cpp) (libSceNgs2.native) - a reverb voice whose `num_input_channels` differs from `num_output_channels` (PPSA03747 sets up 2 inputs and 8 outputs) mixes its ports in the input layout and folds that to mono with the input count's gains, as an equal-count voice does, and runs the comb and allpass stages per output channel. The PS4 library's handling of the dry signal in this case is not checked: here it reaches the output layout through the PS4 default rows, not the PS5 port map, so a stereo input keeps its dry signal on the front left and right and the other outputs carry only the reverb +- [NGS2 port matrix](../../../core/libs/prx/libSceNgs2.native/src/Render.cpp) (libSceNgs2.native) - gaps: a mastering voice into a buffer of another count throws when either count is 3, 4, 5 or 7, though PS5 firmware 3.20 and 4.03 render them; the PS4 library has no rows into 3, 4, 5 or 7 and throws, its mastering output is unmeasured, and its reverb conversion and Pan keep the PS4 rows; a port into more than 8 channels without a matrix throws, which is unreachable (`0x804A8052` for a custom submixer voice with over 8 channels, 13.42 module). Not run on PS5: non-sampler sources into 4 or 7 channels and from 1, 2, 6 or 8 channels into 3, 4, 5 or 7, an active reverb (I3DL2), custom submixers with modules and custom mastering 0x4003; they use the sampler rows here. The PS5 rows were measured on that module run on a PC, not a console. A matrix with too few levels mixes only its whole rows - [NGS2 custom submixer rack](../../../core/libs/prx/libSceNgs2.native/src/Custom.cpp) (libSceNgs2.native, rack 0x4002) - UserFx2 process flags and setup/process/cleanup order follow only [KytyPS5](https://github.com/KytyPS5/KytyPS5), not a console measurement; layouts follow [shadPS4](https://github.com/shadps4-emu/shadPS4)'s `ngs2_custom.h`. A module control handler, unequal input and output channels, setup flags and default rack options throw. Module state is a separate buffer, not the `state_offset` slice of voice state; `sceNgs2VoiceGetState` throws for this rack. UserFx2 runs only on grains with input samples, so an effect tail stops with the input. Setup changes from custom process callbacks throw before later modules can use the changed layout; inconsistent input-mixing layouts after callbacks also throw. Console reentry behavior is unknown - [NGS2 custom UserFx](../../../core/libs/prx/libSceNgs2.native/src/Custom.cpp) (libSceNgs2.native) - the 48-byte process context, process flags, callback error handling and null-handler behavior retain the existing submixer callback model and are not console-verified. Non-null module options throw because their console error is unknown. UserFx on custom sampler rack 0x4001 throws: its parameter indexing and routing are not implemented. Module id 0x19, the 40-byte voice parameter (handler and three user-data words), parameter id `0x40001900 | index`, and lack of option and module state follow [fma-rc's PS5 12.70 module reading](https://github.com/boykopovar/AnyPS5/issues/8039#issuecomment-6319332943), including parameter dispatch at 0x25ec4. - [NGS2 custom Delay](../../../core/libs/prx/libSceNgs2.native/src/Custom.cpp) (libSceNgs2.native, 0x1d) - processing and defaults remain unverified on PS5. The [agreed compatibility path](https://github.com/boykopovar/AnyPS5/pull/9337#issuecomment-6351205140) preserves main's PCM pass-through for Void Terrarium (PPSA03061) until any Delay parameter is set; every `0x40001dxx` parameter throws. Only one-buffer custom submixers with no module state and a 20-byte option are accepted. Option type 0/1, taps 1..8, length 1..20000 and reserved 0 follow [fma-rc's 12.70 module reading](https://github.com/boykopovar/AnyPS5/issues/8039#issuecomment-6319332943). Other shapes and values throw because their console errors are unknown. This preserves host behavior, not console-equivalent Delay processing @@ -40,7 +41,7 @@ - [NGS2 sampler streaming](../../../core/libs/prx/libSceNgs2.native/src/Sampler.cpp) - transitions on grains below 64 throw. Setup flags (currently named `channel_mask`) are accepted and ignored, as before this change, because PPSA36591 sets 0x10 on a VAG voice and plays on `main`. In 13.60, bit 0x10 selects an alternate AJM decoder slot (a missing slot reports 0x804A8352 during render); that selection and its error and accounting are not implemented. It is not a speaker mask. PCM/ATRAC9 reference checks cover block capacity, append coalescing, starvation, caches, replacement, callbacks and descriptor replay. Default scheduling processes UserFx before block callbacks, then publishes sampler racks in creation order and voices in rack order. Checks cover callback replacement/disable and peer stopping. External scheduling uses dependency batches; limits are listed below. The custom sampler state layout and size validation remain incomplete. -- [NGS2 custom Gain](../../../core/libs/prx/libSceNgs2.native/src/Custom.cpp) - PS5 rounding and first-parameter processor state are unverified. The initial previous gain retains main's zero convention; the schema default does not verify processor initialization. Processing before a parameter, after re-setup or after stopping a configured voice throws. The unclamped levels, i/N ramp and equal-gain paths follow [the PS5 12.70 reading](https://github.com/boykopovar/AnyPS5/issues/8039#issuecomment-6391072574) (0x33ce0, 0x5310); invalid parameter positions return 0x804A835A (0x250b0). Custom sampler Gain and module options throw: their initialization, lifecycle and option errors remain unknown. Integer rendering of nonfinite samples throws because the console conversion is unknown. +- [NGS2 custom Gain](../../../core/libs/prx/libSceNgs2.native/src/Custom.cpp) - PS5 rounding and first-parameter processor state are unverified. The initial previous gain retains main's zero convention; the schema default does not verify processor initialization. Processing before a parameter, after re-setup or after stopping a configured voice throws. The unclamped levels, i/N ramp and equal-gain paths follow [the PS5 12.70 reading](https://github.com/boykopovar/AnyPS5/issues/8039#issuecomment-6391072574) (0x33ce0, 0x5310); invalid parameter positions return 0x804A835A (0x250b0). Custom sampler Gain and module options throw: their initialization, lifecycle and option errors remain unknown. - [NGS2 peak meter](../../../core/libs/prx/libSceNgs2.native/src/Render.cpp) - [13.42](https://github.com/boykopovar/AnyPS5/pull/11354#issuecomment-6416545468) confirms `peak_height` at offset 12 in `Ngs2SamplerVoiceState` and `Ngs2SubmixerVoiceState` (peak 0.5 and RMS 0.353553 for alternating 16384/0 PCM, no other word in the first 28 bytes changes), and that a sampler SETUP reset clears the detect type until it is enabled again; the submixer reset was not measured. The controls `0x10000009` (sampler) and `0x20000005` (submixer) carry the detect type at offset 8 (0 off, 1 peak, 2 RMS, else `0x804A8093`). Each grain stores one value per channel in a ring of `num_peak_meter_blocks` slots (1 to 256, else `0x804A8092`): the largest absolute sample for peak or the sum of squares for RMS; `peak_height` is the largest channel value, or `sqrt(sum / (blocks * grain))` for RMS, over the filled slots. A detect-type change empties the ring, and measurement is after the voice modules. - [NGS2 custom mastering rack](../../../core/libs/prx/libSceNgs2.native/src/Rack.cpp) (libSceNgs2.native, rack 0x4003) - follows [fma-rc's reading of the 12.70 module](https://github.com/boykopovar/AnyPS5/issues/8039#issuecomment-6319332943): option size is 0x508, matching the custom submixer rack layout. Creation returns `0x804A8052` above 37 channels; channels 9 to 37 throw because voices hold at most 8 channels (this limit is kept for the custom mastering rack; only the custom submixer rack accepts them). Mastering racks with modules throw: attached modules and non-default option fields are unverified on PS5. Voice control parameters 0x40030000 (setup), 0x40030004 (gain) and 0x40030005 (output) configure channels, levels and destination buffer. `sceNgs2VoiceGetState` fills common voice state flags. PPSA10278 and PPSA04540 create rack 0x4003 without modules (#8039) - [NGS2 custom buffers](../../../core/libs/prx/libSceNgs2.native/src/Custom.cpp) - multiple buffers on samplers, built-in submixer channels above 8, inputs beyond 0/1 and multi-buffer chains beyond zero modules or one Gain throw. Default custom module order, UserFx extra-buffer selection and invalid port-buffer errors remain unknown. Input-to-buffer routing and grain clearing follow [the PS5 12.70 reading](https://github.com/boykopovar/AnyPS5/issues/8039#issuecomment-6391072574) (0x181a0); output-port selection follows [KytyPS5](https://github.com/KytyPS5/KytyPS5/blob/83f8bfd3c9c35fcb135ef6c33dfd88bbfe066ee2/src/libs/ngs2.cpp#L417-L419). These paths have not been compared with console output. Creation validation order and QueryBufferSize validation remain unverified; the query throws for options whose creation returns an error. diff --git a/docs/dev/debt/libSceNpAuthAuthorizedAppDialog.md b/docs/dev/debt/libSceNpAuthAuthorizedAppDialog.md index ff59e27255..009a232b17 100644 --- a/docs/dev/debt/libSceNpAuthAuthorizedAppDialog.md +++ b/docs/dev/debt/libSceNpAuthAuthorizedAppDialog.md @@ -2,6 +2,7 @@ ### Silent stubs +- [sceNpAuthAuthorizedAppDialogOpen](../../../core/libs/prx/libSceNpAuthAuthorizedAppDialog/Export.cpp) (libSceNpAuthAuthorizedAppDialog) - with `ANYPS5_PSN_DIALOGS=show`, a successful open shows AnyPS5's notice that the feature needs PlayStation Network; the console's own display without PlayStation Network is not measured, and the notice wording is AnyPS5's. - [libSceNpAuthAuthorizedAppDialog](../../../core/libs/prx/libSceNpAuthAuthorizedAppDialog/Export.cpp) - the authorized-app dialog runs the common-dialog state machine but shows nothing and reports the user as having cancelled, as there is no PSN sign-in to authorize an app against. Parameter fields at offsets 64 and 72 feed a 136-byte application record and a text value of at most 1024 bytes; their service-side meaning remains incomplete. ### Unknown function info diff --git a/docs/dev/debt/libSceNpCommerce.md b/docs/dev/debt/libSceNpCommerce.md index 762eed1207..a4bb61b2f1 100644 --- a/docs/dev/debt/libSceNpCommerce.md +++ b/docs/dev/debt/libSceNpCommerce.md @@ -2,6 +2,7 @@ ### Silent stubs +- [sceNpCommerceDialogOpen, sceNpCommerceDialogOpen2](../../../core/libs/prx/libSceNpCommerce/Export.cpp) (libSceNpCommerce) - with `ANYPS5_PSN_DIALOGS=show`, a successful open shows AnyPS5's notice that the feature needs PlayStation Network; the console's own display without PlayStation Network is not measured, and the notice wording is AnyPS5's. - [libSceNpCommerce](../../../core/libs/prx/libSceNpCommerce/Export.cpp) - the PS Store icon show/hide calls and `sceNpCommerceSetPsStoreIconLayout` do nothing ### Unknown function info diff --git a/docs/dev/debt/libSceNpCommon.md b/docs/dev/debt/libSceNpCommon.md index ac37172c5f..8d62a98e68 100644 --- a/docs/dev/debt/libSceNpCommon.md +++ b/docs/dev/debt/libSceNpCommon.md @@ -2,24 +2,16 @@ ### Unknown function info +- [sceNpGetSandboxMode](../../../core/libs/prx/libSceNpCommon/PendingExports.cpp) (NID `N59Z0D0WTuQ`) - signature and behavior are unknown. The parameterless import-resolution placeholder throws through `NotImplemented_nid_no_patch`. +- [sceNpUtilGetSandboxMode](../../../core/libs/prx/libSceNpCommon/PendingExports.cpp) (NID `0rqvzrXUR5Y`) - signature and behavior are unknown. The parameterless import-resolution placeholder throws through `NotImplemented_nid_no_patch`. + Pending import declarations are matched to names in the local libSceNpCommon.sprx export table and the public [PS5 3.20 libSceNpCommon export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/main/libSceNpCommon.c); their NIDs are recomputed with tools/nid_names.py. Prototypes and behavior are unknown. Each parameterless declaration exists for import resolution and throws if called. - [sceNpCloseSema](../../../core/libs/prx/libSceNpCommon/PendingExports.cpp) (NID `8hPzfjZzV88`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [sceNpGetNavSdkVersion](../../../core/libs/prx/libSceNpCommon/PendingExports.cpp) (NID `QmDEFikd3VA`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [sceNpIntGetPlatformType](../../../core/libs/prx/libSceNpCommon/PendingExports.cpp) (NID `G6qytFoBJ-w`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [sceNpIntSetPlatformType](../../../core/libs/prx/libSceNpCommon/PendingExports.cpp) (NID `X6emt+LbSEI`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. -- [sceNpJsonParse](../../../core/libs/prx/libSceNpCommon/PendingExports.cpp) (NID `vJGDnNh4I0g`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. -- [sceNpJsonParseBuf](../../../core/libs/prx/libSceNpCommon/PendingExports.cpp) (NID `RgfCYkjW7As`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. -- [sceNpJsonParseBufInit](../../../core/libs/prx/libSceNpCommon/PendingExports.cpp) (NID `SnAdybtBK3o`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. -- [sceNpJsonParseEx](../../../core/libs/prx/libSceNpCommon/PendingExports.cpp) (NID `p5ZkSMRR7AU`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. -- [sceNpJsonParseExInit](../../../core/libs/prx/libSceNpCommon/PendingExports.cpp) (NID `nhgjiwPUIzI`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. -- [sceNpJsonParseInit](../../../core/libs/prx/libSceNpCommon/PendingExports.cpp) (NID `teVnFAL6GNY`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [sceNpOpenSema](../../../core/libs/prx/libSceNpCommon/PendingExports.cpp) (NID `-blITIdtUd0`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. -- [sceNpServerErrorJsonGetErrorCode](../../../core/libs/prx/libSceNpCommon/PendingExports.cpp) (NID `0lZHbA-HRD0`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. -- [sceNpServerErrorJsonMultiGetErrorCode](../../../core/libs/prx/libSceNpCommon/PendingExports.cpp) (NID `cRabutqUG7c`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. -- [sceNpServerErrorJsonParse](../../../core/libs/prx/libSceNpCommon/PendingExports.cpp) (NID `WSQxnAVLKgw`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. -- [sceNpServerErrorJsonParseInit](../../../core/libs/prx/libSceNpCommon/PendingExports.cpp) (NID `UbStlMKTBeU`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. -- [sceNpServerErrorJsonParseMultiInit](../../../core/libs/prx/libSceNpCommon/PendingExports.cpp) (NID `hbe+DdooIi4`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [sceNpSetPlatformType](../../../core/libs/prx/libSceNpCommon/PendingExports.cpp) (NID `m9JzZSoDVFY`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [sceNpUtilCanonicalizeNpIdForPs4](../../../core/libs/prx/libSceNpCommon/PendingExports.cpp) (NID `4mEAk-UKVNw`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [sceNpUtilCanonicalizeNpIdForPsp2](../../../core/libs/prx/libSceNpCommon/PendingExports.cpp) (NID `N3FB4r8JoRE`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. @@ -43,10 +35,16 @@ Pending import declarations are matched to names in the local libSceNpCommon.spr - [Online ID and NpId utilities](../../../core/libs/prx/libSceNpCommon/Export.cpp) (libSceNpCommon) - `sceNpCmpOnlineId`, `sceNpCmpNpIdInOrder`, `sceNpGetPlatformType` and `sceNpIntIsValidOnlineId` are not measured on a console; their signatures, checks and results follow [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/a808e76/src/core/libraries/np/np_common.cpp), including the platform tags read from `opt[4..7]` and the 3 to 16 character online ID rule. - [Mutex, condition and thread wrappers](../../../core/libs/prx/libSceNpCommon/Export.cpp) (libSceNpCommon) - the `sceNpMutex*`, `sceNpLwMutex*`, `sceNpCond*` and `sceNpJoinThread` wrappers forward to the libkernel `scePthread*` calls as in [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/a808e76/src/core/libraries/np/np_common.cpp) and are not measured on a console. Only `EBUSY` from try-lock and `ETIMEDOUT` from a timed wait are mapped to NP errors; every other kernel error is returned unchanged. The `flags` argument of `sceNpCondInit` is ignored. +- [sceNpGetSystemClockUsec](../../../core/libs/prx/libSceNpCommon/Export.cpp) (libSceNpCommon) - a null destination returns the invalid-argument error `0x80550003` as a host-safety fallback; shadPS4 writes through the pointer without checking it, and the console behaviour is not measured. - [sceNpGetSdkVersion](../../../core/libs/prx/libSceNpCommon/Export.cpp) (libSceNpCommon) - writes the libkernel system software version as `major.minor` into an 8-byte buffer without checking it, as shadPS4 does; that version is the fixed `1.00`, not the SDK version a title was built with. - [The exports in Runtime.cpp](../../../core/libs/prx/libSceNpCommon/Runtime.cpp) and [Strings.cpp](../../../core/libs/prx/libSceNpCommon/Strings.cpp) follow `libSceNpCommon.sprx` from firmware 13.60, read from disassembly and not measured on a console. - [The sce::np::Object new and delete operators](../../../core/libs/prx/libSceNpCommon/Runtime.cpp) (libSceNpCommon) - do not check that the size plus their 16-byte header fits, and free through the allocator stored in that header, ignoring the allocator passed to the delete forms, as `libSceNpCommon.sprx` of firmware 13.60 does, read from disassembly, not measured on a console. The extended forms keep the address of the `SceNpAllocatorEx` itself, whose first member is the allocator. +- [sce::np::MemoryStreamReader and MemoryStreamWriter](../../../core/libs/prx/libSceNpCommon/Runtime.cpp) (libSceNpCommon) - follow `libSceNpCommon.sprx` of firmware 13.60, read from disassembly, not measured on a console: `Read` always writes the count through its output pointer, while `Write` checks it for null; a writer with a null buffer only counts, with no limit; the room left is `size - position` unsigned, except that a size of 0 gives no room, so a position past a non-zero size is not refused; the handle argument is ignored. +- [The sce::np::StreamReader and StreamWriter helpers](../../../core/libs/prx/libSceNpCommon/Runtime.cpp) (libSceNpCommon) - follow `libSceNpCommon.sprx` of firmware 13.60, read from disassembly, not measured on a console: `ReadAll` halts through `sceNpPanic` when the stream reports more bytes than it was asked for; `WriteData` and `WriteFilledData` loop for as long as the stream accepts 0 bytes; `SkipAll` adds the count a read reports even when that read or its context call fails, while `SkipData` adds only the bytes its chunk's `ReadData` completed before the failing call; positive stream and context results count as success and are returned as 0. +- [sce::np::RefObject](../../../core/libs/prx/libSceNpCommon/Runtime.cpp) (libSceNpCommon) - follow `libSceNpCommon.sprx` of firmware 13.60, read from disassembly, not measured on a console: `Release` calls the deleting destructor from the vtable only when the count it leaves is exactly 0, so a count that was already 0 or below goes negative without deleting the object; `AddRef` and `Release` return the new count, wrapping at the 32-bit limits. +- [sce::np::NpCommId and sceNpUtilParseTitleId](../../../core/libs/prx/libSceNpCommon/Runtime.cpp) (libSceNpCommon) - follow `libSceNpCommon.sprx` of firmware 13.60, read from disassembly, not measured on a console, with one change: `sceNpUtilParseTitleId` reads `titleId[9]` only when the string is at least 10 characters long, where the module reads it whatever the length, past the end of a shorter string. The parsed number is `strtol` of the text after the underscore, cut to a byte, as in the module. - [sce::np::NpTitleId Parse and ConstructFromTitleId](../../../core/libs/prx/libSceNpCommon/Runtime.cpp) (libSceNpCommon) - drop the parsed `_NN` suffix and store `_00`, and accept only ASCII letters and digits, as `libSceNpCommon.sprx` of firmware 13.60 does, read from disassembly, not measured on a console. The module classifies characters with the C-locale `_Getpctype` table, so a locale with other letters is not covered. Parse takes exactly 12 characters, ConstructFromTitleId exactly 9, and a rejected title id leaves the object unchanged. +- [The sce::np::StreamReader and StreamWriter helpers](../../../core/libs/prx/libSceNpCommon/Runtime.cpp) (libSceNpCommon) - follow `libSceNpCommon.sprx` of firmware 13.60, read from disassembly, not measured on a console: `ReadAll` halts through `sceNpPanic` when the stream reports more bytes than it was asked for; `WriteData` and `WriteFilledData` loop for as long as the stream accepts 0 bytes; `SkipAll` and `SkipData` add the reported count even when the read fails; positive stream and context results count as success and are returned as 0. - [sceNpCreateThread](../../../core/libs/prx/libSceNpCommon/Runtime.cpp) always applies an explicit priority when one is given; the firmware picks between explicit and inherited scheduling from the title's compiled SDK version, which is not available here. - [sceNpCalloutStartOnCtx and sceNpCalloutStartOnCtx64](../../../core/libs/prx/libSceNpCommon/Runtime.cpp) look for the callout in the queue before writing it and return `0x80558006` with the entry and the queue unchanged. Firmware 13.60, read from disassembly and not measured on a console, clears and fills the entry before it takes the lock and checks the queue, so restarting a queued callout returns the same error but drops every callout queued after it. - [sceNpArchInit and sceNpArchTerm](../../../core/libs/prx/libSceNpCommon/Runtime.cpp) keep a reference count under a lock and create the global heap once. Firmware 13.60, read from disassembly and not measured on a console, uses no lock and never sets its count on the first call, so every call made while the count is zero creates the heap again, and a call to sceNpArchTerm at zero destroys the heap and leaves the count negative. @@ -57,7 +55,8 @@ Pending import declarations are matched to names in the local libSceNpCommon.spr - [sceNpUtilGetNpDebug, sceNpUtilGetNpTestPatch, sceNpUtilGetTrcNotify, sceNpUtilGetIgnoreNpTitleId, sceNpUtilGetFakeDisplayNameMode, sceNpUtilGetWebTraceSetting, sceNpUtilGetWebApi2FakeRateLimit, sceNpUtilGetWebApi2FakeRateLimitTarget, sceNpUtilGetFakeRateLimit, sceNpUtilGetDbgCommerce, sceNpUtilGetSystemLanguage, sceNpUtilGetEnv, sceNpUtilGetDateSetAuto and sceNpUtilGetShareTitleCheck](../../../core/libs/prx/libSceNpCommon/PendingExports.cpp) read system and debug registry keys through libSceRegMgr, whose `sceRegMgrNonSysGetInt` and string reads still throw; they throw until those exist. - [sceNpOpenSema and sceNpCloseSema](../../../core/libs/prx/libSceNpCommon/PendingExports.cpp) forward to the libkernel open and close calls for named semaphores, which still throw. - [sceNpSetPlatformType, sceNpIntGetPlatformType, sceNpIntSetPlatformType, sceNpUtilCanonicalizeNpIdForPs4, sceNpUtilCanonicalizeNpIdForPsp2, sceNpUtilJidToNpId and sceNpGetNavSdkVersion](../../../core/libs/prx/libSceNpCommon/PendingExports.cpp) depend on console platform tags, network domain names or a version string of the console; they throw. -- [sceNpJsonParse, sceNpJsonParseInit, sceNpJsonParseBuf, sceNpJsonParseBufInit, sceNpJsonParseEx, sceNpJsonParseExInit and the sceNpServerErrorJson exports](../../../core/libs/prx/libSceNpCommon/PendingExports.cpp) are a streaming, schema-checked JSON parser whose event and error rules are not yet specified; they throw. +- [sceNpJsonParse, sceNpJsonParseBuf and sceNpJsonParseEx](../../../core/libs/prx/libSceNpCommon/Json.cpp) (libSceNpCommon) - decode escapes with this library's `sceNpUtilJsonGetOneChar`, so they differ from firmware 13.42 only where that function does. The firmware's version also unescapes the whole window it is given (six bytes from the character, or the twelve bytes of a surrogate pair) and returns that error without writing its outputs, so an invalid `\u` escape there makes the firmware's parser use the lengths left from the previous character. It also reads past the given length to finish a `\u` escape, so in the firmware an escape split between two calls depends on the bytes that follow the first part. Well-formed escapes that are not split decode the same +- [JSON parser exports](../../../core/libs/prx/libSceNpCommon/Json.cpp) (libSceNpCommon) - the 11 `sceNpJsonParse*` and `sceNpServerErrorJson*` exports follow firmware 13.42's libSceNpCommon.sprx, read from disassembly and compared by running the firmware's functions under a CPU emulator, not measured on a console and not checked against 13.60. As in that firmware, the type of the 16th nested container shares its context slot with the saved parser state, so when a call ends inside a 16th-level object, the bracket that closes it closes nothing and the outermost object is left open; the firmware does the same for every split position inside that object - [_ZN3sce2np10CancelableC2Ev](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `vqekW3s-eFg`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [sceNpUtilXmlEscape](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `5bBPLZV49kY`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np4CondD0Ev](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `AKiHGWhC2KU`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. @@ -65,7 +64,6 @@ Pending import declarations are matched to names in the local libSceNpCommon.spr - [_ZN3sce2np8WorkItem6CancelEi](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `Oq5aepLkEWg`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np9WorkQueue11GetItemByIdEi](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `F2umEBpQFHc`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np14JsonDocBuilderC2ERKNS0_9JsonValueE](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `dhJGQPKLmn0`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. -- [_ZN3sce2np18MemoryStreamReaderD0Ev](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `gA0CaCjJpg0`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np7RingBuf4dtorEv](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `rvz8xYxhMW0`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZThn16_N3sce2np9HttpTransD0Ev](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `zWIFe+d77PU`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np10MemoryFileD0Ev](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `6Vst7HqJMXU`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. @@ -79,7 +77,6 @@ Pending import declarations are matched to names in the local libSceNpCommon.spr - [_ZN3sce2np3ipc17ServiceIpmiClient21CreateRequestForAsyncEPiiPKvm](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `v5Z2LAKua28`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np18HttpConnectionPool13InvalidateAllEv](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `et05S+nkWG8`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np3ipc17ServiceIpmiClient21DeleteRequestForAsyncEii](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `7oJpAd+vJQA`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. -- [_ZN3sce2np18MemoryStreamWriter5WriteEPNS0_6HandleEPKvmPm](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `VxKQGrudnzk`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np15CancelableScopeD1Ev](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `km5-rjNjSFk`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np8JsonFileD2Ev](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `QFYVZvAJNC8`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np9JsonArray12AddItemArrayEPPS1_](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `4cIJxNKQK5g`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. @@ -96,7 +93,6 @@ Pending import declarations are matched to names in the local libSceNpCommon.spr - [_ZN3sce2np9WorkQueueD2Ev](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `AIDhc3KCK7w`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZThn16_N3sce2np9HttpTrans5WriteEPNS0_6HandleEPKvmPm](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `eRlqlofFKYg`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np10EventQueue4ctorEv](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `xu9qWN0YYC4`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. -- [_ZN3sce2np12StreamReader4ReadEPNS0_6HandleEPNS0_9StreamCtxEPvmPm](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `rCRh3V03bPs`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np20BufferedStreamReaderD1Ev](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `Tgr66MThOxA`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np3ipc10IpmiClient7ConnectEPKvm](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `CGKtxL26XqI`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np4Cond4InitEPKcPNS0_5MutexE](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `wWTqVcTnep8`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. @@ -123,16 +119,13 @@ Pending import declarations are matched to names in the local libSceNpCommon.spr - [_ZN3sce2np10Cancelable7DestroyEv](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `v2yJZLY0w1U`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZThn8_N3sce2np9LocalFileD1Ev](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `kD3l0P19Wzg`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZNK3sce2np10JsonString6GetStrEPcm](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `ZquDaA7NrQ4`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. -- [_ZN3sce2np8NpCommIdC2ERK20SceNpCommunicationId](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `WywlusFissg`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np10Cancelable10LockCancelEPKciS3_](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `fd+grYAEph0`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np8WorkItem10SetPendingEv](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `2YbS+GhInZQ`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np7Callout4StopEv](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `14PDhhMEBKY`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np7RingBuf14CheckinForReadEm](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `oaSKGgwTWG0`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. -- [_ZN3sce2np12StreamWriter9WriteDataEPNS0_6HandleEPKvmPm](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `vHaV+tsSVu4`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np6ThreadD1Ev](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `0Q5aKjYErBA`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2npeqERK12SceNpTitleIdRKNS0_9NpTitleIdE](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `6jHOZ6fItFU`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np9EventFlag3SetEm](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `8i-vOVRVt5w`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. -- [_ZN3sce2np9RefObjectC1Ev](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `brUrttJp6MM`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZNK3sce2np7RingBuf6IsFullEv](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `bvJ207-8qBQ`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2npneERKNS0_13NpTitleSecretERK16SceNpTitleSecret](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `7b5y1XSa+KQ`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np9LocalFileD0Ev](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `-n0CR0QxhnY`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. @@ -153,7 +146,6 @@ Pending import declarations are matched to names in the local libSceNpCommon.spr - [_ZN3sce2np7RingBufC1Ev](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `L5BnZpuQImk`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np10MemoryFileD1Ev](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `ZUf92uPkRuA`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np9HttpTrans21GetResponseStatusCodeEPNS0_6HandleEPi](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `WoFp77mNyw0`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. -- [_ZN3sce2np12StreamReader8SkipDataEPNS0_6HandleElPl](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `MSMPXUL5AuM`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np13NpTitleSecretC2ERKS1_](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `JHG9CTmkdQw`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np14CalloutContextD1Ev](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `S+a+rgnGX8A`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np5Mutex7DestroyEv](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `RgGW4f0ox1g`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. @@ -164,11 +156,8 @@ Pending import declarations are matched to names in the local libSceNpCommon.spr - [_ZN3sce2np3ipc17ServiceIpmiClient15RegisterServiceEPKNS1_17ServiceClientInfoE](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `stUzNgtFmtY`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np8WorkItemD0Ev](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `Y-I66cSNp+A`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np9SemaphoreD2Ev](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `OukNoRur97E`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. -- [_ZN3sce2np18MemoryStreamReaderC1EPKvm](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `UHj0GDTA2CU`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np9EventFlagD2Ev](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `RpWWfCEs9xA`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. -- [_ZN3sce2np9RefObjectD1Ev](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `lPQzOhwPjuw`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_sceNpAllocatorMalloc](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `mzlILsFx0cU`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. -- [_ZN3sce2np18MemoryStreamWriterD0Ev](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `TXJnPiKuTf8`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2npneERK10SceRtcTickRKNS0_4TimeE](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `MVY+jtY-WiQ`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np13RingBufMemory6IsInitEv](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `zdRXyt-65kA`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np7RingBufD0Ev](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `hfJ1gGLgvq8`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. @@ -176,16 +165,13 @@ Pending import declarations are matched to names in the local libSceNpCommon.spr - [_ZN3sce2np12HttpTemplate7DestroyEv](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `73qbxKjBH0o`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np15CancelableScope5BeginEPNS0_6HandleEPKciS5_](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `Etvu03IpTEc`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZNK3sce2np10EventQueue6IsInitEv](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `VI8AHrfLdqY`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. -- [_ZN3sce2np18MemoryStreamWriterD1Ev](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `3VdCUl+DkNw`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np8JsonBool5ClearEv](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `uDyILPgHF9Q`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np9LocalFile8TruncateEl](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `Sgo7wy9okFI`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZNK3sce2np10JsonNumber6GetNumEPcm](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `m+dAaZ5pyO4`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np13RingBufMemory7DestroyEv](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `Za00SEoNA2A`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. -- [_ZN3sce2np9RefObject7ReleaseEv](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `5tYi1l9CXD0`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np9LocalFileC1Ev](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `QWlZu1JZOww`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np7RingBufD2Ev](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `9+NmoosRoBA`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np4PathD2Ev](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `1nF0eXrBZYM`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. -- [_ZN3sce2np12StreamReader7ReadAllEPNS0_6HandleEPvmPm](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `f1ncwa-JXlA`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np4CondD1Ev](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `yX9ISVXv+0M`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np9EventFlag7DestroyEv](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `QlaBcxSFPZI`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np9HttpTransC1EP16SceNpAllocatorEx](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `sqNxD6H5ZOQ`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. @@ -197,7 +183,6 @@ Pending import declarations are matched to names in the local libSceNpCommon.spr - [_ZNK3sce2np10JsonString9GetLengthEv](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `Wixm7ST0Syw`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np10EventQueueD0Ev](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `E4uoqSdo8ek`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np8JsonNull5ClearEv](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `88GKkivBFhI`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. -- [_ZN3sce2np18MemoryStreamWriterD2Ev](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `YmOVGwSJmzk`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np4Time12GetUserClockEPS1_](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `vINvzJOaqws`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZN3sce2np3ipc17ServiceIpmiClient12AbortRequestEii](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `tQOrMf4KtIo`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. - [_ZNK3sce2np5Mutex6IsInitEv](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `Yc+qj4TIEY0`) - the signature and behavior are unknown. The no-parameter declaration only resolves the import; it makes no ABI claim. Calls throw through `NotImplemented_nid_no_patch`. diff --git a/docs/dev/debt/libSceNpCppWebApi.md b/docs/dev/debt/libSceNpCppWebApi.md index b53a0809d7..fa757b8560 100644 --- a/docs/dev/debt/libSceNpCppWebApi.md +++ b/docs/dev/debt/libSceNpCppWebApi.md @@ -2,10 +2,11 @@ ### Silent stubs +- [sce::Np::CppWebApi title-imported parameter bookkeeping](../../../core/libs/prx/libSceNpCppWebApi/Export.cpp) (libSceNpCppWebApi) - the `SessionManager::V1` `GameSessionsApi` `ParameterTo*` constructors, destructors, `initialize` and `terminate`, the `RequestGameSession*`/`Patch*RequestBody`/`RequestMatch*`/`Added*`/`Removed*`/`RequestPlayer*`/`RequestTeam*`/`RequestMember*`/`RequestResults*` setters, and the Common `IntrusivePtr`/`Vector`/`Transaction` constructors, destructors and bookkeeping calls over the new families succeed without keeping state or contacting the network. The values are never read because a request is never started. Behaviour beyond the signatures has no source. - [sce::Np::CppWebApi::Common](../../../core/libs/prx/libSceNpCppWebApi/Export.cpp) (libSceNpCppWebApi) - the `finish` overrides of `DownStreamTransaction<...>` (2 instantiations) and `Vector>::pushBack` return success without doing work; a failed request never produces a transaction to finish. `Transaction<...>::setOnFinishedCallback` and `TransactionBase<...>::setResponseInformationOption` (5 instantiations each, the `UserProfile::V1`, `ProfanityFilter::V2` and `CommunicationRestrictionStatus::V3` responses) return success without storing the callback or the option: `start` fails, so neither is ever used. The constructors and destructors of the same five `Transaction<...>` instantiations succeed without keeping state - [sce::Np::CppWebApi::Leaderboards::V1](../../../core/libs/prx/libSceNpCppWebApi/Export.cpp) (libSceNpCppWebApi) - request-body bookkeeping succeeds without storing state: `GetRankingRequestBody::set{StartSerialRank,Group,Limit,Users,Offset}`, `RecordScoreRequestBody::set{Comment,SmallData,NeedsTmpRank,ComparedDateTime,PcId}` and `User::{setAccountId,setPcId}`. `BoardsApi::ParameterToGetBoardDefinition`, `RecordApi::ParameterToRecordLargeData`, `RecordApi::ParameterToRecordScore`, `ViewApi::ParameterToGetLargeDataByObjectId` and `ViewApi::ParameterToGetRanking` keep only whether they are initialized, as the SessionManager::V1 parameters do: `initialize` and `terminate` return the codes of the module bundled with PPSA21564, 0x80553512 for an empty `RecordScoreRequestBody` included. They store none of the arguments, and `setxPsnAtomicOperation` and `setgetRankingRequestBody` store nothing either - [sce::Np::CppWebApi::SessionManager::V1](../../../core/libs/prx/libSceNpCppWebApi/Export.cpp) (libSceNpCppWebApi) - `RequestPlayerSession::set{MaxSpectators,InvitableUserType,JoinableUserType,ExclusiveLeaderPrivileges}` and `RequestPlayerSessionPlayer::setPushContexts` succeed without storing state. The `PlayerSessionsApi` parameters `ParameterToCreatePlayerSessions`, `ParameterToGetPlayerSessionInvitations`, `ParameterToJoinPlayerSessionAsPlayer` and `ParameterToLeavePlayerSession` keep only whether they are initialized, as the TitleCloudStorage ones do: `initialize`, `terminate` and `setinvitationInvalidFilter` return the codes of the module bundled with PPSA21564, plus 0x80553512 when the request body of `ParameterToCreatePlayerSessions` or `ParameterToJoinPlayerSessionAsPlayer` is empty. They store none of the strings or bodies, and `setfields` stores nothing either: only a request would read them -- [sce::Np::CppWebApi::TitleCloudStorage::V1 and InGameCatalog::V5](../../../core/libs/prx/libSceNpCppWebApi/Export.cpp) (libSceNpCppWebApi) - `DataApi::ParameterToDownloadData`, `DataApi::ParameterToGetMultiDataStatusesByUser` and `ContainerApi::ParameterToGetContainer` keep only whether they are initialized. `initialize`, `terminate` and the string setters return the codes of the module bundled with PPSA21564: 0x80553503 for a null `LibContext` or string, 0x80553502 for a `LibContext` that `Common::initialize` did not set or a parameter not yet initialized, 0x8055350f for a second `initialize` and 0x80553510 for `terminate` without one. They store none of the values, and `ParameterToGetContainer::set{sort,offset,limit,serviceLabel}` store nothing either: only a request would read them +- [sce::Np::CppWebApi::TitleCloudStorage::V1 and InGameCatalog::V5](../../../core/libs/prx/libSceNpCppWebApi/Export.cpp) (libSceNpCppWebApi) - `DataApi::ParameterToDownloadData`, `DataApi::ParameterToGetMultiDataStatusesByUser` and `ContainerApi::ParameterToGetContainer` keep only whether they are initialized. `initialize`, `terminate` and the string setters return the codes of the module bundled with PPSA21564: 0x80553503 for a null `LibContext` or string, 0x80553502 for a `LibContext` that `Common::initialize` did not set or a parameter not yet initialized, 0x8055350f for a second `initialize` and 0x80553510 for `terminate` without one; an empty `SetDataInfo` body returns 0x80553512. `ParameterToUploadData`, `ParameterToSetDataInfo`, `ParameterToDeleteMultiDataByUser` and `ParameterWithBinaryRequestBodyToUploadData` add state-less setters and keep only the initialized flag. None store values; only a request would read them. `DataStatus::{getLastUpdatedDateTime,getInfo}` and `UploadDataResponseHeaders::{getXPsnAtomicOperationId,hasXPsnAtomicOperationId}` throw, as a failed request never produces those objects. The console behaviour is not measured. - [sce::Np::CppWebApi::UserProfile::V1, ProfanityFilter::V2, CommunicationRestrictionStatus::V3](../../../core/libs/prx/libSceNpCppWebApi/Export.cpp) (libSceNpCppWebApi) - `FriendsApi::ParameterToGetFriends`, `PresenceApi::ParameterToGetBasicPresences`, `BlocksApi::ParameterToGetBlockingUsers`, `ProfanityApi::ParameterToFilterProfanity` and `CommunicationRestrictionStatusApi::ParameterToGetCommunicationRestrictionStatus` keep only whether they are initialized, as the SessionManager::V1 parameters do: `initialize` and `terminate` return the codes of the module bundled with PPSA21564, 0x80553512 for an empty `WebApiFilterRequest` included. They store none of the arguments: only a request would read them ### Unknown function info @@ -15,7 +16,13 @@ - [sce::Np::CppWebApi::Common::String](../../../core/libs/prx/libSceNpCppWebApi/Export.cpp) (libSceNpCppWebApi) - the 0x20-byte layout (32-bit reference count, buffer at 0x08, buffer size at 0x10, `LibContext*` at 0x18) comes from the module bundled with one title (PPSA21564); other SDK versions are not checked. `append` grows the buffer with the host allocator and the destructor frees it, instead of going through the `LibContext` allocator. `pushBack` into `Vector` stores a deep copy, so a destroyed temporary cannot invalidate the stored element; a title that byte-copies a `String` with a live buffer would still double-free, as nothing increments the reference count - [sce::Np::CppWebApi::Common::Vector](../../../core/libs/prx/libSceNpCppWebApi/Export.cpp) (libSceNpCppWebApi) - imported by PPSA03671, whose dump ships no `libSceNpCppWebApi.prx`. A `Vector` handle is an `IntrusivePtr` over a shared body; bodies created by `pushBack` use a host-side layout with the reference count at 0x30, matching the adopted-body convention measured on PPSA21564. The pointer/deleter constructor adopts a title-provided body released through the stored deleter; `pushBack` on such a body throws, since its element layout is unknown. `begin`, `end`, iterators and `copyFrom` throw: the only `Vector`s the title reads back come from failed transactions, which never produce one. `empty`, `size` and `operator[]` read the host-created body honestly and throw on title-provided bodies - [sce::Np::CppWebApi::SessionManager2V1](../../../core/libs/prx/libSceNpCppWebApi/Export.cpp) (libSceNpCppWebApi) - imported by PPSA03671. Offline, the factories, `PlayerSessionsApi` calls and transaction `start`/`getResponse`/`readData` fail with `SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN`; parameter setters, `initialize`, `terminate`, constructors and destructors succeed without keeping state, as no request is ever sent. Response-body accessors (`getSessionId`, `getPlayerSessions`, `getInvitations`, the `IsSet` queries) throw: a failed request never produces a response object +- [sce::Np::CppWebApi::Matchmaking::V1](../../../core/libs/prx/libSceNpCppWebApi/Export.cpp) (libSceNpCppWebApi) - imported by PPSA21564 (86 of 92) and PPSA05510, PPSA25256, PPSA17226 and PPSA08395 for the other six; behaviour comes from the module bundled with PPSA21564/PPSA23732 (builds J03093737/J03341606), not from a console. Offline, the four `Api` calls and four factories return `SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN`. The four `ParameterTo*` objects keep only an initialized flag: `initialize` returns 0x80553503 for a null context or string, 0x80553502 for an unset context, 0x8055350f when already initialized and 0x80553512 for an empty `SubmitTicketRequestBody`; `terminate` returns 0x80553510. `ParameterToGetTicket::setview` returns 0x80553502 uninitialized and 0x80553503 for a null string. Other setters succeed without keeping state. Response accessors throw: a failed request produces no response. 0x80553504 is never returned; the stub stores a static pointer. - [sce::Np::CppWebApi::UserProfile::V1, ProfanityFilter::V2, CommunicationRestrictionStatus::V3](../../../core/libs/prx/libSceNpCppWebApi/Export.cpp) (libSceNpCppWebApi) - imported by an Epic Online Services module whose dump ships no `libSceNpCppWebApi.prx`. The reference-count offset 0x00 of `ResponseHeaderBase` and `WebApiFilterRequest` is assumed from the other objects, not measured. Offline, the five API calls, `WebApiFilterRequestFactory::create` and the transactions' `start`/`getResponseHeaders` fail with `SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN`. Response accessors, `ResponseHeaderBase::getHeaderValue` and the `Vector`/`Iterator` members over `IntrusivePtr` and `unsigned long` throw: a failed request never produces a response - [libSceNpCppWebApi](../../../core/libs/prx/libSceNpCppWebApi/Export.cpp) (libSceNpCppWebApi) - unimplemented stubs have their parameter lists, const qualifiers and return types aligned with the demangled symbols confirmed by NID matching in [#8143](https://github.com/boykopovar/AnyPS5/issues/8143). They cover response-body accessors, iterators, and uninstantiated transactions in Leaderboards::V1, SessionManager::V1, InGameCatalog::V5, TitleCloudStorage::V1, and Common templates: each mangled name gives the method and parameter types, but the runtime layout of response objects and errors are unverified on console, so each call continues to throw NotImplemented_nid_no_patch. No call site is recorded for them - [sce::Np::CppWebApi::SessionManager2V1 and sce::Np::CppWebApi::InGameCatalog2V5](../../../core/libs/prx/libSceNpCppWebApi/Export.cpp) (libSceNpCppWebApi) - 198 further exports imported by PPSA20397, named from aerolib. API calls, factories and transaction `start`/`getResponse*` fail `SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN`; parameter bookkeeping succeeds without state; `IntrusivePtr`/`Vector` helpers follow the layouts above, with `Vector::empty`/`size`/`operator[]` reading host-created bodies and throwing on title-provided ones. Response accessors, iterators, `Vector::begin`/`end`/`copyFrom` and transaction `operator=` throw: a failed request produces no response object. As `start` never succeeds here, `TransactionBase::finish` and `abort` return 0x80553508 and `getId` returns 0, which is what the module bundled with PPSA21564 returns while the two words its `Transaction` constructor zeroes are still unset - [sce::Np::CppWebApi::UserProfile::V1, sce::Np::CppWebApi::CommunicationRestrictionStatus::V3 and the remaining sce::Np::CppWebApi::Common instantiations](../../../core/libs/prx/libSceNpCppWebApi/Export.cpp) (libSceNpCppWebApi) - 87 further exports imported by PPSA20397, plus the previously-throwing `ContainerApi::ParameterToGetContainer` lifecycle and `getContainer`. API verbs and transaction `start`/`getResponse` fail `SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN`; parameter and model bookkeeping (`initialize`, `terminate`, `set*`, constructors, destructors) succeeds without state. `BasicProfile`/`BasicPresence`/`PersonalDetail` response accessors, `*IsSet` queries, `Get*Response` getters, vector `begin`/`end`, iterator dereference/compare and transaction `abort`/`getId`/`operator=` throw: no response object exists offline and the model layouts are unverified + +- [sce::Np::CppWebApi title-imported exports](../../../core/libs/prx/libSceNpCppWebApi/Export.cpp) (libSceNpCppWebApi) - exports imported by the `sce_module` copies shipped with PPSA20397 and PPSA03530 that main did not declare. NIDs and signatures come only from the titles' import tables; const and return types are inferred from the demangled name. Layouts and offline behaviour follow the landed same-template implementations sourced from the module bundled with PPSA21564. Response-body accessors, `IsSet` queries, `Vector` begin/end, `Iterator` dereference/compare and transaction `operator=` throw: a failed request produces no response object and the layouts are unverified. `SessionManager::V1` `GameSessionsApi`, `Matches::V1`, `Matchmaking::V1`, `UserProfile::V1`, `TitleCloudStorage::V1` and `InGameCatalog::V5` accessors have no other source, so behaviour is only what the signatures admit. + + + diff --git a/docs/dev/debt/libSceNpEntitlementAccess.md b/docs/dev/debt/libSceNpEntitlementAccess.md index c0574df28c..bda7dcc847 100644 --- a/docs/dev/debt/libSceNpEntitlementAccess.md +++ b/docs/dev/debt/libSceNpEntitlementAccess.md @@ -8,7 +8,8 @@ ### Unknown function info -- [sceNpEntitlementAccessGetAddcontEntitlementInfoIndividual, sceNpEntitlementAccessPollConsumableEntitlementInfo, sceNpEntitlementAccessRequestConsumableEntitlementInfo, sceNpEntitlementAccessRequestConsumeEntitlement](../../../core/libs/prx/libSceNpEntitlementAccess/Export.cpp) (libSceNpEntitlementAccess) - their names and NIDs are in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceNpEntitlementAccess.c), but no credible prototypes were found. They are declared without parameters solely to resolve known imports; this is not an ABI claim +- [sceNpEntitlementAccessGetAddcontEntitlementInfoIndividual](../../../core/libs/prx/libSceNpEntitlementAccess/Export.cpp) - the prototype is not from the SDK and no title call site was read: the user ID, service label, entitlement label and info follow the runtime declaration of [dlc_emu](https://github.com/drakmor/dlc_emu/blob/fcf69b16d46a/src/dlc_modules/scenpentitlementaccess_exports.cpp#L102-L115), a replacement module. The user ID is not checked against the signed-in users: only `-1` returns the parameter error `0x80558003`, before the null checks, as in dlc_emu; any other ID gets the result of `sceNpEntitlementAccessGetAddcontEntitlementInfo`, which ignores the service label and the initialization state and returns `0x80558007` for an unlisted label where dlc_emu returns its no-entitlement error. dlc_emu also returns the parameter error for an empty or unterminated label or nonzero padding; here the first two give `0x80558007` and padding is ignored. None of this is measured +- [sceNpEntitlementAccessPollConsumableEntitlementInfo, sceNpEntitlementAccessRequestConsumableEntitlementInfo, sceNpEntitlementAccessRequestConsumeEntitlement](../../../core/libs/prx/libSceNpEntitlementAccess/Export.cpp) (libSceNpEntitlementAccess) - their names and NIDs come from the export inventory cited by [the entry on main](https://github.com/boykopovar/AnyPS5/blob/ed1e0ed08fc2/docs/dev/debt/libSceNpEntitlementAccess.md#L11), but no credible prototypes were found. They are declared without parameters solely to resolve known imports; this is not an ABI claim - [sceNpEntitlementAccessGetEntitlementKey](../../../core/libs/prx/libSceNpEntitlementAccess/Export.cpp) - the three-argument signature, 16-byte key and errors `0x817D0002`/`0x817D0007` follow [KytyPS5](https://github.com/KytyPS5/KytyPS5/blob/main/src/libs/libNet.cpp); PPSA01521 passes a service label, entitlement label and output pointer. Only the no-key path is implemented: local entitlement labels carry no keys, and the output is untouched on failure. Console error precedence and key provisioning are unverified. PPSA03984 01.020.000 (at 0x5949837) and PPSA30839 01.003.000 (0x4505EC5), disassembled for this entry, pass service label 0, a pointer into an array of their own with 28-byte elements and a stack output, one call per element in a loop; after a failure (a negative result in PPSA03984, any nonzero one in PPSA30839) they go on with the next element, and on success PPSA03984 reads 16 bytes of the output - [Entitlement requests and polls](../../../core/libs/prx/libSceNpEntitlementAccess/Export.cpp): native argument lists are restored for single-item, list and consume operations, plus abort/delete. Request IDs are 64-bit, labels occupy 20 bytes and transaction IDs occupy 72 bytes. List options occupy 32 bytes and results have a 64-byte stride; their field semantics and three list-result scalars remain unresolved. The existing signed-out responses do not reproduce native initialization, validation or asynchronous request handling; no request can be created while signed out, so the library keeps no request table. diff --git a/docs/dev/debt/libSceNpFriendListDialog.md b/docs/dev/debt/libSceNpFriendListDialog.md index 2d5b73e230..20d29a05ed 100644 --- a/docs/dev/debt/libSceNpFriendListDialog.md +++ b/docs/dev/debt/libSceNpFriendListDialog.md @@ -2,6 +2,7 @@ ### Silent stubs +- [sceNpFriendListDialogOpenA](../../../core/libs/prx/libSceNpFriendListDialog/Export.cpp) (libSceNpFriendListDialog) - with `ANYPS5_PSN_DIALOGS=show`, a successful open shows AnyPS5's notice that the feature needs PlayStation Network; the console's own display without PlayStation Network is not measured, and the notice wording is AnyPS5's. - [libSceNpFriendListDialog](../../../core/libs/prx/libSceNpFriendListDialog/Export.cpp) - the friend list dialog (`sceNpFriendListDialogOpenA` and `sceNpFriendListDialogGetResultA`) runs the common-dialog state machine but shows nothing and reports the user as having cancelled, as there is no PSN friend list. The signatures are from [Orbital's type database](https://github.com/AlexAltea/orbital/blob/b321fcdbd700cc02da1cb1ad25412781d5ec73c6/tools/ida/db_types.json); the result layout beyond the leading `int32_t` result code is not known, so nothing else is written. ### Unknown function info diff --git a/docs/dev/debt/libSceNpManager.md b/docs/dev/debt/libSceNpManager.md index 73d5beeabc..5c42d83c55 100644 --- a/docs/dev/debt/libSceNpManager.md +++ b/docs/dev/debt/libSceNpManager.md @@ -1,5 +1,7 @@ # libSceNpManager technical debt +- [Older callable NIDs](../../../core/libs/prx/libSceNpManager/Export.cpp): 7 unidentified exports have unverified names, signatures and behavior. These are throwing import-resolution placeholders; no functionality is implemented. No matching NIDs were found in the later module inventory. Six use the primary logical-library qualifier and one uses ForSys; qualified guest resolution is unverified. + ### Silent stubs - [sceNpUnregisterPlusEventCallback](../../../core/libs/prx/libSceNpManager/Export.cpp) (libSceNpManager) - returns 0 whether or not a callback was registered, as `sceNpUnregisterPremiumEventCallback` does: `sceNpRegisterPlusEventCallback` keeps no callback, and a signed-out user gets no plus events diff --git a/docs/dev/debt/libSceNpPartner001.md b/docs/dev/debt/libSceNpPartner001.md index 27edb961fb..7f7fe23850 100644 --- a/docs/dev/debt/libSceNpPartner001.md +++ b/docs/dev/debt/libSceNpPartner001.md @@ -1,5 +1,10 @@ # libSceNpPartner001 technical debt +### Additional callable exports + +- [NpPartner001 export `pQfYTZHznMc`](../../../core/libs/prx/libSceNpPartner001/Export.cpp) is a function record with qualifier `M#A` in older and later version-labelled modules. Both map library ID 12 and module ID 0 to `libSceNpPartner001`. Older module words: `0x08540001`, `0x03200004`; later: `0x13590001`, `0x13600007`. The older module contains five function NIDs; sorted-LF SHA-256: `76ff771e3e2d8c523d0ffe0132db03b6e36fa58176d3bc6a433eb04ad76aa5ab`, using the [static ELF membership procedure](https://github.com/boykopovar/AnyPS5/pull/12367#issuecomment-6470603298). Labels do not authenticate retail provenance; the digest identifies the NID set only. Independent verification requires a matching image. The name, signature and behavior are unverified; this declaration throws. + + ### Functional - [sceNpEAAccessInitialize, sceNpEAAccessTerminate](../../../core/libs/prx/libSceNpPartner001/Export.cpp) (libSceNpPartner001) - initialization marks the library initialized without contacting the server and termination clears it, as in [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/main/src/core/libraries/np/np_partner.cpp); whether the console fails initialization while signed out is unknown. Termination without initialization throws where shadPS4 returns the PS4 error `0x819D0001`, whose PS5 value is unverified, and a second initialization throws where shadPS4 returns 0 without checking. PPSA23566 imports both, not confirmed on its start-up path diff --git a/docs/dev/debt/libSceNpParty.md b/docs/dev/debt/libSceNpParty.md index 8d6176415e..c75326e5cc 100644 --- a/docs/dev/debt/libSceNpParty.md +++ b/docs/dev/debt/libSceNpParty.md @@ -2,8 +2,8 @@ ### Unknown function info -- [sceNpPartyGetState and sceNpPartyGetStateAsUserA](../../../core/libs/prx/libSceNpParty/Export.cpp) (libSceNpParty) - the 16-bit state, its `NOT_IN_PARTY` value 2 and the `INVALID_ARGUMENT` (`0x80552504`) error follow shadPS4's [np_party.h](https://github.com/shadps4-emu/shadPS4/blob/a808e76/src/core/libraries/np/np_party.h) and [np_error.h](https://github.com/shadps4-emu/shadPS4/blob/a808e76/src/core/libraries/np/np_error.h) (PS4); shadPS4 does not check for a null state, and whether the console needs an initialized party library first is not known. Not measured on a PS5 -- [sceNpPartyGetId, sceNpPartyGetMembersA, sceNpPartyGetMemberInfoA, sceNpPartyGetMemberSessionInfo, sceNpPartyGetMemberVoiceInfo and sceNpPartySendBinaryMessage](../../../core/libs/prx/libSceNpParty/Export.cpp) (libSceNpParty) - the user is never in a party, so these return `NOT_IN_PARTY` (`0x80552506`, shadPS4's np_error.h) and write nothing, or `INVALID_ARGUMENT` for a null pointer; the signatures are from [Orbital's type database](https://github.com/AlexAltea/orbital/blob/b321fcdbd700cc02da1cb1ad25412781d5ec73c6/tools/ida/db_types.json). Like `sceNpPartyGetState` they do not require `sceNpPartyInitialize`, and the order of the null and party checks on the console is not known. Not measured on a PS5 +- [sceNpPartyGetState and sceNpPartyGetStateAsUserA](../../../core/libs/prx/libSceNpParty/Export.cpp) (libSceNpParty) - the 16-bit state, its `NOT_IN_PARTY` value 2 and the `INVALID_ARGUMENT` (`0x80552504`) error follow shadPS4's [np_party.h](https://github.com/shadps4-emu/shadPS4/blob/a808e76/src/core/libraries/np/np_party.h) and [np_error.h](https://github.com/shadps4-emu/shadPS4/blob/a808e76/src/core/libraries/np/np_error.h) (PS4); shadPS4 does not check for a null state. Both return `NOT_INITIALIZED` (`0x80552503`) before `sceNpPartyInitialize` and after `sceNpPartyTerminate`, and `sceNpPartyGetStateAsUserA` returns `INVALID_ARGUMENT` for user -1, as a [firmware 13.42 run](https://github.com/boykopovar/AnyPS5/pull/12948#issuecomment-6538287699) of the module under an emulator shows; there the state itself comes from the party service. Not measured on a PS5 +- [sceNpPartyGetId, sceNpPartyGetMembersA, sceNpPartyGetMemberInfoA, sceNpPartyGetMemberSessionInfo, sceNpPartyGetMemberVoiceInfo and sceNpPartySendBinaryMessage](../../../core/libs/prx/libSceNpParty/Export.cpp) (libSceNpParty) - the user is never in a party, so these return `NOT_IN_PARTY` (`0x80552506`, shadPS4's np_error.h) and write nothing, or `INVALID_ARGUMENT` for a null pointer; the signatures are from [Orbital's type database](https://github.com/AlexAltea/orbital/blob/b321fcdbd700cc02da1cb1ad25412781d5ec73c6/tools/ida/db_types.json). Like `sceNpPartyGetState` they return `NOT_INITIALIZED` (`0x80552503`) first when the library is not initialized, as the [13.42 run](https://github.com/boykopovar/AnyPS5/pull/12948#issuecomment-6538287699) shows for these and `sceNpPartyGetMembers`/`GetMemberInfo`. That run reaches the party service past the module's own checks and finds no local `NOT_IN_PARTY`, so the answer after initialization stays this model. Not measured on a PS5 - [sceNpPartyInitialize, sceNpPartyTerminate, sceNpPartyCheckCallback and sceNpPartyRegisterHandlerA](../../../core/libs/prx/libSceNpParty/Export.cpp) (libSceNpParty) - an initialized flag with `ALREADY_INITIALIZED` (`0x80552502`) and `NOT_INITIALIZED` (`0x80552503`) from shadPS4's np_error.h; the handlers are accepted but never called, since no party event can happen. Whether the console refuses a null initialize parameter, and which check comes first, is not known - [sceNpPartyCreate, sceNpPartyCreateA, sceNpPartyGetStateAsUser, sceNpPartyGetVoiceChatPriority, sceNpPartyJoin, sceNpPartyLeave, sceNpPartyRegisterPrivateHandler, sceNpPartySetVoiceChatPriority, sceNpPartyShowInvitationList, sceNpPartyShowInvitationListA and sceNpPartyUnregisterPrivateHandler](../../../core/libs/prx/libSceNpParty/Export.cpp) (libSceNpParty) - Orbital has no prototypes for these and no credible ones were found. The declarations have no parameters solely to resolve known imports; this is not an ABI claim and callers must not call them until signatures are verified - [sceNpPartyGetMembers, sceNpPartyGetMemberInfo and sceNpPartyRegisterHandler](../../../core/libs/prx/libSceNpParty/Export.cpp) (libSceNpParty) - the signatures are from [fpPS4](https://github.com/red-prig/fpPS4/blob/04cefd43e6fddd1ab033e7980cd356d14c964905/src/np/ps4_libscenpparty.pas) (PS4) and match their `A` variants, so they behave like them: no party, `NOT_IN_PARTY` from [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/a808e76/src/core/libraries/np/np_party.cpp), and handlers accepted but never called. How the console's non-`A` member structures differ from the `A` ones is not known, and nothing is written to them. Not measured on a PS5 diff --git a/docs/dev/debt/libSceNpProfileDialog.md b/docs/dev/debt/libSceNpProfileDialog.md index 54a1f1b591..5d274e8544 100644 --- a/docs/dev/debt/libSceNpProfileDialog.md +++ b/docs/dev/debt/libSceNpProfileDialog.md @@ -2,6 +2,7 @@ ### Silent stubs +- [sceNpProfileDialogOpen, sceNpProfileDialogOpenA](../../../core/libs/prx/libSceNpProfileDialog/Export.cpp) (libSceNpProfileDialog) - with `ANYPS5_PSN_DIALOGS=show`, a successful open shows AnyPS5's notice that the feature needs PlayStation Network; the console's own display for this call without PlayStation Network is not measured, and the notice wording is AnyPS5's. - [sceNpProfileDialogOpen, sceNpProfileDialogOpenA, sceNpProfileDialogGetResult](../../../core/libs/prx/libSceNpProfileDialog/Export.cpp) (libSceNpProfileDialog) - no profile is shown: `Open` and `OpenA` move the dialog straight to `FINISHED`, and `GetResult` reports `result` 0, `userAction` `USER_CANCELED` (1) and the caller's `userData`, as [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/c2814041e546bf75c12756dbec9da911c721ce1c/src/core/libraries/np/np_profile_dialog/np_profile_dialog.cpp#L21-L180) does when its window is dismissed. Not measured on a console. ### Unknown function info diff --git a/docs/dev/debt/libSceNpSessionSignaling.md b/docs/dev/debt/libSceNpSessionSignaling.md index b1876fa409..463498b1a5 100644 --- a/docs/dev/debt/libSceNpSessionSignaling.md +++ b/docs/dev/debt/libSceNpSessionSignaling.md @@ -8,6 +8,7 @@ - [sceNpSessionSignalingCreateJoinActivate, sceNpSessionSignalingGetCustomProperty, sceNpSessionSignalingGetGroupFromPeerAddress, sceNpSessionSignalingInitializeWithPort, sceNpSessionSignalingJoinActivate and sceNpSessionSignalingSetCustomProperty](../../../core/libs/prx/libSceNpSessionSignaling/Export.cpp) (libSceNpSessionSignaling) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceNpSessionSignaling.c), but no credible prototypes were found. They are declared without parameters solely to resolve known imports; this is not an ABI claim. - [sceNpSessionSignalingManualUdpAbortConnection, sceNpSessionSignalingManualUdpCreateJoin, sceNpSessionSignalingManualUdpEstablishConnection, sceNpSessionSignalingManualUdpJoin, sceNpSessionSignalingRegisterInternalCallback](../../../core/libs/prx/libSceNpSessionSignaling/Export.cpp) have unknown signatures and behaviour. The parameterless `int` declarations are import-resolution placeholders, not confirmed ABI signatures, and throw through `NotImplemented_nid_no_patch`. Only the names and NIDs are established by the [13.60 export inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/bfec40deb4c47a17d7603ee2bc79aa6862c0c56b/data/firmware-13.60/libscenpsessionsignaling-58c8806476.jsonl). +- [sceNpSessionSignalingGetMemoryInfo and sceNpSessionSignalingGetConnectionStatistics](../../../core/libs/prx/libSceNpSessionSignaling/Export.cpp) (libSceNpSessionSignaling) - both throw through `NotImplemented_nid_no_patch` without reading or writing their output; the prototypes in `Api.hpp` are not confirmed by a console measurement, and what the console returns and writes is unmeasured. ### Functional diff --git a/docs/dev/debt/libSceNpSessionSignalingCrossplay.md b/docs/dev/debt/libSceNpSessionSignalingCrossplay.md new file mode 100644 index 0000000000..160c31e286 --- /dev/null +++ b/docs/dev/debt/libSceNpSessionSignalingCrossplay.md @@ -0,0 +1,5 @@ +# libSceNpSessionSignalingCrossplay technical debt + +### Unknown function info + +- [11 exports (6 without a known name, bound by NID)](../../../core/libs/prx/libSceNpSessionSignalingCrossplay/Export.cpp) (libSceNpSessionSignalingCrossplay) - every function export of `libSceNpSessionSignalingCrossplay.sprx` from the firmware 13.60 export table, names from aerolib.csv only where `tools/nid_names.py` `compute_nid` reproduces the NID. Signatures, parameter layouts and behaviour are unknown; every export throws through `NotImplemented_nid_no_patch` diff --git a/docs/dev/debt/libSceNpSnsFacebookDialog.md b/docs/dev/debt/libSceNpSnsFacebookDialog.md index 5ec4954b21..627dee78b0 100644 --- a/docs/dev/debt/libSceNpSnsFacebookDialog.md +++ b/docs/dev/debt/libSceNpSnsFacebookDialog.md @@ -2,4 +2,5 @@ ### Silent stubs +- [sceNpSnsFacebookDialogOpen](../../../core/libs/prx/libSceNpSnsFacebookDialog/Export.cpp) (libSceNpSnsFacebookDialog) - with `ANYPS5_PSN_DIALOGS=show`, a successful open shows AnyPS5's notice that the feature needs PlayStation Network; the console's own display without PlayStation Network is not measured, and the notice wording is AnyPS5's. - [libSceNpSnsFacebookDialog](../../../core/libs/prx/libSceNpSnsFacebookDialog/Export.cpp) - the Facebook dialog runs the common-dialog state machine but shows nothing and reports the user as having cancelled, as there is no Facebook account link. The signatures are from [Orbital's type database](https://github.com/AlexAltea/orbital/blob/b321fcdbd700cc02da1cb1ad25412781d5ec73c6/tools/ida/db_types.json); the result layout beyond the leading `int32_t` result code is not known, so nothing else is written. diff --git a/docs/dev/debt/libSceNpTcs.md b/docs/dev/debt/libSceNpTcs.md index 3f4822e6e5..f22ccbfae8 100644 --- a/docs/dev/debt/libSceNpTcs.md +++ b/docs/dev/debt/libSceNpTcs.md @@ -3,3 +3,5 @@ ### Unknown function info - [sceNpTcsIntDownloadData, sceNpTcsIntUploadDataToNewSlotAbort and sceNpTcsIntUploadDataToNewSlotBegin](../../../core/libs/prx/libSceNpTcs/Export.cpp) (libSceNpTcs) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceNpTcs.c), but no credible prototypes were found. The declarations have no parameters solely to resolve known imports; this is not an ABI claim and callers must not call them until signatures are verified + +- [Older callable NIDs](../../../core/libs/prx/libSceNpTcs/Export.cpp): 8 unidentified exports have unverified names, signatures and behavior. These are throwing import-resolution placeholders; no functionality is implemented. No matching NIDs were found in the later module inventory. diff --git a/docs/dev/debt/libSceNpTrophy.md b/docs/dev/debt/libSceNpTrophy.md index 77342a6b15..c5a1f5bb5a 100644 --- a/docs/dev/debt/libSceNpTrophy.md +++ b/docs/dev/debt/libSceNpTrophy.md @@ -22,3 +22,18 @@ - [sceNpTrophyGetGameInfo](../../../core/libs/prx/libSceNpTrophy/Export.cpp) (libSceNpTrophy) - the trophy configuration `TROPCONF.ESFM` is encrypted and not read, so the game details report the trophy count taken from the `TROPnnn.PNG` icons and the group count taken from the `GRnnn.PNG` icons of the trophy package; the per-grade counts are 0, the title and description are empty, and the progress percentage is unlocked trophies over all trophies instead of the console's grade-weighted points - [sceNpTrophyGetGroupInfo](../../../core/libs/prx/libSceNpTrophy/Export.cpp) (libSceNpTrophy) - only the base game group (id -1) is answered, with the same counts as the game; an id past the `GRnnn.PNG` icons returns `INVALID_GROUP_ID`, and an existing group throws because the trophies of a group are listed only in the encrypted configuration - [sceNpTrophyGetTrophyInfo](../../../core/libs/prx/libSceNpTrophy/Export.cpp) (libSceNpTrophy) - the grade is reported as unknown, the trophy is never hidden, the name and description are empty and the unlock timestamp is 0; a package with groups throws, since a trophy's group is listed only in the encrypted configuration + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceNpTrophy/Export.cpp) - 6 entries present in both version-labelled images are import-resolution declarations only. None is listed in the pinned public 3.20 catalogue for this library. Neither label independently authenticates retail firmware provenance. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +[Version-pinned selected ELF export records](https://gist.github.com/kyon-eth/3fbb1a4a6f95a936b4cd58e9c3d8c50c/5e3af709224ed8235af11337309af0725e5685cb) list every NID below with its image label, decoded export module and library, raw qualified symbol, ELF function type, value and size for each inspected version-labelled image. The extract SHA-256 is `02ab27f12bcd0cc9fa03fa33f55fc201110f0d54a86bbbaa093d55d0a8cf262d`; its full-module sorted-function-NID digests and raw module-parameter words permit independent comparison. This is an analyst-produced metadata record, not independent authentication of the original images or proof of prototypes or behavior. + +| Name | NID | +| --- | --- | +| `Unknown` | `+O9vU1CpGZA` | +| `Unknown` | `+not13BEdVI` | +| `Unknown` | `FJZW2oHUHFk` | +| `Unknown` | `bGnKq23jqek` | +| `Unknown` | `lX611WLCvX0` | +| `Unknown` | `n4AHGHb-pfY` | diff --git a/docs/dev/debt/libSceNpTrophy2.md b/docs/dev/debt/libSceNpTrophy2.md index 399efb3058..8ea4acfe32 100644 --- a/docs/dev/debt/libSceNpTrophy2.md +++ b/docs/dev/debt/libSceNpTrophy2.md @@ -43,3 +43,5 @@ | `sceNpTrophy2SystemRemoveUserDataWithServerData` | `w2Uq3rRtT9I` | | `sceNpTrophy2SystemUnregisterTitleSyncedCallback` | `Gqf-wNaD-mM` | | `sceNpTrophy2SystemUnregisterTitleUpdateCallback` | `-LSu4NCj2p4` | + +- [Older callable NIDs](../../../core/libs/prx/libSceNpTrophy2/Export.cpp): 5 unidentified exports have unverified names, signatures and behavior. These are throwing import-resolution placeholders; no functionality is implemented. No matching NIDs were found in the later module inventory. diff --git a/docs/dev/debt/libSceNpTus.md b/docs/dev/debt/libSceNpTus.md index 4e34884163..d6ce715c3a 100644 --- a/docs/dev/debt/libSceNpTus.md +++ b/docs/dev/debt/libSceNpTus.md @@ -2,7 +2,6 @@ ### Unknown function info -- [sceNpTusCreateNpTitleCtx](../../../core/libs/prx/libSceNpTus/Export.cpp) - throws through `NotImplemented_nid_no_patch`; behaviour and the PS5 prototypes are unmeasured. The only source of the parameter lists is shadPS4's PS4-derived prototypes (GPLv2, used as a reference only), with no second reference; structure pointers are `void*` because no layout is known. - [TUS variable outputs](../../../core/libs/prx/libSceNpTus/Export.cpp) (libSceNpTus) - the layouts of the variable arrays of the `sceNpTusGetMultiSlotVariable*` calls and of `outVariable` in `sceNpTusAddAndGetVariableAAsync` are not verified, so the output is never written and `variableArraySize` / `outVariableSize` are not checked; shadPS4, and RPCS3 in its PS3 `sceNpTusGetMultiSlotVariable*` and `sceNpTusAddAndGetVariable*` calls, return `INVALID_ALIGNMENT` unless the size is `arrayLen` variables of the call's type, or one variable for `outVariable`. The signatures and the community error codes follow [shadPS4](https://github.com/shadps4-emu/shadPS4/tree/main/src/core/libraries/np/np_tus), which fpPS4 agrees with for the context and request calls; no console measurement. - [Multi-slot variable calls](../../../core/libs/prx/libSceNpTus/Export.cpp) (libSceNpTus) - the argument checks of the multi-slot get, set and delete calls are not measured on a console; they follow [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/c1b26558352b863f80142256e4df38585aa7d727/src/core/libraries/np/np_tus/np_tus.cpp), where they differ between functions: `arrayLen < 1` is `INSUFFICIENT_ARGUMENT` in the NpId and virtual-user delete calls and in `sceNpTusGetMultiSlotVariableVUserAsync`, and `INVALID_ARGUMENT` in the others; a null NpId is accepted except in delete; an empty virtual user ID is `INVALID_ARGUMENT`. RPCS3's [PS3 module](https://github.com/RPCS3/rpcs3/blob/1a9dca3a3a84a18df866e3021918322bd295160a/rpcs3/Emu/Cell/Modules/sceNpTus.cpp) has only the NpId and virtual-user calls; it returns `INVALID_ARGUMENT` for an empty array in all of them, rejects a null target in get and set and does not check for an empty virtual user ID. - [Variable, data, data status and TSS requests](../../../core/libs/prx/libSceNpTus/Export.cpp) (libSceNpTus) - the argument checks of the 82 add-and-get, try-and-set, data, data status, multi-user, friends and `sceNpTssGetSmallStorage` calls are not measured on a console; their signatures, checks and order follow [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/a808e76/src/core/libraries/np/np_tus/np_tus.cpp), including its differences between forms: the NpId try-and-set calls return `INVALID_ARGUMENT` for an operation type outside 1-6 where the others return `INVALID_TYPE`, and the NpId and virtual-user multi-slot data status calls return `TOO_MANY_NPID` for more than 64 slots. As for the calls above, the output and structure sizes are not checked, and every request finishes with `SCE_NP_ERROR_SIGNED_OUT` @@ -31,5 +30,6 @@ - [sceNpTusCreateNpTitleCtxA](../../../core/libs/prx/libSceNpTus/Export.cpp) (libSceNpTus) - creates a title context without checking sign-in, up to 32 contexts (`TOO_MANY_OBJECTS` beyond); shadPS4 returns the `sceNpGetNpId` error instead. Requests are limited to 256, and the limits are not measured on a console. - [sceNpTssCreateNpTitleCtx and sceNpTssCreateNpTitleCtxA](../../../core/libs/prx/libSceNpTus/Export.cpp) (libSceNpTus) - that TSS title contexts share the TUS context table and its 32-context limit is inferred from [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/615bcba5e21b82dc59588575f7ecbce8da09ca2c/src/core/libraries/np/np_tus/np_tus.cpp#L146-L168), which redirects both to the TUS creators, and from TSS requests coming from `sceNpTusCreateRequest`; nothing is measured on a console. The `A` form is `sceNpTusCreateNpTitleCtxA`. The `NpId` form returns `INSUFFICIENT_ARGUMENT` for a null `npId` and `INVALID_ARGUMENT` for service label `0xFFFFFFFF` before the limit, as shadPS4's [sceNpTusCreateNpTitleCtx](https://github.com/shadps4-emu/shadPS4/blob/615bcba5e21b82dc59588575f7ecbce8da09ca2c/src/core/libraries/np/np_tus/np_tus.cpp#L122-L143) does; the signatures are shadPS4's and fpPS4's, and Orbital's for the `A` form. +- [sceNpTusCreateNpTitleCtx](../../../core/libs/prx/libSceNpTus/Export.cpp) (libSceNpTus) - not measured on a console, and the `npId` contents are neither read nor kept with the context, where shadPS4 keeps them for its requests. It is `sceNpTssCreateNpTitleCtx`: `INSUFFICIENT_ARGUMENT` for a null `npId`, then `INVALID_ARGUMENT` for service label `0xFFFFFFFF`, then a context in the shared 32-context table, as in [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/db79f9d24348/src/core/libraries/np/np_tus/np_tus.cpp#L122-L143); the signature is shadPS4's and [fpPS4](https://github.com/red-prig/fpPS4/blob/04cefd43e6fd/src/np/ps4_libscenptus.pas#L72-L75)'s. - [sceNpTusPollAsync, sceNpTusWaitAsync](../../../core/libs/prx/libSceNpTus/Export.cpp) (libSceNpTus) - there is no PSN, so every implemented `*Async` call whose arguments pass the checks starts a request that finishes at once with `SCE_NP_ERROR_SIGNED_OUT`, which poll and wait report and the blocking calls return; shadPS4 returns `SIGNED_OUT` from the `*Async` call itself when no shadNet client is signed in, and RPCS3 returns `INVALID_ONLINE_ID` while offline, marked there as probable behaviour. An abort stays set, so every later operation on the request, blocking ones included, finishes with `ABORTED`; in shadPS4 an abort only ends the operation in progress. Until an operation has started, poll returns 1 and wait returns `INVALID_ARGUMENT` as in shadPS4; RPCS3 [blocks until a result is set](https://github.com/RPCS3/rpcs3/blob/1a9dca3a3a84a18df866e3021918322bd295160a/rpcs3/Emu/NP/np_contexts.cpp#L40-L52). - [sceNpTusGetData, sceNpTusGetDataVUser, sceNpTusGetMultiSlotVariable, sceNpTusGetMultiSlotVariableVUser, sceNpTusGetMultiUserVariableForCrossSave, sceNpTusSetData, sceNpTusSetDataVUser, sceNpTusSetMultiSlotVariable and sceNpTusSetMultiSlotVariableVUser](../../../core/libs/prx/libSceNpTus/Export.cpp) (libSceNpTus) - block on their `*Async` forms with the same parameters, as [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/396c2a09a38d22eaa02aab32c1967263dceab95f/src/core/libraries/np/np_tus/np_tus.cpp) does, so they inherit those forms' unmeasured checks and the offline `SIGNED_OUT` result diff --git a/docs/dev/debt/libSceNpWebApi.md b/docs/dev/debt/libSceNpWebApi.md index 7f02e3aa33..e9c3253459 100644 --- a/docs/dev/debt/libSceNpWebApi.md +++ b/docs/dev/debt/libSceNpWebApi.md @@ -1,5 +1,50 @@ # libSceNpWebApi technical debt +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceNpWebApi/InventoryExports.cpp) - 38 NIDs occur as functions under the same module and logical library in both version-labelled images. The labels do not independently authenticate retail firmware provenance; the NIDs are absent from the pinned public 3.20 catalogue. Names, prototypes and behavior are unverified. These import-resolution declarations throw through `NotImplemented_nid_no_patch` and implement no runtime functionality. + +| Name | NID | +| --- | --- | +| Unknown | `+aMuhoVidDY` | +| Unknown | `0cCtt7Uv6rU` | +| Unknown | `4yR2XRjuTRI` | +| Unknown | `54n5gNkHtlM` | +| Unknown | `B4OVXU6VY9o` | +| Unknown | `BkxO0e2+ueg` | +| Unknown | `Gm138-2DI6g` | +| Unknown | `HgaTom-g+VQ` | +| Unknown | `JKm18ddwAM8` | +| Unknown | `JNiFPWtH-Hk` | +| Unknown | `KEYeKen41pc` | +| Unknown | `PCliRwT6ueA` | +| Unknown | `PwJ4BO0uwR4` | +| Unknown | `QGbJTngpl80` | +| Unknown | `U2KAvj2rtSE` | +| Unknown | `V6DhvHJCGfM` | +| Unknown | `WBl0nAQLZjc` | +| Unknown | `YZjQyCXoYxk` | +| Unknown | `YfK56KsJN0M` | +| Unknown | `a8OI5hE-DUQ` | +| Unknown | `daA4FMfpA58` | +| Unknown | `eJ1gJsUhQW4` | +| Unknown | `fe1j0GOZ7-8` | +| Unknown | `flWi3MA9OVo` | +| Unknown | `fwS31KfUHoA` | +| Unknown | `jhZyUt+lyVc` | +| Unknown | `ldAEblBOOwk` | +| Unknown | `lyhL-aTxj98` | +| Unknown | `meMsH0c36rQ` | +| Unknown | `nP9mHqC8v4M` | +| Unknown | `nrDh9GesOyk` | +| Unknown | `ojGP5vur+qM` | +| Unknown | `ugei4b97OXE` | +| Unknown | `vQgD7uDMKaA` | +| Unknown | `vm9OVSS7E18` | +| Unknown | `wNSQ60gepNA` | +| Unknown | `wXXTksptCEo` | +| Unknown | `zQE2rxZdLy8` | + ### Unknown function info - [sceNpWebApiGetHttpStatusCode, sceNpWebApiReadData](../../../core/libs/prx/libSceNpWebApi/Export.cpp) - throw through `NotImplemented_nid_no_patch`; behaviour and the PS5 prototypes are unmeasured. The only source of the parameter lists is shadPS4's PS4-derived prototypes (GPLv2, used as a reference only), with no second reference; structure pointers are `void*` because no layout is known. @@ -9,34 +54,24 @@ | Name | NID | | --- | --- | -| `sceNpWebApiAbortHandle` | `WKcm4PeyJww` | -| `sceNpWebApiAddHttpRequestHeader` | `joRjtRXTFoc` | | `sceNpWebApiAddMultipartPart` | `19KgfJXgM+U` | -| `sceNpWebApiCheckTimeout` | `gVNNyxf-1Sg` | | `sceNpWebApiClearAllUnusedConnection` | `KQIkDGf80PQ` | | `sceNpWebApiClearUnusedConnection` | `f-pgaNSd1zc` | -| `sceNpWebApiCreateMultipartRequest` | `KBxgeNpoRIQ` | | `sceNpWebApiGetConnectionStats` | `UJ8H+7kVQUE` | | `sceNpWebApiGetErrorCode` | `2qSZ0DgwTsc` | -| `sceNpWebApiInitializeForPresence` | `FkuwsD64zoQ` | | `sceNpWebApiIntCreateCtxIndExtdPushEventFilter` | `c1pKoztonB8` | -| `sceNpWebApiIntCreateRequest` | `N2Jbx4tIaQ4` | | `sceNpWebApiIntCreateServicePushEventFilter` | `TZSep4xB4EY` | -| `sceNpWebApiIntInitialize` | `8Vjplhyyc44` | | `sceNpWebApiIntRegisterServicePushEventCallback` | `VjVukb2EWPc` | | `sceNpWebApiIntRegisterServicePushEventCallbackA` | `sfq23ZVHVEw` | | `sceNpWebApiRegisterExtdPushEventCallback` | `vrM02A5Gy1M` | -| `sceNpWebApiRegisterNotificationCallback` | `HVgWmGIOKdk` | | `sceNpWebApiSendMultipartRequest` | `KCItz6QkeGs` | | `sceNpWebApiSendMultipartRequest2` | `DsPOTEvSe7M` | -| `sceNpWebApiSendRequest2` | `KjNeZ-29ysQ` | -| `sceNpWebApiSetHandleTimeout` | `6g6q-g1i4XU` | | `sceNpWebApiSetMaxConnection` | `gRiilVCvfAI` | -| `sceNpWebApiSetMultipartContentType` | `i0dr6grIZyc` | -| `sceNpWebApiSetRequestTimeout` | `qWcbJkBj1Lg` | -| `sceNpWebApiUnregisterNotificationCallback` | `wjYEvo4xbcA` | -| `sceNpWebApiVshInitialize` | `uRsskUhAfnM` | +- [sceNpWebApiAbortHandle, sceNpWebApiAddHttpRequestHeader, sceNpWebApiCheckTimeout, sceNpWebApiCreateMultipartRequest, sceNpWebApiSendRequest2, sceNpWebApiSetHandleTimeout, sceNpWebApiSetMultipartContentType, sceNpWebApiSetRequestTimeout](../../../core/libs/prx/libSceNpWebApi/Export.cpp) - the timeout unit is unverified: [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/1d8004a22f/src/core/libraries/np/np_web_api/np_web_api_internal.cpp) logs both timeouts as ms but adds them to microsecond process time, as done here from a request's first send. Not checked on a console; prototypes are [Orbital](https://github.com/AlexAltea/orbital/blob/b321fcdbd7/tools/ida/db_types.json#L1665-L1696)'s, checks shadPS4's. Headers, multipart types and handle timeouts go unused, as nothing is sent. `sceNpWebApiCheckTimeout` aborts expired requests at most once per 1000 µs, then a send returns `NOT_SIGNED_IN`, not `ABORTED`. Multipart parts throw, so no multipart send succeeds. - [sceNpWebApiCreateServicePushEventFilter](../../../core/libs/prx/libSceNpWebApi/Export.cpp) (libSceNpWebApi, PS4) - a filter for a PSN service needs the signed-in user, and no user is signed in to PSN, so a valid call returns `SIGNED_IN_USER_NOT_FOUND` after the context and handle checks, as shadPS4 does with its network disabled. `sceNpWebApiDeleteServicePushEventFilter` therefore never finds a filter. +- [sceNpWebApiInitializeForPresence, sceNpWebApiVshInitialize and sceNpWebApiIntInitialize](../../../core/libs/prx/libSceNpWebApi/Export.cpp) (libSceNpWebApi) - create a library context like `sceNpWebApiInitialize`, as [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/0614ce324be092791b758d79f93d9f1ca5b10a81/src/core/libraries/np/np_web_api/np_web_api.cpp#L380-L647) does on the PS4: the 32-byte internal argument structure and its `structSize` check (`INVALID_ARGUMENT`) follow its [declaration](https://github.com/shadps4-emu/shadPS4/blob/0614ce324be092791b758d79f93d9f1ca5b10a81/src/core/libraries/np/np_web_api/np_web_api.h#L100-L106). The context type shadPS4 records and the internal name are not kept, because nothing reads them, as with `libSceNpWebApi2`. Not measured on a console +- [sceNpWebApiRegisterNotificationCallback and sceNpWebApiUnregisterNotificationCallback](../../../core/libs/prx/libSceNpWebApi/Export.cpp) (libSceNpWebApi) - check a null callback, then the library and user context, as [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/0614ce324be092791b758d79f93d9f1ca5b10a81/src/core/libraries/np/np_web_api/np_web_api_internal.cpp#L305-L346) does, and return 0. The callback is not kept, because no NP notification can arrive offline, so it would never be called. Not measured on a console +- [sceNpWebApiIntCreateRequest](../../../core/libs/prx/libSceNpWebApi/Export.cpp) (libSceNpWebApi) - creates a request like `sceNpWebApiCreateRequest`, as [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/0614ce324be092791b758d79f93d9f1ca5b10a81/src/core/libraries/np/np_web_api/np_web_api.cpp#L411-L432) does: a null group or path, or a method past PATCH, returns `INVALID_ARGUMENT` whatever the SDK version, then a content length without a type returns `INVALID_CONTENT_PARAMETER`. Its internal arguments are three pointers that shadPS4 accepts only when all are null, so a set field throws after the user context check. Not measured on a console - [sceNpWebApiCreateContext, sceNpWebApiDeleteContext, sceNpWebApiCreateRequest, sceNpWebApiDeleteRequest, sceNpWebApiAbortRequest, sceNpWebApiSendRequest](../../../core/libs/prx/libSceNpWebApi/Export.cpp) (libSceNpWebApi, PS4) - the online id is not looked up: as in [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/main/src/core/libraries/np/np_web_api/np_web_api_internal.cpp), a user context belongs to the initial user, so a library context holds at most one. With no user signed in to PSN, `sceNpWebApiSendRequest` returns `NOT_SIGNED_IN` unless the request is aborted. Id layouts and the delete, abort and not-found results match an offline PS4 Pro probe on firmware 10.71 (#9797); other checks follow shadPS4. Method 99 after DELETE gives `INVALID_ARGUMENT` (0x80552902) from a probe built at SDK 0x05050001; the 2.50 threshold is shadPS4's, not measured. `sceNpWebApiTerminate` also deletes user contexts and requests; shadPS4 stops after the first user context. - [sceNpWebApiRegisterPushEventCallback, sceNpWebApiUnregisterPushEventCallback, sceNpWebApiRegisterServicePushEventCallback, sceNpWebApiUnregisterServicePushEventCallback](../../../core/libs/prx/libSceNpWebApi/Export.cpp) (libSceNpWebApi, PS4) - registered callbacks are never called, since no push event arrives. A null function is rejected from SDK 1.00 and the filter must exist in the library context from SDK 2.50, as in shadPS4; this is not checked on a console. No service filter can be created, so from SDK 2.50 a service callback returns `SERVICE_PUSH_EVENT_FILTER_NOT_FOUND`. Callback ids come from the counter of handles and filters. diff --git a/docs/dev/debt/libSceNpWebApi2.md b/docs/dev/debt/libSceNpWebApi2.md index 4a122ad7a0..f6f1f467a9 100644 --- a/docs/dev/debt/libSceNpWebApi2.md +++ b/docs/dev/debt/libSceNpWebApi2.md @@ -16,3 +16,14 @@ - [Push handle lifecycle](../../../core/libs/prx/libSceNpWebApi2/Export.cpp): PS5 create/delete/abort signatures and invalid-context/invalid-handle errors are confirmed. Handles track ownership, timeout and abort state; deletion and context termination remove them. Network push operations and cancellation of active requests remain unimplemented. - [sceNpWebApi2GetMemoryPoolStats](../../../core/libs/prx/libSceNpWebApi2/Export.cpp): PS5 confirms the context/statistics arguments and 32-byte output. An invalid context returns `0x80553404` without changing output; a valid context with null output succeeds. Allocator accounting remains absent: peak and current usage still report zero instead of native pool allocations. - [sceNpWebApi2PushEventSetHandleTimeout](../../../core/libs/prx/libSceNpWebApi2/Export.cpp): PS5 confirms three 32-bit arguments, ownership validation and storing the entire timeout value without range checks. The stored timeout is not consumed because asynchronous push operations are unimplemented. + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceNpWebApi2/Export.cpp) - 4 entries observed in the 3.20 export inventory and present in the later 13.60-labelled inventory are import-resolution declarations only. The later inventory label does not authenticate a retail firmware version. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Data exports require separate layout and ownership analysis. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `4N85o28Ifbk` | +| `Unknown` | `A9IoYzANK3M` | +| `Unknown` | `lylvdXiq1UE` | +| `Unknown` | `qaMcX2+6ZiA` | diff --git a/docs/dev/debt/libSceOpusDec.md b/docs/dev/debt/libSceOpusDec.md index 18d5334b3d..900f43efef 100644 --- a/docs/dev/debt/libSceOpusDec.md +++ b/docs/dev/debt/libSceOpusDec.md @@ -1,5 +1,9 @@ # libSceOpusDec technical debt +### Additional callable exports + +- [sceOpusDecGetAjmContext](../../../core/libs/prx/libSceOpusDec/Export.cpp) hashes to `OyDFNZOLrp0`; the public 3.20 catalogue does not list it. Two version-labelled images contain function records `OyDFNZOLrp0#D#A` and `OyDFNZOLrp0#E#A`, respectively. Dynamic metadata maps those library IDs and module ID 0 to `libSceOpusDec`. Older module words: `0x08540001`, `0x03200004`; later: `0x13590001`, `0x13600007`. Their 15 and 30 function NIDs have sorted-LF SHA-256 values `f4a21bfa5759129658496cfc706b1aa43d45e5c38f04838e964b09dc97e37cbf` and `323309a804d747d76ac694770153c20644f7d30b210ca7eaaf6c15f949e05837`, using the [static ELF membership procedure](https://github.com/boykopovar/AnyPS5/pull/12367#issuecomment-6470603298). Labels do not authenticate retail provenance; the digests identify NID sets only. Independent verification requires matching images. The signature and behavior are unverified; this declaration throws. + ### Unknown function info - [sceOpusDecCancel, sceOpusDecCreate and sceOpusDecCtl](../../../core/libs/prx/libSceOpusDec/Export.cpp) (libSceOpusDec) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceOpusDec.c), but no credible prototypes were found. They are declared without parameters solely to resolve known imports; this is not an ABI claim. diff --git a/docs/dev/debt/libScePad.md b/docs/dev/debt/libScePad.md index 4a5921596c..a89fb25fe7 100644 --- a/docs/dev/debt/libScePad.md +++ b/docs/dev/debt/libScePad.md @@ -1,5 +1,25 @@ # libScePad technical debt +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libScePad/InventoryExports.cpp) - 13 entries present in both version-labelled images are import-resolution declarations only. Neither label independently authenticates retail firmware provenance. These NIDs are absent from the pinned public 3.20 catalogue. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Data exports require separate layout and ownership analysis. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `1YXygubV1Gc` | +| `Unknown` | `3LNwlXW4f54` | +| `Unknown` | `7xA+hFtvBCA` | +| `Unknown` | `KY0hSB+Uyfo` | +| `Unknown` | `Ql4q5ePNaw0` | +| `Unknown` | `UeUUvNOgXKU` | +| `Unknown` | `XFqNcPu1meI` | +| `Unknown` | `eqldkyw7GAo` | +| `Unknown` | `ickjfjk9okM` | +| `Unknown` | `qJgegDoE0g8` | +| `Unknown` | `r2S7Nuicg8s` | +| `Unknown` | `wMvV6XbeFd0` | +| `Unknown` | `ybhL4IoyGZA` | + ### Silent stubs - [scePadEnableExtensionPort](../../../core/libs/prx/libScePad/Export.cpp) returns success without changing extension-port state. The boolean argument is recovered; connected-device behavior is not modeled. @@ -14,13 +34,15 @@ - [scePadUnknown_n3kSX62fgNo](../../../core/libs/prx/libScePad/Export.cpp) (libScePad, NID `n3kSX62fgNo`) - the name is unknown, and the 0 returned after `scePadInit` is inferred, not measured. In the OS 10.01 system module the function takes no arguments, returns `0x80920005` before `scePadInit`, and otherwise sends a per-process value of 1 to ShellCore over Mbus, returning `0x809200ff` if that call fails and 0 if it succeeds, with or without an open handle. The #3177 probe measured `0x809200ff` in a process that is not a game; a game process is assumed to get 0. The ShellCore setting it changes is unknown and not modelled - [scePadSetAngularVelocityDeadbandState](../../../core/libs/prx/libScePad/src/PadState.cpp) (libScePad) - with the deadband on, each angular velocity axis whose magnitude is below 0.017453292 rad/s (1 degree per second) reads as 0, before the orientation is integrated; it starts off. Threshold, per-axis test and default follow [duaLib](https://github.com/WujekFoliarz/duaLib/blob/03bad1bea2a36561b520846776f2a07ced6773e0/src/source/duaLib.cpp#L44), which reimplements the PC `libScePad.dll`; the console's threshold is not measured, and the deadband is kept per port slot. One title (PPSA04354) disassembled for this entry calls it once (0xead26b), only when a change bit of its own is set, with a 32-bit value read through a pointer and 0 or 1 taken from the 0x4 bit of a flags value, and ignores the result. The call does not show the threshold or the default. - [PadQueueLegacyAudioHaptics, PadClearLegacyAudioHaptics](../../../core/libs/prx/libScePad/src/PadState.cpp) (libScePad) - PadQueueLegacyAudioHaptics and PadClearLegacyAudioHaptics route legacy audio haptics only to port 0; multi-port queueing is not modelled -- [scePadGetControllerInformation](../../../core/libs/prx/libScePad/Export.cpp) (libScePad) - scePadGetControllerInformation always reports connectedCount = 1 and connected = true; behaviour across multiple open controller handles is not measured on hardware +- [scePadGetControllerInformation](../../../core/libs/prx/libScePad/Export.cpp) (libScePad) - scePadGetControllerInformation reports connectedCount = 1 and connected = true on every port, except that port 0 reports its connection state under ANYPS5_PAD_PORT0_STATE=controller; behaviour across multiple open controller handles is not measured on hardware - [scePadGetExtControllerInformation](../../../core/libs/prx/libScePad/Export.cpp) (libScePad) - on a standard-port handle it returns `NOT_PERMITTED` (0x80920101) and leaves the buffer as it is. Halo CE Universal (PPSA99500) [measured](https://github.com/thelinkin3000/halo-ce-universal/blob/377459f9655971a2f59c09e192c5220042121e6f/port/ps5/probe/results/pad-probe-run2.txt#L2-L29) that answer on firmware 13.59 for two connected DualSenses opened by the title, in three runs, with its [probe](https://github.com/thelinkin3000/halo-ce-universal/blob/377459f9655971a2f59c09e192c5220042121e6f/port/ps5/probe/pad/main.c#L263-L268) zeroing the buffer first. The probe logged only bytes 28 to 47, which stayed zero, so whether the console writes any of the buffer is not known. The special port (type 2) still answers 0 with 0x2c zeroed bytes, which is not measured, and so are the order of the handle and null checks and the answer on a console that grants the permission. +- [scePadReadState and scePadRead for port 0 while it is withdrawn](../../../core/libs/prx/libScePad/src/PadState.cpp) (libScePad) - under ANYPS5_PAD_PORT0_STATE=controller a port 0 without a controller reads zeroed data (buttons, sticks, triggers and touch zero, orientation identity) with connected false, and scePadRead returns one entry. The shape follows [shadPS4's pad.cpp](https://github.com/shadps4-emu/shadPS4/blob/1d8004a22feb0d5cc58828bac066018e80b6d73f/src/core/libraries/pad/pad.cpp#L369-L374) at commit 1d8004a22feb0d5cc58828bac066018e80b6d73f. What the console returns for a removed controller (zeroed, neutral or an error code) and the connected_count it reports are not measured. - [scePadOpen and scePadOpenExt](../../../core/libs/prx/libScePad/Export.cpp) (libScePad) - the special port (type 2) opens a handle per user (`PAD_SPECIAL_HANDLE` + slot, 16 slots for the console's 16 accounts, a 17th user gets the unknown-user code 0x809b0081) that every pad call accepts: reads give the rest record (sticks 0x80, orientation w 1, acceleration y 1, `connected` false), information is zeroed, extended information has device class -1, setters succeed without effect. Not measured: the console's own handle values (fresh per open), a PS5, and the calls the PS4 Pro survey (firmware 10.71, no special controller) did not cover; it measured open, `ALREADY_OPENED`, `scePadGetHandle`, both reads, both informations, the five setters above, close, and that two logged-in users get independent handles. `scePadOpenExt` returns `DEVICE_NOT_CONNECTED` (0x80920007) for special ports, unmeasured; PPSA01317 skips a user on any negative result. `scePadOpenExt` throws for other port types - [scePadOpen, scePadGetHandle, scePadRead and scePadReadState for the remote control port](../../../core/libs/prx/libScePad/Export.cpp) (libScePad) - whether a console without a media remote opens the system user's remote control port (type 16), returns `DEVICE_NOT_CONNECTED` or fills other fields is not measured. The host has no remote, so the port opens its own handle (`PAD_REMOTE_HANDLE`) that reads one zeroed entry with no buttons and `connected` false; the other pad calls reject it with `INVALID_HANDLE`. SDL's PS5 video driver maps this port's buttons to keys, so a remote that read the DualSense turned Cross into Return (Raptor PPSA94002). - [scePadOpen](../../../core/libs/prx/libScePad/Export.cpp) (libScePad) - port types 3 and 4 throw: a payload process on a PS5 (firmware 13.60) let them past the type check, but it cannot open a port for its own logged-in user (0x809b0081), so what they open is unknown. The argument checks it did reach are followed: types 1, 5, 6, 255 and -1, and 16 for a user other than the system user, fail with `INVALID_ARG` before the user is looked at, user -1 with 0x809b0001 on types 0, 2, 3 and 4 and on index 1, and index 1 of a logged-in user with 0x809b0003; whether index 1 of types 3 and 4 fails the same way was not measured; the payload never tried type 16 with the system user (255), which opens the remote control port as below. Of 21 calls in ten titles checked, all pass index 0 and no param; 15 pass type 0, three type 2 (PPSA01494, PPSA30839, PPSA31162) and three a type from a register or field (PPSA18194, PPSA25286) - [scePadVrControllerReadState](../../../core/libs/prx/libScePad/Export.cpp) - the 104-byte output layout is recovered, including buttons, stick, triggers, touch fields, motion, connection state and timestamp. Touch-value semantics and kernel report production remain incomplete; the export still throws. - [scePadVrControllerReadCombinedState](../../../core/libs/prx/libScePad/Export.cpp) - the two handle arguments and 128-byte output are recovered; output field semantics remain incomplete. +- [scePadParseUniqueDataLeonardo and the DualShock 4 queries](../../../core/libs/prx/libScePad/Export.cpp) (libScePad) - like the other pad calls, they reject the handle opened on the remote port (type 16) with `INVALID_HANDLE` (see the remote control port entry), while firmware 13.42 checks the port type stored with each handle. The behaviour comes from firmware 13.42's libScePad.sprx, read from disassembly and compared by running the firmware functions natively on random handle tables, not measured on a console. The answers follow the firmware for the one DualSense (`054c:0ce6`) reported here: scePadGetMotionTimerUnit, scePadGetMotionSensorPosition and scePadGetSphereRadius return data only for DualShock 4 models (`05c4`, `0bb2`), scePadGetBluetoothAddress only for `03d5`, `05c4`, `0bb2` and `0c5e`, and scePadParseUniqueDataLeonardo only for the Access controller (`0e5f`). - [scePadSetVibrationMode](../../../core/libs/prx/libScePad/Export.cpp) (libScePad) - modes 1 to 3 and 5 are accepted and stored. On a PS5 (firmware 13.60) the call returns `0x80920005` before `scePadInit`, then rejects a mode of 0 or below with `INVALID_ARG` before it checks the handle, and returns `INVALID_HANDLE` for a bad handle with any higher mode; whether an open handle accepts modes above 3 was not measured, since the payload could not open a pad; 5 is accepted because PPSA25286 passes it on its open handle at start-up; the meanings of modes 3 and 5 are unknown (PPSA21480 calls it with 3 right after `scePadOpen` and aborts on failure; [SharpProspero](https://github.com/SvenGDK/SharpProspero/blob/main/src/SharpProspero/Interop/Pad/Pad.cs) names only 1 and 2). The stored mode has no other effect - [scePadIsRemoteController](../../../core/libs/prx/libScePad/Export.cpp) (libScePad) - the name hashes to NID `fCWdlnmB1Ks`; the signature `(int handle, bool* remote)` comes from PPSA16064, which zeroes a byte, passes its address after `scePadGetControllerInformation` and ignores the result. The error codes follow the other pad calls. Controllers are local devices, so the answer is always false - [scePadIsDS4Connected, scePadIsBlasterConnected and scePadIsMoveConnected](../../../core/libs/prx/libScePad/Export.cpp) (libScePad) - the `bool (int handle)` signatures are recovered; the library reports one DualSense to every title (see Touchpad resolution below), so no DualShock 4, Blaster or Move controller is ever behind a handle and each call answers false for any handle. The console's answer for an invalid handle is not measured diff --git a/docs/dev/debt/libScePlayGo.md b/docs/dev/debt/libScePlayGo.md index 6e44758ff9..2d42e4c1c5 100644 --- a/docs/dev/debt/libScePlayGo.md +++ b/docs/dev/debt/libScePlayGo.md @@ -2,16 +2,9 @@ ### Unknown function info -- [scePlayGoGetRequiredDisc, scePlayGoRequestOptionalChunk, scePlayGoSetInstallSpeed2](../../../core/libs/prx/libScePlayGo/Export.cpp) - names and NIDs follow the [13.60 export inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/e495d3cf24aea17cefda59decdfda9e3e4e3e5ff/data/firmware-13.60/libsceplaygo-8d02b7ecad.jsonl), with name/NID bindings recomputed by `tools/nid_names.py`. Signatures, return types and behavior are unknown; parameterless `int` declarations only resolve imports and do not establish the ABI. Each function throws through `NotImplemented_nid_no_patch`; no runtime functionality is implemented. - -| Name | NID | -| --- | --- | -| `scePlayGoGetRequiredDisc` | `SLoxcijCsK0` | -| `scePlayGoRequestOptionalChunk` | `qpX47CJNMj4` | -| `scePlayGoSetInstallSpeed2` | `6CokMGjaC3o` | - -- [scePlayGoRequestNextChunk, scePlayGoSnapshot](../../../core/libs/prx/libScePlayGo/Export.cpp) (libScePlayGo) - their names and NIDs are in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libScePlayGo.c), but no credible prototypes were found. They are declared without parameters solely to resolve known imports; this is not an ABI claim +- [scePlayGoSnapshot](../../../core/libs/prx/libScePlayGo/Export.cpp) (libScePlayGo) - throws and is declared without parameters. [pgo_stub](https://github.com/drakmor/pgo_stub/blob/c95dec777563/library.h#L130) and [rps5e](https://github.com/keklick1337/rps5e/blob/7028192c3246/crates/ps5hle/src/playgo.rs#L711-L715) give `(int handle, const char* filename)` but disagree on what it does: pgo_stub writes a summary file of its own format, rps5e writes nothing. What the library writes is not known +- [scePlayGoRequestOptionalChunk, scePlayGoGetRequiredDisc](../../../core/libs/prx/libScePlayGo/Export.cpp) (libScePlayGo) - the package's scenario count is not read: scenario (type 1) bits 0 to 4 are accepted for every package and bits from 5 up return `SCE_PLAYGO_ERROR_BAD_SCENARIO_CONFIGURATION`, and `scePlayGoGetSupportedOptionalChunk` and `scePlayGoGetOptionalChunk` report bits 0 to 4 for type 1 too. `scePlayGoGetRequiredDisc` always reports disc 0. Only `scePlayGoSetInstallSpeed2` checks initialization, and unlike both sources `scePlayGoInitialize` accepts a null or small buffer and a second call, and `scePlayGoTerminate` succeeds without it. These checks follow [pgo_stub](https://github.com/drakmor/pgo_stub/blob/c95dec777563/library.cpp#L559-L596) and [rps5e](https://github.com/keklick1337/rps5e/blob/7028192c3246/crates/ps5hle/src/playgo.rs#L313-L344), which may not be independent; none is measured - [scePlayGoSetLanguageMask](../../../core/libs/prx/libScePlayGo/Export.cpp) (libScePlayGo) - stores the mask that `scePlayGoGetLanguageMask` then reports, and returns `SCE_PLAYGO_ERROR_BAD_HANDLE` for another handle, as [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/8d50471b7dc141dd700b51276b8edd1f293bce26/src/core/libraries/playgo/playgo.cpp#L346-L359) does on the PS4. shadPS4 also returns `SCE_PLAYGO_ERROR_NOT_INITIALIZED` before `scePlayGoInitialize` and starts from the system language's mask; here the mask starts with every language and initialization is not tracked. Not measured on a PS5 - [libScePlayGo](../../../core/libs/prx/libScePlayGo/Export.cpp) - the chunk set comes from `playgo-chunkdefs.xml` (every listed chunk plus chunks 0 through the default chunk), otherwise from `sce_sys/playgo-chunk.dat`, whose `plgx` header is read as holding the chunk count as a 16-bit value at offset 0x0A and ids 0 to count - 1 are taken as valid. The field was identified on four dumps, where exactly that many 0x20-byte entries follow from offset 0x100 (RIDE 4 PPSA01599: 35, Persona 5 Royal PPSA05110: 25, LEGO Horizon Adventures PPSA14632 and Kena PPSA01802: 1); the rest of the format is not decoded and ids are assumed to be contiguous. Every listed chunk is reported as installed (`LOCAL_FAST`). Without either file, a package with `sce_sys/playgo-scenario.json` (PPSA01748, whose dump lists no chunks) accepts ids 0 to 999 as installed, and `scePlayGoGetChunkId` lists the same ids. A title that builds its set of installed chunks from that list skips any chunk it does not see. The console's chunk limit is not known here, so an id from 1000 up is answered like an unlisted id of a package with no `playgo-*` file: it throws unless `APS5_PLAYGO_UNLISTED_CHUNKS` answers it (`=absent` ends PPSA02630's id walk, which otherwise asks for every id until one is rejected and wraps the 16-bit id). A package with no `playgo-*` file in `sce_sys` (PPSA03001, PPSA03490 and PPSA01285 here) accepts chunk 0; querying any other id throws with a message naming the missing `playgo-chunk.dat` and `playgo-scenario.json`, since the incomplete dump cannot establish whether that id exists; `APS5_PLAYGO_UNLISTED_CHUNKS=installed` answers every such id as installed (`LOCAL_FAST`, which PPSA15388 needs to load its saves) and `=absent` answers `SCE_PLAYGO_ERROR_BAD_CHUNK_ID` (which ends PPSA03001's id walk), as the user's choice for that dump. A `sce_sys` that holds other `playgo-*` files (`playgo-ficm.dat`, `playgo-hash-table.dat`) without `playgo-chunk.dat` or `playgo-scenario.json`, or a `playgo-chunk.dat` without a `plgx` header and a nonzero count, throws naming the file, because no such dump is known. These answers are unverified on a console, as is the console's answer for an id outside a package's chunk table. -- [libScePlayGo](../../../core/libs/prx/libScePlayGo/Export.cpp) - `scePlayGoGetSupportedOptionalChunk` and `scePlayGoGetOptionalChunk` report every bit set for `type` 0, 1 or 2, i.e. every optional chunk (language pack) supported and installed, like `scePlayGoGetLanguageMask`. Native requests confirm types 0 through 2 and an eight-byte result; their meanings and bit layout are still determined by the external service, not this module; PPSA01748 calls both with type 0 and hides every text language listed in `playgo-scenario.json` `chunkSupportedLanguages` when the bitmask is 0. The console's answer for a package that ships no optional chunks is unverified. -- [scePlayGoPrefetchOptionalChunk](../../../core/libs/prx/libScePlayGo/Export.cpp) (libScePlayGo) - checks only the handle and returns 0, ignoring `type` and the option. Unlike `scePlayGoGetOptionalChunk` and `scePlayGoGetSupportedOptionalChunk`, it rejects neither a null option nor a type above 2. With every optional chunk reported installed, there is nothing to prefetch. Borderlands 4 (PPSA01494), MXGP 26 (PPSA30839) and Super Meat Boy 3D (PPSA31162) each call it from two wrappers, one with type 0 and one with type 1, passing a stack copy of an eight-byte option and returning the result to their caller (read statically from each `eboot.bin`). The console's answer for a null option or another type is unverified. +- [libScePlayGo](../../../core/libs/prx/libScePlayGo/Export.cpp) - `scePlayGoGetSupportedOptionalChunk` and `scePlayGoGetOptionalChunk` report every bit set for `type` 0 or 2 and bits 0 to 4 for `type` 1, i.e. every optional chunk (type 0 languages, type 1 scenarios) supported and installed, like `scePlayGoGetLanguageMask`. Native requests confirm types 0 through 2 and an eight-byte result; their meanings and bit layout are still determined by the external service, not this module; PPSA01748 calls both with type 0 and hides every text language listed in `playgo-scenario.json` `chunkSupportedLanguages` when the bitmask is 0. The console's answer for a package that ships no optional chunks is unverified. +- [scePlayGoPrefetchOptionalChunk](../../../core/libs/prx/libScePlayGo/Export.cpp) (libScePlayGo) - checks only the handle and returns 0, ignoring `type` and the option. Unlike `scePlayGoGetOptionalChunk` and `scePlayGoGetSupportedOptionalChunk`, it rejects neither a null option nor a type above 2. With every optional chunk reported installed, there is nothing to prefetch. Borderlands 4 (PPSA01494), MXGP 26 (PPSA30839) and Super Meat Boy 3D (PPSA31162) each call it from two wrappers, one with type 0 and one with type 1, passing a stack copy of an eight-byte option and returning the result to their caller (read statically from each `eboot.bin`). pgo_stub and rps5e reject a null option, a type above 2 and scenario bits from 5 up here as in `scePlayGoRequestOptionalChunk`; that is not applied, and the console's answer is unverified. diff --git a/docs/dev/debt/libScePlayReady.md b/docs/dev/debt/libScePlayReady.md index c7677e9529..ef11188820 100644 --- a/docs/dev/debt/libScePlayReady.md +++ b/docs/dev/debt/libScePlayReady.md @@ -2,4 +2,7 @@ ### Unknown function info -- [sceBufferAlloc, sceBufferDup, sceBufferFree, sceBufferInit, sceBufferRealloc, scePlayReadyApiInitializeInitParams, scePlayReadyApiIsStarted, scePlayReadyApiStart, scePlayReadyApiStop, scePlayReadyApiVersion, scePlayReadyApiVersionString, scePlayReadyBufferFree, scePlayReadyBufferInit, scePlayReadyBufferMalloc, scePlayReadyBufferRealloc, scePlayReadyContentGetProperty, scePlayReadyContentSetProperty, scePlayReadyDomainCertEnumFini, scePlayReadyDomainCertEnumInit, scePlayReadyDomainCertEnumNext, scePlayReadyDomainCertFind, scePlayReadyDomainJoinGenerateChallenge, scePlayReadyDomainJoinProcessResponse, scePlayReadyDomainLeaveGenerateChallenge, scePlayReadyDomainLeaveProcessResponse, scePlayReadyEnvelopeClose, scePlayReadyEnvelopeGetSize, scePlayReadyEnvelopeInitializeRead, scePlayReadyEnvelopeOpen, scePlayReadyEnvelopeRead, scePlayReadyEnvelopeSeek, scePlayReadyFinalize, scePlayReadyFreeDecryptContext, scePlayReadyInitialize, scePlayReadyInitializeInitParams, scePlayReadyLicenseAcqGenerateAck, scePlayReadyLicenseAcqGenerateChallenge, scePlayReadyLicenseAcqGetAdditionalResponseData, scePlayReadyLicenseAcqProcessAckResponse, scePlayReadyLicenseAcqProcessResponse, scePlayReadyMemAlloc, scePlayReadyMemFree, scePlayReadyMemRealloc, scePlayReadyNewDecryptContext, scePlayReadyReaderBind, scePlayReadyReaderCommit, scePlayReadyReaderDecrypt, scePlayReadyReset and scePlayReadyStoreCleanup](../../../core/libs/prx/libScePlayReady/Export.cpp) (libScePlayReady) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libScePlayReady.c), but no credible prototypes were found. The declarations have no parameters solely to resolve known imports; this is not an ABI claim and callers must not call them until signatures are verified +- [sceBufferAlloc, sceBufferDup, sceBufferFree, sceBufferRealloc, scePlayReadyApiIsStarted, scePlayReadyApiStart, scePlayReadyApiStop, scePlayReadyBufferFree, scePlayReadyBufferMalloc, scePlayReadyBufferRealloc, scePlayReadyContentGetProperty, scePlayReadyContentSetProperty, scePlayReadyDomainCertEnumFini, scePlayReadyDomainCertEnumInit and scePlayReadyDomainCertEnumNext](../../../core/libs/prx/libScePlayReady/Export.cpp) (libScePlayReady) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libScePlayReady.c), but no credible prototypes were found. The declarations have no parameters solely to resolve known imports; this is not an ABI claim and callers must not call them until signatures are verified +- [scePlayReadyDomainCertFind, scePlayReadyDomainJoinGenerateChallenge, scePlayReadyDomainJoinProcessResponse, scePlayReadyDomainLeaveGenerateChallenge, scePlayReadyDomainLeaveProcessResponse, scePlayReadyEnvelopeClose, scePlayReadyEnvelopeGetSize, scePlayReadyEnvelopeInitializeRead, scePlayReadyEnvelopeOpen, scePlayReadyEnvelopeRead, scePlayReadyEnvelopeSeek, scePlayReadyFinalize, scePlayReadyFreeDecryptContext, scePlayReadyInitialize and scePlayReadyLicenseAcqGenerateAck](../../../core/libs/prx/libScePlayReady/Export.cpp) (libScePlayReady) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libScePlayReady.c), but no credible prototypes were found. The declarations have no parameters solely to resolve known imports; this is not an ABI claim and callers must not call them until signatures are verified +- [scePlayReadyLicenseAcqGenerateChallenge, scePlayReadyLicenseAcqGetAdditionalResponseData, scePlayReadyLicenseAcqProcessAckResponse, scePlayReadyLicenseAcqProcessResponse, scePlayReadyMemAlloc, scePlayReadyMemFree, scePlayReadyMemRealloc, scePlayReadyNewDecryptContext, scePlayReadyReaderBind, scePlayReadyReaderCommit, scePlayReadyReaderDecrypt, scePlayReadyReset and scePlayReadyStoreCleanup](../../../core/libs/prx/libScePlayReady/Export.cpp) (libScePlayReady) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libScePlayReady.c), but no credible prototypes were found. The declarations have no parameters solely to resolve known imports; this is not an ABI claim and callers must not call them until signatures are verified +- [sceBufferInit, scePlayReadyBufferInit, scePlayReadyApiInitializeInitParams, scePlayReadyInitializeInitParams, scePlayReadyApiVersion and scePlayReadyApiVersionString](../../../core/libs/prx/libScePlayReady/Export.cpp) (libScePlayReady) - prototypes and behaviour follow firmware 13.42's libScePlayReady.sprx, read from disassembly and run natively, not measured on a console. The buffer calls clear 0x18 bytes and the init-params calls clear 0x138 bytes and then write 0x50524459 and 1 as the first two 32-bit words; what the fields mean is unknown, so the calls take `void*`. The version string is one static 32-byte buffer that every call rewrites, as in the firmware, so a string returned earlier changes and concurrent calls race diff --git a/docs/dev/debt/libScePlayReady4.md b/docs/dev/debt/libScePlayReady4.md index 7506cd9262..8e36a19cf7 100644 --- a/docs/dev/debt/libScePlayReady4.md +++ b/docs/dev/debt/libScePlayReady4.md @@ -8,3 +8,23 @@ ### Inventory exports declared elsewhere The PS5 3.20 export table for this module also contains 49 names already declared under libScePlayReady, libScePlayReady2 in this tree; the duplicate-export rule keeps each name in a single library, so they are omitted here. They resolve through the sibling declarations. + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libScePlayReady4/Export.cpp) - 9 entries present in both version-labelled images are import-resolution declarations only. Neither label independently authenticates retail firmware provenance. Eight NIDs also appear in the later labelled `libScePlayReady4L` image; resolution between providers requires separate verification. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. + +| Name | NID | +| --- | --- | +| `Unknown` | `2OZeMccOeho` | +| `Unknown` | `3fo8fAvHn9A` | +| `Unknown` | `HNB-eWVwwng` | +| `Unknown` | `LL9r9r4cCdQ` | +| `Unknown` | `OqSN3eUfHMY` | +| `Unknown` | `XawoudE54JE` | +| `Unknown` | `asAQ9li6+mo` | +| `Unknown` | `o2H2P7xoLec` | +| `Unknown` | `sK0jAAnbbiI` | + +### Older callable exports + +- [Older callable exports](../../../core/libs/prx/libScePlayReady4/Export.cpp) - Thirty-eight additional older callable NIDs have unidentified names and are declared as throwing placeholders. Their prototypes and behavior are unverified. These NIDs do not appear in the later version-labelled module inventory; no cross-version identity or functional behavior is claimed. A separately shared initializer NID is excluded because it is already provided by another module and its structure differs across versions. diff --git a/docs/dev/debt/libScePlayReady4L.md b/docs/dev/debt/libScePlayReady4L.md new file mode 100644 index 0000000000..81e37c07b4 --- /dev/null +++ b/docs/dev/debt/libScePlayReady4L.md @@ -0,0 +1,6 @@ +# libScePlayReady4L technical debt + +### Unknown function info + +- [8 exports (8 without a known name, bound by NID)](../../../core/libs/prx/libScePlayReady4L/Export.cpp) (libScePlayReady4L) - the function exports of `libScePlayReady4L.sprx` that no other library defines from the firmware 13.60 export table, names from aerolib.csv only where `tools/nid_names.py` `compute_nid` reproduces the NID. Signatures, parameter layouts and behaviour are unknown; every export throws through `NotImplemented_nid_no_patch` +- [88 shared exports](../../../core/libs/prx/libScePlayReady4L/Export.cpp) (libScePlayReady4L) - the other 88 function exports of `libScePlayReady4L.sprx` have the NIDs of exports already in libScePlayReady, libScePlayReady2, libScePlayReady4, so they are not defined again here diff --git a/docs/dev/debt/libScePngParser.md b/docs/dev/debt/libScePngParser.md new file mode 100644 index 0000000000..4b2066453a --- /dev/null +++ b/docs/dev/debt/libScePngParser.md @@ -0,0 +1,5 @@ +# libScePngParser technical debt + +### Callable exports + +- [Callable exports](../../../core/libs/prx/libScePngParser/Export.cpp) - Seven 3.20 callable NIDs are import-resolution declarations only. One NID also appears in the 13.60-labelled inventory; other NIDs differ across versions. Their signatures and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. No runtime functionality is implemented. Data exports require separate layout and ownership analysis. diff --git a/docs/dev/debt/libSceRazorCpu.md b/docs/dev/debt/libSceRazorCpu.md index fc65cf2871..3027e125da 100644 --- a/docs/dev/debt/libSceRazorCpu.md +++ b/docs/dev/debt/libSceRazorCpu.md @@ -12,6 +12,8 @@ | `sceRazorCpuWriteBookmark` | 2 | The other eleven are imported by none of them: `sceRazorCpuIsCapturing`, `sceRazorCpuNamedSync`, `sceRazorCpuDisableFiberUserMarkers`, `sceRazorCpuInitDataTags`, `sceRazorCpuShutdownDataTags`, `sceRazorCpuTagArray`, `sceRazorCpuTagBuffer`, `sceRazorCpuResizeTaggedBuffer`, `sceRazorCpuUnTagBuffer`, `sceRazorCpuBeginLogicalFileAccess` and `sceRazorCpuEndLogicalFileAccess`. +- [sceRazorCpuFiberLogNameChange, sceRazorCpuFiberSwitch, sceRazorCpuGetDataTagStorageSize, sceRazorCpuGpuMarkerSync, sceRazorCpuInitializeGpuMarkerContext, sceRazorCpuSetPushMarkerCallback, sceRazorCpuSetPushMarkerStaticCallback, sceRazorCpuSetPopMarkerCallback, sceRazorCpuStartCaptureInternal, sceRazorCpuStopCaptureInternal, sceRazorCpuWorkloadSubmit, sceRazorCpuWorkloadRunBegin, sceRazorCpuWorkloadRunEnd](../../../core/libs/prx/libSceRazorCpu/Export.cpp) (libSceRazorCpu) - give the answers firmware 13.42's libSceRazorCpu.sprx gives while the profiler is not initialized, read from disassembly and not measured on a console, and record nothing: the three marker callbacks are discarded, start and stop capture always return 0x80580000, `sceRazorCpuGetDataTagStorageSize` returns 0, and the rest return 0 (`sceRazorCpuInitializeGpuMarkerContext` returns 22 for a null context or one whose first byte is not 1). Once initialized, the console sizes a tag table at 96 bytes per tag and calls the marker callbacks, and the GPU marker context is used; none of that happens here + ### Unknown function info @@ -27,7 +29,6 @@ The other eleven are imported by none of them: `sceRazorCpuIsCapturing`, `sceRaz | `sceRazorCpuUserSignalPostEx` | `cKl+d8u8mbk` | | `sceRazorCpuUserSignalWaitBeginEx` | `lC8-7cVnkHA` | -- [sceRazorCpuFiberLogNameChange, sceRazorCpuFiberSwitch, sceRazorCpuGpuMarkerSync, sceRazorCpuInitializeGpuMarkerContext, sceRazorCpuInitializeInternal, sceRazorCpuSetPopMarkerCallback](../../../core/libs/prx/libSceRazorCpu/Export.cpp) (libSceRazorCpu) - the list is the intersection of the export table of the console's [libSceRazorCpu](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceRazorCpu.c) (function symbols only), the pinned [aerolib names](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) and the functions not yet defined anywhere in the repo. No credible prototypes were found; they are declared without parameters solely to resolve known imports, not as an ABI claim, and callers must not call them until signatures are verified. -- [sceRazorCpuSetPushMarkerCallback, sceRazorCpuSetPushMarkerStaticCallback, sceRazorCpuStartCaptureInternal, sceRazorCpuStopCaptureInternal, sceRazorCpuWorkloadRunBegin, sceRazorCpuWorkloadRunEnd, sceRazorCpuWorkloadSubmit](../../../core/libs/prx/libSceRazorCpu/Export.cpp) (libSceRazorCpu) - the list is the intersection of the export table of the console's [libSceRazorCpu](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceRazorCpu.c) (function symbols only), the pinned [aerolib names](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) and the functions not yet defined anywhere in the repo. No credible prototypes were found; they are declared without parameters solely to resolve known imports, not as an ABI claim, and callers must not call them until signatures are verified. +- [sceRazorCpuInitializeInternal](../../../core/libs/prx/libSceRazorCpu/Export.cpp) (libSceRazorCpu) - throws: in firmware 13.42 it is the only call that sets the profiler's initialized flag, after it creates the capture storage, a mutex and a registered callback, and the capture paths that flag enables are not implemented. Its signature is unknown - [sceRazorCpuJobManagerDispatch, sceRazorCpuJobManagerJob and sceRazorCpuJobManagerSequence](../../../core/libs/prx/libSceRazorCpu/Export.cpp): argument positions and serialized widths are recovered from machine instructions. Dispatch takes seven arguments, including two 64-bit payloads whose upper 16 bits are replaced by the count fields. The payloads are not dereferenced, so their original pointer-versus-integer types and the semantic names of the event identifiers remain unresolved. Job and Sequence serialize 16-bit identifiers and an event selector; their source enum names are unavailable. -- [sceRazorCpuGetDataTagStorageSize](../../../core/libs/prx/libSceRazorCpu/Export.cpp) (libSceRazorCpu) - throws: [SharpProspero](https://github.com/SvenGDK/SharpProspero/blob/5dfdb4b0b166e83dc9ae275001afb695f12c7174/src/SharpProspero/Interop/Debug/RazorCpu.cs#L142-L144) documents it as the byte size a tag table needs for a count of entries, but not the size of an entry +- [sceRazorCpuFiberLogNameChange, sceRazorCpuFiberSwitch, sceRazorCpuGpuMarkerSync, sceRazorCpuStartCaptureInternal, sceRazorCpuStopCaptureInternal, sceRazorCpuWorkloadSubmit, sceRazorCpuWorkloadRunBegin, sceRazorCpuWorkloadRunEnd](../../../core/libs/prx/libSceRazorCpu/Export.cpp) (libSceRazorCpu) - do not read their arguments while the profiler is not initialized, so their signatures (including that of `sceRazorCpuGpuMarkerSync`) are unknown and they are declared without parameters diff --git a/docs/dev/debt/libSceRegMgr.md b/docs/dev/debt/libSceRegMgr.md index 86c8e2a9a3..05d1010c76 100644 --- a/docs/dev/debt/libSceRegMgr.md +++ b/docs/dev/debt/libSceRegMgr.md @@ -1,5 +1,20 @@ # libSceRegMgr technical debt +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceRegMgr/InventoryExports.cpp) - 8 entries present in both version-labelled images are import-resolution declarations only. Neither label independently authenticates retail firmware provenance. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Data exports require separate layout and ownership analysis. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `JfNNpUQdhQw` | +| `Unknown` | `UuGXdpQj1Aw` | +| `Unknown` | `YtmvqKL9PEo` | +| `Unknown` | `csy-cEETOKg` | +| `Unknown` | `iHi1Omn25M4` | +| `Unknown` | `wpJW0oIM6rg` | +| `Unknown` | `x0YJQilTJDo` | +| `Unknown` | `x9WN+tFTY34` | + ### Functional - [Registry store](../../../core/libs/prx/libSceRegMgr/Export.cpp) (libSceRegMgr) - entries are queried through an in-memory process-local store without persistence. Callable prototypes for `sceRegMgrGetInt`, `sceRegMgrGetStr`, and `sceRegMgrGetBin` derive from [regmgr.h](https://github.com/ps5-payload-dev/regdump/blob/883524cc48c8497267ba7fc94ff0ac58880c4227/regmgr.h#L3713-L3729). Implemented getters return error codes for invalid parameters (`0x80820001`), missing keys (`0x80820002`), buffer sizing (`0x80820004`), and type mismatches (`0x80820006`) as unverified host implementation assumptions, as the cited regmgr.h does not establish error codes or validation behavior. Queries with non-positive keys `0` and `-1` take the missing-key path without key-range validation, pinning the unverified host assumption that non-positive keys are not rejected as invalid parameters. Setters (`sceRegMgrSetInt`, `sceRegMgrSetStr`, `sceRegMgrSetBin`, `sceRegMgrSetbin`), reset (`sceRegMgrResetVal`), and zero-length getter paths remain unimplemented throwing `NotImplemented_nid_no_patch` until callable contracts and error codes are supported by evidence. diff --git a/docs/dev/debt/libSceRemoteplay.md b/docs/dev/debt/libSceRemoteplay.md index 9217543a98..084ffa7ca9 100644 --- a/docs/dev/debt/libSceRemoteplay.md +++ b/docs/dev/debt/libSceRemoteplay.md @@ -1,5 +1,10 @@ # libSceRemoteplay technical debt +### Additional callable exports + +- [Remoteplay export `HV7jZe1frbM`](../../../core/libs/prx/libSceRemoteplay/Export.cpp) is a function record with qualifier `D#A` in older and later version-labelled modules; both map library ID 3 and module ID 0 to `libSceRemoteplay`. Older module words: `0x08540001`, `0x03200004`; later: `0x13590001`, `0x13600007`. The older module contains 44 function NIDs; sorted-LF SHA-256: `dbfa653ec4819a116d5271c2db9a177acb6dfefc0915322b10ef21611fbe0844`, using the [static ELF membership procedure](https://github.com/boykopovar/AnyPS5/pull/12367#issuecomment-6470603298). Version labels do not authenticate retail provenance; the digest identifies the NID set only. Independent verification requires a matching image. The name, signature and behavior are unverified; this declaration throws. + + ### Silent stubs - [sceRemoteplayGetConnectionStatus](../../../core/libs/prx/libSceRemoteplay/Export.cpp) (libSceRemoteplay) - reports `REMOTEPLAY_CONNECTION_STATUS_DISCONNECT` (0) for any user ID: on the console the value comes from the session service, and the wrapper retries once through another internal query when that answers `0x80020003`; this tree has no session, so the value and the retry path are unmodelled @@ -13,6 +18,7 @@ ### Unknown function info - [libSceRemoteplay additional exports](../../../core/libs/prx/libSceRemoteplay/Export.cpp) - these name/NID pairs are present in the 13.60 export inventory. Parameter lists, return types and behavior are unverified. Parameterless `int` declarations are import-resolution placeholders, not verified ABI prototypes; every entry throws through `NotImplemented_nid_no_patch`. No runtime functionality is implemented. +- [`sceRemoteplayDisableInputDevice` and `sceRemoteplayEnableInputDevice`](../../../core/libs/prx/libSceRemoteplay/Export.cpp) (libSceRemoteplay) - parameter lists, return types and behaviour are unverified, so every entry throws through `NotImplemented_nid_no_patch`; the parameterless `int` declarations only resolve imports. The names and NIDs come from the [PS5 13.60 export inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/226383a7fa4b1275d6cebf61eb1c1e7ca7b58bcb/data/firmware-13.60/libsceremoteplay-0c70684750.jsonl), and the pinned [module map](https://github.com/boykopovar/ps5-nid-map/blob/cc1d586fddab576a520f226da6b2632b031e6d09/data/Modules/libSceRemoteplay.inc) assigns them to `libSceRemoteplay`. | Name | NID | | --- | --- | diff --git a/docs/dev/debt/libSceRudp.md b/docs/dev/debt/libSceRudp.md index 0b61876c81..21ac9a84ef 100644 --- a/docs/dev/debt/libSceRudp.md +++ b/docs/dev/debt/libSceRudp.md @@ -15,5 +15,5 @@ - [sceRudpPollCreate, sceRudpPollControl, sceRudpPollWait, sceRudpPollDestroy](../../../core/libs/prx/libSceRudp/Export.cpp) - console hardware behavior and removal of the last entry during an existing wait remain unverified. A [firmware 13.42 report](https://github.com/boykopovar/AnyPS5/pull/10954#issuecomment-6398457761) executes the actual module under emulation with kernel/libc imports stubbed and condition waits scripted, not on console hardware: an empty poll waits for its remaining timeout, including after spurious wakes, and leaves event output untouched. This agrees with the retained wait behavior here and conflicts with the immediate empty return in [Vita3K](https://github.com/AndnixSH/Vita3K-PS-Vita-OS-Fork/blob/c86ac732bc811057e690bed280c5076bdf95385e/vita3k/modules/SceRudp/SceLibRudp.cpp). The argument checks, control operations and 8-byte event layout retain their existing sources; the firmware report has not been independently reproduced here. - [sceRudpPollCancel](../../../core/libs/prx/libSceRudp/Export.cpp) (libSceRudp) - unmeasured: a wait that starts while a cancel is draining. Here the drain waits only for the waits registered when it started; a later wait is neither cancelled nor counted. The rest is measured on a retail PS5 (firmware 13.60) through the real `libSceRudp.sprx` ([@HabibUrRehmanBhattii](https://github.com/boykopovar/AnyPS5/pull/11294#issuecomment-6434977474)), matching @BunnyFl's [13.42 library run](https://github.com/boykopovar/AnyPS5/pull/10954#issuecomment-6399054346): `int sceRudpPollCancel(int pollId)` returns `0x80770001` before `sceRudpInit`, `0x80770004` for a negative id and `0x8077001F` for an unknown one. With no waiter, one cancellation is kept per poll and the next `sceRudpPollWait`, even with a zero timeout, returns `0x80770014` at once. With waiters, all return `0x80770014`, the call returns 0 after they leave, and nothing stays pending. - [sceRudpPollDestroy and sceRudpEnd](../../../core/libs/prx/libSceRudp/Export.cpp) - draining remains incomplete. The [detailed firmware 13.42 report](https://github.com/boykopovar/AnyPS5/pull/10954#issuecomment-6399054346) executes the module with emulated/stubbed imports. In the scripted two-waiter Destroy case both waiters return `0x80770014`; Destroy drains them before returning, then destroys the condition variable. A later wait on that destroyed ID returns `0x8077001F`. End similarly drains its active waiter with `0x80770014`; subsequent Wait/Cancel calls return `0x80770001`. Here Destroy/End return without draining and wake existing waiters with `0x8077001F`/`0x80770001`. Real-kernel wake/timeout races, simultaneous control calls, End/re-init overlap and extreme timeout boundaries remain untested; the report is not a console hardware measurement or an independent reproduction here. -- [sceRudpAccept, sceRudpFlush, sceRudpGetLocalInfo and sceRudpListen](../../../core/libs/prx/libSceRudp/Export.cpp) - remain throwing placeholders. Their names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceRudp.c); their parameterless declarations solely resolve known imports and do not establish the ABI. -- [sceRudpGetContextBufferStatus](../../../core/libs/prx/libSceRudp/Export.cpp) has an unknown signature and behaviour. The parameterless `int` declaration is an import-resolution placeholder, not a confirmed ABI signature, and every call throws through `NotImplemented_nid_no_patch`. Only its name and NID `KvNtKQLDgVk` are established by the [13.60 export inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/bfec40deb4c47a17d7603ee2bc79aa6862c0c56b/data/firmware-13.60/libscerudp-733f5190bf.jsonl); not measured on a console. +- [sceRudpAccept, sceRudpGetLocalInfo and sceRudpListen](../../../core/libs/prx/libSceRudp/Export.cpp) - remain throwing placeholders. Their names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceRudp.c); their parameterless declarations solely resolve known imports and do not establish the ABI. +- [sceRudpFlush, sceRudpGetRemoteInfo and sceRudpGetContextBufferStatus](../../../core/libs/prx/libSceRudp/Export.cpp) (libSceRudp) - follow @BunnyFl's [firmware 13.42 run](https://github.com/boykopovar/AnyPS5/issues/13682#issuecomment-6537745577) of the real exports under an emulator with imports stubbed, not a console: `(ctxId)`, `(ctxId, addr, addrLen, vport)` and `(ctxId, void* out, size_t size)`. After the initialization check a negative id returns `INVALID_ARGUMENT`, as do a null output or a size outside 1 to 16 for the buffer status, then an unknown or terminated id `INVALID_CONTEXT_ID`. No context here ever connects, so Flush and GetRemoteInfo then return `NOT_ACCEPTABLE` (0x80770011), as the run gave for created, bound and listening contexts, and the buffer status writes `size` zero bytes and returns 0, as it did for every context state run. The connected states, where the run gave 0 for GetRemoteInfo in states 4 and 5 and for Flush in state 4, are not reachable diff --git a/docs/dev/debt/libSceSaveData.md b/docs/dev/debt/libSceSaveData.md index 67e0b2ff8c..453b8375a9 100644 --- a/docs/dev/debt/libSceSaveData.md +++ b/docs/dev/debt/libSceSaveData.md @@ -3,3 +3,24 @@ ### Functional - [libSceSaveData](../../../core/libs/prx/libSceSaveData/CMakeLists.txt) is built from the libSceSaveData.native sources, so a title that imports save data from `libSceSaveData`, as PS4 titles do, gets the same functions. The separate implementation it had before kept save-data memory in `_sd/sce_sdmemory//memory.dat` and mount aliases in `_sd/_aliases`; neither is read, so memory saved through that library is not found + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceSaveData/InventoryExports.cpp) - 14 entries present in both version-labelled images are import-resolution declarations only. None is listed in the pinned public 3.20 catalogue for this library. Neither label independently authenticates retail firmware provenance. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Data exports require separate layout and ownership analysis. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `0TAVrO-LgPI` | +| `Unknown` | `35cI-Z0nz68` | +| `Unknown` | `AuTE0gFxZCI` | +| `Unknown` | `IE+HJN8+Jdg` | +| `Unknown` | `IGpkv-UOup0` | +| `Unknown` | `NxxouhCA12c` | +| `Unknown` | `QaI8L6NzmJU` | +| `Unknown` | `VM8qEhWh-A4` | +| `Unknown` | `apvJPjG+6-Q` | +| `Unknown` | `cbD93i6sy9E` | +| `Unknown` | `fIu-ckf3n-o` | +| `Unknown` | `g1roz3Ux+3I` | +| `Unknown` | `q8KxzjSpPVw` | +| `Unknown` | `yBM2vzabhEA` | diff --git a/docs/dev/debt/libSceSaveData.native.md b/docs/dev/debt/libSceSaveData.native.md index 326cc2a2d0..c0256b7758 100644 --- a/docs/dev/debt/libSceSaveData.native.md +++ b/docs/dev/debt/libSceSaveData.native.md @@ -2,6 +2,8 @@ ### Silent stubs +- [sceSaveDataMount3](../../../core/libs/prx/libSceSaveData.native/Export.cpp): host filesystem failures and a failed block-count sidecar replacement return the existing INTERNAL error (0x809F000B), following the host-I/O policy used by other save operations. The corresponding PS5 error mapping for each host failure is not confirmed; directory creation and sidecar replacement must finish before exposing a mount. + - [sceSaveDataAbort, sceSaveDataClearProgress](../../../core/libs/prx/libSceSaveData.native/Export.cpp) (libSceSaveData.native) return `SAVE_DATA_OK` after initialization without cancelling operations or clearing any progress. The current host operations run synchronously and no backup progress is tracked; `sceSaveDataClearProgress` does not reset `sceSaveDataGetConvertProgress`. Their console signatures, errors and behavior are unverified. - [sceSaveDataPrepare, sceSaveDataCommit](../../../core/libs/prx/libSceSaveData.native/Export.cpp) (libSceSaveData.native) return success without looking at their arguments; what preparing and committing a mounted save do on a console is unknown. The same six titles call both; this counts tests of the result in the three instructions after each call. `sceSaveDataPrepare` has 11 call sites: PPSA01494, PPSA30839 and PPSA31162 test none of them there, PPSA03984 takes an error path when it is negative, PPSA34502 checks it at one of two sites and PPSA36591 at two of four. `sceSaveDataCommit` has 14: PPSA01494 and PPSA30839 test none, PPSA03984 and PPSA31162 check its sign, PPSA34502 checks it at all five sites and PPSA36591 at two of four. A failure code from either would change the save flow of the titles that check it, while the stubs keep all six on the success path. @@ -29,6 +31,10 @@ - [sceSaveDataMount3](../../../core/libs/prx/libSceSaveData.native/Export.cpp) (libSceSaveData.native) - an unterminated or empty directory name, `.`, `..`, or a name containing `/`, `\` or `:` returns `SAVE_DATA_ERROR_PARAMETER`, which the [SDK 12.000 reference](https://github.com/peterpuppy/bm/blob/3f9d1ba6b896a53080460c903f5c15af8affb80d/features/ps5/document/output/psn_12/System/Save_Data/SaveData-Reference/sce-save-data-mount3.md#L196-L204) lists for an invalid parameter, and leaves the result as it was, as [KytyPS5](https://github.com/KytyPS5/KytyPS5/blob/569ec04d1a77127c601eed522ad5bba187173f9d/src/libs/libSaveData.cpp#L652-L658) does. The [SDK](https://github.com/peterpuppy/bm/blob/3f9d1ba6b896a53080460c903f5c15af8affb80d/features/ps5/document/output/psn_12/System/Save_Data/SaveData-Reference/sce-save-data-dir-name.md#L32-L36) lets an application use only letters, digits, `-`, `.` and `@` in a name, and KytyPS5 also accepts `_` ([`valid_path_component`](https://github.com/KytyPS5/KytyPS5/blob/569ec04d1a77127c601eed522ad5bba187173f9d/src/libs/libSaveData.cpp#L276-L287)); which other names the console's mount rejects is not checked on hardware - [sceSaveDataBackup](../../../core/libs/prx/libSceSaveData.native/Export.cpp) (libSceSaveData.native) - an unterminated directory name returns `SAVE_DATA_ERROR_PARAMETER` to prevent unbounded copy; which other directory names the console's backup rejects is unverified on hardware. - [sceSaveDataBackup, sceSaveDataConvert, sceSaveDataDelete, sceSaveDataDirNameSearch, sceSaveDataDirNameSearchPs4, sceSaveDataGetEventResult, sceSaveDataGetMountInfo, sceSaveDataGetParam, sceSaveDataLoadIcon, sceSaveDataMount, sceSaveDataMount3, sceSaveDataSaveIcon, sceSaveDataSetParam, sceSaveDataUmount2](../../../core/libs/prx/libSceSaveData.native/Export.cpp) (libSceSaveData.native) - null pointer arguments return `SAVE_DATA_ERROR_PARAMETER` instead of throwing C++ exceptions, an implementation assumption matching guest error expectations not checked on hardware; unmounted targets return `SAVE_DATA_ERROR_NOT_MOUNTED`, and parameter type or buffer size violations return `SAVE_DATA_ERROR_PARAMETER` after slot lookup +- [sceSaveDataUmount2](../../../core/libs/prx/libSceSaveData.native/Export.cpp) (libSceSaveData.native) - a mount point that is not mounted returns `SAVE_DATA_ERROR_NOT_MOUNTED` (0x809F0004), which no console run has checked. KytyPS5's `sceSaveDataUmount2` (PS5, `src/libs/libSaveData.cpp`, commit 5e837a9beac82c031868eaad9348d6a48245fb99) returns `SAVE_DATA_ERROR_NOT_FOUND` (0x809F0008) there. For the PS4 `sceSaveDataUmount`, which none of the local titles import, shadPS4 (PS4, `src/core/libraries/save_data/savedata.cpp`, commit 0614ce324be092791b758d79f93d9f1ca5b10a81) returns `SAVE_DATA_ERROR_NOT_FOUND` and fpPS4 (PS4, `sys/sys_path.pas`, commit 04cefd43e6fddd1ab033e7980cd356d14c964905) `SAVE_DATA_ERROR_NOT_MOUNTED`. Forty of the 53 local titles import `sceSaveDataUmount2`. - [sceSaveDataSyncSaveDataMemory](../../../core/libs/prx/libSceSaveData.native/Export.cpp) (libSceSaveData.native) - validates library initialization and parameters; since in-memory saves flush synchronously on write, sync confirms existence and readiness of the memory blob - [sceSaveDataGetMountedSaveDataCount](../../../core/libs/prx/libSceSaveData.native/Export.cpp) (libSceSaveData.native) - signature and behavior are unverified; the function throws. [SharpEmu](https://github.com/sharpemu/sharpemu/blob/b1ec2866575bf72ffcef92cd639c580bf5bf0c61/src/SharpEmu.Libs/SaveData/SaveDataExports.cs) and [RPS5E](https://github.com/keklick1337/rps5e/blob/d540c46f5d83efac3a0df9b2edc14cf12fe9f2be/crates/ps5hle/src/savedata.rs) write the count through a second argument and return a status; their console accuracy is unverified. +- [sceSaveDataMount3](../../../core/libs/prx/libSceSaveData.native/Export.cpp) (libSceSaveData.native) - the console's `NO_SPACE_FS` code, the rounding of `required_blocks` and whether it checks the volume when a save is created are not measured; with `ANYPS5_FREE_SPACE=host` a save larger than the room of its volume fails with `0x809F000A` and sets `required_blocks` to the missing blocks rounded up to 64 KiB, as shadPS4 does at [savedata.cpp L468-L481](https://github.com/shadps4-emu/shadPS4/blob/1d8004a22feb0d5cc58828bac066018e80b6d73f/src/core/libraries/save_data/savedata.cpp#L468-L481), which rounds down and checks the full size +- [sceSaveDataGetMountInfo, sceSaveDataDirNameSearch](../../../core/libs/prx/libSceSaveData.native/Export.cpp) (libSceSaveData.native) - whether the console bounds a save's free blocks by the room of the disk is not measured; with `ANYPS5_FREE_SPACE=host` they are the smaller of the save's own free blocks and the 64 KiB blocks its volume still has, and a full volume reports none +- [sceSaveDataMount3, sceSaveDataGetMountInfo](../../../core/libs/prx/libSceSaveData.native/Export.cpp) (libSceSaveData.native) - the 64 KiB block that the room and free-block figures use is not measured on a console; [shadPS4 L50-L52](https://github.com/shadps4-emu/shadPS4/blob/1d8004a22feb0d5cc58828bac066018e80b6d73f/src/core/libraries/save_data/savedata.cpp#L50-L52) uses 32 KiB blocks and 96 to 32768 blocks, so the bytes that host mode requires for a save, and its free-block counts, would differ by a factor of two if the console uses 32 KiB diff --git a/docs/dev/debt/libSceShare.md b/docs/dev/debt/libSceShare.md index fb1150aa7e..0efc92a2b6 100644 --- a/docs/dev/debt/libSceShare.md +++ b/docs/dev/debt/libSceShare.md @@ -13,3 +13,16 @@ ### Functional - [sceShareCaptureVideoClipExtended, sceShareCaptureScreenshotExtended](../../../core/libs/prx/libSceShare/Export.cpp) - the 40-byte video and 24-byte screenshot parameters and request-ID write precedence are recovered. Video values at offsets 8 and 16 and screenshot mode semantics remain incomplete. Valid requests still return NOT_SUPPORTED without capture; screenshot mode 2 platform checks, throttling, initialization and the backend text limit are not modeled. + +### Additional callable exports + +- Six [callable exports](../../../core/libs/prx/libSceShare/Export.cpp) are throwing import-resolution declarations. Names for two entries, signatures and behavior are unverified. The module identity is `libSceShare`; the library identities are `libSceShareForAcf` and `libSceShareForSf`. The entries occur in two version-labelled images; these labels are not authenticated. + +| Name | NID | +| --- | --- | +| `sceShareFeatureExPermit` | `KVfMsyLNp5w` | +| `sceShareFeatureExProhibit` | `x+EVsi+Qhrk` | +| `sceShareRegisterUploadCallback` | `K0I-WwCewVU` | +| `sceShareUnregisterUploadCallback` | `4WSYopUYUPI` | +| `Unknown` | `YPIiGz4uKOU` | +| `Unknown` | `txixe0fiPKM` | diff --git a/docs/dev/debt/libSceShareInternal.native.md b/docs/dev/debt/libSceShareInternal.native.md new file mode 100644 index 0000000000..fe4c542958 --- /dev/null +++ b/docs/dev/debt/libSceShareInternal.native.md @@ -0,0 +1,30 @@ +# libSceShareInternal.native technical debt + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceShareInternal.native/Export.cpp) - 20 entries present in both version-labelled images are import-resolution declarations only. None is listed in the pinned public 3.20 catalogue for this library. Neither label independently authenticates retail firmware provenance. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +[Version-pinned selected ELF export records](https://gist.github.com/kyon-eth/3fbb1a4a6f95a936b4cd58e9c3d8c50c/5e3af709224ed8235af11337309af0725e5685cb) list every NID below with its image label, decoded export module and library, raw qualified symbol, ELF function type, value and size for each inspected version-labelled image. The extract SHA-256 is `02ab27f12bcd0cc9fa03fa33f55fc201110f0d54a86bbbaa093d55d0a8cf262d`; its full-module sorted-function-NID digests and raw module-parameter words permit independent comparison. This is an analyst-produced metadata record, not independent authentication of the original images or proof of prototypes or behavior. + +| Name | NID | +| --- | --- | +| `sceShareEventCallbackProcessed` | `1b7lsCtwocs` | +| `sceShareFeaturePermitCompatible` | `KfYRGDAbBp8` | +| `sceShareFeatureProhibitCompatible` | `NiEk-9J9gUA` | +| `sceShareGetContentParam` | `Y7ZE2F525XM` | +| `sceShareGetStoredAppStatus` | `9AMk7pW7i1Q` | +| `sceShareInitializeForShellCore` | `MpK73-5MRgY` | +| `sceShareInitializeInternal` | `AxAOjyc3QMQ` | +| `sceShareRegisterEventCallback` | `t1KtEtRCXYY` | +| `sceShareSetCurrentStatus` | `A4P0NTFvFOU` | +| `sceShareSetUploadEventInfo` | `yOI3xaWu7oY` | +| `sceShareTerminateForShellCore` | `YNfU-whRzF4` | +| `sceShareTerminateInternal` | `W-XUH997Geg` | +| `sceShareUnregisterEventCallback` | `Zypvbu9ShEY` | +| `Unknown` | `+LB32s0kCYg` | +| `Unknown` | `0IbPXX-WvQQ` | +| `Unknown` | `8E7VGc9qRvY` | +| `Unknown` | `9fIEK6i1idg` | +| `Unknown` | `9oywh7VdSjM` | +| `Unknown` | `IvkDssl52mA` | +| `Unknown` | `zyzD8P5ZKPA` | diff --git a/docs/dev/debt/libSceSharePlay.md b/docs/dev/debt/libSceSharePlay.md index e28d6dc966..5358701d53 100644 --- a/docs/dev/debt/libSceSharePlay.md +++ b/docs/dev/debt/libSceSharePlay.md @@ -13,3 +13,14 @@ - [sceSharePlayGetCurrentConnectionInfoA](../../../core/libs/prx/libSceSharePlay/Export.cpp) - the native module confirms a 72-byte result, initial zero fields and both user IDs -1. Initialization is checked before the output pointer. The host retains this initial disconnected state; native event draining, cached updates and service reconnection are unimplemented. - [sceSharePlayGetCurrentConnectionInfo](../../../core/libs/prx/libSceSharePlay/Export.cpp) - the 56-byte layout without account IDs is from [shadPS4's shareplay.h](https://github.com/shadps4-emu/shadPS4/blob/396c2a09a38d22eaa02aab32c1967263dceab95f/src/core/libraries/share_play/shareplay.h); the checks and values copy `sceSharePlayGetCurrentConnectionInfoA`, while shadPS4 leaves both user IDs 0 and checks nothing. Not measured on a console. - [sceSharePlayProhibitController](../../../core/libs/prx/libSceSharePlay/Export.cpp) - the argument is one byte, forwarded unchanged to the service. The host checks initialization, accepts 0/1 without a visitor controller, and returns 0x810E0001 (SCE_SHARE_PLAY_ERROR_INVALID_ARGS) for other values; dynamic service communication and controller state remain unimplemented. + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceSharePlay/Export.cpp) - 4 entries observed in the 3.20 export inventory and present in the later 13.60-labelled inventory are import-resolution declarations only. The later inventory label does not authenticate a retail firmware version. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Data exports require separate layout and ownership analysis. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `6egMR0eB8RU` | +| `Unknown` | `891hmdoV7UQ` | +| `Unknown` | `LpPA6mprZ8Q` | +| `Unknown` | `wcI2co2I4Xc` | diff --git a/docs/dev/debt/libSceSrcUtl.md b/docs/dev/debt/libSceSrcUtl.md index 2a9a117995..240ff5ee4b 100644 --- a/docs/dev/debt/libSceSrcUtl.md +++ b/docs/dev/debt/libSceSrcUtl.md @@ -2,6 +2,6 @@ ### Unknown function info -- [sceSrcUtilityFinalize, sceSrcUtilityFlush, sceSrcUtilityGetDelaySamples, sceSrcUtilityGetHandleSize, sceSrcUtilityGetPriority, sceSrcUtilityInitialize, sceSrcUtilityInitializeEx, sceSrcUtilityResample and sceSrcUtilitySetPriority](../../../core/libs/prx/libSceSrcUtl/Export.cpp) (libSceSrcUtl) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceSrcUtl.c), but no credible prototypes were found. The declarations have no parameters solely to resolve known imports; this is not an ABI claim and callers must not call them until signatures are verified +- [sceSrcUtilityFinalize, sceSrcUtilityFlush, sceSrcUtilityGetDelaySamples, sceSrcUtilityInitialize, sceSrcUtilityInitializeEx and sceSrcUtilityResample](../../../core/libs/prx/libSceSrcUtl/Export.cpp) (libSceSrcUtl) - throw and stay declared without parameters: in firmware 13.42 they drive AJM codec 19 (0x13), which this project's AJM lacks, and the conversion runs inside AJM, not in this module. `sceSrcUtilityInitializeEx` initializes an AJM context and registers codec 19; `sceSrcUtilityInitialize` checks its arguments like `sceSrcUtilityGetHandleSize`, clears the 0x9678-byte handle, creates a codec 19 instance, sends it a control job and marks the handle (0xDEADBEEFBAADF00D at 0x9470, priority 0x28 at 0x2C). The implemented calls `sceSrcUtilityGetHandleSize`, `sceSrcUtilitySetPriority` and `sceSrcUtilityGetPriority` follow firmware 13.42's libSceSrcUtl.sprx, read from disassembly and not measured on a console, on its PS5 process path; their argument names are inferred from its checks. For a PS4 process the module allows only 1 or 2 channels and refuses 22050 Hz to 192000 Hz, which is not modelled - [sceSrcUtilityCreateEx, sceSrcUtilityDeleteEx, sceSrcUtilityGetAjmContext, sceSrcUtilityTerminateEx](../../../core/libs/prx/libSceSrcUtl/Export.cpp) throw through `NotImplemented_nid_no_patch`. Names and NIDs are bound by the [13.60 firmware inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/bfec40deb4c47a17d7603ee2bc79aa6862c0c56b/data/firmware-13.60/libscesrcutl-970010b531.jsonl); signatures and behaviour remain unknown. Parameterless `int` declarations are import-resolution placeholders, not confirmed ABI signatures. Their service behaviour is unimplemented. diff --git a/docs/dev/debt/libSceSsl.md b/docs/dev/debt/libSceSsl.md index a45d758ec6..977b487969 100644 --- a/docs/dev/debt/libSceSsl.md +++ b/docs/dev/debt/libSceSsl.md @@ -6,7 +6,7 @@ - [sceSslDisableOption, sceSslDisableOptionInternal, sceSslDisableOptionInternalInsecure, sceSslEnableOption, sceSslEnableOptionInternal, sceSslGetNanoSSLModuleId, sceSslGetPeerCert, sceSslGetSslError, sceSslLoadRootCACert and sceSslSetSslVersion](../../../core/libs/prx/libSceSsl/Export.cpp) (libSceSsl) - the list is the intersection of the export table of the console's libSceSsl (function symbols only), the pinned aerolib names and the functions not yet defined anywhere in the repo. Names and NIDs appear in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceSsl.c) and [verified NID name database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv); no credible prototypes were found. They are declared without parameters solely to resolve known imports, not as an ABI claim; callers must not call them until signatures are verified. - [sceSslReuseConnection](../../../core/libs/prx/libSceSsl/Export.cpp) (libSceSsl) - its name and NID appear in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceSsl.c) and [verified NID name database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv); its parameter shape follows [SharpProspero's pinned binding](https://github.com/SvenGDK/SharpProspero/blob/5dfdb4b0b166e83dc9ae275001afb695f12c7174/src/SharpProspero/Interop/Net/Http.cs#L2231-L2235). No console observation or reliable implementation source for session reuse was found. -- [sceSslCreateConnection, sceSslDeleteConnection, sceSslSetVerifyCallback, sceSslConnect, sceSslRead, sceSslWrite](../../../core/libs/prx/libSceSsl/Export.cpp) (libSceSsl) - imported by `ffmpeg.prx`. Signatures follow [SharpProspero](https://github.com/SvenGDK/SharpProspero/blob/60977b29103452b9681ae10c7a9011d44965bf16/src/SharpProspero/Interop/Net/Http.cs#L195-L252), which also says the socket stays open after `sceSslDeleteConnection`. The behaviour below was measured on a PS5 on system software 13.40 with a ps5-payload-dev payload (every call printed with its return, a TLS 1.2 test server on the LAN presenting leaves issued by the test fixture root loaded with `sceSslLoadCert`, from an elfldr process rather than a title); what differs for a title process is unknown. An unknown context returns `SSL_ERROR_INVALID_ID` (0x8095F006) from `sceSslCreateConnection`, and every connection call on an unknown or deleted connection id or on a connection whose context was terminated returns `SSL_ERROR_INVALID_ID`. `sceSslCreateConnection` returns `SSL_ERROR_INVALID_VALUE` (0x8095F007) for a null host and does not check the socket: `sceSslConnect` on a descriptor that is not a socket returns `SCE_NET_ERROR_EBADF` (0x80410109). `sceSslConnect` runs a TLS 1.2 client handshake with Mbed TLS 3.6.7 over the host socket that the guest number maps to in the libkernel or libSceNet socket table, and `sceSslRead` and `sceSslWrite` carry application data over it. TLS 1.3 is compiled out: the console offers TLS 1.2 only (its ClientHello carries 12 suites and no supported_versions extension) and a TLS 1.3-only server gets `SSL_ERROR_FATAL_ALERT` (0x8095F010) from it, as from this build. Connection state is allocated from the context's pool and returned to it by `sceSslDeleteConnection`. The console's pool use for one connection with a two-certificate chain peaked at 80,544 bytes in a 256 KiB pool (5,568 after `sceSslInit`, 12,000 after loading one CA); a 16 KiB pool fails the connect with `SSL_ERROR_OUT_OF_MEMORY` (0x809517D5) there and here. The server's chain is checked against the CAs loaded with `sceSslLoadCert`, the host name the connection was created with (case-insensitively; an IP literal sends no SNI and matches an IP subject alternative name; an empty host sends an empty SNI and fails `CN_CHECK`) and, when enabled, its validity dates, and `sceSslConnect` returns the first failure the connection's verify options select (the verify option entry below lists the bits, codes and initial options); no root bundle is shipped and the console's built-in roots are unknown, so with no CA loaded a connection with the initial options returns `SSL_ERROR_UNKNOWN_CA` (0x8095F00C), as on the console. A client certificate loaded with `sceSslLoadCert` is sent when the server asks for one. A failed verification is final: close_notify is sent, later `sceSslConnect` calls return the same code (also after the `WANT_POLLIN` rounds of a non-blocking socket), and `sceSslRead` and `sceSslWrite` throw, as the console's codes for them were not measured. With a verify callback set it is called once after the handshake, outside the connection's lock, with the context id, the bits of the enabled checks that failed (`KNOWN_CA_CHECK` 0x20, `CN_CHECK` 0x4, the date checks when enabled, 0 when the chain passed), handles to a copy of the peer chain as received (the leaf first, the root last when the server sent it) that the certificate readers of the connection's context accept until the connection is deleted (the handles stay registered in the context until it is terminated; the console frees them at the delete), the chain length and the user argument. A chain fault that no option names (`SSL_ERROR_INVALID_CERT` without a callback) throws when a callback is set, as the bits the console passes for it were not measured. A non-negative return accepts the connection whatever the bits were; a negative return fails the connect with `SSL_ERROR_APPLICATION_VERIFICATION_CALLBACK_CHECK` (0x8095F0FD) and the callback runs again, with the same chain, from every later `sceSslConnect`, `sceSslRead` and `sceSslWrite` of the connection, which return 0x8095F0FD while it keeps refusing and proceed once it accepts. A `sceSslConnect` from inside the callback, or from another thread while it runs, throws. `sceSslRead` and `sceSslWrite` before `sceSslConnect` run the handshake and verification themselves and return its code when it fails. A non-blocking socket that would block returns `SSL_ERROR_WANT_POLLIN` (0x8095F013) or `SSL_ERROR_WANT_POLLOUT` (0x8095F014) from `sceSslConnect`, `sceSslRead` and `sceSslWrite`; the next `sceSslConnect` resumes the handshake, and `sceSslWrite` returns the part it sent before blocking (the console returned 32 KiB of a 64 KiB write). A blocking libSceNet socket whose `SO_RCVTIMEO` expires returns `SSL_ERROR_WANT_POLLIN` as well, and the call can be repeated; `SSL_ERROR_READ_TIMEOUT` (0x80951710) is never returned. libkernel keeps its timeouts above the host socket, so they do not bound SSL reads and writes on a libkernel socket. `sceSslRead` with flags 0 reads until `len` bytes arrived or the stream ended and with flags 1 or 2 returns what the first record delivers. Native flags 3 peek without consuming data; values outside 0 through 3 return `SSL_ERROR_INVALID_VALUE` before connection lookup. A non-blocking read that got some bytes returns them. It returns 0 after the server's close_notify and after a transport that ends without one, every later read 0 again, and `SSL_ERROR_EOF` (0x8095177C) and `SSL_ERROR_SOCKET_CLOSED` (0x8095170D) never from a read. A reset (`ECONNRESET`, `EPIPE`, `WSAECONNRESET`, `WSAECONNABORTED`, `WSAENETRESET`) returns `SCE_NET_ERROR_ECONNRESET` (0x80410136) from `sceSslRead` and `SCE_NET_ERROR_EPIPE` (0x80410120) from `sceSslWrite`, on every later call too; a record that fails its MAC returns 0x80951D55 from `sceSslRead` after the fatal alert goes out. `sceSslWrite` accepts flags 0 only, `SSL_ERROR_INVALID_VALUE` otherwise, sends all of `len`, capped at `INT_MAX`, and returns the count; it keeps writing after the peer's close_notify or a stream that ended without one, as the console does. A fatal alert during the handshake returns `SSL_ERROR_FATAL_ALERT` and ends the transport: later `sceSslConnect` calls return 0, `sceSslRead` 0 and `sceSslWrite` `SSL_ERROR_SOCKET_CLOSED`, as measured. A transport that ends without close_notify or a reset during the handshake returns `SSL_ERROR_SOCKET_CLOSED`, the session is dropped and the next `sceSslConnect` starts over; those two handshake cases and `SSL_ERROR_INVALID_CERT` (0x8095F00A) for a verification failure no option names were not measured. Other handshake and socket failures, a read or write after a failed verification, a write after `sceSslClose`, a null buffer and a read or write from inside the callback throw, as their console codes are unknown. A connection serializes its reads and writes, so a read blocked in one thread holds back a write on the same connection from another. `sceSslDeleteConnection` sends no close_notify and returns `SSL_ERROR_INVALID_ID` when repeated. A second `sceSslTerm` returns `SSL_ERROR_INVALID_ID` and `sceSslInit` with a pool size of 0 returns `SCE_KERNEL_ERROR_EINVAL` (0x80020016). `sceSslSetVerifyCallback` accepts any callback, null included, and returns 0. The console's first `sceSslConnect` in a process took 23.8 s before its ClientHello left, a one-time initialisation not emulated. `SSL_ERROR_BEFORE_INIT` (0x8095F001) is never returned, as the library keeps no state apart from its contexts +- [sceSslCreateConnection, sceSslDeleteConnection, sceSslSetVerifyCallback, sceSslConnect, sceSslRead, sceSslWrite](../../../core/libs/prx/libSceSsl/Export.cpp) (libSceSsl) - imported by `ffmpeg.prx`. Signatures follow [SharpProspero](https://github.com/SvenGDK/SharpProspero/blob/60977b29103452b9681ae10c7a9011d44965bf16/src/SharpProspero/Interop/Net/Http.cs#L195-L252), which also says the socket stays open after `sceSslDeleteConnection`. The behaviour below was measured on a PS5 on system software 13.40 with a ps5-payload-dev payload (every call printed with its return, a TLS 1.2 test server on the LAN presenting leaves issued by the test fixture root loaded with `sceSslLoadCert`, from an elfldr process rather than a title); what differs for a title process is unknown. An unknown context returns `SSL_ERROR_INVALID_ID` (0x8095F006) from `sceSslCreateConnection`, and every connection call on an unknown or deleted connection id or on a connection whose context was terminated returns `SSL_ERROR_INVALID_ID`. `sceSslCreateConnection` returns `SSL_ERROR_INVALID_VALUE` (0x8095F007) for a null host and does not check the socket: `sceSslConnect` on a descriptor that is not a socket returns `SCE_NET_ERROR_EBADF` (0x80410109). `sceSslConnect` runs a TLS 1.2 client handshake with Mbed TLS 3.6.7 over the host socket that the guest number maps to in the libkernel or libSceNet socket table, and `sceSslRead` and `sceSslWrite` carry application data over it. TLS 1.3 is compiled out: the console offers TLS 1.2 only (its ClientHello carries 12 suites and no supported_versions extension) and a TLS 1.3-only server gets `SSL_ERROR_FATAL_ALERT` (0x8095F010) from it, as from this build. Connection state is allocated from the context's pool and returned to it by `sceSslDeleteConnection`. The console's pool use for one connection with a two-certificate chain peaked at 80,544 bytes in a 256 KiB pool (5,568 after `sceSslInit`, 12,000 after loading one CA); a 16 KiB pool fails the connect with `SSL_ERROR_OUT_OF_MEMORY` (0x809517D5) on the console, while here an exhausted pool throws `std::bad_alloc` (see `CheckBackend`) and returns no SSL error code. The server's chain is checked against the CAs loaded with `sceSslLoadCert`, the host name the connection was created with (case-insensitively; an IP literal sends no SNI and matches an IP subject alternative name; an empty host sends an empty SNI and fails `CN_CHECK`) and, when enabled, its validity dates, and `sceSslConnect` returns the first failure the connection's verify options select (the verify option entry below lists the bits, codes and initial options); no root bundle is shipped and the console's built-in roots are unknown, so with no CA loaded a connection with the initial options returns `SSL_ERROR_UNKNOWN_CA` (0x8095F00C), as on the console. A client certificate loaded with `sceSslLoadCert` is sent when the server asks for one. A failed verification is final: close_notify is sent, later `sceSslConnect` calls return the same code (also after the `WANT_POLLIN` rounds of a non-blocking socket), and `sceSslRead` and `sceSslWrite` throw, as the console's codes for them were not measured. With a verify callback set it is called once after the handshake, outside the connection's lock, with the context id, the bits of the enabled checks that failed (`KNOWN_CA_CHECK` 0x20, `CN_CHECK` 0x4, the date checks when enabled, 0 when the chain passed), handles to a copy of the peer chain as received (the leaf first, the root last when the server sent it) that the certificate readers of the connection's context accept until the connection is deleted (the handles stay registered in the context until it is terminated; the console frees them at the delete), the chain length and the user argument. A chain fault that no option names (`SSL_ERROR_INVALID_CERT` without a callback) throws when a callback is set, as the bits the console passes for it were not measured. A non-negative return accepts the connection whatever the bits were; a negative return fails the connect with `SSL_ERROR_APPLICATION_VERIFICATION_CALLBACK_CHECK` (0x8095F0FD) and the callback runs again, with the same chain, from every later `sceSslConnect`, `sceSslRead` and `sceSslWrite` of the connection, which return 0x8095F0FD while it keeps refusing and proceed once it accepts. A `sceSslConnect` from inside the callback, or from another thread while it runs, throws. `sceSslRead` and `sceSslWrite` before `sceSslConnect` run the handshake and verification themselves and return its code when it fails. A non-blocking socket that would block returns `SSL_ERROR_WANT_POLLIN` (0x8095F013) or `SSL_ERROR_WANT_POLLOUT` (0x8095F014) from `sceSslConnect`, `sceSslRead` and `sceSslWrite`; the next `sceSslConnect` resumes the handshake, and `sceSslWrite` returns the part it sent before blocking (the console returned 32 KiB of a 64 KiB write). A blocking libSceNet socket whose `SO_RCVTIMEO` expires returns `SSL_ERROR_WANT_POLLIN` as well, and the call can be repeated; `SSL_ERROR_READ_TIMEOUT` (0x80951710) is never returned. libkernel keeps its timeouts above the host socket, so they do not bound SSL reads and writes on a libkernel socket. `sceSslRead` with flags 0 reads until `len` bytes arrived or the stream ended and with flags 1 or 2 returns what the first record delivers. Native flags 3 peek without consuming data; values outside 0 through 3 return `SSL_ERROR_INVALID_VALUE` before connection lookup. A non-blocking read that got some bytes returns them. It returns 0 after the server's close_notify and after a transport that ends without one, every later read 0 again, and `SSL_ERROR_EOF` (0x8095177C) and `SSL_ERROR_SOCKET_CLOSED` (0x8095170D) never from a read. A reset (`ECONNRESET`, `EPIPE`, `WSAECONNRESET`, `WSAECONNABORTED`, `WSAENETRESET`) returns `SCE_NET_ERROR_ECONNRESET` (0x80410136) from `sceSslRead` and `SCE_NET_ERROR_EPIPE` (0x80410120) from `sceSslWrite`, on every later call too; a record that fails its MAC returns 0x80951D55 from `sceSslRead` after the fatal alert goes out. `sceSslWrite` accepts flags 0 only, `SSL_ERROR_INVALID_VALUE` otherwise, sends all of `len`, capped at `INT_MAX`, and returns the count; it keeps writing after the peer's close_notify or a stream that ended without one, as the console does. A fatal alert during the handshake returns `SSL_ERROR_FATAL_ALERT` and ends the transport: later `sceSslConnect` calls return 0, `sceSslRead` 0 and `sceSslWrite` `SSL_ERROR_SOCKET_CLOSED`, as measured. A transport that ends without close_notify or a reset during the handshake returns `SSL_ERROR_SOCKET_CLOSED`, the session is dropped and the next `sceSslConnect` starts over; those two handshake cases and `SSL_ERROR_INVALID_CERT` (0x8095F00A) for a verification failure no option names were not measured. Other handshake and socket failures, a read or write after a failed verification, a write after `sceSslClose`, a null buffer and a read or write from inside the callback throw, as their console codes are unknown. A connection serializes its reads and writes, so a read blocked in one thread holds back a write on the same connection from another. `sceSslDeleteConnection` sends no close_notify and returns `SSL_ERROR_INVALID_ID` when repeated. A second `sceSslTerm` returns `SSL_ERROR_INVALID_ID` and `sceSslInit` with a pool size of 0 returns `SCE_KERNEL_ERROR_EINVAL` (0x80020016). `sceSslSetVerifyCallback` accepts any callback, null included, and returns 0. The console's first `sceSslConnect` in a process took 23.8 s before its ClientHello left, a one-time initialisation not emulated. `SSL_ERROR_BEFORE_INIT` (0x8095F001) is never returned, as the library keeps no state apart from its contexts - [sceSslClose](../../../core/libs/prx/libSceSsl/Export.cpp) (libSceSsl) - takes the connection id, as in [SharpProspero](https://github.com/SvenGDK/SharpProspero/blob/60977b29103452b9681ae10c7a9011d44965bf16/src/SharpProspero/Interop/Net/Http.cs#L195-L252). Measured on 13.40 as the connection entry describes: it sends close_notify once if the handshake completed and returns 0, 0 again when repeated and 0 on a connection that never connected, already failed verification or lost its transport to a fatal alert; a close before the handshake changes nothing, so the connection can still connect. After the close `sceSslConnect` returns 0 and `sceSslRead` 0, as on the console; `sceSslWrite` after it throws, as the console's code was not measured. A close_notify that a non-blocking socket cannot take at once returns `SSL_ERROR_WANT_POLLOUT` (0x8095F014) and the close can be repeated; after a reset it returns `SCE_NET_ERROR_ECONNRESET` (0x80410136) every time. The socket is left to the title; an unknown connection returns `SSL_ERROR_INVALID_ID` (0x8095F006). Whether the console closes the socket is unknown - [Certificate readers](../../../core/libs/prx/libSceSsl/Export.cpp): foreign and expired certificate/name handles throw instead of following native unchecked pointers. Name views track certificate lifetime and preserve identity; the native no-op name release is implemented. View storage remains allocated until context destruction. Numeric names for attributes Mbed TLS cannot identify may differ from native names. Fingerprint stack-space validation and backend digest failures are not reproduced. Signatures, valid-context/null-argument precedence, serial truncation, name copy bounds, validity timestamps and supported hash selectors are confirmed by the supplied module. - [sceSslLoadCert, sceSslGetCaList, sceSslFreeCaList, sceSslGetCaCerts, sceSslFreeCaCerts, sceSslUnloadCert](../../../core/libs/prx/libSceSsl/Export.cpp) (libSceSsl) - signatures and layouts follow [SharpProspero](https://github.com/SvenGDK/SharpProspero/blob/5dfdb4b0b166e83dc9ae275001afb695f12c7174/src/SharpProspero/Interop/Net/Http.cs). PPSA15508/01.002.000 calls `sceSslLoadCert` with one 1,408-byte PEM CA and null client certificate/key arguments; this confirms that call shape, not console error behavior. Mbed TLS parses DER/PEM chains. CA imports still commit together instead of preserving successful entries before a later failure. Client certificate replacement clears the previous identity; raw private keys load independently and are parsed when configuring TLS. Partial client chains on decode failure, native key parse errors and incomplete identities during TLS setup remain unsupported. CA queries return independently owned snapshots; unload clears active credentials while outstanding snapshots remain valid. Appending repeated CA imports, snapshot lifetime across unload, memory overhead and error precedence have not been measured on a PS5. Invalid loads, malformed material, exhausted pools and unsupported keys throw rather than inventing console error codes. Native CA queries include built-in roots; the host still queries loaded authorities and returns `NOT_FOUND` for an empty context. No native root bundle is copied. Null-output and invalid-context precedence, output preservation on invalid contexts and the SDK 7.50 unload error boundary are recovered. Legacy clearing of foreign raw CA lists remains unchanged. Certificate reader queries reflect active certificates or outstanding snapshots. Loading credentials does not start a TLS connection; `sceSslConnect` verifies the server against the loaded CAs and offers the loaded client certificate diff --git a/docs/dev/debt/libSceSysCore.md b/docs/dev/debt/libSceSysCore.md index b22655eb7f..bfc9747c9c 100644 --- a/docs/dev/debt/libSceSysCore.md +++ b/docs/dev/debt/libSceSysCore.md @@ -27,3 +27,15 @@ - [sceApplicationSetControllerFocus, sceApplicationSetControllerFocusPermissionToSubProcess, sceApplicationSetMemoryPstate, sceApplicationSignalShellCoreHeartBeat, sceApplicationSpawn2 and sceApplicationSuspend](../../../core/libs/prx/libSceSysCore/Export.cpp) (libSceSysCore) - The list is the intersection of the export table of the console's libSceSysCore (function symbols only), the pinned aerolib names and the functions not yet defined anywhere in the repo. Names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceSysCore.c) and the [verified NID name database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv), but no credible prototypes were found. They are declared without parameters solely to resolve known imports; this is not an ABI claim and callers must not call them until signatures are verified. - [sceApplicationSuspendSystemForDebugger, sceApplicationSwitchToBaseMode, sceApplicationSwitchToNeoMode, sceApplicationSwitchToNeoMode2, sceApplicationSystemReboot and sceApplicationSystemShutdown2](../../../core/libs/prx/libSceSysCore/Export.cpp) (libSceSysCore) - The list is the intersection of the export table of the console's libSceSysCore (function symbols only), the pinned aerolib names and the functions not yet defined anywhere in the repo. Names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceSysCore.c) and the [verified NID name database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv), but no credible prototypes were found. They are declared without parameters solely to resolve known imports; this is not an ABI claim and callers must not call them until signatures are verified. - [sceApplicationSystemSuspend, sceApplicationSystemSuspend2, sceApplictionGetStateForDebugger, sceSysCoreGetEventCount and sceSysCoreReceiveEvent](../../../core/libs/prx/libSceSysCore/Export.cpp) (libSceSysCore) - The list is the intersection of the export table of the console's libSceSysCore (function symbols only), the pinned aerolib names and the functions not yet defined anywhere in the repo. Names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceSysCore.c) and the [verified NID name database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv), but no credible prototypes were found. They are declared without parameters solely to resolve known imports; this is not an ABI claim and callers must not call them until signatures are verified. + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceSysCore/Export.cpp) - 5 entries present in both version-labelled images are import-resolution declarations only. Neither label independently authenticates retail firmware provenance. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `F2qydFnZWfY` | +| `Unknown` | `Q5nkKEHtW18` | +| `Unknown` | `V7awqOXNG30` | +| `Unknown` | `lGA8mxzKIhk` | +| `Unknown` | `piCjhbSYauo` | diff --git a/docs/dev/debt/libSceSysmodule.md b/docs/dev/debt/libSceSysmodule.md index 91a505db39..42d7b48f52 100644 --- a/docs/dev/debt/libSceSysmodule.md +++ b/docs/dev/debt/libSceSysmodule.md @@ -1,5 +1,17 @@ # libSceSysmodule technical debt +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceSysmodule/InventoryExports.cpp) - 5 entries present in both version-labelled images are import-resolution declarations only. All belong to module `libSceSysmodule`; two have logical library `libSceSysmodule` and three have logical library `libSceSysmodule_jvm`. Neither label independently authenticates retail firmware provenance. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `5gs662NWKhE` | +| `Unknown` | `6XFxHG0KhBg` | +| `Unknown` | `9Q9uHJVfB4w` | +| `Unknown` | `kMn8gDsKp9Y` | +| `Unknown` | `uQqnJudN5fY` | + ### Silent stubs - [sceSysmoduleIsLoaded, sceSysmoduleLoadModule, sceSysmoduleUnloadModule](../../../core/libs/prx/libSceSysmodule/Export.cpp) (libSceSysmodule) accept the 141 ids `sceSysmoduleIsLoaded` did not reject in a payload process on a PS5 (firmware 13.60) and return `0x805A1000` for every other id, as the console does; that includes 51 ids the module table names from older firmware, such as 0x0001 (`libSceAudioOut`) and 0x0080 (`libSceJson`). Load and unload are counted as measured. The 21 accepted ids the table does not name (0x0111, 0x0117, 0x011c to 0x011f, 0x0121 to 0x0124, 0x0129, 0x012c to 0x012e, 0x0133, 0x0134, 0x0136 and 0x013a to 0x013d) are logged and return 0 without loading anything, so `sceSysmoduleIsLoaded` reports them as loaded; which module each loads is not known. Loading id 0x00ff ended the payload process. One title (PPSA04354) calls `sceSysmoduleIsLoaded` with id 0x96 at twelve sites and loads it only when the result is 0x805a1001; any other result lets it continue. diff --git a/docs/dev/debt/libSceSystemGesture.md b/docs/dev/debt/libSceSystemGesture.md index 5d9acec690..37c5e5b6b2 100644 --- a/docs/dev/debt/libSceSystemGesture.md +++ b/docs/dev/debt/libSceSystemGesture.md @@ -8,3 +8,7 @@ - [Primitive touch events](../../../core/libs/prx/libSceSystemGesture/Export.cpp): pad handles are not validated against native controller information. Begin, active and end states are confirmed, but cancellation state 4, motion thresholds and SDK-dependent duplicate-report handling remain unimplemented. Timing, coordinate conversion and update flags still use the host approximation. Recognizer allocation and native descriptor layouts remain incomplete. - [sceSystemGestureDebugGetVersion](../../../core/libs/prx/libSceSystemGesture/Export.cpp) (libSceSystemGesture) - its name and NID are in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceSystemGesture.c), but no credible prototype was found. It is declared without parameters solely to resolve known imports; this is not an ABI claim + +### Additional callable exports + +- [sceSystemGestureSetTouchAreaInformation](../../../core/libs/prx/libSceSystemGesture/Export.cpp) hashes to `dWKhDgKLsHY`; the public 3.20 catalogue does not list it. The `libSceSystemGesture.sprx` module in each image labelled 3.20 and 13.60 contains `dWKhDgKLsHY#D#A` as a function record. Dynamic metadata maps library ID 3 and module ID 0 to `libSceSystemGesture`. The 3.20-labelled module words are `0x08540001`, `0x03200004`; the 13.60-labelled module words are `0x13590001`, `0x13600007`. Both contain 24 unique function NIDs; sorted-LF SHA-256: `acad8b5f908d6431db3c2d2a5dcffbd79eca1e1f8a02127e8671d82da0fca38d`, using the [static ELF membership procedure](https://github.com/boykopovar/AnyPS5/pull/12367#issuecomment-6470603298). Labels do not authenticate retail provenance; the digest identifies the NID set only. Independent verification requires a matching image. The signature and behavior are unverified; this declaration throws. diff --git a/docs/dev/debt/libSceSystemLogger2.md b/docs/dev/debt/libSceSystemLogger2.md index d1be5997cb..c19b58a615 100644 --- a/docs/dev/debt/libSceSystemLogger2.md +++ b/docs/dev/debt/libSceSystemLogger2.md @@ -4,3 +4,14 @@ - [sceSystemLogger2GetTimestamp, sceSystemLogger2Initialize, sceSystemLogger2SetEventAsync, sceSystemLogger2SetEventAsyncEx and sceSystemLogger2Terminate](../../../core/libs/prx/libSceSystemLogger2/Export.cpp) (libSceSystemLogger2) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceSystemLogger2.c), but no credible prototypes were found. The declarations have no parameters solely to resolve known imports; this is not an ABI claim and callers must not call them until signatures are verified - [sceSystemLogger2GetEventStatus, sceSystemLogger2IsAvailableMonitor, sceSystemLogger2TerminateWithResourceRelease, sceSystemLogger2SetEventAsyncEx2, sceSystemLogger2SetRnpsEventAsync, sceSystemLogger2SetEventAsyncInternal](../../../core/libs/prx/libSceSystemLogger2/Export.cpp) have unknown signatures and behaviour. The parameterless `int` declarations are import-resolution placeholders, not confirmed ABI signatures, and every call throws through `NotImplemented_nid_no_patch`. Only the names and NIDs are established by the [13.60 export inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/bfec40deb4c47a17d7603ee2bc79aa6862c0c56b/data/firmware-13.60/libscesystemlogger2-2d5a872a6c.jsonl). `sceSystemLogger2SetRnpsEventAsync` is shell-facing inventory only; RNPS service behaviour and title consumption remain unverified. + +### Additional callable exports + + +- [Additional callable exports](../../../core/libs/prx/libSceSystemLogger2/Export.cpp) - 3 entries observed in the 3.20 export inventory and present in the later 13.60-labelled inventory are import-resolution declarations only. The later inventory label does not authenticate a retail firmware version. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `PcjxaaFQATU` | +| `Unknown` | `UI7zoVuRjdU` | +| `Unknown` | `eI4wpp+8Bco` | diff --git a/docs/dev/debt/libSceSystemLogger2NativeQueueClient.md b/docs/dev/debt/libSceSystemLogger2NativeQueueClient.md index 7e0efcf291..26e154640c 100644 --- a/docs/dev/debt/libSceSystemLogger2NativeQueueClient.md +++ b/docs/dev/debt/libSceSystemLogger2NativeQueueClient.md @@ -4,3 +4,5 @@ - [sceSystemLogger2NativeQueueClientCheckAndMaskData, sceSystemLogger2NativeQueueClientGetEvent, sceSystemLogger2NativeQueueClientSetDeliveryEnable, sceSystemLogger2NativeQueueClientSetDeliveryResult and sceSystemLogger2NativeQueueClientSetNativeQueueConfig](../../../core/libs/prx/libSceSystemLogger2NativeQueueClient/Export.cpp) (libSceSystemLogger2NativeQueueClient) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceSystemLogger2NativeQueueClient.c), but no credible prototypes were found. The declarations have no parameters solely to resolve known imports; this is not an ABI claim and callers must not call them until signatures are verified - [sceSystemLogger2NativeQueueClientSetBatchDeliveryResult, sceSystemLogger2NativeQueueClientSetEventFilter, sceSystemLogger2NativeQueueClientCheckData, sceSystemLogger2NativeQueueClientGetEvent2, sceSystemLogger2NativeQueueClientInitialize, sceSystemLogger2NativeQueueClientTerminate](../../../core/libs/prx/libSceSystemLogger2NativeQueueClient/Export.cpp) have unknown signatures and behaviour. The parameterless `int` declarations are import-resolution placeholders, not confirmed ABI signatures, and every call throws through `NotImplemented_nid_no_patch`. Only the names and NIDs are established by the [13.60 export inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/bfec40deb4c47a17d7603ee2bc79aa6862c0c56b/data/firmware-13.60/libscesystemlogger2nativequeueclient-20515566b1.jsonl). + +- [Unidentified export `AuwwRl6zAcU`](../../../core/libs/prx/libSceSystemLogger2NativeQueueClient/Export.cpp) is an import-resolution declaration that throws through `NotImplemented_nid_no_patch`. Its name, parameter list, return type and behavior are unverified; the parameterless declaration is not an ABI contract. diff --git a/docs/dev/debt/libSceSystemService.md b/docs/dev/debt/libSceSystemService.md index baf22a6271..7c344f7bf8 100644 --- a/docs/dev/debt/libSceSystemService.md +++ b/docs/dev/debt/libSceSystemService.md @@ -2,10 +2,6 @@ ### Silent stubs -- [sceShellCoreUtilActivateAbort, sceShellCoreUtilActivateStart, sceShellCoreUtilActivateStartAsync, sceShellCoreUtilActivateTerm](../../../core/libs/prx/libSceSystemService/PendingExports.cpp) return zero with the recovered handle argument. Activation service state is not modeled. - -- [sceShellCoreUtilActivateRecordActivation](../../../core/libs/prx/libSceSystemService/PendingExports.cpp) - activation service state is not modeled; this parameterless export returns zero without recording an activation. - - [libSceSystemService](../../../core/libs/prx/libSceSystemService/Export.cpp) - `sceSystemServicePowerTick`, `sceSystemServiceReportAbnormalTermination`, `sceSystemServiceDisableMusicPlayer`, `sceSystemServiceReenableMusicPlayer`, `sceSystemServiceDisableMediaPlay` and `sceSystemServiceReenableMediaPlay` return success and do nothing: the host has no auto power-off timer to reset, no system crash reporter to notify, no system music player to pause or resume and no system media playback to disable. PPSA01521 calls `sceSystemServiceDisableMediaPlay` during start-up, and its wrappers for both pass no arguments - [sceSystemServiceLaunchWebBrowser](../../../core/libs/prx/libSceSystemService/Export.cpp) (libSceSystemService) - AnyPS5 launches no web browser, so the call fails and nothing is shown. RommPS PPSA76677 then tells the player to scan its QR code instead - [sceSystemServiceShowControllerSettings](../../../core/libs/prx/libSceSystemService/Export.cpp) (libSceSystemService) - returns success without showing the controller settings: AnyPS5 has no system UI to open. Cat Quest III (PPSA15065) imports it @@ -17,8 +13,6 @@ ### Unknown function info -- [sceShellCoreUtilActivateGetStatus, sceShellCoreUtilActivateInit, sceShellCoreUtilActivateIsActivated](../../../core/libs/prx/libSceSystemService/PendingExports.cpp) - the activation contract is unresolved: handle values and lifecycle, the activation flag, status/result fields, null-output errors and repeated initialization are unverified. All calls throw `NotImplemented_nid_no_patch`, including calls with null outputs. - - [sceSystemServiceAddLocalProcessForPsmKit, sceSystemServiceKillLocalProcessForPsmKit](../../../core/libs/prx/libSceSystemService/Export.cpp) (libSceSystemService) - AnyPS5 runs one process and starts or stops no other, so both throw without reading their arguments. The parameters follow Forever Launcher's own firmware 5.50 probes (`ps5/probes/localproc` in [bizkut/ps5-forever](https://github.com/bizkut/ps5-forever)): a path, a null-terminated argv and a 0x90-byte parameter block in, a handle out; the kill takes that handle. Their results on the console are unknown. Forever Launcher (PPSA99030) imports both and stops at load without them. - [sceSystemServiceGetAppId, sceSystemServiceGetAppTitleId, sceLncUtilGetAppTitleId](../../../core/libs/prx/libSceSystemService/Export.cpp) (libSceSystemService) - the console's results for a title ID or app ID other than the running title are unknown, and so are its errors for null buffers, so those calls throw. A null title ID, or one whose length isn't 9, makes `sceSystemServiceGetAppId` return -1 before any request, as firmware 13.42's `libSceSystemService.sprx` does ([emulator run](https://github.com/boykopovar/AnyPS5/pull/10801#issuecomment-6403075212)); otherwise it compares the title ID exactly with the one in `param.json` or `param.sfo`. The title ID buffer is 10 bytes, so a running title ID of 10 or more characters throws too. The signatures follow [SharpProspero](https://github.com/SvenGDK/SharpProspero/blob/5dfdb4b0b166e83dc9ae275001afb695f12c7174/src/SharpProspero/Interop/SystemService/SystemService.cs#L236-L260), except that `sceLncUtilGetAppTitleId` returns an `int`, as declared in the pending exports, and 0 on success like `sceSystemServiceGetAppTitleId`; SharpProspero names `ErrorNoAppInfo` (0x80A10009) only for `sceSystemServiceGetAppFocusedAppStatus`. - [sceLncUtilGetAppId, sceLncUtilIsAppLaunched, sceLncUtilGetAppIdListOfBigApp, sceSystemServiceGetAppIdListOfBigApp](../../../core/libs/prx/libSceSystemService/Export.cpp) (libSceSystemService) - only the running title answers. `sceLncUtilGetAppId` returns its app ID as `sceSystemServiceGetAppId` does, `sceLncUtilIsAppLaunched` reports it launched, and both big-app lists write its app ID as their only entry with a count of 1, because AnyPS5 runs one title and cannot start another. A null or non-9-character title ID returns -1 from `sceLncUtilGetAppId` and 0x80940005 from `sceLncUtilIsAppLaunched`, and a null output, list or count returns 0x80940005, before any request, as firmware 13.42's `libSceSystemService.sprx` does ([emulator run](https://github.com/boykopovar/AnyPS5/pull/10801#issuecomment-6403075212)). These calls answer as if the LncUtil client were initialized; for valid arguments without it, 13.42 returns 0x80940001. Another 9-character title ID and a list capacity of 0 throw: the module passes them on as a request, so whether the console reports another installed title as not launched, and what it answers for capacity 0, are unknown. The signatures are the ones the pending exports recovered @@ -112,6 +106,8 @@ - [sceCoredumpSequenceHandlerGetCoredumpStatusByAppId](../../../core/libs/prx/libSceSystemService/Export.cpp) (libSceSystemService) - unknown signature - [sceCoredumpSequenceHandlerCancelCoredump](../../../core/libs/prx/libSceSystemService/Export.cpp) (libSceSystemService) - unknown signature +- [sceShellCoreUtilGetFreeSizeOfUserPartition, sceShellCoreUtilGetFreeSizeOfAvContentsTmp](../../../core/libs/prx/libSceSystemService/PendingExports.cpp) (libSceSystemService) - the units of the sizes and what the user partition's free and total sizes measure are not measured; shadPS4 stubs both as returning OK without writing an output ([systemservice.cpp L832-L840](https://github.com/shadps4-emu/shadPS4/blob/1d8004a22feb0d5cc58828bac066018e80b6d73f/src/core/libraries/system/systemservice.cpp#L832-L840)), so no value is known and both throw through `NotImplemented_nid_no_patch` + ### Functional - [sceSystemServiceLoadExec](../../../core/libs/prx/libSceSystemService/Export.cpp) (libSceSystemService) - besides `"exit"`, it starts the title's own `/app0/eboot.bin` or another executable under `/app0` that the relinker converted with `--executable`, which is looked up beside the running one (`/app0/picker/picker.bin` as `picker.picker.bin` with the running executable's extension). The main executable is the one `APS5_EBOOT` names, which the first call sets to its own path. After the guest shutdown the old process ends without running guest exit handlers or host destructors; as during `exit`, a guest thread that calls a library the shutdown has stopped waits for the end instead of unwinding. `"exit"` ends the process after the host shutdown without running the title's `atexit` and `__cxa_atexit` handlers, since the console's shell closes the title instead; a line the title writes just before through its own thread, such as a forwarded standard error line, may not be printed. [VLC for PS5](https://github.com/ZiZc3/VLC/blob/86bb7d474a303f62bb3c2fc12f728db4846085b8/src/platform_ps5.c#L565-L571) (PPSA85300) relaunches itself with no arguments; RetroArch (PPSA99169) starts its frontend picker with `{"", NULL}`, and the picker starts `eboot.bin` with `{"--ps5-mode=retroarch", NULL}` or `/app0/es-de/es-de.bin` ([picker.cpp](https://github.com/mihawk-99/PS5_RetroArch/blob/bead80725cc11e3c5c65bd9424b0a4494ae36d45/frontends/picker/picker.cpp#L444-L446)), so the list holds only arguments. A list with a first entry becomes the whole guest `argv`, with no program name in front ([LoadExec.cpp](../../../core/libs/prx/libSceSystemService/LoadExec.cpp)): a [PS5 RetroArch console transcript](https://github.com/mihawk-99/PS5_RetroArch/blob/bead80725cc11e3c5c65bd9424b0a4494ae36d45/evidence/loadexec-second-image/relaunch-test.jsonl) records a restart with one argument entering with `argc=1`, `argv[0]="--ps5-relaunch=1"`, and a launch from the home screen with `argc=1`, `argv[0]=""` ([relaunch_ps5.cpp](https://github.com/mihawk-99/PS5_RetroArch/blob/bead80725cc11e3c5c65bd9424b0a4494ae36d45/src/relaunch_ps5.cpp#L161-L164)). For such a list Linux replaces the process with `fexecve`, and macOS with `posix_spawn` and `POSIX_SPAWN_SETEXEC`: the PID and the standard streams stay, the other descriptors are closed and the working directory becomes the executable's. Windows starts a suspended process that inherits only the standard streams and a handle of the old process, and its entry stub waits for the old process to end before it loads the title's libraries, so a shell or script that started the title sees it end. A null list or one without a first entry keeps the earlier launch: the new executable gets only its own path as its command line (`CreateProcessW` on Windows, `execv` on Linux and macOS), so its `argv[0]` is the host path, and the old process ends without waiting for it. What the console passes for such a list is not known, nor are its argument limits and error codes. Paths outside `/app0` and unconverted executables throw @@ -145,9 +141,10 @@ - [ShellCoreUtil dialog parameters](../../../core/libs/prx/libSceSystemService/PendingExports.cpp): the 24-byte error-dialog parameter contains a message pointer at offset zero, a null-terminated vector of string arguments at offset eight and a byte flag at offset 16. Field offsets and size are asserted; the flag meaning remains unresolved. Start/stop streaming-game and unmount requests take strings. Bus-transfer testing writes one byte after a string input. -- [SystemService activation and process signatures](../../../core/libs/prx/libSceSystemService/PendingExports.cpp): activation wrappers validate a machine-sized handle and expose 32-bit status/result outputs or a byte activation flag. Shell activation initialization also receives a type selector; managed callers confirm the machine-sized handle consumed by constant-return start/abort/terminate exports. SystemService local-process parameters differ from LncUtil parameters and are kept as distinct types; general creation reads through offset 71, JVM/PS2 creation reads two 32-bit fields at offsets four and eight. Install status writes 12 bytes and application status writes 16 bytes; their remaining field meanings are unresolved. +- [Codec activation](../../../core/libs/prx/libSceSystemService/PendingExports.cpp): the `sceShellCoreUtilActivate*` calls and the HEVC, HEVC soft and MPEG-2 `sceSystemServiceActivate*` wrappers follow firmware 13.42's libSceSystemService, read from disassembly, not measured on a console. There they ask no other process: initialization hands out handles counted from 0x1000 in steps of 4, shared by every codec; the status is always 2 with result 0; a codec always reads as activated; start, abort, terminate and recording return 0. The wrappers return 0x80A10003 for a null handle or output, the shell calls 0x80E30005 for a null output. The name of status 2 and whether older firmware asked the shell are unknown. +- [SystemService process signatures](../../../core/libs/prx/libSceSystemService/PendingExports.cpp): SystemService local-process parameters differ from LncUtil parameters and are kept as distinct types; general creation reads through offset 71, JVM/PS2 creation reads two 32-bit fields at offsets four and eight. Install status writes 12 bytes and application status writes 16 bytes; their remaining field meanings are unresolved. -- [SystemService query payloads](../../../core/libs/prx/libSceSystemService/PendingExports.cpp): daemon events write 12 bytes; local-process entries occupy 36 bytes, consisting of a 32-bit value and 32-byte name. PS-button extraction reads a 16-byte event and rearranges its fields into a distinct 16-byte output; semantic names remain unresolved. Privacy definition/version queries take string keys and distinct output types; their layouts remain unresolved. Workaround information writes four bytes at offset zero and 16 bytes at offset eight. +- [SystemService query payloads](../../../core/libs/prx/libSceSystemService/PendingExports.cpp): daemon events write 12 bytes; local-process entries occupy 36 bytes, consisting of a 32-bit value and 32-byte name. `sceSystemServiceGetPSButtonEvent` follows firmware 13.42 (read from disassembly, not measured): it accepts only event types 0x20000001 and 0x20000002 and copies the first 12 data bytes into a 16-byte output in another order. What the two types and the copied values mean is unknown, so the output fields are named after the event bytes they come from. Privacy definition/version queries take string keys and distinct output types; their layouts remain unresolved. Workaround information writes four bytes at offset zero and 16 bytes at offset eight. - [SystemService direct aliases](../../../core/libs/prx/libSceSystemService/PendingExports.cpp): assembly-only jumps now share the confirmed signatures of their LncUtil/ShellCoreUtil targets for application-ID lists, remote-play/UI status, navigation, controller-focus permissions and boolean budget/status queries. Aliases of unresolved targets still require target or caller analysis. diff --git a/docs/dev/debt/libSceSystemTts.md b/docs/dev/debt/libSceSystemTts.md index 98719b7fe6..e9bc19d219 100644 --- a/docs/dev/debt/libSceSystemTts.md +++ b/docs/dev/debt/libSceSystemTts.md @@ -1,5 +1,10 @@ # libSceSystemTts technical debt +### Additional callable exports + +- [SystemTts export `aIz2UUh6oi0`](../../../core/libs/prx/libSceSystemTts/Export.cpp) is a function record with qualifier `L#A` in older and later version-labelled modules. In both, dynamic metadata maps library ID 11 and module ID 0 to `libSceSystemTts`. Older module words are `0x08540001` and `0x03200004`; later words are `0x13590001` and `0x13600007`. The older image has seven function NIDs with sorted-LF SHA-256 `64564168e4e9e9ac73985b56e5de18ae073f1698cbdfca177c2add4b22f9323f`, using the [static ELF membership procedure](https://github.com/boykopovar/AnyPS5/pull/12367#issuecomment-6470603298). Version labels do not authenticate retail provenance, and the digest identifies the NID set only. The export name, signature and behavior are unverified; this declaration throws. + + ### Unknown function info - [sceSystemTtsConvertText, sceSystemTtsPauseResume, sceSystemTtsRepeat, sceSystemTtsWait](../../../core/libs/prx/libSceSystemTts/Export.cpp) have unknown signatures and behaviour. The parameterless `int` declarations are import-resolution placeholders, not confirmed ABI signatures, and throw through `NotImplemented_nid_no_patch`. Only the names and NIDs are established by the [13.60 export inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/bfec40deb4c47a17d7603ee2bc79aa6862c0c56b/data/firmware-13.60/libscesystemtts-8f4923bcd1.jsonl). diff --git a/docs/dev/debt/libSceTEEClient.md b/docs/dev/debt/libSceTEEClient.md index 04823e75e6..9fb36e3b99 100644 --- a/docs/dev/debt/libSceTEEClient.md +++ b/docs/dev/debt/libSceTEEClient.md @@ -3,3 +3,15 @@ ### Unknown function info - [libSceTEEClient pending exports](../../../core/libs/prx/libSceTEEClient/Export.cpp) - 10 named callable exports are listed in the [PS5 3.20 export table](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceTEEClient.c) and were cross-checked against the same module in PS5 firmware 13.60. Their signatures and behaviour are unverified; the declarations use the no-parameter unknown-signature convention and throw through `NotImplemented_nid_no_patch`. + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceTEEClient/Export.cpp) - 5 entries present in both version-labelled images are import-resolution declarations only. Neither label independently authenticates retail firmware provenance. These NIDs are absent from the pinned public 3.20 catalogue. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `H9IE7wXy3qY` | +| `Unknown` | `VaBqpbmaWpc` | +| `Unknown` | `Xn5kfzvPht4` | +| `Unknown` | `ZAJdq-IONZ4` | +| `Unknown` | `d-OLk3nvFIA` | diff --git a/docs/dev/debt/libSceTextToSpeech.md b/docs/dev/debt/libSceTextToSpeech.md index 4098de045d..cc139c6ce1 100644 --- a/docs/dev/debt/libSceTextToSpeech.md +++ b/docs/dev/debt/libSceTextToSpeech.md @@ -3,3 +3,12 @@ ### Unknown function info - [sceTextToSpeechCancelImpl, sceTextToSpeechCloseImpl, sceTextToSpeechGetStatusImpl, sceTextToSpeechInitImpl, sceTextToSpeechOpenImpl, sceTextToSpeechPauseImpl, sceTextToSpeechResumeImpl, sceTextToSpeechSpeakContinuousImpl, sceTextToSpeechSpeakImpl and sceTextToSpeechTermImpl](../../../core/libs/prx/libSceTextToSpeech/Export.cpp) (libSceTextToSpeech) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceTextToSpeech.c), but no credible prototypes were found. The declarations have no parameters solely to resolve known imports; this is not an ABI claim and callers must not call them until signatures are verified + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceTextToSpeech/Export.cpp) - 2 entries observed in the 3.20 export inventory and present in the later 13.60-labelled inventory are import-resolution declarations only. The later inventory label does not authenticate a retail firmware version. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Data exports require separate layout and ownership analysis. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `6ZLFpZLuqEk` | +| `Unknown` | `L-pHC7qtEug` | diff --git a/docs/dev/debt/libSceTtsCoreG3Bc.md b/docs/dev/debt/libSceTtsCoreG3Bc.md new file mode 100644 index 0000000000..5f75ede8ba --- /dev/null +++ b/docs/dev/debt/libSceTtsCoreG3Bc.md @@ -0,0 +1,26 @@ +# libSceTtsCoreG3Bc technical debt + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceTtsCoreG3Bc/Export.cpp) - 18 entries present in both version-labelled images are import-resolution declarations only. A public 3.20 catalogue for this library was not verified. Neither label independently authenticates retail firmware provenance. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `+b5-z8Ff4cw` | +| `Unknown` | `1scTM6aHK5I` | +| `Unknown` | `9tnCCarXqdY` | +| `Unknown` | `EmF4qOwLp5w` | +| `Unknown` | `H0VOaNk61es` | +| `Unknown` | `LQ65KkmJ48g` | +| `Unknown` | `PRmv-UzXa1w` | +| `Unknown` | `RByzVVv6e0A` | +| `Unknown` | `Sq5GSDo-Rhk` | +| `Unknown` | `V+nR+xHS2ag` | +| `Unknown` | `bapD6H6e7Yk` | +| `Unknown` | `fF3Q3LdPUtk` | +| `Unknown` | `iW0DoaHZE5Y` | +| `Unknown` | `k1-orvzQrHw` | +| `Unknown` | `lQLzsMt-6NU` | +| `Unknown` | `pacG6ffHAvU` | +| `Unknown` | `pzhkpUfnlqY` | +| `Unknown` | `stLW2n-xJ6M` | diff --git a/docs/dev/debt/libSceTtsEngine.md b/docs/dev/debt/libSceTtsEngine.md new file mode 100644 index 0000000000..423630b756 --- /dev/null +++ b/docs/dev/debt/libSceTtsEngine.md @@ -0,0 +1,5 @@ +# libSceTtsEngine technical debt + +### Unknown function info + +- [11 exports (2 without a known name, bound by NID)](../../../core/libs/prx/libSceTtsEngine/Export.cpp) (libSceTtsEngine) - every function export of `libSceTtsEngine.sprx` from the firmware 13.60 export table, names from aerolib.csv only where `tools/nid_names.py` `compute_nid` reproduces the NID. Signatures, parameter layouts and behaviour are unknown; every export throws through `NotImplemented_nid_no_patch` diff --git a/docs/dev/debt/libSceUgcBgUploaderClient.md b/docs/dev/debt/libSceUgcBgUploaderClient.md new file mode 100644 index 0000000000..97c0f0e9ee --- /dev/null +++ b/docs/dev/debt/libSceUgcBgUploaderClient.md @@ -0,0 +1,5 @@ +# libSceUgcBgUploaderClient technical debt + +### Unknown function info + +- [14 exports (14 without a known name, bound by NID)](../../../core/libs/prx/libSceUgcBgUploaderClient/Export.cpp) (libSceUgcBgUploaderClient) - every function export of `libSceUgcBgUploaderClient.sprx` from the firmware 13.60 export table, names from aerolib.csv only where `tools/nid_names.py` `compute_nid` reproduces the NID. Signatures, parameter layouts and behaviour are unknown; every export throws through `NotImplemented_nid_no_patch` diff --git a/docs/dev/debt/libSceUgcServiceS3.md b/docs/dev/debt/libSceUgcServiceS3.md new file mode 100644 index 0000000000..e1237ea1e3 --- /dev/null +++ b/docs/dev/debt/libSceUgcServiceS3.md @@ -0,0 +1,5 @@ +# libSceUgcServiceS3 technical debt + +### Unknown function info + +- [14 exports (10 without a known name, bound by NID)](../../../core/libs/prx/libSceUgcServiceS3/Export.cpp) (libSceUgcServiceS3) - every function export of `libSceUgcServiceS3.sprx` from the firmware 13.60 export table, names from aerolib.csv only where `tools/nid_names.py` `compute_nid` reproduces the NID. Signatures, parameter layouts and behaviour are unknown; every export throws through `NotImplemented_nid_no_patch` diff --git a/docs/dev/debt/libSceUsbStorage.md b/docs/dev/debt/libSceUsbStorage.md index 3685d4263e..27518d7009 100644 --- a/docs/dev/debt/libSceUsbStorage.md +++ b/docs/dev/debt/libSceUsbStorage.md @@ -22,3 +22,33 @@ - [the getdents scan](../../../core/libs/prx/libSceUsbStorage/Export.cpp) (libSceUsbStorage) - `sceUsbStorageGetdentsOpen` lists the root of the device into descriptors numbered from 1 with a 0x8000-byte buffer size, skipping names that start with a dot, and `sceUsbStorageGetdentsRead` writes shadPS4's [packed dirent](https://github.com/shadps4-emu/shadPS4/blob/f68923fe807f657348e6719ce658bcbd0a2b1c72/src/core/libraries/usbd/usbstorage.cpp#L290-L376) (u32 file number from 1, u16 record length rounded to 8, type 4 for a directory and 8 otherwise, u8 name length, NUL-terminated name) until the buffer is full and zero bytes at the end. A name longer than 255 bytes, a host listing error and a buffer too small for the next record throw where shadPS4 truncates, ignores or answers zero bytes. None of this is measured on a console. Closes when: measured on a PS5 - [the argument validation](../../../core/libs/prx/libSceUsbStorage/Export.cpp) (libSceUsbStorage) - the null-pointer, null-callback, event-type and null-directory refusals with 0x80f40002, the answers 0x80f40004 for a device that is not attached, and the getdents read of a descriptor that is not open answering 0x80f40005 with zero bytes, follow [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/f68923fe807f657348e6719ce658bcbd0a2b1c72/src/core/libraries/usbd/usbstorage.cpp#L176-L383); the validation runs before the markers the exports keep above. None of this is measured on a console. - [the prototypes of sceUsbStorageRequestMap and sceUsbStorageGetDeviceList](../../../core/libs/prx/libSceUsbStorage/Export.cpp) (libSceUsbStorage) - the signatures follow the ABI restored on `main` (the firmware-database sweep of 2026-10-21), which matches [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/f68923fe807f657348e6719ce658bcbd0a2b1c72/src/core/libraries/usbd/usbstorage.cpp#L176-L383): `RequestMap`'s six parameters, the typed `UsbStorageCallback` of the register/unregister family, `IsExist`'s three-argument bool form and `GetDeviceList`'s `std::int32_t*` count (the count also follows [SharpProspero](https://github.com/SvenGDK/SharpProspero/blob/5dfdb4b0b166e83dc9ae275001afb695f12c7174/src/SharpProspero/Platform/UsbStorage.cs#L233-L235), whose earlier eight-parameter `RequestMap` reading carried the trailing reserved pair the restored ABI drops). + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceUsbStorage/Export.cpp) - 23 entries present in both version-labelled images are import-resolution declarations only. None is listed in the pinned public 3.20 catalogue for this library. Neither label independently authenticates retail firmware provenance. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Data exports require separate layout and ownership analysis. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `267oD-IF+8k` | +| `Unknown` | `96s31EeG0LM` | +| `Unknown` | `AIyv-u-8w0s` | +| `Unknown` | `FhdRv3K4EMQ` | +| `Unknown` | `H6axEciG5Gw` | +| `Unknown` | `IgVY6sHaVuE` | +| `Unknown` | `O6+fXKZS62g` | +| `Unknown` | `OhsV6P0FD5A` | +| `Unknown` | `PsB2k0hnCRo` | +| `Unknown` | `W+CjjL0iEmU` | +| `Unknown` | `W5e8Vxa9OCI` | +| `Unknown` | `W6xoHROgu6w` | +| `Unknown` | `XMDFDnkOilA` | +| `Unknown` | `d5QHvMfsCx0` | +| `Unknown` | `dVQFgpSzA2I` | +| `Unknown` | `jjKZ79juYfE` | +| `Unknown` | `jl++fwrnXXI` | +| `Unknown` | `jpS2TJZhsRU` | +| `Unknown` | `jqw6RT84rQI` | +| `Unknown` | `kzxjYuKrhv0` | +| `Unknown` | `rZgSodboauI` | +| `Unknown` | `uXZqnG02MiM` | +| `Unknown` | `yct-absP9LM` | diff --git a/docs/dev/debt/libSceUserService.md b/docs/dev/debt/libSceUserService.md index c8320c397b..02816f549f 100644 --- a/docs/dev/debt/libSceUserService.md +++ b/docs/dev/debt/libSceUserService.md @@ -1,8 +1,54 @@ # libSceUserService technical debt +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceUserService/InventoryExports.cpp) - 36 entries present in both version-labelled images are import-resolution declarations only. Neither label independently authenticates retail firmware provenance. None of these NIDs appears in the pinned public 3.20 catalogue for this library. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Data exports require separate layout and ownership analysis. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `sceUserServiceGetPartyChatTranscriptionVoiceType` | `Ebq9pcMYrko` | +| `sceUserServiceSetVoiceAgentEnableByButton` | `Jz06XYyyqGE` | +| `Unknown` | `-JCFmPNhxY8` | +| `Unknown` | `-dkPbHlL9O8` | +| `Unknown` | `-o+vKoB+bIw` | +| `Unknown` | `0rgUYD57RHc` | +| `Unknown` | `1b1BuBizZ2Q` | +| `Unknown` | `1fV-P4lyYAM` | +| `Unknown` | `6Qsib4RLbFw` | +| `Unknown` | `6erDJ4-MGCs` | +| `Unknown` | `A-wBTL+Cs5A` | +| `Unknown` | `BdzmN4JP3JM` | +| `Unknown` | `Bx+ESDBWJm4` | +| `Unknown` | `Cqt7pJZRKLI` | +| `Unknown` | `D5lYX9Wm7PI` | +| `Unknown` | `DL6cKVeISqs` | +| `Unknown` | `ErTMkmSho4E` | +| `Unknown` | `GbRykQBfmM8` | +| `Unknown` | `JD766DzZIIU` | +| `Unknown` | `L9NSPGwLZTQ` | +| `Unknown` | `PBJH7EFon8c` | +| `Unknown` | `UKInJ0LzusI` | +| `Unknown` | `WGYLbMB95kM` | +| `Unknown` | `YZwUXHtKrXI` | +| `Unknown` | `fPmaQlxVoqI` | +| `Unknown` | `hKzuaakSOLE` | +| `Unknown` | `iRkGgbFAhcw` | +| `Unknown` | `isbcQWjV-qU` | +| `Unknown` | `keFAPHk6pIc` | +| `Unknown` | `oF3Ygwz32Bs` | +| `Unknown` | `pfgU0SxMMxw` | +| `Unknown` | `pr3J39r9ArQ` | +| `Unknown` | `shuQwNy79HM` | +| `Unknown` | `tPbEIE0wYCM` | +| `Unknown` | `u5SR3+a0lTw` | +| `Unknown` | `ys8aAGjUads` | + ### Unknown function info +- [sceUserServiceGetLoginUserIdList and sceUserServiceGetEvent for user 0](../../../core/libs/prx/libSceUserService/Export.cpp) (libSceUserService) - under ANYPS5_PAD_PORT0_STATE=controller user 0 logs out when its controller is removed and logs in when it returns, after a hold of 500 ms that AnyPS5 chooses. Whether the console logs the initial user out on controller removal, how long it takes and which event it sends are not measured. The default mode keeps user 0 logged in as before. - [sceUserServiceGetNpAccountId](../../../core/libs/prx/libSceUserService/Export.cpp) (libSceUserService) - the account id for a logged-in user with no linked PSN account is assumed to be 0 with success; libSceNpManager's `sceNpGetAccountIdA` answers the same question with `SCE_NP_ERROR_SIGNED_OUT`. Console measurement on PS4 Pro firmware 10.71 confirms a user that is not logged in returns `0x80960105` (`USER_SERVICE_ERROR_UNKNOWN_USER`) and leaves the output untouched, differing from `sceUserServiceGetUserName`. +- [Older settings exports](../../../core/libs/prx/libSceUserService/LegacyExports.cpp) - Forty callable NIDs are declared as throwing placeholders for older software. Their signatures and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. The corresponding NIDs are absent from the later version-labelled inventory. Representative later settings functions use a related dispatch pattern, which does not establish compatibility for these settings. No functionality is implemented. + - [sceUserServiceInitialize and sceUserServiceInitialize2](../../../core/libs/prx/libSceUserService/Export.cpp) (libSceUserService) - event delivery has no background service thread, so the confirmed priority and Initialize2 CPU affinity mask do not affect host scheduling. Of 23 `sceUserServiceInitialize` calls in ten titles checked, 17 pass no param, four pass priority 700 (Borderlands 4 PPSA01494, Crimson Desert PPSA25286, MXGP 26 PPSA30839, Super Meat Boy 3D PPSA31162), one passes 767 (Ghost of Tsushima PPSA02225) and one in Metal Gear Solid 4's `mgs4.elf` passes a param from a register. None calls `sceUserServiceInitialize2`. - [sceUserServiceGetUserColor](../../../core/libs/prx/libSceUserService/Export.cpp) (libSceUserService) - the profile colour corresponds to user index (0: blue, 1: red, 2: green, 3: pink); colours 1, 2 and 3 are assumed, not measured - [sceUserServiceGetUserName](../../../core/libs/prx/libSceUserService/Export.cpp) (libSceUserService) - `0x80960105`, which a PS5 (firmware 13.60) returns for a user id it does not know, has no known name; it is `USER_SERVICE_ERROR_UNKNOWN_USER` here. On the console a registered user who is not logged in still gets their name; here up to 4 users ("Player", "Player2", "Player3", "Player4") are supported; user names "Player2", "Player3" and "Player4" are assumed, not measured diff --git a/docs/dev/debt/libSceVdecShevc.md b/docs/dev/debt/libSceVdecShevc.md index 0413883bb5..06785045aa 100644 --- a/docs/dev/debt/libSceVdecShevc.md +++ b/docs/dev/debt/libSceVdecShevc.md @@ -3,3 +3,16 @@ ### Unknown function info - [sceSdecCreateSwHevc, sceSdecDestroySwHevc, sceSdecExecuteSwHevc, sceSdecGetFrameSwHevc, sceSdecGetVersionSwHevc, sceSdecQueryMemorySwHevc and sceSdecResetSwHevc](../../../core/libs/prx/libSceVdecShevc/Export.cpp) (libSceVdecShevc) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceVdecShevc.c), but no credible prototypes were found. The declarations have no parameters solely to resolve known imports; this is not an ABI claim and callers must not call them until signatures are verified + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceVdecShevc/Export.cpp) - 6 entries present in both version-labelled images are import-resolution declarations only. Neither label independently authenticates retail firmware provenance. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Data exports require separate layout and ownership analysis. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `79qqGAVnWfA` | +| `Unknown` | `PTO17yTeoSk` | +| `Unknown` | `hZXstu74B4I` | +| `Unknown` | `lLaAHswK1zQ` | +| `Unknown` | `wvq+GPpswaw` | +| `Unknown` | `xbRElcEVmdM` | diff --git a/docs/dev/debt/libSceVdecSvp9.md b/docs/dev/debt/libSceVdecSvp9.md new file mode 100644 index 0000000000..8b0d835795 --- /dev/null +++ b/docs/dev/debt/libSceVdecSvp9.md @@ -0,0 +1,19 @@ +# libSceVdecSvp9 technical debt + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceVdecSvp9/Export.cpp) - 11 entries observed in the 3.20 export inventory and present in the later 13.60-labelled inventory are import-resolution declarations only. The later inventory label does not authenticate a retail firmware version. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `2dO21ExX5hM` | +| `Unknown` | `33wXf5Ne2xc` | +| `Unknown` | `BFFONbbPMXw` | +| `Unknown` | `JawAvxR7M+k` | +| `Unknown` | `RuWQMaRBlEs` | +| `Unknown` | `VGbdvyOsLzg` | +| `Unknown` | `VmDqnxqvIFg` | +| `Unknown` | `gktyGB+7-go` | +| `Unknown` | `hWezRodOVBI` | +| `Unknown` | `kUyX8iOM0E4` | +| `Unknown` | `x+HO8XFm6io` | diff --git a/docs/dev/debt/libSceVenc.md b/docs/dev/debt/libSceVenc.md index d56e25f7e5..ff9adb9999 100644 --- a/docs/dev/debt/libSceVenc.md +++ b/docs/dev/debt/libSceVenc.md @@ -4,3 +4,15 @@ - [sceVencCreateEncoder, sceVencDeleteEncoder, sceVencGetConfig, sceVencMapMemory, sceVencQueryHeader, sceVencQueryMemorySize, sceVencQueryPreset, sceVencSetConfig, sceVencSetDecodedFrame, sceVencSetPictureConfig, sceVencSetRateControlConfig, sceVencSetReferenceFrameInvalidationConfig, sceVencStartEncode and sceVencStopEncode](../../../core/libs/prx/libSceVenc/Export.cpp) (libSceVenc) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceVenc.c), but no credible prototypes were found. The declarations have no parameters solely to resolve known imports; this is not an ABI claim and callers must not call them until signatures are verified - [sceVencGetHeader, sceVencSetNormalPrivacyProtectionConfig, sceVencSetImagePasteConfig, sceVencQueryPreset2, sceVencSetCodecConfig](../../../core/libs/prx/libSceVenc/Export.cpp) have unknown signatures and behaviour. The parameterless `int` declarations are import-resolution placeholders, not confirmed ABI signatures, and every call throws through `NotImplemented_nid_no_patch`. Only the names and NIDs are established by the [13.60 export inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/bfec40deb4c47a17d7603ee2bc79aa6862c0c56b/data/firmware-13.60/libscevenc-34ac5b7cbe.jsonl). + +### Additional callable exports + + +- [Additional callable exports](../../../core/libs/prx/libSceVenc/Export.cpp) - 4 entries observed in the 3.20 export inventory and present in the later 13.60-labelled inventory are import-resolution declarations only. The later inventory label does not authenticate a retail firmware version. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Data exports require separate layout and ownership analysis. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `sceVencUnmapMemory` | `i5yjeSwjlAY` | +| `Unknown` | `6nGfjRPqCUM` | +| `Unknown` | `B5iyzWMm+DY` | +| `Unknown` | `Vm5uPoERWmg` | diff --git a/docs/dev/debt/libSceVideoNativeExtEssential.md b/docs/dev/debt/libSceVideoNativeExtEssential.md index f332e1ccbd..813235f9e6 100644 --- a/docs/dev/debt/libSceVideoNativeExtEssential.md +++ b/docs/dev/debt/libSceVideoNativeExtEssential.md @@ -1,5 +1,10 @@ # libSceVideoNativeExtEssential technical debt +### Additional callable exports + +- [Native video export `iwAQhvb9BvY`](../../../core/libs/prx/libSceVideoNativeExtEssential/Export.cpp) is a function record with qualifier `K#A` in older and later version-labelled modules. Both map library ID 10 and module ID 0 to `libSceVideoNativeExtEssential`. Older module words: `0x08540001`, `0x03200004`; later: `0x13590001`, `0x13600007`. Both contain six function NIDs; sorted-LF SHA-256: `2c1bdced348433c9cb792b70a0f043d932e6f822157250d5256bb46c8867bd86`, using the [static ELF membership procedure](https://github.com/boykopovar/AnyPS5/pull/12367#issuecomment-6470603298). Labels do not authenticate retail provenance; the digest identifies the NID set only. Independent verification requires a matching image. The export name, signature and behavior are unverified; this declaration throws. + + ### Unknown function info - [sceVideoNativeExtEssential_CreateDecInstance, sceVideoNativeExtEssential_DestroyDecInstance, sceVideoNativeExtEssential_Finalize, sceVideoNativeExtEssential_Initialize and sceVideoNativeExtEssential_IsInit](../../../core/libs/prx/libSceVideoNativeExtEssential/Export.cpp) (libSceVideoNativeExtEssential) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceVideoNativeExtEssential.c), but no credible prototypes were found. The declarations have no parameters solely to resolve known imports; this is not an ABI claim and callers must not call them until signatures are verified diff --git a/docs/dev/debt/libSceVideoOut.md b/docs/dev/debt/libSceVideoOut.md index 54fb0dcaee..32536ce84e 100644 --- a/docs/dev/debt/libSceVideoOut.md +++ b/docs/dev/debt/libSceVideoOut.md @@ -47,6 +47,8 @@ - The following pending declarations have unverified signatures and behavior; they are parameterless import-resolution declarations and throw through `NotImplemented_nid_no_patch`: [`sceDbgVideoOutAddOutputModeVr60Privilege`](../../../core/libs/prx/libSceVideoOut/Unimplemented.cpp). +- [ANYPS5_PAD_PORT0_STATE](../../../core/libs/prx/libSceVideoOut/include/Port0Presence.hpp) (libSceVideoOut) - the 500 ms hold before a controller's removal or return changes port 0, and the rule that keyboard and mouse input reaches port 0 only while a controller is bound there, are AnyPS5 choices that keep a flapping cable from flapping the title. The console's own reaction (how long it takes to report a removed pad, whether it pauses on connected false, and whether it logs the initial user out) is not measured. + ### Additional callable exports - The [revision-pinned identity inventory](https://gist.github.com/kyon-eth/ea0a096e6231dbe7b98b5a308e2ac91e/00f8422a1ae71e32816d72ae579c2f2d097f63a0) records module, logical library, symbol type and NIDs for [InventoryExports.cpp](../../../core/libs/prx/libSceVideoOut/InventoryExports.cpp); it is a metadata summary rather than independent verification. Some NIDs belong to multiple logical libraries within the module. @@ -237,3 +239,7 @@ | `Unknown` | `yGMBA0AKcgQ` | | `Unknown` | `yoK0AjkkBkI` | | `Unknown` | `ys239q8VgXY` | + +- [sceVideoOutSetConfigurationMode](../../../core/libs/prx/libSceVideoOut/InventoryExports.cpp): the name hashes to NID `N1+j0RymMUQ`, a function export in both older and later version-labelled images. Its signature and behavior are unverified; this import-resolution declaration throws. + +- [Older callable NIDs](../../../core/libs/prx/libSceVideoOut/InventoryExports.cpp): 7 unidentified exports have unverified names, signatures and behavior. These are throwing import-resolution placeholders; no functionality is implemented. No matching NIDs were found in the later module inventory. Six use the primary library qualifier and one uses the nosubmission qualifier; qualified guest import resolution is unverified. diff --git a/docs/dev/debt/libSceVideoOutSecondary.md b/docs/dev/debt/libSceVideoOutSecondary.md new file mode 100644 index 0000000000..06faf1cd37 --- /dev/null +++ b/docs/dev/debt/libSceVideoOutSecondary.md @@ -0,0 +1,10 @@ +# libSceVideoOutSecondary technical debt + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceVideoOutSecondary/Export.cpp) - Two entries observed in the 3.20 export inventory and present in the later 13.60-labelled inventory are import-resolution declarations only. The later inventory label does not authenticate a retail firmware version. Names, parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Both entries throw through `NotImplemented_nid_no_patch`. No runtime functionality is implemented. + +| Name | NID | +| --- | --- | +| `Unknown` | `KJWkt9y7YC4` | +| `Unknown` | `s+isXKLpwS0` | diff --git a/docs/dev/debt/libSceVideoStreamingEngineAudioOnly.md b/docs/dev/debt/libSceVideoStreamingEngineAudioOnly.md new file mode 100644 index 0000000000..c5b7f3ebea --- /dev/null +++ b/docs/dev/debt/libSceVideoStreamingEngineAudioOnly.md @@ -0,0 +1,6 @@ +# libSceVideoStreamingEngineAudioOnly technical debt + +### Unknown function info + +- [4 exports (4 without a known name, bound by NID)](../../../core/libs/prx/libSceVideoStreamingEngineAudioOnly/Export.cpp) (libSceVideoStreamingEngineAudioOnly) - the function exports of `libSceVideoStreamingEngineAudioOnly.sprx` that no other library defines from the firmware 13.60 export table, names from aerolib.csv only where `tools/nid_names.py` `compute_nid` reproduces the NID. Signatures, parameter layouts and behaviour are unknown; every export throws through `NotImplemented_nid_no_patch` +- [70 shared exports](../../../core/libs/prx/libSceVideoStreamingEngineAudioOnly/Export.cpp) (libSceVideoStreamingEngineAudioOnly) - the other 70 function exports of `libSceVideoStreamingEngineAudioOnly.sprx` have the NIDs of exports already in libSceVideoStreamingEngine, so they are not defined again here diff --git a/docs/dev/debt/libSceVisionManager.md b/docs/dev/debt/libSceVisionManager.md index f8f41d421e..f75a2c52e1 100644 --- a/docs/dev/debt/libSceVisionManager.md +++ b/docs/dev/debt/libSceVisionManager.md @@ -3,3 +3,17 @@ ### Unknown function info - [sceVisionManagerApplyCalibrateHmdResult, sceVisionManagerCancelRequest, sceVisionManagerFinalize, sceVisionManagerGenerateRegisterUserData, sceVisionManagerGenerateRegisterUserDataFinalize, sceVisionManagerGenerateRegisterUserDataInitialize, sceVisionManagerGetCalibrateTrackingLedInfo, sceVisionManagerGetCalibrateTrackingLedNecessity, sceVisionManagerGetHitCountOfRegisterUserData, sceVisionManagerGetLibraryVersion, sceVisionManagerGetNumOfRegisterUserDataSlot, sceVisionManagerGetRegisterUserDataSize, sceVisionManagerGetRegisterUserDataVersion, sceVisionManagerGetResultOfCalibrateHmd, sceVisionManagerGetResultOfCalibrateStereoCamera, sceVisionManagerGetResultOfCalibrateTrackingLed, sceVisionManagerGetResultOfFindFace, sceVisionManagerGetResultOfFindPad, sceVisionManagerGetResultOfFindPadCorrespondRegion, sceVisionManagerGetStoreCameraImgYPtr, sceVisionManagerGetWorkingMemorySize, sceVisionManagerInitialize, sceVisionManagerRegistryClear, sceVisionManagerRequestCalibrateHmd, sceVisionManagerRequestCalibrateStereoCamera, sceVisionManagerRequestCalibrateTrackingLed, sceVisionManagerRequestClose, sceVisionManagerRequestFindFace, sceVisionManagerRequestFindPad, sceVisionManagerRequestFindPadCorrespondRegion, sceVisionManagerRequestHeadDetection, sceVisionManagerRequestInitializeRegisterUserData, sceVisionManagerRequestOpen, sceVisionManagerRequestPadTracking, sceVisionManagerRequestRecogUtility, sceVisionManagerRequestStoreCameraImgY, sceVisionManagerSetCallbackForUpdateCalibrateHmdResult, sceVisionManagerSetCallbackForUpdateCalibrateStereoCameraResult, sceVisionManagerSetCallbackForUpdateCalibrateTrackingLedResult, sceVisionManagerSetCallbackForUpdateCameraFrame, sceVisionManagerSetCallbackForUpdateCtrlCore, sceVisionManagerSetCallbackForUpdateRecog, sceVisionManagerSetCallbackForUpdateRunningStatus, sceVisionManagerSetCallbackForUpdateStoreFrame and sceVisionManagerWaitResponse](../../../core/libs/prx/libSceVisionManager/Export.cpp) (libSceVisionManager) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceVisionManager.c), but no credible prototypes were found. The declarations have no parameters solely to resolve known imports; this is not an ABI claim and callers must not call them until signatures are verified + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceVisionManager/Export.cpp) - 7 entries present in both version-labelled images are import-resolution declarations only. Neither label independently authenticates retail firmware provenance. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `-R5dI6KjYpY` | +| `Unknown` | `0chNZ7GKUO0` | +| `Unknown` | `9gGQMrf6sWg` | +| `Unknown` | `ORAn12NcHYs` | +| `Unknown` | `YQiB-svtbcc` | +| `Unknown` | `dzN0VRFvA84` | +| `Unknown` | `wu4afKNlup4` | diff --git a/docs/dev/debt/libSceVnaWebsocket.md b/docs/dev/debt/libSceVnaWebsocket.md new file mode 100644 index 0000000000..1802fcabc3 --- /dev/null +++ b/docs/dev/debt/libSceVnaWebsocket.md @@ -0,0 +1,30 @@ +# libSceVnaWebsocket technical debt + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceVnaWebsocket/Export.cpp) - 22 entries present in both version-labelled images are import-resolution declarations only. None is listed in the pinned public 3.20 catalogue for this library. Neither label independently authenticates retail firmware provenance. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unknown names use literal NID aliases. One data export is outside this callable inventory and requires separate layout and ownership analysis. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `-IDFERYOJPs` | +| `Unknown` | `8KzE01OyRog` | +| `Unknown` | `94G0OCEujjA` | +| `Unknown` | `Bw0-YBkPNm4` | +| `Unknown` | `DP4477brt60` | +| `Unknown` | `J3fL2giuM+0` | +| `Unknown` | `J8-VXNQySz0` | +| `Unknown` | `JiBSw3cBh2g` | +| `Unknown` | `K-logS9LtFw` | +| `Unknown` | `KGPZ+BZgXn0` | +| `Unknown` | `MI6xIf-bHXs` | +| `Unknown` | `NS+C+w391Aw` | +| `Unknown` | `OUogBgTPp6E` | +| `Unknown` | `PPt1uQ9zOb8` | +| `Unknown` | `T4s2VWpD9-g` | +| `Unknown` | `es11O5Z1er4` | +| `Unknown` | `fxgYzL5aGyw` | +| `Unknown` | `hSnmIgcBCMk` | +| `Unknown` | `jtTGYZXUOqE` | +| `Unknown` | `obO4IYwAPtg` | +| `Unknown` | `qUkQKyPORE8` | +| `Unknown` | `t534VXlYZI8` | diff --git a/docs/dev/debt/libSceVoiceChat.md b/docs/dev/debt/libSceVoiceChat.md index bf7419e63f..8b292707d9 100644 --- a/docs/dev/debt/libSceVoiceChat.md +++ b/docs/dev/debt/libSceVoiceChat.md @@ -8,5 +8,5 @@ ### Unknown function info -- [sceVoiceChatAbortRequest, sceVoiceChatGetActiveChannel, sceVoiceChatGetChannelMemberActiveChannelMatchingState, sceVoiceChatGetChannelMemberVoiceConnectionState, sceVoiceChatGetChatChannelMemberInfoList, sceVoiceChatGetChatGroupMemberInfoList, sceVoiceChatGetMicState, sceVoiceChatGetUserVoiceVolumeGain, sceVoiceChatRegisterChannelEventHandler, sceVoiceChatRegisterDaemonEventHandler, sceVoiceChatRegisterMemberEventHandler, sceVoiceChatRegisterPartyUserStateChangedHandler, sceVoiceChatRegisterVoiceEventHandler, sceVoiceChatRequest0, sceVoiceChatRequest1, sceVoiceChatRequestAcsTts, sceVoiceChatRequestAction, sceVoiceChatRequestSetMemberVolume, sceVoiceChatRequestUpdateGameSessionVoiceChatChannelName, sceVoiceChatRequestUpdatePlayerSessionVoiceChatChannelName, sceVoiceChatSetUserVoiceVolumeGain, sceVoiceChatStartAccessibilityEvent, sceVoiceChatStartChannelEvent, sceVoiceChatStartDaemonEvent, sceVoiceChatStartMemberEvent, sceVoiceChatStartRangedMemberEvent, sceVoiceChatStartVoiceEvent, sceVoiceChatStopAccessibilityEvent, sceVoiceChatStopChannelEvent, sceVoiceChatStopDaemonEvent, sceVoiceChatStopMemberEvent, sceVoiceChatStopRangedMemberEvent, sceVoiceChatStopVoiceEvent, sceVoiceChatUnregisterAccessibilityEventHandler, sceVoiceChatUnregisterChannelEventHandler, sceVoiceChatUnregisterDaemonEventHandler, sceVoiceChatUnregisterMemberEventHandler, sceVoiceChatUnregisterMicEventHandler, sceVoiceChatUnregisterPartyUserStateChangedHandler, sceVoiceChatUnregisterRangedMemberEventHandler, sceVoiceChatUnregisterVoiceEventHandler](../../../core/libs/prx/libSceVoiceChat/Export.cpp) (libSceVoiceChat) - parameter layouts are inferred; offline, handlers and event controls return 0, query calls, volume gain controls, and requests return `SIGNED_OUT` (0x80550006) without modifying guest buffers +- [sceVoiceChatGetActiveChannel, sceVoiceChatGetChannelMemberActiveChannelMatchingState, sceVoiceChatGetChannelMemberVoiceConnectionState, sceVoiceChatGetChatChannelMemberInfoList, sceVoiceChatGetChatGroupMemberInfoList, sceVoiceChatGetMicState, sceVoiceChatGetUserVoiceVolumeGain, sceVoiceChatRegisterChannelEventHandler, sceVoiceChatRegisterDaemonEventHandler, sceVoiceChatRegisterMemberEventHandler, sceVoiceChatRegisterPartyUserStateChangedHandler, sceVoiceChatRegisterVoiceEventHandler, sceVoiceChatRequest0, sceVoiceChatRequest1, sceVoiceChatRequestAcsTts, sceVoiceChatRequestAction, sceVoiceChatRequestSetMemberVolume, sceVoiceChatRequestUpdateGameSessionVoiceChatChannelName, sceVoiceChatRequestUpdatePlayerSessionVoiceChatChannelName, sceVoiceChatSetUserVoiceVolumeGain, sceVoiceChatStartAccessibilityEvent, sceVoiceChatStartChannelEvent, sceVoiceChatStartDaemonEvent, sceVoiceChatStartMemberEvent, sceVoiceChatStartRangedMemberEvent, sceVoiceChatStartVoiceEvent, sceVoiceChatStopAccessibilityEvent, sceVoiceChatStopChannelEvent, sceVoiceChatStopDaemonEvent, sceVoiceChatStopMemberEvent, sceVoiceChatStopRangedMemberEvent, sceVoiceChatStopVoiceEvent, sceVoiceChatUnregisterAccessibilityEventHandler, sceVoiceChatUnregisterChannelEventHandler, sceVoiceChatUnregisterDaemonEventHandler, sceVoiceChatUnregisterMemberEventHandler, sceVoiceChatUnregisterMicEventHandler, sceVoiceChatUnregisterPartyUserStateChangedHandler, sceVoiceChatUnregisterRangedMemberEventHandler, sceVoiceChatUnregisterVoiceEventHandler](../../../core/libs/prx/libSceVoiceChat/Export.cpp) (libSceVoiceChat) - parameter layouts are inferred; offline, handlers and event controls return 0, query calls, volume gain controls, and requests return `SIGNED_OUT` (0x80550006) without modifying guest buffers - [sceVoiceChatRequestCreateVoiceChatGroup, sceVoiceChatRequestJoinVoiceChatGroup, sceVoiceChatRequestLeaveVoiceChatGroup, sceVoiceChatRequestDeleteVoiceChatGroup](../../../core/libs/prx/libSceVoiceChat/Export.cpp) (libSceVoiceChat) - assumed to take a request id and two pointers like the other `sceVoiceChatRequest*` calls; offline, every argument is ignored and `SIGNED_OUT` is returned, as for those diff --git a/docs/dev/debt/libSceVrTracker.md b/docs/dev/debt/libSceVrTracker.md index a3e50959cb..68539e0350 100644 --- a/docs/dev/debt/libSceVrTracker.md +++ b/docs/dev/debt/libSceVrTracker.md @@ -11,3 +11,19 @@ ### Functional - [tracker lifecycle and devices](../../../core/libs/prx/libSceVrTracker/Export.cpp) (libSceVrTracker) - `sceVrTrackerQueryMemory`, `sceVrTrackerInit`, `sceVrTrackerTerm`, the three `sceVrTrackerRegisterDevice*` calls, `sceVrTrackerUnregisterDevice`, `sceVrTrackerRecalibrate`, `sceVrTrackerSetDurationUntilStatusNotTracking` and `sceVrTrackerGpuWaitAndCpuProcess` follow [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/a808e76/src/core/libraries/vr_tracker/vr_tracker.cpp), a PS4 implementation: its struct layouts, memory sizes, argument checks, one handle per device type and `DEVICE_NOT_REGISTERED` for an HMD recalibration. Only the 128-byte init parameter is read; the 144-byte one throws. Unlike shadPS4, the init memory ranges are not looked up, a null init parameter and negative device types are refused. Terminating keeps the registered handles, as there. With no camera there is no GPU submission, so the GPU wait returns `NOT_EXECUTE_GPU_SUBMIT`. Not measured on a PS5 + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceVrTracker/Export.cpp) - 9 entries present in both version-labelled images are import-resolution declarations only. All belong to module `libSceVrTracker`; four have logical library `libSceVrTracker` and five have logical library `libSceVrTrackerGpuTest`. Neither label independently authenticates retail firmware provenance. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `5ucmy8hcSPk` | +| `Unknown` | `9kB+RsZt84M` | +| `Unknown` | `D6TJSfjTAk4` | +| `Unknown` | `ERmwvjmfN+c` | +| `Unknown` | `KFxq-AnEL34` | +| `Unknown` | `SSi0OBa8RA0` | +| `Unknown` | `hj7zLvyw+pw` | +| `Unknown` | `mmzbIQNmT4o` | +| `Unknown` | `tNJrfYsY3wY` | diff --git a/docs/dev/debt/libSceVsePlugin.md b/docs/dev/debt/libSceVsePlugin.md new file mode 100644 index 0000000000..a7b766bd50 --- /dev/null +++ b/docs/dev/debt/libSceVsePlugin.md @@ -0,0 +1,5 @@ +# libSceVsePlugin technical debt + +### Unknown function info + +- [34 exports (34 without a known name, bound by NID)](../../../core/libs/prx/libSceVsePlugin/Export.cpp) (libSceVsePlugin) - every function export of `libSceVsePlugin.sprx` from the firmware 13.60 export table, names from aerolib.csv only where `tools/nid_names.py` `compute_nid` reproduces the NID. Signatures, parameter layouts and behaviour are unknown; every export throws through `NotImplemented_nid_no_patch` diff --git a/docs/dev/debt/libSceWebBrowserDialog.md b/docs/dev/debt/libSceWebBrowserDialog.md index ba44c2159d..4637724ad4 100644 --- a/docs/dev/debt/libSceWebBrowserDialog.md +++ b/docs/dev/debt/libSceWebBrowserDialog.md @@ -2,8 +2,17 @@ ### Silent stubs +- [sceWebBrowserDialogOpen, sceWebBrowserDialogOpenForPredeterminedContent](../../../core/libs/prx/libSceWebBrowserDialog/Export.cpp) (libSceWebBrowserDialog) - with `ANYPS5_PSN_DIALOGS=show`, a successful open shows AnyPS5's generic notice that the system feature is not available; no PlayStation Network link is claimed, since no source ties this dialog to it, and the console's own display is not measured. - [libSceWebBrowserDialog](../../../core/libs/prx/libSceWebBrowserDialog/Export.cpp) - `sceWebBrowserDialogOpen` and `sceWebBrowserDialogOpenForPredeterminedContent` run the common-dialog state machine without displaying an interactive browser, and `sceWebBrowserDialogGetResult` reports that the user cancelled. Minecraft Bedrock (PPSA17221) imports `sceWebBrowserDialogOpenForPredeterminedContent` (#5744). The 424-byte allow-list parameter and its twenty optional address pointers are validated, but address filtering is not modelled without an interactive browser. Main open-parameter validation remains incomplete. - [sceWebBrowserDialogSetCookie, sceWebBrowserDialogResetCookie](../../../core/libs/prx/libSceWebBrowserDialog/Export.cpp) (libSceWebBrowserDialog) - there is no browser cookie store. Both calls check their parameters in the same order and with the same codes as the PS5 13.60 module, then return 0 without storing or clearing anything. On the console they then forward the request to the browser service. While an opened dialog has not been updated to finished, closed or terminated, they return `0x80B80006` (the console's open-dialog flag). ### Unknown function info - [sceWebBrowserDialogGetEvent, sceWebBrowserDialogNavigate, sceWebBrowserDialogSetZoom](../../../core/libs/prx/libSceWebBrowserDialog/Export.cpp) (libSceWebBrowserDialog) - their names and NIDs are in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceWebBrowserDialog.c); the no-parameter prototypes follow [shadPS4 `webbrowserdialog.cpp`](https://github.com/shadps4-emu/shadPS4/blob/f68923fe807f657348e6719ce658bcbd0a2b1c72/src/core/libraries/web_browser_dialog/webbrowserdialog.cpp#L23-L85) and are not measured on a console. They are declared without parameters solely to resolve known imports; this is not an ABI claim, and every call throws. + +### Additional callable exports + +- [Additional callable export](../../../core/libs/prx/libSceWebBrowserDialog/Export.cpp): `8r4EJ3FiX4w#H#A` is a function record in `libSceWebBrowserDialog.sprx` from images labelled 3.20 and 13.60. The dynamic metadata maps library ID 7 to `libSceWebBrowserDialogLimited` and module ID 0 to `libSceWebBrowserDialog`. The labels do not authenticate retail firmware provenance. The name, parameter list, return type and behavior are unverified; this import-resolution placeholder throws through `NotImplemented_nid_no_patch`. + +| Name | NID | +| --- | --- | +| `Unknown` | `8r4EJ3FiX4w` | diff --git a/docs/dev/debt/libSceWebRtc.md b/docs/dev/debt/libSceWebRtc.md new file mode 100644 index 0000000000..f7aac810ce --- /dev/null +++ b/docs/dev/debt/libSceWebRtc.md @@ -0,0 +1,13 @@ +# libSceWebRtc technical debt + +### Callable exports + +- [Callable exports](../../../core/libs/prx/libSceWebRtc/Export.cpp) - 5 entries are import-resolution declarations only. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Data exports require separate layout and ownership analysis. Candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `_ZN3sce2np3rtc9TerminateEv` | `-sx0eFixkek` | +| `Unknown` | `SRJUfO0JINA` | +| `Unknown` | `Z7F8YLISPDI` | +| `Unknown` | `ZZV+i+-wetM` | +| `Unknown` | `z1bMECaLQhM` | diff --git a/docs/dev/debt/libSceWebTransport.md b/docs/dev/debt/libSceWebTransport.md new file mode 100644 index 0000000000..5f2c91626e --- /dev/null +++ b/docs/dev/debt/libSceWebTransport.md @@ -0,0 +1,5 @@ +# libSceWebTransport technical debt + +### Unknown function info + +- [53 exports (53 without a known name, bound by NID)](../../../core/libs/prx/libSceWebTransport/Export.cpp) (libSceWebTransport) - every function export of `libSceWebTransport.sprx` from the firmware 13.60 export table, names from aerolib.csv only where `tools/nid_names.py` `compute_nid` reproduces the NID. Signatures, parameter layouts and behaviour are unknown; every export throws through `NotImplemented_nid_no_patch` diff --git a/docs/dev/debt/libSceWebmParserMdrw.md b/docs/dev/debt/libSceWebmParserMdrw.md new file mode 100644 index 0000000000..12b9c83409 --- /dev/null +++ b/docs/dev/debt/libSceWebmParserMdrw.md @@ -0,0 +1,5 @@ +# libSceWebmParserMdrw technical debt + +- [Unidentified export `wVIrSj9g--M`](../../../core/libs/prx/libSceWebmParserMdrw/Export.cpp) is an import-resolution declaration that throws through `NotImplemented_nid_no_patch`. Its name, parameter list, return type and behavior are unverified; the parameterless declaration is not an ABI contract. + +- [Older callable NIDs](../../../core/libs/prx/libSceWebmParserMdrw/Export.cpp): 6 unidentified exports have unverified names, signatures and behavior. These are throwing import-resolution placeholders; no functionality is implemented. No matching NIDs were found in the later module inventory. diff --git a/docs/dev/debt/libSceXml.md b/docs/dev/debt/libSceXml.md index 165da5246f..34ee59a045 100644 --- a/docs/dev/debt/libSceXml.md +++ b/docs/dev/debt/libSceXml.md @@ -2,4 +2,8 @@ ### Known export names; ABI prototypes unverified -- The 150 `sce::Xml` exports in [Export.cpp](../../../core/libs/prx/libSceXml/Export.cpp) are present in the PS5 3.20 `libSceXml` export inventory from [PS5-3.20_Libs](https://github.com/DNNDHH/PS5-3.20_Libs). Each is named after the mangled symbol the [verified NID name database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) gives for its NID, and the NID of that name matches. Their prototypes and behavior are not established; each declaration uses the existing no-parameter import-resolution convention and throws through `NotImplemented_nid_no_patch`. The declarations do not claim an ABI or behavior. +- 107 of the 150 `sce::Xml` exports in [Export.cpp](../../../core/libs/prx/libSceXml/Export.cpp) are present in the PS5 3.20 `libSceXml` export inventory from [PS5-3.20_Libs](https://github.com/DNNDHH/PS5-3.20_Libs). Each is named after the mangled symbol the [verified NID name database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) gives for its NID, and the NID of that name matches. Their prototypes and behavior are not established; these 107 use the existing no-parameter import-resolution convention and throw through `NotImplemented_nid_no_patch`. The declarations do not claim an ABI or behavior. + +### Value types and handle constructors + +- [The `String`, `SimpleData`, `SerializeParameter`, `NodeId` and `Node` value operations and the handle constructors](../../../core/libs/prx/libSceXml/Export.cpp) (libSceXml) - follow `libSceXml.sprx` of firmware 13.60, read from disassembly, not measured on a console. `NodeId::operator void*` returns null for every `NodeId`, and the `NodeId` constructor and copies leave its padding bytes untouched. The handle constructors only clear the implementation pointer. Exports that read the objects `initialize` builds still throw, because nothing creates those objects yet: `AttributeList` `getLength` and `isAvailable`, `Document::resetStatus`, the `DocumentBuilder` and `Sax::Parser` setters, `Node(NodeId)`, and `Node` `getNodeType`, `hasChildNodes`, `hasAttributes` and `getOwnerDocument`. `Node::getAttributes` and `getChildNodes` are a bare return in the module, and the deleting `MemAllocator` destructor is `ud2`, so they still throw too. diff --git a/docs/dev/debt/libc.md b/docs/dev/debt/libc.md index 779bef0ae4..ae986ac7aa 100644 --- a/docs/dev/debt/libc.md +++ b/docs/dev/debt/libc.md @@ -116,6 +116,7 @@ - [sscanf_s and vsscanf_s](../../../core/libs/prx/libc/src/Formatting.cpp) (libc) return `EOF` when a reached conversion has a null destination, stopping before further assignments, following C11 K.3.5.3.7 and K.3.5.3.14. Earlier assignments are retained. The constraint handler is not invoked, and console behaviour is unverified. - [memmem and memccpy](../../../core/libs/prx/libc/src/Strings.cpp) (libc) - `memmem` searches for needle occurrences in memory buffers and `memccpy` copies buffers until a character match, following FreeBSD and POSIX specifications; behavior is unverified on console. Neither is exported by `libSceLibcInternal.sprx` on a PS5 (firmware 13.60), so a payload process cannot call them there. - [strtof and wcstof](../../../core/libs/prx/libc/src/Strings.cpp) (libc) round to the nearest float, where the console's `_Stof` in `libSceLibcInternal.sprx` (0x734a0) does not always: about a third of decimal inputs within a relative 2^-51 of a point halfway between two floats, and some hexadecimal inputs with more than 24 significant bits, come out one unit apart in the last place (`1e-40` is `0x1.16c3p-133` there and `0x1.16c2p-133` here). The console's own rounding is not reproduced +- [Short narrow character fields](../../../core/libs/prx/libc/src/Formatting.cpp) (libc) - on glibc-backed scan paths, `%2c` with one available input byte can return `EOF` after storing that byte, while the bundled modules in PPSA03766 and PPSA07923 count one assignment. This is a CPU-only module comparison, not a console run. - [strtof and wcstof](../../../core/libs/prx/libc/src/Strings.cpp) (libc) - `ERANGE` follows the `libc.prx` bundled with PPSA08427 (J03547016) and PPSA03671 (J03848509), both run side by side with this libc on a Linux host: a decimal input whose result is a nonzero subnormal sets it only when inexact, a hexadecimal one only when it lies below the smallest subnormal and rounds up to it, and underflow to zero and overflow set it. Both builds also take a `NAN(...)` payload in `strtof` from the sequence's leading digits (`nan(0x123)` is `0x7fc00123`, `-nan(5)` is `0xffc00005`); the sign is kept here, the payload is not. `libSceLibcInternal`'s `_Stof` differs: no `ERANGE` for hexadecimal input, a positive `nan`, and after a minus sign a failed parse is `-0.0` for a lone sign and `+0.0` before an `inf`/`nan` spelling, the reverse of `libc.prx`. Decimal `strtod` sets `ERANGE` for a nonzero subnormal in J03547016 but not in J03848509 or `libSceLibcInternal`, whose result is kept. - [operator new](../../../core/libs/prx/libc/src/StdioExtras.cpp) (libc) - the `nothrow` forms return null only for `std::bad_alloc`, where the `libc.prx` bundled with PPSA21564 (build `J03093718`) catches every exception there, so a new handler that throws anything else ends the process instead of returning null. The aligned forms throw `std::bad_alloc` for an alignment of zero or one that is not a power of two, where that binary calls `abort`. @@ -227,7 +228,7 @@ - [std::_Throw_Cpp_error](../../../core/libs/prx/libc/src/exception/StandardExceptions.cpp) (libc) follows Dinkumware `thread0.cpp` ([VC12](https://github.com/ganboing/crt.vc12/blob/f1d47126/src/thread0.cpp), [STL](https://github.com/microsoft/STL/blob/da52dc0f/stl/src/thread0.cpp)), without console verification. Codes outside 0..6 throw `std::out_of_range`, the deleting destructor throws, and STREAMS errnos absent from FreeBSD 11.4 [`errno.h`](https://github.com/freebsd/freebsd-src/blob/releng/11.4/sys/sys/errno.h) (`ENODATA`, `ENOSR`, `ENOSTR`, `ETIME`) are omitted. Codes 0..6 throw a 32-byte [VC12 `system_error`](https://github.com/ganboing/crt.vc12/blob/f1d47126/src/system_error) with FreeBSD errnos (16, 22, 3, 12, 1, 11, 35), a static `generic_category` (not `_Generic_object`), and unverified 40-byte [GuestLocale::String](../../../core/libs/prx/libc/include/GuestLocale.hpp) messages from [`syserror.cpp`](https://github.com/ganboing/crt.vc12/blob/f1d47126/src/syserror.cpp) - [std::filesystem::_Xfilesystem_error](../../../core/libs/prx/libc/src/exception/StandardExceptions.cpp) (libSceLibcInternal, implemented in libc) follows the SDK 7.00 `libc.prx` that PPSA06416 ships (`B0CeIhQty7Y` at 0x80270, `C6-7Mo5WbwU` at 0x80490), read from disassembly and not run on a console. The thrown 0x90-byte `filesystem_error` keeps this library's `runtime_error` message at 0x08, where the module keeps a `std::string` up to 0x30. The code (0x30) and the two paths (0x40, 0x68) are at the module's offsets, so its `system_error` part does not match this library's 32-byte `std::system_error`, whose code is at 16. A null message, path or category throws, where the console faults - [Call tracing](../../../core/libs/prx/libc/src/specifics/x86_64/CallTrace.cpp) (`--trace-imports`, `APS5_TRACE_CALLS`) records only the entry of a call, not its arguments or result. One process-wide ring keeps the last 65536 calls, so a busy thread pushes the others out; the reporting thread's own calls are listed only while they are still in that ring. Calls are counted per traced target; an import bound to a target already traced under another name is counted under the first name. The thunk saves the integer argument registers and `xmm0` to `xmm7`; wider vector arguments survive only while the recording code avoids AVX, which is untested. Linux and macOS have no crash report, so they print the trace only on `SIGABRT` (guest or host `abort()`), not on `SIGSEGV`; a caller in a module loaded after the last traced import prints without a module name, and a thread aborting while another writes the report waits for it at most 2 seconds. An arm64 libc build omits the recorder -- [_Stodx, _Stofx and _Stoldx hexadecimal range flags](../../../core/libs/prx/libc/src/DinkumwareInternals.cpp) (libc) still raise host overflow/underflow and inexact floating-point flags for unscaled hexadecimal exponent overflow and underflow; the bundled `libc.prx` of PPSA03766 and PPSA07923, run on Linux, leave those flags clear. +- [_Stodx, _Stofx and _Stoldx unscaled hexadecimal conversion](../../../core/libs/prx/libc/src/DinkumwareInternals.cpp) (libc) unmasked exception delivery and non-C locale prefix classification remain unverified. The coefficient expansion and masked floating flags are compared against title-bundled SDK modules under 24-bit, 53-bit and 64-bit x87 precision, not exhaustively over all input strings or on a console. - [_Stopfx and _WStopfx](../../../core/libs/prx/libc/src/FloatingPrefix.cpp) follow the prefix results and pointer updates of Dinkumware V6.00 [xstopfx.c](https://github.com/ganboing/crt.vc12/blob/f1d47126bf13d1c9dccaa6c53b72217fd0474968/src/xstopfx.c) and [xwstopfx.c](https://github.com/ganboing/crt.vc12/blob/f1d47126bf13d1c9dccaa6c53b72217fd0474968/src/xwstopfx.c), without console verification. Sony signatures, module/library versions and locale equivalence are unverified; the wide code units follow the existing 16-bit libc string ABI, and character classification inherits the guest ctype/rune limitations. The guest default rune table rejects non-ASCII NaN payload letters that native Windows `iswalnum` accepts, including U+00AA in its C locale; console classification is unmeasured. A null cursor or input pointer throws; console invalid-pointer behavior is unknown. These helpers classify prefixes and do not convert numbers or consume their digits. - [_Dtest](../../../core/libs/prx/libc/src/Math.cpp) (libc) follows Dinkumware double classification matching _FDtest: finite values return -1, subnormals -2, zeros 0, infinities 1, and NaNs 2. - [_Exp and _FExp](../../../core/libs/prx/libc/src/DinkumwareInternals.cpp) (libc) - signaling NaNs, directed rounding and flush-to-zero modes are unverified, and titles whose `libc.prx` contracts multiply-adds to FMA, such as PPSA13934, differ by one unit in the last place on 889 `_FExp` and 15 `_Exp` of 300,000 random calls. Finite results use the constants, evaluation order and half-epsilon shortcut of the `libc.prx` that titles ship and match that of PPSA04158, PPSA05916, PPSA07923 and PPSA20423 on those calls, run on a Windows host. Special operands follow PRAGMATA PPSA02530's bundled `libc.prx`: the x-only cutoffs at ±229/±1842 store `0.0*y` below and `y*inf` with overflow above, ignoring the offset; a zero multiplier keeps its sign, a NaN multiplier leaves `*px` unchanged, and `+inf` with zero or `-inf` with infinity is invalid. diff --git a/docs/dev/debt/libfreetype.md b/docs/dev/debt/libfreetype.md new file mode 100644 index 0000000000..e3723db9bf --- /dev/null +++ b/docs/dev/debt/libfreetype.md @@ -0,0 +1,7 @@ +# libfreetype technical debt + +### Callable exports + +- [Callable exports](../../../core/libs/prx/libfreetype/Export.cpp) - five callable NIDs appear in a 3.20-labelled `libfreetype` image and a later 13.60-labelled `libSceVshFreeType` image. The images have different module and library identities; matching NIDs do not establish forwarding or equivalent behavior. Neither version label is authenticated. Names, signatures and behavior are unknown; these declarations throw and implement no runtime functionality. + +- [Older callable NIDs](../../../core/libs/prx/libfreetype/Export.cpp): 19 unidentified exports have unverified names, signatures and behavior. These are throwing import-resolution placeholders; no functionality is implemented. No matching NIDs were found in the later module inventory. diff --git a/docs/dev/debt/libkernel.md b/docs/dev/debt/libkernel.md index c5a61ec3c5..48786a7e82 100644 --- a/docs/dev/debt/libkernel.md +++ b/docs/dev/debt/libkernel.md @@ -2,6 +2,7 @@ ### Silent stubs +- [sceKernelCreateSema](../../../core/libs/prx/libkernel/Semaphore/src/Semaphore.cpp) (libkernel) - attributes 0x100 to 0x102 are accepted and ignored: a payload process on a PS5 (firmware 13.60) accepted them and created a working semaphore, but their effect is unknown ([measured](https://github.com/mattias800/prosper/blob/3ea5cb9a846b6dcd00f5073360462bbda4f72288/prosper/tests/data/console_oracle/kernel.golden.tsv#L10-L23)). - [SO_TIMESTAMP, SO_BINTIME](../../../core/libs/prx/libkernel/Socket/src/Udp.cpp) (libkernel) - the arrival time in their control messages is `CLOCK_REALTIME` read when the host hands the datagram over, not when it reached the socket. Otherwise `recvmsg` on a UDP socket returns them as a payload process on PS5 firmware 13.60 got them: one 32-byte `SCM_BINTIME` (IPv4 only) then one `SCM_TIMESTAMP` at `SOL_SOCKET`, and a control buffer too small for them gets as many bytes as fit, its length, and `MSG_CTRUNC`. That partial copy is the console's: FreeBSD 11.4's `kern_recvit` copies whole messages only. Not measured, after 11.4: an empty buffer gets nothing and `MSG_CTRUNC`, no buffer gets nothing, and a TCP or Unix socket gets no message - [sceKernelGetSocPowerConsumption](../../../core/libs/prx/libkernel/System/src/ThermalSensors.cpp) (libkernel) - returns `EINVAL` and writes nothing, as `sceKernelGetSocSensorTemperature` does when the host has no sensor: the host's package power is not read (Linux RAPL `energy_uj` is readable by root only, and Windows has no general source). The prototype is not documented. PS5LM Plus (PPSA99581) passes a zeroed 128-byte buffer and, on success, reads its first 32-bit word as milliwatts, accepting 1000 to 350000; on failure it shows 0 W. On PS5 firmware 13.60 a payload process gets 0 and 112 bytes (28 32-bit words) written, the first one about 4700 when idle, and a null buffer faults; the unit is not known - [scePthreadMutexattrSetprotocol, scePthreadMutexattrGetprotocol, scePthreadMutexattrSetprioceiling, scePthreadMutexattrGetprioceiling](../../../core/libs/prx/libkernel/Pthread/Posix/Mutex.cpp) (libkernel) - `scePthreadMutexattrSetprotocol` accepts 0 to 2 as a PS5 (firmware 13.60) does and returns `EINVAL` otherwise, but the protocol is not applied: priority inheritance and protection are not modelled. On the console a null or uninitialized mutex attribute returns `EINVAL` from the SCE attribute calls, `scePthreadMutexInit` takes an uninitialized attribute as the default one, and a destroyed mutex returns `EINVAL` from `scePthreadMutexDestroy`; a null mutex pointer crashed the payload and still throws @@ -23,10 +24,10 @@ - [sceKernelError](../../../core/libs/prx/libkernel/System/src/Error.cpp) follows [shadPS4's kernel implementation](https://github.com/shadps4-emu/shadPS4/blob/23c41333822fe8eca4c609b43119180af63ae4ac/src/core/libraries/kernel/kernel.cpp): zero returns zero; other guest POSIX error values receive the `0x80020000` bias without modifying errno. Arithmetic is defined modulo 32 bits to avoid signed overflow for inputs outside the errno domain. Console behavior for those inputs and PS5 equivalence have not been measured. - [physhm_open, physhm_unlink](../../../core/libs/prx/libkernel/Unimplemented.cpp) (libkernel, NIDs `n371J5cP+uo` and `AUqJNkobQ1c`) - declared as throwing stubs: the PS5 physical shared memory API is not documented, and [shadPS4's module generator](https://github.com/shadps4-emu/moduleGenerator/blob/main/libraries/kernel.cpp) also declares both with no arguments and returns `ORBIS_OK`, so the signature, the handle a success would return and the console's behaviour are unmeasured. The no-argument `int` signature follows shadPS4. Forever Launcher (PPSA99030) imports both and stops at load on `physhm_open`, and the relinker resolves no call site for either in that title, so no handle is fabricated and both throw -- [getlogin_r](../../../core/libs/prx/libkernel/System/src/Login.cpp) (libkernel) returns the host effective account name: `GetUserNameW` as UTF-8 on Windows and `getpwuid_r(geteuid())` on POSIX. A valid account returns a name even without a login session; host `getlogin_r`, `USER` and `LOGNAME` are not consulted. The console's login name and behaviour without a session are unknown. Account lookup or encoding failures, a missing or empty account name, and POSIX account records exceeding the 16 KiB lookup buffer throw; there is no replacement name or retry. A short guest buffer returns `ERANGE` without modifying it, and a null output returns `EFAULT`. +- [getlogin_r](../../../core/libs/prx/libkernel/System/src/Login.cpp) (libkernel) returns the host effective account name: `GetUserNameW` as UTF-8 on Windows and `getpwuid_r(geteuid())` on POSIX. A valid account returns a name even without a login session; host `getlogin_r`, `USER` and `LOGNAME` are not consulted. The console's login name and behaviour without a session are unknown. Account lookup or encoding failures, a missing or empty account name, and POSIX account records exceeding the 16 KiB lookup buffer throw; there is no replacement name or retry. A short guest buffer returns `ERANGE` without modifying it, and a null output returns `EFAULT`. An unwritable output buffer returns `EFAULT` as this implementation's host fallback; console fault behaviour is unmeasured. - [getlogin](../../../core/libs/prx/libkernel/System/src/Getlogin.cpp) (libkernel) follows FreeBSD 11 `lib/libc/gen/getlogin.c` and returns a pointer to one static 33-byte buffer filled by `getlogin_r`; on an error it sets `errno` to `getlogin_r`'s code and returns NULL. These semantics are not checked against a PS5. It exports the test seam `LoginNameForTest_nid_no_patch`, which replaces the host account name for tests. - [setlogin](../../../core/libs/prx/libkernel/System/src/Login.cpp) (libkernel_sys) keeps one name for the process, where FreeBSD 11.4's [`sys_setlogin`](https://github.com/freebsd/freebsd-src/blob/release/11.4.0/sys/kern/kern_prot.c#L2138-L2161) sets it for the session, and does not check `PRIV_PROC_SETLOGIN`, which a jailed process fails with `EPERM`; the console's answer is not known. As in FreeBSD, a null name fails with `EFAULT` and a name of 33 bytes or more (`MAXLOGNAME` with the NUL) with `EINVAL`, and nothing is stored. Once a name is stored, `getlogin_r` returns it instead of the host account name described for `getlogin_r`, and ahead of the `LoginNameForTest_nid_no_patch` seam. The name is copied from the guest with the same 33-byte bound as `copyinstr`, so a name with no NUL in its first 33 bytes fails with `EINVAL` without reading past them. -- [sceKernelGetSystemSwVersion](../../../core/libs/prx/libkernel/System/src/SystemConfiguration.cpp) (libkernel) reports baseline system software version `0x01000000` ("01.000.000") for ProsperoStore (PPSA99000); the console's firmware version is not modeled. Measured on PS5 firmware 13.42: record values 0, 24, 39, 40, 41, 48 and 64 in the leading 64-bit field are accepted and preserved, the 28-byte string at offset 8 and packed version at 0x24 are filled, and bytes from 0x28 onward remain untouched. This API reports "13.590.001" / `0x13590001` in that environment, while the Prospero variant reports "13.420.000" / `0x13420000`; their values must not be assumed identical. Measured on 13.60: the same holds for values 1, 0x1000 and 2^64-1, this API still reports "13.590.001" while the Prospero variant reports "13.600.007", and a null pointer returns 0 without a fault or an `errno` change. Other firmware versions remain unverified. +- [sceKernelGetSystemSwVersion](../../../core/libs/prx/libkernel/System/src/SystemConfiguration.cpp) (libkernel) reports baseline software version `0x01000000` ("01.000.000") for ProsperoStore (PPSA99000); the console's firmware version is not modeled. Measured on PS5 firmware 13.42: record values 0, 24, 39, 40, 41, 48, 64 in the leading 64-bit field are preserved, the 28-byte string at offset 8 and packed version at 0x24 are filled, and bytes from 0x28 onward stay untouched. This API reports "13.590.001" / `0x13590001` there, while Prospero reports "13.420.000" / `0x13420000`. Measured on 13.60: the same holds for values 1, 0x1000 and 2^64-1, this API reports "13.590.001", Prospero reports "13.600.007", and null returns 0 without a fault or errno change. Unwritable outputs return `SCE_KERNEL_ERROR_EFAULT` and the leading 64-bit field is not read or written; that fault return is a host-safety fallback whose console behaviour was not measured. Other firmware versions remain unverified. - [kern.rng_pseudo](../../../core/libs/prx/libkernel/System/src/SystemConfiguration.cpp) (libkernel) - `sysctlbyname` draws a new block of 64 bytes from the host's `std::random_device` for each read (no new value) that passes a buffer and a length, and sizes its answers as a payload process on a PS5 (firmware 12.70) sees it: a size query reports 64; a buffer of 64 bytes or more gets 64 bytes and a length of 64 (tried up to 65536); a smaller buffer gets as many bytes as its length, which is left as given, and a null length gets none, both with -1 and `ENOMEM`; a null buffer with a null length returns 0. `errno` is kept when the call succeeds. A write returns -1 with `EPERM`, which was not tried on the console. The only caller seen is mbedTLS's `mbedtls_hardware_poll` in the catalog's ProsperoLight boilerplate, which asks for 64-byte blocks and fails if fewer come back. The console's generator is unknown, and a title process was not measured. On the console `sysctlnametomib` gives MIB {1, 50} for the name, and `sysctl` with it answers reads of 0, 1, 63, 64, 65 and 128 bytes, a size query, a null length and a null buffer with a null length as the name does; here `sysctlnametomib` maps the name to {1, 50} and `sysctl` {1, 50} answers as the name does; a write through the MIB was not measured and throws - [sysconf](../../../core/libs/prx/libkernel/System/src/SystemConfiguration.cpp) (libkernel) - `_SC_NPROCESSORS_CONF`, `_SC_NPROCESSORS_ONLN` and `_SC_PHYS_PAGES` report the host's processor count and memory in 16 KiB pages, where a payload process on a PS5 (firmware 12.70) read 16, 16 and 139888. `_SC_CHILD_MAX`, `_SC_OPEN_MAX` and `_SC_STREAM_MAX` follow the guest `RLIMIT_NPROC` and `RLIMIT_NOFILE`; following a changed `RLIMIT_NPROC` was not measured, and the 32767 bound on `_SC_STREAM_MAX` was not tried above 13952. `_SC_CLK_TCK` returns the 128 that process read, but no `times` reports ticks at that rate; CPython in PS5MC (PPSA99420) needs >= 1. `_SC_CPUSET_SIZE` (122) returns 8, as that process read, and whether it follows the processor count is unknown. A failed `getrlimit` or a host count of 0 gives -1 with `EIO`, which was not seen on the console. What a title process gets was not measured - [hw.realmem](../../../core/libs/prx/libkernel/System/src/SystemConfiguration.cpp) (libkernel) - `sysctl` {`CTL_HW`, 12} and `sysctlbyname` report the same 8-byte value as `hw.physmem` (the `_SC_PHYS_PAGES` pages of 16 KiB), read-only with `EPERM` for a write and `ENOMEM` for a short buffer, as FreeBSD's [`sysctl_hw_realmem`](https://github.com/freebsd/freebsd-src/blob/8c639945a44588f6cfdddfb057bb5aad88735da0/sys/kern/kern_mib.c#L191-L204) does. FreeBSD reports there the memory the firmware describes, which is at least `hw.physmem`. A payload process on a PS5 (firmware 12.70) gets -1 with `ENOENT` for `hw.physmem` and `hw.realmem` (a read, a size query and a null length) and for {`CTL_HW`, 5} and {`CTL_HW`, 12} (a read and a size query); what a title process gets was not measured. Dolphin reads it as the machine's memory size in [`MemPhysical`](https://github.com/dolphin-emu/dolphin/blob/8d2ad1a662472955497e5bb79d7b9ec6999e1f0d/Source/Core/Common/MemoryUtil.cpp#L253-L273) (RetroArch PPSA99169's `dolphin_libretro` core) @@ -54,6 +55,7 @@ - [AMM remap, multimap and protection changes](../../../core/libs/prx/libkernel/Apr/src/Apr.cpp) (libSceAmpr) - signatures and the protection and mask checks taken from ampr_emu; the effects are inferred from the names, not confirmed on a title. A remap moves every page of a fully mapped range to the new address with the given protection and leaves the old range reserved; a multimap maps the same pages at a second address, anywhere in the AMM ranges, and a pool page goes back to the pool once its last mapping is unmapped; a multimap onto its own source range throws. A protection change sets the masked bits on every page of a fully mapped range; the memory type is recorded and ignored. A command on a range that is not fully mapped throws - [AMM PRT ranges](../../../core/libs/prx/libkernel/Apr/src/Apr.cpp) (libSceAmpr) - signatures, checks and their order taken from ampr_emu, where `MapAsPrt` is a map with the PRT flag and protection 0 and `AllocatePaForPrt` a memory type and protection change with mask 1019, both checking the buffer memory after its size; the effects are inferred from the names, not confirmed on a title. Unbacked PRT pages are zero-filled pages with GPU read access, so CPU reads see zeros instead of faulting and GPU writes fault instead of being dropped. `AllocatePaForPrt` backs each unbacked page with a pool page and sets the type and protection of backed ones; `RemapIntoPrt` moves a fully mapped range into a PRT range, its opcode argument (1011 when 0, as in ampr_emu) is recorded and ignored; `UnmapToPrt` returns the pages to the pool and zero-fills them again. A plain map, unmap or remap over a PRT range ends it; `AllocatePaForPrt`, `RemapIntoPrt` or `UnmapToPrt` outside a PRT range throws - [AMM kernel write commands](../../../core/libs/prx/libkernel/Apr/src/Apr.cpp) (libkernel) - signatures of `sceKernelWriteModifyMtypeProtectCommand` and `sceKernelWriteRemapIntoPrtCommand` taken from [ampr_emu's libkernel hook targets](https://github.com/drakmor/ampr_emu/blob/cfa85df379f6eeeb165d7badf9b648e266fe77b7/include/ampr_libkernel_hook_targets.h), which forward to the real kernel; the measure mode (`dst` null reports the size, `outSize` null skips the report) follows ampr_emu's measure-then-record calls, not confirmed on a title. The range, protection and mask checks mirror the `libSceAmpr` siblings, and the recorded bytes match them exactly so the submitted buffer executes on the existing paths +- [sceKernelWriteModifyMtypeProtectCommand and sceKernelWriteRemapIntoPrtCommand checks](../../../core/libs/prx/libkernel/Apr/src/Apr.cpp) (libkernel) - they apply their libSceAmpr siblings' checks, not those of firmware 13.42's libkernel (compared under a CPU emulator, not measured on a console), so some arguments get a different return code. The console checks the range against the AMM virtual address ranges, accepts a size that wraps past the end of the address space and takes a different set of protection bits; for the memory type change it accepts only types 11 to 20 and a protection inside the mask, and for the PRT remap only a last argument of 0x3F3, which it checks but does not record - [sceCoredumpWriteUserString](../../../core/libs/prx/libkernel/System/src/Coredump.cpp) (libkernel, NID `32KQRUK13kI`) - `(uint32_t, const char* text, int)` follows the console's `libkernel.sprx` (SDK 4.5x build of `J03950001`) at 0x13050: a null `text` returns `0x81180000`; otherwise the three arguments go to syscall 601 (command 10), whose `EPERM` becomes `SCE_COREDUMP_ERROR_NOT_IN_COREDUMP_HANDLER` (0x81180003), `EINVAL` `0x81180000`, and a success returns the value the kernel wrote back. Measured on a PS5 (firmware 13.60) from a homebrew payload with no core dump handler: the call succeeds with 0, the kernel rejects a first argument above 15 or a third outside 0 to 256 with `0x81180000`, and a 2047-character text is accepted. Those checks are reproduced and anything else returns 0; nothing is recorded, as there is no dump, and what the two numbers mean is unknown. PPSA16064 imports it - [sceCoredumpConfigDumpMode](../../../core/libs/prx/libkernel/System/src/Coredump.cpp) (libkernel, NID `gzLt9Qrauk0`) - `(int mode)` follows the same `libkernel.sprx` at 0x134D0: a mode other than 1 returns `0x81180000`; mode 1 issues syscall 601 (command 16, arguments 0 and 1) and returns 0 whether or not it fails, since only a raw return of 22 would map to `0x81180000`. No dump is produced here, so mode 1 returns 0 without the syscall. PPSA16833 imports it - [sceCoredumpGetStopInfoGpu_Agc](../../../core/libs/prx/libkernel/System/src/Coredump.cpp) (libkernel, NID `Jrs7UUkGOFo`) - `(void* info, size_t size)` follows the same `libkernel.sprx` at 0x137E0: a null `info` returns `0x81180000`; syscall 601 (command 21) failing with `EPERM` returns `NOT_IN_COREDUMP_HANDLER`; otherwise two `libSceAgcDriver` imports (NIDs `+NIAY3DWpOw` and `LgctzJSGy7s`, names unknown) decide between `0x81180005` and, for a `size` of 8, storing the second one's 64-bit result and returning 0, with any other size returning `0x81180000`. The handler is never invoked here, so a non-null `info` returns `NOT_IN_COREDUMP_HANDLER` without writing, assuming `EPERM` outside the handler as above; the AGC branch is not reached @@ -67,16 +69,18 @@ - [sceKernelGetModuleList2 and sceKernelGetModuleInfo2](../../../core/libs/prx/libkernel/Module/src/ModuleInfo.cpp) (libkernel) - the title-module variants follow [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/main/src/core/libraries/kernel/process.cpp): `sceKernelGetModuleList2` lists what `sceKernelGetModuleList` lists without system libraries, and `sceKernelGetModuleInfo2` answers `EPERM` for a system library after the `EFAULT`, `EINVAL` and `ESRCH` checks of `sceKernelGetModuleInfo`, as a payload process on PS5 firmware 13.60 got for libkernel's handle, a size of 0, a null info and a bad handle. A system library here is a loaded `.prx` image that is not a relinked title module (`.guest.prx`); the main program and the title's own modules are listed. Which modules the console lists is in the entry above. PPSA34063 imports both and fails to load without them - [sceKernelGetLibkernelTextLocation](../../../core/libs/prx/libkernel/Module/src/ModuleInfo.cpp) (libkernel) - returns 0 and the main program's first segment, as [fpPS4](https://github.com/red-prig/fpPS4/blob/04cefd43e6fddd1ab033e7980cd356d14c964905/kernel/ps4_libkernel.pas#L338-L348) does, where a payload process on PS5 firmware 13.60 got 0 with address 0 and size 0, twice, though libkernel's text was at 0x800000000; what a title gets is not measured. A null address or size faulted there and throws here. libkernel.sprx and libkernel_sys.sprx export the function at the same address - [sceKernelGetExecutableModuleHandle](../../../core/libs/prx/libkernel/Module/src/ModuleInfo.cpp) (libkernel) - returns the main program's handle, the one `sceKernelGetModuleList` lists first and `sceKernelGetModuleInfo` accepts. The `int(void)` signature and that use follow reSOT's [`load_code_copy`](https://github.com/bystritskiy/rePOP-ps5/blob/4e6fe79ea83b5e3814e1be27c7d2b85c9e1ad22c/port/ps5/src/mmio_ps5.c#L123-L137), which passes the handle to `sceKernelGetModuleInfo` to find its own code segment. The [PS5 3.20 export lists](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libkernel.c#L3922) have it in libkernel as well as libkernel_sys, so it is exported from libkernel only. The number is AnyPS5's own: a payload process on PS5 firmware 13.60 got its main program as handle 0 from `sceKernelGetModuleList`, and what this call returns on a console was not measured +- [sceKernelAvailableFlexibleMemorySize, sceKernelConfiguredFlexibleMemorySize, sceKernelGetPrtAperture](../../../core/libs/prx/libkernel/DirectMemory/Export.cpp) (libkernel) validate destination pointers with `GuestCopyOut`: a null pointer returns `SCE_KERNEL_ERROR_EINVAL`, while an unmapped or unwritable pointer returns `SCE_KERNEL_ERROR_EFAULT` (in `sceKernelGetPrtAperture`, sequential copyout leaves the address written if length faults). Console fault behaviour on bad memory is unmeasured. - [sceKernelReleaseFlexibleMemory](../../../core/libs/prx/libkernel/DirectMemory/Export.cpp) (libkernel) - on a PS5 (firmware 13.60) the released range stays mapped, with its protection and contents (64 MiB checked after 0.5 s), and a fixed no-overwrite map over it fails with `ENOMEM`, as here. What it does to the flexible budget was not measured, because a payload process has none (`sceKernelAvailableFlexibleMemorySize` did not change on map or release); here the released bytes return to the budget while the pages stay mapped, and a later map over them charges them again. The host pages behind a released range stay committed until `sceKernelMunmap`, as `madvise` keeps them for every advice; freeing them would lose the contents the console still returns. - [sceKernelAvailableFlexibleMemorySize](../../../core/libs/prx/libkernel/DirectMemory/Export.cpp) (libkernel) - the segments of the title's executable and of its `.guest.prx` modules count against the configured flexible-memory budget (448 MiB by default) while loaded, for this size and for flexible maps. A title may declare a larger budget through `kernel.flexibleMemorySize` in `param.json`; this does not reduce the 13.5 GiB direct-memory size. Rejection of zero or a value not aligned to 16 KiB has not been measured on a console. This segment-accounting model follows [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/3a9f57265d28975658f1ca941daa5c879c7a74bd/src/core/module.cpp#L165), which maps every segment of a module outside its system module directory as flexible memory on the PS4. [Counted](../../../core/libs/prx/libkernel/Module/src/ModuleInfo.cpp) are the segments the title's ELF gives permissions, each rounded to 16 KiB pages; not counted are segments without permissions, the relinker's own blocks (on Linux both are the read/write/execute `PT_LOAD`s, plus the header block at file offset 0; on Windows everything outside the `.elf` sections) and the host system libraries. The Linux image carries no marker for the relinker's blocks, so they are told apart by those flags and that offset only: a title segment that is writable and executable, or starts at file offset 0, is not counted. A module whose segments exceed what is left still loads, and the available size then reads 0; shadPS4 fails the segment map instead ([memory.cpp](https://github.com/shadps4-emu/shadPS4/blob/3a9f57265d28975658f1ca941daa5c879c7a74bd/src/core/memory.cpp#L519-L524) returns `EINVAL`, [module.cpp](https://github.com/shadps4-emu/shadPS4/blob/3a9f57265d28975658f1ca941daa5c879c7a74bd/src/core/module.cpp#L168-L169) asserts). Which segments the PS5 charges, its rounding, whether system modules use the title's budget and when an unload releases the charge are not measured. PPSA15508 subtracts the reported size and a 10 MiB module allowance from its own 448 MiB budget at start-up and stops when the result exceeds its 146 MiB code and data limit ([#2883](https://github.com/boykopovar/AnyPS5/issues/2883)) - [Anonymous mmap and the flexible budget](../../../core/libs/prx/libkernel/DirectMemory/PosixMemory.cpp) (libkernel) - whether a PS5 charges a plain `MAP_PRIVATE | MAP_ANON` map to the flexible-memory budget is not measured. Here it is not charged: it is placed through `DoMapAnon` and is not added to the flexible ranges, so `sceKernelAvailableFlexibleMemorySize` does not drop and a map is never refused for the flexible budget. [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/3a9f57265d28975658f1ca941daa5c879c7a74bd/src/core/libraries/kernel/memory.cpp#L784-L790) maps an anonymous map without `MAP_SYSTEM` as flexible memory on the PS4, which [checks it against and charges it to](https://github.com/shadps4-emu/shadPS4/blob/3a9f57265d28975658f1ca941daa5c879c7a74bd/src/core/memory.cpp#L519-L524) the flexible budget ([#7120](https://github.com/boykopovar/AnyPS5/issues/7120)) - [sceKernelAvailableDirectMemorySize](../../../core/libs/prx/libkernel/DirectMemory/Export.cpp) (libkernel) - its arguments follow a payload process on a PS5 (firmware 13.60) ([probes](https://gist.github.com/orezraey/42a06a7ea0d9fb57ac9c06eaf9e6756c)). One answer is not modelled: in a process that had not yet called `sceKernelGetDirectMemorySize` or otherwise touched direct memory, the console returned `EBADF` (`0x80020009`); here the call always searches the pool. Titles open the direct-memory device during start-up, so they are not expected to see it +- [sceKernelSetVirtualRangeName](../../../core/libs/prx/libkernel/DirectMemory/Export.cpp) (libkernel) - a null name returns `EFAULT`, as in KytyPS5 and shadPS4. A null address, a length of 0 and a range past the end of the address space return `EINVAL` here, and `sceKernelClearVirtualRangeName` does the same; no console measurement or reference covers these. A name of 32 or more bytes is cut to 31 characters, where shadPS4 returns `ENAMETOOLONG`; the console's result is not measured. - [sceKernelReleaseDirectMemory](../../../core/libs/prx/libkernel/DirectMemory/MemoryPool.cpp) (libkernel) - releases the allocated pages of the range and skips pages that are not allocated, returning 0, while `sceKernelCheckedReleaseDirectMemory` returns `ENOENT` for them, as [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/c206f35a546230d9c9808b823c0f36f5850cd4af/src/core/memory.cpp#L295-L313) does; not measured on a console. Absolum (PPSA28311) releases such a range when it disposes of its video logos - [Memory protection bits 0x100 and 0x200](../../../core/libs/prx/libkernel/DirectMemory/DirectMemory.cpp) (libkernel) - taken as audio coprocessor (ACP) read and write, as in the [KytyPS5](https://github.com/KytyPS5/KytyPS5) and [etaHEN](https://github.com/etaHEN/etaHEN) headers; the coprocessor work runs on the host CPU, so they grant host read and read/write access like the GPU bits - [Protecting a host thread's stack](../../../core/libs/prx/libkernel/DirectMemory/DirectMemory.cpp) (libkernel) - on Windows `sceKernelIsStack` reports a host thread's whole stack reservation, which Windows commits on demand from the top down behind a guard page. A protect over that range changes only the pages above the guard; the guard page and the reserved pages below it are left as they are, so the stack still grows and an overflow still raises a stack overflow. A protect that starts at the bottom of the reservation and stops short of the guard page, as HotSpot makes its stack guard zones, is committed and protected. Windows moves the guard page down by committing the pages below it as read/write guard pages, whether they were reserved or committed, so those pages come in read/write as the stack grows to within one guard region of them (three pages on GitHub's runners). A protection other than read/write on them, `PROT_NONE` included, does not hold once the stack is that close, where on the console every page of the reported range takes the protection. Holding it would mean removing the thread's guard page and keeping the stack limit in its TEB by hand. On Linux the reported range of the main thread is mostly unmapped; the unmapped pages from the bottom of a protect up to the top of the stack are mapped read/write in place, then the protect is applied, so the stack never has to grow down to the protected pages, which Linux refuses within its stack guard gap (1 MiB by default) above a readable mapping. The pages below a protect stay unmapped and out of the stack's reach, where on the console the stack goes on below them - [Foreign guest module image protection on Windows](../../../core/libs/prx/libkernel/DirectMemory/DirectMemory.cpp) (libkernel) - `sceKernelMprotect` on Windows allows protection mutations on mapped PE images containing a `.elf0` section (as relinked guest modules produce, such as NVIDIA Real-time Denoisers `libNRD.prx` bundled in Dying Light 2: Stay Human PPSA02262), registering their sections into `GuestAllocations`. Host libraries and system DLLs (such as `libkernel.prx` and `kernel32.dll`) without a `.elf0` section continue to be rejected - [_umtx_op](../../../core/libs/prx/libkernel/SyncOnAddress/src/SyncOnAddress.cpp) (libkernel) - the mutex, condition variable, read-write lock, legacy lock and `SEM2` operations throw, and so does a misaligned object. Implemented as FreeBSD 11's [kern_umtx.c](https://github.com/freebsd/freebsd-src/blob/stable/11/sys/kern/kern_umtx.c): `UMTX_OP_WAIT`, `UMTX_OP_WAKE`, `UMTX_OP_WAIT_UINT`, `UMTX_OP_WAIT_UINT_PRIVATE`, `UMTX_OP_WAKE_PRIVATE`, `UMTX_OP_NWAKE_PRIVATE`, `UMTX_OP_SEM_WAIT` and `UMTX_OP_SEM_WAKE` (the last two built under `COMPAT_FREEBSD9`/`10`). Operations 0 and 1 fail with `EOPNOTSUPP`, as measured on a PS5 (firmware 12.70). The `SEM2` operations, 23 and 24, were measured on the console and returned `0` for a count of 0 where FreeBSD would time out, so they stay unimplemented. -- [sceKernelCreateSema, sceKernelPollSema, sceKernelSignalSema, sceKernelDeleteSema](../../../core/libs/prx/libkernel/Semaphore/src/Semaphore.cpp) (libkernel) - a poll, a signal or a second delete of a deleted semaphore reads freed memory here, where the console returns `0x80020003` (ESRCH) ([measured](https://github.com/mattias800/prosper/blob/3ea5cb9a846b6dcd00f5073360462bbda4f72288/prosper/tests/data/console_oracle/kernel.golden.tsv#L17-L19)). A null output pointer to `sceKernelCreateSema` (a fault on PS5 firmware 13.60) and attributes 0x100 to 0x102 (accepted there, effect unknown) throw. Other attributes above 2 and negative maximum and signal counts return `EINVAL` here, as there. `EINVAL` for an initial count above the maximum or negative, a maximum of 0, a null name, a poll of 0 or above the maximum and a signal of 0 is [measured](https://github.com/mattias800/prosper/blob/3ea5cb9a846b6dcd00f5073360462bbda4f72288/prosper/tests/data/console_oracle/kernel.golden.tsv#L10-L23). +- [sceKernelCreateSema, sceKernelPollSema, sceKernelSignalSema, sceKernelDeleteSema](../../../core/libs/prx/libkernel/Semaphore/src/Semaphore.cpp) (libkernel) - a poll, a signal or a second delete of a deleted semaphore reads freed memory here, where the console returns `0x80020003` (ESRCH) ([measured](https://github.com/mattias800/prosper/blob/3ea5cb9a846b6dcd00f5073360462bbda4f72288/prosper/tests/data/console_oracle/kernel.golden.tsv#L17-L19)). A null output pointer to `sceKernelCreateSema` (a fault on PS5 firmware 13.60) throws. Other attributes above 2 and negative maximum and signal counts return `EINVAL` here, as there. `EINVAL` for an initial count above the maximum or negative, a maximum of 0, a null name, a poll of 0 or above the maximum and a signal of 0 is [measured](https://github.com/mattias800/prosper/blob/3ea5cb9a846b6dcd00f5073360462bbda4f72288/prosper/tests/data/console_oracle/kernel.golden.tsv#L10-L23). - [sceKernelSyncOnAddressWait, sceKernelSyncOnAddressWait8/16/32/64 and sceKernelSyncOnAddressWake](../../../core/libs/prx/libkernel/SyncOnAddress/src/SyncOnAddress.cpp) (libkernel) - follow a payload process on a PS5 (firmware 13.60), not a title. Only a null address is checked for `EFAULT`: any other unreadable address is read and faults the host, where the console returned `EFAULT` for address 0x10. The time left that a woken wait writes back is taken from the host clock, so it can differ from the console's by the cost of the call - [scePthreadRwlockDestroy, pthread_rwlock_destroy](../../../core/libs/prx/libkernel/Pthread/src/Rwlock.cpp) (libkernel) - measured on a PS5 (firmware 13.60): destroying a rwlock returns 0 whether it is free or held for reading or writing, and leaves 1 in the handle; every call on that handle then returns `EINVAL` until it is initialized again, and a zero handle is initialized on first use by the `scePthreadRwlock` calls as by the POSIX ones. A rwlock destroyed while held is not freed, so its memory leaks. Destroying a rwlock while another thread is acquiring it is not guarded - [scePthreadCondWait / scePthreadCondTimedwait](../../../core/libs/prx/libkernel/Pthread/src/Cond.cpp) (libkernel) - the mutex's owner is checked before waiting, as in FreeBSD libthr's [`cond_wait_common`](https://github.com/freebsd/freebsd-src/blob/main/lib/libthr/thread/thr_cond.c#L1992-L2029). Measured in a payload process on a PS5 (firmware 13.60): `EPERM` (`0x80020001`) for an unowned mutex of every type, the adaptive initializer (slot 1), an uninitialized slot and a mutex owned by another thread, `EINVAL` for the destroyed mutex (slot 2), and a recursive mutex is released completely and relocked to its depth. `scePthreadCondDestroy` stores 1, which every condition call refuses with `EINVAL`, and leaves an uninitialized slot alone. Cancellation restores the mutex and depth before cleanup and a canceled waiter forwards a wake, per POSIX; its ordering is not measured @@ -132,7 +136,7 @@ - [qk043QPsrZU](../../../core/libs/prx/libkernel/Unimplemented.cpp) (libkernel) - unknown name, signature - [uDGXwUKqi8s](../../../core/libs/prx/libkernel/Unimplemented.cpp) (libkernel) - unknown name, signature - [__Ux86_64_setcontext](../../../core/libs/prx/libkernel/Unimplemented.cpp) (libkernel) - declared without parameters; it throws through `NotImplemented_nid_no_patch`. The tree implements `setcontext` and `getcontext` on its `UserUcontext` (`System/src/UserContext.cpp`), but nothing in the tree gives this export's arguments, its result or whether it restores the same context layout -- [sceKernelGetCpuTemperature, sceKernelGetSocSensorTemperature](../../../core/libs/prx/libkernel/System/src/ThermalSensors.cpp) (libkernel) - channels 3 to 63 throw, and a channel the host has no sensor for returns `EINVAL`, where payload processes on PS5 read 49 to 54 °C (firmware 13.60) and 34 to 38 °C (12.70 reporting 13.09) from channels 0 to 63; a null output for `sceKernelGetSocSensorTemperature` with a valid channel returns `EFAULT`, where a payload process faults (channel 0). Channel 64 writes a fixed -49, as in a payload process; a title process and a null output on channel 64 are unmeasured. A channel outside 0 to 64 returns `EINVAL` before the output is read, and `errno` is set. Values come from the host: on Linux `/sys/class/hwmon` and `/sys/class/thermal`, on Windows ACPI thermal zones and the first drive. Channel 0 is the CPU/package value, 1 the first other value and 2 an NVMe value; `sceKernelGetCpuTemperature` reports channel 0. PPSA99058 and PPSA99420 call both +- [sceKernelGetCpuTemperature, sceKernelGetSocSensorTemperature](../../../core/libs/prx/libkernel/System/src/ThermalSensors.cpp) (libkernel) - channels 3 to 63 throw, and a channel the host has no sensor for returns `EINVAL`, where payload processes on PS5 read 49 to 54 °C (firmware 13.60) and 34 to 38 °C (12.70 reporting 13.09) from channels 0 to 63; a null or unwritable output with a valid channel and an available reading returns `EFAULT` (`0x8002000e`) as a host-safety fallback, where a payload process faults (channel 0). Channel 64 writes a fixed -49, as in a payload process; a title process, unwritable outputs and a null output on channel 64 are unmeasured. A channel outside 0 to 64 returns `EINVAL` before the output is read, and `errno` is set. Values come from the host: on Linux `/sys/class/hwmon` and `/sys/class/thermal`, on Windows ACPI thermal zones and the first drive. Channel 0 is the CPU/package value, 1 the first other value and 2 an NVMe value; `sceKernelGetCpuTemperature` reports channel 0. PPSA99058 and PPSA99420 call both - [getdtablesize](../../../core/libs/prx/libkernel/System/src/Process.cpp) (libkernel) - returns the smaller of the `RLIMIT_NOFILE` soft limit of `getrlimit` and the host's `getdtablesize()`, capped at `INT_MAX`: FreeBSD returns the smaller of the `RLIMIT_NOFILE` soft limit and `maxfilesperproc` ([`sys_getdtablesize`](https://github.com/freebsd/freebsd-src/blob/8c639945a44588f6cfdddfb057bb5aad88735da0/sys/kern/kern_descrip.c#L338-L355)), and the host call supplies that bound on macOS, where the soft limit alone is not one (`setrlimit` accepts soft limits above `maxfilesperproc`, `RLIM_INFINITY` included); `maxfilesperproc` is not measured on the console. On Linux and macOS the guest limit is the host's soft limit. VLC (PPSA85300) imports it for a `closefrom` loop in the child of its spawn helper ([libc_stubs.c](https://github.com/ZiZc3/VLC/blob/d46be6a68f4244466b041c2dc1b640915ac1a983/ps5/compat/libc_stubs.c#L66-L72)), which never runs because its `fork` fails with `ENOSYS` - [close, sceKernelClose](../../../core/libs/prx/libkernel/File/src/HostStreams.cpp) (libkernel) - descriptors 0 to 2 that are open when libkernel loads belong to the host process: closing one fails with `EPERM` (`sceKernelClose`: `0x80020001`) and leaves it open, as closing the open descriptors 0 to 2 of a payload process did on a PS5 (firmware 13.60); whether a title process can close them is unverified. PPSA21703 calls `sceKernelClose(0)` repeatedly; closing the host stream let the host C runtime give descriptor 0 to the next file opened, which the next call then closed - [sceKernelPrintBacktraceWithModuleInfo](../../../core/libs/prx/libkernel/Unimplemented.cpp) (libkernel) - imported by PS4 titles, which do not load without it, and added without an implementation: declared without parameters, every call throws @@ -148,7 +152,8 @@ - [sceKernelGetTscFrequency](../../../core/libs/prx/libkernel/Time/Time.cpp) (libkernel) pins its thread to the CPU it runs on for the 20 ms measurement, so that both TSC reads come from one counter. If the pin can't be set (`sched_getcpu` or `pthread_getaffinity_np` fails on Linux, `SetThreadAffinityMask` fails on Windows), the measurement runs unpinned. On a host whose CPU TSCs differ, the result can then be wrong as before. Neither call is known to fail for the calling thread's own CPU, which is always in its allowed set. macOS never pins. - [Guest TLS on macOS](../../../core/libs/prx/libkernel/Pthread/src/GuestTlsMacOs.cpp) (libkernel) - every guest image has its own TLS block and thread pointer, instead of one thread pointer per thread as on the console, and the word at 0x28 of the thread pointer, which FreeBSD code reads as the stack guard, is 0. macOS cannot set the `%fs` base, so the relinker ([MacOsImage.cpp](../../../core/relinker/elfpatcher/src/macos/MacOsImage.cpp)) turns each `%fs` access into a stub that reads the thread pointer from the pthread key of the image's TLS descriptor and calls `Aps5GuestTlsAllocate` on a thread's first access; the image initializer registers the descriptor with `Aps5GuestTlsRegister`. The thread pointer follows the block and points at itself, as on FreeBSD. `Aps5GuestTlsGetAddr` stands in for `__tls_get_addr`, with the descriptor as the module ID. The key's destructor frees a thread's block. - [Guest thread scheduling](../../../core/libs/prx/libkernel/Pthread/src/Thread.cpp) (libkernel) - the policies and priorities that `sched_get_priority_max`, `sched_get_priority_min`, `pthread_setschedparam` and `scePthreadSetschedparam` accept, and those a created thread takes, follow a PS5 (firmware 13.60), but they are only recorded and reported: they are not applied to host threads, so a title's priority order has no effect on host scheduling -- [sched_getparam, sched_getscheduler, sched_setparam](../../../core/libs/prx/libkernel/Pthread/Posix/Thread.cpp) (libkernel) - the own pid (`getpid()`) throws from any thread but the one `pthread_main_np` reports, and on macOS also from the guest's main thread, which runs on a second host thread. In a payload process on a PS5 (firmware 12.70), `sched_getparam(getpid())` from another thread read the priority of the thread that ran the payload's main, which may not be the process's first thread; FreeBSD's [`p1003_1b.c`](https://github.com/freebsd/freebsd-src/blob/8c639945a44588f6cfdddfb057bb5aad88735da0/sys/kern/p1003_1b.c#L110-L289) selects the first thread. `sched_setparam` throws for a policy other than `SCHED_FIFO` or `SCHED_RR`; `EPERM` outside 256-767 was measured only on `SCHED_FIFO`. Unwritable or unreadable parameter stores return `EFAULT` per FreeBSD. `sched_setscheduler` stays unimplemented +- [sched_getparam, sched_getscheduler, sched_setparam](../../../core/libs/prx/libkernel/Pthread/Posix/Thread.cpp) (libkernel) - the own pid (`getpid()`) throws from another thread before the main thread's first `scePthreadSelf` and after it exits (FreeBSD then selects a surviving thread; unmeasured), and on macOS from any thread, as the guest main runs on a second host thread. In a payload process on a PS5 (firmware 12.70), `sched_getparam(getpid())` from another thread read the priority of the thread that ran the payload's main, which may not be the process's first thread; FreeBSD's [`p1003_1b.c`](https://github.com/freebsd/freebsd-src/blob/8c639945a44588f6cfdddfb057bb5aad88735da0/sys/kern/p1003_1b.c#L110-L289) selects the first thread. `sched_setparam` throws for a policy other than `SCHED_FIFO` or `SCHED_RR`; `EPERM` outside 256-767 was measured only on `SCHED_FIFO`. Unwritable or unreadable parameter stores return `EFAULT` per FreeBSD. `sched_setscheduler` stays unimplemented +- [sceKernelUuidCreate, sceKernelCreateUuidV4](../../../core/libs/prx/libkernel/System/src/Process.cpp) (libkernel) return EFAULT (0x8002000e) for an unwritable destination buffer as a host-safety fallback; console behaviour for unwritable memory has not been measured. - [Linux runtime module initialization](../../../core/libs/prx/libkernel/Module/src/DynamicLoader.cpp) (libkernel) - modules in explicit runtime directories can be mapped for bindings before an explicit guest load runs their entry and init array once with the caller arguments. Finalizers run only after initialization completed. Console dependency-start and finalization ordering are unmeasured. Windows and macOS use their existing lifecycle paths. - [sceKernelMprotect, sceKernelMtypeprotect](../../../core/libs/prx/libkernel/DirectMemory/DirectMemory.cpp) (libkernel) over a range with a gap that is not registered in the allocation tracker protect the registered parts and skip the gap, and return 0, as FreeBSD 11.4's [`vm_map_protect`](https://github.com/freebsd/freebsd-src/blob/release/11.4.0/sys/vm/vm_map.c) does (it has no check for holes); a range whose start is unmapped (also when later pages are mapped) returns `SCE_KERNEL_ERROR_EINVAL` (`mprotect`: `EINVAL`) because an existing test pins that for an unmapped start; FreeBSD answers 0 there too (`vm_map_protect` takes the next entry), so this errno is not taken from the source and was not changed. `sceKernelMprotect` threw for a gap before, which ended the title. Every part is checked for a GPU or image pin before the first one is protected; the parts are then protected one after the other, so a host protection failure in a later part leaves the earlier parts changed (FreeBSD's `vm_map_protect` cannot fail in its second pass). The behaviour on the console is not known. None of this was measured on a console. @@ -168,11 +173,12 @@ - [lstat of a Windows symbolic link](../../../core/libs/prx/libkernel/File/src/NativeStat.cpp) (libkernel) reports a link whose target is relative, as `symlink` creates them, with the link's own times, `st_dev` and `st_ino`, mode `S_IFLNK | 0777` and the length of the target `readlink` returns as `st_size`. FreeBSD gives a new link `0777` less the creating process's umask, which the host does not keep, so the permission bits are not the console's. A link with an absolute target is reported the same way, using its print name, or its substitute name when the print name is empty, without a `\??\` or `\\?\` prefix. A directory junction is treated as a link only when `ReadJunction` in [WindowsSymbolicLink.hpp](../../../core/libs/prx/libkernel/File/include/WindowsSymbolicLink.hpp) accepts a drive-path target (`X:\...`) after stripping `\??\` / `\\?\`; volume mounts and other non-drive substitutes are not. Consumers of that drive-target path: [NativeStat.cpp](../../../core/libs/prx/libkernel/File/src/NativeStat.cpp) (`lstat`/`readlink`), [Open.cpp](../../../core/libs/prx/libkernel/File/src/Open.cpp) (`O_NOFOLLOW` → `EMLINK`, and `unlink` removing the junction), [Stdio.cpp](../../../core/libs/prx/libkernel/File/src/Stdio.cpp) (`rmdir` → `ENOTDIR`), and [Export.cpp](../../../core/libs/prx/libkernel_sys/Export.cpp) (`unlinkat` with and without `AT_REMOVEDIR`). `unlink` / plain `unlinkat` leave the target, including when it is not empty - [lstat of a Windows reparse point that is not a link](../../../core/libs/prx/libkernel/File/src/NativeStat.cpp) (libkernel) reports a mounted volume (`\??\Volume{GUID}\`) or another name surrogate as the reparse point itself, not followed, with the mode of its attributes, as CPython's `os.lstat` does, and a reparse point without the name surrogate bit (deduplication, cloud files) as `stat` reports it - [sceKernelMapDirectMemory with execute](../../../core/libs/prx/libkernel/DirectMemory/DirectMemory.cpp) (libkernel) - a protection with CPU execute (bit 0x4) returns `EINVAL` (0x80020016) and maps nothing, and `sceKernelMprotect` grants execute afterwards, as [PS5_PayloadSDK measured](https://github.com/mihawk-99/PS5_PayloadSDK/blob/3e31e0b1b68ada28beca68adc480cf0c3d17b9df/platform/docs/PROBE.md#L28-L34) in a title on firmware 12.09 for read-execute and read-write-execute. `sceKernelMapDirectMemory2`, `sceKernelMapNamedDirectMemory`, and `sceKernelBatchMap` and `sceKernelBatchMap2` with operation 0 share the check here, which is not measured for them, nor for a title with more privileges than a homebrew one. Of 40 `sceKernelMapDirectMemory` calls in ten titles checked, 35 pass a constant protection without execute and five read it from a register or field (one each in PPSA01494, PPSA21564 and PPSA30839, two in PPSA18194). +- [sceKernelMapDirectMemory over unallocated pages](../../../core/libs/prx/libkernel/DirectMemory/DirectMemory.cpp) (libkernel) - mapping a physical range that includes a page `sceKernelAllocateDirectMemory` has not allocated returns `ENOMEM` (0x8002000c) and maps nothing, as [shadPS4's `MemoryManager::MapMemory`](https://github.com/shadps4-emu/shadPS4/blob/82eb7cdf640990d2f5a2a3fa03b489f2b287b17e/src/core/memory.cpp#L543-L551) does; `sceKernelMapDirectMemory2`, `sceKernelMapNamedDirectMemory` and the map operation of `sceKernelBatchMap` go through the same check. The console's result is not measured. - [setitimer](../../../core/libs/prx/libkernel/System/src/Signals.cpp) (libkernel) follows FreeBSD's `sys_setitimer` and `kern_setitimer`: `EINVAL` for timers other than `ITIMER_REAL`, `ITIMER_VIRTUAL` and `ITIMER_PROF`, and for a value, or the interval of a non-zero value, with a negative field, `tv_usec` of 1000000 or more, or more than `INT32_MAX / 2` seconds; a null value reads the timer as `getitimer` does, with `EFAULT` when the output is null too. `ITIMER_REAL` shares the timer thread of `alarm`, which clears its interval: a zero value disarms it, the previous value is returned, and each expiry re-arms it by `it_interval`. With `SIG_IGN` an expiry is dropped. With `SIGALRM` blocked it is left on the pending set of `sigtimedwait`, as `kern_psignal` does, where `sigwait`, `sigtimedwait` and `sigwaitinfo` take it; unblocking it runs a guest handler on the unblocking thread, and with the default disposition exits the process with status 142. Unblocked, the default disposition exits the process with status 142 and a handler throws, since guest `SIGALRM` handlers are never run from the timer thread. The value is not raised to `tick / 16` as `itimerfix` does, and an interval below 1 ms throws, since the console's `hz`, and so that rounding, is unknown (1 ms covers any `hz` of 63 or more). `ITIMER_VIRTUAL` and `ITIMER_PROF` throw when armed, as process CPU time is not accounted, and read and disarm as zero. PPSA99420 imports it and fails to load without it - [pthread_getaffinity_np](../../../core/libs/prx/libkernel/Pthread/Posix/Thread.cpp) (libkernel) - answers a set of 8 or 16 bytes and returns `ERANGE` for 32 bytes or more, as [PS5_PayloadSDK measured](https://github.com/mihawk-99/PS5_PayloadSDK/blob/3e31e0b1b68ada28beca68adc480cf0c3d17b9df/platform/docs/PROBE.md#L287-L297) in a title on firmware 12.09; FreeBSD's 32-byte `cpuset_t` is therefore refused. Every other size throws, since none was measured. `pthread_setaffinity_np` and `cpuset_getaffinity` keep FreeBSD's 32-byte limit, which is not measured for them. - On Linux, [direct memory](../../../core/libs/prx/libkernel/DirectMemory/DirectMemory.cpp) lives in one sparse memfd at file offset = physical address, so the [GPU imports](../../../core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp) can share one udmabuf buffer object per 64 MiB of it. Released direct memory is not punched out of the file, because a live import of its chunk pins the pages and the GPU would keep reading the old ones: its pages stay committed (the process keeps the high-water mark of the direct memory it used) and are zeroed when the range is allocated again. - [system](../../../core/libs/prx/libkernel/System/src/Process.cpp) (libkernel) runs no command. It follows FreeBSD 11's `lib/libc/stdlib/system.c` for a sandbox without `/bin/sh`: a null command returns 1 unconditionally, as that version does, and any command returns the wait status of a child that could not exec the shell and called `_exit(127)` (`0x7f00`). Whether the console's application sandbox has no shell, and whether `vfork` succeeds there (FreeBSD returns -1 when it fails), is unverified -- [sceKernelWriteThrottlingStatus](../../../core/libs/prx/libkernel/File/src/Stdio.cpp) (libkernel) reports no write throttling: the host SSD has no write budget, so the first qword of the 32-byte status is set to `UINT32_MAX` and the rest is zeroed; returns `EFAULT` (`0x8002000e`) when passed a null status buffer pointer. PPSA17221 reads only that qword: it multiplies it by 64 KiB and compares the product with byte thresholds up to 0x4AF00000 to pick one of five tiers. When the call fails the title assumes 0x4B000001 bytes, which selects the same top tier as `UINT32_MAX`. What the value measures on hardware (a remaining budget or a rate) and the meaning of the other three qwords are unknown +- [sceKernelWriteThrottlingStatus](../../../core/libs/prx/libkernel/File/src/Stdio.cpp) (libkernel) reports no write throttling: the host SSD has no write budget, so the first qword of the 32-byte status is set to `UINT32_MAX` and the rest is zeroed; an unwritable or null status buffer pointer returns `EFAULT` (`0x8002000e`) as a host-safety fallback, and console behaviour for unwritable memory has not been measured. PPSA17221 reads only that qword: it multiplies it by 64 KiB and compares the product with byte thresholds up to 0x4AF00000 to pick one of five tiers. When the call fails the title assumes 0x4B000001 bytes, which selects the same top tier as `UINT32_MAX`. What the value measures on hardware (a remaining budget or a rate) and the meaning of the other three qwords are unknown - [Windows directory descriptors](../../../core/libs/prx/libkernel/File/src/DirectoryDescriptor.cpp) (libkernel) take one snapshot of the directory, on the first `getdents`, `getdirentries` or non-zero `lseek` (`SEEK_SET` or `SEEK_CUR`), and keep it until it is discarded; `lseek` to offset 0 only discards the snapshot, and the next read lists the directory again, so every rewind costs O(entries) on the next read. `lseek` takes the offset as an entry index and `SEEK_CUR` with offset 0 only reports the index. `SEEK_END` throws because FreeBSD defines it relative to the directory size, which is not modelled. A negative result returns `EINVAL` and a `SEEK_CUR` offset that overflows returns `EOVERFLOW`, as FreeBSD `vn_seek` reports them. Names whose UTF-8 encoding exceeds the one-byte `d_namlen` limit are not representable in this guest directory-record layout, so `getdents` and `getdirentries` throw when they reach one; FreeBSD's behavior for host filenames that exceed its `MAXNAMLEN` is not verified. `getdirentries` reports through `basep` the entry index its block starts at, so only 0 and the values from `basep` or `lseek` are valid offsets; FreeBSD offsets are filesystem cookies. Descriptors retain the opened directory's native handle across renames. Enumeration reloads and `*at` operations resolve its current path, so a concurrent rename between resolution and the operation is not atomic. Enumeration of a removed directory and network-share path queries have not been verified - [Linux directory entry types](../../../core/libs/prx/libkernel/File/src/Stdio.cpp) (libkernel) - `sceKernelGetdirentries` reports a host symlink inside the app0 tree as the type of its target (directory or regular file), since a console app0 has no links and links there come from how the title was unpacked; a link elsewhere, or a dangling one, stays a link. A directory opened through an app0 link resolves to its target's host path, so links nested inside that target keep the link type. - [ftruncate, truncate, sceKernelFtruncate](../../../core/libs/prx/libkernel/File/src/Stdio.cpp) (libkernel) extend a file on Windows with `SetFileInformationByHandle` (`FileEndOfFileInfo`), which reserves the clusters but writes no zero bytes, and report `EFBIG` for a length the volume cannot hold (`ERROR_INVALID_PARAMETER` on a disk file; seen with a length of `INT64_MAX`, the size from which NTFS refuses it was not measured) and `ENOSPC` when the free space is smaller. FreeBSD 11.4 makes the extension a hole on a file system that has them ([`ffs_truncate`](https://github.com/freebsd/freebsd-src/blob/release/11.4.0/sys/ufs/ffs/ffs_inode.c) writes only the last block), so a length above the free space succeeds there. A write behind the end of the file still makes NTFS write zero bytes over the gap, as the file is not sparse. None of this was measured on a console. One title (PPSA04354) calls it at 0xe9d4f2 and tests only the sign of the result; the lengths it passes are not examined. @@ -214,7 +220,7 @@ - On macOS the guest runs on a second thread and the main thread serves the main dispatch queue from its run loop: AppKit (SDL's Cocoa windows, Metal surfaces, event pumping and game controllers) only works on the main thread, and a guest never hands its thread back. The macOS entry stub of the relinker starts the guest through `Aps5StartGuest` ([MainThreadMacOs.cpp](../../../core/libs/prx/libkernel/Pthread/src/MainThreadMacOs.cpp)), on a thread with the stack size of the main thread (at least 8 MiB), and the guest ends the process with `exit`; a guest entry that returns aborts. libSceVideoOut sends its SDL calls to the main thread with `Aps5RunOnMainThread` (`OnMainThread` in [MainThread.hpp](../../../core/libs/prx/libSceVideoOut/include/MainThread.hpp)), which waits for them and rethrows their exceptions; a host program that never called `Aps5StartGuest` runs them in place - On macOS the Rosetta main stack and the stacks of the host threads lie inside the guest arena, where a title can map fixed addresses. `Aps5StartGuest` moves the main thread onto a 16 MiB stack at `0x600000000000`, copies `argv`, `environ`, the program name and the initial block off the old stack, and releases the old stack range to the arena ([MainThreadMacOs.cpp](../../../core/libs/prx/libkernel/Pthread/src/MainThreadMacOs.cpp)). The guest thread and the other host threads still take their stacks from the system, so a title that fixes a mapping over one of those stacks fails with a host region overlap. The move is skipped when the main stack lies outside the arena, when the new stack cannot be placed outside it, and on hosts that are not x86-64 - [sceKernelRaiseException](../../../core/libs/prx/libkernel/System/src/Exception.cpp) reaches a thread that waits in an alertable `TimedWait` wait through an APC. A thread blocked anywhere else, including all waits under `APS5_COARSE_TIMED_WAITS` and host waits inside the emulator, is redirected and runs the handler only when that wait returns -- [sceKernelRaiseException](../../../core/libs/prx/libkernel/System/src/Exception.cpp) on Windows runs a queued delivery (an APC) in the first alertable wait of libkernel's TimedWait the target enters, or where libkernel drains APCs after releasing its address-wait or park queue lock (both are taken under a delivery deferral). Host code that holds a lock of its own across such a wait keeps it held while a waiting handler runs +- [sceKernelRaiseException](../../../core/libs/prx/libkernel/System/src/Exception.cpp) on Windows runs a queued delivery (an APC) in the first alertable wait of libkernel's TimedWait the target enters, or where libkernel drains APCs after releasing its address-wait or park queue lock or after the spin that ends a sleep (each is taken under a delivery deferral). Host code that holds a lock of its own across such a wait keeps it held while a waiting handler runs - [sceKernelRaiseException](../../../core/libs/prx/libkernel/System/src/Exception.cpp) leaves the signal pending on a target thread that was created suspended and is not resumed yet, and delivers it on that thread once it is resumed, before its start routine; further raises while it is pending are merged into that one delivery. FreeBSD 11.4 libthr starts such a thread with every signal but `SIGTRAP` blocked ([`thr_create.c`](https://github.com/freebsd/freebsd-src/blob/8c639945a44588f6cfdddfb057bb5aad88735da0/lib/libthr/thread/thr_create.c#L177-L183)) and restores its mask only once it is resumed ([`thread_start`](https://github.com/freebsd/freebsd-src/blob/8c639945a44588f6cfdddfb057bb5aad88735da0/lib/libthr/thread/thr_create.c#L252-L294)), so a signal sent to it stays pending until then. The console's behaviour is unverified - [sigaltstack](../../../core/libs/prx/libkernel/System/src/Signals.cpp) (libkernel) records each thread's alternate signal stack and reports it back, following FreeBSD's `kern_sigaltstack` (`EINVAL` for flags other than `SS_DISABLE`, `ENOMEM` below `MINSIGSTKSZ` 2048), but handlers never run on it, so `SS_ONSTACK` and `EPERM` are never reported - [sigpending](../../../core/libs/prx/libkernel/System/src/Signals.cpp) (libkernel) reports the intersection of the process-wide pending set of `sigtimedwait` and the blocked mask of `_sigprocmask`, as FreeBSD's `sys_sigpending` intersects the pending list with `td_sigmask`, and returns -1 with `EFAULT` for a null set. PPSA99420 imports it @@ -231,13 +237,14 @@ - [sysarch](../../../core/libs/prx/libkernel/System/src/Process.cpp) (libkernel) - `AMD64_GET_FSBASE`, `AMD64_GET_GSBASE` and `AMD64_SET_GSBASE` follow FreeBSD 11's amd64 [`sysarch`](https://github.com/freebsd/freebsd-src/blob/release/11.0.0/sys/amd64/amd64/sys_machdep.c) on Linux x86-64 hosts, through the host's `arch_prctl`. The GS base belongs to the calling thread, a base at or above `0x800000000000` (`VM_MAXUSER_ADDRESS`) returns `EINVAL`, and a null argument returns `EFAULT`. `AMD64_SET_FSBASE` throws, since guest and host code share the thread's FS base for their TLS. In a payload process on a PS5 (firmware 12.70), `I386_GET_FSBASE` (7) and `I386_GET_GSBASE` (9) wrote 4 bytes, the low 32 bits of the FS and GS bases, and failed with `EFAULT` for a null argument; here they do the same on Linux x86-64 hosts. There a GS base set by one thread left the main thread's unchanged, and threads made with `pthread_create` and `scePthreadCreate` started with their creator's GS base; here a guest thread's host thread is created by the creating thread, and Linux's [`copy_thread`](https://github.com/torvalds/linux/blob/v6.6/arch/x86/kernel/process.c#L182-L186) gives a new thread its creator's GS base. The operation numbers FreeBSD 11's amd64 `sysarch` has no case for returned `EINVAL` there for the nine tried, each with a null argument (2, 5, 6, 12, 127, 133, 134, 1000 and -1; 6 is `I386_VM86`, which its header names), as its [default case](https://github.com/freebsd/freebsd-src/blob/release/11.0.0/sys/amd64/amd64/sys_machdep.c#L324-L325) does; here every such number returns `EINVAL` on every host; the numbers other than those nine follow that default case and were not measured. `AMD64_GET_XFPUSTATE` (132) returned 0 there for lengths 0, 64, 128, 256 and 512 (512 was also the largest length a search accepted) and failed with `EINVAL` for 1024, 2048, 4096 and 8192 and with `EFAULT` for a null argument or address, and `I386_GET_XFPUSTATE` (11) failed with `EFAULT` for a null argument; both throw here. The other operations FreeBSD 11's amd64 `sysarch` handles, and every operation it handles on other hosts (Windows keeps its TEB in GS), throw. - [kern.proc.pathname](../../../core/libs/prx/libkernel/System/src/SystemConfiguration.cpp) (libkernel) returns `/app0/eboot.bin` for pid -1 and the calling process, following FreeBSD's `sysctl_kern_proc_pathname`; the exact pathname on retail consoles remains unverified. - [kern.proc.pid](../../../core/libs/prx/libkernel/System/src/SystemConfiguration.cpp) (libkernel) - what the console fills in a process's `kinfo_proc` is unverified; `sysctl` {`CTL_KERN`, `KERN_PROC`, `KERN_PROC_PID`, pid} for the calling process returns a 1,088-byte FreeBSD 11 amd64 `kinfo_proc` ([`sys/sys/user.h`](https://github.com/freebsd/freebsd-src/blob/release/11.4.0/sys/sys/user.h)) holding only `ki_structsize`, `ki_pid`, `ki_ppid` and `ki_comm` (`eboot.bin`, the base name of the `kern.proc.pathname` value), with every other field 0, including `ki_flag`, so `P_TRACED` (0x800) is clear. Source Port (PPSA20040) asks for its own record with a 0x440-byte buffer and tests only bit 0x800 of `ki_flag` at offset 0x170, to see whether a debugger is attached. Any other pid, including -1, fails with `ESRCH`, a write with `EPERM` and a short buffer with `ENOMEM`, as for `kern.proc.vmmap`. +- [kern.proc.proc](../../../core/libs/prx/libkernel/System/src/SystemConfiguration.cpp) (libkernel) - `sysctl` {`CTL_KERN`, `KERN_PROC`, `KERN_PROC_PROC`} lists one process, the calling one, as the same 1,088-byte FreeBSD 11 amd64 `kinfo_proc` that `kern.proc.pid` builds, because the runtime hosts one guest process. A fourth element is ignored, as [`sysctl_kern_proc`](https://github.com/freebsd/freebsd-src/blob/release/11.4.0/sys/kern/kern_proc.c) takes no pid for `KERN_PROC_PROC`, and more than four elements return `EINVAL`. A null output reports the one record's size, where FreeBSD 11.4's [`sysctl_kern_proc`](https://github.com/freebsd/freebsd-src/blob/8c639945a44588f6cfdddfb057bb5aad88735da0/sys/kern/kern_proc.c#L1452-L1468) returns a five-record estimate; what the console answers is unverified, as are how many processes and records it lists and whether its record is 1,088 or 1,096 bytes. - [kern.proc.env](../../../core/libs/prx/libkernel/System/src/SystemConfiguration.cpp) (libkernel) - which variables, if any, the console starts an application with is unverified; `sysctl` {`CTL_KERN`, `KERN_PROC`, `KERN_PROC_ENV`, pid} returns 0 bytes, the empty start-up environment `environ` and libc's `getenv` also begin with, as FreeBSD 11's [`sysctl_kern_proc_env`](https://github.com/freebsd/freebsd-src/blob/releng/11.0/sys/kern/kern_proc.c) copies a process's start-up strings, not later `setenv` changes. Only the calling process's pid is accepted (`ESRCH` otherwise, -1 included); a write returns `EPERM`. PS5VR (PPSA99177) reads it for its own pid at start-up. - [kern.proc.vmmap](../../../core/libs/prx/libkernel/System/src/SystemConfiguration.cpp) (libkernel) - `sysctl` {`CTL_KERN`, `KERN_PROC`, `KERN_PROC_VMMAP`, pid} returns packed FreeBSD 11 `kinfo_vmentry` records (144 bytes each, an empty path) for the used ranges of the guest address-space arena, in address order, as [`kinfo_getvmmap`](https://github.com/freebsd/freebsd-src/blob/releng/11.0/lib/libutil/kinfo_getvmmap.c) reads them. A range is one record: the type is always `KVME_TYPE_DEFAULT`, the protection is `sceKernelVirtualQuery`'s for the range's first page (0 where it reports none), and offset, object, resident page counts, flags and path are 0. Only the calling process's pid is accepted (`ESRCH` otherwise, -1 included, as FreeBSD's `pget` gives); a write returns `EPERM` and a short buffer `ENOMEM`. Ranges outside the arena, which guest code cannot map, are not reported. The walk takes the arena lock once per range, not for the whole walk as FreeBSD holds the map lock, so an `mmap` or `munmap` on another thread can change the list between two records. Whether a PS5 application may read its own map, and what types and paths the console reports, is unverified - [sysctl names a PS5 payload process gets ENOENT for](../../../core/libs/prx/libkernel/System/src/SystemConfiguration.cpp) (libkernel) - a write to these names throws (except `machdep.cacheline_size`, `ENOENT` as on FreeBSD amd64), `sysctlnametomib` returns `ENOENT` for `kern.smp.maxcpus`, `kern.stackprot`, `kern.sched.name` and `kern.timecounter.hardware`, which the console maps to MIBs above 2147482800; a title process was not measured. A payload process on a PS5 (firmware 12.70, and 13.60 for four names) gets -1 with `ENOENT` by name for `hw.byteorder`, `hw.cacheline_size`, `hw.floatingpoint`, `hw.machine_arch`, `hw.usermem`, `kern.bootfile`, `kern.clockrate`, `kern.cp_time`, `kern.ident`, `kern.maxfiles`, `kern.maxfilesperproc`, `kern.maxproc`, `kern.ps_strings` and those four, and by MIB for {1, 6}, {1, 7}, {1, 12}, {1, 27}, {1, 32}, {6, 4} and {6, 11}, as here. `hw.physmem`, `hw.realmem` and `vm.overcommit` report values here - [Unknown sysctl names and MIBs](../../../core/libs/prx/libkernel/System/src/SystemConfiguration.cpp) (libkernel) - a numeric MIB under a known top-level node, or under one of 256 or more (where FreeBSD numbers dynamic nodes), that is not implemented throws, where a payload process on PS5 firmware 13.60 gets `ENOENT` for {1, 9999}, {6, 9999}, {0, 9999}, {1, 14, 9999, pid} and 24 levels starting {1, 9999}, since an unimplemented MIB here may exist there. A top-level node below 0 or from 10 to 255 gets `ENOENT` with the buffer and length untouched, as {99, 1} did there. Unrecognized names get `ENOENT` through `sysctlbyname` and `sysctlnametomib`, as `kern.anyps5.x` did. The ten FreeBSD top-level names (`sysctl` to `p1003_1b`), with or without a trailing dot, map to one level, and `sysctlbyname` fails them with `EINVAL`; a name of 1024 bytes or more gets `ENAMETOOLONG` from both, as measured for `kern` and `kern.` - [hw.pagesize](../../../core/libs/prx/libkernel/System/src/SystemConfiguration.cpp) (libkernel) reports the system page size (16384 bytes, PS5_PAGE_SIZE) as an integer through sysctl MIB {6, 7} (CTL_HW, HW_PAGESIZE) and the "hw.pagesize" sysctlbyname lookup, following FreeBSD's [`hw.pagesize`](https://github.com/freebsd/freebsd-src/blob/main/sys/kern/kern_mib.c#L177), a read-only `SYSCTL_INT` of `PAGE_SIZE`. A payload process on a PS5 (firmware 13.60) read the same 4-byte 16384 by name and by MIB. A write returns -1 with EPERM. - [Host CPU check](../../../core/libs/prx/libkernel/System/src/HostCpu.cpp) (libkernel) - when libkernel loads on a Linux or Windows x86-64 host, it logs which of the PS5 CPU's user-mode extensions CPUID reports and throws, naming the host CPU, if any extension is missing that LLVM selects from plain C/C++ for the PS5's Zen 2 (`-march=znver2`, [feature list](https://github.com/llvm/llvm-project/blob/llvmorg-19.1.7/llvm/lib/Target/X86/X86.td#L1459-L1513)): SSE to SSE4.2, SSSE3, POPCNT, LZCNT, BMI1, BMI2, MOVBE, CMPXCHG16B, LAHF/SAHF, AVX, AVX2, FMA, F16C, and the operating system's AVX state in XCR0 (#3719). SSE4A, CLZERO and SHA, which `--to-intel` converts, and AES, PCLMULQDQ, RDRAND, RDSEED, ADX, CLFLUSHOPT, CLWB, RDPID, XSAVEOPT, XSAVEC and PREFETCHW, which compilers emit only for intrinsics or explicit prefetches, are logged but not required: a title that executes one of them on a host without it still stops with an illegal instruction. macOS hosts are not checked: some Rosetta versions execute extensions without reporting them through CPUID, but support differs by host. ANDN and RDRAND fault on an M1 with macOS 15.3.1; see the [Rosetta conversion limits](relinker.md) -- [sceKernelGetSystemExVersion, sysKernelGetLowerLimitSysexVersion, sysKernelGetLowerLimitUpdVersion](../../../core/libs/prx/libkernel/System/src/SystemConfiguration.cpp) (libkernel) and [sceKernelGetTraceMemoryStats](../../../core/libs/prx/libkernel/DirectMemory/Export.cpp) (libkernel) - follow libkernel.sprx, libkernel_sys.sprx and libkernel_web.sprx of firmware 13.42, read from disassembly, and match a payload process on PS5 firmware 13.60, where all three libraries export each at the same address. None of them asks the kernel: the first writes an empty string to both outputs and returns a plain 22, not `SCE_KERNEL_ERROR_EINVAL`, when either is null; the lower limits write an empty string and a 32-bit 0; the trace memory statistics write 0 to each output that is not null. The meaning of the outputs is not known +- [sceKernelGetSystemExVersion, sysKernelGetLowerLimitSysexVersion, sysKernelGetLowerLimitUpdVersion](../../../core/libs/prx/libkernel/System/src/SystemConfiguration.cpp) (libkernel) and [sceKernelGetTraceMemoryStats](../../../core/libs/prx/libkernel/DirectMemory/Export.cpp) (libkernel) - follow firmware 13.42 disassembly and match a payload process on PS5 firmware 13.60, where libkernel, libkernel_sys and libkernel_web export each at the same address. None asks the kernel: the first writes an empty string to both outputs and returns a plain 22, not `SCE_KERNEL_ERROR_EINVAL`, when either is null; lower limits write an empty string and a 32-bit 0; trace memory statistics write 0 to each output that is not null; an unwritable pointer returns `SCE_KERNEL_ERROR_EFAULT` here, where the console faults. Output meaning is unknown. Unwritable outputs return 14 (`SCE_KERNEL_ERROR_EFAULT` for lower limits) as a host-safety fallback; console behaviour there was not measured - [sysKernelGetUpdVersion, sysKernelGetManufacturingMode, sysKernelGetIntdevModeForInternalLibc, sysKernelGetIntdevModeForRcmgr](../../../core/libs/prx/libkernel/System/src/SystemConfiguration.cpp) (libkernel) - follow firmware 13.42 disassembly measured by BunnyFl, querying sysctlbyname: `sysKernelGetUpdVersion` checks null (`SCE_KERNEL_ERROR_EINVAL`) and queries `machdep.upd_version`; `sysKernelGetManufacturingMode` queries `machdep.curr_manumode`; `sysKernelGetIntdevModeForInternalLibc` and `sysKernelGetIntdevModeForRcmgr` query `machdep.rcmgr_intdev_for_internal_libc` and `machdep.rcmgr_intdev`. On AnyPS5, these sysctls return 0 as assumed defaults and reject writes with `EPERM`; their values and write policy on retail consoles are unmeasured - [machdep.tsc_freq](../../../core/libs/prx/libkernel/System/src/SystemConfiguration.cpp) (libkernel) reports the host TSC frequency that `sceKernelGetTscFrequency` measures, as a 64-bit value like FreeBSD 11's [`sysctl_machdep_tsc_freq`](https://github.com/freebsd/freebsd-src/blob/release/11.0.0/sys/x86/x86/tsc.c#L658-L676). FreeBSD lets root write it to change the TSC timecounter's frequency; a write here returns -1 with `EPERM`. PPSA99203 reads it at start-up and measures the TSC itself when the value is 100 MHz or less - [getrlimit](../../../core/libs/prx/libkernel/System/src/Process.cpp) (libkernel) - `RLIMIT_CPU`, `RLIMIT_FSIZE`, `RLIMIT_CORE`, `RLIMIT_SBSIZE`, `RLIMIT_VMEM`/`AS`, `RLIMIT_NPTS`, `RLIMIT_SWAP`, `RLIMIT_KQUEUES` and `RLIMIT_UMTXP` report infinity as in FreeBSD's process-0 defaults, and `RLIMIT_DATA` mirrors the host limit; a payload process on a PS5 (firmware 12.70) reads 0x800000000 for both limits. `RLIMIT_NOFILE` reports, as both soft and hard limit, the number of descriptors after which AnyPS5 itself fails with `EMFILE`: on Windows the C runtime's 8192 low-level descriptors, which guest files, pipes and sockets all take, and as many stdio streams, which libkernel raises from 512 at load with [`_setmaxstdio`](https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/setmaxstdio), on Linux the host's `RLIMIT_NOFILE`, whose soft limit libkernel raises to the hard limit at load, and on macOS the smaller of the host's hard limit and `kern.maxfilesperproc`, which libkernel sets as both limits at load, since macOS fails with `EMFILE` at `kern.maxfilesperproc` whatever the soft limit. A payload process on a PS5 (firmware 12.70) reads 13952 for both limits, while `getdtablesize` returns 12555 and the process can open descriptors up to 12554. XPSemu (PPSA97358) reads `RLIMIT_NOFILE` in QEMU's `os_setup_limits` and raises the soft limit to the hard one when they differ. `RLIMIT_STACK` (0x200000), `RLIMIT_RSS` and `RLIMIT_MEMLOCK` (infinity) and `RLIMIT_NPROC` (1604) report the soft and hard limits a payload process reads on a PS5 (firmware 12.70). Guest locking still follows the host: `mlock` and `sceKernelMlock` fail at the host's hard `RLIMIT_MEMLOCK` on Linux, and on Windows when the process working set cannot grow, although `RLIMIT_MEMLOCK` reports infinity. There the main thread's stack is 0x200000 as well (`pthread_attr_get_np`); here the main thread runs on the host thread's stack, whose size can differ. Whether a title process reads the same limits is unverified. @@ -288,6 +295,8 @@ - [socket](../../../core/libs/prx/libkernel/Socket/src/Udp.cpp) (libkernel) creates only `SOCK_STREAM` and `SOCK_DGRAM` sockets in `AF_INET` and `AF_INET6`. In a payload process on a PS5 (firmware 13.60) `SOCK_RDM`, `SOCK_SEQPACKET` and an unknown type failed with `EPROTOTYPE` when the protocol was 0 and `EPROTONOSUPPORT` otherwise, as here, and a family other than `AF_INET`, `AF_INET6` and `AF_UNIX` with `EAFNOSUPPORT`. The console also created `SOCK_RAW` (for that payload process, which may hold privileges a title does not), `SOCK_DGRAM` with `IPPROTO_UDPLITE`, and `AF_UNIX` stream, datagram and seqpacket sockets; these fail here with `EPROTONOSUPPORT` and `EAFNOSUPPORT` (`socketpair` supports `AF_UNIX`) - [sigtimedwait](../../../core/libs/prx/libkernel/System/src/Signals.cpp) (libkernel) waits on a process-wide pending set instead of throwing: a signal raised while blocked stays pending and is taken by `sigwait`, `sigwaitinfo` or `sigtimedwait`, delivered to the handler when `_sigprocmask` unblocks it, or delivered by `pause`. The set covers all 128 signals and the lowest number that is pending and in the set is selected (FreeBSD specifies the lowest number only among real-time signals). Selection, `EAGAIN` on timeout, `EINVAL` for a `tv_nsec` outside 0 to 1000000000 while nothing is pending and `NULL` timeout blocking indefinitely follow FreeBSD's [sigtimedwait(2)](https://man.freebsd.org/cgi/man.cgi?query=sigtimedwait). `sigwait` returns 0 with the number in its output, as POSIX specifies, and `sigwaitinfo` and `sigtimedwait` return the number, as FreeBSD does. The guest `siginfo_t` follows FreeBSD 11's `sys/sys/siginfo.h`: 80 bytes, `si_signo` at 0, `si_code` at 8, `si_pid` at 12, `si_uid` at 16, `si_addr` at 24, `si_value` at 32 and `si_band` at 40; only `si_signo`, `si_code` (`SI_USER`) and `si_pid` (the guest pid) are written, `si_uid` stays 0 because no uid is modelled, and the console's layout is not verified. PPSA85300 imports `sigtimedwait` and fails to load without it; its only call site is VLC's `vlc_writev` ([filesystem.c](https://github.com/videolan/vlc/blob/6de05adcbaf2e8b85fe86aad4169393098628119/src/posix/filesystem.c#L243-L278)), which polls with a zero timeout to drain a `SIGPIPE` only after `writev` fails with `EPIPE`. The waits are not cancellation points and an unblocked caught signal does not interrupt them with `EINTR`, where FreeBSD's `sigwaitinfo` and `sigtimedwait` may return it. `SIGPIPE` has no host equivalent and is never raised by a host write here (see `read, write and vector I/O`), so VLC's drain finds nothing - [pause, sigsuspend, sigwait, sigwaitinfo](../../../core/libs/prx/libkernel/System/src/Signals.cpp) (libkernel) take the pending set of `sigtimedwait` instead of throwing. `pause` waits for a pending signal that is not blocked and whose disposition can be delivered, runs its handler on the calling thread and returns -1 with `EINTR`; an ignored signal is discarded and the wait continues, and it never returns for a signal whose handler cannot run. A signal whose registered handler has `SA_SIGINFO` still throws, and one whose disposition is the default action and that has no host equivalent (every signal except 2, 4, 6, 8, 11 and 15) is neither delivered nor discarded: it stays pending until a wait takes it, where FreeBSD runs the default action, which terminates the process for most of them. A pending `SIGALRM` with the default disposition exits the process with status 142 once it is unblocked, as FreeBSD's default action does. PPSA68091, PPSA99169, PPSA99420 and PPSA97358 import them and fail to load without them. PPSA68091 calls `pause` at one site (0x8F7266), in a loop that waits while a global holds another thread's `errno` address. PPSA99169 only stores the address of `pause` in a table of symbol addresses (0x30DB1). PPSA99420 calls `pause` at 0x3BD80F6 and 0x3C9E220, `sigwait` at 0x3C9E4C7 and `sigwaitinfo` at 0x3C9E588. PPSA97358 calls `sigwait` from QEMU's `sigwait_compat` thread ([compatfd.c](https://github.com/ZiZc3/XPSemu/blob/8eec07b4e31f66dce8e0b05c1ca1281af303e933/util/compatfd.c#L28-L53)), which `qemu_signal_init` ([main-loop.c](https://github.com/ZiZc3/XPSemu/blob/8eec07b4e31f66dce8e0b05c1ca1281af303e933/util/main-loop.c#L110-L147)) starts for `SIGIO`, `SIGALRM` and `SIGBUS` when the main loop is created, so it reaches the wait at start-up, and from the vCPU thread of the dummy accelerator ([dummy-cpus.c](https://github.com/ZiZc3/XPSemu/blob/8eec07b4e31f66dce8e0b05c1ca1281af303e933/accel/dummy-cpus.c#L48-L56)). `sigsuspend` swaps the process-wide mask of `_sigprocmask` for its argument, waits as `pause` does through the same helper, then restores the mask through `_sigprocmask`, and returns -1 with `EINTR`; a null set throws, as the console faults in libthr instead of returning `EFAULT`. All four words of the argument replace the mask and are restored afterwards, as in `_sigprocmask`. Java 25 LAN / DNS (PPSA99869, #5501) imports it and fails to load without it, after `sysctlnametomib`, `fegetenv` and `mincore`. None of the five waits is a cancellation point +- [sigtimedwait, sigwaitinfo, sigwait memory validation](../../../core/libs/prx/libkernel/System/src/Signals.cpp) (libkernel) - unreadable `timeout` and unwritable `info` or `sig` follow FreeBSD 11.4's kernel `copyin` and `copyout` returning `EFAULT` (`sigwait` returning it as the result). An unreadable `set` returns `EFAULT` here where libthr faults in user space, and the console is not measured. As in the kernel, a signal already taken is not put back if writing `info` or `sig` fails. + - [getsid, setpgid, setpgrp](../../../core/libs/prx/libkernel/System/src/Process.cpp) (libkernel) - getsid returns the calling process ID for pid 0 and the calling process, and `ESRCH` for other process IDs, assuming the single guest process is its own session leader. setpgid and setpgrp follow FreeBSD 11.4's `sys_setpgid` for the only guest process: a negative group ID fails with `EINVAL`, a process ID other than 0 or the caller's PID (including a negative PID) fails with `ESRCH`, and because the single guest process is modeled as its own session leader, `SESS_LEADER(targp)` fails with `EPERM` before normalizing the process group or reaching the same-process-group no-op. PPSA74126 imports `getsid` and fails to load without it - [sigaction](../../../core/libs/prx/libkernel/System/src/Signals.cpp) (libkernel) records the handler, flags and mask of every signal from 1 to 128 and reports them back, following FreeBSD's `sigaction` (`EINVAL` for other signals, and for a handler on `SIGKILL` or `SIGSTOP`); `signal` records its handler with `SA_RESTART`, as FreeBSD's libc does. Only handlers without `SA_SIGINFO` on the signals `signal` already delivers (`SIGINT`, `SIGILL`, `SIGABRT`, `SIGFPE`, `SIGSEGV`, `SIGTERM`) run, the same way `signal` handlers do. While a handler runs, its own signal (unless `SA_NODEFER`) and the signals of its mask other than `SIGKILL` and `SIGSTOP` are blocked, and `SA_RESETHAND` resets the disposition to the default before it runs, as FreeBSD's `postsig_done` does. Those blocks are held apart from the process-wide mask that `sigprocmask` sets, which reports them, and are released when the handler returns, so a block another thread adds meanwhile is kept, for the same signal too, and so is one the handler adds itself, which FreeBSD's `sigreturn` would undo. `SIG_UNBLOCK` of a held signal releases its hold and `SIG_SETMASK` releases them all. When the handler's own thread released one, that signal gets back its bit of the process mask from before the handler when the handler returns, as FreeBSD's `sigreturn` puts back the mask from before it, so a handler that saves and restores the mask with `SIG_SETMASK`, or calls `pselect`, leaves its signal unblocked. A `sigsuspend` inside a handler keeps the holds, where FreeBSD replaces the whole thread mask. A handler left with `longjmp`, or with `siglongjmp` to a buffer that saved the mask, gets back the mask that buffer saved, as on FreeBSD; a signal raised meanwhile stays pending and is delivered when the handler returns to `raise`, but one left pending by a handler that a host signal ran asynchronously waits for the next `raise` or `_sigprocmask`. `SA_ONSTACK` is not applied. `SA_SIGINFO` handlers are recorded but never called, since that needs FreeBSD's `siginfo_t` and `ucontext_t`, and neither are the handlers of other signals (`SIGBUS`, `SIGHUP`, ...), whether they are set by `sigaction` or by `signal`, which records them too (every number from 1 to 128, with `SA_RESTART` and an empty mask replacing what `sigaction` stored; `SIGKILL` and `SIGSTOP` accept only the default handler in both calls, as in FreeBSD's `kern_sigaction`). `raise` and `kill` accept every number from 1 to 128 now: a blocked one stays pending on the set of `sigtimedwait`, an unblocked one whose handler is registered runs it on the calling thread, and an unblocked one that has no host equivalent and no handler still fails with `EINVAL`, where FreeBSD runs its default action. `raise` of an `SA_SIGINFO` handler still throws instead of terminating - [signal](../../../core/libs/prx/libkernel/System/src/Signals.cpp) (libkernel) records its handler with `SA_RESTART` unless the signal is in the exported `_sigintr` set, as FreeBSD's libc does (`lib/libc/gen/signal.c`). `siginterrupt`, which fills that set, is a libSceLibcInternal export that libc serves through the `sigaction` and the set libkernel registers at load (see libc). @@ -302,13 +311,13 @@ - [_accept, _bind, _connect, _getpeername, _getsockname, _getsockopt, _listen, _recvfrom, _recvmsg, _sendmsg, _sendto, _setsockopt](../../../core/libs/prx/libkernel/Socket/src/Udp.cpp), [_getdirentries](../../../core/libs/prx/libkernel/File/src/Stdio.cpp), [_sigaction, _sigsuspend](../../../core/libs/prx/libkernel/System/src/Signals.cpp) (libkernel) are not measured on the console. They forward to the calls without the underscore, which have no libthr layer here, as FreeBSD 11.4 makes the underscore names the plain system calls. `_sigaction` and `sigaction` share one handler table, where FreeBSD's `__thr_sigaction` hands its own wrapper to the system call `_sigaction` reads back, and rejects `SIGCANCEL` (32). A null set throws in `_sigsuspend` as in `sigsuspend`, while the system call FreeBSD 11.4 exports as `_sigsuspend` ([`Symbol.map`](https://github.com/freebsd/freebsd-src/blob/8c639945a44588f6cfdddfb057bb5aad88735da0/lib/libc/sys/Symbol.map#L961)) returns `EFAULT` - [Regular file mappings](../../../core/libs/prx/libkernel/DirectMemory/PosixMemory.cpp) (libkernel) - on Linux `mmap` maps a regular file's descriptor shared or private like a shared memory object, with the same access checks; SQLite's WAL index (`-shm`) in Dusklight PPSA99305 needs it. FreeBSD 11 `mmap(2)` and shadPS4's `MemoryManager::MapFile` map regular files; the console's behaviour is not measured. Other descriptors (pipes, sockets, directories, devices) still fail with `EOPNOTSUPP`. On Windows a shared mapping is a view of a file section (`CreateFileMappingW` on the descriptor's handle, read-write when the descriptor is, otherwise read-only), so writes through the descriptor and the mapping see each other. This also maps anonymous `shm_open` objects and JIT shared memory descriptors, which are temporary files on Windows. A shared mapping may end inside the 16 KiB page that holds the end of the file, as POSIX [`mmap`](https://pubs.opengroup.org/onlinepubs/9799919799/functions/mmap.html) allows (llama.cpp in PS5LM Plus PPSA99581 maps a whole model file this way): the section keeps the file's size, so the file never grows, the view ends with the 4 KiB host page that holds the end of the file, which Windows fills with zeros past it, and the rest of the guest page is private zero pages. As POSIX requires, the bytes past the end read zero and are never written to the file; bytes written to those private pages are seen only through that mapping, not through other mappings of the file, and a file that grows later does not show its new bytes there. A shared mapping that reaches a whole page past the end of the file fails with `EOPNOTSUPP`, where POSIX maps it and delivers `SIGBUS` on access, as does a write-only descriptor; FreeBSD 11.4's `vn_mmap` maps a write-only descriptor without `PROT_READ`, and Linux refuses it with `EACCES`. A `PROT_EXEC` mapping is a view of a section created on a second handle that `ReOpenFile` opens with execute access, so a file whose ACL does not grant the user execute fails with `EACCES`, where FreeBSD maps it unless the file system is mounted `noexec`. A read-write alias (`GuestArenaMapAlias`) of a mapped page that holds the end of the file throws. `mprotect` above the view's protection (writing through a read-only descriptor, or adding `PROT_EXEC`) fails with `EACCES` before anything changes; FreeBSD allows `PROT_EXEC` on a readable descriptor. Shrinking the file with `ftruncate` fails with `EINVAL` while any shared mapping of it exists, even one that does not cover the removed part, because the section keeps the file's size at `mmap`; FreeBSD truncates. A read-write alias of a view (`GuestArenaMapAlias`, used when the GPU imports guest memory) of a read-only file section fails, as the alias is mapped `PAGE_READWRITE`. Views of the same file made by separate `mmap` calls are separate sections, so write tracking does not treat them as aliases of each other. A private mapping on Windows is a copy of the file read at `mmap`, which POSIX allows (later changes to the file need not show); pages wholly past the end of the file fail with `EOPNOTSUPP` instead of faulting on access, and a write-only descriptor fails with `EOPNOTSUPP`. - [File mappings on macOS](../../../core/libs/prx/libkernel/DirectMemory/PosixMemory.cpp) (libkernel) - `mmap` of a regular file, of an anonymous `shm_open` object (an unlinked temporary file on macOS) or of a JIT shared memory descriptor maps the descriptor shared or private as on Linux, with the same access checks. macOS refuses to create an executable file mapping (`EPERM`), so an executable mapping is made without execute and then given it with `mprotect`. Under Rosetta 2 (Apple M2, macOS 26), code rewritten through one view of a file after it ran from another view keeps its old translation until the executable view's protection changes. Named `shm_open` objects still throw on macOS. -- [sendfile](../../../core/libs/prx/libkernel/Socket/src/Udp.cpp) (libkernel) follows FreeBSD 11's `sendfile` for a connected stream socket: headers, the file from `offset` (to its end when `nbytes` is 0) and trailers, the file offset left unchanged, `EAGAIN` with `*sbytes` set after a partial send on a non-blocking socket. It reads the file through `sceKernelPread` in 64 KiB blocks and sends each with `send`. A file that is not a regular file or shared memory, such as a socket, `/dev/urandom` or a kqueue, fails with `EINVAL` and `*sbytes` 0, as FreeBSD's [`sendfile_getobj`](https://github.com/freebsd/freebsd-src/blob/8c639945a44588f6cfdddfb057bb5aad88735da0/sys/kern/kern_sendfile.c#L421-L463) refuses it. `flags` are ignored: reads complete before sending, so `SF_NODISKIO` never fails with `EBUSY`, and `SF_SYNC` returns once the data is queued on the socket rather than sent. PS5MC (PPSA99420) imports it +- [sendfile](../../../core/libs/prx/libkernel/Socket/src/Udp.cpp) (libkernel) follows FreeBSD 11's `sendfile` for a connected stream socket: headers, the file from `offset` (to its end when `nbytes` is 0) and trailers, the file offset left unchanged, `EAGAIN` with `*sbytes` set after a partial send on a non-blocking socket. It reads the file through `sceKernelPread` in 64 KiB blocks and sends each with `send`. A file that is not a regular file or shared memory, such as a socket, `/dev/urandom` or a kqueue, fails with `EINVAL` and `*sbytes` 0, as FreeBSD's [`sendfile_getobj`](https://github.com/freebsd/freebsd-src/blob/8c639945a44588f6cfdddfb057bb5aad88735da0/sys/kern/kern_sendfile.c#L421-L463) refuses it. Unreadable `headers` or iovecs return `EFAULT` before anything is sent, as FreeBSD's `copyin` and `copyinuio` do; an unwritable `sbytes` is skipped and the call returns the transfer's result, as FreeBSD ignores that [`copyout`](https://github.com/freebsd/freebsd-src/blob/release/11.4.0/sys/kern/kern_sendfile.c#L982-L983). `flags` are ignored: reads complete before sending, so `SF_NODISKIO` never fails with `EBUSY`, and `SF_SYNC` returns once the data is queued on the socket rather than sent. PS5MC (PPSA99420) imports it - [pthread_kill](../../../core/libs/prx/libkernel/System/src/Signals.cpp) (libkernel) returns the error number like FreeBSD's `pthread_kill`: `EINVAL` for signals outside 0 to 128 and `ESRCH` for a null thread. A signal to the calling thread goes through `raise`, so it shares `raise`'s limits; a signal to another thread is left on the pending set for whichever thread waits for or unblocks it, since it is not delivered to the chosen thread, and a handle that is not a live guest thread returns `ESRCH` without touching it - [select](../../../core/libs/prx/libkernel/Socket/src/Socket.cpp) (libkernel) fails an `nfds` above 1024 with `EINVAL`, where a payload process on a PS5 (firmware 13.60) accepted 1025. Like FreeBSD 11.4's `select_check_badfd`, the console failed `EBADF` for a set bit above its last open descriptor (measured with `nfds` 1000, where AnyPS5 also fails `EBADF`); the probe's sets held 1024 bits, so its results at `nfds` 1025 and 65536 depend on the bytes past them. On a timeout with nothing ready the console cleared a set bit at `nfds` (`nfds` 16, descriptor 16), as FreeBSD writes back whole 64-bit `fd_mask` words; with `nfds` 0 the bit stayed set, as here. A timeout beyond the remaining `steady_clock` range saturates at `time_point::max()`, so the wait may never end; how long the console waits then is unknown. It accepted seconds up to `INT64_MAX` (on a ready descriptor) and failed a negative field or `tv_usec` of 1000000 or more with `EINVAL`, as here - [inet_ntop, inet_pton](../../../core/libs/prx/libkernel/Socket/src/AddressConversion.cpp) (libkernel) - an `AF_INET6` result of `inet_ntop` is followed by zero bytes up to `size`. In a payload process on a PS5 (firmware 12.70), the text forms, the order of the checks and this padding were measured through both exports. The padding was sampled at sizes from 3 to 65536, above 64 only at 65, 128, 256, 1024, 4096 and 65536; the sizes that were not sampled, sizes above 65536 and a title process are assumed to behave the same. Two titles (PPSA03001 at 0x249355d, PPSA07426 at 0x186d3ca) disassembled for this entry call `inet_pton` once each with the family constant 2 and test only whether the result is 0, so 1 and -1 both take the use path; what they do with `AF_INET6` is not shown. - [_fstatfs](../../../core/libs/prx/libkernel/File/src/Stdio.cpp) (libkernel) reports the host volume of a file, not a console mount: block sizes, block counts, name length and the read-only, `nosuid` and `noexec` flags (on Windows only read-only, and `f_files` and `f_ffree` are 0). The type, mount names, owner, filesystem id and I/O counters are 0 or empty. Sockets, pipes and kqueues return `EINVAL`, as FreeBSD's `getvnode` does. A character device, including `/dev/random` and `/dev/urandom`, reports FreeBSD 11.4's [`devfs_statfs`](https://github.com/freebsd/freebsd-src/blob/release/11.4.0/sys/fs/devfs/devfs_vfsops.c#L225-L237) values on every host: no flags, 512-byte blocks, 2 blocks, nothing free and a 255-byte name limit. A Windows descriptor that is none of these throws. Stremio Plus (PPSA74126) reads the free space before a download and only logs the other fields - [pthread_spin_lock](../../../core/libs/prx/libkernel/Pthread/Posix/Spinlock.cpp) (libkernel) - a lock taken again by the thread that holds it throws here. On a PS5 (firmware 12.70) that call had not returned after 2 s, as FreeBSD 11.4 libthr [`thr_pspinlock.c`](https://github.com/freebsd/freebsd-src/blob/8c639945a44588f6cfdddfb057bb5aad88735da0/lib/libthr/thread/thr_pspinlock.c) spins forever -- [pthread_mutex_getspinloops_np, pthread_mutex_setspinloops_np, pthread_mutex_getyieldloops_np, pthread_mutex_setyieldloops_np and their scePthreadMutex counterparts](../../../core/libs/prx/libkernel/Pthread/src/Mutex.cpp) (libkernel) store and report the counts, but host mutexes do not spin or yield by them. Measured on PS5 firmware 13.60: the defaults are 2000 spins for an adaptive mutex (type 4) and 0 otherwise, with 0 yields, for mutexes from `pthread_mutex_init` and `scePthreadMutexInit` alike, as FreeBSD 11.4's [`mutex_init_body`](https://github.com/freebsd/freebsd-src/blob/8c639945a44588f6cfdddfb057bb5aad88735da0/lib/libthr/thread/thr_mutex.c#L236-L272) sets them; every get and set, the yield setter included, returns `EINVAL` (22, or `0x80020016` from the `scePthreadMutex` calls) on a destroyed mutex without writing the output +- [pthread_mutex_getspinloops_np, pthread_mutex_setspinloops_np, pthread_mutex_getyieldloops_np, pthread_mutex_setyieldloops_np and their scePthreadMutex counterparts](../../../core/libs/prx/libkernel/Pthread/src/Mutex.cpp) (libkernel) - unlike FreeBSD 11.4's `mutex_lock_sleep`, priority-inherit and -protect mutexes spin, and a negative count spins 0 times, not until it wraps; unmeasured on the console. Measured on PS5 firmware 13.60: the defaults are 2000 spins for an adaptive mutex (type 4) and 0 otherwise, with 0 yields, for mutexes from `pthread_mutex_init` and `scePthreadMutexInit` alike, as FreeBSD 11.4's [`mutex_init_body`](https://github.com/freebsd/freebsd-src/blob/8c639945a44588f6cfdddfb057bb5aad88735da0/lib/libthr/thread/thr_mutex.c#L236-L272) sets them; every get and set, the yield setter included, returns `EINVAL` (22, or `0x80020016` from the `scePthreadMutex` calls) on a destroyed mutex without writing the output - [pthread_mutexattr_setkind_np](../../../core/libs/prx/libkernel/Pthread/Posix/Mutex.cpp) (libkernel) keeps the low 16 bits of the kind as a signed value; `pthread_mutexattr_gettype` fails with `EINVAL` only for a kind above 4, so a negative kind is returned with success, and `pthread_mutex_init` and `scePthreadMutexInit` fail with `EINVAL` for a kind outside 1 to 4 without touching the mutex. Measured in #10725 by running the firmware 13.42 `libkernel.sprx` and `libkernel_sys.sprx` in an emulator, not on a console or in a title process - [pthread_cond_signalto_np, scePthreadCondSignalto](../../../core/libs/prx/libkernel/Pthread/src/Cond.cpp) (libkernel) wake every waiter of the condition variable, so the other waiters see a spurious wakeup, where a payload process on PS5 firmware 13.60 woke only the target and the other waiter of two timed out; waking one thread would need a wait per waiter in the condition variable every wait shares. A thread handle that does not exist returns `EPERM` here, where that console returned `ESRCH`. Otherwise they follow that console: a null thread returns `EINVAL` and a thread that is not waiting on the condition variable `EPERM`, which a registry of each condition variable's waiting threads answers. A thread joins it before it releases the mutex, so a caller holding that mutex wakes it; a caller that does not can find it registered before it blocks and lose the wakeup, as `scePthreadCondSignal` can - [pthread_rwlockattr_gettype_np, scePthreadRwlockattrGettype](../../../core/libs/prx/libkernel/Pthread/Posix/Rwlock.cpp) (libkernel) report the type stored by `scePthreadRwlockattrSettype`, which accepts any value and which read-write locks do not apply; the console's valid types and their effect are unverified. A null or uninitialized attribute throws, as for `pthread_rwlockattr_getpshared` @@ -317,7 +326,7 @@ - [pthread_barrier_setname_np](../../../core/libs/prx/libkernel/Pthread/Posix/Barrier.cpp) (libkernel) - the console passes `name` to the kernel's `namedobj_create` and stores the returned id instead of the name; here the name is copied and never read back. Once named, a barrier returns `EAGAIN` (35) for every later call and keeps its name, as [firmware 13.42's module run on a PC](https://github.com/boykopovar/AnyPS5/pull/10385#issuecomment-6415603047) does. The kernel's handling of a null `name` is unmeasured: here it returns 0 and leaves the barrier unnamed. A null barrier pointer, an unset barrier and a destroyed one fault in the module and throw here - [sysctl kern.arandom](../../../core/libs/prx/libkernel/System/src/SystemConfiguration.cpp) (libkernel) serves FreeBSD 11's MIB {1, 37} (CTL_KERN, KERN_ARANDOM) and the "kern.arandom" sysctlbyname lookup through std::random_device, returning min(*oldLength, 256) random bytes. Following FreeBSD's sysctl_kern_arnd, a null buffer reports min(*oldLength, 256) without writing, a null length returns 0 without writing, and requests with a new value return EPERM (1) as the node is read-only. Cryptographic quality depends on the host's random device implementation. - [pthread_atfork](../../../core/libs/prx/libkernel/Pthread/Posix/Atfork.cpp) (libkernel) appends the three handlers to a process-wide list and returns 0, or `ENOMEM` when the entry cannot be allocated, as FreeBSD 11.4's [`_pthread_atfork`](https://github.com/freebsd/freebsd-src/blob/8c639945a44588f6cfdddfb057bb5aad88735da0/lib/libthr/thread/thr_fork.c#L78-L100) does; null handlers are accepted. The handlers never run: `fork` throws and `vfork` is absent, so no child process is created. Handlers of a module that is unloaded stay in the list, where FreeBSD's `__pthread_cxa_finalize` removes them. PPSA97358 has a source-level call from the constructor `rcu_init` ([rcu.c](https://github.com/ZiZc3/XPSemu/blob/8eec07b4e31f66dce8e0b05c1ca1281af303e933/util/rcu.c#L488-L495)), but current-main runtime reachability is unverified -- [sceKernelGetPageTableStats](../../../core/libs/prx/libkernel/DirectMemory/Export.cpp) (libkernel) reports 8192 entries on each side and counts them as a PS5 (firmware 13.60) counted them for a payload process: one cpu entry for each 2 MiB granule that holds a committed mapping, whatever its protection (none included), and one gpu entry for each 1 GiB region that holds a GPU-accessible mapping, plus one for each 2 MiB granule of such a mapping that is not a whole granule of direct memory at a 2 MiB-aligned physical address. A granule or region shared by several mappings counts once, and reservations do not count. On the console the first GPU mapping of a process also takes three gpu entries and one cpu entry that stay after it is unmapped, which is not modelled, and only the ranges whose protection is recorded here are counted. A null pointer returns `SCE_KERNEL_ERROR_EFAULT`, where the console faults. Resonance: A Plague Tale Legacy (PPSA30601) calls it at start-up (#4067) +- [sceKernelGetPageTableStats](../../../core/libs/prx/libkernel/DirectMemory/Export.cpp) (libkernel) reports 8192 entries on each side and counts them as a PS5 (firmware 13.60) counted them for a payload process: one cpu entry for each 2 MiB granule that holds a committed mapping, whatever its protection (none included), and one gpu entry for each 1 GiB region that holds a GPU-accessible mapping, plus one for each 2 MiB granule of such a mapping that is not a whole granule of direct memory at a 2 MiB-aligned physical address. A granule or region shared by several mappings counts once, reservations do not count. On the console the first GPU mapping of a process also takes three gpu entries and one cpu entry that stay after it is unmapped, which is not modelled, and only the ranges whose protection is recorded here are counted. Null or invalid pointers return `SCE_KERNEL_ERROR_EFAULT`, where the console faults. Resonance: A Plague Tale Legacy (PPSA30601) calls it at start-up (#4067) - [settimeofday](../../../core/libs/prx/libkernel/Time/Time.cpp) (libkernel_sys) checks like FreeBSD 11.4's [`kern_settimeofday`](https://github.com/freebsd/freebsd-src/blob/release/11.4.0/sys/kern/kern_time.c#L688-L707) for a root caller: `EINVAL` for a negative second count or a microsecond count outside 0 to 999999, before anything is stored. A valid time throws, naming it, since the host clock is never set, and its time zone is not stored, as FreeBSD stores the zone only after setting the clock. A time zone without a time is kept for the process and reported by `gettimeofday`; `sceKernelGettimezone` still reports 0 and 0, since whether the console reads the same value is not known. FreeBSD checks `PRIV_SETTIMEOFDAY` first, which a jailed process fails with `EPERM`; whether a title holds it on the console is not known. - [clock_settime](../../../core/libs/prx/libkernel/Time/Time.cpp) (libkernel) validates like FreeBSD 11.4's [`kern_clock_settime`](https://github.com/freebsd/freebsd-src/blob/8c639945a44588f6cfdddfb057bb5aad88735da0/sys/kern/kern_time.c#L396-L412) for a root caller: `EFAULT` for a null time, `EINVAL` for any clock but `CLOCK_REALTIME`, a negative second count or a nanosecond count outside 0 to 999999999. A valid `CLOCK_REALTIME` request throws, naming the requested time, since the host clock is never set and no guest clock offset is kept. FreeBSD checks `PRIV_CLOCK_SETTIME` first, which a jailed process fails with `EPERM`; whether a title holds it on the console is unverified. PS5MC (PPSA99420) imports it; no call site is known - [Short sleeps ended by GPU and flip completions](../../../core/libs/prx/libkernel/Time/SleepWake.cpp) (libkernel) - a `sceKernelUsleep`, `usleep`, `nanosleep` or `sceKernelNanosleep` of 1 ms or less returns before the requested time, which FreeBSD and the console do not do: it ends once the AGC driver reports a completed GPU batch or batch completion action, or VideoOut completes a flip, so a title that polls a GPU label or the flip status between sleeps does not sleep the rest. A title that paces frames with such a sleep can wake up to 1 ms early. A thread returns early at most 8 times in a run of sleeps; the run restarts when the thread submits AGC work or did not sleep the requested time since its last sleep, so a loop that counts sleeps to time out still sleeps all but 8 in full. `APS5_NO_SLEEP_WAKE=1` keeps every sleep in full @@ -330,7 +339,7 @@ - [app0.zar files and directories](../../../core/libs/prx/libkernel/File/src/ArchivedFile.cpp) (libkernel) - archive directory snapshots refresh on rewind; ordering and seek cookies are host packaging behavior, not console-measured behavior. Disk entries shadow archive names under the archive component comparison. Virtual directory descriptors reject data I/O, mapping, locks, filesystem queries and metadata mutation before touching their null-device backing; ordinary host directories retain native operations. Archived files remain read-only, with duplicate descriptors sharing their cursor. `lstat`, access and other ordinary path operations on archive-only entries remain unsupported. Validation uses synthetic archives on Windows and WSL, without PS5 or title runs. - [sceKernelLoadStartModule](../../../core/libs/prx/libkernel/Module/src/Module.cpp) (libkernel) loads a system library named by its console path, `/system/common/lib/.sprx` or the sandboxed `//common/lib/.sprx` that `sceKernelGetFsSandboxRandomWord` names, from the host `libs/.prx`, as libSceSysmodule loads modules by ID; a host library has no `module_start`, so `res` is 0. Other system directories, such as `/system/priv/lib`, are not mapped. The OpenOrbis piglet sample loads `libScePigletv2VSH.sprx` and `libScePrecompiledShaders.sprx` this way - [param.sfo](../../../core/libs/prx/libkernel/AppMetadata/src/ParamSfoParser.cpp) (libkernel) is read when `param.json` is absent, for `TITLE`, `TITLE_ID`, `DOWNLOAD_DATA_SIZE`, `USER_DEFINED_PARAM_1` to `_4` and `ATTRIBUTE`, and mounts `/data` and `/download0` like `param.json`; the localized `TITLE_00` to `TITLE_30` are not selected by the console language. -- [sysctl MIBs for kern.smp.maxcpus, kern.stackprot, kern.sched.name and kern.timecounter.hardware](../../../core/libs/prx/libkernel/System/src/SystemConfiguration.cpp) (libkernel) - on a PS5 (firmware 12.70), a payload process resolves these names to {1, 2147482816, 2147482814}, {1, 2147483151}, {1, 2147483182, 2147483181} and {1, 2147482838, 2147482834}; `sysctl` returns -1 with `ENOENT` for reads and size queries by those exact MIBs, leaving the buffer and length unchanged, including when either or both output pointers are null. Writes were not measured and throw. `sysctlnametomib` still throws for these four names; #7541 implements the mappings for nine of the other names. +- [sysctl MIBs for kern.smp.maxcpus, kern.stackprot, kern.sched.name and kern.timecounter.hardware](../../../core/libs/prx/libkernel/System/src/SystemConfiguration.cpp) (libkernel) - on a PS5 (firmware 12.70), a payload process resolves these names to {1, 2147482816, 2147482814}, {1, 2147483151}, {1, 2147483182, 2147483181} and {1, 2147482838, 2147482834}; `sysctl` returns -1 with `ENOENT` for reads and size queries by those exact MIBs, leaving the buffer and length unchanged, including when either or both output pointers are null. Writes were not measured and throw. `sysctlnametomib` has no mapping for these four names and returns -1 with `ENOENT`; #7541 implements the mappings for nine of the other names. - [sceKernelGetProcessAbiType](../../../core/libs/prx/libkernel/Unimplemented.cpp) (libkernel) throws: no measured value, prototype or documented consumer of the process ABI type was found, and PS5_MihawkOS (`mihawk-99/PS5_MihawkOS`, PPSA99170) is the only title known to import it. Returning a guessed constant would let a title branch on a value the console never answered with, so the declaration only resolves the import until the console value is measured - [flock on a directory descriptor](../../../core/libs/prx/libkernel/File/src/Stdio.cpp) (libkernel) on Windows is seen only by this process. Windows `LockFileEx` rejects a directory handle, so the lock is kept in a table of this process keyed by the directory's volume serial number and file index; between descriptors of this process it conflicts, converts in place, is shared by `dup` and is released on the last close, as FreeBSD 11.4 does for any vnode locked with [`sys_flock`](https://github.com/freebsd/freebsd-src/blob/release/11.4.0/sys/kern/kern_descrip.c#L2889-L2929). Waiters are not served in arrival order: an unlock or downgrade may wake a request that waits behind an earlier conflicting one, which FreeBSD's `lf_setlock` serves first. Another host process neither sees it nor is seen. Linux and macOS use the host `flock`. Not measured on a console - [poll on macOS and urgent data](../../../core/libs/prx/libkernel/Socket/src/Udp.cpp) (libkernel) - XNU's `poll` never reports `POLLPRI` for out-of-band data. On macOS it is taken from `SIOCATMARK`, which reports a pending urgent byte without consuming it, and a wait that asks for it uses the sliced path a kqueue wait uses, so it wakes on the next 1 ms slice; `POLLRDBAND` is set with it, as FreeBSD 11.4's `sopoll_generic` does. The other paths that ask the host for urgent readiness still miss it on macOS: guest `select` and `pselect` through `GuestSockets::Poll`, and libSceNet's `PollSockets`. `recv(MSG_OOB | MSG_PEEK)` is not the probe because it consumes the byte on macOS 27.0.1, and `kevent` with `NOTE_OOB` does not fire there. Every other flag and error comes from `poll`; every other host is unchanged. The guest `send` and `recv` refuse `MSG_OOB`, so urgent data can only come from an outside peer; the console's stop once the normal stream passes the mark was not reproduced @@ -341,3 +350,4 @@ - [Host game mode on macOS](../../../core/libs/prx/libkernel/System/src/MacActivity.cpp) (libkernel) was written and tested only against a fake Objective-C runtime on Linux; it has not been built or run on macOS. The option values (`NSActivityUserInitiated` 0x00FFFFFF, `NSActivityLatencyCritical` 0xFF00000000) and the `objc_msgSend` casts follow Apple's Foundation documentation and header from memory, unchecked on an SDK, and whether the activity changes timer or scheduling behaviour for a title on any macOS version is unmeasured. - [Host game mode on macOS](../../../core/libs/prx/libkernel/System/src/MacActivity.cpp) (libkernel) holds an `NSProcessInfo` activity only; it does not request the system Game Mode that macOS 14 and later offers for games. The conditions under which the system enters that mode were not checked here and no call for it was implemented, so whether a title running under AnyPS5 is treated as a game, and what the system then changes, is unmeasured. - [Host game mode on Windows](../../../core/libs/prx/libkernel/Time/Time.cpp) (libkernel) - `APS5_GAME_MODE` makes no request on Windows: `on` logs that the host has no game mode request and `auto` stays silent. The process already opts out of power throttling of its timer resolution in Time.cpp; Windows Game Mode and efficiency-mode behaviour for the process beyond that are unmeasured. +- [sceKernelAvailableDirectMemorySize, sceKernelGetDirectMemoryType, sceKernelDirectMemoryQuery](../../../core/libs/prx/libkernel/DirectMemory/Export.cpp) (libkernel) validate destination pointers via GuestCopyOut_nid_no_patch and return SCE_KERNEL_ERROR_EFAULT on bad memory as host-safety fallbacks. Console fault handling is unmeasured. diff --git a/docs/dev/debt/libkernel_sys.md b/docs/dev/debt/libkernel_sys.md index fc859388db..9db22c73ac 100644 --- a/docs/dev/debt/libkernel_sys.md +++ b/docs/dev/debt/libkernel_sys.md @@ -3,10 +3,11 @@ - [sceKernelGetCpuUsage, sceKernelGetThreadName, sceKernelLwfsAllocateBlock, sceKernelLwfsLseek, sceKernelLwfsSetAttribute, sceKernelLwfsWrite, sceKernelSetCompressionAttribute and sceKernelSetFsstParam](../../../core/libs/prx/libkernel_sys/Export.Discovery.cpp) (libkernel_sys) - throw through `NotImplemented_nid_no_patch`; behaviour and the PS5 prototypes are unmeasured. The parameter lists come from a single source, the PS4 OpenOrbis `libkernel.h`, with no second reference: `off_t` and `ssize_t` are taken as 64-bit, the `Lwfs*` and `Set*` parameters are unnamed there (the names here are guesses), and the `Proc_Stats` of `sceKernelGetCpuUsage` is declared as `void*` because its layout is unknown. ### Silent stubs - [fchmodat](../../../core/libs/prx/libkernel_sys/Export.cpp) (libkernel_sys) - `AT_SYMLINK_NOFOLLOW` on a symbolic link (on Windows and Linux) +- [sceKernelCallIndirectBuffer2](../../../core/libs/prx/libkernel_sys/Export.Discovery.cpp) (libkernel_sys) - always writes a zero result, as `sceAmprAmmSubmitCommandBuffer2` does here; in firmware 13.42 the library passes the result pointer to a kernel ioctl, and what the kernel writes there is not known ### Unknown function info -- [libkernel_sys additional exports](../../../core/libs/prx/libkernel_sys/AdditionalExports.cpp) - 328 callable exports have import-resolution declarations only. Parameter lists, return types and behavior remain unverified. Parameterless `int` declarations are placeholders, not verified ABI prototypes; every entry throws through `NotImplemented_nid_no_patch`. Unresolved names use literal NID aliases; no runtime functionality or data objects are fabricated. Existing providers and exports supplied by open pull requests are excluded. Kernel variant imports already resolve through `libkernel`, then `libc`; existing providers remain unchanged. Six native data exports (`errno`, `__stack_chk_guard`, `_sigintr`, `__progname`, `environ`, and NID `AxgW94umKqU`) require separate storage, layout, TLS and ownership validation and are not added as callable aliases or fabricated globals. +- [libkernel_sys additional exports](../../../core/libs/prx/libkernel_sys/AdditionalExports.cpp) - 326 callable exports have import-resolution declarations only. Parameter lists, return types and behavior remain unverified. Parameterless `int` declarations are placeholders, not verified ABI prototypes; every entry throws through `NotImplemented_nid_no_patch`. Unresolved names use literal NID aliases; no runtime functionality or data objects are fabricated. Existing providers and exports supplied by open pull requests are excluded. Kernel variant imports already resolve through `libkernel`, then `libc`; existing providers remain unchanged. Six native data exports (`errno`, `__stack_chk_guard`, `_sigintr`, `__progname`, `environ`, and NID `AxgW94umKqU`) require separate storage, layout, TLS and ownership validation and are not added as callable aliases or fabricated globals. | Name | NID | | --- | --- | @@ -65,7 +66,6 @@ | `pthread_setschedother_np` | `ymCrwbFD4fk` | | `sceKernelAddDynlibEvent` | `dGFwUPT+BK8` | | `sceKernelAddFGCInfo` | `M+vuTJQ3F8Y` | -| `sceKernelCallIndirectBuffer3` | `x+JkNr3eoxs` | | `sceKernelCreateUuidV1` | `8PS6UDzj-xY` | | `sceKernelCreateUuidV7` | `Nr+3bRBygw0` | | `sceKernelDeleteDynlibEvent` | `0GquoxOD3Aw` | @@ -141,7 +141,6 @@ | `sceKernelTraceAutoCaptureUnmap` | `stvymc0mgcY` | | `sceKernelUseCronosKura` | `7lZJYy0+evk` | | `sceKernelUseCronosStreaming` | `ind6aqzel+Y` | -| `sceKernelWriteUnmapToPrtCommand` | `vnKYv2NuO5U` | | `scePthreadRegisterThreadDeathHook` | `DlCg0QhcgYQ` | | `Unknown` | `+1mj9RYU1rs` | | `Unknown` | `+MZfwzH65JQ` | @@ -340,12 +339,13 @@ | `Unknown` | `zAloppPJxy0` | - [sceKernelGetHwModelName, sceKernelIsProspero](../../../core/libs/prx/libkernel_sys/Export.Discovery.cpp) (libkernel_sys) - both throw. On a CFI-2014 PS5 (firmware 13.60) a payload process got 0 from `sceKernelGetHwModelName(char*)`, which wrote "CFI-2014 A01X" and a terminator (14 bytes), and 0 from `sceKernelIsProspero()`. The model string belongs to one console and the buffer size and null behaviour are not known, and 0 from `sceKernelIsProspero` on a PS5 suggests it answers something other than the model, so neither is implemented -- [sceKernelGetCompiledSdkVersion](../../../core/libs/prx/libkernel_sys/Export.cpp) (libkernel_sys) - which SDK version the console returns is unmeasured. The [PS5 payload SDK](https://github.com/ps5-payload-dev/sdk/blob/a7685ce8e97ce1f8a4f38253a41d54241c9124f1/crt/kernel.c#L257-L275) declares the process parameters with a 32-bit PS4 SDK version at offset `0x10` and a 32-bit PS5 SDK version at `0x14`; this export returns the field at `0x10`, the one [libSceHmd2](../../../core/libs/prx/libSceHmd2/Export.cpp) reads and the one [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/615bcba5e21b82dc59588575f7ecbce8da09ca2c/src/emulator.cpp#L110-L138) (PS4, a single 64-bit `sdk_version` there) reads from the eboot. The `int (int32_t*)` signature and `EINVAL` (`0x80020016`) for a null output follow [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/615bcba5e21b82dc59588575f7ecbce8da09ca2c/src/core/libraries/kernel/process.cpp#L56-L62). Closes when: measured on a PS5 +- [sceKernelGetCompiledSdkVersion](../../../core/libs/prx/libkernel_sys/Export.cpp) (libkernel_sys) - which SDK version the console returns is unmeasured. The [PS5 payload SDK](https://github.com/ps5-payload-dev/sdk/blob/a7685ce8e97ce1f8a4f38253a41d54241c9124f1/crt/kernel.c#L257-L275) declares the process parameters with a 32-bit PS4 SDK version at offset `0x10` and a 32-bit PS5 SDK version at `0x14`; this export returns the field at `0x10`, which [libSceHmd2](../../../core/libs/prx/libSceHmd2/Export.cpp) reads and [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/615bcba5e21b82dc59588575f7ecbce8da09ca2c/src/emulator.cpp#L110-L138) reads from the eboot. The `int (int32_t*)` signature and `EINVAL` (`0x80020016`) for null follow [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/615bcba5e21b82dc59588575f7ecbce8da09ca2c/src/core/libraries/kernel/process.cpp#L56-L62); `SCE_KERNEL_ERROR_EFAULT` for an unwritable output pointer is a host-safety fallback so the process does not crash, not a measured PS5 result, and the console's behaviour for such a pointer is unmeasured. Closes when: measured on a PS5 - [scePthreadCondattrGetclock](../../../core/libs/prx/libkernel_sys/Export.cpp) (libkernel_sys) - the `int (const PthreadCondattr*, KernelClockid*)` signature and checks follow FreeBSD 11.4 libthr's [`_pthread_condattr_getclock`](https://github.com/freebsd/freebsd-src/blob/releng/11.4/lib/libthr/thread/thr_condattr.c#L82-L90) with the error code of libkernel's `scePthreadCondattrSetclock`: a null or destroyed attribute returns `SCE_KERNEL_ERROR_EINVAL`, and a null clock pointer throws, since libthr writes through it unchecked. Console behaviour is unverified ### Functional - [sceKernelGetUpdVersion](../../../core/libs/prx/libkernel_sys/Export.Discovery.cpp) (libkernel_sys) - runs the same code as `sysKernelGetUpdVersion` on firmware 13.42 ([disassembly](https://github.com/boykopovar/AnyPS5/pull/10671#issuecomment-6398286973)), so it forwards there: a null output is refused with `SCE_KERNEL_ERROR_EINVAL`, and otherwise the 4 bytes come from `machdep.upd_version`, whose retail value is unmeasured (see libkernel's entry) +- [get_vm_map_timestamp](../../../core/libs/prx/libkernel_sys/Export.Discovery.cpp) (libkernel_sys), firmware 13.60 `libkernel_sys.sprx`, syscall 624, returns the low 32 bits of the guest-allocation generation. That value advances whenever a guest-allocation registry scope ends, including lookups (`malloc_usable_size`) and every guest heap allocation or free, and whenever a tracked range is invalidated. FreeBSD advances a map's timestamp only when the map is write-locked, so the value changes far more often than the console's would. Host mappings made outside the tracker can be missed. Not hardware-validated. - [kenv](../../../core/libs/prx/libkernel_sys/Export.cpp) (libkernel_sys) follows FreeBSD 11.4's [`sys_kenv`](https://github.com/freebsd/freebsd-src/blob/release/11.4.0/sys/kern/kern_environment.c#L87-L204) over an in-memory table that starts empty, since the console's boot environment is unmeasured, so a variable the system sets at boot reads as `ENOENT`. `KENV_SET` and `KENV_UNSET` always pass the privilege check, as the guest is uid 0. A name or value is read with the guest path copy, which reads up to 1024 bytes, so an unterminated string followed by an unreadable page fails with `EFAULT` where FreeBSD's bounded `copyinstr` gives `ENAMETOOLONG`. A 513th variable is dropped silently, as in FreeBSD. Console behaviour is unverified - [sched_rr_get_interval](../../../core/libs/prx/libkernel_sys/Export.cpp) (libkernel_sys) accepts pid 0 or the host-backed guest pid and reports the FreeBSD 11 ULE default time slice for the usual AMD64 clock rates (94 ms); other pids return `ESRCH`, and a null interval returns `EFAULT`. AnyPS5 does not run a guest ULE scheduler or track a per-process configured quantum, so this reports the modeled default and does not reflect runtime scheduling. Console-specific clock rates and quantum configuration are unverified - [fchdir](../../../core/libs/prx/libkernel_sys/Export.cpp) (libkernel_sys) changes the guest working directory to the descriptor's directory: on Windows through the path recorded when the descriptor was opened, on Linux through the `/proc/self/fd` link target. It returns `EBADF` for a descriptor that is not open, `EINVAL` for a pipe or socket, as FreeBSD `getvnode` does for a descriptor without a vnode, and `ENOTDIR` for any other descriptor that is not a directory. Outside Windows it checks search permission on the directory with `faccessat`, which fails with `EACCES` as FreeBSD `change_dir` does; on Windows that check is not modelled. A directory renamed after it was opened is still reached through the recorded path. Console behaviour is unverified @@ -369,6 +369,7 @@ - [sched_setscheduler](../../../core/libs/prx/libkernel_sys/Export.Discovery.cpp) (libkernel_sys) follows FreeBSD 11.4's [`sys_sched_setscheduler`](https://github.com/freebsd/freebsd-src/blob/8c639945a44588f6cfdddfb057bb5aad88735da0/sys/kern/p1003_1b.c#L198-L225) and [`ksched_setscheduler`](https://github.com/freebsd/freebsd-src/blob/8c639945a44588f6cfdddfb057bb5aad88735da0/sys/kern/ksched.c#L169-L205): a null parameter returns `EFAULT`, a pid other than 0 and the guest's own returns `ESRCH`, and a policy other than `SCHED_FIFO` (1), `SCHED_OTHER` (2) and `SCHED_RR` (3) returns `EINVAL`. Pid 0 sets the calling thread through `scePthreadSetschedparam`, with the ranges it accepts on a PS5; the values are only recorded. Values it rejects throw (FreeBSD answers `EPERM` or `EINVAL`, the console is unverified), and so does the guest's own pid, whose first thread is not tracked. Whether a title holds FreeBSD's `PRIV_SCHED_SET` is unverified - [sigreturn](../../../core/libs/prx/libkernel_sys/Export.Discovery.cpp) (libkernel_sys) follows FreeBSD 11.4's amd64 [`sys_sigreturn`](https://github.com/freebsd/freebsd-src/blob/8c639945a44588f6cfdddfb057bb5aad88735da0/sys/amd64/amd64/machdep.c#L473-L576) on `setcontext`'s `ucontext_t`: a null context returns `EFAULT`, and `mc_flags` outside `_MC_FLAG_MASK` or an `rflags` differing from the current flags outside `PSL_USERCHANGE` return `EINVAL`; `mc_len` is not checked. As in [`set_fpcontext`](https://github.com/freebsd/freebsd-src/blob/8c639945a44588f6cfdddfb057bb5aad88735da0/sys/amd64/amd64/machdep.c#L2349-L2370), `_MC_FPFMT_NODEV` keeps the FPU state, `_MC_FPOWNED_NONE` loads the initial one, the FPU and PCB owners load `mc_fpstate`, and other values return `EINVAL`. The rest is restored as by `setcontext`, which keeps the `%fs` and `%gs` bases FreeBSD would load. A `%cs` that is not a user selector (FreeBSD also raises `SIGBUS`) and `_MC_HASFPXSTATE` throw - [sceKernelGetModuleInfoInternal, sceKernelGetModuleListInternal and sceKernelLoadStartModuleForSysmodule](../../../core/libs/prx/libkernel_sys/Export.cpp) (libkernel_sys) answer for every loaded module, system modules included. `sceKernelGetModuleInfoInternal` fills the 0x1A8-byte `SceKernelModuleInfoEx` of a module handle the way `sceKernelGetModuleInfoFromAddr` does for an address, with [shadPS4's checks](https://github.com/shadps4-emu/shadPS4/blob/a808e76/src/core/libraries/kernel/process.cpp#L243-L258) in their order: `EFAULT` for a null pointer, `EINVAL` when `st_size` is not 0x1A8, `ESRCH` for an unknown handle. `sceKernelGetModuleListInternal` returns the same list as `sceKernelGetModuleList`, as [fpPS4](https://github.com/red-prig/fpPS4/blob/04cefd4/kernel/ps4_libkernel.pas#L852-L858) does; fpPS4 marks that as a guess, and neither is checked on a PS5. `sceKernelLoadStartModuleForSysmodule` forwards to `sceKernelLoadStartModule` +- [sceKernelIsModuleLoaded](../../../core/libs/prx/libkernel_sys/Export.cpp) (libkernel_sys) follows firmware 13.42's libkernel_sys: it asks `sceKernelGetModuleListInternal` for up to 0x300 modules and returns its error, then returns 0 when the first 256 bytes of one module's `sceKernelGetModuleInfo` name equal the argument, else `SCE_KERNEL_ERROR_ESRCH`. It inherits the names `sceKernelGetModuleInfo` reports, so a system library is found under its host file name, such as `libSceAjm.prx`, and the console's `libSceAjm.sprx` returns `SCE_KERNEL_ERROR_ESRCH` here. A null name throws, where the console faults in `strncmp`. Closes when: `sceKernelGetModuleInfo` reports the console's module names - [chroot](../../../core/libs/prx/libkernel_sys/Export.cpp) (libkernel_sys) follows FreeBSD 11.4's [`sys_chroot`](https://github.com/freebsd/freebsd-src/blob/8c639945a44588f6cfdddfb057bb5aad88735da0/sys/kern/vfs_syscalls.c#L776-L807) and [`pwd_chroot`](https://github.com/freebsd/freebsd-src/blob/8c639945a44588f6cfdddfb057bb5aad88735da0/sys/kern/kern_descrip.c#L3059-L3085) for a root caller: `EFAULT` for a null path, `ENOENT` for an empty or missing one, `ENAMETOOLONG` for a path of 1024 bytes or more or a component over 255, and `ENOTDIR` for a path that is not a directory or passes through a file. A directory that is the guest root (`/`, `/..`, or `.` after `fchdir` to a descriptor of `/`) succeeds and changes nothing, as the root stays the same directory; the guest is taken never to have changed its root, so open directory descriptors do not make it fail with `EPERM` (`kern.chroot_allow_open_directories` 1). Any other directory throws, naming the path: the guest path resolver has a fixed root and mount aliases (`/app0`, `/savedata0`) that do not move with it. On the console a title starts in a sandbox root, where `pwd_chroot` refuses with `EPERM` while a directory is open; whether that holds for titles, and whether a title holds `PRIV_VFS_CHROOT`, are unverified. Porpoise (PPSA99764) weak-imports it and calls it only as `fchdir` to its saved descriptor of `/` then `chroot(".")`, to put its sandbox root back after a jailbreak daemon replaced it ([`put_root_back`](https://github.com/elripalda/Porpoise-Dolphin-Emulator-for-PS5/blob/2ed1ab5a06995aa198f7bccd4da0f90c3fc29d39/src/porpoise_jailbreak.cpp#L303-L331)) - [Console identity](../../../core/libs/prx/libkernel_sys/Export.cpp) (libkernel_sys) - `get_authinfo` errors and capabilities are unverified on PS5, returning `EFAULT` when passed an unwritable destination pointer and following [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/396c2a09a38d22eaa02aab32c1967263dceab95f/src/core/libraries/kernel/kernel.cpp) with `EPERM` for null, and zero authority and credential words. The host models a retail unit (`IsCEX` 1, `IsGenuineCEX` 1, `IsDevKit` 0, `IsGenuineDevKit` 0, `IsTestKit` 0, `IsGenuineTestKit` 0) and Prospero (`IsProspero` 1, `IsKratos` 0). - [sceKernelIsPs4Process and System OpenPSID](../../../core/libs/prx/libkernel_sys/Export.cpp) (libkernel_sys) - `sceKernelIsPs4Process` returns 1 when the title ID starts with `CUSA` and 0 otherwise, as `libSceRtc` and `libSceConvertKeycode` tell PS4 titles apart; this mapping follows the PS4 title-ID convention and is unmeasured on a console, since BunnyFl's [13.42 report](https://github.com/boykopovar/AnyPS5/pull/10959#issuecomment-6404011201) only mentions the export returning 0 in passing. System OpenPSID reuses the ordinary ID; firmware 13.42 reads a separate `machdep.openpsid_for_sys` of unknown value. Null returns positive 22 per the [module report](https://github.com/boykopovar/AnyPS5/pull/10524#issuecomment-6393566914). @@ -380,7 +381,7 @@ - [linkat](../../../core/libs/prx/libkernel_sys/Export.cpp) (libkernel_sys) resolves `AT_FDCWD` (-100) and absolute paths as `link` does, and flags other than `AT_SYMLINK_FOLLOW` (0x400) return `EINVAL`, as in FreeBSD 11. Any other relative path is joined to the descriptor's host directory, found the same way as for `fchdir`, so guest path aliases and case-insensitive name matching do not apply to it, and a `..` component is not kept inside the guest root. It returns `EBADF` for a descriptor that is not open and `ENOTDIR` for one that is not a directory. Without `AT_SYMLINK_FOLLOW` a symbolic link as the source is linked itself, as in FreeBSD: on Linux and macOS through the host's `linkat` with flag 0, and on Windows through `CreateHardLinkW`, which links the link's reparse point rather than its target, dangling or not. Windows cannot hard-link a directory, so there a symbolic link or junction to a directory as the source throws. Console behaviour is unverified - [pthread_set_defaultstacksize_np and scePthreadSetDefaultstacksize](../../../core/libs/prx/libkernel_sys/Export.cpp) (libkernel_sys) set the stack size that `scePthreadAttrInit` and a thread created without attributes use, as [fpPS4's `pthread_set_defaultstacksize_np`](https://github.com/red-prig/fpPS4/blob/04cefd4/kernel/ps4_pthread_attr.pas#L89-L102) does: a size of 16384 bytes or less fails with `EINVAL` (`0x80020016` from the sce form) and there is no upper limit, so a default the host cannot allocate fails only when a thread is created. Attributes initialised earlier keep their size. Not checked on a PS5 - [pthread_mutexattr_getgen_np, pthread_mutexattr_setgen_np, scePthreadMutexattrGetgen and scePthreadMutexattrSetgen](../../../core/libs/prx/libkernel_sys/Export.Discovery.cpp) (libkernel_sys) were reconstructed from the firmware 13.60 exports: generation is a one-bit attribute, set accepts only 0 or 1 and otherwise returns `EOPNOTSUPP`, and the `sce` forms convert the POSIX error to `0x80020000 | errno`. The flag is retained in AnyPS5's attribute state; whether it changes mutex initialization is unmeasured. Runtime behaviour on a PS5 is not independently validated -- [sceKernelTitleWorkaroundIsEnabled](../../../core/libs/prx/libkernel_sys/Export.cpp) (libkernel_sys) - not measured on a console; the `{version, align, ids[2]}` layout, the bit test and the limit of 0x3A bits follow [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/a808e76/src/core/libraries/kernel/kernel.cpp), which notes that the limit changes between firmwares. A negative bit is `EINVAL` here; shadPS4 compares it signed and reads outside `ids`. Titles usually pass the `title_workaround` block of `sceKernelGetAppInfo`, which is written as zeros here; where `title_workaround` sits in the 0x58-byte structure is unmeasured, and with the shadPS4 offsets (0x30 to 0x48) it falls in the zeroed bytes, so its bits read 0; the console's values in a game are unmeasured +- [sceKernelTitleWorkaroundIsEnabled](../../../core/libs/prx/libkernel_sys/Export.cpp) (libkernel_sys) - the `{version, align, ids[2]}` layout, the bit test and the limit follow PS5 firmware 13.42 libkernel_sys and libkernel, read from disassembly and not measured on a console, where bits 0 to 0x7F are accepted, the bit is compared unsigned, and the misspelled export `sceKernelTitleWorkdaroundIsEnabled` runs the same code. Titles usually pass the `title_workaround` block of `sceKernelGetAppInfo`, which is written as zeros here; where `title_workaround` sits in the 0x58-byte structure is unmeasured, and with the shadPS4 offsets (0x30 to 0x48) it falls in the zeroed bytes, so its bits read 0; the console's values in a game are unmeasured - [sceKernelGetProcessType](../../../core/libs/prx/libkernel_sys/Export.cpp) (libkernel_sys) - not measured on a console; as in shadPS4, the title's own pid, -1 and 0 are type 0 (big application) and any other pid is `ESRCH` - [cpuset, cpuset_getid, cpuset_setid](../../../core/libs/prx/libkernel_sys/Cpuset.cpp) (libkernel_sys) - console root IDs and inheritance are unverified; non-process scopes (TID, CPUSET, JAIL) throw as unmodelled as per-thread cpusets and hierarchy visibility are not tracked. CPU set assignment and queries follow FreeBSD 11.4 [kern_cpuset.c](https://github.com/freebsd/freebsd-src/blob/release/11.4.0/sys/kern/kern_cpuset.c): cpuset allocates sequential IDs from 2; cpuset_setid supports CPU_WHICH_PID for known IDs (or root 0, default 1); dynamic sets are single-process referenced and unlinked when vacated, returning ESRCH on lookup; cpuset_getid returns root 0 for CPU_LEVEL_ROOT and the assigned ID for CPU_LEVEL_CPUSET. Output writes use GuestCopyOut_nid_no_patch (EFAULT on bad pointers), with level/which/id errors returned before copyout; levels outside 1 to 3 return EINVAL where FreeBSD returns 0 with the base set ID; other which return EINVAL, unknown pids return ESRCH - [sceKernelSettimeofday](../../../core/libs/prx/libkernel_sys/Export.Discovery.cpp) (libkernel_sys) - forwards to `settimeofday` and returns its result, or `0x80020000` plus `errno` for a failure, as shadPS4's [`sceKernelSettimeofday`](https://github.com/shadps4-emu/shadPS4/blob/7ea677e56d75bf3d90ace2b0a5144a665d1f38b6/src/core/libraries/kernel/time.cpp#L565-L571) maps its call through `ErrnoToSceKernelError`; that branch passes the call's return value, and shadPS4's own `settimeofday` never fails, so the errno form the other sce wrappers here use is taken. Nothing is measured on the console, and a valid time inherits `settimeofday`'s refusal to set the host clock @@ -391,6 +392,10 @@ - [scePthreadAttrGetscope, scePthreadAttrSetscope, scePthreadAtfork and scePthreadSetconcurrency](../../../core/libs/prx/libkernel_sys/Export.Discovery.cpp) (libkernel_sys) call libkernel's `pthread_attr_getscope`, `pthread_attr_setscope`, `pthread_atfork` and `pthread_setconcurrency` and turn a POSIX error into `0x80020000 | errno`, as [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/15abf68c9b52c4b04d094f2837719fdb871021f3/src/core/libraries/kernel/threads/pthread_attr.cpp#L392) exports `scePthreadAttrGetscope` as `ORBIS(posix_pthread_attr_getscope)`; shadPS4 has no export for the other three, whose names and NIDs are in the [symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) and whose signatures follow the same POSIX forms. Not measured on a console. As in libkernel, the scope is 0 (process) or 2 (system), and `scePthreadAtfork` handlers are only recorded, as no process forks - [scePthreadMutexInitForInternalLibc, scePthreadMutexattrInitForInternalLibc](../../../core/libs/prx/libkernel_sys/Export.Discovery.cpp) (libkernel_sys) - not measured on a console. They call `pthread_mutex_init` and `pthread_mutexattr_init` as [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/ce74386/src/core/libraries/kernel/threads/mutex.cpp#L541-L557) and [ChonkyStation4](https://github.com/liuk7071/ChonkyStation4/blob/c101a23/ChonkyStation4/OS/Libraries/Kernel/Kernel.cpp#L97-L108) (PS4) do, with shadPS4's `0x80020000 | errno` errors; a mutex without attributes checks errors. FreeBSD's malloc-internal [`_pthread_mutex_init_calloc_cb`](https://github.com/freebsd/freebsd-src/blob/releng/11.4/lib/libthr/thread/thr_mutex.c#L401-L419) disagrees, making a normal mutex that defers signals. A name argument, signal deferral and allocation are unknown; the [PS5 payload SDK](https://github.com/ps5-payload-dev/sdk/blob/a7685ce/sce_stubs/libkernel_sys.c#L4382-L4452) only lists the exports - [AMM kernel write commands](../../../core/libs/prx/libkernel_sys/Export.Discovery.cpp) (libkernel_sys) - signatures of the map, map direct, unmap, remap, multimap and protection writers and their GPU mask id forms taken from [ampr_emu's libkernel hook targets](https://github.com/drakmor/ampr_emu/blob/cfa85df379f6eeeb165d7badf9b648e266fe77b7/include/ampr_libkernel_hook_targets.h), which forward to the real kernel; the measure mode (`dst` null reports the size, `outSize` null skips the report) follows ampr_emu's measure-then-record calls, not confirmed on a title. Each writer builds its record with the encoder of its `libSceAmpr` command buffer sibling, so it applies the sibling's checks and writes its bytes. The GPU mask id is ignored, as by the siblings, and a protection or mask with bits above 32 is rejected, as by `sceKernelWriteModifyMtypeProtectCommand`. A wider `type` is cut to the record's 32 bits, as by that writer; the console's handling is not measured +- [AMM kernel write command checks](../../../core/libs/prx/libkernel_sys/Export.Discovery.cpp) (libkernel_sys) - the map, map direct, unmap, remap, multimap and protection writers apply their libSceAmpr siblings' checks, not those of firmware 13.42's libkernel (compared under a CPU emulator, not measured on a console), so some arguments get a different return code. The console checks the range against the AMM virtual address ranges, accepts a size that wraps past the end of the address space, takes a different set of protection bits and, for maps and memory type changes, accepts only types 11 to 20. Where both accept a call, the recorded address, size, type and protection match +- [sceKernelWriteMapCommand2, sceKernelWriteUnmapToPrtCommand, sceKernelWriteWriteAddressCommand, sceKernelWriteWriteCounterCommand, sceKernelWriteWaitOnAddressCommand, sceKernelWriteWaitOnCounterCommand and sceKernelWriteEventQueueOnCompletionCommand](../../../core/libs/prx/libkernel_sys/Export.Discovery.cpp) (libkernel_sys) - they record this project's command layout, not the console's packed commands, so the reported sizes differ and the waits' flush bit is dropped. A PRT map with a non-zero type or protection and a recorded wait on an address that is not 8-byte aligned throw: their results are unknown. The checks follow firmware 13.42's libkernel and libkernel_sys, read from disassembly and compared under a CPU emulator, not measured on a console; without the PRT flag sceKernelWriteMapCommand2 is sceKernelWriteMapCommand. As in the firmware, the PRT range check accepts an end that wraps past the top of the address space, and only size bits 14 to 40 are recorded +- [sceKernelWriteWaitOnAddressCommand and sceKernelWriteWaitOnCounterCommand](../../../core/libs/prx/libkernel_sys/Export.Discovery.cpp) (libkernel_sys) - a negative compare passes the firmware's check (above 3 is refused) and is recorded as its low three bits, as in firmware 13.42, so -2 to -4 record modes 6 to 4. The command runner here (`_waitSatisfied` in `Apr.cpp`) implements modes 0 to 6, so a wait recorded with mode 7, for example from a compare of -1, is written successfully but throws when it runs +- [sceKernelCallIndirectBuffer, sceKernelCallIndirectBuffer2, sceKernelCallIndirectBuffer3, sceKernelGiveDirectMemoryToMapper and sceKernelMapperGetParam](../../../core/libs/prx/libkernel_sys/Export.Discovery.cpp) (libkernel_sys) - follow firmware 13.42's libkernel_sys, read from disassembly and not measured on a console. The submit calls hand their arguments to a kernel ioctl, keeping 32 bits of the dword count, so the kernel's checks are unknown: a priority above 2, a null buffer or a dword count of 2^30 or more (the AMM queue here takes a 32-bit byte count) throws. sceKernelGiveDirectMemoryToMapper requires a non-zero size and a 2 MiB aligned size and alignment. sceKernelMapperGetParam copies up to 0x38 requested bytes of a block filled at startup: its size, the four AMM range values (firmware libSceAmpr reads them from there), then two unknown values, so a request past 0x28 bytes throws. The 0x80020006 returned when its device cannot be opened is not modelled - [sceKernelWaitCommandBufferCompletion](../../../core/libs/prx/libkernel_sys/Export.Discovery.cpp) (libkernel_sys) - signature taken from [ampr_emu's libkernel hook targets](https://github.com/drakmor/ampr_emu/blob/cfa85df379f6eeeb165d7badf9b648e266fe77b7/include/ampr_libkernel_hook_targets.h), where `sceAmprAmmWaitCommandBufferCompletion` forwards to it; like that sibling it waits for an AMM submission and returns `SCE_KERNEL_ERROR_ESRCH` for an id that was never submitted, not confirmed on a title - [kldsym](../../../core/libs/prx/libkernel_sys/Export.cpp) (libkernel_sys) follows FreeBSD 11.4's [`sys_kldsym`](https://github.com/freebsd/freebsd-src/blob/release/11.4.0/sys/kern/kern_linker.c) in the order it checks its arguments: `EFAULT` for an unreadable lookup structure, `EINVAL` for a `version` other than the structure size (32 bytes on amd64) or a command other than `KLDSYM_LOOKUP`, `EFAULT` or `ENAMETOOLONG` for the symbol name, `ENOENT` for a file id that no file has. The linker file list is empty here, as in `kldnext` and `kldfind`, so every file id other than 0 gets `ENOENT`; modules a console preloads are not modelled. A lookup in id 0 (every file) throws, as no symbol table is modelled. Whether a title may query kernel symbols is unverified diff --git a/docs/dev/debt/libkernel_web.md b/docs/dev/debt/libkernel_web.md index 10d0a1d57a..238fe0a3d4 100644 --- a/docs/dev/debt/libkernel_web.md +++ b/docs/dev/debt/libkernel_web.md @@ -1,10 +1,5 @@ # libkernel_web technical debt -### Known export names; ABI prototypes unverified +### Unknown function info -- [sceKernelWebUnknown_*_nid_no_patch](../../../core/libs/prx/libkernel_web/Export.cpp) (libkernel_web), aliases 001–008 - PS5 3.20 imports (`__freeze`, `__sceKernelGetGPI`, `__sys_debug_init`, `__sys_dl_get_info`, `__sys_dl_get_info_2`, `__sys_dl_get_list`, `__sys_dl_get_metadata`, `__sys_dynlib_get_info2`). Prototypes and behavior are unverified; each declaration uses the no-parameter import-resolution convention and throws through `NotImplemented_nid_no_patch`. No ABI or behavior is claimed. Source: [PS5-3.20_Libs](https://github.com/DNNDHH/PS5-3.20_Libs). -- [sceKernelWebUnknown_*_nid_no_patch](../../../core/libs/prx/libkernel_web/Export.cpp) (libkernel_web), aliases 009–016 - PS5 3.20 imports (`__sys_dynlib_get_info_for_libdbg`, `__sys_dynlib_get_list2`, `__sys_dynlib_get_list_for_libdbg`, `__sys_dynlib_load_prx`, `__sys_get_proc_type_info`, `__sys_is_development_mode`, `__sys_kqueueex`, `__sys_namedobj_create`). Prototypes and behavior are unverified; each declaration uses the no-parameter import-resolution convention and throws through `NotImplemented_nid_no_patch`. No ABI or behavior is claimed. Source: [PS5-3.20_Libs](https://github.com/DNNDHH/PS5-3.20_Libs). -- [sceKernelWebUnknown_*_nid_no_patch](../../../core/libs/prx/libkernel_web/Export.cpp) (libkernel_web), aliases 017–024 - PS5 3.20 imports (`__sys_namedobj_delete`, `__sys_netabort`, `__sys_netcontrol`, `__sys_netgetiflist`, `__sys_netgetsockinfo`, `__sys_opmc_disable`, `__sys_opmc_enable`, `__sys_opmc_get_ctr`). Prototypes and behavior are unverified; each declaration uses the no-parameter import-resolution convention and throws through `NotImplemented_nid_no_patch`. No ABI or behavior is claimed. Source: [PS5-3.20_Libs](https://github.com/DNNDHH/PS5-3.20_Libs). -- [sceKernelWebUnknown_*_nid_no_patch](../../../core/libs/prx/libkernel_web/Export.cpp) (libkernel_web), aliases 025–032 - PS5 3.20 imports (`__sys_opmc_get_hw`, `__sys_opmc_set_ctl`, `__sys_opmc_set_ctr`, `__sys_opmc_set_hw`, `__sys_osem_close`, `__sys_osem_open`, `__sys_randomized_path`, `__sys_rdup`). Prototypes and behavior are unverified; each declaration uses the no-parameter import-resolution convention and throws through `NotImplemented_nid_no_patch`. No ABI or behavior is claimed. Source: [PS5-3.20_Libs](https://github.com/DNNDHH/PS5-3.20_Libs). -- [sceKernelWebUnknown_*_nid_no_patch](../../../core/libs/prx/libkernel_web/Export.cpp) (libkernel_web), aliases 033–040 - PS5 3.20 imports (`__sys_regmgr_call`, `__sys_set_uevt`, `__sys_socketclose`, `__sys_test_debug_rwmem`, `__sys_workaround8849`, `_dup2`, `_execve`, `_execvpe`). Prototypes and behavior are unverified; each declaration uses the no-parameter import-resolution convention and throws through `NotImplemented_nid_no_patch`. No ABI or behavior is claimed. Source: [PS5-3.20_Libs](https://github.com/DNNDHH/PS5-3.20_Libs). -- [sceKernelWebUnknown_*_nid_no_patch](../../../core/libs/prx/libkernel_web/Export.cpp) (libkernel_web), aliases 041–043 - PS5 3.20 imports (`_wait4`, `sceKernelGetPrefixVersion`, `sceKernelIccGetThermalAlert`). Prototypes and behavior are unverified; each declaration uses the no-parameter import-resolution convention and throws through `NotImplemented_nid_no_patch`. No ABI or behavior is claimed. Source: [PS5-3.20_Libs](https://github.com/DNNDHH/PS5-3.20_Libs). +- 42 [libkernel_web exports](../../../core/libs/prx/libkernel_web/Export.cpp) carry the PS5 3.20 import names whose `tools/nid_names.py` hash equals their NID (`__freeze`, `__sceKernelGetGPI`, the `__sys_*` wrappers, `_execve`, `_execvpe`, `_wait4`, `sceKernelGetPrefixVersion`, `sceKernelIccGetThermalAlert`); `sceKernelWebUnknown_038_nid_no_patch` is `_dup2` under its literal NID alias. A name match does not establish their prototypes or behavior: each keeps the no-parameter import-resolution convention and throws through `NotImplemented_nid_no_patch`. Source: [PS5-3.20_Libs](https://github.com/DNNDHH/PS5-3.20_Libs). diff --git a/docs/dev/debt/libmdbg_syscore.md b/docs/dev/debt/libmdbg_syscore.md index bdecafb9cb..21d70919f9 100644 --- a/docs/dev/debt/libmdbg_syscore.md +++ b/docs/dev/debt/libmdbg_syscore.md @@ -17,3 +17,33 @@ | `sceMdbgSetResult` | `TyelACu501E` | - [sceDebugAcquireAndUpdateDebugRegister, sceDebugAttachProcess, sceDebugCancelCoredump, sceDebugClearStepThread, sceDebugCreatePerfScratchDataArea, sceDebugCreatePerfScratchExecutableArea, sceDebugCreateScratchDataArea, sceDebugCreateScratchDataAreaForPrx, sceDebugCreateScratchExecutableArea, sceDebugCreateScratchExecutableAreaForPrx, sceDebugDestroyPerfScratchDataArea, sceDebugDestroyPerfScratchExecutableArea, sceDebugDestroyScratchDataArea, sceDebugDestroyScratchExecutableArea, sceDebugDetachProcess, sceDebugGetApplicationIdByTitleId, sceDebugGetApplicationInfo, sceDebugGetApplicationList, sceDebugGetCrashInfoDetailForCoredump, sceDebugGetCrashInfoForCoredump, sceDebugGetDLLoadFlag, sceDebugGetDataListOfUltQueue, sceDebugGetDebugRegisterStatusMap, sceDebugGetEventList, sceDebugGetEventListForEQueueFd, sceDebugGetEventSubscriptionList, sceDebugGetEventSubscriptionListForEQueueFd, sceDebugGetFiberInfo, sceDebugGetFileInfo, sceDebugGetFileInfoForCoredump, sceDebugGetFileList, sceDebugGetFileListForCoredump, sceDebugGetGpuInfoArea, sceDebugGetJobManagerInfo, sceDebugGetJobManagerSequenceInfo, sceDebugGetJobManagerSequenceList, sceDebugGetModuleInfo, sceDebugGetModuleList, sceDebugGetModuleMetaData, sceDebugGetMonoVMInfo, sceDebugGetMonoVMList, sceDebugGetProcessCoredumpHandlerEventBlob, sceDebugGetProcessCoredumpHandlerEventInfo, sceDebugGetProcessCoredumpHandlerResult, sceDebugGetProcessInfo, sceDebugGetProcessList, sceDebugGetProcessPropertyForCoredump, sceDebugGetProcessResourceStatCount, sceDebugGetProcessResourceStatData, sceDebugGetProcessTime, sceDebugGetProcessTimeCounter, sceDebugGetSyncExclusiveWaiterList, sceDebugGetSyncObjectData, sceDebugGetSyncObjectList, sceDebugGetSyncWaiterList, sceDebugGetSyncWaiterListForEQueueFd, sceDebugGetSystemStatusBlob, sceDebugGetSystemStatusCount, sceDebugGetThreadInfo, sceDebugGetThreadInfoByIdent, sceDebugGetThreadList, sceDebugGetThreadListAsIdent, sceDebugGetUlObjectList, sceDebugGetUltCondvarInfo, sceDebugGetUltInfo, sceDebugGetUltListOfUltRuntime, sceDebugGetUltMutexInfo, sceDebugGetUltQueueDataResourcePoolInfo, sceDebugGetUltQueueInfo, sceDebugGetUltRuntimeInfo, sceDebugGetUltRwlockInfo, sceDebugGetUltSemaphoreInfo, sceDebugGetUltWaitingQueueResourcePoolInfo, sceDebugGetVirtualMemoryDetailInfoForCoredump, sceDebugGetVirtualMemoryInfo, sceDebugGetVirtualMemoryInfoForCoredump, sceDebugGetWaitingListOfUltCondvar, sceDebugGetWaitingListOfUltMutex, sceDebugGetWaitingListOfUltQueue, sceDebugGetWaitingListOfUltRwlock, sceDebugGetWaitingListOfUltSemaphore, sceDebugGetWorkerThreadListOfUltRuntime, sceDebugInit, sceDebugInitForCoredump, sceDebugInitForTest, sceDebugIpmiGetBlockTimeInfoList, sceDebugIpmiGetBlockedIpcInfo, sceDebugIpmiGetChannelInfo, sceDebugIpmiGetChannelKidList, sceDebugIpmiGetChannelWaitingThreadList, sceDebugIpmiGetClientInfo, sceDebugIpmiGetClientKidList, sceDebugIpmiGetClientKidListByDump, sceDebugIpmiGetClientKidListByServerKid, sceDebugIpmiGetConnectRequestInfoList, sceDebugIpmiGetConnectionInfoList, sceDebugIpmiGetConnectionWaitingThreadListByClientKid, sceDebugIpmiGetConnectionWaitingThreadListBySessionKid, sceDebugIpmiGetDump, sceDebugIpmiGetEncryptedInfoAllForCoredump, sceDebugIpmiGetKidInfoListForCoredump, sceDebugIpmiGetServerDispatchInfo, sceDebugIpmiGetServerInfo, sceDebugIpmiGetServerKidList, sceDebugIpmiGetServerKidListByDump, sceDebugIpmiGetServerWaitingThreadList, sceDebugIpmiGetSessionInfo, sceDebugIpmiGetSessionKidList, sceDebugIpmiGetSessionKidListByServerKid, sceDebugIpmiGetTidListByDump, sceDebugKillApplication, sceDebugKillProcess, sceDebugNoStopChildProcesses, sceDebugNoStopOnDLLoad, sceDebugProcessSpawn, sceDebugReadEvent, sceDebugReadEventForTest, sceDebugReadProcessMemory, sceDebugReadProcessMemoryForSDBGP, sceDebugReadProcessRegister, sceDebugReadProcessRegisterForSDBGP, sceDebugReadProcessResourceStatData, sceDebugReadThreadRegister, sceDebugReadThreadRegisterForSDBGP, sceDebugReleaseDebugRegister, sceDebugResumeApplication, sceDebugResumeProcess, sceDebugResumeThread, sceDebugSetStepThread, sceDebugSpawnApplication, sceDebugStopChildProcesses, sceDebugStopOnDLLoad, sceDebugSuspendApplication, sceDebugSuspendProcess, sceDebugSuspendThread, sceDebugTriggerCoredump, sceDebugTriggerCoredumpForSystem, sceDebugTriggerVrCaptureDump, sceDebugWriteProcessMemory, sceDebugWriteProcessRegister and sceDebugWriteThreadRegister](../../../core/libs/prx/libmdbg_syscore/Export.cpp) (libmdbg_syscore) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libmdbg_syscore.c), but no credible prototypes were found. The declarations have no parameters solely to resolve known imports; this is not an ABI claim and callers must not call them until signatures are verified + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libmdbg_syscore/Export.cpp) - 23 entries present in both version-labelled images are import-resolution declarations only. None is listed in the pinned public 3.20 catalogue for this library. Neither label independently authenticates retail firmware provenance. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Data exports require separate layout and ownership analysis. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `-Os5MER7Z6w` | +| `Unknown` | `63yQzeKlH74` | +| `Unknown` | `9Z4GhOWZL6U` | +| `Unknown` | `AOE76xS3KE8` | +| `Unknown` | `HAuOlaAs6n0` | +| `Unknown` | `KSF5BlhhUwA` | +| `Unknown` | `KnjWLw4OOEg` | +| `Unknown` | `MOLL-OygpCA` | +| `Unknown` | `Wlgt1fK0WIg` | +| `Unknown` | `Y4XKdJ9yi9w` | +| `Unknown` | `g0xdmqI4Kfo` | +| `Unknown` | `gRIqTUqqQmo` | +| `Unknown` | `h3hpY6kIB3c` | +| `Unknown` | `hAZNCht1+T0` | +| `Unknown` | `iJTmUN3+2A8` | +| `Unknown` | `iLMtKDbkQwM` | +| `Unknown` | `irUK9RMoEQo` | +| `Unknown` | `mORgO8Woq+E` | +| `Unknown` | `oNkb+v3gFg0` | +| `Unknown` | `oSQ+lkHQhI8` | +| `Unknown` | `og6sdu-o9GE` | +| `Unknown` | `qi6vA+rh1K4` | +| `Unknown` | `wrKerXOBJ8U` | diff --git a/docs/dev/debt/libs.md b/docs/dev/debt/libs.md index 1e07f7ef14..1d7941bb25 100644 --- a/docs/dev/debt/libs.md +++ b/docs/dev/debt/libs.md @@ -2,7 +2,7 @@ ### Unknown function info -- [SceAvPlayerVideoEx](../../../core/libs/SceTypes.hpp) (libSceAvPlayer) - frame rate field and encoding unknown; it is left zero in frame and stream info +- [SceAvPlayerVideoEx](../../../core/libs/SceTypes.hpp) (libSceAvPlayer) - the `framerate` field (offset 16) and its encoding are unknown and it is left zero in frame and stream info; `frame_rate` (offset 48) is set from FFmpeg's guessed frame rate in both, and the console's values are unmeasured ### Functional diff --git a/docs/dev/debt/libwebrtc.md b/docs/dev/debt/libwebrtc.md new file mode 100644 index 0000000000..6d152c056a --- /dev/null +++ b/docs/dev/debt/libwebrtc.md @@ -0,0 +1,14 @@ +# libwebrtc technical debt + +### Unknown function info + +- [392 exports (60 without a known name, bound by NID)](../../../core/libs/prx/libwebrtc/Export.cpp) (libwebrtc) - every function export of `libwebrtc.sprx` from the firmware 13.60 export table that the next section does not implement, names from aerolib.csv only where `tools/nid_names.py` `compute_nid` reproduces the NID. Signatures, parameter layouts and behaviour are unknown; every export throws through `NotImplemented_nid_no_patch` +- [31 data exports](../../../core/libs/prx/libwebrtc/Export.cpp) (libwebrtc) - the module also exports 31 data objects (+qcl2IzxTzg, -ix-knPYqWA, 00mefEErs+Y, 5FM0YOa3NWc, 67nsSkXmJ7E, 7I2xDnqfDV4, 8Dzy4JayJSU, CVCDyAzGrhI, HpbtuVdvO-w, PGIpx6NnFLE, Q+xnDp4KI-s, QXDv9OpZNvM, aOOjLmup+u4, g5USRJNh3bU, hvpHGXjlpbk, iU6+qODNSjU, jpkYoOv34AM, lHLJlq3NEqE, lQJvoyxHov4, nUaORqH85DQ, o6LS+08kOUs, oh8srl3AcNE, oslHzys1vV0, sp5NqvqDdHw, t66Gw3OIpSo, tr8vseK8-ro, uSis0q+bv6k, uTz5pEKL+hM, uxkudCJIYJA, whHm70jlRXw, yW0sV3sCdPA); they are not defined, so imports of them stay unresolved until their layout is known + +### Public source implementations + +- [Source revision](../../../core/libs/prx/libwebrtc/Export.cpp) (libwebrtc) - the module's exact WebRTC revision is not identified. Its `rtc::` names and `InterleavedView` resampler overloads place it between M127 ([branch-heads/6533](https://webrtc.googlesource.com/src/+/e0b28a6a81a989c1f5c89e30fcd247870047390d)) and M134 ([branch-heads/6998](https://webrtc.googlesource.com/src/+/8d78f5de6c27b2c793039989ea381f1428fb0100)), so the exports below follow code that is the same at both. Nothing is checked on the console. Closes when: the revision is identified and the exports are compared with the console. +- [absl::numbers_internal::FastIntToBuffer(int, char*)](../../../core/libs/prx/libwebrtc/Export.cpp) (libwebrtc) - follows the abseil both branches pin, [65ef38d368](https://chromium.googlesource.com/chromium/src/third_party/+/65ef38d36813d1ad9d4cbf8a18b32ac3691f418b/abseil-cpp/absl/strings/numbers.cc) and [d212a71416](https://chromium.googlesource.com/chromium/src/third_party/+/d212a71416ad7c6ceca04d6d27dfdd84fd00c04c/abseil-cpp/absl/strings/numbers.cc): the decimal text and a NUL, returning a pointer to the NUL. For magnitudes from 10 to 99999999 its 8-byte store also zeroes the bytes after the digits up to 8 from the first digit. A null buffer, which abseil writes through, throws. Closes when: compared with the console. +- [rtc::ExpFilter::Reset and Apply](../../../core/libs/prx/libwebrtc/src/ExpFilter.cpp) (libwebrtc) - adapted from [exp_filter.cc](https://webrtc.googlesource.com/src/+/8d78f5de6c27b2c793039989ea381f1428fb0100/rtc_base/numerics/exp_filter.cc), with its WebRTC copyright notice and BSD licence at the top of the file, on the 12-byte `alpha_`, `filtered_` and `max_` layout of `exp_filter.h`. -1 marks both an unset output and no maximum, so an output that lands on exactly -1 restarts the filter on the next sample, as upstream does. The last bit of a result can differ if the console build fuses the multiply-adds. A null filter throws. Closes when: compared with the console. +- [webrtc::rtcp::CommonHeader::Parse](../../../core/libs/prx/libwebrtc/src/RtcpCommonHeader.cpp) (libwebrtc) - adapted from [common_header.cc](https://webrtc.googlesource.com/src/+/8d78f5de6c27b2c793039989ea381f1428fb0100/modules/rtp_rtcp/source/rtcp_packet/common_header.cc), with its WebRTC copyright notice and BSD licence at the top of the file, on the 16-byte layout of `common_header.h`: packet type, count or format and padding size at 0 to 2, payload size at 4 and payload pointer at 8. Its checks run in the same order, so a short buffer or a wrong version leaves the header untouched and the later failures leave the fields already parsed. The `RTC_LOG(LS_WARNING)` message each failure logs upstream is not emitted. A null header, or a null buffer of 4 bytes or more, which upstream reads, throws. Closes when: the warnings are logged through libwebrtc's logging and the parse is compared with the console. +- [WebRtcOpus encoder functions](../../../core/libs/prx/libwebrtc/src/Opus.cpp) (libwebrtc) - the 16 `WebRtcOpus_*` encoder exports are adapted from [opus_interface.cc](https://webrtc.googlesource.com/src/+/8d78f5de6c27b2c793039989ea381f1428fb0100/modules/audio_coding/codecs/opus/opus_interface.cc), with its WebRTC copyright notice and BSD licence at the top of the file. They encode through the bundled libopus 1.6.1, not WebRTC's pinned copy, so packet bytes can differ. Signatures match at both revisions; M127 only adds a DTX change behind the `WebRTC-Audio-OpusAvoidNoisePumpingDuringDtx` field trial, which stays off because `InitFieldTrialsFromString` throws. Frames over 60 ms, up to 120 ms, throw: they depend on `WEBRTC_OPUS_SUPPORT_120MS_PTIME`. A null encoder or buffer in `Encode`, which upstream reads, throws. Closes when: the build flag is known and packets are compared with the console. diff --git a/docs/dev/debt/libwvoec.md b/docs/dev/debt/libwvoec.md new file mode 100644 index 0000000000..b4fca8a9ab --- /dev/null +++ b/docs/dev/debt/libwvoec.md @@ -0,0 +1,5 @@ +# libwvoec technical debt + +### Unknown function info + +- [77 exports (77 without a known name, bound by NID)](../../../core/libs/prx/libwvoec/Export.cpp) (libwvoec) - every function export of `libwvoec.sprx` from the firmware 13.60 export table, names from aerolib.csv only where `tools/nid_names.py` `compute_nid` reproduces the NID. Signatures, parameter layouts and behaviour are unknown; every export throws through `NotImplemented_nid_no_patch` diff --git a/docs/dev/debt/shader.md b/docs/dev/debt/shader.md index 45e16a2679..b55a3fc88f 100644 --- a/docs/dev/debt/shader.md +++ b/docs/dev/debt/shader.md @@ -37,8 +37,10 @@ - [Pixel interpolators past `SPI_PS_IN_CONTROL.NUM_INTERP`](../../../core/shader/recompiler/Optimization/src/ShaderInfoCollector.cpp) (shader recompiler) - when the IR reads an attribute at or past the guest interpolator count, the missing `SPI_PS_INPUT_CNTL` slots are filled as DEFAULT (`OFFSET` 0x20, constant 0/1) before info collection, and SPIR-V emission of `GetInterpolationParameter` for a missing binding returns the same defaults instead of throwing, matching Mesa's treatment of a PS input with no VS output. Component and mode bounds still throw. A retail title prepares a pixel shader with `NUM_INTERP` 0 while it still issues `v_interp` on attribute 0 (`undefined attribute` after the collector fill alone). Console behaviour for that pairing is not measured. - [Windows cache housekeeping](../../../core/shader/recompiler/ShaderDiskCache.cpp): eviction of old versions and temporary files is skipped for `\\?\` and `\\.\` cache roots because the supported WinLibs directory iterator can enumerate the process working directory for long prefixed paths. The active version's `last-used` stamp update still runs; it fails for long `\\.\` aliases with the supported toolchain. Ordinary Windows directory enumeration remains subject to MAX_PATH. -- [f64 compares](../../../core/shader/recompiler/Translation/src/CompareInstructions.cpp) flush denormal inputs to signed zero when bit 0 of the `FLOAT_MODE` f16/f64 denormal field is clear (modes 0 and 2); modes 1 and 3 and an unknown mode keep them. This follows the RDNA2 ISA section 6.4 and LLVM's sign-preserving AMDGPU denormal modes. The gfx1036 audit in [#981](https://github.com/boykopovar/AnyPS5/issues/981#issuecomment-6070046381) reports mode-sensitive `VopcCompareF64` results. Class compares still inspect the original bits. The full four-mode matrix has not been newly measured on AMD hardware or the PS5's gfx1013. +- [f64 compares](../../../core/shader/recompiler/Translation/src/CompareInstructions.cpp) - the PS5's gfx1013 is not measured, and no compare shows a flushed zero's sign. Denormal inputs flush to a zero of the same sign when bit 0 of the `FLOAT_MODE` f16/f64 denormal field is clear: modes 0 and 2 flush them, 1 and 3 keep them, per RDNA2 ISA section 6.4 and LLVM's sign-preserving AMDGPU denormal modes; shaders without a known float mode keep the previous lowering. Measured on RDNA2 (gfx1036, AMD Radeon Graphics, AMD Windows driver 31.0.22044.1 through HIP) over 484 `VopcCompareF64` edge-set operand pairs with every `v_cmp_X_f64` predicate (X = f, lt, eq, le, gt, lg, ge, o, u, nge, nlg, ngt, nle, neq, nlt, tru), in VOPC form, at IEEE=0 and IEEE=1 with each f16/f64 denormal mode 0 to 3, f16 round to nearest even, DX10_CLAMP=1, f32 denormals flushed and FP16_OVFL=0: modes 0 and 2 flush, 1 and 3 keep, the IEEE bit changes neither, and class compares select from the original bits. - [Shader disk cache source version](../../../core/shader/recompiler/ShaderCacheVersion.cmake) - the version that names `shader_cache/` and stamps `pipelines.journal` hashes every file under `core/shader/recompiler` (line endings normalized), `HostThreadLocal.hpp`, the SPIR-V and glslang submodule commits, and the compiler, build type and flags. Any edit there changes it and empties the cache, including edits that cannot change a translation (logging, the disk cache's own I/O, the recompiler's tests), and so does a rebuild with another compiler or flags. Driver sources outside the recompiler are not hashed: their recompiler calls are only checked against `shaderCacheReviewedNames`, so a driver change that alters a `RecompileRequest` field's meaning without changing its value keeps a stale cache. +- [Shader disk-cache load diagnostics](../../../core/shader/recompiler/ShaderDiskCache.cpp) do not separate ordinary cache loads into file lookup, mapping or read, checksum validation, deserialization and shared-plan lookup. The `MiB read in ... ms` report combines variant and resource-plan loads and sums each call's wall duration, including buffer cleanup; it is not physical I/O time or the duration of one load. Elapsed time also includes misses and rejected entries, while the byte count covers successful loads only. Mapped-page faults can occur during validation or decoding rather than during mapping. The separate lookup, read and decode counters cover prebuilt-cache searches, not these ordinary loads. Cache hits therefore do not establish that shader preparation avoided expensive loading or materialization. Loader instrumentation changes the automatic shader cache source version, so comparisons must account for the resulting cache namespace change. + - [Shader cache directories on SMB shares](../../../core/shader/recompiler/ShaderCacheDirectory.hpp) - on Windows `WriteFileAtomically` replaces an entry with a POSIX-semantics rename (`FileRenameInfoEx`), so readers and mappings of the old entry keep working. Through an SMB share that rename, like a POSIX-semantics delete, fails with `ERROR_INVALID_PARAMETER` (a NAS and `\\localhost\C$` over NTFS, #10833), and the plain rename it falls back to is refused while the entry is open or mapped, also by this process's cache. The write then returns false: the shader cache keeps the old entry and the pipeline cache logs `cannot write`. Renaming the old entry aside first would update it but leave a moment, or after a crash a state, with no entry; replacement stays atomic instead. The disk cache tests skip only those replacements where `PosixReplaceUnsupported` reports the error, and leave their directory behind when a POSIX delete returns it. - [Unlinked calls](../../../core/shader/recompiler/ControlFlow/src/GraphBuilder.cpp) - the `s_swappc_b64` a table call's compare chain falls back to, when its target matches no linked copy, records the `UnlinkedCall` fault with the target and the program counter and stops the invocation, or continues after the call in programs whose faults do not stop invocations (see `bdaStopsInvocations`). The driver lists those calls in the request (`linkedCallFallbacks`), and it reports the fault like a BDA fault, naming the target: a dispatch that checks its faults when it completes throws, one whose check runs in a deferred write-back logs it and continues. The hardware would jump to the target, which is not modelled. Any other `s_swappc_b64` whose target is not resolved still throws when the shader is compiled. - [Undecodable unreachable words](../../../core/shader/recompiler/RdnaDecoder/src/RdnaInstructionDecoder.cpp) (shader recompiler) - the linear decode sweep skips a word that fails to decode (`std::runtime_error` or `std::logic_error`, one caught exception per word) directly after `s_branch`, `s_endpgm`, `s_code_end` or another skipped word; a direct branch or `s_call_b64` to a skipped word rethrows its error. Skipping one dword assumes the next instruction starts there, so in a skipped multi-dword sequence the sweep can decode words from its middle as instructions, whose direct branches add block labels, extend the sweep or fail it with another error; a branch into the span that misses an instruction start fails the [control-flow graph](../../../core/shader/recompiler/ControlFlow/src/GraphBuilder.cpp). Words after `s_setpc_b64` are not skipped, because only the control-flow graph resolves its targets. @@ -122,6 +124,7 @@ - [v_fma_f64 and v_div_fmas_f64](../../../core/shader/recompiler/SpirvBackend/src/SpirvAlu/SpirvAluEmitterFloat64.cpp) with a subnormal operand or result round once, as IEEE 754 fusedMultiplyAdd does with f64 denormals kept, measured on RDNA2 (gfx1035) at IEEE=0 and IEEE=1, `v_div_fmas_f64` with VCC clear and set. The f16/f64 denormal field of `FLOAT_MODE` (bits 7:6) is not read: when it flushes, the hardware flushes the operands and the result of `v_fma_f64` (tininess before rounding) and only the result of `v_div_fmas_f64`, while these keep them. Shaders with f64 instructions declare `DenormPreserve` for 64-bit floats only when `shaderDenormPreserveFloat64` is true and Vulkan reports `denormBehaviorIndependence` as `ALL`; other independence modes are not handled by the current backend because they require coupled execution modes. See [VkShaderFloatControlsIndependence](https://docs.vulkan.org/refpages/latest/refpages/source/VkShaderFloatControlsIndependence.html). Elsewhere the driver may flush f64 subnormals, and `agc_driver_f64_fma_subnormals` skips if it does. - [v_floor_f64, v_ceil_f64, v_fract_f64, v_frexp_mant_f64 and v_frexp_exp_i32_f64](../../../core/shader/recompiler/Translation/src/Float64Instructions.cpp) follow the `FLOAT_MODE` f16/f64 denormal field: a denormal input is flushed to a zero of its sign when bit 0 is clear (0 and 2), and `v_fract_f64` flushes a denormal result, the fraction of a positive denormal input, to +0 when bit 1 is clear (0 and 1). `v_trunc_f64` and `v_rndne_f64` give the same results either way and are unchanged. Measured on RDNA2 (gfx1031, Radeon RX 6700 XT, AMD Windows driver 32.0.21045.5002 through HIP) at IEEE=0 and IEEE=1 with denorm16 0..3 over 23 f64 values (zeros, denormals, minimum normals, ±0.5, ±1, values next to 1, the largest finite value, infinities and quiet and signaling NaNs), and with neg and abs modifiers over 16 values (13 of those, -1.5, 2.75 and 1 - 2^-53). Shaders without a known float mode keep the previous lowering. The PS5's gfx1013 is not measured. - [v_add_f64 and v_mul_f64 denormals](../../../core/shader/recompiler/Translation/src/Float64Instructions.cpp) follow the `FLOAT_MODE` f16/f64 denormal field; the PS5's gfx1013 is not measured. Inputs flush to a zero of their sign when bit 0 is clear (0 and 2). When bit 1 is clear (0 and 1), a sum below 2^-1022, or a product whose exact value rounded to 53 significant bits with an unbounded exponent is below 2^-1022, flushes to a zero of its sign, so `0x2000000000000001 * 0x1ffffffffffffffe` (exactly 2^-1022 - 2^-1126) rounds to 2^-1022 and is kept. Measured on RDNA2 (gfx1031, RX 6700 XT, AMD Windows driver 32.0.21045.5002, HIP) at IEEE=0 and 1, denorm16 0..3, over 576 pairs of 24 f64 values (zeros, denormals, minimum normals, values next to 1 and to 2^-1022, products just below 2^-1022, the largest finite value, infinities), with neg, abs and clamp. `v_fma_f64`, `v_div_fmas_f64` and shaders without a known float mode keep the previous lowering. +- [v_add_f64, v_mul_f64, v_cvt_f64_f32 and v_cvt_f32_f64](../../../core/shader/recompiler/SpirvBackend/src/SpirvAlu/SpirvAluEmitterFloat64.cpp) are computed with 64-bit integers, rounded to nearest even with denormals kept, on a device without the Float64 capability when they are the only f64 instructions of the shader; any other f64 instruction still needs Float64 and throws. NaN results use the same bits as the native path. Checked bit for bit against the host's IEEE results by `agc_driver_f64_integer_arithmetic` (on Apple M5 Max through MoltenVK and an RTX 4090 per the author); not measured on AMD hardware or the PS5's gfx1013. - [SINT storage images](../../../core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp) of 8- and 16-bit components saturate each stored 32-bit value to the component range, as adriadam10 measured for image stores on RDNA2 (gfx1035) in #944 (448 rows match); the PS5's gfx1013 is not measured. A D16 store sign-extends each 16-bit half before that saturation, as measured on RDNA2 (gfx1035) for `image_store d16` to all eight SINT formats with DMASK 0xf, 0x7, 0x5, 0x3, 0x2, 0xa and 0x1 (1792 rows match). - [`StoreTexel`](../../../core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp) writes channel 1 of a two-channel format from the data slot whose DST_SEL is Y, for SINT and UINT alike. With DST_SEL X,Y,Z,W, gfx1035 writes it from the W slot, as adriadam10 measured in #944. - [v_ldexp_f16](../../../core/shader/recompiler/Translation/src/FloatInstructions.cpp) follows the `FLOAT_MODE` f16 denormal field: bit 0 preserves the half input and bit 1 the half result. Otherwise a denormal input is flushed to its signed zero, and a result whose exact scaled value is below the minimum normal (2^-14) is flushed to its signed zero before rounding, so `v_ldexp_f16 0x07ff, -1` gives +0 instead of 0x0400. Measured on RDNA2 (gfx1036) with round to nearest, IEEE 0 and 1 and denorm16 0..3, over every half magnitude 0x0000..0x0fff of both signs scaled by 2^-1 and 2^0 (16384 rows per mode): no mismatch. NaN and infinity handling and destination high-half preservation are unchanged. Shaders without a known float mode keep the previous lowering. @@ -170,7 +173,8 @@ - [FP16_OVFL](../../../core/shader/recompiler/Translation/src/TranslationContext/OperandAccess.cpp) follows the shader's float mode as measured on RDNA2 (gfx1036) at IEEE=0 and IEEE=1 with f16 denormals kept and flushed: with `FP16_OVFL`=1 an f16 result that rounds to ±infinity is written as ±0x7bff unless a source operand is infinite, so `v_rcp_f16`, `v_rsq_f16` and `v_log_f16` of ±0 and `v_exp_f16` of 16 or more are clamped while an infinite input passes through, and `v_div_fixup_f16` keeps the infinity it writes for a zero denominator or an infinite numerator and clamps any other infinite quotient, a NaN one included. `v_cvt_pkrtz_f16_f32` rounds toward zero and never overflows. The sources are checked as the f32 values the translation computes with; the rule is applied to `v_fma_mix*_f16` with f32 sources and to `v_interp_p2_f16` without a measurement of infinite f32 sources or parameters. Round modes other than nearest even are not modelled, so the overflow threshold is the nearest-even one (65520). - [Directed f16 rounding](../../../core/shader/recompiler/Translation/src/TranslationContext/SubwordPacking.cpp) for `v_cvt_f16_f32`, `v_cvt_f16_i16`, `v_cvt_f16_u16` and `v_ldexp_f16` follows `FLOAT_MODE` bits 3:2 in every f16 denormal mode, measured on RDNA2 (gfx1036 with f16 denormals preserved, gfx1030 in all sixteen combinations of f16 rounding and denormal mode). When bit 7 flushes f16 results, `v_cvt_f16_f32`, `v_cvt_f16_i16` and `v_cvt_f16_u16` write a zero of the result's sign for a value that, rounded in that mode with an unbounded exponent, is below 2^-14, so a value just below 2^-14 that rounds up to it stays 0x0400; `v_ldexp_f16` keeps its rule above. The `clamp` modifier is applied before the rounding. On gfx1030 every row matches: 8,996 f32 inputs around the half denormal, normal and overflow boundaries with and without `clamp`, every 16-bit integer, and 2,470 `v_ldexp_f16` operands. - [v_cvt_pkrtz_f16_f32 and v_pack_b32_f16 denormals](../../../core/shader/recompiler/Translation/src/ConvertInstructions.cpp) follow the `FLOAT_MODE` f16 denormal field: `v_cvt_pkrtz_f16_f32` flushes each denormal half result to its signed zero when bit 1 is clear (0 and 1), and `v_pack_b32_f16` flushes each denormal half input to its signed zero when bit 0 is clear (0 and 2). Measured on RDNA2 (gfx1031, Radeon RX 6700 XT, AMD Windows driver 32.0.21045.5002 through HIP) at IEEE=0 and IEEE=1 with denorm16 0..3 and f32 denormals kept, over 256 pairs of 16 f32 values around the f16 denormal range for `v_cvt_pkrtz_f16_f32` and 256 pairs of 16 halves (zeros, denormals, minimum normals, ±1, the largest finite value, infinities and quiet and signaling NaNs) for `v_pack_b32_f16`. Shaders without a known float mode keep the previous lowering. The PS5's gfx1013 is not measured. -- [Comparison sampling of a color texture](../../../core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp) (`image_sample_c`/`image_sample_c_lz` on a texture that is not R32 float or R16 unorm) returns 0 for every comparison function on formats AnyPS5 can sample as floating-point measured on GFX10 (codes 1–77 except native comparison codes 7 and 22) and on the corresponding GFX11 formats measured on gfx1100. The current Vulkan path still lowers these formats through the shader; the compare result is constant zero. Scaled, integer and formats requiring converted sampling remain refused. Only 2D, 2D-array and cube views are accepted; image tables, min/max reduction, unnormalized coordinates and unsupported addressing remain refused. Point and bilinear results match on gfx1100. The PS5's gfx1013, cube behavior, array behavior except codes 1 and 56, and anisotropic comparisons remain unverified. Bilinear weights are full float, not the hardware's fixed-point subtexel weights +- [Color comparison sampling](../../../core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp) (`image_sample_c`/`image_sample_c_lz`, excluding native R32 float/R16 unorm) returns zero for every function on sampled floating-point GFX10 formats (codes 1–77 except 7 and 22) and corresponding GFX11 formats measured on gfx1100. Point and bilinear results match on gfx1100. The Vulkan shader still lowers the comparisons but overrides the result with zero, including NaNs and TRUNC_COORD. Scaled, integer and converted formats, image tables, min/max reduction, unnormalized coordinates and unsupported addressing throw; only 2D, 2D-array and cube views are accepted. PS5 gfx1013, cube behavior, arrays except codes 1 and 56, and anisotropic comparisons remain unverified. Comparison bilinear weights remain full float rather than hardware fixed point +- [Shared sampling lowering](../../../core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp) rounds array layers half to even and retains unordered NOT_EQUAL arithmetic, following adriadam10's RDNA2 gfx1035 measurements in [#907](https://github.com/boykopovar/AnyPS5/pull/907#pullrequestreview-5439697732), not measurements on a PS5. Constant-zero color comparison tests cannot verify layer selection or nonzero NaN comparisons. Converted unorm sampling shares the layer selection and tests it with distinct values in four layers - [Negative color-texture comparison wrap indices](../../../core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp) (libSceAgcDriver) use explicit `OpSRem` normalization to implement modulo; the negative-offset point-wrap regression fails with direct `OpSMod` and passes with normalization on Mesa 22.3.6 llvmpipe (LLVM 15.0.6), but negative-index wrap has not been measured on PS5 hardware. - [Converted unorm images](../../../core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp) (10_11_11_UNORM, read and written through an R32_UINT view) are sampled in the shader, the way color comparisons are emulated: `image_sample` of a 2D or 2D array view fetches the one or four texels at LOD 0, decodes them and blends them, for point or bilinear filtering with equal minification and magnification filters and wrap or clamp-to-edge addressing. A shader gets these sample modes only once a converted descriptor reaches one of its sampled images: that capture throws `ConvertedSampleRequired`, the driver records the program and prepares it again with `GuestContext::convertedSamples`, so such a shader is prepared twice per run and its first capture is repeated. The record lives with the registered program and is not kept across runs. Bilinear weights are rounded to the hardware's 8-bit grid (`roundEven(fraction * 256) / 256`, ties to even), as measured with `image_sample_lz` on RDNA2 (gfx1035) for 10_11_11 UNORM texels by adriadam10 in #5958; point sampling, decoding, swizzles and wrap and clamp-to-edge addressing matched the same measurement. A sample that is not `_lz` needs an image with one mip level; gathers, LOD queries, clamp-to-border and mirrored addressing, other filters, min/max reduction, unnormalized coordinates, images selected at run time, 16-bit data and a DST_SEL of the missing W channel throw. - [64-bit LDS atomics](../../../core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvMemoryInstructions.cpp) (`ds_*_u64`, `ds_*_b64`, `ds_*_f64`) read and write the two dwords under a workgroup lock stored after the guest LDS, as LDS is a 32-bit array without 64-bit atomics. On RDNA2 (gfx1036) the LDS serialises a 32-bit atomic on a slot's high dword and a 64-bit atomic on that slot: 128 lanes of `ds_add_u32` and 128 lanes of `ds_add_u64` on one slot sum exactly. Only that pair was measured. Every 32-bit LDS atomic of a program that contains a 64-bit LDS atomic therefore takes the same lock, including a 32-bit `flat_atomic_*` whose address lands in the LDS aperture (a 64-bit one takes it already); the flat forms were not measured against a 64-bit atomic either (the other 32-bit LDS atomics, `ds_min/max`, `ds_cmpst`, the float forms, `ds_inc/dec`, `ds_mskor` and `ds_wrxchg`, are extrapolated from `ds_add_u32` and were not measured against a 64-bit atomic); a program without a 64-bit LDS atomic keeps its native 32-bit atomics. `ds_condxchg32_rtn_b64` is two `ds_mskor` halves, each under the lock but not atomic as a pair, so a 64-bit atomic between the two halves is not excluded. Sub-dword writes (`ds_write_b8`, `ds_write_b16` and their `_d16_hi` forms) and plain `ds_read_*`, `ds_write_*`, `ds_append_u32` and `ds_consume_u32` are not taken under the lock, so a plain access racing a 64-bit atomic on the same dwords can see or overwrite one half of it; whether the hardware orders them was not measured. The lock serialises the workgroup's LDS atomics of such a program; the throughput cost was not measured. `VK_KHR_workgroup_memory_explicit_layout` with `shaderSharedInt64Atomics` would make both widths native and is not used. A 64-bit atomic at an address that is 4-byte but not 8-byte aligned faults the wave on gfx1036, as on gfx1035; with the workgroup lock, in device memory and in the invocation-private LDS of other stages alike, the recompiler records the `Unaligned` shader fault with the LDS byte address, leaves both dwords unchanged and returns 0, but the lane and the rest of its wave keep running. When the LDS lives in device memory (compute LDS beyond the device's shared-memory limit) and the device has `shaderBufferInt64Atomics`, no lock is used: a 64-bit atomic is a compare-exchange loop on a 64-bit view of the storage buffer and a 32-bit atomic is a native buffer atomic, so a mixed-width pair on one slot relies on the device ordering both widths on one buffer address; only `ds_add_u32` against `ds_add_u64` was measured, on gfx1036 (AMD Windows driver 32.0.21042.62) and an RTX 4070 SUPER. The lock is not used there because AMD's Windows driver compiles an acquire or release on a storage buffer, at workgroup scope or wider, to `s_barrier`, and those barriers inside the lock's divergent loop pair with the program's own `s_barrier`s. The fence after each LDS atomic compiles to `s_barrier` on that driver as well, so a wave that skips an LDS atomic that other waves of its workgroup execute misses a barrier they reach; its effect was not measured. diff --git a/docs/dev/debt/ulobjmgr.md b/docs/dev/debt/ulobjmgr.md index 9bf26b6ea4..de6ccab307 100644 --- a/docs/dev/debt/ulobjmgr.md +++ b/docs/dev/debt/ulobjmgr.md @@ -7,3 +7,12 @@ ### Unknown function info - [_sceUlobjmgrRegisterObject](../../../core/libs/prx/ulobjmgr/Export.cpp) (ulobjmgr) - parameters taken from shadPS4 (PS4): a nonzero 64-bit object, a nonzero 32-bit kind and a 32-bit id output; the meaning of the first two and the PS5 signature are unverified. The id bound of `_sceUlobjmgrUnregisterObject` (below 0x4000) and the raw `EINVAL` (22) return also come from shadPS4 + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/ulobjmgr/Export.cpp) - 2 entries observed in the 3.20 export inventory and present in the later 13.60-labelled inventory are import-resolution declarations only. The later inventory label does not authenticate a retail firmware version. Parameter lists, return types and behavior are unverified; parameterless `int` declarations are placeholders, not verified ABI contracts. Every entry throws through `NotImplemented_nid_no_patch`. Unidentified names use literal NID aliases. No runtime functionality is implemented. Data exports require separate layout and ownership analysis. Identified candidate names match their NIDs in the [public symbol database](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). + +| Name | NID | +| --- | --- | +| `Unknown` | `HZ9Q2c+4BU4` | +| `Unknown` | `SweJO7t3pkk` | diff --git a/docs/run-report-fixtures/killed-recovered.json b/docs/run-report-fixtures/killed-recovered.json new file mode 100644 index 0000000000..e81378adbe --- /dev/null +++ b/docs/run-report-fixtures/killed-recovered.json @@ -0,0 +1,111 @@ +{ + "format": "anyps5-report", + "version": 1, + "generated": "2026-10-29T12:00:00Z", + "anyps5": { + "commit": "40f2a9c3d1b7e5864a0c9d2e7f13b5a8c6d49e01", + "release": "v0.1.3", + "modified": false + }, + "game": { + "titleId": "PPSA12345", + "contentId": "UP9000-PPSA12345_00-EXAMPLE00000000A", + "contentVersion": "01.002.000", + "name": "Example Game" + }, + "system": { + "os": "linux", + "osVersion": "Arch Linux (kernel 6.11)", + "cpu": "AMD Ryzen 7 5800X", + "ramGiB": 32, + "gpu": { + "vendor": "AMD", + "name": "Radeon RX 6800", + "driver": "Mesa 24.2.3 (RADV)", + "vulkan": "1.3.289" + } + }, + "run": { + "id": "7be3d1a9c0f64825a8d4e6b19f2c0a37", + "seconds": 124.5, + "exit": "killed", + "exitCode": null, + "stage": "presents", + "milestones": { + "loaded": 1.2, + "started": 1.4, + "firstDraw": 8.9, + "firstPresent": 9.3 + }, + "framesPresented": 3010, + "averageFps": 40.2, + "fpsWindowSeconds": 74.9, + "recovered": true, + "incomplete": true + }, + "coverage": { + "milestones": true, + "missing": true, + "shaders": true, + "unsupported": true, + "imageFormats": true, + "descriptors": true + }, + "truncated": { + "functions": 0, + "unsupported": 0, + "imageFormats": 0, + "descriptors": 0 + }, + "missing": { + "functions": [] + }, + "shaders": { + "compiled": 1234, + "failed": 0, + "cacheHits": 5120, + "unsupported": [], + "imageFormats": [ + { + "format": 37, + "name": "Format8_8_8_8Srgb", + "status": "accepted", + "usage": "sampled", + "count": 412 + }, + { + "format": 10, + "name": "Format8_8_8_8UNorm", + "status": "accepted", + "usage": "color-target", + "count": 96 + } + ], + "descriptors": [ + { + "type": "SampledImage", + "status": "accepted", + "usage": "read", + "count": 2210 + }, + { + "type": "UniformBuffer", + "status": "accepted", + "usage": "read", + "count": 1874 + }, + { + "type": "Sampler", + "status": "accepted", + "usage": "read", + "count": 640 + } + ] + }, + "stop": { + "kind": "other", + "reason": "unclean-unknown", + "message": "The run ended without writing a report; this one was recovered from a checkpoint.", + "source": null + } +} diff --git a/docs/run-report-fixtures/missing-metadata-gpu.json b/docs/run-report-fixtures/missing-metadata-gpu.json new file mode 100644 index 0000000000..4c06732f2a --- /dev/null +++ b/docs/run-report-fixtures/missing-metadata-gpu.json @@ -0,0 +1,66 @@ +{ + "format": "anyps5-report", + "version": 1, + "generated": "2026-10-29T12:00:00Z", + "anyps5": { + "commit": null, + "release": null, + "modified": null + }, + "game": { + "titleId": null, + "contentId": null, + "contentVersion": null, + "name": null + }, + "system": { + "os": "linux", + "osVersion": null, + "cpu": null, + "ramGiB": null, + "gpu": null + }, + "run": { + "id": "1c8e0b5d3a7f4962b4d1e9f6a30c5782", + "seconds": 2.1, + "exit": "abort", + "exitCode": 1, + "stage": "unknown", + "milestones": {}, + "framesPresented": 0, + "averageFps": null, + "fpsWindowSeconds": null, + "recovered": false, + "incomplete": false + }, + "coverage": { + "milestones": false, + "missing": true, + "shaders": true, + "unsupported": true, + "imageFormats": true, + "descriptors": true + }, + "truncated": { + "functions": 0, + "unsupported": 0, + "imageFormats": 0, + "descriptors": 0 + }, + "missing": { + "functions": [] + }, + "shaders": { + "compiled": 0, + "failed": 0, + "unsupported": [], + "imageFormats": [], + "descriptors": [] + }, + "stop": { + "kind": "other", + "reason": "other", + "message": "The run ended before the game metadata and the GPU were set up.", + "source": null + } +} diff --git a/docs/run-report-fixtures/stop-assert.json b/docs/run-report-fixtures/stop-assert.json new file mode 100644 index 0000000000..c511131cc9 --- /dev/null +++ b/docs/run-report-fixtures/stop-assert.json @@ -0,0 +1,75 @@ +{ + "format": "anyps5-report", + "version": 1, + "generated": "2026-10-29T12:00:00Z", + "anyps5": { + "commit": "40f2a9c3d1b7e5864a0c9d2e7f13b5a8c6d49e01", + "release": "v0.1.3", + "modified": false + }, + "game": { + "titleId": "PPSA12345", + "contentId": "UP9000-PPSA12345_00-EXAMPLE00000000A", + "contentVersion": "01.002.000", + "name": "Example Game" + }, + "system": { + "os": "macos", + "osVersion": "macOS 14.5", + "cpu": "Apple M2", + "ramGiB": 16, + "gpu": { + "vendor": "Apple", + "name": "Apple M2", + "driver": "MoltenVK 1.2.9", + "vulkan": "1.2.283" + } + }, + "run": { + "id": "e8431f0a6b9d4c27a3b5d1c80e7f2946", + "seconds": 19.3, + "exit": "abort", + "exitCode": 134, + "stage": "starts", + "milestones": { + "loaded": 1.0, + "started": 1.2 + }, + "framesPresented": 0, + "averageFps": null, + "fpsWindowSeconds": null, + "recovered": false, + "incomplete": false + }, + "coverage": { + "milestones": true, + "missing": true, + "shaders": true, + "unsupported": true, + "imageFormats": true, + "descriptors": true + }, + "truncated": { + "functions": 0, + "unsupported": 0, + "imageFormats": 0, + "descriptors": 0 + }, + "missing": { + "functions": [] + }, + "shaders": { + "compiled": 0, + "failed": 0, + "cacheHits": 0, + "unsupported": [], + "imageFormats": [], + "descriptors": [] + }, + "stop": { + "kind": "assert", + "reason": "crash", + "message": "A runtime assertion failed: guest memory range is not mapped.", + "source": "core/libs/prx/libkernel/DirectMemory/Export.cpp:214" + } +} diff --git a/docs/run-report-fixtures/stop-crash.json b/docs/run-report-fixtures/stop-crash.json new file mode 100644 index 0000000000..9565763708 --- /dev/null +++ b/docs/run-report-fixtures/stop-crash.json @@ -0,0 +1,111 @@ +{ + "format": "anyps5-report", + "version": 1, + "generated": "2026-10-29T12:00:00Z", + "anyps5": { + "commit": "40f2a9c3d1b7e5864a0c9d2e7f13b5a8c6d49e01", + "release": null, + "modified": true + }, + "game": { + "titleId": "PPSA12345", + "contentId": "UP9000-PPSA12345_00-EXAMPLE00000000A", + "contentVersion": "01.002.000", + "name": "Example Game" + }, + "system": { + "os": "windows", + "osVersion": "Windows 11 10.0.22631", + "cpu": "Intel Core i7-12700K", + "ramGiB": 32, + "gpu": { + "vendor": "NVIDIA", + "name": "GeForce RTX 3070", + "driver": "552.44", + "vulkan": "1.3.280" + } + }, + "run": { + "id": "52d07b9e1a6c4f38b4e2a10c7f9d8e63", + "seconds": 205.7, + "exit": "crash", + "exitCode": 3221225477, + "stage": "presents", + "milestones": { + "loaded": 1.2, + "started": 1.4, + "firstDraw": 8.9, + "firstPresent": 9.3 + }, + "framesPresented": 7340, + "averageFps": 38.9, + "fpsWindowSeconds": 188.7, + "recovered": false, + "incomplete": false + }, + "coverage": { + "milestones": true, + "missing": true, + "shaders": true, + "unsupported": true, + "imageFormats": true, + "descriptors": true + }, + "truncated": { + "functions": 0, + "unsupported": 0, + "imageFormats": 0, + "descriptors": 0 + }, + "missing": { + "functions": [] + }, + "shaders": { + "compiled": 1234, + "failed": 0, + "cacheHits": 5120, + "unsupported": [], + "imageFormats": [ + { + "format": 37, + "name": "Format8_8_8_8Srgb", + "status": "accepted", + "usage": "sampled", + "count": 412 + }, + { + "format": 10, + "name": "Format8_8_8_8UNorm", + "status": "accepted", + "usage": "color-target", + "count": 96 + } + ], + "descriptors": [ + { + "type": "SampledImage", + "status": "accepted", + "usage": "read", + "count": 2210 + }, + { + "type": "UniformBuffer", + "status": "accepted", + "usage": "read", + "count": 1874 + }, + { + "type": "Sampler", + "status": "accepted", + "usage": "read", + "count": 640 + } + ] + }, + "stop": { + "kind": "crash", + "reason": "crash", + "message": "The process ended with an unhandled access violation.", + "source": null + } +} diff --git a/docs/run-report-fixtures/stop-missing-function.json b/docs/run-report-fixtures/stop-missing-function.json new file mode 100644 index 0000000000..1788c087bb --- /dev/null +++ b/docs/run-report-fixtures/stop-missing-function.json @@ -0,0 +1,116 @@ +{ + "format": "anyps5-report", + "version": 1, + "generated": "2026-10-29T12:00:00Z", + "anyps5": { + "commit": "40f2a9c3d1b7e5864a0c9d2e7f13b5a8c6d49e01", + "release": "v0.1.3", + "modified": false + }, + "game": { + "titleId": "PPSA12345", + "contentId": "UP9000-PPSA12345_00-EXAMPLE00000000A", + "contentVersion": "01.002.000", + "name": "Example Game" + }, + "system": { + "os": "linux", + "osVersion": "Arch Linux (kernel 6.11)", + "cpu": "AMD Ryzen 7 5800X", + "ramGiB": 32, + "gpu": { + "vendor": "AMD", + "name": "Radeon RX 6800", + "driver": "Mesa 24.2.3 (RADV)", + "vulkan": "1.3.289" + } + }, + "run": { + "id": "a7c41e9b05d2438f8e1b6a90c3d5f712", + "seconds": 48.9, + "exit": "abort", + "exitCode": 134, + "stage": "first-draw", + "milestones": { + "loaded": 1.1, + "started": 1.3, + "firstDraw": 21.7 + }, + "framesPresented": 0, + "averageFps": null, + "fpsWindowSeconds": null, + "recovered": false, + "incomplete": false + }, + "coverage": { + "milestones": true, + "missing": true, + "shaders": true, + "unsupported": true, + "imageFormats": true, + "descriptors": true + }, + "truncated": { + "functions": 0, + "unsupported": 0, + "imageFormats": 0, + "descriptors": 0 + }, + "missing": { + "functions": [ + { + "library": "libSceNpTrophy", + "name": "sceNpTrophyCreateContext", + "calls": 1 + } + ] + }, + "shaders": { + "compiled": 1234, + "failed": 0, + "cacheHits": 5120, + "unsupported": [], + "imageFormats": [ + { + "format": 37, + "name": "Format8_8_8_8Srgb", + "status": "accepted", + "usage": "sampled", + "count": 412 + }, + { + "format": 10, + "name": "Format8_8_8_8UNorm", + "status": "accepted", + "usage": "color-target", + "count": 96 + } + ], + "descriptors": [ + { + "type": "SampledImage", + "status": "accepted", + "usage": "read", + "count": 2210 + }, + { + "type": "UniformBuffer", + "status": "accepted", + "usage": "read", + "count": 1874 + }, + { + "type": "Sampler", + "status": "accepted", + "usage": "read", + "count": 640 + } + ] + }, + "stop": { + "kind": "missing-function", + "reason": "runtime-stop", + "message": "Called libSceNpTrophy sceNpTrophyCreateContext, which is not implemented.", + "source": "core/libs/prx/libc/src/General.cpp:1015" + } +} diff --git a/docs/run-report-fixtures/stop-none.json b/docs/run-report-fixtures/stop-none.json new file mode 100644 index 0000000000..aef936e981 --- /dev/null +++ b/docs/run-report-fixtures/stop-none.json @@ -0,0 +1,111 @@ +{ + "format": "anyps5-report", + "version": 1, + "generated": "2026-10-29T12:00:00Z", + "anyps5": { + "commit": "40f2a9c3d1b7e5864a0c9d2e7f13b5a8c6d49e01", + "release": "v0.1.3", + "modified": false + }, + "game": { + "titleId": "PPSA12345", + "contentId": "UP9000-PPSA12345_00-EXAMPLE00000000A", + "contentVersion": "01.002.000", + "name": "Ejemplo del Juego Ünïcode" + }, + "system": { + "os": "linux", + "osVersion": "Arch Linux (kernel 6.11)", + "cpu": "AMD Ryzen 7 5800X", + "ramGiB": 32, + "gpu": { + "vendor": "AMD", + "name": "Radeon RX 6800", + "driver": "Mesa 24.2.3 (RADV)", + "vulkan": "1.3.289" + } + }, + "run": { + "id": "3f9a1c07b2d84e5f9a6c0d1e2b3a4f56", + "seconds": 312.4, + "exit": "clean", + "exitCode": 0, + "stage": "presents", + "milestones": { + "loaded": 1.2, + "started": 1.4, + "firstDraw": 8.9, + "firstPresent": 9.3 + }, + "framesPresented": 12580, + "averageFps": 41.5, + "fpsWindowSeconds": 303.1, + "recovered": false, + "incomplete": false + }, + "coverage": { + "milestones": true, + "missing": true, + "shaders": true, + "unsupported": true, + "imageFormats": true, + "descriptors": true + }, + "truncated": { + "functions": 0, + "unsupported": 0, + "imageFormats": 0, + "descriptors": 0 + }, + "missing": { + "functions": [] + }, + "shaders": { + "compiled": 1234, + "failed": 0, + "cacheHits": 5120, + "unsupported": [], + "imageFormats": [ + { + "format": 37, + "name": "Format8_8_8_8Srgb", + "status": "accepted", + "usage": "sampled", + "count": 412 + }, + { + "format": 10, + "name": "Format8_8_8_8UNorm", + "status": "accepted", + "usage": "color-target", + "count": 96 + } + ], + "descriptors": [ + { + "type": "SampledImage", + "status": "accepted", + "usage": "read", + "count": 2210 + }, + { + "type": "UniformBuffer", + "status": "accepted", + "usage": "read", + "count": 1874 + }, + { + "type": "Sampler", + "status": "accepted", + "usage": "read", + "count": 640 + } + ] + }, + "stop": { + "kind": "none", + "reason": "guest-exit", + "message": "The game exited normally.", + "source": null + } +} diff --git a/docs/run-report-fixtures/stop-other.json b/docs/run-report-fixtures/stop-other.json new file mode 100644 index 0000000000..f5a79d04ca --- /dev/null +++ b/docs/run-report-fixtures/stop-other.json @@ -0,0 +1,74 @@ +{ + "format": "anyps5-report", + "version": 1, + "generated": "2026-10-29T12:00:00Z", + "anyps5": { + "commit": "40f2a9c3d1b7e5864a0c9d2e7f13b5a8c6d49e01", + "release": "v0.1.3", + "modified": false + }, + "game": { + "titleId": "PPSA12345", + "contentId": "UP9000-PPSA12345_00-EXAMPLE00000000A", + "contentVersion": "01.002.000", + "name": "Example Game" + }, + "system": { + "os": "linux", + "osVersion": "Arch Linux (kernel 6.11)", + "cpu": "AMD Ryzen 7 5800X", + "ramGiB": 32, + "gpu": { + "vendor": "AMD", + "name": "Radeon RX 6800", + "driver": "Mesa 24.2.3 (RADV)", + "vulkan": "1.3.289" + } + }, + "run": { + "id": "9a2c5e7014bd4836b1f0d3a8c6e97520", + "seconds": 5.8, + "exit": "abort", + "exitCode": 1, + "stage": "loads", + "milestones": { + "loaded": 1.4 + }, + "framesPresented": 0, + "averageFps": null, + "fpsWindowSeconds": null, + "recovered": false, + "incomplete": false + }, + "coverage": { + "milestones": true, + "missing": true, + "shaders": true, + "unsupported": true, + "imageFormats": true, + "descriptors": true + }, + "truncated": { + "functions": 0, + "unsupported": 0, + "imageFormats": 0, + "descriptors": 0 + }, + "missing": { + "functions": [] + }, + "shaders": { + "compiled": 0, + "failed": 0, + "cacheHits": 0, + "unsupported": [], + "imageFormats": [], + "descriptors": [] + }, + "stop": { + "kind": "other", + "reason": "other", + "message": "The run ended with an error that is not classified.", + "source": null + } +} diff --git a/docs/run-report-fixtures/stop-unsupported-format.json b/docs/run-report-fixtures/stop-unsupported-format.json new file mode 100644 index 0000000000..b934e1882d --- /dev/null +++ b/docs/run-report-fixtures/stop-unsupported-format.json @@ -0,0 +1,104 @@ +{ + "format": "anyps5-report", + "version": 1, + "generated": "2026-10-29T12:00:00Z", + "anyps5": { + "commit": "40f2a9c3d1b7e5864a0c9d2e7f13b5a8c6d49e01", + "release": "v0.1.3", + "modified": false + }, + "game": { + "titleId": "PPSA12345", + "contentId": "UP9000-PPSA12345_00-EXAMPLE00000000A", + "contentVersion": "01.002.000", + "name": "Example Game" + }, + "system": { + "os": "linux", + "osVersion": "Arch Linux (kernel 6.11)", + "cpu": "AMD Ryzen 7 5800X", + "ramGiB": 32, + "gpu": { + "vendor": "AMD", + "name": "Radeon RX 6800", + "driver": "Mesa 24.2.3 (RADV)", + "vulkan": "1.3.289" + } + }, + "run": { + "id": "c19e8a3f7d4b4026a5f1e0b93d8c6a24", + "seconds": 77.0, + "exit": "abort", + "exitCode": 134, + "stage": "first-draw", + "milestones": { + "loaded": 1.3, + "started": 1.6, + "firstDraw": 52.4 + }, + "framesPresented": 0, + "averageFps": null, + "fpsWindowSeconds": null, + "recovered": false, + "incomplete": false + }, + "coverage": { + "milestones": true, + "missing": true, + "shaders": true, + "unsupported": true, + "imageFormats": true, + "descriptors": true + }, + "truncated": { + "functions": 0, + "unsupported": 0, + "imageFormats": 0, + "descriptors": 0 + }, + "missing": { + "functions": [] + }, + "shaders": { + "compiled": 1234, + "failed": 0, + "cacheHits": 5120, + "unsupported": [], + "imageFormats": [ + { + "format": 10, + "name": "Format8_8_8_8UNorm", + "status": "accepted", + "usage": "sampled", + "count": 211 + }, + { + "format": 37, + "name": "Format8_8_8_8Srgb", + "status": "rejected", + "usage": "storage", + "count": 3 + } + ], + "descriptors": [ + { + "type": "SampledImage", + "status": "accepted", + "usage": "read", + "count": 920 + }, + { + "type": "StorageImage", + "status": "rejected", + "usage": "write", + "count": 3 + } + ] + }, + "stop": { + "kind": "unsupported-format", + "reason": "runtime-stop", + "message": "Format8_8_8_8Srgb is not supported for storage image use on this GPU.", + "source": "core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp:1906" + } +} diff --git a/docs/run-report-fixtures/stop-unsupported-shader.json b/docs/run-report-fixtures/stop-unsupported-shader.json new file mode 100644 index 0000000000..60f3bc6261 --- /dev/null +++ b/docs/run-report-fixtures/stop-unsupported-shader.json @@ -0,0 +1,127 @@ +{ + "format": "anyps5-report", + "version": 1, + "generated": "2026-10-29T12:00:00Z", + "anyps5": { + "commit": "40f2a9c3d1b7e5864a0c9d2e7f13b5a8c6d49e01", + "release": "v0.1.3", + "modified": false + }, + "game": { + "titleId": "PPSA12345", + "contentId": "UP9000-PPSA12345_00-EXAMPLE00000000A", + "contentVersion": "01.002.000", + "name": "Example Game" + }, + "system": { + "os": "linux", + "osVersion": "Arch Linux (kernel 6.11)", + "cpu": "AMD Ryzen 7 5800X", + "ramGiB": 32, + "gpu": { + "vendor": "AMD", + "name": "Radeon RX 6800", + "driver": "Mesa 24.2.3 (RADV)", + "vulkan": "1.3.289" + } + }, + "run": { + "id": "0b6d2f81c9e347a5b1d08f4e6a2c9375", + "seconds": 61.2, + "exit": "abort", + "exitCode": 134, + "stage": "first-draw", + "milestones": { + "loaded": 1.2, + "started": 1.5, + "firstDraw": 40.8 + }, + "framesPresented": 0, + "averageFps": null, + "fpsWindowSeconds": null, + "recovered": false, + "incomplete": false + }, + "coverage": { + "milestones": true, + "missing": true, + "shaders": true, + "unsupported": true, + "imageFormats": true, + "descriptors": true + }, + "truncated": { + "functions": 0, + "unsupported": 0, + "imageFormats": 0, + "descriptors": 0 + }, + "missing": { + "functions": [] + }, + "shaders": { + "compiled": 311, + "failed": 2, + "cacheHits": 5120, + "unsupported": [ + { + "encoding": "VOP3", + "opcode": "V_CVT_PK_U8_F32", + "opcodeValue": 494, + "modifiers": [ + "clamp" + ], + "count": 2 + }, + { + "encoding": "VOP3", + "opcode": null, + "opcodeValue": 711, + "modifiers": null, + "count": 1 + } + ], + "imageFormats": [ + { + "format": 37, + "name": "Format8_8_8_8Srgb", + "status": "accepted", + "usage": "sampled", + "count": 412 + }, + { + "format": 10, + "name": "Format8_8_8_8UNorm", + "status": "accepted", + "usage": "color-target", + "count": 96 + } + ], + "descriptors": [ + { + "type": "SampledImage", + "status": "accepted", + "usage": "read", + "count": 2210 + }, + { + "type": "UniformBuffer", + "status": "accepted", + "usage": "read", + "count": 1874 + }, + { + "type": "Sampler", + "status": "accepted", + "usage": "read", + "count": 640 + } + ] + }, + "stop": { + "kind": "unsupported-shader", + "reason": "runtime-stop", + "message": "Shader uses an unsupported VOP3 instruction (V_CVT_PK_U8_F32).", + "source": "core/shader/recompiler/Translator/src/Vop3.cpp:812" + } +} diff --git a/docs/run-report-fixtures/zero-present.json b/docs/run-report-fixtures/zero-present.json new file mode 100644 index 0000000000..0878cf9360 --- /dev/null +++ b/docs/run-report-fixtures/zero-present.json @@ -0,0 +1,75 @@ +{ + "format": "anyps5-report", + "version": 1, + "generated": "2026-10-29T12:00:00Z", + "anyps5": { + "commit": "40f2a9c3d1b7e5864a0c9d2e7f13b5a8c6d49e01", + "release": "v0.1.3", + "modified": false + }, + "game": { + "titleId": "PPSA12345", + "contentId": "UP9000-PPSA12345_00-EXAMPLE00000000A", + "contentVersion": "01.002.000", + "name": "Example Game" + }, + "system": { + "os": "linux", + "osVersion": "Arch Linux (kernel 6.11)", + "cpu": "AMD Ryzen 7 5800X", + "ramGiB": 32, + "gpu": { + "vendor": "AMD", + "name": "Radeon RX 6800", + "driver": "Mesa 24.2.3 (RADV)", + "vulkan": "1.3.289" + } + }, + "run": { + "id": "d4f6a8c20e1b4735a9c3b7e5d1f08a62", + "seconds": 33.0, + "exit": "clean", + "exitCode": 0, + "stage": "starts", + "milestones": { + "loaded": 1.1, + "started": 1.3 + }, + "framesPresented": 0, + "averageFps": null, + "fpsWindowSeconds": null, + "recovered": false, + "incomplete": false + }, + "coverage": { + "milestones": true, + "missing": true, + "shaders": true, + "unsupported": true, + "imageFormats": true, + "descriptors": true + }, + "truncated": { + "functions": 0, + "unsupported": 0, + "imageFormats": 0, + "descriptors": 0 + }, + "missing": { + "functions": [] + }, + "shaders": { + "compiled": 0, + "failed": 0, + "cacheHits": 0, + "unsupported": [], + "imageFormats": [], + "descriptors": [] + }, + "stop": { + "kind": "none", + "reason": "quit-requested", + "message": "The window was closed.", + "source": null + } +} diff --git a/docs/run-report.schema.json b/docs/run-report.schema.json new file mode 100644 index 0000000000..18d5982f2f --- /dev/null +++ b/docs/run-report.schema.json @@ -0,0 +1,244 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "AnyPS5 run report", + "description": "anyps5-report.json, version 1. A value the runtime cannot know is null, never a guess. The file is at most 65,536 bytes of UTF-8 (checked by the writer and the tests, not expressible here). Milestone ordering is checked by the tests, not here.", + "type": "object", + "additionalProperties": false, + "required": ["format", "version", "generated", "anyps5", "game", "system", "run", "coverage", "truncated", "missing", "shaders", "stop"], + "properties": { + "format": { "const": "anyps5-report" }, + "version": { "const": 1 }, + "generated": { "type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$" }, + "anyps5": { + "type": "object", + "additionalProperties": false, + "required": ["commit", "release", "modified"], + "properties": { + "commit": { "type": ["string", "null"], "pattern": "^[0-9a-f]{40}$" }, + "release": { "type": ["string", "null"], "pattern": "^v[0-9A-Za-z][0-9A-Za-z._-]{0,63}$" }, + "modified": { "type": ["boolean", "null"] } + } + }, + "game": { + "type": "object", + "additionalProperties": false, + "required": ["titleId", "contentId", "contentVersion", "name"], + "properties": { + "titleId": { "type": ["string", "null"], "pattern": "^[A-Z]{4}[0-9]{5}$" }, + "contentId": { "type": ["string", "null"], "pattern": "^[A-Z0-9_-]{1,48}$" }, + "contentVersion": { "type": ["string", "null"], "pattern": "^[0-9A-Za-z._-]{1,32}$" }, + "name": { "$ref": "#/$defs/nullableText" } + } + }, + "system": { + "type": "object", + "additionalProperties": false, + "required": ["os", "osVersion", "cpu", "ramGiB", "gpu"], + "properties": { + "os": { "enum": ["linux", "windows", "macos", null] }, + "osVersion": { "$ref": "#/$defs/nullableText" }, + "cpu": { "$ref": "#/$defs/nullableText" }, + "ramGiB": { "type": ["integer", "null"], "minimum": 1, "maximum": 1048576 }, + "gpu": { + "type": ["object", "null"], + "additionalProperties": false, + "required": ["vendor", "name", "driver", "vulkan"], + "properties": { + "vendor": { "enum": ["AMD", "NVIDIA", "Intel", "Apple", "Other", null] }, + "name": { "$ref": "#/$defs/nullableText" }, + "driver": { "$ref": "#/$defs/nullableText" }, + "vulkan": { "type": ["string", "null"], "pattern": "^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,5}$" } + } + } + } + }, + "run": { + "type": "object", + "additionalProperties": false, + "required": ["id", "seconds", "exit", "exitCode", "stage", "milestones", "framesPresented", "averageFps", "fpsWindowSeconds", "recovered", "incomplete"], + "properties": { + "id": { "type": "string", "pattern": "^[0-9a-f]{32}$" }, + "seconds": { "$ref": "#/$defs/seconds" }, + "exit": { "enum": ["clean", "crash", "abort", "killed"] }, + "exitCode": { "type": ["integer", "null"], "minimum": -2147483648, "maximum": 4294967295 }, + "stage": { "enum": ["unknown", "loads", "starts", "first-draw", "presents"] }, + "milestones": { + "type": "object", + "additionalProperties": false, + "properties": { + "loaded": { "$ref": "#/$defs/seconds" }, + "started": { "$ref": "#/$defs/seconds" }, + "firstDraw": { "$ref": "#/$defs/seconds" }, + "firstPresent": { "$ref": "#/$defs/seconds" } + } + }, + "framesPresented": { "$ref": "#/$defs/count" }, + "averageFps": { "type": ["number", "null"], "minimum": 0, "maximum": 1000000 }, + "fpsWindowSeconds": { "type": ["number", "null"], "exclusiveMinimum": 0, "maximum": 1000000000 }, + "recovered": { "type": "boolean" }, + "incomplete": { "type": "boolean" } + }, + "allOf": [ + { "if": { "properties": { "stage": { "const": "unknown" } }, "required": ["stage"] }, "then": { "properties": { "milestones": { "maxProperties": 0 } } } }, + { "if": { "properties": { "stage": { "const": "loads" } }, "required": ["stage"] }, "then": { "properties": { "milestones": { "required": ["loaded"] } } } }, + { "if": { "properties": { "stage": { "const": "starts" } }, "required": ["stage"] }, "then": { "properties": { "milestones": { "required": ["started"] } } } }, + { "if": { "properties": { "stage": { "const": "first-draw" } }, "required": ["stage"] }, "then": { "properties": { "milestones": { "required": ["firstDraw"] } } } }, + { "if": { "properties": { "stage": { "const": "presents" } }, "required": ["stage"] }, "then": { "properties": { "milestones": { "required": ["firstPresent"] } } } }, + { "if": { "properties": { "framesPresented": { "maximum": 1 } }, "required": ["framesPresented"] }, "then": { "properties": { "averageFps": { "type": "null" }, "fpsWindowSeconds": { "type": "null" } } } }, + { "if": { "properties": { "recovered": { "const": true } }, "required": ["recovered"] }, "then": { "properties": { "incomplete": { "const": true }, "exit": { "const": "killed" }, "exitCode": { "type": "null" } } } }, + { "if": { "properties": { "exit": { "const": "killed" } }, "required": ["exit"] }, "then": { "properties": { "recovered": { "const": true } } } } + ] + }, + "coverage": { + "type": "object", + "additionalProperties": false, + "required": ["milestones", "missing", "shaders", "unsupported", "imageFormats", "descriptors"], + "properties": { + "milestones": { "type": "boolean" }, + "missing": { "type": "boolean" }, + "shaders": { "type": "boolean" }, + "unsupported": { "type": "boolean" }, + "imageFormats": { "type": "boolean" }, + "descriptors": { "type": "boolean" } + } + }, + "truncated": { + "type": "object", + "additionalProperties": false, + "required": ["functions", "unsupported", "imageFormats", "descriptors"], + "properties": { + "functions": { "$ref": "#/$defs/count" }, + "unsupported": { "$ref": "#/$defs/count" }, + "imageFormats": { "$ref": "#/$defs/count" }, + "descriptors": { "$ref": "#/$defs/count" } + } + }, + "missing": { + "type": "object", + "additionalProperties": false, + "required": ["functions"], + "properties": { + "functions": { + "type": "array", + "maxItems": 200, + "items": { + "type": "object", + "additionalProperties": false, + "required": ["library", "name", "calls"], + "properties": { + "library": { "type": ["string", "null"], "pattern": "^[A-Za-z0-9_.-]{1,64}$" }, + "name": { "type": "string", "pattern": "^[A-Za-z0-9_.$]{1,128}$" }, + "calls": { "$ref": "#/$defs/positiveCount" } + } + } + } + } + }, + "shaders": { + "type": "object", + "additionalProperties": false, + "required": ["compiled", "failed", "unsupported", "imageFormats", "descriptors"], + "properties": { + "compiled": { "$ref": "#/$defs/count" }, + "failed": { "$ref": "#/$defs/count" }, + "cacheHits": { "$ref": "#/$defs/count" }, + "unsupported": { + "type": "array", + "maxItems": 200, + "items": { + "type": "object", + "additionalProperties": false, + "required": ["encoding", "opcode", "opcodeValue", "modifiers", "count"], + "properties": { + "encoding": { "type": ["string", "null"], "pattern": "^[A-Za-z0-9_]{1,32}$" }, + "opcode": { "type": ["string", "null"], "pattern": "^[A-Za-z0-9_]{1,64}$" }, + "opcodeValue": { "type": ["integer", "null"], "minimum": 0, "maximum": 4294967295 }, + "modifiers": { + "type": ["array", "null"], + "maxItems": 16, + "items": { "type": "string", "pattern": "^[a-z0-9][a-z0-9-]{0,31}$" } + }, + "count": { "$ref": "#/$defs/positiveCount" } + } + } + }, + "imageFormats": { + "type": "array", + "maxItems": 100, + "items": { + "type": "object", + "additionalProperties": false, + "required": ["format", "name", "status", "usage", "count"], + "properties": { + "format": { "type": "integer", "minimum": 0, "maximum": 4294967295 }, + "name": { "type": ["string", "null"], "pattern": "^[A-Za-z0-9_]{1,64}$" }, + "status": { "enum": ["accepted", "rejected", "unknown"] }, + "usage": { "$ref": "#/$defs/formatUsage" }, + "count": { "$ref": "#/$defs/positiveCount" } + } + } + }, + "descriptors": { + "type": "array", + "maxItems": 100, + "items": { + "type": "object", + "additionalProperties": false, + "required": ["type", "status", "usage", "count"], + "properties": { + "type": { "enum": ["UniformBuffer", "StorageBuffer", "UniformTexelBuffer", "StorageTexelBuffer", "SampledImage", "StorageImage", "Sampler"] }, + "status": { "enum": ["accepted", "rejected", "unknown"] }, + "usage": { "$ref": "#/$defs/descriptorUsage" }, + "count": { "$ref": "#/$defs/positiveCount" } + } + } + } + } + }, + "stop": { + "type": "object", + "additionalProperties": false, + "required": ["kind", "reason", "message", "source"], + "properties": { + "kind": { "enum": ["none", "missing-function", "unsupported-shader", "unsupported-format", "crash", "assert", "other"] }, + "reason": { "enum": ["guest-exit", "quit-requested", "runtime-stop", "crash", "unclean-unknown", "other"] }, + "message": { "$ref": "#/$defs/text" }, + "source": { "type": ["string", "null"], "pattern": "^(?!.*\\.\\.)[A-Za-z0-9_][A-Za-z0-9_./+-]{0,254}:[0-9]{1,9}$" } + }, + "allOf": [ + { "if": { "properties": { "kind": { "const": "none" } }, "required": ["kind"] }, "then": { "properties": { "reason": { "enum": ["guest-exit", "quit-requested"] } } } }, + { "if": { "properties": { "reason": { "enum": ["guest-exit", "quit-requested"] } }, "required": ["reason"] }, "then": { "properties": { "kind": { "const": "none" } } } }, + { "if": { "properties": { "reason": { "const": "unclean-unknown" } }, "required": ["reason"] }, "then": { "properties": { "kind": { "const": "other" } } } }, + { "if": { "properties": { "reason": { "const": "runtime-stop" } }, "required": ["reason"] }, "then": { "properties": { "kind": { "enum": ["missing-function", "unsupported-shader", "unsupported-format", "other"] } } } }, + { "if": { "properties": { "kind": { "enum": ["crash", "assert"] } }, "required": ["kind"] }, "then": { "properties": { "reason": { "const": "crash" } } } } + ] + } + }, + "allOf": [ + { "if": { "properties": { "run": { "properties": { "exit": { "const": "clean" } }, "required": ["exit"] } }, "required": ["run"] }, "then": { "properties": { "stop": { "properties": { "kind": { "const": "none" } } } } } }, + { "if": { "properties": { "stop": { "properties": { "kind": { "const": "none" } }, "required": ["kind"] } }, "required": ["stop"] }, "then": { "properties": { "run": { "properties": { "exit": { "const": "clean" } } } } } }, + { "if": { "properties": { "run": { "properties": { "recovered": { "const": true } }, "required": ["recovered"] } }, "required": ["run"] }, "then": { "properties": { "stop": { "properties": { "kind": { "const": "other" }, "reason": { "const": "unclean-unknown" } } } } } }, + { "if": { "properties": { "stop": { "properties": { "reason": { "const": "unclean-unknown" } }, "required": ["reason"] } }, "required": ["stop"] }, "then": { "properties": { "run": { "properties": { "recovered": { "const": true } } } } } }, + { "if": { "properties": { "coverage": { "properties": { "milestones": { "const": false } }, "required": ["milestones"] } }, "required": ["coverage"] }, + "then": { "properties": { "run": { "properties": { "stage": { "const": "unknown" }, "framesPresented": { "const": 0 } } } } } }, + { "if": { "properties": { "coverage": { "properties": { "missing": { "const": false } }, "required": ["missing"] } }, "required": ["coverage"] }, + "then": { "properties": { "missing": { "properties": { "functions": { "maxItems": 0 } } }, "truncated": { "properties": { "functions": { "const": 0 } } } } } }, + { "if": { "properties": { "coverage": { "properties": { "shaders": { "const": false } }, "required": ["shaders"] } }, "required": ["coverage"] }, + "then": { "properties": { "shaders": { "properties": { "compiled": { "const": 0 }, "failed": { "const": 0 } } } } } }, + { "if": { "properties": { "coverage": { "properties": { "unsupported": { "const": false } }, "required": ["unsupported"] } }, "required": ["coverage"] }, + "then": { "properties": { "shaders": { "properties": { "unsupported": { "maxItems": 0 } } }, "truncated": { "properties": { "unsupported": { "const": 0 } } } } } }, + { "if": { "properties": { "coverage": { "properties": { "imageFormats": { "const": false } }, "required": ["imageFormats"] } }, "required": ["coverage"] }, + "then": { "properties": { "shaders": { "properties": { "imageFormats": { "maxItems": 0 } } }, "truncated": { "properties": { "imageFormats": { "const": 0 } } } } } }, + { "if": { "properties": { "coverage": { "properties": { "descriptors": { "const": false } }, "required": ["descriptors"] } }, "required": ["coverage"] }, + "then": { "properties": { "shaders": { "properties": { "descriptors": { "maxItems": 0 } } }, "truncated": { "properties": { "descriptors": { "const": 0 } } } } } } + ], + "$defs": { + "seconds": { "type": "number", "minimum": 0, "maximum": 1000000000 }, + "count": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, + "positiveCount": { "type": "integer", "minimum": 1, "maximum": 9007199254740991 }, + "text": { "type": "string", "minLength": 1, "maxLength": 300, "pattern": "^[^\\u0000-\\u001f\\u007f]+$" }, + "nullableText": { "type": ["string", "null"], "minLength": 1, "maxLength": 300, "pattern": "^[^\\u0000-\\u001f\\u007f]+$" }, + "formatUsage": { "enum": ["sampled", "storage", "color-target", "depth-target", "transfer", "other"] }, + "descriptorUsage": { "enum": ["read", "write", "atomic", "other"] } + } +} diff --git a/docs/user/INPUT_MAPPING.md b/docs/user/INPUT_MAPPING.md index c4e102fe11..d22dcfb9aa 100644 --- a/docs/user/INPUT_MAPPING.md +++ b/docs/user/INPUT_MAPPING.md @@ -1,6 +1,6 @@ # Controller, keyboard and mouse input -AnyPS5 accepts SDL-mapped game controllers as well as its built-in keyboard and mouse bindings. Up to 4 controllers are supported simultaneously. The first connected controller is assigned to Player 1 and composed with keyboard and mouse input; additional controllers are sequentially assigned to Players 2, 3, and 4 (matching `libSceUserService` users). Xbox-style controllers and PlayStation controllers recognized by SDL use the standard PS button layout; sticks and analog triggers are passed through, and controllers can be connected or disconnected dynamically while the game is running. AnyPS5 uses its built-in keyboard and mouse bindings when no configuration file is present. To change selected keyboard and mouse bindings, create `anyps5-input.ini` beside the generated game executable. Set `ANYPS5_INPUT_CONFIG` to use a file at another path. Both the game directory and that path may contain any characters, such as `ü` or `日本`. +AnyPS5 accepts SDL-mapped game controllers as well as its built-in keyboard and mouse bindings. Up to 4 controllers are supported simultaneously. The first connected controller is assigned to Player 1 and composed with keyboard and mouse input; additional controllers are sequentially assigned to Players 2, 3, and 4 (matching `libSceUserService` users). Xbox-style controllers and PlayStation controllers recognized by SDL use the standard PS button layout; sticks and analog triggers are passed through, and controllers can be connected or disconnected dynamically while the game is running. AnyPS5 uses its built-in keyboard and mouse bindings when no configuration file is present. To change selected keyboard and mouse bindings, create `anyps5-input.ini` beside the generated game executable. Set `ANYPS5_INPUT_CONFIG` to use a file at another path. Both the game directory and that path may contain any characters, such as `ü` or `日本`. With `ANYPS5_PAD_PORT0_STATE=controller`, keyboard and mouse input reaches the game only while a controller is bound to Player 1; see [Controller connection and user 0](USAGE.md#controller-connection-and-user-0). For an Xbox-layout controller, A/B/X/Y map to Cross/Circle/Square/Triangle, LB/RB map to L1/R1, and LT/RT map to analog L2/R2. Start maps to Options. D-pad and stick-click buttons are supported. On a PlayStation controller, touchpad clicks and the positions of up to two fingers on the touchpad are forwarded. On other controllers, View (Back) presses the touchpad at its center. @@ -14,12 +14,16 @@ Supported input sources are: While a title has a mouse open (`sceMouseOpen`) and the window is focused, AnyPS5 hides and captures the host cursor, so the title's own cursor is the only one; the capture ends when the window loses focus or when the mouse-to-stick toggle (`ToggleMouse`) is on. Mouse movement reaches the title scaled from the window's presented image to the title's display resolution, so the title's cursor moves as far as the host cursor would. +The window hotkeys (`ToggleFullscreen`, `TogglePerformanceOverlay`, `Screenshot`, `ShowPadStatus`, `VolumeDown`, `VolumeUp` and `ToggleMute`) never reach the game's pad. A key bound to a hotkey and to another action triggers both, as for every other action; the built-in keys of the actions above share none. + Game-controller bindings are enabled automatically and are not affected by keyboard or mouse overrides in this file. Supported actions are `Cross`, `Circle`, `Triangle`, `Square`, `L1`, `R1`, `L2`, `R2`, `L3`, `R3`, `Options`, `Up`, `Right`, `Down`, `Left`, `LeftStickLeft`, `LeftStickRight`, `LeftStickUp`, `LeftStickDown`, `RightStickLeft`, `RightStickRight`, `RightStickUp`, `RightStickDown`, `TouchLeft`, `TouchRight`, `StickModifier`, `Shake`, `ToggleMouse`, `ToggleFullscreen` (F11), `TogglePerformanceOverlay` (F10, the [performance overlay](USAGE.md#performance-overlay)), `Screenshot` (F12, saves the next displayed frame as described in [screenshots](USAGE.md#screenshots)), and `ShowPadStatus` (F9, shows the [controller status panel](USAGE.md#controller-status-panel) for a few seconds). `ToggleFullscreen`, `TogglePerformanceOverlay`, `Screenshot` and `ShowPadStatus` accept only keyboard keys. A key bound to `ShowPadStatus` and to another action triggers both, as for every other action. F9 is the built-in key of `ShowPadStatus`: if you moved `Screenshot`, `TogglePerformanceOverlay` or another action to F9, also rebind `ShowPadStatus` to a key you do not use, or each press shows the controller status panel too. The [web configurator](#web-configurator) warns about a key that two actions share. +Three more actions control the host's output volume: `VolumeDown` (F5), `VolumeUp` (F6) and `ToggleMute` (F8), described in [host volume and mute](USAGE.md#host-volume-and-mute). They accept only keyboard keys too. + ### Default bindings Without an `anyps5-input.ini`, or for actions the file does not mention, these bindings apply: @@ -47,6 +51,9 @@ Without an `anyps5-input.ini`, or for actions the file does not mention, these b | `TogglePerformanceOverlay` | F10 | | `Screenshot` | F12 | | `ShowPadStatus` | F9 | +| `VolumeDown` | F5 | +| `VolumeUp` | F6 | +| `ToggleMute` | F8 | For example, this changes Cross to F or Space, moves the left stick to IJKL, uses the mouse buttons for Square and R2, makes the middle mouse button the only `ToggleMouse` input (the line replaces F7), and keeps all other built-in bindings: @@ -68,6 +75,7 @@ The same file also accepts these settings, each at most once, in the form `Setti |---------|-------|---------| | `LeftStickDeadzone`, `RightStickDeadzone` | Whole percentage from 0 to 90 of the controller stick's travel that reads as centered. Outside it the travel is rescaled, so the stick still reaches its full range. Keyboard and mouse stick bindings are not affected. | `0` | | `MouseSensitivity` | Number greater than 0 and at most 10. At 1, moving the mouse 3000 counts per second tilts the stick fully, about 5 cm per second at 1600 DPI; a larger number needs less movement. | `1` | +| `MouseStickTarget` | `Left` or `Right`. Selects which analog stick is controlled by mouse movement when `ToggleMouse` is enabled. | `Right` | | `MouseVerticalScale` | Number from 0.1 to 10 that multiplies vertical mouse speed, for games that pitch slower or faster than they turn. | `1` | | `MouseCurve` | Number from 0.2 to 5, the response exponent. Above 1 gives finer control at low speed; below 1 reaches large tilts sooner. | `1` | | `MouseDeadzoneOffset` | Number from 0 to 0.9, the smallest tilt any movement produces as a fraction of full tilt. Set it just above the game's own deadzone: raise it if slow movement doesn't move the camera, lower it if small movements jump. | `0.2` | @@ -121,12 +129,18 @@ With `TriggerRampMs` above 0, a key or mouse button bound to `L2` or `R2` presse While the `Shake` input is held (X by default), the controller reports its acceleration and angular velocity swinging back and forth every 50 ms, for titles that ask the player to shake the controller. A controller's own motion sensors are used otherwise. -## Mouse as the right stick +## Mouse as an analog stick -`ToggleMouse` (the middle mouse button or F7 by default; a mouse without a middle button can use F7) captures the mouse and drives the right stick from how fast the mouse moves. Capture uses raw relative input, so the pointer speed and acceleration set in the operating system don't apply. Press it again to release the mouse. Capture also ends, and every held key is let go, when the window loses focus. +`ToggleMouse` (the middle mouse button or F7 by default; a mouse without a middle button can use F7) captures the mouse and drives the analog stick selected by `MouseStickTarget` (`Right` by default) from how fast the mouse moves. Capture uses raw relative input, so the pointer speed and acceleration set in the operating system don't apply. Press it again to release the mouse. Capture also ends, and every held key is let go, when the window loses focus. The stick tilts in the direction the mouse moves, and further the faster it moves. Speed is measured in counts per second over the time between updates, so the same hand speed gives the same tilt at any frame rate. Any movement tilts the stick at least `MouseDeadzoneOffset`, so slow movement isn't lost inside the game's own deadzone. When the mouse stops, the stick eases back and is centered `MouseDecayMs` after the last movement. +To control the left analog stick with mouse movement: + +```ini +MouseStickTarget = Left +``` + For example, for a game with a small deadzone that needs fast turns: ```ini diff --git a/docs/user/README.es.md b/docs/user/README.es.md index 5b193f4335..65c45e787b 100644 --- a/docs/user/README.es.md +++ b/docs/user/README.es.md @@ -24,7 +24,7 @@ Incluye un [relinker](../../core/relinker) que convierte el ejecutable al format * Bibliotecas del sistema: porcentaje de las funciones conocidas por el proyecto hasta ahora (declaradas en [core/libs/prx](../../core/libs/prx)), no de todas las funciones del sistema de PS5. El total crece a medida que se declaran más funciones. -Los estados no soportados o inesperados lanzan estrictamente `std::runtime_error`. `what()` se imprime en stderr y el proceso termina. +Los estados no soportados o inesperados lanzan una excepción de C++, normalmente `std::runtime_error`. Una excepción que nada captura imprime su `what()` en stderr y termina el proceso. El [recompilador de shaders](../../core/shader/recompiler/Recompiler.cpp) produce SPIR-V correctamente (validado mediante [Spirv-Tools](../../3rdparty/SPIRV-Tools) cuando se compila con `ANYPS5_ENABLE_SPIRV_TOOLS`). diff --git a/docs/user/README.pt-BR.md b/docs/user/README.pt-BR.md index 1a71c0e861..be61515e03 100644 --- a/docs/user/README.pt-BR.md +++ b/docs/user/README.pt-BR.md @@ -24,7 +24,7 @@ Inclui um [relinker](../../core/relinker) que converte o executável para o form * Bibliotecas do sistema: porcentagem das funções conhecidas pelo projeto até agora (declaradas em [core/libs/prx](../../core/libs/prx)), não de todas as funções de sistema do PS5. O total cresce à medida que mais funções são declaradas. -Estados não suportados ou inesperados lançam estritamente `std::runtime_error`. O `what()` é impresso no stderr e o processo é encerrado. +Estados não suportados ou inesperados lançam uma exceção C++, normalmente `std::runtime_error`. Uma exceção que nada captura imprime seu `what()` no stderr e encerra o processo. O [recompilador de shaders](../../core/shader/recompiler/Recompiler.cpp) produz SPIR-V com sucesso (validado via [Spirv-Tools](../../3rdparty/SPIRV-Tools) quando compilado com `ANYPS5_ENABLE_SPIRV_TOOLS`). diff --git a/docs/user/README.ru.md b/docs/user/README.ru.md index a146b11c50..ea1feee4f2 100644 --- a/docs/user/README.ru.md +++ b/docs/user/README.ru.md @@ -24,7 +24,7 @@ * Системные библиотеки: процент функций, известных проекту на данный момент (объявленных в [core/libs/prx](../../core/libs/prx)), а не всех системных функций PS5. Общее число растёт по мере объявления новых функций. -Неподдерживаемые или неожиданные состояния строго выбрасывают `std::runtime_error`. `what()` выводится в stderr, и процесс завершается. +Неподдерживаемые или неожиданные состояния выбрасывают исключение C++, обычно `std::runtime_error`. Исключение, которое никто не перехватил, выводит свой `what()` в stderr и завершает процесс. [Рекомпилятор шейдеров](../../core/shader/recompiler/Recompiler.cpp) успешно генерирует SPIR-V (проверяется через [Spirv-Tools](../../3rdparty/SPIRV-Tools) при сборке с `ANYPS5_ENABLE_SPIRV_TOOLS`). diff --git a/docs/user/README.zh-CN.md b/docs/user/README.zh-CN.md index d0db964c92..c5f3f3c67d 100644 --- a/docs/user/README.zh-CN.md +++ b/docs/user/README.zh-CN.md @@ -24,7 +24,7 @@ * 系统库:项目目前已知函数(在 [core/libs/prx](../../core/libs/prx) 中声明)的百分比,而非 PS5 全部系统函数的百分比。随着声明的函数增多,总数会增长。 -不支持或意外的状态一律抛出 `std::runtime_error`。`what()` 会输出到 stderr,然后进程终止。 +不支持或意外的状态会抛出 C++ 异常,通常是 `std::runtime_error`。没有被捕获的异常会把其 `what()` 输出到 stderr,然后进程终止。 [着色器重编译器](../../core/shader/recompiler/Recompiler.cpp)可成功生成 SPIR-V(使用 `ANYPS5_ENABLE_SPIRV_TOOLS` 构建时通过 [Spirv-Tools](../../3rdparty/SPIRV-Tools) 验证)。 diff --git a/docs/user/USAGE.md b/docs/user/USAGE.md index 4ebc887dbe..ac07cd4e80 100644 --- a/docs/user/USAGE.md +++ b/docs/user/USAGE.md @@ -278,7 +278,11 @@ A Windows executable started without a standard output or error handle, such as ### Display resolution and window size -The game chooses its video-output resolution; AnyPS5 uses that mode for rendering. The display window can be resized or switched to fullscreen, which scales the presented image to fit the window. F11 switches between window and fullscreen; set `ANYPS5_FULLSCREEN` to a non-empty value other than `0` to open the window fullscreen from the start. Changing the window size does not change the game's render resolution. AnyPS5 does not currently provide a global render-resolution override; use a game's own display setting when it offers one. +The game chooses its video-output resolution; AnyPS5 uses that mode for rendering. The display window can be resized or switched to fullscreen, which scales the presented image to fit the window. F11 switches between window and fullscreen; set `ANYPS5_FULLSCREEN` to a non-empty value other than `0` to open the window fullscreen from the start. Changing the window size does not change the game's render resolution. The only host setting that changes the resolution a game reads is `APS5_OUTPUT_RESOLUTION`, described below; otherwise AnyPS5 provides no render-resolution override, so use a game's own display setting when it offers one. + +`APS5_OUTPUT_RESOLUTION=x`, for example `APS5_OUTPUT_RESOLUTION=1920x1080`, makes the game's video output status report the 1080p class when the width is below 3840 and the height below 2160, and the 2160p class otherwise, instead of the class of the display's current mode. The two numbers must be positive integers separated by `x` or `X`. An empty value is the same as an unset one; any other value stops the game with an error that names the variable. + +`ANYPS5_DISPLAY_INDEX=` opens the window centred on display `n`, counted from 0 in the order SDL lists the displays. Unset, the first display is used. A value that is not the index of a connected display, including an empty value, stops the game at start with an error that names the variable. ### VR compatibility @@ -303,6 +307,10 @@ For timed button sequences, see [Controller timelines](INPUT_MAPPING.md#controll Run the helper in a second terminal. Commands are polled at most every 100 ms during controller reads, and their buttons add to physical controller input. A press lasts 300 ms by default, starting when the application reads it, and releases automatically; `--hold-ms` accepts 1–5000 ms. `--left-stick X Y` and `--right-stick X Y` hold the sticks for the same time: each axis is 0-255, 128 is the centre, X grows to the right and Y grows downward. While such a command is active both sticks come from it instead of the physical controller, and a stick that was not named stays centred. `touch-left` and `touch-right` press the touchpad with a finger on its left or right half, as the `TouchLeft` and `TouchRight` keys do; in the command file they are bits `0x200000` and `0x400000` of the button field. Button names joined by `+`, such as `l1+r1`, are pressed together in one command; `release` cannot be joined. Wait for the application to observe a release before sending another press. The file holds only the latest command; rapid commands can replace one another. On POSIX, replacing an existing command file retains its permission mode; a privileged helper also retains its owner and group so the game user can still read it. Commands left over when the application first reads the controller are ignored. Without the environment variable, file input is disabled. +Set `APS5_NO_PAD_INPUT` to any value, an empty one included, to make the window ignore its keyboard and mouse events. The keyboard and mouse bindings, the mouse stick and the window keys (F10, F11 and F12 among them) then do nothing. Controllers and the `APS5_PAD_INPUT_FILE` commands are not affected. + +On Windows, set `APS5_NO_WGI` to any value to turn off SDL's Windows Gaming Input controller backend. AnyPS5 turns off DirectInput there in every case, and this variable is read once when the video output driver is created. + ### Controller vibration strength Set `ANYPS5_RUMBLE` to a whole number from `0` to `100` to scale how strongly the game's vibration reaches your controller. `100`, which is also the value when the variable is unset, passes the vibration exactly as the game asks. `0` turns vibration off: the motors never receive a nonzero request, and a rumble that was running is stopped. Values in between scale the motor strength by that percentage and apply to every connected controller. @@ -316,6 +324,18 @@ The setting covers the rumble motors, the impulse-trigger rumble of controllers This is a host-side comfort setting, not console behaviour: it is applied by AnyPS5 between the game and your controller, it is read once at start, and there is no hotkey or overlay entry for it. It is not a model of any console setting. +### Controller connection and user 0 + +By default port 0 stays connected and the first user stays logged in even when the only controller is removed, so the game keeps reading the last state and never learns the pad is gone. Set `ANYPS5_PAD_PORT0_STATE=controller` to make the game see the controller instead: + +```sh +ANYPS5_PAD_PORT0_STATE=controller ./app.elf +``` + +With `controller`, removing the controller bound to Player 1 makes the game see a disconnected pad with zeroed input, and user 0 logs out; plugging it back in connects the pad and logs the user in again. A change is applied only after the controller has stayed away or present for 500 ms, so a cable that drops and returns does not make the game flap. Keyboard and mouse do not count as a controller in this mode: while no controller is bound to Player 1, their input is not given to the game. The value `default`, or leaving the variable unset, keeps the behaviour above. Any other value, including an empty one, stops the game when video output starts, with an error that names `ANYPS5_PAD_PORT0_STATE`. + +Only port 0 and user 0 follow the controller. Players 2 to 4 keep reporting the state they had before. + ### Video-out and pad telemetry Set `APS5_VIDEOOUT_TELEMETRY_DIR` to a directory before launching the application to write the run's presents and pad changes to `/videoout.jsonl`, one JSON object per line, appended when the file already exists. Every line starts with `"v":1`, the host's steady-clock nanoseconds in `t_ns` and the event name in `ev`. A run starts with a `contract` line, `{"v":1,"t_ns":,"ev":"contract","contract":"v1-pad","commit":"<12 hex>","pid":,"prx":"libSceVideoOut"}`: `commit` is the source commit the libraries were built from (`unknown` when Git was not found at configuration) and `pid` tells apart the runs that appended to the same file. A `pad` line is written when the pad state the title reads changes in its buttons, sticks or triggers, `{"v":1,"t_ns":,"ev":"pad","n":,"buttons":,"sticks":[,,,],"triggers":[,]}`, where `n` is the number of presents completed when the change was published, the count the window title shows. `buttons` is the button bit field in decimal, stick axes run 0-255 with 128 at the centre, and both triggers run 0-255. Motion, touch and the device kind are not compared, so a run that only moves the controller writes no `pad` line. The state a `pad` line reports is the controller and keyboard/mouse input read through SDL; input fed by `APS5_PAD_INPUT_FILE` is applied later, in `libScePad`, so a scripted run writes no `pad` line. A `present` line is written after the first present and every 30 presents after that, `{"v":1,"t_ns":,"ev":"present","n":,"fps":}`, with the count and rate the window title shows. A background thread writes the lines and the title is not waited for: when it falls behind, the line is dropped and a `drops` line with the number dropped so far, `{"v":1,"t_ns":,"ev":"drops","dropped":}`, is written every ten seconds while the count grows, and once at a normal exit, only when lines were dropped; an exit that skips static destructors writes no last line. A pad line the full queue refused counts as dropped even though a later publish writes the change. Without the variable no file is opened and no thread is started; an empty value is the same as an unset one, and a directory that cannot be written stops the title when video output starts, with an error naming the file. @@ -334,6 +354,10 @@ Games that open the console's system font sets (`sceFontOpenFontSet`) need font Games ask for the console's language with `sceSystemServiceParamGetInt` and show their text in it when they have it. It is English (United States) unless `ANYPS5_LANGUAGE` is set to another console language number: 0 Japanese, 1 English (United States), 2 French, 3 Spanish, 4 German, 5 Italian, 6 Dutch, 7 Portuguese (Portugal), 8 Russian, 9 Korean, 10 Chinese (Traditional), 11 Chinese (Simplified), 12 Finnish, 13 Swedish, 14 Danish, 15 Norwegian, 16 Polish, 17 Portuguese (Brazil), 18 English (United Kingdom), 19 Turkish, 20 Spanish (Latin America), 21 Arabic, 22 French (Canada), 23 Czech, 24 Hungarian, 25 Greek, 26 Romanian, 27 Thai, 28 Vietnamese, 29 Indonesian, 30 Ukrainian. For example, `ANYPS5_LANGUAGE=21` selects Arabic. An empty value is the same as an unset one; any other value stops the game at its first language query with an error that names the variable. +### Save data free space + +By default a game's save data is never refused for lack of disk space, and the free blocks it sees are those of its own save. Set `ANYPS5_FREE_SPACE=host` to make a new save refuse to be created when the volume that holds the save data has less room than the save's size, so the game can report that the disk is full. A save of 16384 blocks, the size used when the game asks for none, needs 1 GiB. The free blocks a game reads for a save are then limited to the room its volume still has. `fixed`, the value used when the variable is unset, keeps today's behaviour, and any other value, including an empty one, stops the game at its next save mount or save search that finds a save, with an error naming `ANYPS5_FREE_SPACE`. On Windows an empty value counts as unset, because `set ANYPS5_FREE_SPACE=` in `cmd` and `$env:ANYPS5_FREE_SPACE = ""` in PowerShell remove the variable. Existing saves are opened as before in both modes. Whether a console refuses a save the same way is not measured; see the [technical debt](../dev/debt/libSceSaveData.native.md) of `libSceSaveData.native`. + ### Host game mode Set `APS5_GAME_MODE=on` to ask the host for its game or performance mode for as long as the title runs. It is `off` by default, which leaves the host untouched: nothing is loaded and nothing is requested. @@ -369,6 +393,18 @@ Leave the variable unset to keep the explicit error. Any other value also stops Press F12 in the game window to save the next displayed frame as a PNG at the resolution of the game's display buffer, without the window's scaling, letterbox or [performance overlay](#performance-overlay). A BT.2100 PQ display buffer is saved converted to SDR, also while it is shown through [HDR output](#hdr-output). Files are named `-<YYYYMMDD-HHMMSS>.png` and written to an `anyps5-screenshots/` directory beside the output executable, which is created when needed; set `ANYPS5_SCREENSHOTS` to use another directory. The saved path is printed to stderr. Presses while the previous screenshot is still being written are merged into one. The key is the `Screenshot` action of the [input mapping](INPUT_MAPPING.md). A screenshot that cannot be written stops the game with the error. +### Host volume and mute + +F5 lowers, F6 raises and F8 mutes the host's output volume for the game window; the keys can be changed with `VolumeDown`, `VolumeUp` and `ToggleMute` in [the input mapping](INPUT_MAPPING.md). This is a control of the host, like the volume of a media player: it is not a console behaviour, the title does not see it, and its own volume settings are not changed. + +The volume goes from 0 to 100 in steps of 5 and starts at 100, or at `ANYPS5_VOLUME` (a whole number from 0 to 100). The output amplitude is the square of the volume as a fraction of 100, so 50 is a quarter of the amplitude. Mute is separate from the volume: unmuting brings the volume back, and a volume key while muted unmutes. A change of gain moves over 10 ms instead of jumping. Each press prints one line on stderr with the resulting level or mute; there is no on-screen indicator. + +At volume 100 and not muted the audio is passed to the host device unchanged, with no processing at all. The volume applies to what the title plays through `libSceAudioOut` and `libSceAudioOut2`, including what `libSceAudio3d` plays through them. The controller's own sound card and haptics, and the microphone, are not affected. + +Set `ANYPS5_MUTE_ON_FOCUS_LOSS=1` to mute the audio while the display window has no focus and restore it when the focus returns. `0` or unset leaves the audio alone. It does not change the mute set with the key: a window you muted stays muted when it regains focus. Only focus events count, so a window minimized without losing focus stays audible, and a window that opens without focus starts muted. An invalid value of either variable, including an empty one, stops the game with an error naming it. + +The keys work while the display window has focus. Not measured on a real audio device or on a console. + ### GPU selection The game runs on the first Vulkan 1.1 device with graphics and compute queues and swapchain presentation, preferring a discrete GPU over an integrated one. Set `ANYPS5_GPU` to a part of a device name, compared without regard to case, to run on another device; the names are printed at start-up in the `Physical device candidate` lines. When no usable device contains the text, the start fails and the error lists the device names. @@ -524,6 +560,12 @@ A line is the player number (the controller's slot: a controller that reconnects The panel uses the font and scale of the [performance overlay](#performance-overlay) and sits in the corner mirrored horizontally from `ANYPS5_OVERLAY_POS`, the top right by default, so it never covers that overlay. While the system on-screen keyboard is shown the panel is not drawn, and its 4 seconds keep running. Screenshots do not include it. While it is hidden, which is always so unless F9 or `ANYPS5_PAD_STATUS=1` shows it, nothing is drawn, no render pass or memory is allocated for it and the presented image is unchanged. What still runs is a lock and a clock read in each present and in each video-out loop pass, to see whether the panel is wanted. With `ANYPS5_PAD_STATUS` unset or 0 and no F9 press, no controller name is copied and no battery level is read for it; they are read on every loop pass with `ANYPS5_PAD_STATUS=1`, and while the panel is shown after F9. +### PSN-only dialogs + +Some system dialogs need PlayStation Network: the profile, the friend list, the store, the invitation dialog, the Facebook link and the authorized-apps dialog. AnyPS5 does not provide PlayStation Network, so these dialogs finish at once with the same answer as a cancel, and nothing is shown. The web browser dialog is not known to need PlayStation Network, so its notice only says that the system feature is not available. + +Set `ANYPS5_PSN_DIALOGS=show` to show a notice on the game's screen when one of these dialogs opens. The notice has one OK button and takes the controller until it is answered. It is not shown again within two seconds of the previous one, and it is not shown while another dialog or notice is showing. The game's result is the same either way. `silent`, an unset variable and an empty one show nothing. Any other value stops the game at its first such dialog with an error that names `ANYPS5_PSN_DIALOGS`. + ### Windows crash diagnostics When a register points at readable memory that starts with at least four printable ASCII characters, either as UTF-16LE or as single bytes, the crash report prints that text after the register memory dump, as `[r13] u"..."` for UTF-16LE or `[rdi] "..."` for single bytes. The text ends at a NUL, at the first character that is not printable ASCII, a tab, a line feed or a carriage return, after 512 characters or at the end of readable memory. Tabs, line breaks, quotes and backslashes are escaped, and `...` after the closing quote means that no NUL ended the text within those limits. diff --git a/tools/agc_test_split.py b/tools/agc_test_split.py new file mode 100644 index 0000000000..b6f0ec37cd --- /dev/null +++ b/tools/agc_test_split.py @@ -0,0 +1,916 @@ +import argparse +import re +import subprocess +import sys +import tempfile +from pathlib import Path + +LISTS = "core/libs/prx/libSceAgcDriver/CMakeLists.txt" +FRAGMENTS = "core/libs/prx/libSceAgcDriver/tests/cmake" +EXECUTION = "core/libs/prx/libSceAgcDriver/tests/execution" +INCLUDE = [ + "file(GLOB agcTestFragments CONFIGURE_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/tests/cmake/*.cmake)", + "list(SORT agcTestFragments)", + "foreach(agcTestFragment IN LISTS agcTestFragments)", + " include(${agcTestFragment})", + "endforeach()", +] + +OPEN = {"if": "endif", "foreach": "endforeach", "while": "endwhile", "function": "endfunction", "macro": "endmacro", "block": "endblock"} +BRANCH = {"elseif", "else"} +CALL = re.compile(r"[ \t]*([A-Za-z_][A-Za-z0-9_]*)[ \t]*\(") +UNIT = re.compile(r"[a-z][a-z0-9_]*_tests") +MENTION = re.compile(r"(?<![A-Za-z0-9_{])[a-z][a-z0-9_]*_tests(?![A-Za-z0-9_])") +VARIABLE = re.compile(r"\$\{([A-Za-z0-9_]+)\}") +IDENT = re.compile(r"[A-Za-z_][A-Za-z0-9_]*") +SPECIAL = re.compile(r'if\(agcTestName STREQUAL "([A-Za-z0-9_]+)"\)') +DEFINERS = {"add_executable", "add_test_executable", "add_library", "add_custom_target"} +SUBJECT_FIRST = {"target_link_libraries", "target_include_directories", "target_compile_definitions", "target_compile_options", + "target_sources", "target_link_options", "target_compile_features", "target_precompile_headers", + "configure_windows_unwind", "add_dependencies"} +CONTROL = {"if", "elseif", "else", "endif", "foreach", "endforeach", "while", "endwhile", "function", "endfunction", "macro", + "endmacro", "block", "endblock", "return", "break", "continue", "set", "unset", "list", "string", "file", "message", + "math", "option", "include", "get_filename_component", "add_custom_command", "add_subdirectory", "cmake_path", + "set_source_files_properties", "separate_arguments"} +SETTERS = {"set", "unset", "option", "list", "string", "math", "file", "get_filename_component", "get_target_property", + "get_test_property", "get_directory_property", "get_property", "cmake_path", "separate_arguments", "foreach"} +LIST_READERS = {"APPEND", "PREPEND", "INSERT", "REMOVE_ITEM", "REMOVE_AT", "REMOVE_DUPLICATES", "FILTER", "SORT", "REVERSE", + "TRANSFORM", "POP_BACK", "POP_FRONT", "GET", "LENGTH", "FIND", "JOIN"} +HELPERS = { + "agc_add_default_test": lambda target: (target, [target[:-6]]), + "agc_add_draw_pipeline_test": lambda stem: (stem + "_tests", [stem + "_draw_pipeline"]), + "agc_add_spirv_mode_tests": lambda target: (target, [target[:-6], target[:-6] + "_full", target[:-6] + "_none"]), +} +TEST_KEYWORDS = {"CONFIGURATIONS", "WORKING_DIRECTORY", "COMMAND_EXPAND_LISTS"} + + +class SplitError(Exception): + pass + + +class Command: + def __init__(self, name, arguments, first, last): + self.name = name + self.arguments = arguments + self.first = first + self.last = last + + +class Block: + def __init__(self, header): + self.header = header + self.branches = [(header, [])] + self.end = None + self.first = header.first + + @property + def last(self): + return self.end.last + + +def arguments_of(text, position, line): + arguments, depth, token = [], 0, None + while True: + if position >= len(text): + raise SplitError(f"line {line + 1}: unterminated command") + character = text[position] + if character == "\n": + line += 1 + if character == '"': + end = position + 1 + while text[end] != '"': + if text[end] == "\\": + end += 1 + if text[end] == "\n": + line += 1 + end += 1 + token = (token or "") + text[position + 1:end] + position = end + 1 + continue + bracket = re.match(r"\[(=*)\[", text[position:position + 32]) + if bracket and token is None: + close = text.index("]" + bracket[1] + "]", position) + value = text[position + len(bracket[0]):close] + line += value.count("\n") + arguments.append(value) + position = close + len(bracket[0]) + continue + if character == "#": + comment = re.match(r"#\[(=*)\[", text[position:position + 32]) + close = text.index("]" + comment[1] + "]", position) + len(comment[0]) if comment else text.find("\n", position) + line += text[position:close].count("\n") + position = close + continue + if character == "\\" and token is not None: + token += text[position:position + 2] + position += 2 + continue + if character in " \t\r\n()": + if token is not None: + arguments.append(token) + token = None + if character == "(": + depth += 1 + arguments.append("(") + elif character == ")": + if depth == 0: + return arguments, position + 1, line + depth -= 1 + arguments.append(")") + position += 1 + continue + token = (token or "") + character + position += 1 + + +def commands(text): + lines = text.split("\n") + offsets = [0] + for item in lines: + offsets.append(offsets[-1] + len(item) + 1) + found, index = [], 0 + while index < len(lines): + stripped = lines[index].strip() + if not stripped or stripped.startswith("#"): + index += 1 + continue + call = CALL.match(lines[index]) + if not call: + raise SplitError(f"line {index + 1}: not a command: {lines[index]}") + arguments, end, last = arguments_of(text, offsets[index] + call.end(), index) + rest = text[end:offsets[last + 1] - 1] if last + 1 < len(offsets) else text[end:] + if rest.strip() and not rest.strip().startswith("#"): + raise SplitError(f"line {last + 1}: more than one command on a line") + found.append(Command(call[1].lower(), arguments, index, last)) + index = last + 1 + return found + + +def tree(text): + root, stack = [], [] + for command in commands(text): + if command.name in OPEN: + block = Block(command) + (stack[-1].branches[-1][1] if stack else root).append(block) + stack.append(block) + elif command.name in BRANCH: + if not stack or stack[-1].header.name != "if": + raise SplitError(f"line {command.first + 1}: {command.name} outside if") + stack[-1].branches.append((command, [])) + elif command.name in OPEN.values(): + if not stack or OPEN[stack[-1].header.name] != command.name: + raise SplitError(f"line {command.first + 1}: unmatched {command.name}") + stack.pop().end = command + else: + (stack[-1].branches[-1][1] if stack else root).append(command) + if stack: + raise SplitError(f"line {stack[-1].first + 1}: unclosed {stack[-1].header.name}") + return root + + +def flatten(node): + if isinstance(node, Command): + yield node + return + for branch, children in node.branches: + yield branch + for child in children: + yield from flatten(child) + yield node.end + + +class Atom: + def __init__(self, node, conditions): + self.node = node + self.conditions = conditions + + def flat(self): + return flatten(self.node) + + +def atoms(nodes, conditions=()): + for node in nodes: + if isinstance(node, Block) and node.header.name == "if" and len(node.branches) == 1: + yield from atoms(node.branches[0][1], conditions + (node,)) + else: + yield Atom(node, conditions) + + +def enclosing_loop(lines, start): + depth = 0 + for index in range(start, len(lines)): + stripped = lines[index].strip() + if re.match(r"foreach\s*\(", stripped): + depth += 1 + elif re.match(r"endforeach\s*\(", stripped): + depth -= 1 + if depth == 0: + return start, index, len(lines[start]) - len(lines[start].lstrip()) + raise SplitError(f"line {start + 1}: unterminated loop") + + +def find_loop(lines, predicate, what): + starts = [index for index, line in enumerate(lines) if predicate(index, line.strip())] + if len(starts) > 1: + raise SplitError(f"more than one {what}") + return enclosing_loop(lines, starts[0]) if starts else None + + +def dedent(lines, amount): + return [line[amount:] if line.startswith(" " * amount) else line for line in lines] + + +def loop_list(header): + return header[header.index("ITEMS") + len("ITEMS"):header.rindex(")")].split() + + +def default_tests(lines): + found = find_loop(lines, lambda index, line: line.startswith("foreach(agcTest IN ITEMS ") and "${agcExecutionTests}" in line, + "default-test loop") + if found is None: + raise SplitError("the default-test loop over ${agcExecutionTests} is missing") + start, end, indent = found + body = lines[start + 1:end] + skip = [] + if body and body[0].strip().startswith("if(agcTest STREQUAL"): + close = next(index for index, line in enumerate(body) if line.strip() == "endif()") + skip, body = body[:close + 1], body[close + 1:] + kept, tweaks, index = [], [], 0 + while index < len(body): + special = SPECIAL.fullmatch(body[index].strip()) + if not special: + kept.append(body[index]) + index += 1 + continue + depth = len(body[index]) - len(body[index].lstrip()) + close = next(position for position in range(index, len(body)) + if body[position].strip() == "endif()" and len(body[position]) - len(body[position].lstrip()) == depth) + inner = body[index + 1:close] + if not inner or not inner[0].strip().startswith("set_tests_properties(${agcTestName} "): + raise SplitError(f"line {start + index + 2}: a default-test case does more than set properties") + tweaks += [" " * indent + line.strip().replace("${agcTestName}", special[1]) if position == 0 else line[8:] + for position, line in enumerate(inner)] + index = close + 1 + pad = " " * indent + lines[start:end + 1] = [f"{pad}agc_add_default_test({name})" for name in loop_list(lines[start]) + if name != "${agcExecutionTests}"] + tweaks + function = ["function(agc_add_default_test agcTest)"] + dedent(kept, indent) + ["endfunction()"] + execution = ["if(BUILD_TESTING)", " foreach(agcTest IN LISTS agcExecutionTests)"] + \ + [" " * 8 + line[indent + 4:] for line in skip] + [" agc_add_default_test(${agcTest})", " endforeach()", "endif()"] + return function, execution + + +def draw_pipeline_tests(lines): + found = find_loop(lines, lambda index, line: line == "foreach(agcTestName IN LISTS agcDrawPipelineTests)", "draw pipeline loop") + if found is None: + return None + start, end, indent = found + listing = lines[start - 1].strip() + if not listing.startswith("set(agcDrawPipelineTests "): + raise SplitError("agcDrawPipelineTests is not set right before its loop") + names = listing[len("set(agcDrawPipelineTests "):-1].split() + body = lines[start + 1:end] + lines[start - 1:end + 1] = [f"{' ' * indent}agc_add_draw_pipeline_test({name})" for name in names] + return ["function(agc_add_draw_pipeline_test agcTestName)"] + dedent(body, indent) + ["endfunction()"] + + +def spirv_mode_tests(lines): + found = find_loop(lines, lambda index, line: line.startswith("foreach(agcTest IN ITEMS ") and index + 1 < len(lines) + and lines[index + 1].strip() == "if(NOT TARGET ${agcTest})", "SPIR-V mode loop") + if found is None: + return None + start, end, indent = found + body = lines[start + 1:end] + if body[1].strip() != "continue()": + raise SplitError("the SPIR-V mode loop no longer starts with its target check") + body[1] = body[1].replace("continue()", "return()") + lines[start:end + 1] = [f"{' ' * indent}agc_add_spirv_mode_tests({name})" for name in loop_list(lines[start])] + return ["function(agc_add_spirv_mode_tests agcTest)"] + dedent(body, indent) + ["endfunction()"] + + +def refactor(text): + if "function(agc_add_default_test " in text: + return text + lines = text.split("\n") + function, execution = default_tests(lines) + functions = [function] + for convert in (draw_pipeline_tests, spirv_mode_tests): + function = convert(lines) + if function: + functions.append(function) + glob = [index for index, line in enumerate(lines) if line.startswith("foreach(agcExecutionTestSource IN LISTS agcExecutionTestSources)")] + if len(glob) != 1: + raise SplitError("the execution-test loop is missing") + close = next(index for index in range(glob[0], len(lines)) if lines[index] == "endforeach()") + added = [""] + for function in functions: + added += function + [""] + lines[close + 1:close + 1] = added + execution + [""] + return "\n".join(lines) + + +class Facts: + def __init__(self): + self.targets = set() + self.tests = {} + self.dynamic_tests = [] + self.subject_targets = set() + self.subject_tests = set() + self.test_patterns = set() + self.dynamic = set() + self.defines = set() + self.accumulates = set() + self.uses = set() + self.loop = set() + self.mentions = set() + self.calls = set() + self.functions = set() + self.reads_all_tests = False + self.creates_defaults = False + self.dynamic_targets = False + + +def until(arguments, keywords): + for index, argument in enumerate(arguments): + if argument in keywords: + return arguments[:index] + return arguments + + +def literal(name): + return "${" not in name and "$<" not in name + + +def subject(facts, names, kind): + for name in names: + if literal(name): + (facts.subject_targets if kind == "target" else facts.subject_tests).add(name) + else: + facts.dynamic.update(VARIABLE.findall(name)) + if kind == "test": + facts.test_patterns.add(name) + + +def loop_items(atom): + items = {} + for command in atom.flat(): + arguments = command.arguments + if command.name != "foreach" or not arguments: + continue + rest = arguments[1:] + if rest[:1] == ["IN"]: + if rest[1:2] != ["ITEMS"]: + continue + rest = rest[2:] + elif rest[:1] == ["RANGE"]: + bounds = rest[1:] + if not all(bound.isdigit() for bound in bounds) or not 1 <= len(bounds) <= 3: + continue + numbers = [int(bound) for bound in bounds] + start, stop = (0, numbers[0]) if len(numbers) == 1 else (numbers[0], numbers[1]) + rest = [str(value) for value in range(start, stop + 1, numbers[2] if len(numbers) == 3 else 1)] + if all(literal(item) for item in rest): + items[arguments[0]] = rest + return items + + +def expand(name, items): + names = [name] + for variable in set(VARIABLE.findall(name)): + if variable not in items: + return [] + names = [candidate.replace("${" + variable + "}", value) for candidate in names for value in items[variable]] + return names + + +def facts_of(atom): + facts = Facts() + if isinstance(atom.node, Block) and atom.node.header.name in ("function", "macro"): + facts.functions.add(atom.node.header.arguments[0].lower()) + return facts + for command in atom.flat(): + arguments, name = command.arguments, command.name + facts.calls.add(name) + for argument in arguments: + facts.uses.update(VARIABLE.findall(argument)) + if "$<" not in argument: + facts.mentions.update(MENTION.findall(argument)) + if name in ("if", "elseif", "while"): + facts.uses.update(argument for argument in arguments if IDENT.fullmatch(argument)) + if name == "foreach" and arguments: + facts.loop.add(arguments[0]) + if "LISTS" in arguments: + facts.uses.update(argument for argument in arguments[arguments.index("LISTS") + 1:] + if IDENT.fullmatch(argument) and argument != "ITEMS") + for index, argument in enumerate(arguments[1:-1], 1): + if argument == "IN_LIST": + facts.uses.add(arguments[index + 1]) + if name in ("list", "string") and len(arguments) > 1 and arguments[0] in LIST_READERS: + facts.uses.add(arguments[1]) + facts.accumulates.add(arguments[1]) + if name in SETTERS: + for index, argument in enumerate(arguments): + if IDENT.fullmatch(argument) and not (name == "foreach" and index): + facts.defines.add(argument) + if name in ("set", "unset", "option", "foreach"): + break + if name in HELPERS and arguments: + if literal(arguments[0]): + executable, tests = HELPERS[name](arguments[0]) + facts.tests.update({test: executable for test in tests}) + if name != "agc_add_draw_pipeline_test": + facts.subject_targets.add(arguments[0]) + else: + facts.dynamic.update(VARIABLE.findall(arguments[0])) + facts.dynamic_tests.append((arguments[0], None)) + facts.creates_defaults = True + if name in DEFINERS and arguments: + if literal(arguments[0]): + facts.targets.add(arguments[0]) + else: + facts.dynamic.update(VARIABLE.findall(arguments[0])) + facts.dynamic_targets = True + elif name == "add_test" and arguments: + if arguments[0] == "NAME": + test = arguments[1] + rest = until(arguments[2:], TEST_KEYWORDS) + executable = rest[rest.index("COMMAND") + 1] if "COMMAND" in rest[:-1] else None + else: + test, executable = arguments[0], arguments[1] if len(arguments) > 1 else None + if literal(test): + facts.tests[test] = executable + else: + facts.dynamic_tests.append((test, executable)) + elif name in SUBJECT_FIRST and arguments: + subject(facts, arguments[:1], "target") + elif name == "add_asan_test_options" and arguments: + subject(facts, arguments[:1], "test") + elif name == "set_target_properties": + subject(facts, until(arguments, {"PROPERTIES"}), "target") + elif name == "set_tests_properties": + subject(facts, until(arguments, {"PROPERTIES", "DIRECTORY"}), "test") + elif name == "set_property" and len(arguments) > 1 and arguments[0] in ("TARGET", "TEST"): + subject(facts, until(arguments[1:], {"PROPERTY", "APPEND", "APPEND_STRING", "DIRECTORY"}), arguments[0].lower()) + elif name in ("get_target_property", "get_test_property") and len(arguments) > 1: + subject(facts, arguments[1:2], "target" if name == "get_target_property" else "test") + elif name == "get_directory_property" and "TESTS" in arguments: + facts.reads_all_tests = True + elif name not in CONTROL and name not in HELPERS and arguments and UNIT.fullmatch(arguments[0]): + subject(facts, arguments[:1], "target") + items = loop_items(atom) + for test, executable in facts.dynamic_tests: + for name in expand(test, items): + facts.tests.setdefault(name, executable) + facts.test_patterns = {prefix for prefix in (re.split(r"\$[{<]", name)[0] for name in + facts.test_patterns - {test for test, _executable in facts.dynamic_tests}) if prefix} + return facts + + +def union_find(size): + parent = list(range(size)) + + def find(index): + while parent[index] != index: + parent[index] = parent[parent[index]] + index = parent[index] + return index + + def join(first, second): + parent[find(first)] = find(second) + + return find, join + + +def reads(facts): + return (facts.uses - (facts.defines - facts.accumulates)) | facts.accumulates + + +class Plan: + def __init__(self, text, execution=()): + self.lines = text.split("\n") + self.roots = tree(text) + self.atoms = list(atoms(self.roots)) + self.facts = [facts_of(atom) for atom in self.atoms] + self.known = {name for facts in self.facts for name in facts.targets | facts.subject_targets | set(facts.tests.values()) + if name and UNIT.fullmatch(name)} | set(execution) + self.external = self.known - {name for facts in self.facts for name in facts.targets} + self.test_units = {test: self.unit_of_test(test, executable) for facts in self.facts for test, executable in facts.tests.items()} + self.units = self.assign() + self.include = self.place() + + def unit_of_test_name(self, test): + stems = [unit for unit in self.known if test == unit[:-6] or test.startswith(unit[:-6] + "_")] + return max(stems, key=len) if stems else None + + def unit_of_test(self, test, executable): + return executable if executable and literal(executable) and UNIT.fullmatch(executable) else self.unit_of_test_name(test) + + def candidates(self, index, test_owner): + facts = self.facts[index] + owners, unknown = set(), False + for target in facts.targets | facts.subject_targets: + if UNIT.fullmatch(target): + owners.add(target) + else: + unknown = True + for test, executable in facts.tests.items(): + owner = self.unit_of_test(test, executable) + if owner: + owners.add(owner) + for test in facts.subject_tests - set(facts.tests): + if test in test_owner: + owners.add(test_owner[test]) + elif test + "_tests" in self.external: + owners.add(test + "_tests") + else: + unknown = True + for prefix in facts.test_patterns: + matched = {unit for test, unit in self.test_units.items() if test.startswith(prefix)} + if len(matched) == 1 and None not in matched: + owners |= matched + elif matched: + unknown = True + if facts.dynamic - facts.defines or facts.reads_all_tests or facts.creates_defaults or facts.dynamic_targets: + unknown = True + if facts.dynamic or facts.dynamic_tests: + for _test, executable in facts.dynamic_tests: + if executable and literal(executable) and UNIT.fullmatch(executable): + owners.add(executable) + if facts.dynamic and len(facts.mentions | owners) > 1: + unknown = True + owners |= facts.mentions + return owners, unknown + + def write_groups(self): + defining = {} + for index, facts in enumerate(self.facts): + for name in facts.defines: + defining.setdefault(name, []).append(index) + mutable = {name for name, indices in defining.items() if len(indices) > 1} + mutable |= set().union(*(facts.accumulates for facts in self.facts)) + find, join = union_find(len(self.atoms)) + for index, facts in enumerate(self.facts): + for name in reads(facts) & mutable & facts.defines: + for earlier in reversed([other for other in defining[name] if other < index]): + join(earlier, index) + if name in self.facts[earlier].defines - self.facts[earlier].accumulates: + break + return [find(index) for index in range(len(self.atoms))] + + def variable_components(self, free): + defining = {} + find, join = union_find(len(self.atoms)) + for index, facts in enumerate(self.facts): + for name in reads(facts): + for earlier in reversed(defining.get(name, [])): + if free[earlier] or free[index]: + join(earlier, index) + if name in self.facts[earlier].defines - self.facts[earlier].accumulates: + break + for name in facts.defines - facts.loop: + defining.setdefault(name, []).append(index) + components = {} + for index in range(len(self.atoms)): + components.setdefault(find(index), []).append(index) + return [indices for indices in components.values() if any(free[index] for index in indices)] + + def assign(self): + group = self.write_groups() + members = {} + for index in range(len(self.atoms)): + members.setdefault(group[index], []).append(index) + test_owner, pinned = {}, set() + while True: + units, unknowns = [], [] + for index in range(len(self.atoms)): + owners, unknown = self.candidates(index, test_owner) + units.append(owners) + unknowns.append(unknown or group[index] in pinned) + fresh_pinned = set(pinned) + for root, indices in members.items(): + if len(indices) > 1 and any(unknowns[index] for index in indices) and any(units[index] for index in indices): + fresh_pinned.add(root) + result = [] + for index in range(len(self.atoms)): + if unknowns[index] or group[index] in fresh_pinned: + result.append(None) + else: + result.append(set().union(*(units[other] for other in members[group[index]])) or None) + first = min((index for index in range(len(self.atoms)) if result[index]), default=len(self.atoms)) + free = [not result[index] and not unknowns[index] and not units[index] and index > first + and group[index] not in fresh_pinned for index in range(len(self.atoms))] + for indices in self.variable_components(free): + if any(not free[index] and not result[index] for index in indices): + continue + owners = {frozenset(result[index]) for index in indices if result[index]} + if len(owners) == 1: + for index in indices: + if free[index]: + result[index] = set(next(iter(owners))) + fresh = {} + for index, owners in enumerate(result): + if owners and len(owners) == 1: + for test in self.facts[index].tests: + fresh[test] = next(iter(owners)) + if fresh == test_owner and fresh_pinned == pinned: + break + test_owner, pinned = fresh, fresh_pinned + names = sorted({name for owners in result if owners for name in owners}) + position = {name: index for index, name in enumerate(names)} + find, join = union_find(len(names)) + sizes = {} + for index, owners in enumerate(result): + if not owners: + continue + ordered = sorted(owners) + for name in ordered: + join(position[name], position[ordered[0]]) + sizes[name] = sizes.get(name, 0) + self.atoms[index].node.last - self.atoms[index].node.first + 1 + largest = {} + for name in names: + root = find(position[name]) + if root not in largest or (sizes[name], name) > (sizes[largest[root]], largest[root]): + largest[root] = name + return [largest[find(position[next(iter(owners))])] if owners else None for owners in result] + + def place(self): + moved = [index for index, unit in enumerate(self.units) if unit] + if not moved: + raise SplitError(f"{LISTS} registers no tests to move") + + def union(field): + return set().union(*(getattr(self.facts[index], field) for index in moved)) + + defined, used, targets, calls = union("defines"), union("uses"), union("targets"), union("calls") + tests = set().union(*(set(self.facts[index].tests) for index in moved)) + everywhere = set().union(*(facts.targets for facts in self.facts)) + external = {name for name in union("subject_targets") if UNIT.fullmatch(name) and name not in everywhere} + needed, depends = [], [] + for index, facts in enumerate(self.facts): + if self.units[index]: + continue + if ((facts.defines - facts.loop) & used or (facts.dynamic_targets and external) or facts.creates_defaults + or facts.functions & calls): + needed.append(index) + if ((facts.uses - facts.defines) & defined or facts.subject_targets & targets or facts.subject_tests & tests + or facts.mentions & targets or facts.reads_all_tests + or any(test.startswith(prefix) for prefix in facts.test_patterns for test in tests)): + depends.append(index) + top = [next(position for position, node in enumerate(self.roots) if node.first <= atom.node.first <= node.last) + for atom in self.atoms] + low = top[max(needed)] + 1 if needed else 0 + high = top[min(depends)] if depends else len(self.roots) + if low > high: + raise SplitError(f"no single place to include the fragments: line {self.atoms[max(needed)].node.first + 1} must come " + f"before them and line {self.atoms[min(depends)].node.first + 1} after them") + return max(low, min(high, max(top[index] for index in moved) + 1)) + + +def leading(lines, first): + while first > 0 and lines[first - 1].lstrip().startswith("#"): + first -= 1 + return first + + +def opener(line): + call = CALL.match(line) + return bool(call) and (call[1].lower() in OPEN or call[1].lower() in BRANCH) + + +def closer(line): + call = CALL.match(line) + return bool(call) and (call[1].lower() in OPEN.values() or call[1].lower() in BRANCH) + + +def wrappers(nodes): + for node in nodes: + if isinstance(node, Block): + for _branch, children in node.branches: + yield from wrappers(children) + yield node + + +def fragment_text(lines, members): + out, stack = [], [] + for atom in members: + conditions = list(atom.conditions) + common = 0 + while common < min(len(stack), len(conditions)) and stack[common] is conditions[common]: + common += 1 + while len(stack) > common: + block = stack.pop() + out.extend(lines[block.end.first:block.end.last + 1]) + first = leading(lines, atom.node.first) + separated = first > 0 and not lines[first - 1].strip() + for block in conditions[common:]: + if out and not stack and out[-1].strip(): + out.append("") + out.extend(lines[block.header.first:block.header.last + 1]) + stack.append(block) + if out and separated and out[-1].strip() and not opener(out[-1]): + out.append("") + out.extend(line for line in lines[first:atom.node.last + 1] if not line.lstrip().startswith("#")) + while stack: + block = stack.pop() + out.extend(lines[block.end.first:block.end.last + 1]) + return "\n".join(out) + "\n" + + +def split_text(text, execution=()): + plan = Plan(text, execution) + lines = plan.lines + units = {} + for atom, unit in zip(plan.atoms, plan.units): + if unit: + units.setdefault(unit, []).append(atom) + deleted = set() + for members in units.values(): + for atom in members: + deleted.update(range(leading(lines, atom.node.first), atom.node.last + 1)) + for block in wrappers(plan.roots): + if block.header.name != "if" or len(block.branches) != 1: + continue + body = range(block.header.last + 1, block.end.first) + if all(index in deleted or not lines[index].strip() or lines[index].lstrip().startswith("#") for index in body): + deleted.update(range(leading(lines, block.header.first), block.end.last + 1)) + at = leading(lines, plan.roots[plan.include].first) if plan.include < len(plan.roots) else len(lines) + kept = [] + for index, line in enumerate(lines): + if index == at: + kept.extend([""] + INCLUDE + [""]) + if index not in deleted: + kept.append(line) + if at >= len(lines): + kept.extend([""] + INCLUDE) + residual = [] + for line in kept: + if not line.strip() and (not residual or not residual[-1].strip() or opener(residual[-1])): + continue + if closer(line) and residual and not residual[-1].strip(): + residual.pop() + residual.append(line) + while residual and not residual[-1].strip(): + residual.pop() + return "\n".join(residual) + "\n", {name: fragment_text(lines, members) for name, members in units.items()} + + +def migrated(text, execution=()): + return split_text(refactor(text), execution) + + +def execution_target(stem): + return "agc_driver_" + re.sub(r"([a-z0-9])([A-Z])", r"\1_\2", stem).lower() + "_tests" + + +def execution_targets(root): + return sorted(execution_target(path.stem) for path in (root / EXECUTION).glob("*.cpp")) + + +def known_targets(root): + known = set(execution_targets(root)) | {path.stem for path in (root / FRAGMENTS).glob("*.cmake")} + revisions = ["HEAD"] + for head in ("REBASE_HEAD", "CHERRY_PICK_HEAD", "MERGE_HEAD"): + if git(root, "rev-parse", "-q", "--verify", head, check=False).strip(): + revisions += [head, head + "^", git(root, "merge-base", "HEAD", head, check=False).strip()] + for revision in filter(None, revisions): + listing = git(root, "ls-tree", "--name-only", f"{revision}:{EXECUTION}", check=False) + known |= {execution_target(Path(name).stem) for name in listing.splitlines() if name.endswith(".cpp")} + return sorted(known) + + +def is_split(text): + return INCLUDE[0] in text + + +def git(root, *args, check=True): + return subprocess.run(["git", *args], cwd=root, capture_output=True, text=True, encoding="utf-8", errors="replace", + check=check).stdout + + +def write_lf(path, text): + path.parent.mkdir(parents=True, exist_ok=True) + with open(path, "w", encoding="utf-8", newline="\n") as file: + file.write(text) + + +def fragment_path(name): + return f"{FRAGMENTS}/{name}.cmake" + + +def command_refactor(root): + text = (root / LISTS).read_text(encoding="utf-8") + changed = refactor(text) + if changed == text: + sys.exit(f"{LISTS} already registers its default tests through agc_add_default_test") + write_lf(root / LISTS, changed) + print(LISTS) + + +def command_split(root): + text = (root / LISTS).read_text(encoding="utf-8") + if is_split(text): + sys.exit(f"{LISTS} already includes {FRAGMENTS}") + lists, fragments = migrated(text, execution_targets(root)) + existing = sorted(set(fragments) & {path.stem for path in (root / FRAGMENTS).glob("*.cmake")}) + if existing: + sys.exit(f"{FRAGMENTS} already has {', '.join(name + '.cmake' for name in existing)}") + for name, body in fragments.items(): + write_lf(root / fragment_path(name), body) + write_lf(root / LISTS, lists) + print(f"{len(fragments)} fragments in {FRAGMENTS}, {len(lists.splitlines())} lines left in {LISTS}") + + +def merge(base, ours, theirs, label): + if base == theirs: + return ours, False + if base == ours: + return theirs, False + with tempfile.TemporaryDirectory() as directory: + paths = [] + for name, text in (("ours", ours), ("base", base), ("theirs", theirs)): + write_lf(Path(directory) / name, text) + paths.append(str(Path(directory) / name)) + result = subprocess.run(["git", "merge-file", "-p", "-L", f"{label} (split)", "-L", "before the split", + "-L", f"{label} (change)", *paths], capture_output=True, text=True, encoding="utf-8") + if not 0 <= result.returncode < 128: + raise SplitError(f"git merge-file failed on {label}") + return result.stdout, result.returncode > 0 + + +def apply_change(base, change, lists, read, execution=()): + base_lists, base_fragments = migrated(base, execution) + change_lists, change_fragments = migrated(change, execution) + written, conflicted = {}, [] + merged, clash = merge(base_lists, lists, change_lists, LISTS) + if merged != lists: + written[LISTS] = merged + if clash: + conflicted.append(LISTS) + for name in sorted(set(base_fragments) | set(change_fragments)): + before, after = base_fragments.get(name, ""), change_fragments.get(name, "") + if before == after: + continue + path = fragment_path(name) + merged, clash = merge(before, read(path), after, path) + written[path] = merged + if clash: + conflicted.append(path) + return written, conflicted + + +def command_resolve(root): + stages = {} + for line in git(root, "ls-files", "-u", "--", LISTS).splitlines(): + meta, _ = line.split("\t", 1) + _, sha, stage = meta.split() + stages[stage] = sha + if not {"1", "2", "3"} <= set(stages): + sys.exit(f"{LISTS} is not in a three-way conflict") + base, ours, theirs = (git(root, "cat-file", "-p", stages[stage]) for stage in "123") + if is_split(base) or is_split(ours) == is_split(theirs): + sys.exit(f"{LISTS}: the conflict is not between a change made before the split and the split; resolve it by hand") + lists, change = (ours, theirs) if is_split(ours) else (theirs, ours) + + def read(path): + file = root / path + return file.read_text(encoding="utf-8") if file.exists() else "" + + try: + written, conflicted = apply_change(base, change, lists, read, known_targets(root)) + except SplitError as error: + sys.exit(f"{LISTS}: {error}") + written.setdefault(LISTS, lists) + for path, text in written.items(): + if text.strip(): + write_lf(root / path, text) + elif (root / path).exists(): + (root / path).unlink() + clean = [path for path in written if path not in conflicted] + if clean: + git(root, "add", "-A", "--", *clean) + print("\n".join(sorted(written))) + if conflicted: + sys.exit("resolve the conflict markers in " + ", ".join(conflicted) + ", then git add them") + + +def main(argv=None): + for stream in (sys.stdout, sys.stderr): + if hasattr(stream, "reconfigure"): + stream.reconfigure(encoding="utf-8") + parser = argparse.ArgumentParser(description=f"Move the AGC test registrations of {LISTS} into one fragment per test executable, " + "and move registrations of a change made before the split") + parser.add_argument("command", choices=("refactor", "split", "resolve"), + help="refactor: register default, draw-pipeline and SPIR-V mode tests through functions; " + f"split: refactor, then move the registrations into {FRAGMENTS}/; " + f"resolve: during a rebase or merge stopped on {LISTS}, apply the change's registrations to the " + "fragments and stage them") + args = parser.parse_args(argv) + root = Path(git(Path.cwd(), "rev-parse", "--show-toplevel").strip()) + try: + {"refactor": command_refactor, "split": command_split, "resolve": command_resolve}[args.command](root) + except SplitError as error: + sys.exit(f"{LISTS}: {error}") + + +if __name__ == "__main__": + main() diff --git a/tools/annotate_module.py b/tools/annotate_module.py index 1ed6c4c37b..7a75328bbb 100644 --- a/tools/annotate_module.py +++ b/tools/annotate_module.py @@ -25,6 +25,7 @@ DT_JMPREL = 23 DT_PLTRELSZ = 2 DT_PLTREL = 20 DT_STRSZ = 10 +DT_SYMENT = 11 DT_RELAENT = 9 DT_REL = 17 DT_RELA_KIND = 7 @@ -35,7 +36,7 @@ RELA_SIZE = 24 R_X86_64_NONE = 0 LINE_ADDRESS = re.compile(r"^\s*([0-9a-f]+):") -STUB = re.compile(r"^\s*([0-9a-f]+):\s+(?:\w+\s+)?jmpq?\s+\*(?:-?0x[0-9a-f]+)?\(%rip\)\s+# 0x([0-9a-f]+)") +STUB = re.compile(r"^\s*([0-9a-f]+):\s+(?:\w+\s+)*jmpq?\s+\*(?:-?0x[0-9a-f]+)?\(%(?:rip|eip)\)\s+# 0x([0-9a-f]+)") BRANCH = re.compile(r"\b(?:call|jmp)q?\s+0x([0-9a-f]+)") REFERENCE = re.compile(r"# 0x([0-9a-f]+)") @@ -57,6 +58,8 @@ class Module: if self.strtab + self.strsz > len(self.data): raise ModuleError("the string table of DT_STRSZ %#x extends past the end of the file" % self.strsz) self.address(self.tags[DT_STRTAB], self.strsz) + if self.require_tag(DT_SYMENT, "DT_SYMENT") != SYMBOL_SIZE: + raise ModuleError("DT_SYMENT is not %d" % SYMBOL_SIZE) self.symbol_count = self.count_symbols() self.address(self.tags[DT_SYMTAB], self.symbol_count * SYMBOL_SIZE) self.check_relocation_tags() @@ -139,14 +142,14 @@ class Module: def symbol(self, index): if index >= self.symbol_count: raise ModuleError("symbol index %d is outside the %d symbols of the module" % (index, self.symbol_count)) - name, info, _, shndx, value, _ = self.unpack("<IBBHQQ", self.symtab + index * SYMBOL_SIZE) + name, info, other, shndx, value, _ = self.unpack("<IBBHQQ", self.symtab + index * SYMBOL_SIZE) if name >= self.strsz: raise ModuleError("symbol %d has a name offset %#x outside DT_STRSZ %#x" % (index, name, self.strsz)) start = self.strtab + name end = self.data.find(b"\0", start, self.strtab + self.strsz) if end < 0: raise ModuleError("symbol %d has a name unterminated within DT_STRSZ %#x" % (index, self.strsz)) - return self.data[start:end].decode("utf-8", errors="replace"), shndx, value, info & 0xF + return self.data[start:end].decode("utf-8", errors="replace"), shndx, value, info & 0xF, info >> 4, other & 3 def check_relocation_tags(self): if DT_REL in self.tags: @@ -186,8 +189,8 @@ class Module: found = {} thread_local = {} for index in range(1, self.symbol_count): - name, shndx, value, kind = self.symbol(index) - if shndx == 0 or not name: + name, shndx, value, kind, binding, visibility = self.symbol(index) + if shndx == 0 or not name or binding == 0 or visibility in (1, 2): continue (thread_local if kind == STT_TLS else found).setdefault(value, []).append(name) return found, thread_local @@ -195,12 +198,12 @@ class Module: def code_segments(self): segments = [] for vaddr, offset, size, flags in sorted(self.loads): - if flags & PF_X: + if flags & PF_X and size: if offset + size > len(self.data): raise ModuleError("the executable PT_LOAD segment at %#x extends past the end of the file" % vaddr) segments.append((vaddr, self.data[offset:offset + size])) if not segments: - raise ModuleError("no executable PT_LOAD segment") + raise ModuleError("no executable PT_LOAD segment with file-backed data") return segments @@ -243,12 +246,23 @@ def disassemble(code, vaddr): return result.stdout.splitlines() +def referenced_address(line): + if "%fs:" in line or "%gs:" in line: + return None + reference = REFERENCE.search(line) + if reference is None: + return None + address = int(reference.group(1), 16) + return address & 0xFFFFFFFF if "(%eip)" in line else address + + def find_stubs(listing, slots, namer): stubs = {} for line in listing: match = STUB.match(line) - if match and int(match.group(2), 16) in slots: - stubs[int(match.group(1), 16)] = namer.resolve(slots[int(match.group(2), 16)]) + target = referenced_address(line) + if match and target in slots: + stubs[int(match.group(1), 16)] = namer.resolve(slots[target]) return stubs @@ -257,9 +271,9 @@ def line_note(line, slots, stubs, namer): branch = BRANCH.search(line) if branch and int(branch.group(1), 16) in stubs: note = " ; -> " + stubs[int(branch.group(1), 16)] - reference = REFERENCE.search(line) - if reference and int(reference.group(1), 16) in slots: - note = " ; GOT " + namer.resolve(slots[int(reference.group(1), 16)]) + reference = referenced_address(line) + if reference in slots: + note = " ; GOT " + namer.resolve(slots[reference]) return note diff --git a/tools/audit_dump.py b/tools/audit_dump.py index 0d2414e620..c734c54650 100644 --- a/tools/audit_dump.py +++ b/tools/audit_dump.py @@ -1,4 +1,5 @@ import argparse +import os import shutil import subprocess import sys @@ -72,7 +73,7 @@ def convert(relinker, source, output, extra, windows): for relative in extra: command += ["--module-dir", relative] command += [str(source / "eboot.elf"), str(output)] - return subprocess.run(command, capture_output=True, text=True) + return subprocess.run(command, capture_output=True, text=True, encoding="utf-8", errors="replace") def comparison_path(path, links=frozenset()): @@ -143,6 +144,15 @@ def main(argv=None): parser.error(f"{generated}: cannot check work directory against the input dump: {error}") if dump_path.is_relative_to(generated_path) or generated_path.is_relative_to(dump_path): parser.error(f"{generated}: work directory overlaps the input dump") + for input_path in (Path(args.relinker), *(Path(library) for library in args.libs)): + try: + resolved = comparison_path(input_path) + except (OSError, RuntimeError) as error: + parser.error(f"{input_path}: cannot check work directory against input: {error}") + supplied = Path(os.path.abspath(input_path)) + generated_spelling = Path(os.path.abspath(generated)) + if supplied.is_relative_to(generated_spelling) or resolved.is_relative_to(generated_path): + parser.error(f"{generated}: work directory contains input {input_path}") for generated in (source, output): try: if generated.is_symlink(): @@ -155,7 +165,11 @@ def main(argv=None): if generated.exists() or generated.is_symlink(): print(f"FAIL: cannot empty {generated}: it still exists", file=sys.stderr) return 2 - output.mkdir(parents=True, exist_ok=True) + try: + output.mkdir(parents=True, exist_ok=True) + except OSError as error: + print(f"FAIL: cannot create {output}: {error}", file=sys.stderr) + return 2 try: module_directories, extra = prepare(dump, source) except (unwrap_self.Refused, OSError) as error: diff --git a/tools/audit_nid_names.py b/tools/audit_nid_names.py new file mode 100644 index 0000000000..885395433a --- /dev/null +++ b/tools/audit_nid_names.py @@ -0,0 +1,29 @@ +import argparse +import json +import sys +from pathlib import Path + +from nid_names import compute_nid +from stubgen import parse_db + + +def main(argv=None): + for stream in (sys.stdout, sys.stderr): + if hasattr(stream, "reconfigure"): + stream.reconfigure(encoding="utf-8", errors="backslashreplace") + parser = argparse.ArgumentParser(description="Audit the hash consistency of a local NID/name database using the existing stub generator's first-record policy") + parser.add_argument("database", type=Path) + args = parser.parse_args(argv) + try: + database = parse_db(args.database) + entries = [{"nid": nid, "name": name, "computed_nid": compute_nid(name), "matches": nid == compute_nid(name)} + for nid, name in sorted(database.items())] + except (OSError, ValueError) as error: + parser.error(str(error)) + mismatches = sum(not item["matches"] for item in entries) + print(json.dumps({"entries": entries, "matching": len(entries) - mismatches, "mismatching": mismatches}, ensure_ascii=False, indent=2)) + return int(mismatches != 0) + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tools/build_changed_guest_tests.py b/tools/build_changed_guest_tests.py index 4dad3ec1ad..451cefa113 100644 --- a/tools/build_changed_guest_tests.py +++ b/tools/build_changed_guest_tests.py @@ -1,12 +1,13 @@ import argparse import json from pathlib import Path -import re import subprocess import sys +import tempfile sys.path.insert(0, str(Path(__file__).resolve().parent)) import build_mingw_host_only_tests as host_only +from select_tests import chunks BROAD_CHANGES = { "CMakeLists.txt", @@ -79,7 +80,7 @@ def target_artifact_names(target): names.add(name) names.add(target.get("name", "")) names.discard("") - return {name.casefold(): name for name in names} + return {name.casefold(): target["name"] for name in names} def test_owner(command, targets_by_name): @@ -98,26 +99,28 @@ def ctest_resolutions(build_dir, targets_by_name): capture_output=True, text=True, check=True) document = json.loads(result.stdout) resolutions = {} - for test in document.get("tests", []): + for index, test in enumerate(document.get("tests", []), 1): command = [str(part) for part in test.get("command", [])] owner = test_owner(command, targets_by_name) if owner is not None: - resolutions[test["name"]] = owner + resolutions[test["name"]] = (owner, index) return resolutions def run(build_dir, selected, targets_by_name): subprocess.run(["cmake", "--build", str(build_dir), "--parallel", "3", "--target", "libs"], check=True) if selected: - subprocess.run(["cmake", "--build", str(build_dir), "--parallel", "3", "--target", *selected], check=True) + for batch in chunks(selected): + subprocess.run(["cmake", "--build", str(build_dir), "--parallel", "3", "--target", *batch], check=True) resolutions = ctest_resolutions(build_dir, targets_by_name) - missing = sorted(name for name in selected if name not in resolutions.values()) + missing = sorted(set(selected) - {owner for owner, _ in resolutions.values()}) if missing: raise ValueError("no ctest registration resolved for: " + ", ".join(missing)) - names = sorted(resolutions, key=str.casefold) - pattern = "^(" + "|".join(re.escape(name) for name in names) + ")$" - subprocess.run(["ctest", "--test-dir", str(build_dir), "--output-on-failure", "--timeout", "120", - "--parallel", "4", "--no-tests=error", "-R", pattern], check=True) + with tempfile.TemporaryDirectory(prefix="anyps5-guest-ctest-") as directory: + selection = Path(directory) / "selected-tests.txt" + selection.write_text("0,0,0," + ",".join(str(index) for _, index in resolutions.values()), encoding="ascii") + subprocess.run(["ctest", "--test-dir", str(build_dir), "--output-on-failure", "--timeout", "120", + "--parallel", "4", "--no-tests=error", "-I", str(selection)], check=True) else: print("No guest core/libs test sources changed; the libs build still ran") diff --git a/tools/build_mingw_host_only_tests.py b/tools/build_mingw_host_only_tests.py index 4f530ed8e2..292d62593b 100644 --- a/tools/build_mingw_host_only_tests.py +++ b/tools/build_mingw_host_only_tests.py @@ -68,7 +68,7 @@ def is_libc_link(name, target): if name == "libc": return True command = link_command(target) - return re.search(r"(?i)(?:^|[/\\\s])libc(?:\.prx|\.dll\.a)(?:$|[\s\"'])", command) is not None + return re.search(r"(?i)(?:^|[/\\\s])(?:libc\.prx|(?:lib)?libc\.dll\.a)(?:$|[\s\"'])", command) is not None def links_guest_libc(target): @@ -94,7 +94,7 @@ def link_command_mentions_target(command, target): link_names = set() for artifact in target.get("artifacts", []): name = Path(artifact.get("path", "")).name - if name and name in command: + if name and re.search(rf"(?i)(?:^|[/\\:=\s\"',]){re.escape(name)}(?=$|[\s\"',])", command): return True for suffix in (".dll.a", ".dylib", ".prx", ".so", ".a", ".lib"): if name.casefold().endswith(suffix): diff --git a/tools/check_compile.py b/tools/check_compile.py index 94fbed40bc..ab8c5f92e5 100644 --- a/tools/check_compile.py +++ b/tools/check_compile.py @@ -284,7 +284,7 @@ def syntax_arguments(arguments, directory, source): if compiler in ("cl", "clang-cl") or any(argument in ("--driver-mode=cl", "--rsp-quoting=windows") for argument in arguments): raise ValueError("Windows-style compiler response files are unsupported; provide expanded arguments") arguments = [arguments[0], *expand_response_files(arguments[1:], directory)] - wanted = source.resolve() + wanted = real(source) trimmed = [arguments[0]] index = 1 positional = False diff --git a/tools/check_configure_seed.py b/tools/check_configure_seed.py new file mode 100644 index 0000000000..c2175732d6 --- /dev/null +++ b/tools/check_configure_seed.py @@ -0,0 +1,35 @@ +import argparse +import sys +from pathlib import Path + +from configure_seed import checks, quote + + +def main(argv=None): + for stream in (sys.stdout, sys.stderr): + if hasattr(stream, "reconfigure"): + stream.reconfigure(encoding="utf-8", errors="backslashreplace") + parser = argparse.ArgumentParser(description="Check an unfiltered configure seed against its source CMake cache without writing") + parser.add_argument("cache", type=Path) + parser.add_argument("seed", type=Path) + args = parser.parse_args(argv) + try: + found = checks(args.cache) + expected = "".join(f"set({quote(name)} {quote(value)} CACHE INTERNAL {quote(doc)})\n" + for name, (value, doc) in sorted(found.items())).encode("utf-8") + try: + actual = args.seed.read_bytes() + except FileNotFoundError: + print(f"missing seed: {args.seed}") + return 1 + except (OSError, UnicodeError, ValueError) as error: + parser.error(str(error)) + if actual != expected: + print(f"stale seed: {args.seed}") + return 1 + print(f"{len(found)} check results match") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tools/check_skips.py b/tools/check_skips.py index 01ae7088ab..d2e9706460 100644 --- a/tools/check_skips.py +++ b/tools/check_skips.py @@ -4,7 +4,7 @@ import re import xml.etree.ElementTree as ET from pathlib import Path -DEVICE_LIMITATION = re.compile(r"skipped,.*(subgroup|the device (has no|reports|lacks|does not|imports no|flushes|binds fewer)|no display|no usable Vulkan device|host imports are unavailable)", re.IGNORECASE) +DEVICE_LIMITATION = re.compile(r"skipped,.*(subgroup|the device (has no|reports|lacks|does not|imports no|flushes|binds fewer)|no display|no usable Vulkan device|host imports are unavailable|not enough free disk space)", re.IGNORECASE) NO_DISPLAY = re.compile(r"skipped,.*no display", re.IGNORECASE) @@ -37,17 +37,21 @@ def skips(path, require_tests=False): if root.tag not in ("testsuite", "testsuites"): raise ValueError(f"{path}: expected a JUnit testsuite or testsuites root, got {root.tag!r}") found = False + seen = set() for case in root.iter("testcase"): found = True - skipped = case.find("skipped") - ctest_skip = skipped is not None and CTEST_SKIP_STATUS.fullmatch(skipped.get("message", "").strip()) - if case.get("status") == "disabled" or (case.get("status") == "notrun" and not ctest_skip): - raise ValueError(f"{path}: testcase {case.get('name')!r} is {case.get('status')} and was not run") - if skipped is None: - continue name = case.get("name") if not name: raise ValueError(f"{path}: skipped testcase has no name") + if name in seen: + raise ValueError(f"{path}: testcase {name!r} is listed more than once") + seen.add(name) + skipped = case.find("skipped") + ctest_skip = skipped is not None and CTEST_SKIP_STATUS.fullmatch(skipped.get("message", "").strip()) + if case.get("status") == "disabled" or (case.get("status") == "notrun" and not ctest_skip): + raise ValueError(f"{path}: testcase {name!r} is {case.get('status')} and was not run") + if skipped is None: + continue output = ["skipped, " + reason.strip() for reason in (skipped.get("message", ""), skipped.text or "") if reason.strip() and not CTEST_SKIP_STATUS.fullmatch(reason.strip())] output += [case.findtext(channel) or "" for channel in ("system-out", "system-err")] diff --git a/tools/check_test_registration.py b/tools/check_test_registration.py index 2e692f0ea2..60042563e1 100644 --- a/tools/check_test_registration.py +++ b/tools/check_test_registration.py @@ -72,7 +72,7 @@ def commands(content): if content[position] == "#": position = content.find("\n", position) if position < 0: - break + position = len(content) continue token = ARGUMENT.match(content, position) if token is None: @@ -87,6 +87,8 @@ def commands(content): argument = argument[width:-width].removeprefix("\n") arguments.append(argument) position = token.end() + else: + raise ValueError(f"unterminated {command.group(1)} command at position {command.start()}") def registered(build): diff --git a/tools/compare_configure_checks.py b/tools/compare_configure_checks.py new file mode 100644 index 0000000000..97286f7097 --- /dev/null +++ b/tools/compare_configure_checks.py @@ -0,0 +1,32 @@ +import argparse +import json +import sys +from pathlib import Path + +from configure_seed import checks + + +def main(argv=None): + for stream in (sys.stdout, sys.stderr): + if hasattr(stream, "reconfigure"): + stream.reconfigure(encoding="utf-8", errors="backslashreplace") + parser = argparse.ArgumentParser(description="Compare recognized configure checks in two CMake caches without writing") + parser.add_argument("baseline", type=Path) + parser.add_argument("candidate", type=Path) + args = parser.parse_args(argv) + try: + before, after = checks(args.baseline), checks(args.candidate) + except (OSError, UnicodeError, ValueError) as error: + parser.error(str(error)) + def record(value): + return {"value": value[0], "help": value[1]} + added = [{"name": name, **record(after[name])} for name in sorted(after.keys() - before.keys())] + removed = [{"name": name, **record(before[name])} for name in sorted(before.keys() - after.keys())] + changed = [{"name": name, "before": record(before[name]), "after": record(after[name])} + for name in sorted(before.keys() & after.keys()) if before[name] != after[name]] + print(json.dumps({"added": added, "removed": removed, "changed": changed}, ensure_ascii=False, indent=2)) + return int(bool(added or removed or changed)) + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tools/compile_database_inventory.py b/tools/compile_database_inventory.py new file mode 100644 index 0000000000..ac16b2f802 --- /dev/null +++ b/tools/compile_database_inventory.py @@ -0,0 +1,33 @@ +import argparse +import json +import sys +from pathlib import Path + +from check_compile import compilation_database + + +def main(argv=None): + for stream in (sys.stdout, sys.stderr): + if hasattr(stream, "reconfigure"): + stream.reconfigure(encoding="utf-8", errors="backslashreplace") + parser = argparse.ArgumentParser(description="Group the raw records of a saved compilation database without invoking a compiler or build tool") + parser.add_argument("database", type=Path) + args = parser.parse_args(argv) + try: + entries = compilation_database(args.database.read_text(encoding="utf-8-sig"), args.database) + units = {} + for item in entries: + record = {"arguments": item["arguments"]} if "arguments" in item else {"command": item["command"]} + if "output" in item: + record["output"] = item["output"] + units.setdefault((item["directory"], item["file"]), []).append(record) + except (OSError, ValueError, RecursionError) as error: + parser.error(str(error)) + print(json.dumps({"entries": len(entries), "units": [ + {"directory": directory, "file": file, "variants": len(records), "records": records} + for (directory, file), records in sorted(units.items())]}, ensure_ascii=False, indent=2)) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tools/env_reference.py b/tools/env_reference.py index b9a0a8775f..a27c2bdb24 100644 --- a/tools/env_reference.py +++ b/tools/env_reference.py @@ -1,12 +1,14 @@ import argparse import bisect import functools +import posixpath import re import sys -from pathlib import Path +from pathlib import Path, PurePosixPath sys.path.insert(0, str(Path(__file__).resolve().parent)) from nid_names import CPP_TOKEN +from sanitizer_report import cell PREFIXES = ("APS5_", "ANYPS5_") DOC = "docs/dev/ENVIRONMENT.md" @@ -15,6 +17,8 @@ EXTENSIONS = {".c", ".cc", ".cpp", ".cxx", ".h", ".hh", ".hpp", ".hxx", ".inl", SKIP = {"build", "build-linux", "build-relinker", "3rdparty", ".git"} INTEGER_READERS = {"kibSetting", "MaskFromEnvironment", "EnvInt", "configured", "environmentCount", "EnvironmentNumber"} +IDENTIFIER_READERS = ("getenv", "IsEnvironmentSet", "MaskFromEnvironment", "kibSetting", "EnvInt", "configured", + "PipelineSwitch", "environmentCount", "EnvironmentNumber") STRING_READERS = {"GetEnvironmentVariableA", "GetEnvironmentVariableW", "addWideString"} NULL_TEST = re.compile(r"[!=]=\s*(nullptr|NULL|0)\b|!\s*(?:std::)?_?w?getenv\s*\(") INTEGER_TEST = re.compile(r"\b(atoi|strtol|strtoul|strtoll|strtoull|stoi|stol|stoul|from_chars|atoi64|_wtoi|_wtol|_wtoi64)\s*\(") @@ -120,27 +124,131 @@ def source_files(root): yield path +class _NamedRead: + """A read whose name was reached through a string constant, positioned like the literal read.""" + + def __init__(self, match, name): + self.match = match + self.name = name + + def start(self): + return self.match.start() + + def end(self): + return self.match.end() + + def group(self, key): + return self.name if key == "name" else self.match.group(key) + + def groupdict(self): + return {} + + +@functools.lru_cache(maxsize=None) +def constant_forms(prefixes=PREFIXES): + name = _name(prefixes) + return ( + re.compile(r'\b([A-Za-z_]\w*)\s*=\s*(?:u8|u|U|L)?"(?P<name>' + name + r')"\s*;'), + re.compile(r'(?<![\w:])(?:std::)?(' + "|".join(IDENTIFIER_READERS) + r')\s*\(\s*(?P<ident>[A-Za-z_]\w*)\s*(?=[,)])'), + ) + + +SHADOW = re.compile(r'(?<![\w.:>])[A-Za-z_][\w:]*(?:\s*[*&]+\s*|\s+)(?:const\s+)?(?P<name>[A-Za-z_]\w*)\s*(?P<after>[=;,)\[{(])') +INCLUDE = re.compile(r'^[ \t]*#[ \t]*include[ \t]*"([^"]+)"', re.M) + + +def literal_start(prefixes=PREFIXES): + return re.compile(r'=\s*(?:u8|u|U|L)?"(?:' + "|".join(re.escape(prefix) for prefix in prefixes) + ")") + + +def uncommented(text): + return CPP_TOKEN.sub(lambda token: " " * len(token.group()) if token.group("comment") else token.group(), text) + + +def declared_constants(commentless, prefixes=PREFIXES): + found = {} + for match in constant_forms(tuple(prefixes))[0].finditer(commentless): + found.setdefault(match.group(1), set()).add(match.group("name")) + return found + + +def shadowed_names(commentless, prefixes=PREFIXES): + literal = literal_start(prefixes) + names = set() + for line in commentless.split("\n"): + if "constexpr" in line: + continue + for match in SHADOW.finditer(line): + if match.group("after") == "=" and literal.match(line, match.start("after")): + continue + names.add(match.group("name")) + return names + + +def visible_constants(path, sources, commentless, declared): + by_name = {} + for other in sources: + by_name.setdefault(other.name, []).append(other) + full = {other.as_posix(): other for other in sources} + seen, pending, found = set(), [path], {} + while pending: + current = pending.pop() + if current in seen: + continue + seen.add(current) + for ident, names in declared[current].items(): + found.setdefault(ident, set()).update(names) + for include in INCLUDE.findall(commentless[current]): + relative = posixpath.normpath(posixpath.join(current.parent.as_posix(), include)) + if relative in full: + pending.append(full[relative]) + else: + pending.extend(other for other in by_name.get(PurePosixPath(include).name, []) + if other.as_posix().endswith("/" + include) or other.as_posix() == include) + return found + + +def identifier_reads(code, constants, shadowed, prefixes=PREFIXES): + _, reader_form = constant_forms(tuple(prefixes)) + out = [] + for match in reader_form.finditer(code): + ident = match.group("ident") + if ident in shadowed: + continue + names = constants.get(ident, set()) + if len(names) == 1: + out.append((match.group(1), _NamedRead(match, next(iter(names))))) + return out + + def reads(roots, prefixes=PREFIXES): found = {} + sources = [] for root in roots: for path in source_files(root): try: text = path.read_text(encoding="utf-8") except (OSError, UnicodeDecodeError) as error: raise ValueError(f"cannot read {path.as_posix()}: {error}") from error - matches = line_reads(text, prefixes) - if not matches: - continue - code = CPP_TOKEN.sub(lambda token: token.group() if token.group("code") else " " * len(token.group()), text) - starts = [0] + [match.end() for match in re.finditer("\n", text)] - for reader, match in matches: - number = bisect.bisect_right(starts, match.start()) - start = max(code.rfind(token, 0, match.start()) for token in ";{}") + 1 - end = code.find(";", match.end()) - end = end + 1 if end >= 0 else len(text) - window = expression_window(text, code, matches, match, start, end) - found.setdefault(match.group("name"), []).append( - (path.as_posix(), number, kind_of(reader, window), default_of(match, window))) + sources.append((path, text)) + commentless = {path: uncommented(text) for path, text in sources} + declared = {path: declared_constants(commentless[path], prefixes) for path, _ in sources} + for path, text in sources: + constants = visible_constants(path, [item for item, _ in sources], commentless, declared) + matches = line_reads(text, prefixes) + code = CPP_TOKEN.sub(lambda token: token.group() if token.group("code") else " " * len(token.group()), text) + matches += identifier_reads(code, constants, shadowed_names(commentless[path], prefixes), prefixes) + if not matches: + continue + starts = [0] + [match.end() for match in re.finditer("\n", text)] + for reader, match in matches: + number = bisect.bisect_right(starts, match.start()) + start = max(code.rfind(token, 0, match.start()) for token in ";{}") + 1 + end = code.find(";", match.end()) + end = end + 1 if end >= 0 else len(text) + window = expression_window(text, code, matches, match, start, end) + found.setdefault(match.group("name"), []).append( + (path.as_posix(), number, kind_of(reader, window), default_of(match, window))) for sites in found.values(): sites.sort() return found @@ -177,7 +285,8 @@ def table(found, out): out.write("| Name | Kind | Source | Default | Description |\n") out.write("|------|------|--------|---------|-------------|\n") for name, (source, number, kind, default) in sorted(libraries[library]): - out.write(f"| `{name}` | {kind} | `{source}` | {default} | |\n") + cells = (f"`{name}`", kind.replace("\\", "\\\\"), f"`{source}`", default.replace("\\", "\\\\")) + out.write("| " + " | ".join(cell(value) for value in cells) + " | |\n") out.write("\n") diff --git a/tools/hw-oracle/compare_results.py b/tools/hw-oracle/compare_results.py index 9171bfe5d5..5626fb1f75 100644 --- a/tools/hw-oracle/compare_results.py +++ b/tools/hw-oracle/compare_results.py @@ -61,7 +61,7 @@ def read_report(path): return report -def compare(before, after): +def compare_limited(before, after, max_differences): for name in SETTINGS: if before[name] != after[name]: raise ValueError(f"incompatible reports: {name} differs") @@ -71,11 +71,18 @@ def compare(before, after): if left["input"] != right["input"]: raise ValueError(f"incompatible reports: row {index} input differs") differences = [] + difference_count = 0 for index, (left, right) in enumerate(zip(before["rows"], after["rows"]), 1): for register, old, new in zip(before["output_registers"], left["output"], right["output"]): if old != new: - differences.append((index, register, old, new)) - return differences + difference_count += 1 + if max_differences is None or len(differences) < max_differences: + differences.append((index, register, old, new)) + return difference_count, differences + + +def compare(before, after): + return compare_limited(before, after, None)[1] def nonnegative_integer(value): @@ -98,18 +105,21 @@ def main(): args = parser.parse_args() try: before, after = read_report(args.before), read_report(args.after) - differences = compare(before, after) + if args.max_differences is None: + differences = compare(before, after) + difference_count = len(differences) + else: + difference_count, differences = compare_limited(before, after, args.max_differences) except (OSError, UnicodeError, ValueError) as error: parser.error(str(error)) print(f"Assembly targets: {before['assembly_target']} -> {after['assembly_target']}") print(f"Compared {len(before['rows'])} rows x {len(before['output_registers'])} registers: " - f"{len(differences)} differing words") - visible = differences if args.max_differences is None else differences[:args.max_differences] - for row, register, old, new in visible: + f"{difference_count} differing words") + for row, register, old, new in differences: print(f"row {row}, {register}: 0x{old:08x} -> 0x{new:08x}") - if len(visible) < len(differences): - print(f"{len(differences) - len(visible)} additional differing words omitted") - return int(bool(differences)) + if len(differences) < difference_count: + print(f"{difference_count - len(differences)} additional differing words omitted") + return int(bool(difference_count)) if __name__ == "__main__": diff --git a/tools/hw-oracle/hw_oracle.py b/tools/hw-oracle/hw_oracle.py index 437b8945ee..264f9ee8ed 100644 --- a/tools/hw-oracle/hw_oracle.py +++ b/tools/hw-oracle/hw_oracle.py @@ -201,11 +201,11 @@ def main(): parser.error(f"lds must be an integer from 0 to {MAX_LDS}") try: rows = validated_rows(tuple(parse_word(v) for v in line.split()) - for line in args.rows.read_text(encoding="utf-8").splitlines() if line.strip()) + for line in args.rows.read_text(encoding="utf-8-sig").splitlines() if line.strip()) if not rows: parser.error("rows file must contain at least one input row") extra = args.extra.read_bytes() if args.extra else b"" - body = args.body.read_text(encoding="utf-8") + body = args.body.read_text(encoding="utf-8-sig") except (OSError, ValueError) as error: parser.error(str(error)) modes = {name: getattr(args, name) for name in ("ieee", "denorm32", "denorm16", "dx10_clamp", "round32", "round16", "fp16_overflow")} diff --git a/tools/hw-oracle/oracle_hip.py b/tools/hw-oracle/oracle_hip.py index b14e8b4619..5de745c302 100644 --- a/tools/hw-oracle/oracle_hip.py +++ b/tools/hw-oracle/oracle_hip.py @@ -238,6 +238,8 @@ def main(argv=None): code_bytes, input_bytes = code.read_bytes(), inputs.read_bytes() if output.exists() and any(source.samefile(output) for source in (code, inputs)): parser.error("dispatch output must not overwrite an input file") + if len(input_bytes) < threads * 16: + parser.error(f"input file must contain at least {threads * 16} bytes") result = dispatch(code_bytes, threads, input_bytes, out_dwords, os.environ.get("COARSE") is not None) output.write_bytes(result) return 0 diff --git a/tools/hw-oracle/test_compare_results.py b/tools/hw-oracle/test_compare_results.py index 03c1816db5..23847f97a2 100644 --- a/tools/hw-oracle/test_compare_results.py +++ b/tools/hw-oracle/test_compare_results.py @@ -242,6 +242,23 @@ class CompareResultsTests(unittest.TestCase): self.assertEqual(result.returncode, 2) self.assertEqual(result.stdout, "") + def test_diagnostic_limit_retains_only_visible_differences_while_counting_all(self): + before = copy.deepcopy(self.report) + before["rows"] = [ + {"input": [index, 0, 0, 0], "output": [0, 0]} + for index in range(1000) + ] + after = copy.deepcopy(before) + for row in after["rows"]: + row["output"] = [1, 2] + count, differences = compare_results.compare_limited(before, after, 3) + self.assertEqual(count, 2000) + self.assertEqual(differences, [ + (1, "v10", 0, 1), + (1, "v11", 0, 2), + (2, "v10", 0, 1), + ]) + if __name__ == "__main__": diff --git a/tools/hw-oracle/test_hw_oracle.py b/tools/hw-oracle/test_hw_oracle.py index 56269a9ae8..4c8b1e2385 100644 --- a/tools/hw-oracle/test_hw_oracle.py +++ b/tools/hw-oracle/test_hw_oracle.py @@ -108,6 +108,20 @@ class InputRowsTests(unittest.TestCase): assemble.assert_not_called() oracle.assert_not_called() + def test_cli_accepts_utf8_bom_in_body_and_rows(self): + with tempfile.TemporaryDirectory() as directory: + body, rows = (Path(directory) / name for name in ("body.s", "rows.txt")) + argv = ["hw_oracle.py", str(body), str(rows)] + argv += [item for name, value in MODES.items() + for item in ["--" + name.replace("_", "-"), str(value)]] + for bom in ("body", "rows"): + with self.subTest(bom=bom): + body.write_text("s_nop 0", encoding="utf-8-sig" if bom == "body" else "utf-8") + rows.write_text("1 2 3 4\n", encoding="utf-8-sig" if bom == "rows" else "utf-8") + with patch("sys.argv", argv), patch.object(hw_oracle, "run", return_value=[]) as run: + hw_oracle.main() + run.assert_called_once_with("s_nop 0", [(1, 2, 3, 4)], b"", False, False, **MODES, lds=4096) + def test_successful_dispatch_without_output_cannot_reuse_previous_results(self): with tempfile.TemporaryDirectory() as directory: runner = Path(directory) / "runner.py" @@ -743,6 +757,33 @@ class HipOracleTests(unittest.TestCase): read.assert_not_called() dispatch.assert_not_called() + def test_cli_rejects_short_dispatch_input_before_oracle_work(self): + with tempfile.TemporaryDirectory() as directory: + root = Path(directory) + code, inputs, output = (root / name for name in ("code.co", "input.bin", "output.bin")) + code.write_bytes(b"code") + for threads, size in ((1, 0), (1, 15), (2, 31)): + with self.subTest(threads=threads, size=size): + inputs.write_bytes(bytes(size)) + output.unlink(missing_ok=True) + with patch.object(self.oracle_hip, "dispatch", side_effect=AssertionError("dispatch called")) as dispatch, \ + contextlib.redirect_stderr(io.StringIO()) as errors, self.assertRaises(SystemExit) as exited: + self.oracle_hip.main([str(code), str(threads), str(inputs), str(output), "1"]) + self.assertEqual(exited.exception.code, 2) + self.assertIn(f"input file must contain at least {threads * 16} bytes", errors.getvalue()) + self.assertFalse(output.exists()) + dispatch.assert_not_called() + + for size in (32, 35): + with self.subTest(threads=2, accepted_size=size): + payload = bytes(range(size)) + inputs.write_bytes(payload) + output.unlink(missing_ok=True) + with patch.object(self.oracle_hip, "dispatch", return_value=bytes(8)) as dispatch: + self.assertEqual(self.oracle_hip.main([str(code), "2", str(inputs), str(output), "1"]), 0) + dispatch.assert_called_once_with(b"code", 2, payload, 1, False) + self.assertEqual(output.read_bytes(), bytes(8)) + def test_cli_rejects_output_aliases_before_oracle_work(self): with tempfile.TemporaryDirectory() as directory: root = Path(directory) diff --git a/tools/import_audit.py b/tools/import_audit.py index 7dc193755b..e13045db0a 100644 --- a/tools/import_audit.py +++ b/tools/import_audit.py @@ -20,6 +20,7 @@ CLASSES = ("implemented", "partial", "stub", "absent", "module") CONDITIONAL = re.compile(r"(?:if|else|for|while|do|switch|case|default|try|catch|co_await|co_yield)\b") BRANCHING = re.compile(r"\?|&&|\|\||\b(?:and|or)\b") EXIT = re.compile(r"\b(?:return|co_return|goto)\b") +FLOW_TOKEN = re.compile(r"\w+|[()[\]{}]") PREPROCESSOR_LINE = re.compile(r"^[ \t]*#[ \t]*(ifdef|ifndef|if|elifdef|elifndef|elif|else|endif)\b[^\n]*$", re.M) BRANCH_VARIANT_LIMIT = 256 PE_DIRECTORY_OFFSET = {0x20b: 112, 0x10b: 96} @@ -503,6 +504,39 @@ def top_level_statements(body): return parts +def function_exit(body): + for _, statement in top_level_statements(body): + depth, end, capture_depth, callable_scope = 0, 0, 0, False + for match in FLOW_TOKEN.finditer(statement): + if match.start() < end: + continue + token = match.group() + if token == "[": + before = statement[:match.start()].rstrip() + if not depth and not statement.startswith("[[", match.start()) and ( + not before or before[-1] in "=({,:;?!~&|+-*/%^<>" or before.endswith("]]") + or re.search(r"\b(?:co_await|co_yield|throw)$", before)): + capture_depth = depth + 1 + depth += 1 + elif token == "(": + depth += 1 + elif token in (")", "]"): + if token == "]" and depth == capture_depth: + callable_scope = True + capture_depth = 0 + depth -= 1 + elif token == "{": + end = progress.body_end(statement, match.start()) + 1 + statement_expression = depth and statement[:match.start()].rstrip().endswith("(") + if not callable_scope and (not depth or statement_expression) and function_exit(statement[match.start():end]): + return True + elif not depth: + if EXIT.fullmatch(token): + return True + callable_scope = callable_scope or token in ("class", "struct", "union") + return False + + def branch_variants(body): root = [] lists, groups = [root], [] @@ -579,14 +613,17 @@ def unconditional_calls(body): before = statement[:call.start()] if before.count("{") == before.count("}") and not progress.QUALIFIED.search(body, 0, offset + call.start()): names.add(call.group(1)) - if EXIT.search(statement): + if function_exit("{" + statement + "}"): break return names def always_stub_calls(text): helpers = {} + possible = progress.stub_calls(text) for match in progress.STUB_WRAPPER.finditer(text): + if match.group(1) not in possible: + continue body = text[match.end() - 1:progress.body_end(text, match.end() - 1) + 1] helpers.setdefault(match.group(1), []).extend(variant_calls(body)) calls = {progress.STUB} @@ -797,8 +834,10 @@ def audit(imports, exports, stubs, libraries, modules, module_imports=None, modu library = record["library"] if library and not available(library): missing[library] += 1 - for _, needed in (module_imports or {}).values(): + for module, (_, needed) in (module_imports or {}).items(): for library in needed: + if module.endswith(".guest.prx") and library == "ld-linux-x86-64.so.2": + continue if not available(library): missing[library] += 1 return ordered, dict(sorted(missing.items())) diff --git a/tools/input-mapper/capture.js b/tools/input-mapper/capture.js index 05bbce0c36..90663d03ff 100644 --- a/tools/input-mapper/capture.js +++ b/tools/input-mapper/capture.js @@ -11,7 +11,13 @@ const codes = { NumpadAdd: 'Keypad +', NumpadEnter: 'Keypad Enter', NumpadDecimal: 'Keypad .', NumpadEqual: 'Keypad =', NumpadComma: 'Keypad ,', ContextMenu: 'Application', ControlLeft: 'Left Ctrl', ControlRight: 'Right Ctrl', ShiftLeft: 'Left Shift', ShiftRight: 'Right Shift', - AltLeft: 'Left Alt', AltRight: 'Right Alt', MetaLeft: 'Left GUI', MetaRight: 'Right GUI' + AltLeft: 'Left Alt', AltRight: 'Right Alt', MetaLeft: 'Left GUI', MetaRight: 'Right GUI', + MediaTrackNext: 'AudioNext', MediaTrackPrevious: 'AudioPrev', MediaStop: 'AudioStop', + MediaPlayPause: 'AudioPlay', MediaSelect: 'MediaSelect', + AudioVolumeMute: 'Mute', AudioVolumeUp: 'VolumeUp', AudioVolumeDown: 'VolumeDown', + BrowserSearch: 'AC Search', BrowserHome: 'AC Home', BrowserBack: 'AC Back', + BrowserForward: 'AC Forward', BrowserStop: 'AC Stop', BrowserRefresh: 'AC Refresh', + BrowserFavorites: 'AC Bookmarks' }; export function captureKey(event) { diff --git a/tools/input-mapper/dropdown.js b/tools/input-mapper/dropdown.js index 63a962e2ea..eb94510a32 100644 --- a/tools/input-mapper/dropdown.js +++ b/tools/input-mapper/dropdown.js @@ -8,11 +8,15 @@ let active; let visible = []; let focused = 0; +export function normalizeSearch(value) { + return value.toLowerCase(); +} + function renderOptions() { - const query = search.value.trim().toLocaleLowerCase(); - visible = active.choices.filter(item => `${item.label} ${item.value}`.toLocaleLowerCase().includes(query)); + const query = normalizeSearch(search.value.trim()); + visible = active.choices.filter(item => normalizeSearch(`${item.label} ${item.value}`).includes(query)); list.replaceChildren(); - const exactMatch = query ? visible.findIndex(item => item.label.toLocaleLowerCase() === query || item.value.toLocaleLowerCase() === query) : -1; + const exactMatch = query ? visible.findIndex(item => normalizeSearch(item.label) === query || normalizeSearch(item.value) === query) : -1; focused = Math.max(0, exactMatch >= 0 ? exactMatch : visible.findIndex(item => item.value === active.select.value)); visible.forEach((item, index) => { const option = document.createElement('button'); diff --git a/tools/input-mapper/i18n.js b/tools/input-mapper/i18n.js index 4748a064e2..94308a2830 100644 --- a/tools/input-mapper/i18n.js +++ b/tools/input-mapper/i18n.js @@ -30,8 +30,8 @@ export const locales = [ "direction": "ltr" }, { - "code": "pt", - "name": "Português", + "code": "pt-BR", + "name": "Português (Brasil)", "direction": "ltr" }, { @@ -464,7 +464,7 @@ export const messages = { "searchOptions": "Cerca opzioni", "noOptions": "Nessuna opzione trovata." }, - "pt": { + "pt-BR": { "controls": "Controles", "configuration": "Configuração", "help": "Ajuda", @@ -1291,5 +1291,6 @@ export function diagnostic(locale, message) { } export function initialLocale(savedLocale) { + if (savedLocale === 'pt') savedLocale = 'pt-BR'; return locales.some(item => item.code === savedLocale) ? savedLocale : 'en'; } diff --git a/tools/input-mapper/mapping.js b/tools/input-mapper/mapping.js index 44a523e995..42e574ce5d 100644 --- a/tools/input-mapper/mapping.js +++ b/tools/input-mapper/mapping.js @@ -4,7 +4,7 @@ export const groups = [ {name: 'Directional controls', actions: ['Up', 'Right', 'Down', 'Left']}, {name: 'Left analog stick', actions: ['LeftStickLeft', 'LeftStickRight', 'LeftStickUp', 'LeftStickDown']}, {name: 'Right analog stick', actions: ['RightStickLeft', 'RightStickRight', 'RightStickUp', 'RightStickDown']}, - {name: 'Touch and utility', actions: ['Options', 'TouchLeft', 'TouchRight', 'StickModifier', 'Shake', 'ToggleMouse', 'ToggleFullscreen', 'TogglePerformanceOverlay', 'Screenshot', 'ShowPadStatus']} + {name: 'Touch and utility', actions: ['Options', 'TouchLeft', 'TouchRight', 'StickModifier', 'Shake', 'ToggleMouse', 'ToggleFullscreen', 'TogglePerformanceOverlay', 'Screenshot', 'ShowPadStatus', 'VolumeUp', 'VolumeDown', 'ToggleMute']} ]; export const actions = groups.flatMap(group => group.actions); @@ -20,12 +20,12 @@ export const defaults = { LeftStickLeft: ['KEY:A'], LeftStickRight: ['KEY:D'], LeftStickUp: ['KEY:W'], LeftStickDown: ['KEY:S'], RightStickLeft: ['KEY:F'], RightStickRight: ['KEY:H'], RightStickUp: ['KEY:T'], RightStickDown: ['KEY:G'], TouchLeft: ['KEY:Backspace'], TouchRight: ['KEY:Tab'], StickModifier: [], Shake: ['KEY:X'], - ToggleMouse: ['KEY:F7', 'MOUSE:Middle'], ToggleFullscreen: ['KEY:F11'], TogglePerformanceOverlay: ['KEY:F10'], Screenshot: ['KEY:F12'], ShowPadStatus: ['KEY:F9'] + ToggleMouse: ['KEY:F7', 'MOUSE:Middle'], ToggleFullscreen: ['KEY:F11'], TogglePerformanceOverlay: ['KEY:F10'], Screenshot: ['KEY:F12'], ShowPadStatus: ['KEY:F9'], VolumeUp: ['KEY:F6'], VolumeDown: ['KEY:F5'], ToggleMute: ['KEY:F8'] }; export function typesForAction(action) { if (!actions.includes(action)) return []; - if (['ToggleFullscreen', 'TogglePerformanceOverlay', 'Screenshot', 'ShowPadStatus'].includes(action)) return ['KEY']; + if (['ToggleFullscreen', 'TogglePerformanceOverlay', 'Screenshot', 'ShowPadStatus', 'VolumeUp', 'VolumeDown', 'ToggleMute'].includes(action)) return ['KEY']; return padButtons.has(action) ? ['KEY', 'MOUSE', 'WHEEL'] : ['KEY', 'MOUSE']; } diff --git a/tools/input-mapper/serve.js b/tools/input-mapper/serve.js index e1749a61e8..cfb03da008 100644 --- a/tools/input-mapper/serve.js +++ b/tools/input-mapper/serve.js @@ -3,7 +3,8 @@ import {readFile} from 'node:fs/promises'; const files = new Set(['index.html', 'styles.css', 'app.js', 'mapping.js', 'keys.js', 'capture.js', 'validation.js', 'i18n.js', 'dropdown.js']); const mime = {html: 'text/html', css: 'text/css', js: 'text/javascript'}; -const port = Number(process.env.PORT || 4173); +const configuredPort = process.env.PORT || '4173'; +const port = configuredPort.trim() ? Number(configuredPort) : Number.NaN; const server = createServer(async (request, response) => { let path; try { diff --git a/tools/input-mapper/tests/dropdown.test.js b/tools/input-mapper/tests/dropdown.test.js new file mode 100644 index 0000000000..475a318ce1 --- /dev/null +++ b/tools/input-mapper/tests/dropdown.test.js @@ -0,0 +1,15 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; + +const eventTarget = () => ({addEventListener() {}}); +globalThis.document = {getElementById: eventTarget}; +globalThis.window = eventTarget(); + +const {normalizeSearch} = await import('../dropdown.js'); + +test('dropdown search keeps technical key names locale independent', () => { + assert.equal('I'.toLocaleLowerCase('tr'), '\u0131'); + assert.equal(normalizeSearch('I'), 'i'); + assert.equal(normalizeSearch('i'), 'i'); + assert.ok(normalizeSearch('KEY:I').includes(normalizeSearch('i'))); +}); diff --git a/tools/input-mapper/tests/mapping.test.js b/tools/input-mapper/tests/mapping.test.js index c92645d0b6..b72a270e23 100644 --- a/tools/input-mapper/tests/mapping.test.js +++ b/tools/input-mapper/tests/mapping.test.js @@ -66,7 +66,7 @@ test('all exportable SDL names validate and unsafe comment names are rejected', test('mouse values and action restrictions match the current INI format', () => { for (const action of actions) { for (const value of mouseValues) { - assert.equal(validate([binding(action, 'MOUSE', value)]).errors.length === 0, !['ToggleFullscreen', 'TogglePerformanceOverlay', 'Screenshot', 'ShowPadStatus'].includes(action)); + assert.equal(validate([binding(action, 'MOUSE', value)]).errors.length === 0, !['ToggleFullscreen', 'TogglePerformanceOverlay', 'Screenshot', 'ShowPadStatus', 'VolumeUp', 'VolumeDown', 'ToggleMute'].includes(action)); } } assert.ok(validate([binding('Cross', 'MOUSE', 'Button1')]).errors.length); @@ -162,6 +162,23 @@ test('capture maps physical positions and distinguishes modifiers and keypad', ( assert.equal(captureKey({code: 'KeyQ', key: 'a'}).value, 'Q'); }); +test('captured media and browser keys round trip through INI bindings', () => { + const keys = { + MediaTrackNext: 'AudioNext', MediaTrackPrevious: 'AudioPrev', MediaStop: 'AudioStop', + MediaPlayPause: 'AudioPlay', MediaSelect: 'MediaSelect', + AudioVolumeMute: 'Mute', AudioVolumeUp: 'VolumeUp', AudioVolumeDown: 'VolumeDown', + BrowserSearch: 'AC Search', BrowserHome: 'AC Home', BrowserBack: 'AC Back', + BrowserForward: 'AC Forward', BrowserStop: 'AC Stop', BrowserRefresh: 'AC Refresh', + BrowserFavorites: 'AC Bookmarks' + }; + for (const [code, value] of Object.entries(keys)) { + const captured = captureKey({code, key: 'ignored'}); + assert.deepEqual(captured, {value}, code); + const ini = serialize([binding('Cross', 'KEY', captured.value)]); + assert.deepEqual(parseIni(ini).entries, [binding('Cross', 'KEY', value)], code); + } +}); + test('capture rejects missing identifiers, composition and unsafe punctuation', () => { for (const event of [{code: 'Unidentified'}, {key: 'a'}, {code: 'IntlBackslash'}, {code: 'Semicolon'}, {code: 'KeyA', isComposing: true}, {code: 'Quote', key: 'Dead'}, {code: 'KeyA', key: 'Process'}]) { assert.ok(captureKey(event).error); diff --git a/tools/input-mapper/tests/serve.test.js b/tools/input-mapper/tests/serve.test.js index 3c3639f7a9..e1c5dce28a 100644 --- a/tools/input-mapper/tests/serve.test.js +++ b/tools/input-mapper/tests/serve.test.js @@ -87,7 +87,7 @@ test('server retains GET HEAD allowlist and method behavior', {timeout: 15000}, }); test('invalid configured ports fail without leaking a stack trace', {timeout: 15000}, async () => { - for (const invalidPort of ['abc', '-1', '65536', '1.5']) { + for (const invalidPort of ['abc', '-1', '65536', '1.5', ' ', '\t']) { const child = spawn(process.execPath, [fileURLToPath(new URL('../serve.js', import.meta.url))], { env: {...process.env, PORT: invalidPort}, stdio: ['ignore', 'pipe', 'pipe'] }); diff --git a/tools/inspect_self.py b/tools/inspect_self.py new file mode 100644 index 0000000000..667040951d --- /dev/null +++ b/tools/inspect_self.py @@ -0,0 +1,36 @@ +import argparse +import json +import struct +import sys +from pathlib import Path + +from unwrap_self import FIRST_REGION, SELF_MAGIC, SELF_MAGIC_KERNEL, Refused, parse_elf, read_records + + +def main(argv=None): + for stream in (sys.stdout, sys.stderr): + if hasattr(stream, "reconfigure"): + stream.reconfigure(encoding="utf-8", errors="backslashreplace") + parser = argparse.ArgumentParser(description="Inspect SELF record and original inner ELF header metadata as JSON; this does not validate conversion or decrypt segments") + parser.add_argument("input", type=Path) + args = parser.parse_args(argv) + try: + data = args.input.read_bytes() + if len(data) < FIRST_REGION: + raise Refused("file is smaller than the SELF header area") + magic = struct.unpack_from("<I", data)[0] + if magic not in (SELF_MAGIC, SELF_MAGIC_KERNEL): + raise Refused("not a SELF container") + records = read_records(data) + inner, _, headers = parse_elf(data) + except (OSError, ValueError, Refused, struct.error) as error: + parser.error(str(error)) + fields = ("index", "type", "flags", "offset", "vaddr", "size", "memory", "align") + print(json.dumps({"size": len(data), "magic": magic, "inner_elf": inner, + "records": [{"flags": flags, "offset": offset, "size": size} for flags, offset, size in records], + "program_headers": [{field: header[field] for field in fields} for header in headers]}, indent=2)) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tools/nid_names.py b/tools/nid_names.py index 658b223f8f..a6d7feff12 100644 --- a/tools/nid_names.py +++ b/tools/nid_names.py @@ -7,6 +7,7 @@ import re import sys import tempfile import urllib.request +from base64 import b64encode from pathlib import Path ROOT = Path(__file__).resolve().parent.parent @@ -15,7 +16,6 @@ DB_URL = ("https://raw.githubusercontent.com/zecoxao/sce_symbols" "/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv") DEFAULT_CACHE = Path(tempfile.gettempdir()) / "anyps5-nid-db" / "aerolib.csv" -CHARSET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-" SUFFIX = bytes([0x51, 0x8D, 0x64, 0xA6, 0x35, 0xDE, 0xD8, 0xC1, 0xE6, 0xB0, 0x39, 0xB1, 0xC3, 0xE5, 0x52, 0x30]) CPP_TOKEN = re.compile( @@ -31,16 +31,7 @@ ASM_FUNCTION_MACROS = {"APS5_ASM_FUNCTION", "APS5_SIGNAL_ASM_FUNCTION"} def compute_nid(symbol): digest = hashlib.sha1(symbol.encode() + SUFFIX).digest() - rev = bytes(digest[7 - i] for i in range(8)) - out = [] - for i in range(0, 6, 3): - triple = (rev[i] << 16) | (rev[i + 1] << 8) | rev[i + 2] - out += [CHARSET[(triple >> 18) & 63], CHARSET[(triple >> 12) & 63], - CHARSET[(triple >> 6) & 63], CHARSET[triple & 63]] - tail = (rev[6] << 16) | (rev[7] << 8) - out += [CHARSET[(tail >> 18) & 63], CHARSET[(tail >> 12) & 63], - CHARSET[(tail >> 6) & 63]] - return "".join(out) + return b64encode(digest[:8][::-1], altchars=b"+-").decode("ascii").rstrip("=") def strip_nid_postfix(name): diff --git a/tools/package_headers.py b/tools/package_headers.py index 3a4f3b3879..b22e6fa937 100644 --- a/tools/package_headers.py +++ b/tools/package_headers.py @@ -24,15 +24,23 @@ cxxabi.h dispatch/dispatch.h io.h link.h semaphore.h stdio_ext.h sys/uio.h unist """.split()) +def resolved_path(path): + path = Path(path) + resolved = Path(os.path.realpath(path)) + if resolved.is_symlink(): + raise RuntimeError(f"Symbolic link loop: {path}") + return resolved + + def public_headers(root): - libs = (root / "core/libs").resolve() + libs = resolved_path(root / "core/libs") directories = sorted(path for path in (libs / "prx").iterdir() if path.is_dir() and not path.name.startswith(".")) if not directories: raise RuntimeError("No public library headers found") pending = [path / (path.name + ".hpp") for path in directories] visited = set() while pending: - header = pending.pop().resolve() + header = resolved_path(pending.pop()) if not header.is_relative_to(libs): raise RuntimeError(f"Public header is outside core/libs: {header}") if header in visited: @@ -50,7 +58,13 @@ def public_headers(root): name = quoted or angled if "\\" in name or ":" in name or PurePosixPath(name).is_absolute() or "3rdparty" in PurePosixPath(name).parts: raise RuntimeError(f"Forbidden public include in {header}: {name}") - candidates = {path.resolve() for path in ((header.parent / name, libs / name) if quoted else (libs / name,)) if path.is_file()} + search = (header.parent / name, libs / name) if quoted else (libs / name,) + candidates = set() + for path in search: + if path.is_symlink(): + candidates.add(resolved_path(path)) + elif path.is_file(): + candidates.add(resolved_path(path)) if len(candidates) > 1: raise RuntimeError(f"Ambiguous public include in {header}: {name}") if candidates: @@ -63,7 +77,7 @@ def public_headers(root): def package(root, output, version): if not re.fullmatch(r"v[0-9A-Za-z][0-9A-Za-z._-]*", version) or version.endswith("."): raise ValueError(f"Invalid release tag for asset filenames: {version}") - libs = (root / "core/libs").resolve() + libs = resolved_path(root / "core/libs") headers = public_headers(root) license_file = root / "LICENSE" if not license_file.is_file() or license_file.stat().st_size == 0: diff --git a/tools/package_release.py b/tools/package_release.py index 9cf04f2b82..4a39a4b7c7 100644 --- a/tools/package_release.py +++ b/tools/package_release.py @@ -17,6 +17,21 @@ WEB_FILES = ("index.html", "app.css", "app.mjs", "archive.mjs", "batch.mjs", "fa "native/relinker_wasm.mjs", "native/relinker_wasm.wasm") +def resolve_release_path(path): + path = Path(path) + try: + resolved = Path(os.path.realpath(path)) + except OSError as error: + raise ValueError(str(error)) from error + if resolved.is_symlink(): + try: + resolved.stat() + except OSError as error: + raise ValueError(f"{path}: release path is a symbolic link loop: {error}") from error + raise ValueError(f"{path}: release path is a symbolic link loop") + return resolved + + def windows_runtime(build): cache = build / "CMakeCache.txt" if not cache.is_file(): @@ -178,25 +193,27 @@ def main(argv=None): parser.add_argument("--output", required=True, type=Path) args = parser.parse_args(argv) try: + output = resolve_release_path(args.output) if args.docs is not None: if args.platform is not None or args.build is not None or args.version is not None or args.revision is not None: parser.error("--docs cannot be combined with --platform, --build, --version or --revision") - collect_docs(args.docs, args.output) + collect_docs(resolve_release_path(args.docs), output) elif args.platform == "headers": if args.version is None or args.build is not None or args.revision is not None: parser.error("--platform headers requires --version and does not accept --build or --revision") - package_headers.package(ROOT, args.output, args.version) + package_headers.package(ROOT, output, args.version) else: if args.platform is None or args.build is None or args.version is None: parser.error("--platform, --build and --version are required when --docs is not specified") + build = resolve_release_path(args.build) if args.platform == "web": if args.revision is None: parser.error("--revision is required for --platform web") - package_web(args.build, args.output, args.version, args.revision) + package_web(build, output, args.version, args.revision) else: if args.revision is not None: parser.error("--revision requires --platform web") - package(args.platform, args.build, args.output, args.version) + package(args.platform, build, output, args.version) except (RuntimeError, ValueError, OSError) as error: parser.error(str(error)) return 0 diff --git a/tools/pe_symbol_inventory.py b/tools/pe_symbol_inventory.py new file mode 100644 index 0000000000..f7c78d47b9 --- /dev/null +++ b/tools/pe_symbol_inventory.py @@ -0,0 +1,29 @@ +import argparse +import json +import sys +from pathlib import Path +import struct + +from symbolize_samples import PeModule + + +def main(argv=None): + for stream in (sys.stdout, sys.stderr): + if hasattr(stream, "reconfigure"): + stream.reconfigure(encoding="utf-8", errors="backslashreplace") + parser = argparse.ArgumentParser(description="Inventory the existing sampler parser's PE code symbols and identity metadata without reading samples") + parser.add_argument("module", type=Path) + args = parser.parse_args(argv) + try: + module = PeModule(args.module) + code = [{"rva": start, "end": end, "symbols": [{"rva": address, "name": name} + for address, name in zip(addresses, names)]} for start, end, addresses, names in module.code] + except (OSError, ValueError, struct.error) as error: + parser.error(str(error)) + print(json.dumps({"image_base": module.image_base, "size": module.size, "timestamp": module.timestamp, + "symbol_source": "exports" if module.exported else "coff", "code": code}, ensure_ascii=False, indent=2)) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tools/performance_compare.py b/tools/performance_compare.py index 99a92b64f5..f35b31246e 100644 --- a/tools/performance_compare.py +++ b/tools/performance_compare.py @@ -67,6 +67,11 @@ def validate(summary): if values != sorted(values): raise ValueError("frame_ms must satisfy p50 <= p90 <= p99 <= max") number(summary.get("gpu_busy_ms_per_present"), "gpu_busy_ms_per_present") + workers = summary.get("worker_busy_pct") + if not isinstance(workers, dict): + raise ValueError("worker_busy_pct must be an object") + for name, value in workers.items(): + number(value, f"worker_busy_pct.{name}") phases = summary.get("top_phases_ms_per_frame") if not isinstance(phases, dict): raise ValueError("top_phases_ms_per_frame must be an object") @@ -75,6 +80,15 @@ def validate(summary): return summary +def unique_json_object(pairs): + result = {} + for name, value in pairs: + if name in result: + raise ValueError(f"duplicate JSON field: {name!r}") + result[name] = value + return result + + def load_summary(path, trace=None): records = [] with Path(path).open(encoding="utf-8-sig") as source: @@ -82,7 +96,7 @@ def load_summary(path, trace=None): if not line.strip(): continue try: - record = json.loads(line) + record = json.loads(line, object_pairs_hook=unique_json_object) if not isinstance(record, dict): raise ValueError("summary must be an object") except (ValueError, RecursionError) as error: diff --git a/tools/performance_csv.py b/tools/performance_csv.py index ef4016296e..3e079a5827 100644 --- a/tools/performance_csv.py +++ b/tools/performance_csv.py @@ -7,6 +7,14 @@ from pathlib import Path import performance_compare +def configuration_cell(value): + if value is None: + return "<missing>" + if isinstance(value, str) and (value == "<missing>" or value.startswith("\\")): + return "\\" + value + return value + + def render_csv(report): output = io.StringIO(newline="") writer = csv.writer(output) @@ -19,7 +27,8 @@ def render_csv(report): for name, values in report[key].items(): writer.writerow((kind, name, unit, *(values[field] for field in ("baseline", "candidate", "change", "change_pct")))) for name, values in report["configuration_differences"].items(): - writer.writerow(("configuration", name, "", values["baseline"], values["candidate"], "", "")) + writer.writerow(("configuration", name, "", configuration_cell(values["baseline"]), + configuration_cell(values["candidate"]), "", "")) for note in report["notes"]: writer.writerow(("note", note, "", "", "", "", "")) return output.getvalue() diff --git a/tools/pr_overlap.py b/tools/pr_overlap.py index e6771c8831..e7c624df1d 100644 --- a/tools/pr_overlap.py +++ b/tools/pr_overlap.py @@ -38,7 +38,18 @@ def git(*args): for index in range(separator + 1, len(args)): pathspec = args[index] if pathspec.startswith(("../", "..\\")): - absolute = (cwd / pathspec).resolve() + absolute = cwd / pathspec + try: + absolute = absolute.resolve() + except RuntimeError as error: + raise ValueError(f"cannot resolve path {pathspec!r}: {error}") from error + except OSError as error: + raise ValueError(f"cannot resolve path {pathspec!r}: {error}") from error + if absolute.is_symlink(): + try: + absolute.stat() + except OSError as error: + raise ValueError(f"cannot resolve path {pathspec!r}: {error}") from error try: args[index] = absolute.relative_to(Path(root)).as_posix() except ValueError: @@ -529,6 +540,10 @@ def write_reports(out, rows, blob, main_exports=None): (out / f"{number}.md").write_text(report(found, blob, main_exports.get(number)), encoding="utf-8") +def unverified_overlaps(rows): + return {number: set(found["uncompared"]) for number, found in rows.items() if found.get("uncompared")} + + def main_export_findings(prs, current_exports): findings = {} for number, pr in prs.items(): @@ -591,6 +606,12 @@ def main(argv=None): raise SystemExit(f"pr_overlap: {error}") if args.branch: print(report(rows[0], blob, main_exports.get(0)) or "No overlap with open pull requests.", end="") + unresolved = unverified_overlaps(rows[0]) + if unresolved: + for number, files in sorted(unresolved.items()): + progress(f"cannot confirm overlap with PR {number}: {', '.join(sorted(files))}") + progress("overlap check failed closed; manually compare every reported PR branch before opening this one") + return 2 return 0 write_reports(args.out, rows, blob, main_exports) return 0 diff --git a/tools/progress.py b/tools/progress.py index 4910d566d0..a1b4ab6a8c 100644 --- a/tools/progress.py +++ b/tools/progress.py @@ -236,13 +236,14 @@ def collect_shaders(): opcodes = [o for o in re.findall(r"^\s*([A-Z]\w*)\s*[,=]", enum, re.M) if o not in OPCODE_SENTINELS] supported, extra = set(), [] for opcode in opcodes: - supported.update(name for name in OPCODE_VARIANTS.get(opcode, ()) if name in isa) + variants = [name for name in OPCODE_VARIANTS.get(opcode, ()) if name in isa] + supported.update(variants) name = OPCODE_ALIASES.get(opcode) or by_camel.get(opcode) if name in isa: supported.add(name) if name.startswith("FLAT_"): supported.update(n for n in (s + name.removeprefix("FLAT_") for s in FLAT_SEGMENTS) if n in isa) - else: + elif not variants: extra.append(opcode) groups = {} for name, encoding in isa.items(): diff --git a/tools/public_headers_manifest.py b/tools/public_headers_manifest.py new file mode 100644 index 0000000000..c81070c2ae --- /dev/null +++ b/tools/public_headers_manifest.py @@ -0,0 +1,37 @@ +import argparse +import hashlib +import json +import sys +from pathlib import Path + +from package_headers import public_headers + + +def main(argv=None): + for stream in (sys.stdout, sys.stderr): + if hasattr(stream, "reconfigure"): + stream.reconfigure(encoding="utf-8", errors="backslashreplace") + parser = argparse.ArgumentParser(description="Inventory the public header package inputs and content hashes without creating archives") + parser.add_argument("--root", type=Path, default=Path(__file__).resolve().parent.parent) + args = parser.parse_args(argv) + try: + root = args.root.resolve() + libs = root / "core/libs" + headers = public_headers(root) + license_file = root / "LICENSE" + if not license_file.is_file() or license_file.stat().st_size == 0: + raise ValueError("Missing project license") + inputs = [(path, "include/anyps5/" + path.relative_to(libs).as_posix()) for path in headers] + inputs.append((license_file, "LICENSE")) + entries = [] + for path, destination in sorted(inputs, key=lambda entry: entry[1]): + data = path.read_bytes() + entries.append({"path": destination, "size": len(data), "sha256": hashlib.sha256(data).hexdigest()}) + except (OSError, ValueError, RuntimeError) as error: + parser.error(str(error)) + print(json.dumps({"headers": len(headers), "entries": entries}, ensure_ascii=False, indent=2)) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tools/requirements-run-report.txt b/tools/requirements-run-report.txt new file mode 100644 index 0000000000..a37c210156 --- /dev/null +++ b/tools/requirements-run-report.txt @@ -0,0 +1,5 @@ +jsonschema==4.23.0 +jsonschema-specifications==2025.9.1 +referencing==0.37.0 +rpds-py==2026.9.1 +attrs==26.1.0 diff --git a/tools/run_job_manager_reference.py b/tools/run_job_manager_reference.py index 627a51e762..a70f762c81 100644 --- a/tools/run_job_manager_reference.py +++ b/tools/run_job_manager_reference.py @@ -20,6 +20,28 @@ CASES = ("memory", "owned_state", "concurrent_wait", "validation", "dispatch", " PARITY_CASES = tuple(case for case in CASES if case not in ("node_pool", "worker_wait")) +def resolve_cli_path(path): + path = Path(path) + try: + resolved = Path(os.path.realpath(path)) + except OSError as error: + raise ValueError(str(error)) from error + if resolved.is_symlink(): + try: + resolved.stat() + except OSError as error: + raise ValueError(f"{path}: path is a symbolic link loop: {error}") from error + raise ValueError(f"{path}: path is a symbolic link loop") + return resolved + + +def resolve_existing_cli_path(path): + resolved = resolve_cli_path(path) + if not resolved.exists(): + raise FileNotFoundError(2, "No such file or directory", str(resolved)) + return resolved + + def stage_libraries(directory, build, toolchain, dependencies): providers = {path.name.lower(): path for path in (build / "core/libs/libs").glob("*.prx")} if toolchain is not None: @@ -112,6 +134,9 @@ def run(args, directory): def main(): + for stream in (sys.stdout, sys.stderr): + if hasattr(stream, "reconfigure"): + stream.reconfigure(encoding="utf-8", errors="backslashreplace") parser = argparse.ArgumentParser(description="Run the CPU JobManager fixtures through native relinker startup using an owned module or the host fallback.") provider = parser.add_mutually_exclusive_group(required=True) provider.add_argument("--module", type=Path, help="Owned decrypted SELF or ELF libSceJobManager.prx") @@ -138,13 +163,13 @@ def main(): for name in ("build", "relinker", "toolchain", "module"): value = getattr(args, name) if value is not None: - setattr(args, name, value.resolve(strict=True)) - directory = args.output.resolve() if args.output else Path(tempfile.mkdtemp(prefix="anyps5-jobmanager-")) + setattr(args, name, resolve_existing_cli_path(value)) + directory = resolve_cli_path(args.output) if args.output else Path(tempfile.mkdtemp(prefix="anyps5-jobmanager-")) if args.output: directory.mkdir(parents=True, exist_ok=False) print(f"Artifacts: {directory}", flush=True) return run(args, directory) - except (AuditError, OSError, Refused, RuntimeError, subprocess.SubprocessError) as error: + except (AuditError, OSError, Refused, RuntimeError, ValueError, subprocess.SubprocessError) as error: print(str(error), file=sys.stderr) if isinstance(error, subprocess.CalledProcessError) and error.stderr: print(error.stderr.decode(errors="replace"), file=sys.stderr) diff --git a/tools/select_tests.py b/tools/select_tests.py index 55db68db2c..e9dcde1b50 100644 --- a/tools/select_tests.py +++ b/tools/select_tests.py @@ -162,6 +162,24 @@ def changed_paths(path): return [line.strip() for line in text.splitlines() if line.strip()] +def dependency_path(data, base): + try: + text = data.decode("utf-8") + except UnicodeDecodeError: + if sys.platform != "win32": + raise + return data.decode("mbcs") + if sys.platform != "win32": + return text + try: + ansi = data.decode("mbcs") + except UnicodeDecodeError: + return text + if ansi != text and os.path.exists(os.path.join(base, ansi)) and not os.path.exists(os.path.join(base, text)): + return ansi + return text + + def chunks(names): batch, size = [], 0 for name in names: @@ -205,7 +223,7 @@ def dump(build, out): if not line.startswith(b" ") and b": #deps" in line: current = build.key(line.split(b": #deps")[0].decode(build.encoding)) elif line.strip() and current: - path = build.repo(line.strip().decode("utf-8")) + path = build.repo(dependency_path(line.strip(), build.path)) if path: deps[current].add(path) listing, listed = build.tests() diff --git a/tools/stubgen.py b/tools/stubgen.py index 8558fa9c13..2bcd5b3d83 100644 --- a/tools/stubgen.py +++ b/tools/stubgen.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 import argparse +import errno import os import re import stat @@ -8,9 +9,9 @@ import tempfile from pathlib import Path try: - from tools.nid_names import CHARSET, SUFFIX, compute_nid + from tools.nid_names import SUFFIX, compute_nid except ImportError: - from nid_names import CHARSET, SUFFIX, compute_nid + from nid_names import SUFFIX, compute_nid def strip_nid_token(raw): @@ -195,14 +196,22 @@ def case_insensitive_directory(directory): os.unlink(name) +LOOP_MESSAGE = "Too many levels of symbolic links" + + def resolved_path(path): - path = Path(path) + original = path = Path(path) for _ in range(40): if not path.is_symlink(): break target = Path(link_target(os.readlink(path))) path = target if target.is_absolute() else path.parent / target - return path.resolve() + if path.is_symlink(): + raise OSError(errno.ELOOP, LOOP_MESSAGE, str(original)) + try: + return path.resolve() + except RuntimeError as error: + raise OSError(errno.ELOOP, LOOP_MESSAGE, str(original)) from error def link_target(text): diff --git a/tools/symbolize_samples.py b/tools/symbolize_samples.py index 23a9784fd4..73534b8c81 100644 --- a/tools/symbolize_samples.py +++ b/tools/symbolize_samples.py @@ -1,6 +1,7 @@ import argparse import bisect import collections +import os import shutil import struct import subprocess @@ -15,6 +16,7 @@ table when it has none, and names every frame module!function. The '# module name size timestamp' header lines the samplers write are compared with the SizeOfImage and TimeDateStamp of the file that is found; a module whose file does not match is left unsymbolized, since its addresses would name the wrong functions. +If two loaded modules share a name, their frames stay unsymbolized because the samples cannot distinguish them. The sampler rewrites its files every 20 s with totals since start-up. --since takes an earlier copy of the same file and subtracts it, which keeps only the samples taken between the two copies (a steady-state window). @@ -111,7 +113,7 @@ class PeModule: def export_symbols(self, data, rva, size): directory = self.offset(rva) - _, names, function_rva, name_rva, ordinal_rva = struct.unpack_from("<IIIII", data, directory + 20) + functions, names, function_rva, name_rva, ordinal_rva = struct.unpack_from("<IIIII", data, directory + 20) function_table = self.offset(function_rva) result = [] if names: @@ -119,6 +121,8 @@ class PeModule: ordinal_table = self.offset(ordinal_rva) for index in range(names): ordinal = struct.unpack_from("<H", data, ordinal_table + index * 2)[0] + if ordinal >= functions: + raise ValueError("PE export ordinal is outside the export address table") address = struct.unpack_from("<I", data, function_table + ordinal * 4)[0] if rva <= address < rva + size: continue @@ -141,7 +145,7 @@ class Symbolizer: for path in Path(directory).iterdir(): if path.is_file(): self.files.setdefault(path.name.lower(), {}).setdefault(path.resolve(), path) - self.headers = headers + self.headers = {name.lower(): identity for name, identity in headers.items()} self.modules = {} self.demangle = demangle and shutil.which("c++filt") is not None self.demangled = {} @@ -152,7 +156,7 @@ class Symbolizer: paths = list(self.files.get(name.lower(), {}).values()) if len(paths) <= 1: return paths[0] if paths else None - identity = self.headers.get(name) + identity = self.headers.get(name.lower()) if identity is None and not self.unverified: self.warn(f"{name}: the samples have no '# module' record; multiple candidates stay unsymbolized") return None @@ -177,17 +181,21 @@ class Symbolizer: if name in self.modules: return self.modules[name] module = None + if self.headers.get(name.lower()) is False: + self.warn(f"{name}: multiple sampled modules share this name, so their frames stay unsymbolized") + self.modules[name] = None + return None path = self.candidate_path(name) if path is not None: try: module = PeModule(path) except (OSError, ValueError, struct.error) as error: self.warn(f"{name}: {error}") - if module is not None and name not in self.headers and not self.unverified: + if module is not None and name.lower() not in self.headers and not self.unverified: self.warn(f"{name}: the samples have no '# module' record for it, so {path} may be another build; its frames stay unsymbolized (--unverified symbolizes them anyway)") module = None - if module is not None and name in self.headers and self.headers[name] != (module.size, module.timestamp): - size, timestamp = self.headers[name] + if module is not None and name.lower() in self.headers and self.headers[name.lower()] != (module.size, module.timestamp): + size, timestamp = self.headers[name.lower()] self.warn(f"{name}: the sampled module had size {size:#x} and timestamp {timestamp:#x}, but {path} has {module.size:#x} and {module.timestamp:#x}; its frames stay unsymbolized") module = None self.modules[name] = module @@ -224,7 +232,9 @@ def read_headers(lines): for line in lines: parts = line.split() if len(parts) == 5 and parts[:2] == ["#", "module"]: - headers[parts[2]] = (int(parts[3], 16), int(parts[4], 16)) + name = parts[2].lower() + identity = (int(parts[3], 16), int(parts[4], 16)) + headers[name] = False if name in headers else identity return headers @@ -308,6 +318,9 @@ def summarize(symbolizer, samples, top): def main(argv=None): + for stream in (sys.stdout, sys.stderr): + if hasattr(stream, "reconfigure"): + stream.reconfigure(encoding="utf-8", errors="backslashreplace") parser = argparse.ArgumentParser(description=DESCRIPTION, formatter_class=argparse.RawDescriptionHelpFormatter) parser.add_argument("samples", help="collapsed-stack file or address file written by a Windows sampler") parser.add_argument("--libs", action="append", required=True, help="directory holding the modules that ran (repeatable)") @@ -330,7 +343,7 @@ def symbolize(parser, args): for source in (args.samples, args.since): if source is not None: source = Path(source) - if source.resolve() == output.resolve() or (source.exists() and output.exists() and source.samefile(output)): + if os.path.realpath(source) == os.path.realpath(output) or (source.exists() and output.exists() and source.samefile(output)): parser.error("symbolized output must be separate from the sample captures") samples = load(args.samples, args.thread) if args.since: @@ -346,7 +359,7 @@ def symbolize(parser, args): module_output_alias = False for directory in args.libs: for source in Path(directory).iterdir(): - if not source.is_file() or not (source.resolve() == output.resolve() or + if not source.is_file() or not (os.path.realpath(source) == os.path.realpath(output) or (source.exists() and output.exists() and source.samefile(output))): continue if source.name.lower() in referenced_modules or source.suffix.lower() in (".prx", ".dll", ".exe"): diff --git a/tools/test_web.py b/tools/test_web.py index 73b2b35e5b..5c7b1553b3 100644 --- a/tools/test_web.py +++ b/tools/test_web.py @@ -22,7 +22,8 @@ def main(argv=None): parser = argparse.ArgumentParser() parser.add_argument("--build", type=Path, required=True) args = parser.parse_args(argv) - archive = args.build / "web/archive.mjs" + build = Path(os.path.realpath(args.build)) + archive = build / "web/archive.mjs" if not archive.is_file(): parser.error(f"archive module does not exist: {archive}") try: @@ -42,10 +43,11 @@ def main(argv=None): with urllib.request.urlopen(url, timeout=30) as response: library.write_bytes(response.read()) environment = dict(os.environ, ANYPS5_TEST_ZIP_URL=url, ANYPS5_TEST_ZIP_PATH=library.as_uri()) - subprocess.run(["node", str(ROOT / "demo/web/tests/archive-root.test.mjs"), str(args.build.resolve() / "web")], env=environment, check=True) - subprocess.run(["node", str(ROOT / "demo/web/tests/archive-windows.test.mjs"), str(args.build.resolve() / "web")], env=environment, check=True) - subprocess.run(["node", str(ROOT / "demo/web/tests/archive-reserved.test.mjs"), str(args.build.resolve() / "web")], env=environment, check=True) - subprocess.run(["node", str(ROOT / "demo/web/tests/archive.test.mjs"), str(args.build.resolve() / "web"), str(fixture)], env=environment, check=True) + web = str(build / "web") + subprocess.run(["node", str(ROOT / "demo/web/tests/archive-root.test.mjs"), web], env=environment, check=True) + subprocess.run(["node", str(ROOT / "demo/web/tests/archive-windows.test.mjs"), web], env=environment, check=True) + subprocess.run(["node", str(ROOT / "demo/web/tests/archive-reserved.test.mjs"), web], env=environment, check=True) + subprocess.run(["node", str(ROOT / "demo/web/tests/archive.test.mjs"), web, str(fixture)], env=environment, check=True) except (subprocess.CalledProcessError, urllib.error.URLError, OSError, UnicodeDecodeError) as error: parser.error(str(error)) return 0 diff --git a/tools/tests/test_agc_test_split.py b/tools/tests/test_agc_test_split.py new file mode 100644 index 0000000000..2ca20691ce --- /dev/null +++ b/tools/tests/test_agc_test_split.py @@ -0,0 +1,260 @@ +import shutil +import subprocess +import sys +import tempfile +import unittest +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parents[1])) +import agc_test_split + +TOOL = Path(__file__).resolve().parents[1] / "agc_test_split.py" +LISTS = agc_test_split.LISTS +EXECUTION = ["agc_driver_image_tests"] +FRAGMENTS = agc_test_split.FRAGMENTS + +ALPHA = """ add_test_executable(agc_alpha_tests tests/Alpha.cpp) + target_link_libraries(agc_alpha_tests PRIVATE libc) + add_test(NAME agc_alpha COMMAND agc_alpha_tests) + set_tests_properties(agc_alpha PROPERTIES TIMEOUT 20) +""" +BETA = """ add_test_executable(agc_beta_tests tests/Beta.cpp) + foreach(mode IN ITEMS one two) + add_test(NAME agc_beta_${mode} COMMAND agc_beta_tests ${mode}) + endforeach() + if(WIN32) + set_tests_properties(agc_beta_one agc_beta_two PROPERTIES TIMEOUT 40) + endif() +""" +DELTA = """ add_test_executable(agc_delta_tests tests/Delta.cpp) + add_test(NAME agc_delta COMMAND agc_delta_tests) +""" + + +def original(blocks=(ALPHA, BETA), items="agc_gamma_tests", tweaks="", image=True, library="Export.cpp"): + image_case = (" if(agcTestName STREQUAL \"agc_driver_image\")\n" + " set_tests_properties(${agcTestName} PROPERTIES TIMEOUT 30)\n" + " endif()\n") if image else "" + image_tweak = " set_tests_properties(agc_driver_image PROPERTIES SKIP_RETURN_CODE 77)\n" if image else "" + return (f"add_library(libSceAgcDriver SHARED EXCLUDE_FROM_ALL {library})\n\n" + "if(BUILD_TESTING)\n" + "\n".join(blocks) + "endif()\n\n" + "add_test_executable(agc_gamma_tests EXCLUDE_FROM_ALL tests/Gamma.cpp)\n" + "target_link_libraries(agc_gamma_tests PRIVATE libc)\n\n" + "file(GLOB agcExecutionTestSources CONFIGURE_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/tests/execution/*.cpp)\n" + "set(agcExecutionTests)\n" + "foreach(agcExecutionTestSource IN LISTS agcExecutionTestSources)\n" + " get_filename_component(agcExecutionTestName ${agcExecutionTestSource} NAME_WE)\n" + " string(TOLOWER \"agc_driver_${agcExecutionTestName}_tests\" agcExecutionTest)\n" + " add_test_executable(${agcExecutionTest} EXCLUDE_FROM_ALL ${agcExecutionTestSource})\n" + " list(APPEND agcExecutionTests ${agcExecutionTest})\n" + "endforeach()\n" + "if(BUILD_TESTING)\n" + f" foreach(agcTest IN ITEMS {items} ${{agcExecutionTests}})\n" + " if(agcTest STREQUAL \"agc_driver_skipped_tests\")\n" + " continue()\n" + " endif()\n" + " string(REGEX REPLACE \"_tests$\" \"\" agcTestName \"${agcTest}\")\n" + " set_target_properties(${agcTest} PROPERTIES EXCLUDE_FROM_ALL OFF)\n" + " add_test(NAME ${agcTestName} COMMAND ${agcTest})\n" + image_case + + " endforeach()\n" + image_tweak + tweaks + + "endif()\n\n" + "if(BUILD_TESTING)\n" + " get_directory_property(agcRegisteredTests TESTS)\n" + " set_property(TEST ${agcRegisteredTests} APPEND PROPERTY ENVIRONMENT \"X=1\")\n" + "endif()\n") + + +class SplitTextTests(unittest.TestCase): + def test_refactor_registers_default_tests_through_a_function(self): + text = agc_test_split.refactor(original()) + self.assertIn("function(agc_add_default_test agcTest)", text) + self.assertIn(" agc_add_default_test(agc_gamma_tests)\n", text) + self.assertIn(" set_tests_properties(agc_driver_image PROPERTIES TIMEOUT 30)\n", text) + self.assertIn(" agc_add_default_test(${agcTest})\n", text) + self.assertNotIn("${agcExecutionTests})", text) + self.assertLess(text.index("function(agc_add_default_test"), text.index("agc_add_default_test(agc_gamma_tests)")) + self.assertEqual(agc_test_split.refactor(text), text) + + def test_split_writes_one_fragment_per_test_executable(self): + lists, fragments = agc_test_split.migrated(original(), EXECUTION) + self.assertEqual(sorted(fragments), ["agc_alpha_tests", "agc_beta_tests", "agc_driver_image_tests", "agc_gamma_tests"]) + self.assertEqual(fragments["agc_alpha_tests"], "if(BUILD_TESTING)\n" + ALPHA + "endif()\n") + self.assertEqual(fragments["agc_beta_tests"], "if(BUILD_TESTING)\n" + BETA + "endif()\n") + self.assertEqual(fragments["agc_driver_image_tests"], + "if(BUILD_TESTING)\n set_tests_properties(agc_driver_image PROPERTIES TIMEOUT 30)\n" + " set_tests_properties(agc_driver_image PROPERTIES SKIP_RETURN_CODE 77)\nendif()\n") + self.assertIn("agc_add_default_test(agc_gamma_tests)", fragments["agc_gamma_tests"]) + self.assertNotIn("agc_alpha", lists) + include = lists.index(agc_test_split.INCLUDE[0]) + self.assertLess(lists.index("agc_add_default_test(${agcTest})"), include) + self.assertLess(include, lists.index("get_directory_property(agcRegisteredTests TESTS)")) + + def test_split_keeps_a_loop_over_several_executables(self): + tweaks = (" foreach(agcTest IN ITEMS agc_alpha_tests agc_gamma_tests)\n" + " set_target_properties(${agcTest} PROPERTIES FOLDER tests)\n" + " endforeach()\n") + lists, fragments = agc_test_split.migrated(original(tweaks=tweaks), EXECUTION) + self.assertIn("foreach(agcTest IN ITEMS agc_alpha_tests agc_gamma_tests)", lists) + self.assertLess(lists.index(agc_test_split.INCLUDE[0]), lists.index("foreach(agcTest IN ITEMS agc_alpha_tests")) + + def test_split_moves_a_loop_over_computed_test_names_with_their_executable(self): + pattern = (" foreach(betaCase IN ITEMS one:1 two:2)\n" + " string(REGEX REPLACE \"^([a-z]+):.*$\" \"\\\\1\" betaName \"${betaCase}\")\n" + " set_tests_properties(agc_beta_${betaName} PROPERTIES LABELS beta)\n" + " endforeach()\n") + lists, fragments = agc_test_split.migrated(original(blocks=(ALPHA, BETA, pattern)), EXECUTION) + self.assertIn("agc_beta_${betaName}", fragments["agc_beta_tests"]) + self.assertNotIn("agc_beta_${betaName}", lists) + + def test_split_moves_a_loop_that_sets_properties_on_the_tests_it_adds(self): + state = (" add_test_executable(agc_beta_state_tests tests/BetaState.cpp)\n" + " set(betaModes three four)\n" + " foreach(mode IN LISTS betaModes)\n" + " add_test(NAME agc_beta_${mode} COMMAND agc_beta_state_tests ${mode})\n" + " set_tests_properties(agc_beta_${mode} PROPERTIES TIMEOUT 9)\n" + " endforeach()\n") + lists, fragments = agc_test_split.migrated(original(blocks=(ALPHA, BETA, state)), EXECUTION) + self.assertIn("set_tests_properties(agc_beta_${mode} PROPERTIES TIMEOUT 9)", fragments["agc_beta_state_tests"]) + self.assertNotIn("betaModes", lists) + + def test_split_refuses_a_computed_test_name_several_executables_match(self): + pattern = (" foreach(agcCase IN ITEMS alpha beta_one)\n" + " set_tests_properties(agc_${agcCase} PROPERTIES LABELS agc)\n" + " endforeach()\n") + with self.assertRaises(agc_test_split.SplitError): + agc_test_split.migrated(original(blocks=(ALPHA, BETA, pattern)), EXECUTION) + + def test_split_refuses_when_no_single_place_fits(self): + text = original().replace("add_library(libSceAgcDriver SHARED EXCLUDE_FROM_ALL Export.cpp)\n", + "add_library(libSceAgcDriver SHARED EXCLUDE_FROM_ALL Export.cpp)\n" + "add_dependencies(libSceAgcDriver agc_alpha_tests)\n") + text = text.replace("add_test_executable(agc_alpha_tests tests/Alpha.cpp)", + "add_test_executable(agc_alpha_tests tests/Alpha.cpp ${agcLateSource})") + text = text.replace("if(BUILD_TESTING)\n get_directory_property", + "set(agcLateSource Late.cpp)\nif(BUILD_TESTING)\n get_directory_property") + with self.assertRaises(agc_test_split.SplitError): + agc_test_split.migrated(text, EXECUTION) + + +class ResolveTests(unittest.TestCase): + def setUp(self): + self.root = Path(tempfile.mkdtemp()) + self.git("init", "-q", "-b", "main") + self.write(LISTS, original()) + self.write(agc_test_split.EXECUTION + "/Image.cpp", "") + self.commit("build: register tests") + + def tearDown(self): + shutil.rmtree(self.root, ignore_errors=True) + + def git(self, *args, check=True): + return subprocess.run(["git", "-c", "user.name=Split Test", "-c", "user.email=test@example.com", "-c", "commit.gpgsign=false", + "-c", "core.editor=true", *args], cwd=self.root, capture_output=True, text=True, check=check) + + def write(self, path, text): + (self.root / path).parent.mkdir(parents=True, exist_ok=True) + (self.root / path).write_text(text, encoding="utf-8") + + def read(self, path): + return (self.root / path).read_text(encoding="utf-8") + + def tool(self, command): + return subprocess.run([sys.executable, str(TOOL), command], cwd=self.root, capture_output=True, text=True, timeout=60) + + def commit(self, message): + self.git("add", "-A") + self.git("commit", "-qm", message) + + def rebase(self, change, after_split=None, delete=()): + self.git("checkout", "-qb", "change") + self.write(LISTS, change) + for path in delete: + (self.root / path).unlink() + self.commit("test(agc): change tests") + self.git("checkout", "-q", "main") + result = self.tool("split") + self.assertEqual(result.returncode, 0, result.stderr) + self.commit("build(agc): split test registrations") + if after_split: + after_split() + self.commit("test(agc): change a fragment") + self.git("checkout", "-q", "change") + self.assertNotEqual(self.git("rebase", "main", check=False).returncode, 0) + return self.tool("resolve") + + def test_resolve_moves_a_new_test_executable_into_its_own_fragment(self): + result = self.rebase(original(blocks=(ALPHA, BETA, DELTA))) + self.assertEqual(result.returncode, 0, result.stdout + result.stderr) + self.assertEqual(result.stdout.split(), [LISTS, f"{FRAGMENTS}/agc_delta_tests.cmake"]) + self.assertEqual(self.git("diff", "--name-only", "--diff-filter=U").stdout, "") + self.git("rebase", "--continue") + self.assertEqual(self.read(f"{FRAGMENTS}/agc_delta_tests.cmake"), "if(BUILD_TESTING)\n" + DELTA + "endif()\n") + self.assertEqual(self.read(LISTS), self.git("show", "main:" + LISTS).stdout) + + def test_resolve_applies_an_edit_and_a_default_test_to_their_fragments(self): + change = original(blocks=(ALPHA.replace("TIMEOUT 20", "TIMEOUT 25"), BETA, DELTA), items="agc_gamma_tests agc_delta_tests") + result = self.rebase(change) + self.assertEqual(result.returncode, 0, result.stdout + result.stderr) + self.git("rebase", "--continue") + self.assertIn("TIMEOUT 25", self.read(f"{FRAGMENTS}/agc_alpha_tests.cmake")) + self.assertIn("agc_add_default_test(agc_delta_tests)", self.read(f"{FRAGMENTS}/agc_delta_tests.cmake")) + self.assertEqual(self.read(LISTS), self.git("show", "main:" + LISTS).stdout) + + def test_resolve_merges_with_a_fragment_changed_after_the_split(self): + def later(): + path = f"{FRAGMENTS}/agc_alpha_tests.cmake" + self.write(path, self.read(path).replace("PRIVATE libc", "PRIVATE libc libkernel")) + + result = self.rebase(original(blocks=(ALPHA.replace("TIMEOUT 20", "TIMEOUT 25"), BETA)), later) + self.assertEqual(result.returncode, 0, result.stdout + result.stderr) + alpha = self.read(f"{FRAGMENTS}/agc_alpha_tests.cmake") + self.assertIn("PRIVATE libc libkernel", alpha) + self.assertIn("TIMEOUT 25", alpha) + + def test_resolve_leaves_markers_where_both_sides_changed_a_line(self): + def later(): + path = f"{FRAGMENTS}/agc_alpha_tests.cmake" + self.write(path, self.read(path).replace("TIMEOUT 20", "TIMEOUT 60")) + + result = self.rebase(original(blocks=(ALPHA.replace("TIMEOUT 20", "TIMEOUT 25"), BETA)), later) + self.assertNotEqual(result.returncode, 0) + self.assertIn("agc_alpha_tests.cmake", result.stderr) + self.assertIn("<<<<<<<", self.read(f"{FRAGMENTS}/agc_alpha_tests.cmake")) + + def test_resolve_removes_the_fragment_of_a_deleted_execution_test(self): + result = self.rebase(original(image=False), delete=[agc_test_split.EXECUTION + "/Image.cpp"]) + self.assertEqual(result.returncode, 0, result.stdout + result.stderr) + self.assertIn(f"{FRAGMENTS}/agc_driver_image_tests.cmake", result.stdout.split()) + self.assertEqual(self.git("diff", "--name-only", "--diff-filter=U").stdout, "") + self.git("rebase", "--continue") + self.assertFalse((self.root / FRAGMENTS / "agc_driver_image_tests.cmake").exists()) + self.assertNotIn("agc_driver_image", self.read(LISTS)) + + def test_resolve_stages_nothing_when_every_file_conflicts(self): + def later(): + path = f"{FRAGMENTS}/agc_alpha_tests.cmake" + self.write(path, self.read(path).replace("TIMEOUT 20", "TIMEOUT 60")) + self.write(LISTS, self.read(LISTS).replace("Export.cpp", "Main.cpp")) + + change = original(blocks=(ALPHA.replace("TIMEOUT 20", "TIMEOUT 25"), BETA), library="Library.cpp") + result = self.rebase(change, later) + self.assertNotEqual(result.returncode, 0) + self.assertIn(LISTS, result.stderr) + self.assertNotEqual(self.git("ls-files", "-u", "--", LISTS).stdout, "") + self.assertEqual(self.git("diff", "--cached", "--name-only", "--diff-filter=ACDMR").stdout, "") + self.assertIn("<<<<<<<", self.read(LISTS)) + + def test_resolve_needs_a_conflict(self): + result = self.tool("resolve") + self.assertNotEqual(result.returncode, 0) + self.assertIn("not in a three-way conflict", result.stderr) + + def test_split_refuses_a_second_run(self): + self.assertEqual(self.tool("split").returncode, 0) + result = self.tool("split") + self.assertNotEqual(result.returncode, 0) + self.assertIn("already includes", result.stderr) + + +if __name__ == "__main__": + unittest.main() diff --git a/tools/tests/test_annotate_module.py b/tools/tests/test_annotate_module.py index 4ae356bdb9..ff5dad9653 100644 --- a/tools/tests/test_annotate_module.py +++ b/tools/tests/test_annotate_module.py @@ -93,7 +93,7 @@ def build_module(tags=DEFAULT_TAGS, values=None, symbols=DEFAULT_SYMBOLS, reloca def instruction(listing, mnemonic): - pattern = re.compile(r"^\s*[0-9a-f]+:\s+(?:\w+\s+)?%s\b" % mnemonic) + pattern = re.compile(r"^\s*[0-9a-f]+:\s+(?:\w+\s+)*%sq?\b" % mnemonic) return next(line for line in listing if pattern.search(line)) @@ -104,6 +104,14 @@ def with_relocation(module, table_offset, index, slot, symbol_index, kind): class ImportRelocationTests(unittest.TestCase): + def test_symbol_entry_size_must_match_elf64(self): + for size in (None, 0, 16, 32): + with self.subTest(size=size): + tags = tuple(tag for tag in DEFAULT_TAGS if tag != 11 or size is not None) + data = build_module(tags=tags, values={} if size is None else {11: size}) + with self.assertRaisesRegex(annotate_module.ModuleError, "DT_SYMENT"): + annotate_module.Module(data) + def test_tables_cannot_read_file_padding_past_the_load_segment(self): for tag in (5, 6, 23): with self.subTest(tag=tag): @@ -261,6 +269,45 @@ class AnnotateModuleTests(unittest.TestCase): self.annotate(build_module(code=code_bytes(b"\xf2"))) self.assertTrue(instruction(self.read(".asm").splitlines(), "call").endswith("; -> " + IMPORT_NAME)) + def test_eip_relative_stubs_and_calls_use_wrapped_got_addresses(self): + for address in (CODE_ADDRESS, 0xFFFFF000, 0x100001000): + for prefix in (b"\x67", b"\xf2\x67", b"\x3e\x67", b"\xf2\x3e\x67"): + with self.subTest(address=address, prefix=prefix): + length = len(prefix) + 6 + code = prefix + b"\xff\x25" + struct.pack("<I", (SLOT - address - length) & 0xFFFFFFFF) + code += b"\xe8" + struct.pack("<i", -length - 5) + b"\xc3" + module = bytearray(build_module(code=code)) + struct.pack_into("<Q", module, 64 + 16, address) + summary = self.annotate(bytes(module)) + self.assertIn("1 imports, 1 exports, 0 tls, 1 stubs", summary) + listing = self.read(".asm").splitlines() + self.assertTrue(instruction(listing, "jmp").endswith("; GOT " + IMPORT_NAME)) + self.assertTrue(instruction(listing, "call").endswith("; -> " + IMPORT_NAME)) + + def test_eip_references_do_not_name_the_unwrapped_address(self): + address = 0x100001000 + for opcode in (b"\xff\x15", b"\x48\x8b\x05"): + with self.subTest(opcode=opcode): + length = 1 + len(opcode) + 4 + code = b"\x67" + opcode + struct.pack("<I", (SLOT - address - length) & 0xFFFFFFFF) + b"\xc3" + symbols = DEFAULT_SYMBOLS + [(SECOND_IMPORT_NAME, 0, 0x12, 0)] + module = bytearray(build_module(code=code, symbols=symbols, + relocations=((SLOT, 1), (0x100000000 + SLOT, 3)))) + struct.pack_into("<Q", module, 64 + 16, address) + self.annotate(bytes(module)) + line = next(line for line in self.read(".asm").splitlines() if "(%eip)" in line) + self.assertTrue(line.endswith("; GOT " + IMPORT_NAME), line) + self.assertNotIn("; GOT " + SECOND_IMPORT_NAME, self.read(".asm")) + + def test_segment_relative_operands_do_not_name_flat_import_slots(self): + for segment in (b"\x64", b"\x65"): + for address_prefix in (b"", b"\x67"): + with self.subTest(segment=segment, address_prefix=address_prefix): + summary = self.annotate(build_module(code=code_bytes(segment + address_prefix))) + self.assertIn("0 stubs", summary) + self.assertNotIn("; GOT ", self.read(".asm")) + self.assertNotIn("; -> ", self.read(".asm")) + def test_none_relocation_does_not_annotate_a_stub_or_call(self): module = with_relocation(build_module(), 0x2280, 0, SLOT, 1, 0) summary = self.annotate(module) @@ -288,6 +335,40 @@ class AnnotateModuleTests(unittest.TestCase): self.assertIn("tls+%#x %s %s\n" % (EXPORT_ADDRESS, symbol_name(TLS_NAME), TLS_NAME), self.read(".exports.txt")) self.assertNotIn("export " + TLS_NAME, self.read(".asm")) + def test_private_symbols_are_not_reported_as_exports(self): + for binding in (0, 1, 2, 10): + for visibility in (0, 1, 2, 3): + for kind in (2, 6): + with self.subTest(binding=binding, visibility=visibility, kind=kind): + symbols = [(EXPORT_NAME, 1, binding << 4 | kind, EXPORT_ADDRESS)] + module = bytearray(build_module(symbols=symbols, relocations=())) + module[0x2040 + 24 + 5] = visibility + summary = self.annotate(bytes(module)) + visible = binding != 0 and visibility in (0, 3) + expected = [] + if visible: + prefix = "tls+" if kind == 6 else "" + expected.append("%s%#x %s %s" % (prefix, EXPORT_ADDRESS, symbol_name(EXPORT_NAME), EXPORT_NAME)) + self.assertEqual(self.read(".exports.txt").splitlines(), expected) + self.assertIn("%d exports, %d tls" % (visible and kind == 2, visible and kind == 6), summary) + self.assertEqual("; ===== export " + EXPORT_NAME in self.read(".asm"), visible and kind == 2) + + def test_private_alias_does_not_hide_a_public_export(self): + for hash_kind in ("sysv", "gnu"): + for visibility in (1, 2): + with self.subTest(hash_kind=hash_kind, visibility=visibility): + symbols = DEFAULT_SYMBOLS + [(SECOND_IMPORT_NAME, 1, 0x12, EXPORT_ADDRESS)] + tags = DEFAULT_TAGS if hash_kind == "sysv" else (GNU_HASH,) + DEFAULT_TAGS[1:] + module = bytearray(build_module(symbols=symbols, tags=tags, kind=hash_kind)) + module[0x2040 + 3 * 24 + 5] = visibility + summary = self.annotate(bytes(module)) + self.assertIn("1 imports, 1 exports, 0 tls, 1 stubs", summary) + self.assertEqual(self.read(".exports.txt").splitlines(), + ["%#x %s %s" % (EXPORT_ADDRESS, symbol_name(EXPORT_NAME), EXPORT_NAME)]) + self.assertIn("; ===== export " + EXPORT_NAME, self.read(".asm")) + self.assertNotIn("; ===== export " + SECOND_IMPORT_NAME, self.read(".asm")) + self.assertIn("; -> " + IMPORT_NAME, self.read(".asm")) + def test_export_at_address_zero_is_kept(self): symbols = [(IMPORT_NAME, 0, 0x12, 0), (EXPORT_NAME, 1, 0x12, 0)] self.annotate(build_module(symbols=symbols)) @@ -339,7 +420,35 @@ class AnnotateModuleTests(unittest.TestCase): listing = self.read(".asm").splitlines() first, second = listing.index("; ===== segment 0x1000"), listing.index("; ===== segment 0x3000") self.assertLess(first, second) - self.assertTrue(any(re.match(r"^\s*3000:\s+ret\b", line) for line in listing[second:])) + self.assertTrue(any(re.match(r"^\s*3000:\s+retq?\b", line) for line in listing[second:])) + + def test_empty_executable_segments_do_not_abort_other_disassembly(self): + for memory_size in (0, 0x1000): + for address in (0, 0x3000): + with self.subTest(memory_size=memory_size, address=address): + module = bytearray(build_module(extra_code=b"")) + struct.pack_into("<Q", module, 64 + 3 * 56 + 16, address) + struct.pack_into("<Q", module, 64 + 3 * 56 + 40, memory_size) + if address == 0: + module[64:64 + 4 * 56] = module[64 + 3 * 56:64 + 4 * 56] + module[64:64 + 3 * 56] + summary = self.annotate(bytes(module)) + self.assertIn("1 imports, 1 exports, 0 tls, 1 stubs", summary) + listing = self.read(".asm") + self.assertEqual(listing.count("; ===== segment"), 1) + self.assertIn("; ===== segment 0x1000", listing) + self.assertIn("; -> " + IMPORT_NAME, listing) + self.assertIn("; ===== export " + EXPORT_NAME, listing) + + def test_only_empty_executable_segments_fail_before_writing_reports(self): + self.assert_fails(build_module(code=b"", extra_code=b"", symbols=[DEFAULT_SYMBOLS[0]]), + "no executable PT_LOAD segment with file-backed data") + for suffix in (".asm", ".imports.txt", ".exports.txt"): + self.assertFalse((self.root / ("out" + suffix)).exists()) + + def test_nonempty_executable_segment_past_end_of_file_is_still_rejected(self): + module = bytearray(build_module(extra_code=b"\xc3")) + struct.pack_into("<Q", module, 64 + 3 * 56 + 32, 2) + self.assert_fails(bytes(module), "extends past the end of the file") def test_zero_run_preserves_instructions_and_export_label(self): code = b"\x90" + bytes(16) + b"\xc3" diff --git a/tools/tests/test_audit_dump.py b/tools/tests/test_audit_dump.py index df52080316..948ec9a10d 100644 --- a/tools/tests/test_audit_dump.py +++ b/tools/tests/test_audit_dump.py @@ -1,5 +1,6 @@ import contextlib import io +import locale import os import subprocess import sys @@ -83,11 +84,48 @@ class AuditDumpTests(unittest.TestCase): code = audit_dump.main([str(argument) for argument in arguments]) return code, errors.getvalue() + def test_conversion_decodes_both_streams_as_utf8_under_a_legacy_locale(self): + message = "module-\u754c-\U0001f3ae.prx" + payload = message.encode("utf-8") + child = f"import os; os.write(1, {payload!r}); os.write(2, {payload!r})" + run = subprocess.run + + def relink(command, **options): + return run([sys.executable, "-c", child], timeout=5, **options) + + with mock.patch.object(locale, "getpreferredencoding", return_value="cp1252"), \ + mock.patch.object(locale, "getencoding", return_value="cp1252", create=True), \ + mock.patch.object(subprocess, "run", side_effect=relink): + result = audit_dump.convert(self.relinker, self.root / "source", self.root / "app.elf", [], False) + self.assertEqual(result.returncode, 0) + self.assertEqual(result.stdout, message) + self.assertEqual(result.stderr, message) + + def test_non_utf8_diagnostic_bytes_preserve_the_conversion_failure(self): + payload = b"FAIL: native diagnostic \xff\n" + run = subprocess.run + for stream in (1, 2): + with self.subTest(stream=stream): + child = f"import os, sys; os.write({stream}, {payload!r}); sys.exit(3)" + + def relink(command, **options): + return run([sys.executable, "-c", child], timeout=5, **options) + + with mock.patch.object(locale, "getpreferredencoding", return_value="utf-8"), \ + mock.patch.object(locale, "getencoding", return_value="utf-8", create=True), \ + mock.patch.object(subprocess, "run", side_effect=relink), \ + mock.patch.object(audit_dump.import_audit, "main") as audit: + code, errors = self.run_main(self.dump, "--relinker", self.relinker, "--libs", "libs") + self.assertEqual(code, 2) + self.assertIn("relinker exited with 3", errors) + self.assertIn("FAIL: native diagnostic \ufffd", errors) + audit.assert_not_called() + def test_the_audit_gets_every_registry_library_and_module_directory(self): self.module("sce_module/libc.prx") work = self.root / "work" - def relink(command, capture_output, text): + def relink(command, **options): output = Path(command[-1]).parent (output / "app.registry.json").write_text("[]") (output / "app.libc.prx.guest.prx.registry.json").write_text("[]") @@ -110,7 +148,7 @@ class AuditDumpTests(unittest.TestCase): (work / "source" / "sce_module").mkdir(parents=True) (work / "source" / "sce_module" / "gone.prx").write_bytes(ELF) - def relink(command, capture_output, text): + def relink(command, **options): (Path(command[-1]).parent / "app.registry.json").write_text("[]") return subprocess.CompletedProcess(command, 0, "", "") @@ -143,6 +181,27 @@ class AuditDumpTests(unittest.TestCase): audit.assert_not_called() self.assertTrue(stale.exists()) + def test_output_directory_creation_failure_stops_before_conversion(self): + work = self.root / "work" + original_mkdir = Path.mkdir + + def mkdir(path, *args, **kwargs): + if path == work / "output": + raise PermissionError("permission denied") + return original_mkdir(path, *args, **kwargs) + + with mock.patch.object(Path, "mkdir", mkdir), mock.patch.object(audit_dump, "prepare") as prepare, \ + mock.patch.object(audit_dump, "convert") as convert, mock.patch.object(audit_dump.import_audit, "main") as audit: + code, errors = self.run_main(self.dump, "--relinker", self.relinker, "--libs", "libs", "--work", work) + self.assertEqual(code, 2) + self.assertIn("cannot create", errors) + self.assertIn(str(work / "output"), errors) + self.assertIn("permission denied", errors) + prepare.assert_not_called() + convert.assert_not_called() + audit.assert_not_called() + self.assertEqual((self.dump / "eboot.bin").read_bytes(), SELF) + @unittest.skipIf(os.name == "nt" or (hasattr(os, "geteuid") and os.geteuid() == 0), "needs POSIX permissions and a non-root user") def test_a_non_writable_stale_directory_stops_before_conversion(self): work = self.root / "work" @@ -170,6 +229,50 @@ class AuditDumpTests(unittest.TestCase): convert.assert_not_called() audit.assert_not_called() + def test_work_cleanup_refuses_relinker_or_libraries_in_generated_directories(self): + for generated in ("source", "output"): + for kind in ("relinker", "libs"): + with self.subTest(generated=generated, kind=kind), tempfile.TemporaryDirectory() as directory: + work = Path(directory) + target = work / generated / "nested" + target.mkdir(parents=True) + marker = target / "keep.prx" + marker.write_bytes(b"keep") + relinker = marker if kind == "relinker" else self.relinker + libs = target if kind == "libs" else self.root / "libs" + with mock.patch.object(audit_dump, "prepare") as prepare, \ + mock.patch.object(audit_dump, "convert") as convert, \ + self.assertRaises(SystemExit) as error: + self.run_main(self.dump, "--relinker", relinker, "--libs", libs, "--work", work) + self.assertEqual(error.exception.code, 2) + self.assertEqual(marker.read_bytes(), b"keep") + prepare.assert_not_called() + convert.assert_not_called() + + def test_work_cleanup_refuses_outward_input_links(self): + for generated in ("source", "output"): + for kind in ("relinker", "libs"): + with self.subTest(generated=generated, kind=kind), tempfile.TemporaryDirectory() as directory: + work = Path(directory) + nested = work / generated / "nested" + nested.mkdir(parents=True) + outside = self.relinker if kind == "relinker" else self.root + link = nested / "input-link" + try: + os.symlink(outside, link, target_is_directory=kind == "libs") + except OSError: + self.skipTest("symbolic links unavailable") + relinker = link if kind == "relinker" else self.relinker + libs = link if kind == "libs" else self.root + with mock.patch.object(audit_dump, "prepare") as prepare, \ + mock.patch.object(audit_dump, "convert") as convert, \ + self.assertRaises(SystemExit) as error: + self.run_main(self.dump, "--relinker", relinker, "--libs", libs, "--work", work) + self.assertEqual(error.exception.code, 2) + self.assertTrue(link.is_symlink()) + prepare.assert_not_called() + convert.assert_not_called() + def test_symbolic_link_loops_are_usage_errors_before_input_is_removed(self): loop = self.root / "loop" try: @@ -179,6 +282,8 @@ class AuditDumpTests(unittest.TestCase): for name, arguments, expected in ( ("work", ("--relinker", self.relinker, "--work", loop), "cannot check work directory against the input dump"), ("relinker", ("--relinker", loop), "no such relinker"), + ("json", ("--relinker", self.relinker, "--json", loop), "cannot check JSON output against the input dump"), + ("libs", ("--relinker", self.relinker, "--libs", loop), "cannot check work directory against input"), ): with self.subTest(name=name): errors = io.StringIO() diff --git a/tools/tests/test_audit_nid_names.py b/tools/tests/test_audit_nid_names.py new file mode 100644 index 0000000000..27a4ddb815 --- /dev/null +++ b/tools/tests/test_audit_nid_names.py @@ -0,0 +1,52 @@ +import json +import os +import subprocess +import sys +import tempfile +import unittest +from pathlib import Path + +SCRIPT = 'audit_nid_names.py' +TOOLS = Path(__file__).resolve().parents[1] + + +class Tests(unittest.TestCase): + def setUp(self): + self.directory = tempfile.TemporaryDirectory() + self.addCleanup(self.directory.cleanup) + self.root = Path(self.directory.name) + + def run_tool(self, *args): + return subprocess.run([sys.executable, str(TOOLS / SCRIPT), *map(str, args)], capture_output=True, + encoding="utf-8", timeout=10, env={**os.environ, "PATH": "", "PYTHONIOENCODING": "ascii"}) + + def test_hash_consistency_and_read_only_first_record_policy(self): + path=self.root/"名称.csv" + path.write_text("6OkOa1SOKuY sceAmprUnknown00\nAAAAAAAAAAA sceAmprUnknown00\n6OkOa1SOKuY ignored_duplicate\n",encoding="utf-8-sig") + before=path.read_bytes(),path.stat().st_mtime_ns + r=self.run_tool(path) + self.assertEqual(r.returncode,1,r.stderr) + data=json.loads(r.stdout) + self.assertEqual((data["matching"],data["mismatching"]),(1,1)) + self.assertEqual([x["nid"] for x in data["entries"]],["6OkOa1SOKuY","AAAAAAAAAAA"]) + self.assertTrue(data["entries"][0]["matches"]) + self.assertEqual(data["entries"][1]["computed_nid"],"6OkOa1SOKuY") + self.assertEqual(before,(path.read_bytes(),path.stat().st_mtime_ns)) + self.assertEqual(list(self.root.iterdir()),[path]) + path.write_text("6OkOa1SOKuY sceAmprUnknown00\n",encoding="utf-8") + self.assertEqual(self.run_tool(path).returncode,0) + + def test_empty_and_invalid_database(self): + path=self.root/"db" + path.write_bytes(b"") + r=self.run_tool(path) + self.assertEqual(r.returncode,0,r.stderr) + self.assertEqual(json.loads(r.stdout),{"entries":[],"matching":0,"mismatching":0}) + path.write_text("bad row\n",encoding="utf-8") + r=self.run_tool(path) + self.assertEqual(r.returncode,2) + self.assertEqual(r.stdout,"") + + +if __name__ == "__main__": + unittest.main() diff --git a/tools/tests/test_build_changed_guest_tests.py b/tools/tests/test_build_changed_guest_tests.py index e1a055b6a6..980644bef0 100644 --- a/tools/tests/test_build_changed_guest_tests.py +++ b/tools/tests/test_build_changed_guest_tests.py @@ -1,7 +1,6 @@ import contextlib import io import json -import re from pathlib import Path import subprocess import sys @@ -60,6 +59,21 @@ class GuestTestTargets(unittest.TestCase): product = self.target("libScePad", target_type="SHARED_LIBRARY", source="core/libs/prx/libScePad/Export.cpp") self.assertEqual(self.selections(self.fixture([guest, host, product]), None), ["guest_pad_tests"]) + def test_selects_changed_guest_test_with_mingw_libc_import_library(self): + for fragment in ( + "core/libs/libs/implib/liblibc.dll.a", + r'"C:\build with spaces\core\libs\libs\implib\liblibc.dll.a"', + ): + with self.subTest(fragment=fragment): + guest = self.target("guest_mktime_tests", source="core/libs/tests/GuestMktime.cpp", fragment=fragment) + targets = {guest["id"]: guest} + source_root = Path(self.temporary.name).resolve() + for changed in (["core/libs/tests/GuestMktime.cpp"], ["core/libs/prx/libc/include/SonyCrt.hpp"]): + self.assertEqual( + build_changed_guest_tests.guest_test_targets(source_root, targets, changed), + ["guest_mktime_tests"], + ) + def test_changed_source_selects_only_the_changed_target(self): guest_a = self.target("guest_a_tests", source="core/libs/tests/GuestA.cpp", fragment="libc.prx") guest_b = self.target("guest_b_tests", source="core/libs/tests/GuestB.cpp", fragment="libc.prx") @@ -147,17 +161,67 @@ class Main(unittest.TestCase): self.target("guest_pad_tests", source="core/libs/tests/Guest.cpp", fragment="libc.prx"), ]) calls = [] - with mock.patch.object(build_changed_guest_tests.subprocess, "run", - side_effect=lambda cmd, **_: calls.append(cmd) or run_result(self.listing() if cmd[:3] == ["ctest", "--test-dir", str(build)] and "--show-only=json-v1" in cmd else "")): + selections = [] + def execute(cmd, **_): + calls.append(cmd) + if "-I" in cmd: + selections.append(Path(cmd[cmd.index("-I") + 1]).read_text()) + return run_result(self.listing() if "--show-only=json-v1" in cmd else "") + with mock.patch.object(build_changed_guest_tests.subprocess, "run", side_effect=execute): code = self.main(build, ["core/libs/tests/GuestNp.cpp", "core/libs/tests/Guest.cpp"]) self.assertEqual(code, 0) run_cmd = [cmd for cmd in calls if cmd[0] == "ctest" and not any("--show-only" in part for part in cmd)][0] - pattern = run_cmd[run_cmd.index("-R") + 1] - self.assertIn(re.escape("guest_np_common_build"), pattern) - self.assertIn(re.escape("guest_np_common_fetch"), pattern) - self.assertIn(re.escape("guest_pad"), pattern) + self.assertEqual(selections, ["0,0,0,1,2,3"]) self.assertIn("--no-tests=error", run_cmd) + def test_large_selection_fits_windows_commands_and_preserves_every_test(self): + selected = ["guest_" + "long_name_" * 8 + str(index) for index in range(600)] + tests = [{"name": "unrelated", "command": ["other.exe"]}] + tests += [{"name": f"case [{index}].+ \U0001f600", "command": [f"C:/b/{name}.exe"]} + for index, name in enumerate(selected)] + listing = json.dumps({"tests": tests}) + calls = [] + seen_indices = [] + def execute(cmd, **_): + length = len(subprocess.list2cmdline(cmd).encode("utf-16-le")) // 2 + if length >= 32767: + raise OSError(206, "Windows command line is too long") + calls.append(cmd) + if "-I" in cmd: + content = Path(cmd[cmd.index("-I") + 1]).read_text() + seen_indices.extend(map(int, content.split(",")[3:])) + return run_result(listing if "--show-only=json-v1" in cmd else "") + with mock.patch.object(build_changed_guest_tests.subprocess, "run", side_effect=execute), \ + mock.patch("select_tests.sys.platform", "win32"): + build_changed_guest_tests.run(Path(self.temporary.name), selected, {name: name for name in selected}) + builds = [cmd[cmd.index("--target") + 1:] for cmd in calls if cmd[0] == "cmake"] + self.assertEqual(builds[0], ["libs"]) + self.assertGreater(len(builds), 2) + self.assertEqual([name for batch in builds[1:] for name in batch], selected) + self.assertEqual(seen_indices, list(range(2, len(tests) + 1))) + self.assertEqual(len([cmd for cmd in calls if "-I" in cmd]), 1) + + def test_ctest_index_file_runs_only_resolved_tests(self): + build = Path(self.temporary.name) / "ctest-build" + build.mkdir() + python = Path(sys.executable).as_posix() + body = f'add_test("unrelated" "cmake" "-E" "false")\n' + for name in ("selected [one].+", "selected two"): + body += f'add_test("{name}" "{python}" "-c" "pass")\n' + (build / "CTestTestfile.cmake").write_text(body) + real_run = subprocess.run + executed = [] + def execute(cmd, **kwargs): + if cmd[0] == "cmake": + return run_result() + result = real_run(cmd, **kwargs) + if "-I" in cmd: + executed.append(Path(cmd[cmd.index("-I") + 1]).read_text()) + return result + with mock.patch.object(build_changed_guest_tests.subprocess, "run", side_effect=execute): + build_changed_guest_tests.run(build, ["python_target"], {Path(sys.executable).stem: "python_target"}) + self.assertEqual(executed, ["0,0,0,2,3"]) + def test_a_production_only_change_still_builds_libs_and_runs_nothing(self): build = self.fixture([self.target("guest_pad_tests", source="core/libs/tests/Guest.cpp", fragment="libc.prx")]) calls = [] @@ -167,6 +231,25 @@ class Main(unittest.TestCase): self.assertIn(["cmake", "--build", str(build), "--parallel", "3", "--target", "libs"], calls) self.assertFalse([cmd for cmd in calls if cmd[0] == "ctest"]) + def test_selected_target_with_a_renamed_executable_runs_its_ctest(self): + guest = self.target("guest_pad_tests", source="core/libs/tests/Guest.cpp", fragment="libc.prx") + guest["artifacts"] = [{"path": "tests/pad-renamed.exe"}] + build = self.fixture([guest]) + listing = json.dumps({"tests": [{"name": "guest_pad", "command": ["C:/b/tests/pad-renamed.exe"]}]}) + calls = [] + selections = [] + def execute(cmd, **_): + calls.append(cmd) + if "-I" in cmd: + selections.append(Path(cmd[cmd.index("-I") + 1]).read_text()) + return run_result(listing if "--show-only=json-v1" in cmd else "") + with mock.patch.object(build_changed_guest_tests.subprocess, "run", side_effect=execute): + code = self.main(build, ["core/libs/tests/Guest.cpp"]) + self.assertEqual(code, 0) + commands = [cmd for cmd in calls if cmd[0] == "ctest" and "--show-only=json-v1" not in cmd] + self.assertEqual(len(commands), 1) + self.assertEqual(selections, ["0,0,0,1"]) + def test_an_unrelated_change_runs_nothing(self): build = self.fixture([self.target("guest_pad_tests", source="core/libs/tests/Guest.cpp", fragment="libc.prx")]) calls = [] diff --git a/tools/tests/test_check_compile.py b/tools/tests/test_check_compile.py index 4b25079bb9..9e94ca0a38 100644 --- a/tools/tests/test_check_compile.py +++ b/tools/tests/test_check_compile.py @@ -317,6 +317,16 @@ class CheckCompilePathSelectionTests(CheckCompileFixture): self.assertIn("flags.rsp", result.stderr) self.assertNotIn("Traceback", result.stderr) + def test_syntax_arguments_does_not_call_path_resolve_on_the_source(self): + loop = self.root / "loop.cpp" + other = self.root / "other.cpp" + try: + loop.symlink_to(other) + other.symlink_to(loop) + except (NotImplementedError, OSError) as error: + self.skipTest(f"symbolic links are unavailable: {error}") + check_compile.syntax_arguments([sys.executable, "loop.cpp"], self.build, loop) + def test_a_new_untracked_translation_unit_is_checked(self): self.source("base.cpp") subprocess.run(["git", "-C", str(self.root), "add", "base.cpp"], check=True) diff --git a/tools/tests/test_check_configure_seed.py b/tools/tests/test_check_configure_seed.py new file mode 100644 index 0000000000..84a4a87449 --- /dev/null +++ b/tools/tests/test_check_configure_seed.py @@ -0,0 +1,51 @@ +import json +import os +import subprocess +import sys +import tempfile +import unittest +from pathlib import Path + +SCRIPT = 'check_configure_seed.py' +TOOLS = Path(__file__).resolve().parents[1] + + +class Tests(unittest.TestCase): + def setUp(self): + self.directory = tempfile.TemporaryDirectory() + self.addCleanup(self.directory.cleanup) + self.root = Path(self.directory.name) + + def run_tool(self, *args): + return subprocess.run([sys.executable, str(TOOLS / SCRIPT), *map(str, args)], capture_output=True, + encoding="utf-8", timeout=10, env={**os.environ, "PYTHONIOENCODING": "ascii"}) + + def test_exact_stale_and_missing_are_read_only(self): + cache, seed = self.root / "缓存.txt", self.root / "seed.cmake" + cache.write_text("//Have include stdint.h\nHAVE_STDINT_H:INTERNAL=1\n//User option\nOPT:BOOL=ON\n", encoding="utf-8-sig") + expected = b'set("HAVE_STDINT_H" "1" CACHE INTERNAL "Have include stdint.h")\n' + seed.write_bytes(expected) + before = seed.stat().st_mtime_ns + result = self.run_tool(cache, seed) + self.assertEqual(result.returncode, 0, result.stderr) + self.assertEqual(seed.stat().st_mtime_ns, before) + seed.write_bytes(expected.replace(b'"1"', b'"0"')) + before = seed.read_bytes() + self.assertEqual(self.run_tool(cache, seed).returncode, 1) + self.assertEqual(seed.read_bytes(), before) + missing = self.root / "absent" / "seed.cmake" + self.assertEqual(self.run_tool(cache, missing).returncode, 1) + self.assertFalse(missing.parent.exists()) + + def test_invalid_cache_and_empty_seed(self): + cache, seed = self.root / "cache", self.root / "seed" + cache.write_bytes(b"\xff") + self.assertEqual(self.run_tool(cache, seed).returncode, 2) + self.assertFalse(seed.exists()) + cache.write_text("OPT:BOOL=ON\n", encoding="utf-8") + seed.write_bytes(b"") + self.assertEqual(self.run_tool(cache, seed).returncode, 0) + + +if __name__ == "__main__": + unittest.main() diff --git a/tools/tests/test_check_skips.py b/tools/tests/test_check_skips.py index 8670994612..7bc04a5104 100644 --- a/tools/tests/test_check_skips.py +++ b/tools/tests/test_check_skips.py @@ -24,6 +24,7 @@ LIMITATIONS = [ "skipped, no usable Vulkan device: ErrorInitializationFailed", "skipped, unit shadows or host imports are unavailable", "skipped, the device has no compute queue", + "skipped, not enough free disk space for a file of more than 2 GiB", "skipped, the device reports 4 lanes", "skipped, subgroup size 8", "skipped, no display", @@ -386,6 +387,30 @@ class SkipReportTests(unittest.TestCase): path.write_text(content, encoding="utf-8") return list(check_skips.skips(path)) + def test_a_test_listed_twice_is_rejected(self): + reason = ('<skipped message="SKIP_RETURN_CODE=77"/>' + '<system-out>skipped, the device lacks geometryShader</system-out>') + flaky = ('<skipped message="SKIP_RETURN_CODE=77"/>' + '<system-out>skipped, flaky</system-out>') + for content in ( + f'<testsuite><testcase name="t">{reason}</testcase><testcase name="t">{reason}</testcase></testsuite>', + f'<testsuite><testcase name="t">{flaky}</testcase><testcase name="t">{reason}</testcase></testsuite>', + f'<testsuite><testcase name="t">{reason}</testcase><testcase name="t">{flaky}</testcase></testsuite>', + ): + with self.subTest(content=content), self.assertRaisesRegex(ValueError, "listed more than once"): + self.skipped(content) + with tempfile.TemporaryDirectory() as directory: + junit = Path(directory) / "junit.xml" + junit.write_text( + f'<testsuite><testcase name="t">{reason}</testcase><testcase name="t">{reason}</testcase></testsuite>', + encoding="utf-8", + ) + result = subprocess.run([sys.executable, "-I", str(TOOL), str(junit), "--job", "linux"], + capture_output=True, text=True) + self.assertEqual(result.returncode, 2, result.stdout + result.stderr) + self.assertIn("listed more than once", result.stderr) + self.assertNotIn("Traceback", result.stderr) + def test_non_junit_roots_are_rejected_even_with_testcases(self): for content in ('<report/>', '<testcase name="passed"/>', '<report><testcase name="passed"/></report>', diff --git a/tools/tests/test_compare_configure_checks.py b/tools/tests/test_compare_configure_checks.py new file mode 100644 index 0000000000..2f82528a1a --- /dev/null +++ b/tools/tests/test_compare_configure_checks.py @@ -0,0 +1,52 @@ +import json +import os +import subprocess +import sys +import tempfile +import unittest +from pathlib import Path + +SCRIPT = 'compare_configure_checks.py' +TOOLS = Path(__file__).resolve().parents[1] + + +class Tests(unittest.TestCase): + def setUp(self): + self.directory = tempfile.TemporaryDirectory() + self.addCleanup(self.directory.cleanup) + self.root = Path(self.directory.name) + + def run_tool(self, *args): + return subprocess.run([sys.executable, str(TOOLS / SCRIPT), *map(str, args)], capture_output=True, + encoding="utf-8", timeout=10, env={**os.environ, "PATH": "", "PYTHONIOENCODING": "ascii"}) + + def test_added_removed_changed_and_read_only(self): + a,b=self.root/"旧.txt",self.root/"新.txt" + a.write_text("//Have include a\nA:INTERNAL=1\n//Test B\nB:INTERNAL=0\n//Test C\nC:INTERNAL=1\n",encoding="utf-8-sig") + b.write_text("//Have include a\nA:INTERNAL=2\n//Test C changed\nC:INTERNAL=1\n//Test D\nD:INTERNAL=1\n",encoding="utf-8") + before={p.name:(p.read_bytes(),p.stat().st_mtime_ns) for p in self.root.iterdir()} + result=self.run_tool(a,b) + self.assertEqual(result.returncode,1,result.stderr) + data=json.loads(result.stdout) + self.assertEqual(data["added"],[{"name":"D","value":"1","help":"Test D"}]) + self.assertEqual(data["removed"],[{"name":"B","value":"0","help":"Test B"}]) + self.assertEqual([c["name"] for c in data["changed"]],["A","C"]) + self.assertEqual(data["changed"][0]["after"]["value"],"2") + self.assertEqual(before,{p.name:(p.read_bytes(),p.stat().st_mtime_ns) for p in self.root.iterdir()}) + self.assertEqual(self.run_tool(a,a).returncode,0) + + def test_empty_and_invalid_inputs(self): + a,b=self.root/"a",self.root/"b" + a.write_text("OPT:BOOL=ON\n",encoding="utf-8") + b.write_bytes(b"") + r=self.run_tool(a,b) + self.assertEqual(r.returncode,0,r.stderr) + self.assertEqual(json.loads(r.stdout),{"added":[],"removed":[],"changed":[]}) + b.write_bytes(b"\xff") + r=self.run_tool(a,b) + self.assertEqual(r.returncode,2) + self.assertEqual(r.stdout,"") + + +if __name__ == "__main__": + unittest.main() diff --git a/tools/tests/test_compile_database_inventory.py b/tools/tests/test_compile_database_inventory.py new file mode 100644 index 0000000000..6cf699cd9f --- /dev/null +++ b/tools/tests/test_compile_database_inventory.py @@ -0,0 +1,74 @@ +import json +import os +import subprocess +import sys +import tempfile +import unittest +from pathlib import Path + +SCRIPT = 'compile_database_inventory.py' +TOOLS = Path(__file__).resolve().parents[1] + + +class Tests(unittest.TestCase): + def setUp(self): + self.directory = tempfile.TemporaryDirectory() + self.addCleanup(self.directory.cleanup) + self.root = Path(self.directory.name) + + def run_tool(self, *args): + return subprocess.run([sys.executable, str(TOOLS / SCRIPT), *map(str, args)], capture_output=True, + encoding="utf-8", timeout=10, env={**os.environ, "PATH": "", "PYTHONIOENCODING": "ascii"}) + + def test_groups_raw_variants_without_commands_or_writes(self): + path=self.root/"编译.json" + items=[{"directory":"dir","file":"b.cpp","arguments":["missing-tool","-D名字=1","b.cpp"]}, + {"directory":"dir","file":"a.c","command":"missing-tool a.c"}, + {"directory":"dir","file":"b.cpp","command":"missing-tool -DALT b.cpp"}] + path.write_text(json.dumps(items,ensure_ascii=False),encoding="utf-8-sig") + saved=path.read_bytes(),path.stat().st_mtime_ns + r=self.run_tool(path) + self.assertEqual(r.returncode,0,r.stderr) + data=json.loads(r.stdout) + self.assertEqual(data["entries"],3) + self.assertEqual([(u["file"],u["variants"]) for u in data["units"]],[("a.c",1),("b.cpp",2)]) + self.assertEqual(data["units"][1]["records"],[{"arguments":items[0]["arguments"]},{"command":items[2]["command"]}]) + self.assertEqual(saved,(path.read_bytes(),path.stat().st_mtime_ns)) + self.assertEqual(list(self.root.iterdir()),[path]) + + def test_empty_and_invalid_databases(self): + path=self.root/"db.json" + for value in ({},[{}],[{"directory":"x","file":"y","arguments":[]}],"bad"): + path.write_text(json.dumps(value),encoding="utf-8") + r=self.run_tool(path) + self.assertEqual(r.returncode,2,r.stdout) + self.assertEqual(r.stdout,"") + path.write_text("[]",encoding="utf-8") + self.assertEqual(json.loads(self.run_tool(path).stdout),{"entries":0,"units":[]}) + + def test_optional_outputs_distinguish_identical_compile_actions(self): + path = self.root / "compile_commands.json" + arguments = ["missing-compiler", "-c", "a.c"] + common = {"directory": "dir", "file": "a.c"} + items = [{**common, "arguments": arguments, "command": "ignored command", "output": "a.o"}, + {**common, "arguments": arguments, "output": "b.o"}, + {**common, "command": "missing-compiler a.c", "output": "命令.o"}, + {**common, "arguments": arguments}, + {**common, "arguments": arguments, "output": ""}] + path.write_text(json.dumps(items, ensure_ascii=False), encoding="utf-8") + before = path.read_bytes(), path.stat().st_mtime_ns + result = self.run_tool(path) + self.assertEqual(result.returncode, 0, result.stderr) + self.assertEqual(json.loads(result.stdout), {"entries": 5, "units": [ + {"directory": "dir", "file": "a.c", "variants": 5, "records": [ + {"arguments": arguments, "output": "a.o"}, + {"arguments": arguments, "output": "b.o"}, + {"command": "missing-compiler a.c", "output": "命令.o"}, + {"arguments": arguments}, + {"arguments": arguments, "output": ""}]}]}) + self.assertEqual((path.read_bytes(), path.stat().st_mtime_ns), before) + self.assertEqual(list(self.root.iterdir()), [path]) + + +if __name__ == "__main__": + unittest.main() diff --git a/tools/tests/test_configure_seed.py b/tools/tests/test_configure_seed.py index 781bafce5c..dba19da350 100644 --- a/tools/tests/test_configure_seed.py +++ b/tools/tests/test_configure_seed.py @@ -47,7 +47,7 @@ class ConfigureSeedPathTests(unittest.TestCase): "resource.setrlimit(resource.RLIMIT_FSIZE, (64, 64)); " "sys.path.insert(0, sys.argv[1]); import configure_seed; configure_seed.main(sys.argv[2:])") result = subprocess.run([sys.executable, "-c", program, str(TOOL.parent), str(self.cache), str(seed)], - capture_output=True, text=True, timeout=5) + capture_output=True, encoding="utf-8", timeout=5) self.assertEqual(result.returncode, 2, result.stderr) self.assertNotIn("Traceback", result.stderr) self.assertEqual(result.stdout, "") @@ -62,11 +62,11 @@ class ConfigureSeedPathTests(unittest.TestCase): seed = self.root / "seed.cmake" program = "import os,sys; os.umask(0o027); sys.path.insert(0,sys.argv[1]); import configure_seed; configure_seed.main(sys.argv[2:])" arguments = [sys.executable, "-c", program, str(TOOL.parent), str(self.cache), str(seed)] - result = subprocess.run(arguments, capture_output=True, text=True, timeout=5) + result = subprocess.run(arguments, capture_output=True, encoding="utf-8", timeout=5) self.assertEqual(result.returncode, 0, result.stderr) self.assertEqual(seed.stat().st_mode & 0o777, 0o640) seed.chmod(0o600) - result = subprocess.run(arguments, capture_output=True, text=True, timeout=5) + result = subprocess.run(arguments, capture_output=True, encoding="utf-8", timeout=5) self.assertEqual(result.returncode, 0, result.stderr) self.assertEqual(seed.stat().st_mode & 0o777, 0o600) @@ -110,7 +110,7 @@ class ConfigureSeedPathTests(unittest.TestCase): def run_seed(self, seed, *options): return subprocess.run([sys.executable, str(TOOL), str(self.cache), str(seed), *options], - capture_output=True, text=True) + capture_output=True, encoding="utf-8") def assert_rejected(self, seed, *options): result = self.run_seed(seed, *options) @@ -124,7 +124,7 @@ class ConfigureSeedPathTests(unittest.TestCase): def test_unreadable_cache_is_reported_without_a_traceback(self): missing = self.root / "no cache dir" / "CMakeCache.txt" result = subprocess.run([sys.executable, str(TOOL), str(missing), str(self.root / "seed.cmake")], - capture_output=True, text=True) + capture_output=True, encoding="utf-8") self.assertEqual(result.returncode, 2, result.stderr) self.assertIn(str(missing), result.stderr) self.assertNotIn("Traceback", result.stderr) @@ -373,7 +373,7 @@ class ChecksParsingTests(unittest.TestCase): ("--include", "ARCH_SIZE"), ("--exclude", "ARCH_SIZE")): with self.subTest(options=options): result = subprocess.run([sys.executable, str(TOOL), str(cache), str(seed), *options], - capture_output=True, text=True) + capture_output=True, encoding="utf-8") self.assertEqual(result.returncode, 0, result.stderr) text = seed.read_text(encoding="utf-8") self.assertNotIn("ARCH_SIZE", text) diff --git a/tools/tests/test_env_reference.py b/tools/tests/test_env_reference.py index f2cfc9885f..68f8dcccd6 100644 --- a/tools/tests/test_env_reference.py +++ b/tools/tests/test_env_reference.py @@ -253,6 +253,35 @@ class EnvReferenceTests(unittest.TestCase): found["APS5_INT"][0][2:], ("integer", "42") ) + def test_table_escapes_a_pipe_in_the_filename(self): + out = io.StringIO() + env_reference.table({"APS5_TEST": [("core/A|B.cpp", 1, "presence", "unset")]}, out) + self.assertIn("| `APS5_TEST` | presence | `core/A\\|B.cpp` | unset | |\n", out.getvalue()) + + def test_table_keeps_a_plain_filename_unchanged(self): + out = io.StringIO() + env_reference.table({"APS5_TEST": [("core/Sample.cpp", 1, "presence", "unset")]}, out) + self.assertEqual(out.getvalue(), + "### core/Sample.cpp\n\n" + "| Name | Kind | Source | Default | Description |\n" + "|------|------|--------|---------|-------------|\n" + "| `APS5_TEST` | presence | `core/Sample.cpp` | unset | |\n\n") + + def test_table_preserves_backslashes_in_code_and_plain_cells(self): + out = io.StringIO() + env_reference.table({"APS5_TEST": [(r"core/A\|B.cpp", 1, r"a\b", r"c\|d")]}, out) + self.assertIn(r"| `APS5_TEST` | a\\b | `core/A\\|B.cpp` | c\\\|d | |" + "\n", out.getvalue()) + + def test_table_escapes_pipes_in_every_populated_column(self): + out = io.StringIO() + env_reference.table({"APS5_A|B": [("core/A|B.cpp", 1, "a|b", "c|d")]}, out) + self.assertIn(r"| `APS5_A\|B` | a\|b | `core/A\|B.cpp` | c\|d | |" + "\n", out.getvalue()) + + def test_table_normalizes_newlines_in_cells(self): + out = io.StringIO() + env_reference.table({"APS5_A\nB": [("core/A\r\nB.cpp", 1, "a\rb", "c\nd")]}, out) + self.assertIn("| `APS5_A B` | a b | `core/A B.cpp` | c d | |\n", out.getvalue()) + def test_the_default_prefixes_cover_both(self): root = self.fixture() found = env_reference.reads([root / "core"]) @@ -302,6 +331,101 @@ class EnvReferenceTests(unittest.TestCase): self.assertIn("APS5_REMOVED", out.getvalue()) self.assertIn("no longer reads", out.getvalue()) + def test_reads_resolve_a_string_constant_passed_to_a_reader(self): + root = self.fixture() + (root / "core" / "Fallback.hpp").write_text( + 'static constexpr const char* FALLBACK_ENV = "APS5_FALLBACK_DB";\n', encoding="utf-8") + (root / "core" / "Fallback.cpp").write_text( + '#include "Fallback.hpp"\n' + "static float gain() {\n" + " const char* text = std::getenv(FALLBACK_ENV);\n" + " return text ? 1.0f : 0.0f;\n" + "}\n", encoding="utf-8") + found = env_reference.reads([root / "core"]) + self.assertIn("APS5_FALLBACK_DB", found) + self.assertEqual(found["APS5_FALLBACK_DB"], [( + (root / "core" / "Fallback.cpp").as_posix(), 3, "string", "")]) + + def test_a_parameter_with_a_constant_name_is_not_a_read_of_that_constant(self): + root = self.fixture() + (root / "core" / "Names.hpp").write_text('static constexpr const char* MODE = "APS5_REAL_MODE";\n', encoding="utf-8") + (root / "core" / "Reader.cpp").write_text( + '#include "Names.hpp"\n' + "const char* read(const char* MODE) { return std::getenv(MODE); }\n", encoding="utf-8") + found = env_reference.reads([root / "core"]) + self.assertNotIn("APS5_REAL_MODE", found) + + def test_a_local_with_a_non_literal_initializer_is_not_a_read_of_that_constant(self): + root = self.fixture() + (root / "core" / "Names.hpp").write_text('static constexpr const char* MODE = "APS5_REAL_MODE";\n', encoding="utf-8") + (root / "core" / "Other.cpp").write_text( + '#include "Names.hpp"\n' + "const char* pick() { const char* MODE = dynamic_name(); return std::getenv(MODE); }\n", encoding="utf-8") + found = env_reference.reads([root / "core"]) + self.assertNotIn("APS5_REAL_MODE", found) + + def test_a_commented_out_declaration_is_not_a_constant(self): + root = self.fixture() + (root / "core" / "Comment.hpp").write_text('// static constexpr const char* NAME = "APS5_COMMENT_ONLY";\n', encoding="utf-8") + (root / "core" / "Use.cpp").write_text( + '#include "Comment.hpp"\n' + "const char* read(const char* NAME) { return std::getenv(NAME); }\n", encoding="utf-8") + found = env_reference.reads([root / "core"]) + self.assertNotIn("APS5_COMMENT_ONLY", found) + + def test_a_constant_from_an_included_header_is_read(self): + root = self.fixture() + (root / "core" / "Api.hpp").write_text('static constexpr const char* API = "APS5_API_NAME";\n', encoding="utf-8") + (root / "core" / "Use.cpp").write_text( + '#include "Api.hpp"\n' + "const char* value = std::getenv(API);\n", encoding="utf-8") + found = env_reference.reads([root / "core"]) + self.assertEqual(found["APS5_API_NAME"][0][1], 2) + + def test_a_constant_from_a_header_that_is_not_included_is_not_read(self): + root = self.fixture() + (root / "core" / "Unrelated.hpp").write_text('static constexpr const char* FAR = "APS5_FAR_NAME";\n', encoding="utf-8") + (root / "core" / "Use.cpp").write_text("const char* value = std::getenv(FAR);\n", encoding="utf-8") + found = env_reference.reads([root / "core"]) + self.assertNotIn("APS5_FAR_NAME", found) + + def test_reads_ignore_a_constant_name_bound_to_two_names(self): + root = self.fixture() + (root / "core" / "First.hpp").write_text( + 'static constexpr const char* NAME = "APS5_FIRST";\n', encoding="utf-8") + (root / "core" / "Second.hpp").write_text( + 'static constexpr const char* NAME = "APS5_SECOND";\n', encoding="utf-8") + (root / "core" / "Read.cpp").write_text( + "const char* value = std::getenv(NAME);\n", encoding="utf-8") + found = env_reference.reads([root / "core"]) + self.assertNotIn("APS5_FIRST", found) + self.assertNotIn("APS5_SECOND", found) + + def test_reads_ignore_a_constant_outside_the_prefixes_and_an_unused_constant(self): + root = self.fixture() + (root / "core" / "Other.hpp").write_text( + 'static constexpr const char* OTHER = "PATH_LIKE";\n' + 'static constexpr const char* UNUSED = "APS5_UNUSED";\n', encoding="utf-8") + (root / "core" / "Read.cpp").write_text( + "const char* value = std::getenv(OTHER);\n", encoding="utf-8") + found = env_reference.reads([root / "core"]) + self.assertNotIn("PATH_LIKE", found) + self.assertNotIn("APS5_UNUSED", found) + + def test_check_passes_for_a_constant_read_that_has_a_row(self): + root = self.fixture() + (root / "core" / "Fallback.hpp").write_text( + 'static constexpr const char* FALLBACK_ENV = "APS5_FALLBACK_DB";\n', encoding="utf-8") + (root / "core" / "Fallback.cpp").write_text( + '#include "Fallback.hpp"\n' + "const char* text = std::getenv(FALLBACK_ENV);\n", encoding="utf-8") + found = env_reference.reads([root / "core"]) + self.assertIn("APS5_FALLBACK_DB", found) + doc = root / "ENVIRONMENT.md" + doc.write_text("\n".join("| `%s` |" % name for name in found), encoding="utf-8") + out = io.StringIO() + self.assertEqual(env_reference.check(found, doc, env_reference.PREFIXES, out), 0) + def test_check_fails_when_the_document_is_missing(self): root = self.fixture() found = env_reference.reads([root / "core"]) diff --git a/tools/tests/test_import_audit.py b/tools/tests/test_import_audit.py index 7b5ed99e69..b43140f068 100644 --- a/tools/tests/test_import_audit.py +++ b/tools/tests/test_import_audit.py @@ -733,6 +733,44 @@ class ImportAuditTests(unittest.TestCase): self.assertEqual(data["references"], 3) self.assertIn("optional (weak import)", out) + def test_converted_elf_tls_loader_is_not_a_missing_guest_library(self): + work = self.work + (work.libs / "libSceA.prx").write_bytes(exporting("AAAAAAAAAAA")) + registry, result = work.root / "game.registry.json", work.root / "audit.json" + write_registry(registry, []) + module = work.modules / "consumer.prx.guest.prx" + for builder in (build_elf, build_sectionless_elf): + with self.subTest(format=builder.__name__): + module.write_bytes(builder([("AAAAAAAAAAA", 0, GLOBAL_FUNCTION)], + ["libSceA.prx", "ld-linux-x86-64.so.2"])) + code, _, err = work.run(registry, "--json", str(result)) + self.assertEqual((code, err), (0, "")) + data = json.loads(result.read_text()) + self.assertEqual(data["missing_libraries"], {}) + self.assertEqual(data["references"], 1) + self.assertEqual(data["unique_by_class"]["implemented"], 1) + + def test_tls_loader_exemption_preserves_other_needed_libraries(self): + work = self.work + (work.libs / "libSceA.prx").write_bytes(exporting()) + registry, result = work.root / "game.registry.json", work.root / "audit.json" + write_registry(registry, []) + for filename, needed in (("consumer.prx", "ld-linux-x86-64.so.2"), + ("consumer.prx.guest.prx", "$ORIGIN/ld-linux-x86-64.so.2"), + ("consumer.prx.guest.prx", "LD-LINUX-X86-64.SO.2"), + ("consumer.prx.guest.prx", "libMissing.so.1")): + with self.subTest(filename=filename, needed=needed): + module = work.modules / filename + module.write_bytes(build_elf([], [needed])) + code, _, err = work.run(registry, "--json", str(result)) + self.assertEqual((code, err), (1, "")) + self.assertEqual(json.loads(result.read_text())["missing_libraries"], {needed: 1}) + module.unlink() + import_audit.needed_registry_path(registry).write_text(json.dumps(["ld-linux-x86-64.so.2"])) + code, _, err = work.run(registry, "--json", str(result)) + self.assertEqual((code, err), (1, "")) + self.assertEqual(json.loads(result.read_text())["missing_libraries"], {"ld-linux-x86-64.so.2": 0}) + def test_module_sidecars_do_not_change_the_audit(self): work = self.work (work.libs / "libSceA.prx").write_bytes(exporting("AAAAAAAAAAA")) @@ -1601,6 +1639,57 @@ class ImportAuditTests(unittest.TestCase): self.assertEqual(import_audit.source_stubs(source), { (library + ".prx", nid): "scePending" for library in ("libA", "libB", "libZOwner")}) + def test_nested_callable_returns_do_not_make_unconditional_stubs_partial(self): + prefixes = ( + "[] { return 1; };", + "auto callback = [] { return 1; };", + "auto callback = [saved = 1]() mutable noexcept -> int { return saved; };", + "auto callback = []<typename T>(T value) -> T { return value; };", + "auto callback = [saved = ({ auto nested = [] { return 1; }; nested(); })] { return saved; };", + "auto value = [] { return 1; }();", + "Consume([] { return 1; });", + "if ([] { return true; }()) {}", + "struct Local { int Value() { return 1; } };", + "class Local { public: int Value() { return 1; } };", + ) + source = self.work.source + for prefix in prefixes: + with self.subTest(prefix=prefix): + write_source(source, "libScopes", + f"void Fail() {{ {prefix} NotImplemented_nid_no_patch(__func__); }}\n" + f"int APS5_VABI sceDirect() {{ {prefix} NotImplemented_nid_no_patch(__func__); return 0; }}\n" + "int APS5_VABI sceWrapped() { Fail(); return 0; }\n") + expected = {("libScopes.prx", nid_names.compute_nid(name)): name for name in ("sceDirect", "sceWrapped")} + self.assertEqual(import_audit.source_stub_classes(source), (expected, set())) + + def test_outer_function_exits_remain_partial_beside_nested_callables(self): + exits = ( + "return;", + "if (value) return;", + "if (value) { return; }", + "if (value) { auto nested = [] { return 1; }; return; }", + "exit_label: return;", + "exit_label: { return; }", + "[[likely]] if (value) return;", + "[[likely]] if (value) { return; }", + "GUARDED(value) { return; }", + "({ if (value) return; });", + "auto captured = [saved = ({ if (value) return; 1; })] { return saved; };", + "auto captured = [saved = ({ auto nested = [] { return 1; }; if (value) return; nested(); })] { return saved; };", + "int saved[] = {1}; auto captured = [first = saved[0], other = ({ if (value) return; 1; })] { return first + other; };", + "if (value) goto done;", + ) + source = self.work.source + for exit_statement in exits: + with self.subTest(exit_statement=exit_statement): + write_source(source, "libScopes", + "#define GUARDED(value) if (value)\n" + "void Fail(int value) { auto callback = [] { return 1; }; " + f"{exit_statement} NotImplemented_nid_no_patch(__func__); done: return; }}\n" + "int APS5_VABI sceWrapped(int value) { Fail(value); return value; }\n") + stub = ("libScopes.prx", nid_names.compute_nid("sceWrapped")) + self.assertEqual(import_audit.source_stub_classes(source), ({stub: "sceWrapped"}, {stub})) + def test_guarded_exports_are_partial_and_unconditional_ones_are_stubs(self): source = self.work.source write_source(source, "libGuard", @@ -1679,6 +1768,42 @@ class ImportAuditTests(unittest.TestCase): with self.assertRaisesRegex(import_audit.AuditError, "more than 256 preprocessor branch combinations"): import_audit.source_stub_classes(source) + def test_unrelated_helper_host_branches_do_not_abort_source_classification(self): + blocks = "".join(f"#ifdef HOST_{index}\n value += {index};\n#endif\n" for index in range(10)) + source = self.work.source + write_source(source, "libHosts", + f"int PollDescriptors(int value) {{\n{blocks} return value;\n}}\n" + "int PollAgain(int value) { return PollDescriptors(value); }\n" + "void FirstFail() { LastFail(); }\n" + "void LastFail() { NotImplemented_nid_no_patch(__func__); }\n" + "int APS5_VABI scePoll(int value) { return PollAgain(value); }\n" + "int APS5_VABI sceStub(int value) { FirstFail(); return value; }\n" + "int APS5_VABI scePartial(int value) { if (value) FirstFail(); return value; }\n") + stubs, partial = import_audit.source_stub_classes(source) + stub = ("libHosts.prx", nid_names.compute_nid("sceStub")) + guarded = ("libHosts.prx", nid_names.compute_nid("scePartial")) + self.assertEqual(set(stubs), {stub, guarded}) + self.assertEqual(partial, {guarded}) + + def test_relevant_helper_at_the_variant_limit_remains_a_stub(self): + blocks = "".join(f"#ifdef HOST_{index}\n value += {index};\n#endif\n" for index in range(8)) + source = self.work.source + write_source(source, "libHosts", + f"void Fail(int value) {{\n{blocks} NotImplemented_nid_no_patch(__func__);\n}}\n" + "int APS5_VABI sceStub(int value) { Fail(value); return value; }\n") + stub = ("libHosts.prx", nid_names.compute_nid("sceStub")) + self.assertEqual(import_audit.source_stub_classes(source), ({stub: "sceStub"}, set())) + + def test_relevant_helper_host_branches_keep_the_variant_limit(self): + blocks = "".join(f"#ifdef HOST_{index}\n value += {index};\n#endif\n" for index in range(9)) + source = self.work.source + write_source(source, "libHosts", + f"void LastFail(int value) {{\n{blocks} NotImplemented_nid_no_patch(__func__);\n}}\n" + "void FirstFail(int value) { LastFail(value); }\n" + "int APS5_VABI sceStub(int value) { FirstFail(value); return value; }\n") + with self.assertRaisesRegex(import_audit.AuditError, "more than 256 preprocessor branch combinations"): + import_audit.source_stub_classes(source) + def test_partial_import_is_its_own_class(self): direct, guarded = nid_names.compute_nid("sceDirect"), nid_names.compute_nid("sceGuarded") stubs = {("libA.prx", direct): "sceDirect", ("libA.prx", guarded): "sceGuarded", ("libB.prx", guarded): "sceGuarded"} diff --git a/tools/tests/test_inspect_self.py b/tools/tests/test_inspect_self.py new file mode 100644 index 0000000000..e0ae9eb66e --- /dev/null +++ b/tools/tests/test_inspect_self.py @@ -0,0 +1,61 @@ +import json +import os +import subprocess +import sys +import tempfile +import unittest +from pathlib import Path + +SCRIPT = 'inspect_self.py' +TOOLS = Path(__file__).resolve().parents[1] + + +class Tests(unittest.TestCase): + def setUp(self): + self.directory = tempfile.TemporaryDirectory() + self.addCleanup(self.directory.cleanup) + self.root = Path(self.directory.name) + + def run_tool(self, *args): + return subprocess.run([sys.executable, str(TOOLS / SCRIPT), *map(str, args)], capture_output=True, + encoding="utf-8", timeout=10, env={**os.environ, "PYTHONIOENCODING": "ascii"}) + + def fixture(self): + import struct + data = bytearray(0x500) + struct.pack_into("<I", data, 0, 0x1d3d154f) + struct.pack_into("<QQQQ", data, 0x40, 0x800, 0x400, 16, 16) + data[0x180:0x187] = b"\x7fELF\x02\x01\x01" + struct.pack_into("<HHIQQQIHHHHHH", data, 0x190, 0xfe10, 62, 1, 0, 64, 0, 0, 64, 56, 1, 0, 0, 0) + struct.pack_into("<IIQQQQQQ", data, 0x1c0, 1, 5, 0x9000, 0x1000, 0, 16, 32, 0x1000) + return data + + def test_reports_original_offsets_and_records_without_writes(self): + source = self.root / "模块.self" + data = self.fixture() + source.write_bytes(data) + before = source.stat().st_mtime_ns + result = self.run_tool(source) + self.assertEqual(result.returncode, 0, result.stderr) + report = json.loads(result.stdout) + self.assertEqual(report, {"size": 0x500, "magic": 0x1d3d154f, "inner_elf": 0x180, + "records": [{"flags": 0x800, "offset": 0x400, "size": 16}], + "program_headers": [{"index": 0, "type": 1, "flags": 5, "offset": 0x9000, + "vaddr": 0x1000, "size": 16, "memory": 32, "align": 0x1000}]}) + self.assertEqual(source.read_bytes(), data) + self.assertEqual(source.stat().st_mtime_ns, before) + self.assertEqual(list(self.root.iterdir()), [source]) + + def test_rejects_malformed_metadata(self): + source = self.root / "bad.self" + valid = self.fixture() + for data in (b"", bytes(0x500), valid[:0x300], valid[:0x184] + bytes([1]) + valid[0x185:]): + source.write_bytes(data) + result = self.run_tool(source) + self.assertEqual(result.returncode, 2, result.stdout) + self.assertEqual(result.stdout, "") + self.assertNotIn("Traceback", result.stderr) + + +if __name__ == "__main__": + unittest.main() diff --git a/tools/tests/test_job_reference_errors.py b/tools/tests/test_job_reference_errors.py index d72ae8abb0..9cbad3291d 100644 --- a/tools/tests/test_job_reference_errors.py +++ b/tools/tests/test_job_reference_errors.py @@ -1,6 +1,8 @@ import contextlib import io +import os from pathlib import Path +import subprocess import sys import tempfile import unittest @@ -12,6 +14,19 @@ import run_job_manager_reference as runner import test_import_audit as fixtures +class ResolveCliPathTests(unittest.TestCase): + def test_symlink_loop_is_rejected_without_path_resolve(self): + with tempfile.TemporaryDirectory() as directory: + loop = Path(directory) / "loop" + try: + loop.symlink_to(loop) + except OSError as error: + self.skipTest(f"Symlinks unavailable: {error}") + with self.assertRaises(ValueError) as error: + runner.resolve_cli_path(loop) + self.assertIn("symbolic link loop", str(error.exception)) + + class DependencyStagingTests(unittest.TestCase): def test_valid_transitive_dependencies_are_staged(self): with tempfile.TemporaryDirectory() as directory: @@ -77,6 +92,19 @@ class ReferenceErrorTests(unittest.TestCase): self.assertEqual(code, 0, error) self.assertEqual(error, "") + def test_an_artifact_path_outside_the_output_encoding_is_printed(self): + with tempfile.TemporaryDirectory() as directory: + root = Path(directory) + build = root / "build" + build.mkdir() + artifact = root / "вывод" + result = subprocess.run([sys.executable, runner.__file__, "--host", "--build", str(build), "--relinker", sys.executable, + "--toolchain", str(build), "--output", str(artifact)], + capture_output=True, encoding="utf-8", timeout=20, env={**os.environ, "PYTHONIOENCODING": "ascii"}) + self.assertEqual(result.returncode, 2, result.stderr) + self.assertIn(f"Artifacts: {artifact.resolve()}", result.stdout) + self.assertIn("Build the job_manager_reference target first", result.stderr) + if __name__ == "__main__": unittest.main() diff --git a/tools/tests/test_mingw_host_only_test_targets.py b/tools/tests/test_mingw_host_only_test_targets.py index 0b104711e7..673308d9d1 100644 --- a/tools/tests/test_mingw_host_only_test_targets.py +++ b/tools/tests/test_mingw_host_only_test_targets.py @@ -57,6 +57,18 @@ class HostOnlyTargets(unittest.TestCase): source_root, targets = build_mingw_host_only_tests.read_reply(build_dir) self.assertEqual(build_mingw_host_only_tests.host_only_test_targets(source_root, targets), ["host_tests"]) + def test_excludes_mingw_libc_import_library_from_host_only_targets(self): + guest = self.target("guest_mktime_tests", source="core/libs/tests/GuestMktime.cpp", + fragment="C:/build/core/libs/libs/implib/liblibc.dll.a") + source_root = Path(self.temporary.name).resolve() + self.assertEqual(build_mingw_host_only_tests.host_only_test_targets(source_root, {guest["id"]: guest}), []) + + def test_libc_link_does_not_accept_similarly_named_libraries(self): + for fragment in ("/build/notliblibc.dll.a", "/build/liblibc.dll.a.extra", "/build/liblibc.prx"): + with self.subTest(fragment=fragment): + target = self.target("host_tests", fragment=fragment) + self.assertFalse(build_mingw_host_only_tests.links_guest_libc(target)) + def test_excludes_a_transitive_guest_libc_dependency(self): helper = self.target("guest_helper", target_type="STATIC_LIBRARY", source="core/libs/tests/GuestHelper.cpp", dependencies=("libc-id",)) @@ -221,5 +233,27 @@ class HostOnlyTargets(unittest.TestCase): self.assertNotIn("Traceback", errors.getvalue()) + def test_library_filename_substring_does_not_exclude_a_host_test(self): + product = self.target("product_lib", target_type="STATIC_LIBRARY", source="core/libs/utility/src/Utility.cpp") + product["artifacts"] = [{"path": "core/libs/utility/libproduct_lib.a"}] + host = self.target("host_tests", fragment="C:/build/external/libprefix_libproduct_lib.a") + guest = self.target("product_tests", fragment='"C:/build/core/libs/utility/libproduct_lib.a"') + source_root, targets = build_mingw_host_only_tests.read_reply(self.fixture([product, host, guest])) + self.assertEqual(build_mingw_host_only_tests.host_only_test_targets(source_root, targets), ["host_tests"]) + + def assert_exact_file_argument_links_product(self, fragment): + product = self.target("product_lib", target_type="STATIC_LIBRARY", source="core/libs/utility/src/Utility.cpp") + product["artifacts"] = [{"path": "core/libs/utility/libproduct_lib.a"}] + guest = self.target("product_tests", fragment=fragment) + source_root, targets = build_mingw_host_only_tests.read_reply(self.fixture([product, guest])) + self.assertEqual(build_mingw_host_only_tests.host_only_test_targets(source_root, targets), []) + + def test_gnu_exact_file_linker_argument_links_a_product_library(self): + self.assert_exact_file_argument_links_product("-l:libproduct_lib.a") + + def test_gnu_exact_file_linker_argument_through_wl_links_a_product_library(self): + self.assert_exact_file_argument_links_product("-Wl,-l:libproduct_lib.a") + + if __name__ == "__main__": unittest.main() diff --git a/tools/tests/test_nid_names.py b/tools/tests/test_nid_names.py index 4823be7801..96b20ed35f 100644 --- a/tools/tests/test_nid_names.py +++ b/tools/tests/test_nid_names.py @@ -1,5 +1,6 @@ import contextlib import http.server +import importlib.util import io import json import os @@ -397,6 +398,42 @@ class NidArgumentTests(unittest.TestCase): +PUBLIC_HEADER_SPEC = importlib.util.spec_from_file_location( + "public_headers_audit", Path(__file__).resolve().parents[2] / "core/libs/tests/test_public_headers.py" +) +public_headers = importlib.util.module_from_spec(PUBLIC_HEADER_SPEC) +PUBLIC_HEADER_SPEC.loader.exec_module(public_headers) + + +class PublicHeaderDataAliases(unittest.TestCase): + def run_audit(self, header, source): + with tempfile.TemporaryDirectory() as directory: + root = Path(directory).resolve() + libs = root / "core/libs" + lib = libs / "prx/libExample" + lib.mkdir(parents=True) + (lib / "libExample.hpp").write_text(header, encoding="utf-8") + (lib / "Export.cpp").write_text(source, encoding="utf-8") + public_headers.source_text.cache_clear() + public_headers.included_headers.cache_clear() + with patch.object(public_headers, "ROOT", root), patch.object(public_headers, "LIBS", libs): + return public_headers.audit() + + def test_data_alias_requires_one_reachable_data_declaration(self): + source = 'APS5_EXPORT("AAAAAAAAAAA", ExampleData);\n' + self.run_audit('extern const char ExampleData[];\n', source) + with self.assertRaisesRegex(RuntimeError, "ExampleData: expected exactly one header declaration"): + self.run_audit('', source) + with self.assertRaisesRegex(RuntimeError, "ExampleData: expected exactly one header declaration"): + self.run_audit('extern const char ExampleData[];\nextern const char ExampleData[];\n', source) + + def test_function_definition_cannot_be_declared_as_data(self): + source = 'int APS5_VABI ExampleFunction() { return 1; }\n' + self.run_audit('int APS5_VABI ExampleFunction();\n', source) + with self.assertRaisesRegex(RuntimeError, "ExampleFunction: function definition requires a function declaration"): + self.run_audit('extern const char ExampleFunction[];\n', source) + + class SourceCollectionTests(unittest.TestCase): def test_trailing_return_definitions_are_collected_without_declarations_or_literals(self): text = ('auto APS5_VABI sceTrailing() -> int { return 0; }\n' @@ -675,5 +712,13 @@ class SourceLocationTests(unittest.TestCase): nid_names.main(arguments) +class NidEncodingTests(unittest.TestCase): + def test_fixed_nid_vectors(self): + for name, expected in (("ACProcessMain", "mFq1M6vw-JM"), ("sceAmprUnknown00", "6OkOa1SOKuY"), + ("", "B4c6vzgC+Xc"), ("東京", "2GKwIE7lnRc")): + with self.subTest(name=name): + self.assertEqual(nid_names.compute_nid(name), expected) + + if __name__ == "__main__": unittest.main() diff --git a/tools/tests/test_package_release.py b/tools/tests/test_package_release.py index 5ae88cafef..60086a337b 100644 --- a/tools/tests/test_package_release.py +++ b/tools/tests/test_package_release.py @@ -98,6 +98,17 @@ class PublicHeaderPackageTests(unittest.TestCase): with self.assertRaisesRegex(RuntimeError, "outside core/libs"): package_headers.package(self.source, self.output, "v1") + def test_header_symlink_loop_is_rejected_without_traceback(self): + loop = self.umbrella.with_name("Loop.hpp") + try: + loop.symlink_to("Loop.hpp") + except OSError as error: + self.skipTest(str(error)) + self.api.write_text('#include "Loop.hpp"\n', encoding="utf-8") + with self.assertRaisesRegex(RuntimeError, "Symbolic link loop"): + package_headers.public_headers(self.source) + self.assertTrue(loop.is_symlink()) + def test_header_command_needs_no_build_directory(self): with patch.object(package_release, "ROOT", self.source): self.assertEqual(package_release.main(["--platform", "headers", "--version", "v1", "--output", str(self.output)]), 0) @@ -1076,6 +1087,25 @@ class ReleaseMainTests(unittest.TestCase): self.assertEqual(error.exception.code, 2) self.assertIn("not a directory", stderr.getvalue()) + def test_main_reports_symbolic_link_loop_on_output_without_traceback(self): + with tempfile.TemporaryDirectory() as directory: + root = Path(directory) + docs = root / "docs" + docs.mkdir() + (docs / "guide.md").write_text("# Guide", encoding="utf-8") + output = root / "assets" + try: + output.symlink_to("assets") + except (OSError, NotImplementedError) as error: + self.skipTest(str(error)) + result = subprocess.run([sys.executable, str(Path(package_release.__file__)), + "--docs", str(docs), "--output", str(output)], + capture_output=True, text=True, timeout=30) + self.assertEqual(result.returncode, 2, result.stderr) + self.assertNotIn("Traceback", result.stderr) + self.assertIn("symbolic link loop", result.stderr) + self.assertFalse((root / "assets.md").exists()) + def test_main_reconfigures_streams(self): class Stream: def __init__(self): diff --git a/tools/tests/test_patch_lib_atrac9.py b/tools/tests/test_patch_lib_atrac9.py new file mode 100644 index 0000000000..cedd3e718c --- /dev/null +++ b/tools/tests/test_patch_lib_atrac9.py @@ -0,0 +1,84 @@ +import os +import subprocess +import sys +import tempfile +import unittest +from pathlib import Path + +REPOSITORY = Path(__file__).resolve().parents[2] +SCRIPT = REPOSITORY / "core/libs/prx/libSceAjm.native/PatchLibAtrac9.cmake" + +UNPACK_GUARD = "block->GradientEndUnit < 0 || block->GradientEndUnit >= 48" +BIT_READER_PEEK = "\tconst int byteIndex = br->Position / 8;\n\tconst int bitIndex = br->Position % 8;\n\tconst int numBytes = (bitIndex + bits - 1) / 8 + 1;\n\tconst unsigned char* buffer = br->Buffer;\n\n\tint value;\n\tswitch (numBytes) {" +DECINIT_GUARD = "header != 0xFE || validationBit != 0" +UTILITY_REVERSE = "\treturn value >> (32 - bitCount);" +UTILITY_SIGN_EXTEND = "\treturn (value << shift) >> shift;" + + +def write_sources(root, extra_unpack=""): + root.mkdir(parents=True, exist_ok=True) + (root / "unpack.c").write_text("int unpack(void) { if (" + UNPACK_GUARD + ") return 1; return 0; }\n" + extra_unpack) + (root / "bit_reader.c").write_text("int peek(void) {\n" + BIT_READER_PEEK + "\n\treturn 0; }\n") + (root / "decinit.c").write_text("int decinit(void) { return (" + DECINIT_GUARD + "); }\n") + (root / "utility.c").write_text("int reverse(void) {\n" + UTILITY_REVERSE + "\n}\nint sign_extend(void) {\n" + UTILITY_SIGN_EXTEND + "\n}\n") + + +class PatchLibAtrac9Tests(unittest.TestCase): + def setUp(self): + self._directory = tempfile.TemporaryDirectory(prefix="anyps5-atrac9-patch-") + self.work = Path(self._directory.name) + self.sources = self.work / "src" + self.output = self.work / "generated" + write_sources(self.sources) + self.wrapper = self.work / "run.cmake" + + def tearDown(self): + self._directory.cleanup() + + def run_patch(self, sources=None): + self.wrapper.write_text( + 'set(LIBATRAC9_DIR "${CMAKE_CURRENT_LIST_DIR}/' + (sources or self.sources).relative_to(self.work).as_posix() + '")\n' + 'set(LIBATRAC9_PATCHED_DIR "${CMAKE_CURRENT_LIST_DIR}/generated")\n' + 'include("' + SCRIPT.as_posix() + '")\n' + ) + return subprocess.run([sys.argv[1], "-P", str(self.wrapper)], capture_output=True, text=True, timeout=60, cwd=self.work) + + def set_sentinel(self): + for name in ("unpack.c", "bit_reader.c", "decinit.c", "utility.c"): + stamp = 946684800 + path = self.output / name + os.utime(path, (stamp, stamp)) + + def mtime(self, name): + return int((self.output / name).stat().st_mtime) + + def test_patches_and_rewrites_only_changed_outputs(self): + result = self.run_patch() + self.assertEqual(result.returncode, 0, result.stderr) + self.assertIn("block->GradientEndUnit > 31", (self.output / "unpack.c").read_text()) + self.assertIn(">> 3", (self.output / "bit_reader.c").read_text()) + self.assertIn("config->ChannelConfigIndex > 5", (self.output / "decinit.c").read_text()) + self.assertIn(": 0u;", (self.output / "utility.c").read_text()) + self.set_sentinel() + result = self.run_patch() + self.assertEqual(result.returncode, 0, result.stderr) + for name in ("unpack.c", "bit_reader.c", "decinit.c", "utility.c"): + self.assertEqual(self.mtime(name), 946684800, name + " was rewritten without a change") + write_sources(self.sources, extra_unpack="int changed(void) { return 2; }\n") + self.set_sentinel() + result = self.run_patch() + self.assertEqual(result.returncode, 0, result.stderr) + self.assertIn("changed", (self.output / "unpack.c").read_text()) + self.assertNotEqual(self.mtime("unpack.c"), 946684800, "a changed input did not rewrite its output") + for name in ("bit_reader.c", "decinit.c", "utility.c"): + self.assertEqual(self.mtime(name), 946684800, name + " was rewritten without a change") + + def test_missing_marker_fails(self): + (self.sources / "unpack.c").write_text("int unpack(void) { return 0; }\n") + result = self.run_patch() + self.assertNotEqual(result.returncode, 0) + self.assertIn("gradient guard has changed", result.stderr) + + +if __name__ == "__main__": + unittest.main(argv=[sys.argv[0]]) diff --git a/tools/tests/test_pe_symbol_inventory.py b/tools/tests/test_pe_symbol_inventory.py new file mode 100644 index 0000000000..bdbf2b14e2 --- /dev/null +++ b/tools/tests/test_pe_symbol_inventory.py @@ -0,0 +1,52 @@ +import json +import os +import subprocess +import sys +import tempfile +import unittest +from pathlib import Path + +SCRIPT = 'pe_symbol_inventory.py' +TOOLS = Path(__file__).resolve().parents[1] + + +class Tests(unittest.TestCase): + def setUp(self): + self.directory = tempfile.TemporaryDirectory() + self.addCleanup(self.directory.cleanup) + self.root = Path(self.directory.name) + + def run_tool(self, *args): + return subprocess.run([sys.executable, str(TOOLS / SCRIPT), *map(str, args)], capture_output=True, + encoding="utf-8", timeout=10, env={**os.environ, "PATH": "", "PYTHONIOENCODING": "ascii"}) + + def test_code_symbols_and_export_fallback(self): + sys.path.insert(0,str(Path(__file__).parent)) + from test_symbolize_samples import build_pe, SIZE_OF_IMAGE, TIMESTAMP + path=self.root/"模块.prx" + build_pe(path) + before=path.read_bytes(),path.stat().st_mtime_ns + r=self.run_tool(path) + self.assertEqual(r.returncode,0,r.stderr) + data=json.loads(r.stdout) + self.assertEqual((data["image_base"],data["size"],data["timestamp"],data["symbol_source"]),(0x140000000,SIZE_OF_IMAGE,TIMESTAMP,"coff")) + self.assertEqual(data["code"],[{"rva":0x1000,"end":0x1100,"symbols":[ + {"rva":0x1010,"name":"short"},{"rva":0x1040,"name":"AgcDriver_long_function_name"},{"rva":0x1080,"name":"static_f"}]}]) + self.assertEqual(before,(path.read_bytes(),path.stat().st_mtime_ns)) + build_pe(path,with_symbols=False,with_exports=True) + data=json.loads(self.run_tool(path).stdout) + self.assertEqual(data["symbol_source"],"exports") + self.assertEqual([x["name"] for x in data["code"][0]["symbols"]],["first_func","second_func"]) + + def test_malformed_images_fail_without_traceback(self): + path=self.root/"bad.prx" + for data in (b"",b"MZ",bytes(128)): + path.write_bytes(data) + r=self.run_tool(path) + self.assertEqual(r.returncode,2) + self.assertEqual(r.stdout,"") + self.assertNotIn("Traceback",r.stderr) + + +if __name__ == "__main__": + unittest.main() diff --git a/tools/tests/test_performance_compare.py b/tools/tests/test_performance_compare.py index c5e6fcae05..4e9d3ccbae 100644 --- a/tools/tests/test_performance_compare.py +++ b/tools/tests/test_performance_compare.py @@ -56,6 +56,17 @@ class PerformanceCompareTests(unittest.TestCase): path.write_text("\n" + "\n\n".join(json.dumps(record) for record in records) + "\n", encoding="utf-8") def run_cli(self, *args): + argv = [str(self.before), str(self.after), *args] + returncode = 0 + with patch.object(sys, "stdout", new_callable=io.StringIO) as output, \ + patch.object(sys, "stderr", new_callable=io.StringIO) as errors: + try: + performance_compare.main(argv) + except SystemExit as error: + returncode = error.code + return subprocess.CompletedProcess(argv, returncode, output.getvalue(), errors.getvalue()) + + def run_process(self, *args): return subprocess.run([sys.executable, str(Path(performance_compare.__file__)), str(self.before), str(self.after), *args], capture_output=True, text=True, encoding="utf-8", timeout=5, env=dict(os.environ, PYTHONIOENCODING="ascii")) @@ -229,6 +240,19 @@ class PerformanceCompareTests(unittest.TestCase): with self.assertRaisesRegex(ValueError, r"before.jsonl:2:"): performance_compare.load_summary(self.before) + def test_invalid_worker_busy_percentages_are_rejected_with_location(self): + for workers in (None, [], {"worker": "busy"}, {"worker": True}, + {"worker": -1}, {"worker": float("inf")}): + with self.subTest(workers=workers): + self.baseline["worker_busy_pct"] = workers + self.write(self.before, self.baseline) + with self.assertRaisesRegex(ValueError, r"before.jsonl:2: worker_busy_pct"): + performance_compare.load_summary(self.before) + + def test_worker_busy_share_above_one_hundred_remains_valid(self): + self.baseline["worker_busy_pct"] = {"queue worker 0x0": 125.0} + self.assertIs(performance_compare.validate(self.baseline), self.baseline) + def test_bad_json_and_missing_file_produce_only_a_cli_error(self): self.write(self.after, self.candidate) for content in ("{bad json", "[]", "{}", '{"frame_ms": Infinity}'): @@ -245,6 +269,23 @@ class PerformanceCompareTests(unittest.TestCase): self.assertEqual(result.stdout, "") self.assertNotIn("Traceback", result.stderr) + def test_duplicate_json_fields_are_rejected_at_every_object_level(self): + record = json.dumps(self.baseline) + duplicates = ( + (record.replace('"commit": "abc123"', '"commit": "wrong", "commit": "abc123"', 1), "commit"), + (record.replace('"spec": "frames 600:4"', '"spec": "seconds 0:1", "spec": "frames 600:4"', 1), "spec"), + (record.replace('"Driver.Packet": 12.0', '"Driver.Packet": 1.0, "Driver.Packet": 12.0', 1), "Driver.Packet"), + ) + for content, field in duplicates: + with self.subTest(field=field): + self.before.write_text(content + "\n", encoding="utf-8") + original = self.before.read_bytes() + with self.assertRaises(ValueError) as raised: + performance_compare.load_summary(self.before) + self.assertIn(f"before.jsonl:1: duplicate JSON field: {field!r}", str(raised.exception)) + self.assertIsInstance(raised.exception.__cause__, ValueError) + self.assertEqual(self.before.read_bytes(), original) + def test_percentage_overflow_is_an_error(self): self.baseline["gpu_busy_ms_per_present"] = 1e-308 self.candidate["gpu_busy_ms_per_present"] = 1e308 @@ -274,7 +315,7 @@ class PerformanceCompareTests(unittest.TestCase): record = json.dumps(self.baseline)[:-1] + ', "extra": ' + excessive_json_value(opening, closing) + "}" path.write_text("\n\n" + record + "\n", encoding="utf-8") original = (self.before.read_bytes(), self.after.read_bytes()) - result = self.run_cli(*args) + result = self.run_process(*args) self.assertEqual(result.returncode, 2, result.stderr) self.assertEqual(result.stdout, "") self.assertIn(f"{path}:3:", result.stderr) @@ -326,11 +367,11 @@ class PerformanceCompareTests(unittest.TestCase): self.write(self.after, self.candidate) for args in ((), ("--json",)): with self.subTest(args=args): - result = self.run_cli(*args) + result = self.run_process(*args) self.assertEqual(result.returncode, 0, result.stderr) self.assertIn("GPU \u03a9", result.stdout) self.before.write_text("bad", encoding="utf-8") - result = self.run_cli() + result = self.run_process() self.assertEqual(result.returncode, 2) self.assertIn("avant-\u00e9.jsonl:1:", result.stderr) diff --git a/tools/tests/test_performance_csv.py b/tools/tests/test_performance_csv.py index b15a8c25af..abbe2ef58d 100644 --- a/tools/tests/test_performance_csv.py +++ b/tools/tests/test_performance_csv.py @@ -86,6 +86,28 @@ class PerformanceCsvTests(unittest.TestCase): self.assertEqual(result.stdout, b"") self.assertIn(b"recorded configuration differs", result.stderr) + def test_missing_and_empty_context_values_stay_distinct(self): + self.before.pop("cpu", None) + self.after["cpu"] = "" + self.before["env"]["EMPTY"] = "" + self.after["env"].pop("EMPTY", None) + rows = self.rows(self.run_csv()) + cpu = next(row for row in rows if row["kind"] == "configuration" and row["name"] == "cpu") + env = next(row for row in rows if row["kind"] == "configuration" and row["name"] == "env.EMPTY") + self.assertEqual((cpu["baseline"], cpu["candidate"]), ("<missing>", "")) + self.assertEqual((env["baseline"], env["candidate"]), ("", "<missing>")) + + def test_missing_marker_cannot_collide_with_recorded_strings(self): + self.before.pop("cpu", None) + self.after["cpu"] = "<missing>" + self.before["env"]["SLASH"] = r"\<missing>" + self.after["env"].pop("SLASH", None) + rows = self.rows(self.run_csv()) + cpu = next(row for row in rows if row["kind"] == "configuration" and row["name"] == "cpu") + env = next(row for row in rows if row["kind"] == "configuration" and row["name"] == "env.SLASH") + self.assertEqual((cpu["baseline"], cpu["candidate"]), ("<missing>", r"\<missing>")) + self.assertEqual((env["baseline"], env["candidate"]), (r"\\<missing>", "<missing>")) + def test_invalid_input_does_not_emit_a_partial_csv(self): self.after["frame_ms"]["p50"] = -1 result = self.run_csv() @@ -93,6 +115,19 @@ class PerformanceCsvTests(unittest.TestCase): self.assertEqual(result.stdout, b"") self.assertNotIn(b"Traceback", result.stderr) + def test_duplicate_json_field_does_not_emit_an_ambiguous_csv(self): + baseline = json.dumps(self.before).replace( + '"commit": "abc123"', '"commit": "wrong", "commit": "abc123"', 1) + self.baseline.write_text(baseline + "\n", encoding="utf-8") + self.candidate.write_text(json.dumps(self.after) + "\n", encoding="utf-8") + result = subprocess.run( + [sys.executable, str(Path(performance_csv.__file__)), str(self.baseline), str(self.candidate)], + capture_output=True, timeout=5) + self.assertEqual(result.returncode, 2) + self.assertEqual(result.stdout, b"") + self.assertIn(b"duplicate JSON field: 'commit'", result.stderr) + self.assertNotIn(b"Traceback", result.stderr) + def test_trace_selection_uses_the_existing_jsonl_selection_contract(self): self.baseline.write_text(json.dumps(self.before) + "\n" + json.dumps(self.after) + "\n", encoding="utf-8") self.candidate.write_bytes(self.baseline.read_bytes()) diff --git a/tools/tests/test_pr_overlap_errors.py b/tools/tests/test_pr_overlap_errors.py index 17c7513a49..bedb02812b 100644 --- a/tools/tests/test_pr_overlap_errors.py +++ b/tools/tests/test_pr_overlap_errors.py @@ -1,8 +1,10 @@ +import os import runpy import subprocess import sys import unittest from pathlib import Path +from tempfile import TemporaryDirectory from unittest.mock import patch sys.path.insert(0, str(Path(__file__).resolve().parents[1])) @@ -56,6 +58,27 @@ class ErrorReportTests(unittest.TestCase): with self.assertRaisesRegex(RuntimeError, r"failed: error: unknown option$"): pr_overlap.merge("refs/pr/base", "a") + def test_parent_pathspec_symlink_loop_exits_without_traceback(self): + with TemporaryDirectory() as directory: + repo = Path(directory) + nested = repo / "nested" + nested.mkdir() + loop = repo / "loop" + try: + loop.symlink_to(loop) + except OSError as error: + self.skipTest(f"symlinks unavailable: {error}") + old = os.getcwd() + os.chdir(nested) + try: + with patch.dict(pr_overlap._REPO_ROOTS, {Path.cwd(): str(repo)}, clear=False): + with self.assertRaises(ValueError) as raised: + pr_overlap.git("diff", "--", "../loop") + finally: + os.chdir(old) + self.assertIn("cannot resolve path '../loop'", str(raised.exception)) + self.assertRegex(str(raised.exception), r"Too many levels of symbolic links|Symlink loop|cannot be resolved by the system") + def test_main_reconfigures_streams(self): class Stream: def __init__(self): diff --git a/tools/tests/test_pr_overlap_export_cache.py b/tools/tests/test_pr_overlap_export_cache.py index c66efe5232..6ddcdc5365 100644 --- a/tools/tests/test_pr_overlap_export_cache.py +++ b/tools/tests/test_pr_overlap_export_cache.py @@ -13,7 +13,7 @@ import pr_overlap def run(*args): return subprocess.run(["git", "-c", "user.name=t", "-c", "user.email=t@t", *args], - capture_output=True, text=True, check=True).stdout.strip() + capture_output=True, encoding="utf-8", check=True).stdout.strip() def write(path, text): diff --git a/tools/tests/test_pr_overlap_fail_closed.py b/tools/tests/test_pr_overlap_fail_closed.py new file mode 100644 index 0000000000..c8e3fb69d8 --- /dev/null +++ b/tools/tests/test_pr_overlap_fail_closed.py @@ -0,0 +1,52 @@ +import sys +import unittest +from contextlib import ExitStack +from pathlib import Path +from unittest.mock import patch + +sys.path.insert(0, str(Path(__file__).resolve().parents[1])) +import pr_overlap + + +class FailClosedTests(unittest.TestCase): + def run_branch_check(self, found): + argv = ["pr_overlap.py", "--repo", "owner/project", "--branch", "topic"] + patches = ( + patch.object(sys, "argv", argv), + patch.object(pr_overlap, "open_prs", return_value={7: {"ref": "refs/pr/7"}}), + patch.object(pr_overlap, "fetch"), + patch.object(pr_overlap, "own", return_value={7: {"ref": "refs/pr/7"}}), + patch.object(pr_overlap, "git", return_value="a" * 40), + patch.object(pr_overlap, "scan_all"), + patch.object(pr_overlap, "base_exports", return_value={}), + patch.object(pr_overlap, "main_export_findings", return_value={}), + patch.object(pr_overlap, "overlaps", return_value=found), + patch.object(pr_overlap, "report", return_value="review result\n"), + patch.object(pr_overlap, "progress"), + patch("builtins.print"), + ) + with ExitStack() as stack: + for item in patches: + stack.enter_context(item) + return pr_overlap.main() + + def test_uncompared_shared_files_fail_the_local_branch_check(self): + result = self.run_branch_check({"added": set(), "uncompared": {"VectorAlgorithms.cpp"}}) + self.assertEqual(result, 2) + + def test_confirmed_comparisons_keep_the_local_branch_check_green(self): + result = self.run_branch_check({"added": set(), "conflicts": {}, "exports": set()}) + self.assertEqual(result, 0) + + def test_reports_every_uncompared_path(self): + self.assertEqual( + pr_overlap.unverified_overlaps({ + 7: {"uncompared": {"b.cpp", "a.cpp"}}, + 8: {"conflicts": {"c.cpp": [(1, 2)]}}, + }), + {7: {"a.cpp", "b.cpp"}}, + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/tools/tests/test_progress.py b/tools/tests/test_progress.py index 7f319a4ba8..572e39635b 100644 --- a/tools/tests/test_progress.py +++ b/tools/tests/test_progress.py @@ -352,6 +352,18 @@ class ProgressTests(unittest.TestCase): self.assertEqual(sum(line.startswith("| libSce") for line in table.splitlines()), progress.REPORT_ROWS) self.assertIn("3 more libraries", table) + def test_opcodes_counted_through_variants_are_not_listed_as_uncounted(self): + with tempfile.TemporaryDirectory() as directory: + opcodes = Path(directory) / "RdnaOpcode.hpp" + opcodes.write_text("enum class RdnaOpcode : int {\n VAddI32,\n VMulLoI32,\n Count,\n};\n", + encoding="utf-8") + isa = Path(directory) / "rdna_isa.txt" + isa.write_text("V_ADD_CO_U32 VOP3\n", encoding="utf-8") + with patch.multiple(progress, OPCODES=opcodes, ISA=isa): + shaders = progress.collect_shaders() + self.assertEqual(shaders["done"], 1) + self.assertEqual(shaders["extra"], ["VMulLoI32"]) + def test_raw_string_example_does_not_declare_an_export(self): source = 'const char* example = R"help(\nint APS5_VABI Fake() { return 0; }\n)help";\n' source += 'int APS5_VABI Real() { return 7; }\n' diff --git a/tools/tests/test_public_headers_manifest.py b/tools/tests/test_public_headers_manifest.py new file mode 100644 index 0000000000..afcde2ac05 --- /dev/null +++ b/tools/tests/test_public_headers_manifest.py @@ -0,0 +1,59 @@ +import json +import os +import subprocess +import sys +import tempfile +import unittest +from pathlib import Path + +SCRIPT = 'public_headers_manifest.py' +TOOLS = Path(__file__).resolve().parents[1] + + +class Tests(unittest.TestCase): + def setUp(self): + self.directory = tempfile.TemporaryDirectory() + self.addCleanup(self.directory.cleanup) + self.root = Path(self.directory.name) + + def run_tool(self, *args): + return subprocess.run([sys.executable, str(TOOLS / SCRIPT), *map(str, args)], capture_output=True, + encoding="utf-8", timeout=10, env={**os.environ, "PYTHONIOENCODING": "ascii"}) + + def fixture(self): + directory = self.root / "core/libs/prx/libExample" + directory.mkdir(parents=True) + (directory / "libExample.hpp").write_bytes(b'#include "Api.hpp"\n') + (directory / "Api.hpp").write_bytes(b'#include <cstdint>\n') + (self.root / "LICENSE").write_bytes(b"example license\n") + return directory + + def test_manifest_matches_recursive_package_bytes(self): + import hashlib + self.fixture() + before = {str(p.relative_to(self.root)): (p.read_bytes(), p.stat().st_mtime_ns) for p in self.root.rglob("*") if p.is_file()} + result = self.run_tool("--root", self.root) + self.assertEqual(result.returncode, 0, result.stderr) + report = json.loads(result.stdout) + self.assertEqual(report["headers"], 2) + expected = [] + for path, (data, _) in before.items(): + path = Path(path).as_posix() + destination = "LICENSE" if path == "LICENSE" else "include/anyps5/" + path.removeprefix("core/libs/") + expected.append({"path": destination, "size": len(data), "sha256": hashlib.sha256(data).hexdigest()}) + self.assertEqual(report["entries"], sorted(expected, key=lambda item: item["path"])) + self.assertEqual(before, {str(p.relative_to(self.root)): (p.read_bytes(), p.stat().st_mtime_ns) for p in self.root.rglob("*") if p.is_file()}) + + def test_missing_dependency_and_license_fail_without_json(self): + directory = self.fixture() + (directory / "Api.hpp").unlink() + self.assertEqual(self.run_tool("--root", self.root).returncode, 2) + (directory / "Api.hpp").write_bytes(b"") + (self.root / "LICENSE").write_bytes(b"") + result = self.run_tool("--root", self.root) + self.assertEqual(result.returncode, 2) + self.assertEqual(result.stdout, "") + + +if __name__ == "__main__": + unittest.main() diff --git a/tools/tests/test_run_report_schema.py b/tools/tests/test_run_report_schema.py new file mode 100644 index 0000000000..096c103a9c --- /dev/null +++ b/tools/tests/test_run_report_schema.py @@ -0,0 +1,459 @@ +import copy +import json +from importlib import metadata +from pathlib import Path +import unittest + +import jsonschema + +ROOT = Path(__file__).resolve().parents[2] +SCHEMA = json.loads((ROOT / "docs/run-report.schema.json").read_text(encoding="utf-8")) +FIXTURES = sorted((ROOT / "docs/run-report-fixtures").glob("*.json")) +EXPECTED_FIXTURES = {"stop-none", "stop-missing-function", "stop-unsupported-shader", "stop-unsupported-format", "stop-crash", + "stop-assert", "stop-other", "killed-recovered", "zero-present", "missing-metadata-gpu"} +MAX_BYTES = 65536 +KEYWORDS = {"$schema", "$ref", "$defs", "title", "description", "type", "const", "enum", "properties", "required", + "additionalProperties", "items", "maxItems", "minItems", "minLength", "maxLength", "pattern", "minimum", "maximum", + "exclusiveMinimum", "maxProperties", "allOf", "if", "then"} + + +LIBRARIES = (("libSceNpTrophy", "Np"), ("libSceAudioOut", "Audio"), ("libSceUserService", "User"), ("libSceNet", "Net"), + ("libSceVideodec", "Video"), ("libSceSaveData", "Save"), ("libSceHttp", "Http"), ("libSceSsl", "Ssl")) +OPCODES = (("VOP3", "V_CVT_PK_U8_F32"), ("VOP3", "V_MQSAD_U32_U8"), ("MIMG", "IMAGE_GATHER4_LZ_O"), ("DS", "DS_GWS_BARRIER"), ("SOPP", "S_SENDMSG")) +FORMAT_STATUS = ("rejected", "accepted", "unknown") +FORMAT_USAGE = ("sampled", "storage", "color-target", "depth-target", "transfer", "other") +DESCRIPTOR_TYPES = ("UniformBuffer", "StorageBuffer", "UniformTexelBuffer", "StorageTexelBuffer", "SampledImage", "StorageImage", "Sampler") + + +TRUNCATED_BASE = { + "format": "anyps5-report", + "version": 1, + "generated": "2026-10-29T12:00:00Z", + "anyps5": { + "commit": "40f2a9c3d1b7e5864a0c9d2e7f13b5a8c6d49e01", + "release": "v0.1.3", + "modified": False + }, + "game": { + "titleId": "PPSA12345", + "contentId": "UP9000-PPSA12345_00-EXAMPLE00000000A", + "contentVersion": "01.002.000", + "name": "Example Game" + }, + "system": { + "os": "linux", + "osVersion": "Arch Linux (kernel 6.11)", + "cpu": "AMD Ryzen 7 5800X", + "ramGiB": 32, + "gpu": { + "vendor": "AMD", + "name": "Radeon RX 6800", + "driver": "Mesa 24.2.3 (RADV)", + "vulkan": "1.3.289" + } + }, + "run": { + "id": "f05b9d2e4a7c4183b6e0c8a1d3f97e45", + "seconds": 402.6, + "exit": "abort", + "exitCode": 134, + "stage": "presents", + "milestones": { + "loaded": 1.2, + "started": 1.4, + "firstDraw": 8.9, + "firstPresent": 9.3 + }, + "framesPresented": 900, + "averageFps": 30.0, + "fpsWindowSeconds": 30.0, + "recovered": False, + "incomplete": False + }, + "coverage": { + "milestones": True, + "missing": True, + "shaders": True, + "unsupported": True, + "imageFormats": True, + "descriptors": True + }, + "truncated": { + "functions": 35, + "unsupported": 400, + "imageFormats": 20, + "descriptors": 0 + }, + "stop": { + "kind": "missing-function", + "reason": "runtime-stop", + "message": "Called libSceNpTrophy sceNpTrophyCall000, which is not implemented.", + "source": "core/libs/prx/libc/src/General.cpp:1015" + } +} + +TRUNCATED_SHADERS = { + "compiled": 4090, + "failed": 612, + "cacheHits": 5120 +} + + +def truncated_document(): + document = copy.deepcopy(TRUNCATED_BASE) + document["missing"] = {"functions": [{"library": LIBRARIES[i % 8][0], "name": f"sce{LIBRARIES[i % 8][1]}Call{i:03d}", "calls": 200 - i} for i in range(200)]} + document["shaders"] = copy.deepcopy(TRUNCATED_SHADERS) + document["shaders"]["unsupported"] = [ + {"encoding": OPCODES[i % 5][0], "opcode": OPCODES[i % 5][1] if i < 5 else f"{OPCODES[i % 5][1]}_{i}", "opcodeValue": 256 + i, + "modifiers": ["clamp"] if i % 3 == 0 else [], "count": 150 - i} for i in range(150)] + document["shaders"]["imageFormats"] = [ + {"format": i + 1, "name": f"GuestFormat{i + 1}", "status": FORMAT_STATUS[i % 3], "usage": FORMAT_USAGE[i % 6], "count": 100 - i} for i in range(100)] + document["shaders"]["descriptors"] = [ + {"type": name, "status": "accepted", "usage": "read", "count": 900 - 10 * i} for i, name in enumerate(DESCRIPTOR_TYPES)] + return document + + +DOCUMENTS = {file.stem: json.loads(file.read_text(encoding="utf-8")) for file in FIXTURES} +DOCUMENTS["truncated"] = truncated_document() + + +def load(name): + return copy.deepcopy(DOCUMENTS[name]) + + +def schema_keywords(node, path="schema"): + if isinstance(node, list): + for index, item in enumerate(node): + yield from schema_keywords(item, f"{path}[{index}]") + elif isinstance(node, dict): + for key, value in node.items(): + if key in ("properties", "$defs"): + for name, child in value.items(): + yield from schema_keywords(child, f"{path}.{key}.{name}") + elif key in ("const", "enum", "required", "pattern", "description", "title", "$ref", "$schema", "type"): + yield path, key + else: + yield path, key + yield from schema_keywords(value, f"{path}.{key}") + + +class PinnedValidatorTests(unittest.TestCase): + def test_validator_matches_the_pinned_requirement(self): + pinned = {} + for line in (ROOT / "tools/requirements-run-report.txt").read_text(encoding="utf-8").splitlines(): + name, _, version = line.partition("==") + pinned[name] = version + self.assertEqual(metadata.version("jsonschema"), pinned["jsonschema"]) + + def test_schema_is_a_valid_draft_2020_12_schema(self): + self.assertEqual(SCHEMA["$schema"], "https://json-schema.org/draft/2020-12/schema") + jsonschema.Draft202012Validator.check_schema(SCHEMA) + + def test_schema_uses_only_plain_keywords_and_no_format(self): + used = {key for _, key in schema_keywords(SCHEMA)} + self.assertEqual(used - KEYWORDS, set()) + self.assertNotIn("format", used) + + +class ReportTests(unittest.TestCase): + def setUp(self): + self.validator = jsonschema.Draft202012Validator(SCHEMA) + + def errors(self, document): + return list(self.validator.iter_errors(document)) + + def assertRejected(self, document): + self.assertTrue(self.errors(document), "the document was accepted") + + +class FixtureTests(ReportTests): + def test_the_expected_fixtures_exist(self): + self.assertEqual({file.stem for file in FIXTURES}, EXPECTED_FIXTURES) + self.assertEqual(set(DOCUMENTS), EXPECTED_FIXTURES | {"truncated"}) + + def test_every_fixture_validates_and_fits_the_size_limit(self): + self.assertGreater(len(FIXTURES), 0) + for file in FIXTURES: + with self.subTest(fixture=file.name): + data = file.read_bytes() + self.assertLess(len(data), MAX_BYTES) + self.assertEqual(self.errors(json.loads(data.decode("utf-8"))), []) + self.assertEqual(data.decode("utf-8"), json.dumps(json.loads(data), indent=2, ensure_ascii=False) + "\n") + + def test_the_generated_truncated_document_validates_and_fits_the_size_limit(self): + document = DOCUMENTS["truncated"] + self.assertEqual(self.errors(document), []) + self.assertLess(len(json.dumps(document, indent=2, ensure_ascii=False).encode("utf-8")), MAX_BYTES) + + def test_every_stop_kind_has_a_fixture(self): + kinds = {document["stop"]["kind"] for document in DOCUMENTS.values()} + self.assertEqual(kinds, set(SCHEMA["properties"]["stop"]["properties"]["kind"]["enum"])) + + def test_run_ids_are_unique(self): + ids = [document["run"]["id"] for document in DOCUMENTS.values()] + self.assertEqual(len(ids), len(set(ids))) + + def test_milestones_stage_and_frames_are_consistent(self): + order = ("loaded", "started", "firstDraw", "firstPresent") + stages = {"loaded": "loads", "started": "starts", "firstDraw": "first-draw", "firstPresent": "presents"} + for name, document in DOCUMENTS.items(): + with self.subTest(fixture=name): + run = document["run"] + reached = [run["milestones"][name] for name in order if name in run["milestones"]] + self.assertEqual(reached, sorted(reached)) + if reached: + self.assertLessEqual(reached[-1], run["seconds"]) + furthest = [stages[name] for name in order if name in run["milestones"]] + self.assertEqual(run["stage"], furthest[-1] if furthest else "unknown") + self.assertEqual("firstPresent" in run["milestones"], run["framesPresented"] > 0) + if run["framesPresented"] >= 2 and not run["recovered"]: + self.assertAlmostEqual(run["averageFps"], (run["framesPresented"] - 1) / run["fpsWindowSeconds"], delta=run["averageFps"] * 0.02) + + def test_lists_are_sorted_by_count_highest_first(self): + for fixture, document in DOCUMENTS.items(): + for name, entries in (("functions", document["missing"]["functions"]), ("unsupported", document["shaders"]["unsupported"]), + ("imageFormats", document["shaders"]["imageFormats"]), ("descriptors", document["shaders"]["descriptors"])): + with self.subTest(fixture=fixture, list=name): + counts = [entry["calls" if name == "functions" else "count"] for entry in entries] + self.assertEqual(counts, sorted(counts, reverse=True)) + + def test_the_truncated_fixture_reports_dropped_entries(self): + document = load("truncated") + self.assertEqual(len(document["missing"]["functions"]), 200) + self.assertEqual(len(document["shaders"]["imageFormats"]), 100) + self.assertTrue(all(document["truncated"][name] > 0 for name in ("functions", "unsupported", "imageFormats"))) + + def test_the_recovered_fixture_is_marked_incomplete_and_killed(self): + document = load("killed-recovered") + self.assertEqual((document["run"]["recovered"], document["run"]["incomplete"], document["run"]["exit"]), (True, True, "killed")) + self.assertEqual((document["stop"]["kind"], document["stop"]["reason"]), ("other", "unclean-unknown")) + + +class RejectionTests(ReportTests): + def mutate(self, name, change): + document = load(name) + change(document) + return document + + def test_a_missing_required_key_is_rejected_at_every_level(self): + document = load("stop-missing-function") + paths = [()] + def walk(node, path): + if isinstance(node, dict): + for key, value in node.items(): + paths.append(path + (key,)) + walk(value, path + (key,)) + walk(document, ()) + required = [] + for path in paths[1:]: + parent = document + for key in path[:-1]: + parent = parent[key] + if path[-1] in SCHEMA_REQUIRED.get(path[:-1], ()): + required.append(path) + self.assertGreater(len(required), 40) + for path in required: + with self.subTest(path="/".join(path)): + changed = copy.deepcopy(document) + parent = changed + for key in path[:-1]: + parent = parent[key] + del parent[path[-1]] + self.assertRejected(changed) + + def test_bad_enums_are_rejected(self): + cases = [(("run", "exit"), "exploded"), (("run", "stage"), "converts"), (("stop", "kind"), "oops"), (("stop", "reason"), "window-closed"), + (("system", "os"), "freebsd"), (("system", "gpu", "vendor"), "Matrox"), (("shaders", "imageFormats", 0, "status"), "supported"), + (("shaders", "imageFormats", 0, "usage"), "texture"), (("shaders", "descriptors", 0, "usage"), "sampled"), + (("shaders", "descriptors", 0, "type"), "Texture"), (("coverage", "milestones"), "yes")] + for path, value in cases: + with self.subTest(path=path): + document = load("stop-none") + node = document + for key in path[:-1]: + node = node[key] + node[path[-1]] = value + self.assertRejected(document) + + def test_lists_over_the_caps_are_rejected(self): + document = load("stop-missing-function") + entry = document["missing"]["functions"][0] + document["missing"]["functions"] = [entry] * 201 + self.assertRejected(document) + document = load("stop-unsupported-shader") + document["shaders"]["unsupported"] = [document["shaders"]["unsupported"][0]] * 201 + self.assertRejected(document) + document = load("stop-none") + document["shaders"]["imageFormats"] = [document["shaders"]["imageFormats"][0]] * 101 + self.assertRejected(document) + document = load("stop-none") + document["shaders"]["descriptors"] = [document["shaders"]["descriptors"][0]] * 101 + self.assertRejected(document) + document = load("stop-none") + document["shaders"]["imageFormats"] = [document["shaders"]["imageFormats"][0]] * 100 + self.assertEqual(self.errors(document), []) + + def test_recovered_without_incomplete_is_rejected(self): + document = load("killed-recovered") + document["run"]["incomplete"] = False + self.assertRejected(document) + for path, value in ((("run", "exit"), "crash"), (("run", "exitCode"), 1), (("stop", "kind"), "crash"), (("stop", "reason"), "other")): + with self.subTest(path=path): + document = load("killed-recovered") + document[path[0]][path[1]] = value + self.assertRejected(document) + document = load("stop-none") + document["run"]["exit"] = "killed" + self.assertRejected(document) + + def test_stop_kind_none_and_clean_exit_go_together(self): + for change in (lambda d: d["run"].update(exit="crash"), lambda d: d["stop"].update(kind="crash"), + lambda d: d["stop"].update(reason="crash"), lambda d: d["stop"].update(kind="other")): + document = load("stop-none") + change(document) + self.assertRejected(document) + document = load("stop-crash") + document["stop"].update(kind="none", reason="guest-exit") + self.assertRejected(document) + + def test_reason_is_the_end_path_and_kind_is_what_stopped_the_run(self): + rejected = [("stop-missing-function", dict(reason="guest-exit")), ("stop-missing-function", dict(reason="quit-requested")), + ("stop-unsupported-shader", dict(reason="guest-exit")), ("stop-assert", dict(reason="guest-exit")), + ("stop-crash", dict(reason="runtime-stop")), ("stop-assert", dict(reason="runtime-stop")), + ("stop-crash", dict(reason="other")), ("stop-assert", dict(reason="unclean-unknown")), + ("stop-none", dict(reason="runtime-stop")), ("stop-none", dict(reason="crash")), + ("stop-other", dict(reason="guest-exit")), ("stop-other", dict(reason="missing-function"))] + for name, change in rejected: + with self.subTest(fixture=name, change=change): + document = load(name) + document["stop"].update(change) + self.assertRejected(document) + accepted = [("stop-missing-function", dict(reason="crash")), ("stop-unsupported-shader", dict(reason="crash")), + ("stop-unsupported-format", dict(reason="other")), ("stop-other", dict(reason="runtime-stop")), + ("stop-other", dict(reason="crash")), ("stop-assert", dict(reason="crash")), ("stop-none", dict(reason="quit-requested"))] + for name, change in accepted: + with self.subTest(fixture=name, change=change): + document = load(name) + document["stop"].update(change) + self.assertEqual(self.errors(document), []) + + def test_average_fps_needs_two_frames(self): + document = load("stop-none") + document["run"].update(framesPresented=1) + self.assertRejected(document) + document["run"].update(averageFps=None, fpsWindowSeconds=None) + self.assertEqual(self.errors(document), []) + + def test_stage_needs_its_milestone(self): + for stage, milestone in (("loads", "loaded"), ("starts", "started"), ("first-draw", "firstDraw"), ("presents", "firstPresent")): + with self.subTest(stage=stage): + document = load("stop-none") + document["run"]["stage"] = stage + del document["run"]["milestones"][milestone] + self.assertRejected(document) + document = load("stop-none") + document["run"]["stage"] = "unknown" + self.assertRejected(document) + + def test_a_section_with_coverage_off_cannot_list_entries(self): + for flag, change in (("missing", lambda d: d["missing"].update(functions=[{"library": None, "name": "f", "calls": 1}])), + ("unsupported", lambda d: d["shaders"].update(unsupported=[{"encoding": None, "opcode": None, "opcodeValue": None, "modifiers": None, "count": 1}])), + ("imageFormats", lambda d: d["truncated"].update(imageFormats=1)), + ("descriptors", lambda d: None), + ("shaders", lambda d: d["shaders"].update(compiled=1)), + ("milestones", lambda d: None)): + with self.subTest(flag=flag): + document = load("stop-none") + document["coverage"][flag] = False + change(document) + if flag in ("descriptors", "milestones"): + self.assertRejected(document) + continue + if flag == "imageFormats": + document["shaders"]["imageFormats"] = [] + if flag == "shaders": + document["shaders"]["compiled"] = 1 + self.assertRejected(document) + + def test_nulls_are_only_allowed_where_the_contract_says(self): + for path in (("run", "seconds"), ("run", "id"), ("run", "framesPresented"), ("run", "stage"), ("stop", "message"), ("stop", "reason"), + ("shaders", "compiled"), ("missing", "functions"), ("coverage", "missing"), ("run", "recovered")): + with self.subTest(path=path): + document = load("stop-none") + document[path[0]][path[1]] = None + self.assertRejected(document) + for path in (("anyps5", "commit"), ("anyps5", "release"), ("anyps5", "modified"), ("game", "titleId"), ("game", "contentId"), ("game", "contentVersion"), + ("game", "name"), ("system", "os"), ("system", "osVersion"), ("system", "cpu"), ("system", "ramGiB"), ("system", "gpu"), + ("run", "exitCode"), ("stop", "source")): + with self.subTest(path=path): + document = load("stop-none") + document[path[0]][path[1]] = None + self.assertEqual(self.errors(document), []) + + def test_malformed_values_are_rejected(self): + cases = [(("run", "id"), "3F9A1C07B2D84E5F9A6C0D1E2B3A4F56"), (("run", "id"), "3f9a"), (("game", "titleId"), "ppsa12345"), + (("game", "titleId"), "PPSA1234"), (("game", "titleId"), "PPSA123456"), (("anyps5", "commit"), "abc123"), + (("generated",), "2026-10-29 12:00:00"), (("generated",), "2026-10-29T12:00:00+13:00"), (("version",), 2), + (("format",), "anyps5-run"), (("run", "seconds"), -1), (("run", "seconds"), float("inf")), (("run", "seconds"), 1e12), + (("run", "framesPresented"), 1.5), (("run", "exitCode"), 1.5), (("system", "ramGiB"), 0), (("system", "gpu", "vulkan"), "1.3"), + (("stop", "message"), "x" * 301), (("stop", "message"), ""), (("stop", "message"), "line one\nline two"), + (("game", "name"), "x" * 301), (("stop", "source"), "../secret.cpp:1"), (("stop", "source"), "/home/user/a.cpp:1"), + (("stop", "source"), "core/a/../b.cpp:1"), (("stop", "source"), "core/a.cpp"), (("stop", "source"), "core/a.cpp:12x")] + for path, value in cases: + with self.subTest(path=path, value=value): + document = load("stop-none") + node = document + for key in path[:-1]: + node = node[key] + node[path[-1]] = value + self.assertRejected(document) + + def test_the_maximum_string_length_is_accepted(self): + document = load("stop-none") + document["stop"]["message"] = "é" * 300 + document["game"]["name"] = "x" * 300 + self.assertEqual(self.errors(document), []) + + def test_unknown_keys_are_rejected_everywhere(self): + for path in ((), ("anyps5",), ("game",), ("system",), ("system", "gpu"), ("run",), ("run", "milestones"), ("coverage",), ("truncated",), + ("missing",), ("shaders",), ("stop",), ("missing", "functions", 0), ("shaders", "imageFormats", 0), ("shaders", "descriptors", 0)): + with self.subTest(path=path): + document = load("stop-missing-function" if path[:2] == ("missing", "functions") else "stop-none") + node = document + for key in path: + node = node[key] + node["extra"] = 1 + self.assertRejected(document) + + def test_unknown_opcode_keeps_its_number_with_a_null_name(self): + document = load("stop-unsupported-shader") + entry = {"encoding": None, "opcode": None, "opcodeValue": 711, "modifiers": None, "count": 1} + document["shaders"]["unsupported"] = [entry] + self.assertEqual(self.errors(document), []) + entry["opcodeValue"] = -1 + self.assertRejected(document) + entry.update(opcodeValue=None, count=0) + self.assertRejected(document) + + def test_milestone_keys_are_optional_but_typed(self): + document = load("stop-none") + document["run"]["milestones"]["firstDraw"] = "8.9" + self.assertRejected(document) + + +SCHEMA_REQUIRED = {} + + +def collect_required(node, path=()): + if isinstance(node, dict): + if "required" in node and "properties" in node: + SCHEMA_REQUIRED[path] = tuple(node["required"]) + for name, child in node.get("properties", {}).items(): + collect_required(child, path + (name,)) + + +collect_required(SCHEMA) + + +if __name__ == "__main__": + unittest.main() diff --git a/tools/tests/test_select_tests.py b/tools/tests/test_select_tests.py index 7ee14f51ca..b74e88720a 100644 --- a/tools/tests/test_select_tests.py +++ b/tools/tests/test_select_tests.py @@ -383,6 +383,38 @@ class NonAsciiDirectoryTests(unittest.TestCase): self.assertIn("input: alpha/alpha.h", reasons["alpha"]) self.assertIn("input: alpha/alpha.h", reasons["alpha_data"]) + @unittest.skipUnless(os.name == "nt", "the ANSI code page exists only on Windows") + def test_dependency_written_by_an_ansi_compiler_is_decoded(self): + path = r"C:\ação\source\alpha\alpha.h" + try: + ansi = path.encode("mbcs", "strict") + except UnicodeEncodeError: + self.skipTest("the ANSI code page cannot represent the fixture directory") + self.assertEqual(select_tests.dependency_path(ansi, "."), path) + self.assertEqual(select_tests.dependency_path(path.encode("utf-8"), "."), path) + + @unittest.skipUnless(os.name == "nt", "the ANSI code page exists only on Windows") + def test_ansi_dependency_that_is_also_valid_utf8_is_decoded_as_the_file_on_disk(self): + name = "é" + try: + ansi = name.encode("mbcs", "strict") + utf8 = ansi.decode("utf-8") + except (UnicodeEncodeError, UnicodeDecodeError): + self.skipTest("the ANSI code page does not make the fixture directory valid UTF-8") + with tempfile.TemporaryDirectory() as directory: + header = Path(directory, name, "alpha.h") + try: + recorded = str(header).encode("mbcs", "strict") + except UnicodeEncodeError: + self.skipTest("the ANSI code page cannot represent the temporary directory") + self.assertEqual(select_tests.dependency_path(recorded, directory), str(Path(directory, utf8, "alpha.h"))) + header.parent.mkdir() + header.write_text("", encoding="utf-8") + self.assertEqual(select_tests.dependency_path(recorded, directory), str(header)) + relative = os.path.join("..", name, "alpha.h") + self.assertEqual(select_tests.dependency_path(relative.encode("mbcs"), os.path.join(directory, "build")), + relative) + class BuildErrorTests(unittest.TestCase): def run_tool(self, *args): diff --git a/tools/tests/test_stubgen.py b/tools/tests/test_stubgen.py index 435ae833f5..8c00a9d4d5 100644 --- a/tools/tests/test_stubgen.py +++ b/tools/tests/test_stubgen.py @@ -400,5 +400,38 @@ class CaseVariantOutputTests(unittest.TestCase): self.assertIn("unknown name, signature", lower.read_text(encoding="utf-8")) +class SymlinkLoopTests(unittest.TestCase): + def test_looping_paths_are_usage_errors(self): + with tempfile.TemporaryDirectory() as directory: + root = Path(directory) + first, second = root / "first", root / "second" + try: + first.symlink_to(second) + second.symlink_to(first) + except OSError as error: + self.skipTest(f"symbolic links are unavailable: {error}") + nids = root / "nids.txt" + nids.write_text("AAAAAAAAAAA\n", encoding="utf-8") + cases = { + "out": ["--nids", str(nids), "--out", str(first)], + "td-out": ["--nids", str(nids), "--out", str(root / "code.cpp"), "--td-out", str(first)], + "nids": ["--nids", str(first), "--out", str(root / "code.cpp")], + "parent": ["--nids", str(nids), "--out", str(first / "code.cpp")], + } + for name, arguments in cases.items(): + with self.subTest(name), contextlib.redirect_stderr(io.StringIO()) as errors, \ + self.assertRaises(SystemExit) as error: + stubgen.main(["--module", "libSceExample", *arguments]) + self.assertEqual(error.exception.code, 2) + if name == "parent": + self.assertTrue(any(repr(str(link))[1:-1] in errors.getvalue() for link in (first, second)), errors.getvalue()) + else: + self.assertIn(repr(str(first))[1:-1], errors.getvalue()) + self.assertIn("Too many levels of symbolic links", errors.getvalue()) + self.assertTrue(first.is_symlink()) + self.assertTrue(second.is_symlink()) + self.assertFalse((root / "code.cpp").exists()) + + if __name__ == "__main__": unittest.main() diff --git a/tools/tests/test_symbolize_samples.py b/tools/tests/test_symbolize_samples.py index 38f28e4b1d..07af2d78f9 100644 --- a/tools/tests/test_symbolize_samples.py +++ b/tools/tests/test_symbolize_samples.py @@ -317,6 +317,19 @@ class SymbolizeSamplesTests(unittest.TestCase): self.assertEqual(module.name(0x1030), "~first_func") self.assertEqual(module.name(0x1070), "~second_func") + def test_export_ordinals_stay_inside_the_declared_address_table(self): + path = self.libs / "libwinpthread-1.dll" + data = bytearray(path.read_bytes()) + struct.pack_into("<I", data, 0x600 + 20, 1) + path.write_bytes(data) + with self.assertRaisesRegex(ValueError, "export ordinal"): + symbolize_samples.PeModule(path) + warnings = [] + symbolizer = symbolize_samples.Symbolizer([self.libs], {}, unverified=True, warn=warnings.append) + frame = "libwinpthread-1.dll+0x1070" + self.assertEqual(symbolizer.frame(frame), frame) + self.assertTrue(any("export ordinal" in warning for warning in warnings)) + def test_frames_keep_unknown_modules_and_out_of_range_addresses(self): symbolizer = symbolize_samples.Symbolizer([self.libs], {}, warn=lambda text: None, unverified=True) self.assertEqual(symbolizer.frame("libSceAgcDriver.prx+0x1046"), "libSceAgcDriver.prx!AgcDriver_long_function_name") @@ -388,6 +401,29 @@ class SymbolizeSamplesTests(unittest.TestCase): self.assertIn("libSceAgcDriver.prx!short", lines[2]) self.assertEqual(errors, "") + def test_multiple_sampled_modules_with_the_same_name_are_not_symbolized(self): + samples = self.root / "worker.txt" + for second_timestamp in (TIMESTAMP, TIMESTAMP + 1): + for unverified in (False, True): + with self.subTest(second_timestamp=second_timestamp, unverified=unverified): + samples.write_text( + f"# module libSceAgcDriver.prx {SIZE_OF_IMAGE:#x} {TIMESTAMP:#x}\n" + f"# module LIBSCEAGCDRIVER.PRX {SIZE_OF_IMAGE:#x} {second_timestamp:#x}\n" + "libSceAgcDriver.prx+0x1011 4\n", encoding="utf-8") + options = ("--unverified",) if unverified else () + lines, errors = self.run_main(samples, "--libs", self.libs, *options) + self.assertIn("libSceAgcDriver.prx+0x1011", "\n".join(lines)) + self.assertNotIn("libSceAgcDriver.prx!short", "\n".join(lines)) + self.assertIn("multiple sampled modules", errors) + + def test_module_record_lookup_is_case_insensitive(self): + samples = self.root / "worker.txt" + samples.write_text(f"# module LIBSCEAGCDRIVER.PRX {SIZE_OF_IMAGE:#x} {TIMESTAMP:#x}\n" + "libSceAgcDriver.prx+0x1011 4\n", encoding="utf-8") + lines, errors = self.run_main(samples, "--libs", self.libs) + self.assertIn("libSceAgcDriver.prx!short", "\n".join(lines)) + self.assertEqual(errors, "") + def test_thread_files_keep_each_heading_and_can_select_one_thread(self): samples = self.root / "threads.txt" record = f"# module libSceAgcDriver.prx {SIZE_OF_IMAGE:#x} {TIMESTAMP:#x}\n" @@ -476,6 +512,30 @@ class SymbolizeSamplesTests(unittest.TestCase): self.assertIn(message, errors.getvalue()) self.assertNotIn("Traceback", errors.getvalue()) + def test_symbolic_link_loops_are_usage_errors(self): + good = self.root / "good.collapsed.txt" + good.write_text("libSceAgcDriver.prx+0x1011 1\n", encoding="utf-8") + loop = self.root / "loop" + try: + loop.symlink_to(loop.name) + except OSError as error: + self.skipTest(f"Filesystem link unavailable: {error}") + cases = { + "out": [good, "--libs", self.libs, "--out", loop], + "samples": [loop, "--libs", self.libs, "--out", self.root / "out.txt"], + "since": [good, "--since", loop, "--libs", self.libs, "--out", self.root / "out.txt"], + } + for name, arguments in cases.items(): + with self.subTest(name): + result = subprocess.run([sys.executable, symbolize_samples.__file__] + [str(argument) for argument in arguments], + capture_output=True, text=True, timeout=5) + self.assertEqual(result.returncode, 2, result.stdout + result.stderr) + self.assertIn("error:", result.stderr) + self.assertIn("loop", result.stderr) + self.assertNotIn("Traceback", result.stderr) + self.assertTrue(loop.is_symlink()) + self.assertFalse((self.root / "out.txt").exists()) + def test_removed_module_warns_once_and_other_modules_still_resolve(self): missing = self.libs / "removed.prx" build_pe(missing) diff --git a/tools/tests/test_test_registration.py b/tools/tests/test_test_registration.py index ee5c61f6dc..4ba320e93b 100644 --- a/tools/tests/test_test_registration.py +++ b/tools/tests/test_test_registration.py @@ -15,6 +15,17 @@ import check_test_registration class RegistrationTests(unittest.TestCase): + def test_truncated_registration_commands_are_rejected(self): + for tail in ('set_tests_properties(bounds PROPERTIES DISABLED TRUE', + 'set_tests_properties(bounds PROPERTIES DISABLED TRUE # truncated', + 'subdirs(nested', 'add_test(other /build/tests/other_tests'): + with self.subTest(tail=tail), tempfile.TemporaryDirectory() as directory: + build = Path(directory) + (build / 'CTestTestfile.cmake').write_text( + 'add_test(bounds /build/tests/buffer_bounds_tests)\n' + tail, encoding='utf-8') + with self.assertRaisesRegex(ValueError, 'unterminated'): + check_test_registration.registered(build) + @unittest.skipUnless(shutil.which("cmake"), "CMake is required for the argument oracle") def test_quoted_semicolons_match_real_cmake_arguments(self): values = ["left" + "\\" * count + ";right" for count in range(9)] diff --git a/tools/tests/test_trace_digest.py b/tools/tests/test_trace_digest.py index ccd7dde1c4..8593ae8e97 100644 --- a/tools/tests/test_trace_digest.py +++ b/tools/tests/test_trace_digest.py @@ -237,6 +237,8 @@ class TraceDigestTests(unittest.TestCase): (dict(slice_event, dur="10"), "trace event 0: dur must be a finite number"), (dict(slice_event, dur=True), "trace event 0: dur must be a finite number"), (dict(slice_event, dur=[1]), "trace event 0: dur must be a finite number"), + (dict(slice_event, dur=-1), "trace event 0: dur must be non-negative"), + (dict(slice_event, dur=-0.001, args={"batch": 42}), "trace event 0: dur must be non-negative"), (dict(slice_event, ts={}), "trace event 0: ts must be a finite number"), (dict(slice_event, ts="0"), "trace event 0: ts must be a finite number"), (dict(slice_event, ts=float("nan")), "trace event 0: ts must be a finite number"), @@ -815,7 +817,7 @@ class TraceDigestTests(unittest.TestCase): def interval_line(start, end, p99, gpu_ms, **changes): line = dict(SUMMARY, window={"spec": "summary_every 30", "first_present": 0, "ms": (end - start) * 1000.0}, interval_start_s=start, interval_end_s=end, - presents=1800, frame_ms={"p50": 16.6, "p90": 18.0, "p99": p99, "max": p99 + 5.0}, gpu_busy_ms_per_present=gpu_ms, trace="") + presents=1800, frame_ms={"p50": min(16.6, p99), "p90": min(18.0, p99), "p99": p99, "max": p99 + 5.0}, gpu_busy_ms_per_present=gpu_ms, trace="") line.update(changes) return line @@ -1078,11 +1080,25 @@ class IntervalSchemaTests(unittest.TestCase): with self.assertRaisesRegex(ValueError, r"summary\.jsonl:4:"): trace_digest.load_intervals(self.path) + def test_out_of_order_percentiles_are_rejected_by_both_cli_reports(self): + for frames in (dict(p50=2, p90=1, p99=3, max=4), dict(p50=1, p90=3, p99=2, max=4), + dict(p50=1, p90=2, p99=4, max=3)): + self.write(interval_line(0, 1, 20, 1, frame_ms=frames)) + for script in (trace_digest.__file__, Path(trace_digest.__file__).with_name("trace_intervals_csv.py")): + with self.subTest(frames=frames, script=script): + result = subprocess.run([sys.executable, str(script), str(self.path)], + capture_output=True, text=True, encoding="utf-8", timeout=10) + self.assertEqual(result.returncode, 2, result.stdout + result.stderr) + self.assertIn("summary.jsonl:4:", result.stderr) + self.assertIn("p50 <= p90 <= p99 <= max", result.stderr) + self.assertEqual(result.stdout, "") + self.assertNotIn("Traceback", result.stderr) + def test_json_and_markdown_reject_bad_intervals_without_tracebacks(self): self.write(interval_line(0, 1, 20, 1, presents=-1)) for options in ([], ["--json"]): result = subprocess.run([sys.executable, trace_digest.__file__, str(self.path), *options], - capture_output=True, text=True, timeout=10) + capture_output=True, text=True, encoding="utf-8", timeout=10) self.assertEqual(result.returncode, 2, result.stdout + result.stderr) self.assertIn("summary.jsonl:4:", result.stderr) self.assertNotIn("Traceback", result.stderr) diff --git a/tools/tests/test_unwrap_self.py b/tools/tests/test_unwrap_self.py index c49e0f5f0c..5184bf1894 100644 --- a/tools/tests/test_unwrap_self.py +++ b/tools/tests/test_unwrap_self.py @@ -16,6 +16,7 @@ import unwrap_self SELF_MAGIC = 0x1D3D154F ELF_HEADER_OFFSET = 0x1A0 PROGRAM_TABLE_OFFSET = 0x40 +PT_NULL = 0 PT_LOAD = 1 PT_DYNAMIC = 2 PT_TLS = 7 @@ -148,7 +149,7 @@ class UnwrapTest(unittest.TestCase): for output in (source, source.parent / "." / source.name, alias): with self.subTest(output=output): result = subprocess.run([sys.executable, str(Path(unwrap_self.__file__)), str(source), str(output)], - capture_output=True, text=True, timeout=30) + capture_output=True, encoding="utf-8", timeout=30) self.assertEqual(result.returncode, 2, result.stderr) self.assertIn("output aliases the input", result.stderr) self.assertNotIn("Traceback", result.stderr) @@ -168,7 +169,7 @@ class UnwrapTest(unittest.TestCase): for arguments in ((source, loop), (loop, output)): with self.subTest(arguments=arguments): result = subprocess.run([sys.executable, str(Path(unwrap_self.__file__)), *map(str, arguments)], - capture_output=True, text=True, timeout=30) + capture_output=True, encoding="utf-8", timeout=30) self.assertEqual(result.returncode, 2, result.stderr) self.assertEqual(result.stdout, "") self.assertIn("FAIL: ", result.stderr) @@ -196,7 +197,7 @@ class UnwrapTest(unittest.TestCase): output = Path(self.directory) / "output.elf" source.write_bytes(container) result = subprocess.run([sys.executable, str(Path(unwrap_self.__file__)), str(source), str(output)], - capture_output=True, text=True, timeout=30) + capture_output=True, encoding="utf-8", timeout=30) self.assertEqual(result.returncode, 2, result.stderr) self.assertIn("does not fit the file", result.stderr) self.assertNotIn("Traceback", result.stderr) @@ -219,7 +220,7 @@ class UnwrapTest(unittest.TestCase): output = Path(self.directory) / "output.elf" source.write_bytes(container) result = subprocess.run([sys.executable, str(Path(unwrap_self.__file__)), str(source), str(output)], - capture_output=True, text=True, timeout=30) + capture_output=True, encoding="utf-8", timeout=30) self.assertEqual(result.returncode, 2, result.stderr) self.assertIn(f"FAIL: {source}: {message}", result.stderr) self.assertNotIn("Traceback", result.stderr) @@ -250,7 +251,7 @@ class UnwrapTest(unittest.TestCase): output = Path(self.directory) / "output.elf" source.write_bytes(container) result = subprocess.run([sys.executable, str(Path(unwrap_self.__file__)), str(source), str(output)], - capture_output=True, text=True, timeout=30) + capture_output=True, encoding="utf-8", timeout=30) self.assertEqual(result.returncode, 2, result.stderr) self.assertIn("does not fit the file", result.stderr) self.assertNotIn("Traceback", result.stderr) @@ -263,7 +264,7 @@ class UnwrapTest(unittest.TestCase): output = Path(self.directory) / "output.elf" source.write_bytes(container) result = subprocess.run([sys.executable, str(Path(unwrap_self.__file__)), str(source), str(output)], - capture_output=True, text=True, timeout=60) + capture_output=True, encoding="utf-8", timeout=60) self.assertEqual(result.returncode, 2, result.stderr) self.assertIn("bytes of output", result.stderr) self.assertNotIn("Traceback", result.stderr) @@ -417,14 +418,14 @@ class UnwrapTest(unittest.TestCase): def test_new_output_inherits_the_destination_directory_acl(self): directory = Path(self.directory) grant = subprocess.run(["icacls.exe", str(directory), "/grant", "*S-1-1-0:(OI)(CI)(RX)"], - capture_output=True, text=True, timeout=30) + capture_output=True, text=True, encoding="oem", errors="replace", timeout=30) self.assertEqual(grant.returncode, 0, grant.stdout + grant.stderr) container = build_container(default_segments(), default_records(), default_payloads()) result, output = self.convert(container) self.assertEqual(result.returncode, 0, result.stderr) permissions = directory / "output-acl.txt" saved = subprocess.run(["icacls.exe", str(output), "/save", str(permissions)], - capture_output=True, text=True, timeout=30) + capture_output=True, text=True, encoding="oem", errors="replace", timeout=30) self.assertEqual(saved.returncode, 0, saved.stdout + saved.stderr) self.assertIn(";;;WD)", permissions.read_text(encoding="utf-16-le")) self.assertTrue(output.read_bytes().startswith(b"\x7fELF")) @@ -441,7 +442,7 @@ class UnwrapTest(unittest.TestCase): with self.subTest(umask=oct(mask)): output = directory / f"output-{mask:o}.elf" result = subprocess.run([sys.executable, str(Path(unwrap_self.__file__)), str(source), str(output)], - capture_output=True, text=True, timeout=30, umask=mask) + capture_output=True, encoding="utf-8", timeout=30, umask=mask) self.assertEqual(result.returncode, 0, result.stderr) mode = output.stat().st_mode & 0o777 self.assertEqual(mode, 0o666 & ~mask) @@ -508,7 +509,7 @@ class UnwrapTest(unittest.TestCase): output = directory / "output.elf" source.write_bytes(container) result = subprocess.run([sys.executable, str(Path(unwrap_self.__file__)), str(source), str(output)], - capture_output=True, text=True, timeout=30) + capture_output=True, encoding="utf-8", timeout=30) return result, output def setUp(self): @@ -1061,7 +1062,7 @@ class UnwrapTest(unittest.TestCase): output = directory / "output.elf" source.write_bytes(container) result = subprocess.run([sys.executable, str(Path(unwrap_self.__file__)), "--verbose", - str(source), str(output)], capture_output=True, text=True, timeout=30) + str(source), str(output)], capture_output=True, encoding="utf-8", timeout=30) self.assertEqual(result.returncode, 0, result.stderr) self.assertIn("PT_LOAD", result.stdout) self.assertIn("PT_DYNAMIC", result.stdout) @@ -1390,6 +1391,27 @@ class UnwrapTest(unittest.TestCase): self.assertNotIn("Traceback", result.stderr) self.assertEqual(output.read_bytes(), b"previous output") + def test_invalid_non_null_segment_alignment_is_refused_before_replacing_output(self): + output = Path(self.directory) / "output.elf" + for kind in (PT_DYNAMIC, PT_NOTE, PT_PHDR, SCE_COMMENT): + with self.subTest(kind=kind): + segments = default_segments() + segments[2] = (kind, 6, 0x1580, 0x1040, 0x10, 3) + container = build_container(segments, default_records(), default_payloads()) + output.write_bytes(b"previous output") + result, output = self.convert(container) + self.assertEqual(result.returncode, 2, result.stderr) + self.assertIn("segment 2 alignment is not a power of two", result.stderr) + self.assertNotIn("Traceback", result.stderr) + self.assertEqual(output.read_bytes(), b"previous output") + + def test_null_segment_alignment_is_ignored(self): + segments = default_segments() + segments[2] = (PT_NULL, 0, 0, 0, 0, 3) + container = build_container(segments, default_records(), default_payloads()) + _, _, headers = unwrap_self.parse_elf(container) + self.assertEqual(headers[2]["align"], 3) + def test_load_alignment_zero_and_one_remain_supported(self): for alignment in (0, 1): with self.subTest(alignment=alignment): diff --git a/tools/tests/test_web_release.py b/tools/tests/test_web_release.py index c72308b19f..68fd9348ac 100644 --- a/tools/tests/test_web_release.py +++ b/tools/tests/test_web_release.py @@ -469,6 +469,27 @@ class TestWebRunnerTests(unittest.TestCase): self.assertEqual(error.exception.code, 2) self.assertIn("archive module does not exist", err.getvalue()) + def test_main_does_not_call_path_resolve_on_the_build_directory(self): + with tempfile.TemporaryDirectory() as tmp: + build = Path(tmp) / "build" + (build / "web").mkdir(parents=True) + (build / "web" / "archive.mjs").write_text( + 'from "https://cdn.jsdelivr.net/npm/@zip.js/zip.js/dist/zip.min.js";\n', + encoding="utf-8") + real_resolve = Path.resolve + + def resolve(self): + if self == build: + raise AssertionError("resolve called on build path") + return real_resolve(self) + + with patch.object(Path, "resolve", resolve), patch("subprocess.run"), \ + patch("urllib.request.urlopen") as mock_url: + mock_resp = mock_url.return_value.__enter__.return_value + mock_resp.read.return_value = b"" + result = test_web.main(["--build", str(build)]) + self.assertEqual(result, 0) + def test_main_rejects_archive_missing_zip_url(self): with tempfile.TemporaryDirectory() as tmp: build = Path(tmp) / "build" diff --git a/tools/trace_digest.py b/tools/trace_digest.py index 7b057e95e3..f0ccfc24ea 100644 --- a/tools/trace_digest.py +++ b/tools/trace_digest.py @@ -86,6 +86,8 @@ class Trace: raise ValueError(f"trace event {index}: name must be a string") ts = _event_number(event, "ts", index) dur = _event_number(event, "dur", index) + if dur < 0: + raise ValueError(f"trace event {index}: dur must be non-negative") self.slices[tid].append([ts, dur, name, 0, False]) args = _event_args(event, index) if "batch" in args: @@ -382,8 +384,9 @@ def validate_interval(record): frames = record.get("frame_ms") if not isinstance(frames, dict): raise ValueError("frame_ms must be an object") - for field in ("p50", "p90", "p99", "max"): - interval_number(frames.get(field), f"frame_ms.{field}") + values = [interval_number(frames.get(field), f"frame_ms.{field}") for field in ("p50", "p90", "p99", "max")] + if values != sorted(values): + raise ValueError("frame_ms must satisfy p50 <= p90 <= p99 <= max") interval_number(record.get("gpu_busy_ms_per_present"), "gpu_busy_ms_per_present") for field in ("worker_busy_pct", "top_phases_ms_per_frame"): values = record.get(field, {}) diff --git a/tools/unwrap_self.py b/tools/unwrap_self.py index 9f554a8b92..00d8b6ac72 100644 --- a/tools/unwrap_self.py +++ b/tools/unwrap_self.py @@ -51,6 +51,7 @@ FIRST_REGION = 0x400 MAX_ALIGNMENT_PADDING = 64 * 1024 * 1024 MAX_OUTPUT_FACTOR = 4 MIN_OUTPUT_LIMIT = 256 * 1024 * 1024 +PT_NULL = 0 PT_LOAD = 1 PT_NOTE = 4 PT_PHDR = 6 @@ -137,11 +138,11 @@ def parse_elf(data): offset = inner + program_offset + index * 56 kind, flags, file_offset, vaddr, _, file_size, memory_size, alignment = struct.unpack_from( "<IIQQQQQQ", data, offset) + if kind != PT_NULL and alignment and alignment & (alignment - 1): + raise Refused("segment %d alignment is not a power of two" % index) if kind in (PT_LOAD, PT_TLS): if file_size > memory_size: raise Refused("segment %d file size exceeds memory size" % index) - if alignment and alignment & (alignment - 1): - raise Refused("segment %d alignment is not a power of two" % index) if kind == PT_TLS: if alignment > 8192: raise Refused("segment %d TLS alignment exceeds 8192" % index)